Browse code

vf_colorspace: Allow overriding input color properties

The filter needs input frames with color properties filled out by
the decoder. Since this is not always possible, add input options to
the filter so that user may override color space, color primaries,
transfer characteristics, and color range, as well as a generic option
to set all properties at once.

Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>

Vittorio Giovara authored on 2016/09/03 22:19:35
Showing 2 changed files
... ...
@@ -5235,6 +5235,7 @@ Convert colorspace, transfer characteristics or color primaries.
5235 5235
 The filter accepts the following options:
5236 5236
 
5237 5237
 @table @option
5238
+@anchor{all}
5238 5239
 @item all
5239 5240
 Specify all color properties at once.
5240 5241
 
... ...
@@ -5266,6 +5267,7 @@ BT.2020
5266 5266
 
5267 5267
 @end table
5268 5268
 
5269
+@anchor{space}
5269 5270
 @item space
5270 5271
 Specify output colorspace.
5271 5272
 
... ...
@@ -5291,6 +5293,7 @@ BT.2020 with non-constant luminance
5291 5291
 
5292 5292
 @end table
5293 5293
 
5294
+@anchor{trc}
5294 5295
 @item trc
5295 5296
 Specify output transfer characteristics.
5296 5297
 
... ...
@@ -5319,6 +5322,7 @@ BT.2020 for 12-bits content
5319 5319
 
5320 5320
 @end table
5321 5321
 
5322
+@anchor{primaries}
5322 5323
 @item primaries
5323 5324
 Specify output color primaries.
5324 5325
 
... ...
@@ -5344,6 +5348,7 @@ BT.2020
5344 5344
 
5345 5345
 @end table
5346 5346
 
5347
+@anchor{range}
5347 5348
 @item range
5348 5349
 Specify output color range.
5349 5350
 
... ...
@@ -5423,6 +5428,21 @@ von Kries whitepoint adaptation
5423 5423
 identity whitepoint adaptation (i.e. no whitepoint adaptation)
5424 5424
 @end table
5425 5425
 
5426
+@item iall
5427
+Override all input properties at once. Same accepted values as @ref{all}.
5428
+
5429
+@item ispace
5430
+Override input colorspace. Same accepted values as @ref{space}.
5431
+
5432
+@item iprimaries
5433
+Override input color primaries. Same accepted values as @ref{primaries}.
5434
+
5435
+@item itrc
5436
+Override input transfer characteristics. Same accepted values as @ref{trc}.
5437
+
5438
+@item irange
5439
+Override input color range. Same accepted values as @ref{range}.
5440
+
5426 5441
 @end table
5427 5442
 
5428 5443
 The filter converts the transfer characteristics, color space and color
