14 std::unique_ptr<QFFmpeg::HWAccel> hwAccel)
17 if (
stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
18 pixelAspectRatio = av_guess_sample_aspect_ratio(formatContext,
stream,
nullptr);
21QMaybe<Codec> Codec::create(AVStream *
stream, AVFormatContext *formatContext)
24 return {
"Invalid stream" };
26 const AVCodec *decoder =
nullptr;
27 std::unique_ptr<QFFmpeg::HWAccel> hwAccel;
29 if (
stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
30 std::tie(decoder, hwAccel) = HWAccel::findDecoderWithHwAccel(
stream->codecpar->codec_id);
36 return {
"Failed to find a valid FFmpeg decoder" };
38 qCDebug(qLcPlaybackEngineCodec) <<
"found decoder" << decoder->name <<
"for id" << decoder->id;
42 return {
"Failed to allocate a FFmpeg codec context" };
45 context->hw_device_ctx = av_buffer_ref(hwAccel->hwDeviceContextAsBuffer());
47 if (
context->codec_type != AVMEDIA_TYPE_AUDIO &&
context->codec_type != AVMEDIA_TYPE_VIDEO
48 &&
context->codec_type != AVMEDIA_TYPE_SUBTITLE) {
49 return {
"Unknown codec type" };
54 return {
"Failed to set FFmpeg codec parameters" };
62 av_dict_set(opts,
"refcounted_frames",
"1", 0);
63 av_dict_set(opts,
"threads",
"auto", 0);
66 ret = avcodec_open2(
context.get(), decoder, opts);
73AVRational Codec::pixelAspectRatio(AVFrame *
frame)
const
76 return d->pixelAspectRatio.num &&
d->pixelAspectRatio.den ?
d->pixelAspectRatio
77 :
frame->sample_aspect_ratio;
\macro QT_RESTRICTED_CAST_FROM_ASCII
AVPixelFormat getFormat(AVCodecContext *codecContext, const AVPixelFormat *suggestedFormats)
QString err2str(int errnum)
const AVCodec * findAVDecoder(AVCodecID codecId, const std::optional< AVHWDeviceType > &deviceType, const std::optional< PixelOrSampleFormat > &format)
std::unique_ptr< AVCodecContext, AVDeleter< decltype(&avcodec_free_context), &avcodec_free_context > > AVCodecContextUPtr
void applyExperimentalCodecOptions(const AVCodec *codec, AVDictionary **opts)
Combined button and popup list for selecting options.
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)