From patchwork Thu Apr 4 17:05:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicolas Gaullier X-Patchwork-Id: 47801 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:24a8:b0:1a3:b6bb:3029 with SMTP id m40csp458804pzd; Thu, 4 Apr 2024 10:05:35 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUrgPBoCQPCYaB7E5d7ZoVkBh5RF6hWJrcqe02W6r49iBGXgCNO1AkZXFc9U0e0InNmOSDNetKVNkdMlnCV/cZcVyC83ARY290Icg== X-Google-Smtp-Source: AGHT+IFurH8Phr2ntiPh26EzoJW3EqW4mBCv6pNy3f5MMjDuzd+rk96h0KwENuzBHxTH/uk5WUly X-Received: by 2002:a50:99d6:0:b0:56d:c722:93a3 with SMTP id n22-20020a5099d6000000b0056dc72293a3mr260442edb.21.1712250335393; Thu, 04 Apr 2024 10:05:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712250335; cv=none; d=google.com; s=arc-20160816; b=qI62okLaoPBAAS3ywbL9OO6v2hNYOVtDmfP+mUA0gdX/NuWNmPKaJxmGaNEbuh75e8 bBc0ElrZdAdEVGXcQ5bYQ6YErepkomN2qi/gmtJq8aldhB6DW9Vngotp7jEx021FGwxs 827++n+Rq6uAZc3ZWmQTgvtmC7U5MWimGmNYjd60iGZJE9eyUs9ecSKO4cXBXNFd7d86 A9+R9d1g4tSmKurBdbOVPsff3UI73W2W6qZ0sstfR7sefbLeK41G7C6YoSsNmpIJaRmS oVZG9epQM+Nn+NrEHqFIpUJYp0pZhux2c+fOvQOiyzfw0vFl5d1SbdIAT64utpZDzn72 zVtA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=BhyAV6eS2D78RnoHoWtnHhSjgJBuYJ+rYEftsBjLSlI=; fh=zgMS+X4RExv2k7fU8QdWClnqVJdqO/9UbUuBS5xxJDs=; b=l82WqUWhJOJRfGq5xWu0wlr9eoHUF1s3QkwkzZ4rxec/rDCTRk3iBs51ybJMBepvrw 0ZTEoZeAb15geHVbcE8r9wMnlZbWbi1r1pUyXMzuOY0kHjV1ThPZUqwNBA1ufQPzcZAx Gm27/FPfQM2WQsz0dqGh7iSOSbAIpevxz0SO1v4crQ7YmYu2uIMuH4uQEZ5c9HrcBurC PLsTdYgazVyz8pQMRoKH4+XXdM0+CRW4/UNx9YbWdCdo/bv1M8Vu9bVVcwnIajV5+OP7 jicHQdw+mWfSmZfI6U6SZFDqlhzl3y/F3ThvC416IeLaj3QJxSE6ZecjXBUvZcSNJeKq o4hA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id m19-20020a056402511300b0056b9701a913si8357628edd.456.2024.04.04.10.05.34; Thu, 04 Apr 2024 10:05:35 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 92B0268CF84; Thu, 4 Apr 2024 20:05:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from srv-infra-1.infra.inf.glb.tvvideoms.com (www.inf.tvvideoms.com [213.205.126.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D44D668CFDA for ; Thu, 4 Apr 2024 20:05:16 +0300 (EEST) Received: from cji.paris (unknown [172.16.3.159]) by srv-infra-1.infra.inf.glb.tvvideoms.com (Postfix) with ESMTP id D299A2076C; Thu, 4 Apr 2024 17:05:15 +0000 (UTC) From: Nicolas Gaullier To: ffmpeg-devel@ffmpeg.org Date: Thu, 4 Apr 2024 19:05:14 +0200 Message-Id: <20240404170514.827721-2-nicolas.gaullier@cji.paris> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20240404170514.827721-1-nicolas.gaullier@cji.paris> References: <20240404170514.827721-1-nicolas.gaullier@cji.paris> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 1/1] avfilter/vf_colorspace: use colorspace negotiation API X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Nicolas Gaullier Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 4XXeVNxVIfit 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 --- 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)