... ...
@@ -128,11 +128,11 @@ typedef struct ColorSpaceContext {
128 128
 
129 129
     ColorSpaceDSPContext dsp;
130 130
 
131
-    enum Colorspace user_all;
132
-    enum AVColorSpace in_csp, out_csp, user_csp;
133
-    enum AVColorRange in_rng, out_rng, user_rng;
134
-    enum AVColorTransferCharacteristic in_trc, out_trc, user_trc;
135
-    enum AVColorPrimaries in_prm, out_prm, user_prm;
131
+    enum Colorspace user_all, user_iall;
132
+    enum AVColorSpace in_csp, out_csp, user_csp, user_icsp;
133
+    enum AVColorRange in_rng, out_rng, user_rng, user_irng;
134
+    enum AVColorTransferCharacteristic in_trc, out_trc, user_trc, user_itrc;
135
+    enum AVColorPrimaries in_prm, out_prm, user_prm, user_iprm;
136 136
     enum AVPixelFormat in_format, user_format;
137 137
     int fast_mode;
138 138
     enum DitherMode dither;
... ...
@@ -581,6 +581,10 @@ static int create_filtergraph(AVFilterContext *ctx,
581 581
 
582 582
     if (!s->out_primaries || !s->in_primaries) {
583 583
         s->in_prm = in->color_primaries;
584
+        if (s->user_iall != CS_UNSPECIFIED)
585
+            s->in_prm = default_prm[FFMIN(s->user_iall, CS_NB)];
586
+        if (s->user_iprm != AVCOL_PRI_UNSPECIFIED)
587
+            s->in_prm = s->user_iprm;
584 588
         s->in_primaries = get_color_primaries(s->in_prm);
585 589
         if (!s->in_primaries) {
586 590
             av_log(ctx, AV_LOG_ERROR,
... ...
@@ -638,6 +642,10 @@ static int create_filtergraph(AVFilterContext *ctx,
638 638
     if (!s->in_txchr) {
639 639
         av_freep(&s->lin_lut);
640 640
         s->in_trc = in->color_trc;
641
+        if (s->user_iall != CS_UNSPECIFIED)
642
+            s->in_trc = default_trc[FFMIN(s->user_iall, CS_NB)];
643
+        if (s->user_itrc != AVCOL_TRC_UNSPECIFIED)
644
+            s->in_trc = s->user_itrc;
641 645
         s->in_txchr = get_transfer_characteristics(s->in_trc);
642 646
         if (!s->in_txchr) {
643 647
             av_log(ctx, AV_LOG_ERROR,
... ...
@@ -680,7 +688,13 @@ static int create_filtergraph(AVFilterContext *ctx,
680 680
 
681 681
     if (!s->in_lumacoef) {
682 682
         s->in_csp = in->colorspace;
683
+        if (s->user_iall != CS_UNSPECIFIED)
684
+            s->in_csp = default_csp[FFMIN(s->user_iall, CS_NB)];
685
+        if (s->user_icsp != AVCOL_SPC_UNSPECIFIED)
686
+            s->in_csp = s->user_icsp;
683 687
         s->in_rng = in->color_range;
688
+        if (s->user_irng != AVCOL_RANGE_UNSPECIFIED)
689
+            s->in_rng = s->user_irng;
684 690
         s->in_lumacoef = get_luma_coefficients(s->in_csp);
685 691
         if (!s->in_lumacoef) {
686 692
             av_log(ctx, AV_LOG_ERROR,
... ...
@@ -1078,6 +1092,22 @@ static const AVOption colorspace_options[] = {
1078 1078
     ENUM("vonkries", WP_ADAPT_VON_KRIES, "wpadapt"),
1079 1079
     ENUM("identity", WP_ADAPT_IDENTITY, "wpadapt"),
1080 1080
 
1081
+    { "iall",       "Set all input color properties together",
1082
+      OFFSET(user_iall),   AV_OPT_TYPE_INT, { .i64 = CS_UNSPECIFIED },
1083
+      CS_UNSPECIFIED, CS_NB - 1, FLAGS, "all" },
1084
+    { "ispace",     "Input colorspace",
1085
+      OFFSET(user_icsp),  AV_OPT_TYPE_INT, { .i64 = AVCOL_SPC_UNSPECIFIED },
1086
+      AVCOL_PRI_RESERVED0, AVCOL_PRI_NB - 1, FLAGS, "csp" },
1087
+    { "irange",     "Input color range",
1088
+      OFFSET(user_irng),  AV_OPT_TYPE_INT, { .i64 = AVCOL_RANGE_UNSPECIFIED },
1089
+      AVCOL_RANGE_UNSPECIFIED, AVCOL_RANGE_NB - 1, FLAGS, "rng" },
1090
+    { "iprimaries", "Input color primaries",
1091
+      OFFSET(user_iprm),  AV_OPT_TYPE_INT, { .i64 = AVCOL_PRI_UNSPECIFIED },
1092
+      AVCOL_PRI_RESERVED0, AVCOL_PRI_NB - 1, FLAGS, "prm" },
1093
+    { "itrc",       "Input transfer characteristics",
1094
+      OFFSET(user_itrc),  AV_OPT_TYPE_INT, { .i64 = AVCOL_TRC_UNSPECIFIED },
1095
+      AVCOL_TRC_RESERVED0, AVCOL_TRC_NB - 1, FLAGS, "trc" },
1096
+
1081 1097
     { NULL }
1082 1098
 };
1083 1099