From patchwork Wed Dec 13 13:12:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 45102 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1225:b0:181:818d:5e7f with SMTP id v37csp4263742pzf; Wed, 13 Dec 2023 05:16:38 -0800 (PST) X-Google-Smtp-Source: AGHT+IH33iyXFtWSwEsKx+jjUD5il2FYB0PCBQiERQLxohEz/ZVzta5mHYIccwKkikTkznUoVtuS X-Received: by 2002:a2e:a49c:0:b0:2cc:202f:9757 with SMTP id h28-20020a2ea49c000000b002cc202f9757mr2386574lji.54.1702473398660; Wed, 13 Dec 2023 05:16:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702473398; cv=none; d=google.com; s=arc-20160816; b=qBUNg/8O0WpJvSjVC+Trh1VQdEq/RrwY/xJU3cqUXT08rKyYLkj3N+byLqIL97b8aO 2RK03jG9Qqoha8maJTKD4GSS5jkKij7FgmxaAefSJxH1SG/b9TfPX9c8nI3G8uMTbxye e1ngr9DhuNFAhj79d3KyBE8mbir186Ent/nrJWrqjJouXTMOZHvXbmwhUC4o96QQQjAy S6RkMVnIEF6/uqixQKRabd5VXOZEGR4Jj3IyG/hG0thS1dxfoZOEh1VM0o4CVVlNdavM +OeBv1jiyOYknsSIaWWp7GYvzGkOTSUm1s9eGWVeWTY4mtTlr4SCW/ZLhFQTjPbfAyx5 t0Dw== 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=zlziIFH89cE4FRy3xUO+GbdBljI1vub5S90PfQnJ3MU=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=oTObxp9+Xskfc6u3qdETLaXap2os/AWyqfpYT8qbTYfnNY4SaGdbY9xERlXU6nlmfV 6Fvf+voPV+l0GRDipuI3SWADm10GSVR0ORP3hvYJmrv6CeTNCOr52S9JOjpcs8iCX9nS NSJdE3fy+LrKVDyH1tsij+IUNXBJKpKkndq35lHhB6Vq3EwfhLFCo5NrW/OPTDNrJqwX EtdGv3C2kXRu0CXck2xgkDeJAHQZsWoRFau5XXpws70kQbyBCKdU5/JQBKCgbrlfJPv+ qA1UAHH/frIbTXQugf15p+hUmBW23rQUXXwJS85ukpb+tj9FOsHPgqSPf3LjTFWtZJ1v d7gQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=Rgw22EKr; 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 b98-20020a509f6b000000b00551d07ecb07si1041583edf.222.2023.12.13.05.16.38; Wed, 13 Dec 2023 05:16:38 -0800 (PST) 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=Rgw22EKr; 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 9E68F68D21E; Wed, 13 Dec 2023 15:15:51 +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 4A13468D032 for ; Wed, 13 Dec 2023 15:15:45 +0200 (EET) Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 341ED4BD4D; Wed, 13 Dec 2023 14:15:43 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1702473343; bh=MHso3/zJH94N9jYAAMyxaP+sDjuwzk52IqZDsrR81r8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Rgw22EKrDp6nlX+fgFhHN0lks1IdA8jQZxUgQ9jV/4B0Ptxdub233KLk05edaNu6k qBMi0y2Nua2er8zd+1r3cI4SmZWiUyY3eWriC0cnBiQIZwzIAm+d3o6e/XhqRPTx/D 0CvkqRXa+Mh4JA3xcfZ+As8GyBr+SstGIWk5Jl1Y= From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Wed, 13 Dec 2023 14:12:11 +0100 Message-ID: <20231213131536.10242-15-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231213131536.10242-1-ffmpeg@haasn.xyz> References: <20231213131536.10242-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 14/15] avfilter/vf_format: add color_ranges/spaces 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: fgoQtWNKvTA6 From: Niklas Haas Needed for fftools/ffmpeg_filter to be able to force specific output formats via the filter chain. --- doc/filters.texi | 8 ++++++++ libavfilter/vf_format.c | 42 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index f182dc2ddb..4be4dbf270 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -14323,6 +14323,14 @@ It accepts the following parameters: A '|'-separated list of pixel format names, such as "pix_fmts=yuv420p|monow|rgb24". +@item color_spaces +A '|'-separated list of color space names, such as +"color_spaces=bt709|bt470bg|bt2020nc". + +@item color_ranges +A '|'-separated list of color range names, such as +"color_spaces=tv|pc". + @end table @subsection Examples diff --git a/libavfilter/vf_format.c b/libavfilter/vf_format.c index 59832b7768..d1bb9daa97 100644 --- a/libavfilter/vf_format.c +++ b/libavfilter/vf_format.c @@ -40,14 +40,20 @@ typedef struct FormatContext { const AVClass *class; char *pix_fmts; + char *csps; + char *ranges; AVFilterFormats *formats; ///< parsed from `pix_fmts` + AVFilterFormats *color_spaces; ///< parsed from `csps` + AVFilterFormats *color_ranges; ///< parsed from `ranges` } FormatContext; static av_cold void uninit(AVFilterContext *ctx) { FormatContext *s = ctx->priv; ff_formats_unref(&s->formats); + ff_formats_unref(&s->color_spaces); + ff_formats_unref(&s->color_ranges); } static av_cold int invert_formats(AVFilterFormats **fmts, @@ -99,13 +105,35 @@ static av_cold int init(AVFilterContext *ctx) return ret; } + for (char *sep, *cur = s->csps; cur; cur = sep) { + sep = strchr(cur, '|'); + if (sep && *sep) + *sep++ = 0; + if ((ret = av_color_space_from_name(cur)) < 0 || + (ret = ff_add_format(&s->color_spaces, ret)) < 0) + return ret; + } + + for (char *sep, *cur = s->ranges; cur; cur = sep) { + sep = strchr(cur, '|'); + if (sep && *sep) + *sep++ = 0; + if ((ret = av_color_range_from_name(cur)) < 0 || + (ret = ff_add_format(&s->color_ranges, ret)) < 0) + return ret; + } + if (!strcmp(ctx->filter->name, "noformat")) { - if ((ret = invert_formats(&s->formats, ff_all_formats(AVMEDIA_TYPE_VIDEO))) < 0) + if ((ret = invert_formats(&s->formats, ff_all_formats(AVMEDIA_TYPE_VIDEO))) < 0 || + (ret = invert_formats(&s->color_spaces, ff_all_color_spaces())) < 0 || + (ret = invert_formats(&s->color_ranges, ff_all_color_ranges())) < 0) return ret; } /* hold on to a ref for the lifetime of the filter */ - if ((ret = ff_formats_ref(s->formats, &s->formats)) < 0) + if ((ret = ff_formats_ref(s->formats, &s->formats)) < 0 || + s->color_spaces && (ret = ff_formats_ref(s->color_spaces, &s->color_spaces)) < 0 || + s->color_ranges && (ret = ff_formats_ref(s->color_ranges, &s->color_ranges)) < 0) return ret; return 0; @@ -114,14 +142,22 @@ static av_cold int init(AVFilterContext *ctx) static int query_formats(AVFilterContext *ctx) { FormatContext *s = ctx->priv; + int ret; + + if ((ret = ff_set_common_formats(ctx, s->formats)) < 0 || + s->color_spaces && (ret = ff_set_common_color_spaces(ctx, s->color_spaces)) < 0 || + s->color_ranges && (ret = ff_set_common_color_ranges(ctx, s->color_ranges)) < 0) + return ret; - return ff_set_common_formats(ctx, s->formats); + return 0; } #define OFFSET(x) offsetof(FormatContext, x) static const AVOption options[] = { { "pix_fmts", "A '|'-separated list of pixel formats", OFFSET(pix_fmts), AV_OPT_TYPE_STRING, .flags = AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM }, + { "color_spaces", "A '|'-separated list of color spaces", OFFSET(csps), AV_OPT_TYPE_STRING, .flags = AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM }, + { "color_ranges", "A '|'-separated list of color ranges", OFFSET(ranges), AV_OPT_TYPE_STRING, .flags = AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM }, { NULL } };