summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/filters.texi20
-rw-r--r--libavfilter/vf_colorspace.c40
2 files changed, 55 insertions, 5 deletions
diff --git a/doc/filters.texi b/doc/filters.texi
index c12b093487..00ec1ea038 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -5235,6 +5235,7 @@ Convert colorspace, transfer characteristics or color primaries.
The filter accepts the following options:
@table @option
+@anchor{all}
@item all
Specify all color properties at once.
@@ -5266,6 +5267,7 @@ BT.2020
@end table
+@anchor{space}
@item space
Specify output colorspace.
@@ -5291,6 +5293,7 @@ BT.2020 with non-constant luminance
@end table
+@anchor{trc}
@item trc
Specify output transfer characteristics.
@@ -5319,6 +5322,7 @@ BT.2020 for 12-bits content
@end table
+@anchor{primaries}
@item primaries
Specify output color primaries.
@@ -5344,6 +5348,7 @@ BT.2020
@end table
+@anchor{range}
@item range
Specify output color range.
@@ -5423,6 +5428,21 @@ von Kries whitepoint adaptation
identity whitepoint adaptation (i.e. no whitepoint adaptation)
@end table
+@item iall
+Override all input properties at once. Same accepted values as @ref{all}.
+
+@item ispace
+Override input colorspace. Same accepted values as @ref{space}.
+
+@item iprimaries
+Override input color primaries. Same accepted values as @ref{primaries}.
+
+@item itrc
+Override input transfer characteristics. Same accepted values as @ref{trc}.
+
+@item irange
+Override input color range. Same accepted values as @ref{range}.
+
@end table
The filter converts the transfer characteristics, color space and color
diff --git a/libavfilter/vf_colorspace.c b/libavfilter/vf_colorspace.c
index e4022f89b8..45fd917778 100644
--- a/libavfilter/vf_colorspace.c
+++ b/libavfilter/vf_colorspace.c
@@ -128,11 +128,11 @@ typedef struct ColorSpaceContext {
ColorSpaceDSPContext dsp;
- enum Colorspace user_all;
- enum AVColorSpace in_csp, out_csp, user_csp;
- enum AVColorRange in_rng, out_rng, user_rng;
- enum AVColorTransferCharacteristic in_trc, out_trc, user_trc;
- enum AVColorPrimaries in_prm, out_prm, user_prm;
+ enum Colorspace user_all, user_iall;
+ enum AVColorSpace in_csp, out_csp, user_csp, user_icsp;
+ enum AVColorRange in_rng, out_rng, user_rng, user_irng;
+ enum AVColorTransferCharacteristic in_trc, out_trc, user_trc, user_itrc;
+ enum AVColorPrimaries in_prm, out_prm, user_prm, user_iprm;
enum AVPixelFormat in_format, user_format;
int fast_mode;
enum DitherMode dither;
@@ -581,6 +581,10 @@ static int create_filtergraph(AVFilterContext *ctx,
if (!s->out_primaries || !s->in_primaries) {
s->in_prm = in->color_primaries;
+ if (s->user_iall != CS_UNSPECIFIED)
+ s->in_prm = default_prm[FFMIN(s->user_iall, CS_NB)];
+ if (s->user_iprm != AVCOL_PRI_UNSPECIFIED)
+ s->in_prm = s->user_iprm;
s->in_primaries = get_color_primaries(s->in_prm);
if (!s->in_primaries) {
av_log(ctx, AV_LOG_ERROR,
@@ -638,6 +642,10 @@ static int create_filtergraph(AVFilterContext *ctx,
if (!s->in_txchr) {
av_freep(&s->lin_lut);
s->in_trc = in->color_trc;
+ if (s->user_iall != CS_UNSPECIFIED)
+ s->in_trc = default_trc[FFMIN(s->user_iall, CS_NB)];
+ if (s->user_itrc != AVCOL_TRC_UNSPECIFIED)
+ s->in_trc = s->user_itrc;
s->in_txchr = get_transfer_characteristics(s->in_trc);
if (!s->in_txchr) {
av_log(ctx, AV_LOG_ERROR,
@@ -680,7 +688,13 @@ static int create_filtergraph(AVFilterContext *ctx,
if (!s->in_lumacoef) {
s->in_csp = in->colorspace;
+ if (s->user_iall != CS_UNSPECIFIED)
+ s->in_csp = default_csp[FFMIN(s->user_iall, CS_NB)];
+ if (s->user_icsp != AVCOL_SPC_UNSPECIFIED)
+ s->in_csp = s->user_icsp;
s->in_rng = in->color_range;
+ if (s->user_irng != AVCOL_RANGE_UNSPECIFIED)
+ s->in_rng = s->user_irng;
s->in_lumacoef = get_luma_coefficients(s->in_csp);
if (!s->in_lumacoef) {
av_log(ctx, AV_LOG_ERROR,
@@ -1078,6 +1092,22 @@ static const AVOption colorspace_options[] = {
ENUM("vonkries", WP_ADAPT_VON_KRIES, "wpadapt"),
ENUM("identity", WP_ADAPT_IDENTITY, "wpadapt"),
+ { "iall", "Set all input color properties together",
+ OFFSET(user_iall), AV_OPT_TYPE_INT, { .i64 = CS_UNSPECIFIED },
+ CS_UNSPECIFIED, CS_NB - 1, FLAGS, "all" },
+ { "ispace", "Input colorspace",
+ OFFSET(user_icsp), AV_OPT_TYPE_INT, { .i64 = AVCOL_SPC_UNSPECIFIED },
+ AVCOL_PRI_RESERVED0, AVCOL_PRI_NB - 1, FLAGS, "csp" },
+ { "irange", "Input color range",
+ OFFSET(user_irng), AV_OPT_TYPE_INT, { .i64 = AVCOL_RANGE_UNSPECIFIED },
+ AVCOL_RANGE_UNSPECIFIED, AVCOL_RANGE_NB - 1, FLAGS, "rng" },
+ { "iprimaries", "Input color primaries",
+ OFFSET(user_iprm), AV_OPT_TYPE_INT, { .i64 = AVCOL_PRI_UNSPECIFIED },
+ AVCOL_PRI_RESERVED0, AVCOL_PRI_NB - 1, FLAGS, "prm" },
+ { "itrc", "Input transfer characteristics",
+ OFFSET(user_itrc), AV_OPT_TYPE_INT, { .i64 = AVCOL_TRC_UNSPECIFIED },
+ AVCOL_TRC_RESERVED0, AVCOL_TRC_NB - 1, FLAGS, "trc" },
+
{ NULL }
};