40 AVPixelFormat m_swFormat{AV_PIX_FMT_NONE};
41 std::unique_ptr<GPUVideoDecoder> m_delegate;
47 , m_swFormat{swFormat}
49 m_swFrame = av_frame_alloc();
52 static bool canDelegateFormat(AVPixelFormat fmt)
58 case AV_PIX_FMT_P010LE:
59 case AV_PIX_FMT_YUV420P:
60 case AV_PIX_FMT_YUVJ420P:
61 case AV_PIX_FMT_YUV420P10LE:
62 case AV_PIX_FMT_YUV422P:
63 case AV_PIX_FMT_YUVJ422P:
64 case AV_PIX_FMT_YUV422P10LE:
65 case AV_PIX_FMT_YUV444P:
66 case AV_PIX_FMT_YUVJ444P:
67 case AV_PIX_FMT_YUV444P10LE:
74 std::unique_ptr<GPUVideoDecoder> createDelegateForFormat(AVPixelFormat fmt)
79 return std::make_unique<NV12Decoder>(decoder,
false);
81 return std::make_unique<NV12Decoder>(decoder,
true);
82 case AV_PIX_FMT_P010LE:
83 return std::make_unique<P010Decoder>(decoder);
84 case AV_PIX_FMT_YUV420P:
85 case AV_PIX_FMT_YUVJ420P:
86 return std::make_unique<YUV420Decoder>(decoder);
87 case AV_PIX_FMT_YUV420P10LE:
88 return std::make_unique<YUV420P10Decoder>(decoder);
89 case AV_PIX_FMT_YUV422P:
90 case AV_PIX_FMT_YUVJ422P:
91 return std::make_unique<YUV422Decoder>(decoder);
92 case AV_PIX_FMT_YUV422P10LE:
93 return std::make_unique<YUV422P10Decoder>(decoder);
94 case AV_PIX_FMT_YUV444P:
95 case AV_PIX_FMT_YUVJ444P:
96 return std::make_unique<YUV444Decoder>(decoder);
97 case AV_PIX_FMT_YUV444P10LE:
98 return std::make_unique<YUV444P10Decoder>(decoder);
100 return std::make_unique<NV12Decoder>(decoder,
false);
107 av_frame_free(&m_swFrame);
113 m_delegate->samplers.clear();
120 decoder.pixel_format = m_swFormat;
121 m_delegate = createDelegateForFormat(m_swFormat);
124 auto ret = m_delegate->init(r);
125 samplers = m_delegate->samplers;
131#if LIBAVUTIL_VERSION_MAJOR >= 57
132 if(!Video::formatIsHardwareDecoded(
static_cast<AVPixelFormat
>(frame.format)))
136 m_delegate->exec(r, res, frame);
144 av_frame_unref(m_swFrame);
145 if(canDelegateFormat(m_swFormat))
146 m_swFrame->format = AV_PIX_FMT_NONE;
148 m_swFrame->format = AV_PIX_FMT_NV12;
149 int ret = av_hwframe_transfer_data(m_swFrame, &frame, 0);
152 qDebug() <<
"HWTransferDecoder: av_hwframe_transfer_data failed:" << ret;
155 m_swFrame->pts = frame.pts;
156 m_swFrame->pkt_dts = frame.pkt_dts;
158 auto sw_fmt =
static_cast<AVPixelFormat
>(m_swFrame->format);
172 if(sw_fmt != m_swFormat)
175 decoder.pixel_format = sw_fmt;
176 decoder.width = m_swFrame->width;
177 decoder.height = m_swFrame->height;
183 m_delegate->exec(r, res, *m_swFrame);
void exec(RenderList &r, QRhiResourceUpdateBatch &res, AVFrame &frame) override
Decode and upload a video frame to the GPU.
Definition HWTransfer.hpp:129
std::pair< QShader, QShader > init(RenderList &r) override
Initialize a GPUVideoDecoder.
Definition HWTransfer.hpp:116