From patchwork Thu Sep 8 13:22:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: mirs fang X-Patchwork-Id: 37767 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:139a:b0:8f:1db5:eae2 with SMTP id w26csp287736pzh; Thu, 8 Sep 2022 06:24:04 -0700 (PDT) X-Google-Smtp-Source: AA6agR7Dng0ZHYQebY/f2DUoODknDW3jkmrGNhTvSXJlS5lt8Y7fmZ4OURqS5v+G79KAPyitEy8q X-Received: by 2002:a17:907:8a10:b0:771:47a7:5a55 with SMTP id sc16-20020a1709078a1000b0077147a75a55mr4368430ejc.189.1662643444317; Thu, 08 Sep 2022 06:24:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1662643444; cv=none; d=google.com; s=arc-20160816; b=ItALx0ZTLS3d0JMplrXvN/mLkROdFvG1iuTXcJD3mGgP4pQW0jzREN93tv6mY6TvjO Ot8v8JSL15l4mMIjALiBYzhXJtPhfXPKBXmIzIeJjTGxC/0kjXumsQ8vdP05lifOZf6b tBPUnqhjx/3KKSpJrHGiTLFZyFkk5Kz6GhU9aYJnmBE9DKAEIb9ObKGf12zfl5KO4uN1 t/FRqSczI08364qbIKGUPExd49LVSibgJ3PbbEWfeCVXEVzfgcr3v0Y3/ThMaTPtEIt5 zEVONIj1+QGz7j/bb3moVVRDYNwEIEPCag1rFBQxNwf9AZNHJZ/8ztN7CXRho+N1TsoN RjXQ== 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=OU6QsaLzQ25iKj3l9fcqb3AN0+WHU1lgaL7P8gw0VH0=; b=YlZ08VsMSW+TGPsIioMVrVBct+jlVyg+t8UmhP0DztJxZuOlbbbnEohVTSZeO6HQzd TAVWhm8qkTyRkKRq0G4h1EnnJ7NXRVL1qzVPvT53A/u1NRW8icq54KaYGn3EKeYeOx5B dZNvHOjT7asEo1+ZzNeOKy8KnwUJPexBxdUT8/4ktmrpAf0fe3RPmSEIh7COQYchciwi XdV0SZrt9leDxZf8MhE4JOq19GSDNyN4G6BTxvjQdJQ1s9cNARfw3ZPBsIBvmmA/Gc0h WEXiVzVhcSbi4jqHWc0Ky9rOgGTzjtgSR97guFsvx8N6yE+gHBVa0kCaWwOWOEwruLGH Q8EQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=U3oiOUFa; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id lr4-20020a170906fb8400b0073832d0cdfdsi1815329ejb.649.2022.09.08.06.23.57; Thu, 08 Sep 2022 06:24:04 -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=@gmail.com header.s=20210112 header.b=U3oiOUFa; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1738B68BA99; Thu, 8 Sep 2022 16:23:55 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0137968BA99 for ; Thu, 8 Sep 2022 16:23:48 +0300 (EEST) Received: by mail-pj1-f46.google.com with SMTP id pj10so7338690pjb.2 for ; Thu, 08 Sep 2022 06:23:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date; bh=d9p5bijH9yhhCVlrpj9CII95ijD4xdpG47IDImADGRw=; b=U3oiOUFaT5oBVrPOhdWjPJAyhuShtsTEhzA2Aky4eYBjVTbl7r6kONksQHtYEQjXZj KBmHWxGpA9/S5vUoRsYoR6+kI+CXC5uZxGlT9KMLSUxF1CSmXhFxRDv/VnKdr04N3NRJ 7RZZ0WgIwaIpcKJ8b3h6Stj+5k5zUJK/lNnkUhl+HNa1gc5Gx319umcLvU4vs3eyQyhq nvtN7Vbqo6WqZgj0llMJ49snyfEixtxfhL4tn4GXt2FzPceGcB2oRlmHDZ1+5w66cEXi 4XiSpxFsUpYIAkcqFbiikpdwbeNUrj0PtCTFi6MexV9GNS3cimXGM+iWsUFd8aEPPgDK Ko8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date; bh=d9p5bijH9yhhCVlrpj9CII95ijD4xdpG47IDImADGRw=; b=faSdY5n3c2zzgIHzOWSACL1m/bFocNZS4zt6R+Xr9ZxPNqcbFackdLvytZSlnDOaHI cf+xWsv7C/43g0PmWyH52cbRUWETJrJsGETcKpChOar7rZcxpkVrIn1u6d+OEyEpCgPj NK7cA39XkOeukhs5in7vWs4G/UNIOwRATOxUTG15MNLkT1TBo061x6Tm/Ml86dd9QDdw sF5vojUu+O76H1peN0xuXTk7pjTknmSux+whnz+Pt/ZRbX0au+bZeUGlgAodHOtlBw4E sIMq9zy0u9yQYDRj7R0xNLN3IaEgOQVIi1RCtjf4u/hTJqXHUF2TdCrqZ+Q52Ct6c9Mm dJdQ== X-Gm-Message-State: ACgBeo3XK//mbA9nUAcgmTqIicX2VM4bPCDkJ/W+z8jbKnAheBGnwOgc hCHsl53c0CPs+FfrRd9Ma0mVbVtdpSMwbA== X-Received: by 2002:a17:902:ab17:b0:177:e928:8cb2 with SMTP id ik23-20020a170902ab1700b00177e9288cb2mr5505095plb.62.1662643427035; Thu, 08 Sep 2022 06:23:47 -0700 (PDT) Received: from localhost.localdomain ([220.203.232.199]) by smtp.gmail.com with ESMTPSA id nk21-20020a17090b195500b001f2ef3c7956sm1722067pjb.25.2022.09.08.06.23.45 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 08 Sep 2022 06:23:46 -0700 (PDT) From: mirsfang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Thu, 8 Sep 2022 21:22:44 +0800 Message-Id: <20220908132244.87839-1-mirsfang@gmail.com> X-Mailer: git-send-email 2.32.1 (Apple Git-133) MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v1 1/1] avfilter/vf_tonemap: add herimte tone mapping 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: mirs Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: aMaBKDf5gEbs From: mirs Signed-off-by: mirs add tonemapping hermite,this looks close real hdr display format patch email --- libavfilter/vf_tonemap.c | 65 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/libavfilter/vf_tonemap.c b/libavfilter/vf_tonemap.c index d1087e6bd9..3fb2bdfa2c 100644 --- a/libavfilter/vf_tonemap.c +++ b/libavfilter/vf_tonemap.c @@ -48,6 +48,7 @@ enum TonemapAlgorithm { TONEMAP_REINHARD, TONEMAP_HABLE, TONEMAP_MOBIUS, + TONEMAP_HERMITE, TONEMAP_MAX, }; @@ -106,6 +107,66 @@ static float mobius(float in, float j, double peak) return (b * b + 2.0f * b * j + j * j) / (b - a) * (in + a) / (in + b); } +static float hermite(float in) { + /* + * in theory, max mastering lumi 、max content lumi frome packet side data, + * display max lumi from Display system value,current value is R-REP-BT.2390 max value + */ + float max_mastering_lumi = 1000.0f; + float max_content_lumi = 1000.0f; + float display_max_lumi = 400.0f; // Terminal domain 400NITS is the maximum lumen of a normal screen + + float max_in_lumi = FFMAX(max_mastering_lumi,max_content_lumi); + float max_out_lumi = display_max_lumi; + float nits = in * (display_max_lumi / max_mastering_lumi); + + // clamp + if (nits < 0) { + nits = 0.0; + } else if (nits > max_in_lumi) { + nits = max_in_lumi; + } + + if (max_in_lumi <= max_out_lumi) { + nits *= max_out_lumi / max_in_lumi; + } else { + // three control points + const float x0 = 10.0f; + const float y0 = 17.0; + float x1 = max_out_lumi * 0.75; + float y1 = x1; + float x2 = x1 + (max_in_lumi - x1) / 2.0; + float y2 = y1 + (max_out_lumi - y1) * 0.75; + // horizontal distances between the last three control points + float h12 = x2 - x1; + float h23 = max_in_lumi - x2; + // tangents at the last three control points + float m1 = (y2 - y1) / h12; + float m3 = (max_out_lumi - y2) / h23; + float m2 = (m1 + m3) / 2.0; + + if (nits < x0) { + // scale [0.0, x0] to [0.0, y0] linearly + float slope = y0 / x0; + nits *= slope; + } else if (nits < x1) { + // scale [x0, x1] to [y0, y1] linearly + float slope = (y1 - y0) / (x1 - x0); + nits = y0 + (nits - x0) * slope; + } else if (nits < x2) { + // scale [x1, x2] to [y1, y2] using Hermite interp + float t = (nits - x1) / h12; + nits = (y1 * (1.0 + 2.0 * t) + h12 * m1 * t) * (1.0 - t) * (1.0 - t) +(y2 * (3.0 - 2.0 * t) + h12 * m2 * (t - 1.0)) * t * t; + } else { + // scale [x2, maxInLumi] to [y2, maxOutLumi] using Hermite interp + float t = (nits - x2) / h23; + nits = (y2 * (1.0 + 2.0 * t) + h23 * m2 * t) * (1.0 - t) * (1.0 - t) +(max_out_lumi * (3.0 - 2.0 * t) + h23 * m3 * (t - 1.0)) * t * t; + } + } + + return nits; +} + #define MIX(x,y,a) (x) * (1 - (a)) + (y) * (a) static void tonemap(TonemapContext *s, AVFrame *out, const AVFrame *in, const AVPixFmtDescriptor *desc, int x, int y, double peak) @@ -163,6 +224,9 @@ static void tonemap(TonemapContext *s, AVFrame *out, const AVFrame *in, case TONEMAP_MOBIUS: sig = mobius(sig, s->param, peak); break; + case TONEMAP_HERMITE: + sig = hermite(sig); + break; } /* apply the computed scale factor to the color, @@ -291,6 +355,7 @@ static const AVOption tonemap_options[] = { { "reinhard", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_REINHARD}, 0, 0, FLAGS, "tonemap" }, { "hable", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_HABLE}, 0, 0, FLAGS, "tonemap" }, { "mobius", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_MOBIUS}, 0, 0, FLAGS, "tonemap" }, + { "hermite", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_HERMITE}, 0, 0, FLAGS, "tonemap" }, { "param", "tonemap parameter", OFFSET(param), AV_OPT_TYPE_DOUBLE, {.dbl = NAN}, DBL_MIN, DBL_MAX, FLAGS }, { "desat", "desaturation strength", OFFSET(desat), AV_OPT_TYPE_DOUBLE, {.dbl = 2}, 0, DBL_MAX, FLAGS }, { "peak", "signal peak override", OFFSET(peak), AV_OPT_TYPE_DOUBLE, {.dbl = 0}, 0, DBL_MAX, FLAGS },