From patchwork Tue Apr 2 13:05:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicolas Gaullier X-Patchwork-Id: 47735 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp1338966pzb; Tue, 2 Apr 2024 06:06:39 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWbki0eLx6O02/4J5cYw7+5H/21yPYLyo4H+ES3X2SWVdUoVm3TrrQO9ncKSTfM7MEx9rBokBMFDipk28sLztQr7DaJapCihMLocw== X-Google-Smtp-Source: AGHT+IF+5d2yH9ehClygBcfeCL62HukiMf7ZrDxqNsPTiNlJ+Ls2RRuTKLFEZam/pc9/rKue5Gce X-Received: by 2002:a05:6512:3052:b0:515:a8f0:221 with SMTP id b18-20020a056512305200b00515a8f00221mr10973048lfb.37.1712063199357; Tue, 02 Apr 2024 06:06:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1712063199; cv=none; d=google.com; s=arc-20160816; b=T2NZKm78lPt3k92Tpbee6oh20z9DlZUJWbhUWQ/HKeaq3djhtpoiNqzUDYDZzl715w b6FNVcVK6ZvR0Jkwhn3MIrHuZSAZOTEAbMYBT8i79vP//zelFTeB8+gid5Wgt3l1SLLV Vfcsb0RRlb6X7CwCNkkF5B4Otk5N2FnFcdYyvQYHN8R6sEHQxtLeafvNoBIXU9avM0lq eN7dmbNlvHFY4MLM39Nd2IjMd4SLjSyIs2ST3KOJaTHXIne5cp8OyRizc6O63tTwBWNl brNp3Oua/wt70IN7HTZx5OmahcHKgQHQRNt+IJBRAnhvegpa4HtKKZq8TcBBPvralIVx rNww== 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=1PQC/2BM2EE9gbeakkwwNjVQvdqDzsTLRZ9Hk5d8FGE=; fh=zgMS+X4RExv2k7fU8QdWClnqVJdqO/9UbUuBS5xxJDs=; b=CxHZJQMYqS3Lv0CDWlSjruYgwA5+GgzxiwlyKvO74dp5g/DWLe53tF4SNyvBzlzF7q c02Zqomehn/3hNuzBfXJxstAdVs8ZVSaG0t52PNFe9ANkZvmWYfyzGZgg5IJs3IxuXbS SHqEAAVSKB3hrJ33cSXTE7SEupHHQ1vfAwnNKuCAp8iCXHPekVfzwb0YUZpxif1Y+81S wqj8d57MbgpEYi7g/4EQmhnPQDJREVywW2eez+xgdolLRMDaCORMWFc6RJZbu03w134z G1gJC8BhuVBHMIHBBy+DGl8LV6Dnfanl0aHrmQdUq5TA1afYZjd78Dkieh/YxBvF7ZUn uSOQ==; 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 q26-20020a50cc9a000000b0056df600882asi249650edi.417.2024.04.02.06.06.38; Tue, 02 Apr 2024 06:06:39 -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 3AB2168CFF2; Tue, 2 Apr 2024 16:06:20 +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 650B268C4BA for ; Tue, 2 Apr 2024 16:06:11 +0300 (EEST) Received: from cji.paris (unknown [172.16.3.159]) by srv-infra-1.infra.inf.glb.tvvideoms.com (Postfix) with ESMTP id C1BEA215FA; Tue, 2 Apr 2024 13:06:10 +0000 (UTC) From: Nicolas Gaullier To: ffmpeg-devel@ffmpeg.org Date: Tue, 2 Apr 2024 15:05:59 +0200 Message-Id: <20240402130559.382049-3-nicolas.gaullier@cji.paris> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20240402130559.382049-1-nicolas.gaullier@cji.paris> References: <20240402130559.382049-1-nicolas.gaullier@cji.paris> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 2/2] 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: QpY5IinlDg29 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 1 - color_range specified: ffmpeg -f lavfi -i yuvtestsrc -vf setparams=color_primaries=bt470bg: color_trc=smpte170m:colorspace=bt470bg,colorspace=bt709:range=tv,scale ,showinfo -f null -frames 1 - Before: color_range:unknown color_space:bt470bg ... After: color_range:tv color_space:bt709 ... Example 2 - color_range pass-through: ffmpeg -f lavfi -i yuvtestsrc -vf "setparams=color_primaries=bt470bg: color_trc=smpte170m:colorspace=bt470bg:range=unknown, setparams=range=pc:enable='between(n,1,2)', setparams=range=tv:enable='between(n,2,3)', colorspace=bt709,scale,showinfo" -f null -frames 3 - 2>&1|awk "/color_/ {print \$4 \" \" \$5}" Before: color_range:tv color_space:bt470bg color_range:tv color_space:bt470bg color_range:tv color_space:bt470bg After: color_range:unknown color_space:bt709 color_range:pc color_space:bt709 color_range:tv color_space:bt709 Signed-off-by: Nicolas Gaullier --- libavfilter/vf_colorspace.c | 63 +++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/libavfilter/vf_colorspace.c b/libavfilter/vf_colorspace.c index d181e81ace..12a571172b 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; + outlink->color_range = s->user_rng != AVCOL_RANGE_UNSPECIFIED ? s->user_rng : in->color_range; + out->color_range = outlink->color_range; 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; @@ -839,10 +839,19 @@ static int query_formats(AVFilterContext *ctx) AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_NONE }; - int res; + int res, ret; ColorSpaceContext *s = ctx->priv; + AVFilterLink *outlink = ctx->outputs[0]; AVFilterFormats *formats = ff_make_format_list(pix_fmts); + if (ret = ff_formats_ref(ff_make_formats_list_singleton(s->out_csp), + &outlink->incfg.color_spaces) < 0) + return ret; + if (s->user_rng != AVCOL_RANGE_UNSPECIFIED + && (ret = ff_formats_ref(ff_make_formats_list_singleton(s->user_rng), + &outlink->incfg.color_ranges) < 0)) + return ret; + if (!formats) return AVERROR(ENOMEM); if (s->user_format == AV_PIX_FMT_NONE) @@ -855,7 +864,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)