Certain filters set or modify the output colour range. Today, they do that per-frame, but now that we have a link property, they need to set that as well.
Signed-off-by: Philip Langdale <phil...@overt.org> --- libavfilter/avf_showcqt.c | 1 + libavfilter/avf_showspectrum.c | 1 + libavfilter/vf_colorspace.c | 4 ++++ libavfilter/vf_scale.c | 8 +++++++- libavfilter/vf_setparams.c | 11 +++++++++++ libavfilter/vf_waveform.c | 1 + libavfilter/vf_zscale.c | 21 +++++++++++++++++++-- 7 files changed, 44 insertions(+), 3 deletions(-) diff --git a/libavfilter/avf_showcqt.c b/libavfilter/avf_showcqt.c index 875ba48cee..ee6654358a 100644 --- a/libavfilter/avf_showcqt.c +++ b/libavfilter/avf_showcqt.c @@ -1363,6 +1363,7 @@ static int config_output(AVFilterLink *outlink) outlink->h = s->height; s->format = outlink->format; outlink->sample_aspect_ratio = av_make_q(1, 1); + outlink->color_range = AVCOL_RANGE_JPEG; outlink->frame_rate = s->rate; outlink->time_base = av_mul_q(av_inv_q(s->rate), av_make_q(1, PTS_STEP)); av_log(ctx, AV_LOG_INFO, "video: %dx%d %s %d/%d fps, bar_h = %d, axis_h = %d, sono_h = %d.\n", diff --git a/libavfilter/avf_showspectrum.c b/libavfilter/avf_showspectrum.c index 956f62f3ad..52fa018317 100644 --- a/libavfilter/avf_showspectrum.c +++ b/libavfilter/avf_showspectrum.c @@ -307,6 +307,7 @@ static int config_output(AVFilterLink *outlink) outlink->w = s->w; outlink->h = s->h; outlink->sample_aspect_ratio = (AVRational){1,1}; + outlink->color_range = AVCOL_RANGE_JPEG; if (s->legend) { s->start_x = log10(inlink->sample_rate) * 25; diff --git a/libavfilter/vf_colorspace.c b/libavfilter/vf_colorspace.c index 71ea08a20f..5455648710 100644 --- a/libavfilter/vf_colorspace.c +++ b/libavfilter/vf_colorspace.c @@ -1048,6 +1048,7 @@ static int config_props(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->dst; AVFilterLink *inlink = outlink->src->inputs[0]; + ColorSpaceContext *s = ctx->priv; if (inlink->w % 2 || inlink->h % 2) { av_log(ctx, AV_LOG_ERROR, "Invalid odd size (%dx%d)\n", @@ -1060,6 +1061,9 @@ static int config_props(AVFilterLink *outlink) outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; outlink->time_base = inlink->time_base; + if (s->user_rng != AVCOL_RANGE_UNSPECIFIED) + outlink->color_range = s->user_rng; + return 0; } diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index 9f45032e85..21ae709d6b 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -342,11 +342,16 @@ static int config_props(AVFilterLink *outlink) } else outlink->sample_aspect_ratio = inlink0->sample_aspect_ratio; - av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d fmt:%s sar:%d/%d -> w:%d h:%d fmt:%s sar:%d/%d flags:0x%0x\n", + if (scale->out_range != AVCOL_RANGE_UNSPECIFIED) + outlink->color_range = scale->out_range; + + av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d fmt:%s sar:%d/%d range:%d -> w:%d h:%d fmt:%s sar:%d/%d range:%d flags:0x%0x\n", inlink ->w, inlink ->h, av_get_pix_fmt_name( inlink->format), inlink->sample_aspect_ratio.num, inlink->sample_aspect_ratio.den, + inlink->color_range, outlink->w, outlink->h, av_get_pix_fmt_name(outlink->format), outlink->sample_aspect_ratio.num, outlink->sample_aspect_ratio.den, + outlink->color_range, scale->flags); return 0; @@ -363,6 +368,7 @@ static int config_props_ref(AVFilterLink *outlink) outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; outlink->time_base = inlink->time_base; outlink->frame_rate = inlink->frame_rate; + outlink->color_range = inlink->color_range; return 0; } diff --git a/libavfilter/vf_setparams.c b/libavfilter/vf_setparams.c index 8427f98ba8..2b47e2d20b 100644 --- a/libavfilter/vf_setparams.c +++ b/libavfilter/vf_setparams.c @@ -56,6 +56,16 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) return ff_filter_frame(ctx->outputs[0], frame); } +static int config_output(AVFilterLink *outlink) +{ + AVFilterContext *ctx = outlink->src; + SetParamsContext *s = ctx->priv; + + if (s->color_range >= 0) + outlink->color_range = s->color_range; + return 0; +} + static const AVFilterPad inputs[] = { { .name = "default", @@ -69,6 +79,7 @@ static const AVFilterPad outputs[] = { { .name = "default", .type = AVMEDIA_TYPE_VIDEO, + .config_props = config_output, }, { NULL } }; diff --git a/libavfilter/vf_waveform.c b/libavfilter/vf_waveform.c index 02a7046f33..b610336ea2 100644 --- a/libavfilter/vf_waveform.c +++ b/libavfilter/vf_waveform.c @@ -2744,6 +2744,7 @@ static int config_output(AVFilterLink *outlink) } outlink->sample_aspect_ratio = (AVRational){1,1}; + outlink->color_range = AVCOL_RANGE_JPEG; return 0; } diff --git a/libavfilter/vf_zscale.c b/libavfilter/vf_zscale.c index 6e1d36cb4c..c1cd55bd36 100644 --- a/libavfilter/vf_zscale.c +++ b/libavfilter/vf_zscale.c @@ -299,11 +299,16 @@ static int config_props(AVFilterLink *outlink) } else outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; - av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d fmt:%s sar:%d/%d -> w:%d h:%d fmt:%s sar:%d/%d\n", + if (s->range > -1) + outlink->color_range = convert_zimg_range(s->range); + + av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d fmt:%s sar:%d/%d range: %d-> w:%d h:%d fmt:%s sar:%d/%d range:%d\n", inlink ->w, inlink ->h, av_get_pix_fmt_name( inlink->format), inlink->sample_aspect_ratio.num, inlink->sample_aspect_ratio.den, + inlink->color_range, outlink->w, outlink->h, av_get_pix_fmt_name(outlink->format), - outlink->sample_aspect_ratio.num, outlink->sample_aspect_ratio.den); + outlink->sample_aspect_ratio.num, outlink->sample_aspect_ratio.den, + outlink->color_range); return 0; fail: @@ -457,6 +462,18 @@ static int convert_range(enum AVColorRange color_range) return ZIMG_RANGE_LIMITED; } +static int convert_zimg_range(int zimg_range) +{ + switch (zimg_range) { + case ZIMG_RANGE_LIMITED: + return AVCOL_RANGE_MPEG; + case ZIMG_RANGE_FULL: + return AVCOL_RANGE_JPEG; + default: + return AVCOL_RANGE_UNSPECIFIED; + } +} + static void format_init(zimg_image_format *format, AVFrame *frame, const AVPixFmtDescriptor *desc, int colorspace, int primaries, int transfer, int range, int location) { -- 2.14.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel