diff options
author | Haihao Xiang <haihao.xiang@intel.com> | 2021-07-28 16:15:46 +0800 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2021-08-04 10:04:53 -0300 |
commit | c8cfe676948c1d97c8d6d50564065d0f2d52a568 (patch) | |
tree | 6f3f2ec04b9e3bcd09bfa58bcdab1440ef2a582f /libavcodec/qsvdec.c | |
parent | 7ab0207d4b0d11f00840d7fc29c1f4fa8d47c13b (diff) | |
download | ffmpeg-c8cfe676948c1d97c8d6d50564065d0f2d52a568.tar.gz |
lavc/qsvdec: update color properties in codec context
User may get color properties from the SDK via VIDEO_SIGNAL_INFO extbuf
Reviewed-by: Xiang, Haihao <haihao.xiang@intel.com>
Reviewed-by: Soft Works <softworkz@hotmail.com>
Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec/qsvdec.c')
-rw-r--r-- | libavcodec/qsvdec.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index 622750927c..19a6a776db 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -311,7 +311,8 @@ static int qsv_decode_header(AVCodecContext *avctx, QSVContext *q, mfxVideoParam *param) { int ret; - + mfxExtVideoSignalInfo video_signal_info = { 0 }; + mfxExtBuffer *header_ext_params[1] = { (mfxExtBuffer *)&video_signal_info }; mfxBitstream bs = { 0 }; if (avpkt->size) { @@ -336,6 +337,12 @@ static int qsv_decode_header(AVCodecContext *avctx, QSVContext *q, return ret; param->mfx.CodecId = ret; + video_signal_info.Header.BufferId = MFX_EXTBUFF_VIDEO_SIGNAL_INFO; + video_signal_info.Header.BufferSz = sizeof(video_signal_info); + // The SDK doesn't support other ext buffers when calling MFXVideoDECODE_DecodeHeader, + // so do not append this buffer to the existent buffer array + param->ExtParam = header_ext_params; + param->NumExtParam = 1; ret = MFXVideoDECODE_DecodeHeader(q->session, &bs, param); if (MFX_ERR_MORE_DATA == ret) { return AVERROR(EAGAIN); @@ -344,6 +351,17 @@ static int qsv_decode_header(AVCodecContext *avctx, QSVContext *q, return ff_qsv_print_error(avctx, ret, "Error decoding stream header"); + avctx->color_range = video_signal_info.VideoFullRange ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; + + if (video_signal_info.ColourDescriptionPresent) { + avctx->color_primaries = video_signal_info.ColourPrimaries; + avctx->color_trc = video_signal_info.TransferCharacteristics; + avctx->colorspace = video_signal_info.MatrixCoefficients; + } + + param->ExtParam = q->ext_buffers; + param->NumExtParam = q->nb_ext_buffers; + return 0; } |