]> git.sesse.net Git - ffmpeg/blobdiff - libavfilter/vf_colorspace.c
Merge commit 'c29da01ac95ea2c8c5c4b3a312a33aaaa8fb7068'
[ffmpeg] / libavfilter / vf_colorspace.c
index 0024505a44ffb13fa7331823ea7af3a1bbdf1feb..71ea08a20fe65e92ecb22ee075ba7ba8ecc985b9 100644 (file)
@@ -57,6 +57,7 @@ enum Whitepoint {
     WP_D65,
     WP_C,
     WP_DCI,
+    WP_E,
     WP_NB,
 };
 
@@ -183,6 +184,13 @@ static const double ycgco_matrix[3][3] =
     {  0.5,  0,   -0.5  },
 };
 
+static const double gbr_matrix[3][3] =
+{
+    { 0,    1,   0   },
+    { 0,   -0.5, 0.5 },
+    { 0.5, -0.5, 0   },
+};
+
 /*
  * All constants explained in e.g. https://linuxtv.org/downloads/v4l-dvb-apis/ch02s06.html
  * The older ones (bt470bg/m) are also explained in their respective ITU docs
@@ -196,6 +204,7 @@ static const struct LumaCoefficients luma_coefficients[AVCOL_SPC_NB] = {
     [AVCOL_SPC_BT709]      = { 0.2126, 0.7152, 0.0722 },
     [AVCOL_SPC_SMPTE240M]  = { 0.212,  0.701,  0.087  },
     [AVCOL_SPC_YCOCG]      = { 0.25,   0.5,    0.25   },
+    [AVCOL_SPC_RGB]        = { 1,      1,      1      },
     [AVCOL_SPC_BT2020_NCL] = { 0.2627, 0.6780, 0.0593 },
     [AVCOL_SPC_BT2020_CL]  = { 0.2627, 0.6780, 0.0593 },
 };
@@ -222,6 +231,9 @@ static void fill_rgb2yuv_table(const struct LumaCoefficients *coeffs,
     if (coeffs->cr == 0.25 && coeffs->cg == 0.5 && coeffs->cb == 0.25) {
         memcpy(rgb2yuv, ycgco_matrix, sizeof(double) * 9);
         return;
+    } else if (coeffs->cr == 1 && coeffs->cg == 1 && coeffs->cb == 1) {
+        memcpy(rgb2yuv, gbr_matrix, sizeof(double) * 9);
+        return;
     }
 
     rgb2yuv[0][0] = coeffs->cr;
@@ -270,6 +282,7 @@ static const struct WhitepointCoefficients whitepoint_coefficients[WP_NB] = {
     [WP_D65] = { 0.3127, 0.3290 },
     [WP_C]   = { 0.3100, 0.3160 },
     [WP_DCI] = { 0.3140, 0.3510 },
+    [WP_E]   = { 1/3.0f, 1/3.0f },
 };
 
 static const struct ColorPrimaries color_primaries[AVCOL_PRI_NB] = {
@@ -278,10 +291,12 @@ static const struct ColorPrimaries color_primaries[AVCOL_PRI_NB] = {
     [AVCOL_PRI_BT470BG]   = { WP_D65, 0.640, 0.330, 0.290, 0.600, 0.150, 0.060,},
     [AVCOL_PRI_SMPTE170M] = { WP_D65, 0.630, 0.340, 0.310, 0.595, 0.155, 0.070 },
     [AVCOL_PRI_SMPTE240M] = { WP_D65, 0.630, 0.340, 0.310, 0.595, 0.155, 0.070 },
+    [AVCOL_PRI_SMPTE428]  = { WP_E,   0.735, 0.265, 0.274, 0.718, 0.167, 0.009 },
     [AVCOL_PRI_SMPTE431]  = { WP_DCI, 0.680, 0.320, 0.265, 0.690, 0.150, 0.060 },
     [AVCOL_PRI_SMPTE432]  = { WP_D65, 0.680, 0.320, 0.265, 0.690, 0.150, 0.060 },
     [AVCOL_PRI_FILM]      = { WP_C,   0.681, 0.319, 0.243, 0.692, 0.145, 0.049 },
     [AVCOL_PRI_BT2020]    = { WP_D65, 0.708, 0.292, 0.170, 0.797, 0.131, 0.046 },
+    [AVCOL_PRI_JEDEC_P22] = { WP_D65, 0.630, 0.340, 0.295, 0.605, 0.155, 0.077 },
 };
 
 static const struct ColorPrimaries *get_color_primaries(enum AVColorPrimaries prm)
@@ -1074,6 +1089,8 @@ static const AVOption colorspace_options[] = {
     ENUM("smpte170m",   AVCOL_SPC_SMPTE170M,   "csp"),
     ENUM("smpte240m",   AVCOL_SPC_SMPTE240M,   "csp"),
     ENUM("ycgco",       AVCOL_SPC_YCGCO,       "csp"),
+    ENUM("gbr",         AVCOL_SPC_RGB,         "csp"),
+    ENUM("bt2020nc",    AVCOL_SPC_BT2020_NCL,  "csp"),
     ENUM("bt2020ncl",   AVCOL_SPC_BT2020_NCL,  "csp"),
 
     { "range",      "Output color range",
@@ -1092,10 +1109,12 @@ static const AVOption colorspace_options[] = {
     ENUM("bt470bg",      AVCOL_PRI_BT470BG,    "prm"),
     ENUM("smpte170m",    AVCOL_PRI_SMPTE170M,  "prm"),
     ENUM("smpte240m",    AVCOL_PRI_SMPTE240M,  "prm"),
+    ENUM("smpte428",     AVCOL_PRI_SMPTE428,   "prm"),
     ENUM("film",         AVCOL_PRI_FILM,       "prm"),
     ENUM("smpte431",     AVCOL_PRI_SMPTE431,   "prm"),
     ENUM("smpte432",     AVCOL_PRI_SMPTE432,   "prm"),
     ENUM("bt2020",       AVCOL_PRI_BT2020,     "prm"),
+    ENUM("jedec-p22",    AVCOL_PRI_JEDEC_P22,  "prm"),
 
     { "trc",        "Output transfer characteristics",
       OFFSET(user_trc),   AV_OPT_TYPE_INT, { .i64 = AVCOL_TRC_UNSPECIFIED },