summaryrefslogtreecommitdiff
path: root/libavfilter/vf_colorspace.c
diff options
context:
space:
mode:
authorVittorio Giovara <vittorio.giovara@gmail.com>2016-09-03 15:19:35 +0200
committerPaul B Mahol <onemda@gmail.com>2016-09-04 13:11:32 +0200
commit5df993f3b129b6fe0a9ef6d16dc51a31bce81e13 (patch)
tree4c3826f0acf86db2084b95848742d029c328bba3 /libavfilter/vf_colorspace.c
parentb6e8efb082c284091e267a29b6060b97692d1740 (diff)
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>
Diffstat (limited to 'libavfilter/vf_colorspace.c')
-rw-r--r--libavfilter/vf_colorspace.c40
1 files changed, 35 insertions, 5 deletions
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 }
};