diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index 9d3a6dac6d..e166336548 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -176,10 +176,12 @@ static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q) return ff_qsv_error(ret); } + q->frame_info = param.mfx.FrameInfo; + return 0; } -static int alloc_frame(AVCodecContext *avctx, QSVFrame *frame) +static int alloc_frame(AVCodecContext *avctx, QSVContext *q, QSVFrame *frame) { int ret; @@ -190,12 +192,7 @@ static int alloc_frame(AVCodecContext *avctx, QSVFrame *frame) if (frame->frame->format == AV_PIX_FMT_QSV) { frame->surface = (mfxFrameSurface1*)frame->frame->data[3]; } else { - frame->surface_internal.Info.BitDepthLuma = 8; - frame->surface_internal.Info.BitDepthChroma = 8; - frame->surface_internal.Info.FourCC = MFX_FOURCC_NV12; - frame->surface_internal.Info.Width = avctx->coded_width; - frame->surface_internal.Info.Height = avctx->coded_height; - frame->surface_internal.Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; + frame->surface_internal.Info = q->frame_info; frame->surface_internal.Data.PitchLow = frame->frame->linesize[0]; frame->surface_internal.Data.Y = frame->frame->data[0]; @@ -230,7 +227,7 @@ static int get_surface(AVCodecContext *avctx, QSVContext *q, mfxFrameSurface1 ** last = &q->work_frames; while (frame) { if (!frame->surface) { - ret = alloc_frame(avctx, frame); + ret = alloc_frame(avctx, q, frame); if (ret < 0) return ret; *surf = frame->surface; @@ -251,7 +248,7 @@ static int get_surface(AVCodecContext *avctx, QSVContext *q, mfxFrameSurface1 ** } *last = frame; - ret = alloc_frame(avctx, frame); + ret = alloc_frame(avctx, q, frame); if (ret < 0) return ret; diff --git a/libavcodec/qsvdec.h b/libavcodec/qsvdec.h index 01f4cf99f4..41fb71682c 100644 --- a/libavcodec/qsvdec.h +++ b/libavcodec/qsvdec.h @@ -57,6 +57,7 @@ typedef struct QSVContext { AVCodecContext *avctx_internal; enum AVPixelFormat orig_pix_fmt; uint32_t fourcc; + mfxFrameInfo frame_info; // options set by the caller int async_depth;