From patchwork Wed Jan 5 02:06:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 33070 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp326010iog; Tue, 4 Jan 2022 18:06:38 -0800 (PST) X-Google-Smtp-Source: ABdhPJwqB7eMvwUdl0+TilW1GHvwYNzMUX7vuhVO55NuXBQPQP0wZq04AY4yQ9dqjkxcCankVTjO X-Received: by 2002:a17:906:2a48:: with SMTP id k8mr43095788eje.758.1641348398352; Tue, 04 Jan 2022 18:06:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641348398; cv=none; d=google.com; s=arc-20160816; b=t1qQAS7UpJBSFaKXuRBKDX4kc1HcVibG70pnUtDT1OWy6A6rR2NuV0Z12p6utgjexg YLwp68vsNPKCcSSSgoJDqZeAW9igTOnUSi6VQkqA6oEThbPOXOJCm1ar30V9gT1RgCMW uzmErU+0+3zPyvyuCAIknAR5wT5fn0JnWUpixYUxUWDvhq9FwAnvKw2ATZcSe+CNvqTV jfyRlykvC31kejo7VqNZ+PrMRfoMOwM6PFzWEB4L3wW3u+pWUj4DWwc4oby0PBJJuepR T5kj9shIfvQgACDAlrCYauCR7b87mPeDE5/2yB6gVIPieDCpR2GnbzD3S4i5SDzQljVt M7mQ== 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:message-id:date:to:from :dkim-signature:delivered-to; bh=QBVq8KNcBdV0jaQLZUhtqUmJDUHqThG+tIl8FOIG2VY=; b=ndC123lghufZhBV9wgruKR/cpUtZLXBz1+c7495Y24I6ZSkvYuv/gmBqcB4VX6e63N 8e8u19bDdQkADki8DokVykZ6hKD3yjH5NgkHZrrBVgzy9hONTInXSx1KRoBzUyO4zNeR GxVw+ujXZHUdS9MfBtTtMxE9JG7NyLmG0cYahwNZkDrI9WIrjqbnFoOLmNp4MIcDl1WF HT2JZp55+rm8o4Dar+nByGvWhnrPW4GzjOy0eFPRCTVie8KjmxGjv1s24YNZuBFUSLIH 8rDId7tlJpsZKo2Vic78yuL3sPCh2cDrY69i+JAfQ/q28nuJowWmEfm0TDSnI6Rw1Yb9 dR3Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=NbbC5zSo; 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 s23si355083ejr.367.2022.01.04.18.06.38; Tue, 04 Jan 2022 18:06: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=NbbC5zSo; 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 5D8E168A938; Wed, 5 Jan 2022 04:06:35 +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 BE8B16801A0 for ; Wed, 5 Jan 2022 04:06:28 +0200 (EET) Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 84C1A494CA; Wed, 5 Jan 2022 03:06:28 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1641348388; bh=EZ1XcazwTVK9drGwMAbjeysNcfEK5H+3b67Jgc6m8pE=; h=From:To:Cc:Subject:Date:From; b=NbbC5zSosSeeVKbX++gXPKAqHAvtnbokTr4lnmPvwHl1vM2MqXNm+d73T/zkL6L5M fK/JzEk0LjrEDt5cTgO7B4wXjK2mXMt6d7KrMd8PeaUWkGU2gx4nYkEYhRzHKzrH5T JPej2KBNDaPZolLuIOTWmzacfzKSxU7UwYx5OsYY= From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Wed, 5 Jan 2022 03:06:27 +0100 Message-Id: <20220105020627.79676-1-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavfi/libplacebo: support dovi metadata application 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: nqiTZrAcroZl From: Niklas Haas libplacebo supports automatic dolby vision application, but it requires us to switch to a new API. Also add some logic to strip the dolby vision metadata from the output frames in any case where we end up changing the colorimetry. The libplacebo dependency bump is justified because neither 184 nor 192 are part of any stable libplacebo release, so users have to build from git anyways for this filter to exist. Signed-off-by: Niklas Haas --- configure | 2 +- libavfilter/vf_libplacebo.c | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/configure b/configure index 64538b17e2..8392c26015 100755 --- a/configure +++ b/configure @@ -6588,7 +6588,7 @@ enabled libopus && { require_pkg_config libopus opus opus_multistream.h opus_multistream_surround_encoder_create } } -enabled libplacebo && require_pkg_config libplacebo "libplacebo >= 4.184.0" libplacebo/vulkan.h pl_vulkan_create +enabled libplacebo && require_pkg_config libplacebo "libplacebo >= 4.192.0" libplacebo/vulkan.h pl_vulkan_create enabled libpulse && require_pkg_config libpulse libpulse pulse/pulseaudio.h pa_context_new enabled librabbitmq && require_pkg_config librabbitmq "librabbitmq >= 0.7.1" amqp.h amqp_new_connection enabled librav1e && require_pkg_config librav1e "rav1e >= 0.4.0" rav1e.h rav1e_context_new diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c index 5b1e7b5285..1386aaeb3a 100644 --- a/libavfilter/vf_libplacebo.c +++ b/libavfilter/vf_libplacebo.c @@ -47,6 +47,7 @@ typedef struct LibplaceboContext { int force_divisible_by; int normalize_sar; int apply_filmgrain; + int apply_dovi; int colorspace; int color_range; int color_primaries; @@ -281,8 +282,16 @@ static int process_frames(AVFilterContext *avctx, AVFrame *out, AVFrame *in) LibplaceboContext *s = avctx->priv; struct pl_render_params params; struct pl_frame image, target; - ok = pl_map_avframe(s->gpu, &image, NULL, in); - ok &= pl_map_avframe(s->gpu, &target, NULL, out); + ok = pl_map_avframe_ex(s->gpu, &image, pl_avframe_params( + .frame = in, + .map_dovi = s->apply_dovi, + )); + + ok &= pl_map_avframe_ex(s->gpu, &target, pl_avframe_params( + .frame = out, + .map_dovi = false, + )); + if (!ok) { err = AVERROR_EXTERNAL; goto fail; @@ -381,7 +390,7 @@ fail: static int filter_frame(AVFilterLink *link, AVFrame *in) { - int err; + int err, changed; AVFilterContext *ctx = link->dst; LibplaceboContext *s = ctx->priv; AVFilterLink *outlink = ctx->outputs[0]; @@ -400,6 +409,14 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) out->width = outlink->w; out->height = outlink->h; + if (s->apply_dovi && av_frame_get_side_data(in, AV_FRAME_DATA_DOVI_METADATA)) { + /* Output of dovi reshaping is always BT.2020+PQ, so infer the correct + * output colorspace defaults */ + out->colorspace = AVCOL_SPC_BT2020_NCL; + out->color_primaries = AVCOL_PRI_BT2020; + out->color_trc = AVCOL_TRC_SMPTE2084; + } + if (s->colorspace >= 0) out->colorspace = s->colorspace; if (s->color_range >= 0) @@ -411,6 +428,17 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) RET(process_frames(ctx, out, in)); + int changed_csp = s->colorspace != out->colorspace || + s->color_range != out->color_range || + s->color_trc != out->color_trc || + s->color_primaries != out->color_primaries; + + if (s->apply_dovi || changed_csp) { + /* Strip side data if no longer relevant */ + av_frame_remove_side_data(out, AV_FRAME_DATA_DOVI_RPU_BUFFER); + av_frame_remove_side_data(out, AV_FRAME_DATA_DOVI_METADATA); + } + if (s->apply_filmgrain) av_frame_remove_side_data(out, AV_FRAME_DATA_FILM_GRAIN_PARAMS); @@ -559,6 +587,7 @@ static const AVOption libplacebo_options[] = { { "antiringing", "Antiringing strength (for non-EWA filters)", OFFSET(antiringing), AV_OPT_TYPE_FLOAT, {.dbl = 0.0}, 0.0, 1.0, DYNAMIC }, { "sigmoid", "Enable sigmoid upscaling", OFFSET(sigmoid), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, DYNAMIC }, { "apply_filmgrain", "Apply film grain metadata", OFFSET(apply_filmgrain), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, DYNAMIC }, + { "apply_dolbyvision", "Apply Dolby Vision metadata", OFFSET(apply_dovi), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, DYNAMIC }, { "deband", "Enable debanding", OFFSET(deband), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DYNAMIC }, { "deband_iterations", "Deband iterations", OFFSET(deband_iterations), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 16, DYNAMIC },