From patchwork Tue Oct 31 14:54:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 44450 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:6da5:b0:15d:8365:d4b8 with SMTP id gl37csp382216pzb; Tue, 31 Oct 2023 07:56:10 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF6SG2+V7VqxVd/02Nv7bYgd480znfwfmkDcdgCw/kNhDDVd5UAjFu4I76lsdw4l1UitWaN X-Received: by 2002:a50:8a9c:0:b0:530:7ceb:33c with SMTP id j28-20020a508a9c000000b005307ceb033cmr12977876edj.4.1698764170125; Tue, 31 Oct 2023 07:56:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698764170; cv=none; d=google.com; s=arc-20160816; b=wfeyps30aPJZSh5M6Ti1xB/IE4WlI9V0EPfB4M1QtpmhWYvepDgGjB3b7Guk/bb3kR tofa9MpfMHdK5pIEY2aGrx479IXXsyBKKibR1j9vJcZ2++A68xvDdUGt3XfX5WMvC5Sl K6HYSJLzDS5k7psqmYPjdcKKGD3gHvwM2bUBfZsYZoH8sw58Ak40MVy+vgnJLWpPMEkG /DFyBcQIxKNPTvXxUIHOqRFTEt7rJudM+KCM0kb5cclA60VR0O0KEx/ryX1Z8yTPcbBs yshy+gHhMgHOHlzmF6oKn2hz46Of3tiqiwdYlpwPdzJuIXd8udI6suUXj2X7x3bwZvoP qAUQ== 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:dkim-signature:delivered-to; bh=87jofzSPXRtwg2QA1x279gZfmgvcNNZnqd7nGm61RLs=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=PbasI4TPKvCb49EAOyQnhg14VNVPfZVj8rS4mvcrifyq++cGKLrez2XekI9ceiyf4v UubxeBnj/Tf7CHWgPIKZQxnUaNjNf6uMkna2rRrjoKurjHtreuB9RndPq9EclKQTLH7F OTojZV7OmzO/U6qXU16fGHgy15kKD7Qj1ubvUJ0+03cPdIQs9k0+H5ncdwc48whWHAbs FWGFIL59uoGps4dVhwL5Y3faOO0lrN7UZvMtxR0St2TMg0nzw96WLmQZxJKqeYBt2Eyx JQaOhPiHdfeK0vM58BXqxyJH64YLTuv75FD3fdKcgDlTyn3pE4xnGlN0XcUpZJplNY6h V0LA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=pYCr7OBs; 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 x63-20020a50bac5000000b0053eb593c28esi629898ede.220.2023.10.31.07.56.07; Tue, 31 Oct 2023 07:56:10 -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; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=pYCr7OBs; 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 AAF6068CD5D; Tue, 31 Oct 2023 16:55:08 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from haasn.dev (haasn.dev [78.46.187.166]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BF7C068CD11 for ; Tue, 31 Oct 2023 16:55:00 +0200 (EET) Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id DB7344BB0C; Tue, 31 Oct 2023 15:54:55 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1698764095; bh=p94tImgn1+60sEw5OhpHq3G2g6k9v3VOCEE4v3OOd6Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pYCr7OBs57Ksq4q8D8W/Q4LE2FOSbLykDA1Wr/oje6ZR6ZMkvqi0bpWJ/JPK0Rb5K WhJ682OKTdSB88IweM278EYkBdhmmDTHMFG5ycwkjg6+vDW3M9oOgYIep51f0N1/Hn uvqayK1rP10oKJTRsiwsTaHFjnNIfzztI6fL6mPw= From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Tue, 31 Oct 2023 15:54:48 +0100 Message-ID: <20231031145450.94975-6-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231031145450.94975-1-ffmpeg@haasn.xyz> References: <20231031145450.94975-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 6/8] avfilter/vf_scale: simplify color matrix parsing logic 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: Niklas Haas Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: lIaBbIm1NBV9 From: Niklas Haas No need to write a custom string parser when we can just use an integer option with preset values. The various bits of fallback logic are wholly redundant with equivalent logic already inside sws_getCoefficients. Note: I disallowed setting 'out_color_matrix=auto', because this does not do anything meaningful in the current code (just hard-codes AVCOL_SPC_BT470BG fallback). --- libavfilter/vf_scale.c | 66 ++++++++++++++---------------------------- 1 file changed, 22 insertions(+), 44 deletions(-) diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index 23335cef4b..fb8e6a2b76 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -139,8 +139,8 @@ typedef struct ScaleContext { char *flags_str; - char *in_color_matrix; - char *out_color_matrix; + int in_color_matrix; + int out_color_matrix; int in_range; int in_frame_range; @@ -410,30 +410,6 @@ static int query_formats(AVFilterContext *ctx) return 0; } -static const int *parse_yuv_type(const char *s, enum AVColorSpace colorspace) -{ - if (!s) - s = "bt601"; - - if (s && strstr(s, "bt709")) { - colorspace = AVCOL_SPC_BT709; - } else if (s && strstr(s, "fcc")) { - colorspace = AVCOL_SPC_FCC; - } else if (s && strstr(s, "smpte240m")) { - colorspace = AVCOL_SPC_SMPTE240M; - } else if (s && (strstr(s, "bt601") || strstr(s, "bt470") || strstr(s, "smpte170m"))) { - colorspace = AVCOL_SPC_BT470BG; - } else if (s && strstr(s, "bt2020")) { - colorspace = AVCOL_SPC_BT2020_NCL; - } - - if (colorspace < 1 || colorspace > 10 || colorspace == 8) { - colorspace = AVCOL_SPC_BT470BG; - } - - return sws_getCoefficients(colorspace); -} - static int scale_eval_dimensions(AVFilterContext *ctx) { ScaleContext *scale = ctx->priv; @@ -554,7 +530,7 @@ static int config_props(AVFilterLink *outlink) scale->isws[0] = scale->isws[1] = scale->sws = NULL; if (inlink0->w == outlink->w && inlink0->h == outlink->h && - !scale->out_color_matrix && + scale->out_color_matrix == AVCOL_SPC_UNSPECIFIED && scale->in_range == scale->out_range && inlink0->format == outlink->format) ; @@ -840,8 +816,8 @@ scale: in_range = in->color_range; - if ( scale->in_color_matrix - || scale->out_color_matrix + if ( scale->in_color_matrix != AVCOL_SPC_UNSPECIFIED + || scale->out_color_matrix != AVCOL_SPC_UNSPECIFIED || scale-> in_range != AVCOL_RANGE_UNSPECIFIED || in_range != AVCOL_RANGE_UNSPECIFIED || scale->out_range != AVCOL_RANGE_UNSPECIFIED) { @@ -852,11 +828,13 @@ scale: (int **)&table, &out_full, &brightness, &contrast, &saturation); - if (scale->in_color_matrix) - inv_table = parse_yuv_type(scale->in_color_matrix, in->colorspace); - if (scale->out_color_matrix) - table = parse_yuv_type(scale->out_color_matrix, AVCOL_SPC_UNSPECIFIED); - else if (scale->in_color_matrix) + if (scale->in_color_matrix == -1 /* auto */) + inv_table = sws_getCoefficients(in->colorspace); + else if (scale->in_color_matrix != AVCOL_SPC_UNSPECIFIED) + inv_table = sws_getCoefficients(scale->in_color_matrix); + if (scale->out_color_matrix != AVCOL_SPC_UNSPECIFIED) + table = sws_getCoefficients(scale->out_color_matrix); + else if (scale->in_color_matrix != AVCOL_SPC_UNSPECIFIED) table = inv_table; if (scale-> in_range != AVCOL_RANGE_UNSPECIFIED) @@ -1003,16 +981,16 @@ static const AVOption scale_options[] = { { "interl", "set interlacing", OFFSET(interlaced), AV_OPT_TYPE_BOOL, {.i64 = 0 }, -1, 1, FLAGS }, { "size", "set video size", OFFSET(size_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, FLAGS }, { "s", "set video size", OFFSET(size_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, FLAGS }, - { "in_color_matrix", "set input YCbCr type", OFFSET(in_color_matrix), AV_OPT_TYPE_STRING, { .str = "auto" }, .flags = FLAGS, "color" }, - { "out_color_matrix", "set output YCbCr type", OFFSET(out_color_matrix), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS, "color"}, - { "auto", NULL, 0, AV_OPT_TYPE_CONST, { .str = "auto" }, 0, 0, FLAGS, "color" }, - { "bt601", NULL, 0, AV_OPT_TYPE_CONST, { .str = "bt601" }, 0, 0, FLAGS, "color" }, - { "bt470", NULL, 0, AV_OPT_TYPE_CONST, { .str = "bt470" }, 0, 0, FLAGS, "color" }, - { "smpte170m", NULL, 0, AV_OPT_TYPE_CONST, { .str = "smpte170m" }, 0, 0, FLAGS, "color" }, - { "bt709", NULL, 0, AV_OPT_TYPE_CONST, { .str = "bt709" }, 0, 0, FLAGS, "color" }, - { "fcc", NULL, 0, AV_OPT_TYPE_CONST, { .str = "fcc" }, 0, 0, FLAGS, "color" }, - { "smpte240m", NULL, 0, AV_OPT_TYPE_CONST, { .str = "smpte240m" }, 0, 0, FLAGS, "color" }, - { "bt2020", NULL, 0, AV_OPT_TYPE_CONST, { .str = "bt2020" }, 0, 0, FLAGS, "color" }, + { "in_color_matrix", "set input YCbCr type", OFFSET(in_color_matrix), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AVCOL_SPC_NB-1, .flags = FLAGS, "color" }, + { "out_color_matrix", "set output YCbCr type", OFFSET(out_color_matrix), AV_OPT_TYPE_INT, { .i64 = AVCOL_SPC_UNSPECIFIED }, 0, AVCOL_SPC_NB-1, .flags = FLAGS, "color"}, + { "auto", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = -1 }, 0, 0, FLAGS, "color" }, + { "bt601", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_BT470BG }, 0, 0, FLAGS, "color" }, + { "bt470", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_BT470BG }, 0, 0, FLAGS, "color" }, + { "smpte170m", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_BT470BG }, 0, 0, FLAGS, "color" }, + { "bt709", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_BT709 }, 0, 0, FLAGS, "color" }, + { "fcc", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_FCC }, 0, 0, FLAGS, "color" }, + { "smpte240m", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_SMPTE240M }, 0, 0, FLAGS, "color" }, + { "bt2020", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_BT2020_NCL }, 0, 0, FLAGS, "color" }, { "in_range", "set input color range", OFFSET( in_range), AV_OPT_TYPE_INT, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, 2, FLAGS, "range" }, { "out_range", "set output color range", OFFSET(out_range), AV_OPT_TYPE_INT, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, 2, FLAGS, "range" }, { "auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, 0, FLAGS, "range" },