From 13f56e2f5368101907ed44fed9417325b0446f7c Mon Sep 17 00:00:00 2001
From: Milos Zivkovic <zivkovic@teralogics.com>
Date: Sat, 10 Oct 2020 16:34:47 +0000
Subject: [PATCH] avcodec/qsvenc: use color description for h264 and hevc

Signed-off-by: Milos Zivkovic <zivkovic@teralogics.com>
---
 libavcodec/qsvenc.c | 16 ++++++++++++++++
 libavcodec/qsvenc.h |  7 ++++++-
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index 1ed8f5d973..67a7365ad7 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -783,6 +783,22 @@ FF_ENABLE_DEPRECATION_WARNINGS
 #endif
         q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco3;
 #endif
+#if QSV_HAVE_VSI
+        if (avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_HEVC)
+        {
+            q->extvsi.Header.BufferId = MFX_EXTBUFF_VIDEO_SIGNAL_INFO;
+            q->extvsi.Header.BufferSz = sizeof(q->extvsi);
+            q->extvsi.VideoFormat = 5; // unspecified
+            q->extvsi.VideoFullRange = (avctx->color_range == AVCOL_RANGE_JPEG);
+            q->extvsi.ColourPrimaries = avctx->color_primaries;
+            q->extvsi.TransferCharacteristics = avctx->color_trc;
+            q->extvsi.MatrixCoefficients = avctx->colorspace;
+            q->extvsi.ColourDescriptionPresent = 1;
+
+            q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extvsi;
+        }
+#endif
+
     }
 
 #if QSV_HAVE_EXT_VP9_PARAM
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
index 4f579d1db1..664c36f157 100644
--- a/libavcodec/qsvenc.h
+++ b/libavcodec/qsvenc.h
@@ -53,6 +53,8 @@
 
 #define QSV_HAVE_GPB    QSV_VERSION_ATLEAST(1, 18)
 
+#define QSV_HAVE_VSI    QSV_VERSION_ATLEAST(1, 3)
+
 #if defined(_WIN32) || defined(__CYGWIN__)
 #define QSV_HAVE_AVBR   QSV_VERSION_ATLEAST(1, 3)
 #define QSV_HAVE_ICQ    QSV_VERSION_ATLEAST(1, 8)
@@ -134,12 +136,15 @@ typedef struct QSVEncContext {
 #if QSV_HAVE_EXT_VP9_PARAM
     mfxExtVP9Param  extvp9param;
 #endif
+#if QSV_HAVE_VSI
+    mfxExtVideoSignalInfo   extvsi;
+#endif
 
     mfxExtOpaqueSurfaceAlloc opaque_alloc;
     mfxFrameSurface1       **opaque_surfaces;
     AVBufferRef             *opaque_alloc_buf;
 
-    mfxExtBuffer  *extparam_internal[2 + QSV_HAVE_CO2 + QSV_HAVE_CO3 + (QSV_HAVE_MF * 2)];
+    mfxExtBuffer  *extparam_internal[2 + QSV_HAVE_CO2 + QSV_HAVE_CO3 + (QSV_HAVE_MF * 2) + QSV_HAVE_VSI];
     int         nb_extparam_internal;
 
     mfxExtBuffer **extparam;
-- 
2.17.1.windows.2

