[FFmpeg-devel] [PATCH] avcodec/libaomenc: fix encoding of sRGB streams

James Almer jamrial at gmail.com
Mon Apr 2 05:03:55 EEST 2018


Signed-off-by: James Almer <jamrial at gmail.com>
---
 libavcodec/libaomenc.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c
index 8ebdcc20e3..fb9d60527b 100644
--- a/libavcodec/libaomenc.c
+++ b/libavcodec/libaomenc.c
@@ -67,6 +67,7 @@ typedef struct AOMEncoderContext {
     int static_thresh;
     int drop_threshold;
     int noise_sensitivity;
+    int is_rgb;
 } AOMContext;
 
 static const char *const ctlidstr[] = {
@@ -221,6 +222,7 @@ static int set_pix_fmt(AVCodecContext *avctx, aom_codec_caps_t codec_caps,
         *img_fmt = AOM_IMG_FMT_I422;
         return 0;
     case AV_PIX_FMT_GBRP:
+        ctx->is_rgb = 1;
     case AV_PIX_FMT_YUV444P:
         enccfg->g_profile = FF_PROFILE_AV1_HIGH;
         *img_fmt = AOM_IMG_FMT_I444;
@@ -250,6 +252,7 @@ static int set_pix_fmt(AVCodecContext *avctx, aom_codec_caps_t codec_caps,
         break;
     case AV_PIX_FMT_GBRP10:
     case AV_PIX_FMT_GBRP12:
+        ctx->is_rgb = 1;
     case AV_PIX_FMT_YUV444P10:
     case AV_PIX_FMT_YUV444P12:
         if (codec_caps & AOM_CODEC_CAP_HIGHBITDEPTH) {
@@ -270,6 +273,24 @@ static int set_pix_fmt(AVCodecContext *avctx, aom_codec_caps_t codec_caps,
     return AVERROR_INVALIDDATA;
 }
 
+static void set_colorspace(AVCodecContext *avctx)
+{
+    AOMContext *ctx = avctx->priv_data;
+    enum aom_color_primaries aom_cp = avctx->color_primaries;
+    enum aom_transfer_characteristics aom_tc = avctx->color_trc;
+    enum aom_matrix_coefficients aom_mc = avctx->colorspace;
+
+    if (ctx->is_rgb) {
+        // Forces the proper sRGB codepath in libaom.
+        aom_cp = AOM_CICP_CP_BT_709;
+        aom_tc = AOM_CICP_TC_SRGB;
+        aom_mc = AOM_CICP_MC_IDENTITY;
+    }
+    codecctl_int(avctx, AV1E_SET_COLOR_PRIMARIES, aom_cp);
+    codecctl_int(avctx, AV1E_SET_TRANSFER_CHARACTERISTICS, aom_tc);
+    codecctl_int(avctx, AV1E_SET_MATRIX_COEFFICIENTS, aom_mc);
+}
+
 static void set_color_range(AVCodecContext *avctx)
 {
     enum aom_color_range aom_cr;
@@ -451,9 +472,7 @@ static av_cold int aom_init(AVCodecContext *avctx,
     if (ctx->crf >= 0)
         codecctl_int(avctx, AOME_SET_CQ_LEVEL,          ctx->crf);
 
-    codecctl_int(avctx, AV1E_SET_COLOR_PRIMARIES, avctx->color_primaries);
-    codecctl_int(avctx, AV1E_SET_MATRIX_COEFFICIENTS, avctx->colorspace);
-    codecctl_int(avctx, AV1E_SET_TRANSFER_CHARACTERISTICS, avctx->color_trc);
+    set_colorspace(avctx);
     set_color_range(avctx);
 
     // provide dummy value to initialize wrapper, values will be updated each _encode()
-- 
2.16.2



More information about the ffmpeg-devel mailing list