[FFmpeg-devel] [PATCH v4 1/1] avfilter/vf_colorspace: use colorspace negotiation API
Niklas Haas
ffmpeg at haasn.xyz
Fri Apr 5 13:38:04 EEST 2024
On Thu, 04 Apr 2024 19:05:14 +0200 Nicolas Gaullier <nicolas.gaullier at cji.paris> wrote:
> Fixes a regression due to the fact that the colorspace filter does
> not use the new API introduced by 8c7934f73ab6c568acaa.
> The scale filter uses it since 45e09a30419cc2a7251e, and the setparams
> filter since 3bf80df3ccd32aed23f0.
>
> Example:
> ffprobe -f lavfi yuvtestsrc,setparams=color_primaries=bt470bg:color_trc=
> bt470bg:colorspace=bt470bg,colorspace=bt709:range=tv,scale,showinfo
>
> Before:
> color_range:unknown color_space:bt470bg ...
> After:
> color_range:tv color_space:bt709 ...
>
> Signed-off-by: Nicolas Gaullier <nicolas.gaullier at cji.paris>
> ---
> libavfilter/vf_colorspace.c | 62 +++++++++++++++++++++----------------
> 1 file changed, 36 insertions(+), 26 deletions(-)
>
> diff --git a/libavfilter/vf_colorspace.c b/libavfilter/vf_colorspace.c
> index d181e81ace..7bacd7892a 100644
> --- a/libavfilter/vf_colorspace.c
> +++ b/libavfilter/vf_colorspace.c
> @@ -433,8 +433,7 @@ static int create_filtergraph(AVFilterContext *ctx,
> if (out->color_trc != s->out_trc) s->out_txchr = NULL;
> if (in->colorspace != s->in_csp ||
> in->color_range != s->in_rng) s->in_lumacoef = NULL;
> - if (out->colorspace != s->out_csp ||
> - out->color_range != s->out_rng) s->out_lumacoef = NULL;
> + if (out->color_range != s->out_rng) s->rgb2yuv = NULL;
>
> if (!s->out_primaries || !s->in_primaries) {
> s->in_prm = in->color_primaries;
> @@ -563,26 +562,8 @@ static int create_filtergraph(AVFilterContext *ctx,
> redo_yuv2rgb = 1;
> }
>
> - if (!s->out_lumacoef) {
> - s->out_csp = out->colorspace;
> + if (!s->rgb2yuv) {
> s->out_rng = out->color_range;
> - s->out_lumacoef = av_csp_luma_coeffs_from_avcsp(s->out_csp);
> - if (!s->out_lumacoef) {
> - if (s->out_csp == AVCOL_SPC_UNSPECIFIED) {
> - if (s->user_all == CS_UNSPECIFIED) {
> - av_log(ctx, AV_LOG_ERROR,
> - "Please specify output colorspace\n");
> - } else {
> - av_log(ctx, AV_LOG_ERROR,
> - "Unsupported output color property %d\n", s->user_all);
> - }
> - } else {
> - av_log(ctx, AV_LOG_ERROR,
> - "Unsupported output colorspace %d (%s)\n", s->out_csp,
> - av_color_space_name(s->out_csp));
> - }
> - return AVERROR(EINVAL);
> - }
> redo_rgb2yuv = 1;
> }
>
> @@ -687,6 +668,26 @@ static av_cold int init(AVFilterContext *ctx)
> {
> ColorSpaceContext *s = ctx->priv;
>
> + s->out_csp = s->user_csp == AVCOL_SPC_UNSPECIFIED ?
> + default_csp[FFMIN(s->user_all, CS_NB)] : s->user_csp;
> + s->out_lumacoef = av_csp_luma_coeffs_from_avcsp(s->out_csp);
> + if (!s->out_lumacoef) {
> + if (s->out_csp == AVCOL_SPC_UNSPECIFIED) {
> + if (s->user_all == CS_UNSPECIFIED) {
> + av_log(ctx, AV_LOG_ERROR,
> + "Please specify output colorspace\n");
> + } else {
> + av_log(ctx, AV_LOG_ERROR,
> + "Unsupported output color property %d\n", s->user_all);
> + }
> + } else {
> + av_log(ctx, AV_LOG_ERROR,
> + "Unsupported output colorspace %d (%s)\n", s->out_csp,
> + av_color_space_name(s->out_csp));
> + }
> + return AVERROR(EINVAL);
> + }
> +
> ff_colorspacedsp_init(&s->dsp);
>
> return 0;
> @@ -735,6 +736,9 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
> return res;
> }
>
> + out->colorspace = s->out_csp;
> + out->color_range = s->user_rng == AVCOL_RANGE_UNSPECIFIED ?
> + in->color_range : s->user_rng;
> out->color_primaries = s->user_prm == AVCOL_PRI_UNSPECIFIED ?
> default_prm[FFMIN(s->user_all, CS_NB)] : s->user_prm;
> if (s->user_trc == AVCOL_TRC_UNSPECIFIED) {
> @@ -746,10 +750,6 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
> } else {
> out->color_trc = s->user_trc;
> }
> - out->colorspace = s->user_csp == AVCOL_SPC_UNSPECIFIED ?
> - default_csp[FFMIN(s->user_all, CS_NB)] : s->user_csp;
> - out->color_range = s->user_rng == AVCOL_RANGE_UNSPECIFIED ?
> - in->color_range : s->user_rng;
> if (rgb_sz != s->rgb_sz) {
> const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(out->format);
> int uvw = in->width >> desc->log2_chroma_w;
> @@ -841,8 +841,18 @@ static int query_formats(AVFilterContext *ctx)
> };
> int res;
> ColorSpaceContext *s = ctx->priv;
> + AVFilterLink *outlink = ctx->outputs[0];
> AVFilterFormats *formats = ff_make_format_list(pix_fmts);
>
> + res = ff_formats_ref(ff_make_formats_list_singleton(s->out_csp), &outlink->incfg.color_spaces);
> + if (res < 0)
> + return res;
> + if (s->user_rng != AVCOL_RANGE_UNSPECIFIED) {
> + res = ff_formats_ref(ff_make_formats_list_singleton(s->user_rng), &outlink->incfg.color_ranges);
> + if (res < 0)
> + return res;
> + }
> +
> if (!formats)
> return AVERROR(ENOMEM);
> if (s->user_format == AV_PIX_FMT_NONE)
> @@ -855,7 +865,7 @@ static int query_formats(AVFilterContext *ctx)
> if (res < 0)
> return res;
>
> - return ff_formats_ref(formats, &ctx->outputs[0]->incfg.formats);
> + return ff_formats_ref(formats, &outlink->incfg.formats);
> }
>
> static int config_props(AVFilterLink *outlink)
> --
> 2.30.2
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
Seems okay to me now.
More information about the ffmpeg-devel
mailing list