summaryrefslogtreecommitdiff
path: root/libavcodec/qsvdec.c
diff options
context:
space:
mode:
authorHaihao Xiang <haihao.xiang@intel.com>2021-07-28 16:15:46 +0800
committerJames Almer <jamrial@gmail.com>2021-08-04 10:04:53 -0300
commitc8cfe676948c1d97c8d6d50564065d0f2d52a568 (patch)
tree6f3f2ec04b9e3bcd09bfa58bcdab1440ef2a582f /libavcodec/qsvdec.c
parent7ab0207d4b0d11f00840d7fc29c1f4fa8d47c13b (diff)
downloadffmpeg-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.c20
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;
}