14 std::unique_ptr<QFFmpeg::HWAccel> hwAccel)
29 return {
"Invalid stream" };
31 const AVCodec *decoder =
nullptr;
32 std::unique_ptr<QFFmpeg::HWAccel> hwAccel;
34 if (
stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
35 std::tie(decoder, hwAccel) = HWAccel::findDecoderWithHwAccel(
stream->codecpar->codec_id);
41 return {
"Failed to find a valid FFmpeg decoder" };
43 qCDebug(qLcPlaybackEngineCodec) <<
"found decoder" << decoder->name <<
"for id" << decoder->id;
47 return {
"Failed to allocate a FFmpeg codec context" };
50 context->hw_device_ctx = av_buffer_ref(hwAccel->hwDeviceContextAsBuffer());
52 if (
context->codec_type != AVMEDIA_TYPE_AUDIO &&
context->codec_type != AVMEDIA_TYPE_VIDEO
53 &&
context->codec_type != AVMEDIA_TYPE_SUBTITLE) {
54 return {
"Unknown codec type" };
59 return {
"Failed to set FFmpeg codec parameters" };
67 av_dict_set(opts,
"refcounted_frames",
"1", 0);
68 av_dict_set(opts,
"threads",
"auto", 0);
70 ret = avcodec_open2(
context.get(), decoder, opts);
72 return "Failed to open FFmpeg codec context " +
err2str(
ret);
AVPixelFormat getFormat(AVCodecContext *codecContext, const AVPixelFormat *suggestedFormats)
std::unique_ptr< AVCodecContext, AVDeleter< decltype(&avcodec_free_context), &avcodec_free_context > > AVCodecContextUPtr
QString err2str(int errnum)
const AVCodec * findAVDecoder(AVCodecID codecId, const std::optional< AVHWDeviceType > &deviceType, const std::optional< PixelOrSampleFormat > &format)
Combined button and popup list for selecting options.
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)