From patchwork Wed Jul 25 15:46:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vittorio Giovara X-Patchwork-Id: 9791 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:104:0:0:0:0:0 with SMTP id c4-v6csp964159jad; Wed, 25 Jul 2018 08:53:59 -0700 (PDT) X-Google-Smtp-Source: AAOMgpc2OArxiPNQmv9qHhf0jvLgnjAafyVpiy3m8P7ks18uJeWpEAwRc0BqdYJx5ITJgwSKEgwh X-Received: by 2002:a1c:8406:: with SMTP id g6-v6mr4770575wmd.18.1532534039197; Wed, 25 Jul 2018 08:53:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532534039; cv=none; d=google.com; s=arc-20160816; b=hvIJ0eq0v3L4rq3Az6fIpXF7iVJUPfp1LJsA1RMShnM2pel+MabRu7X03ZYExIPOTm dYwlHaAVBbCvtJIT/0atFePjq1zaSD43XX5bvrd+3HZ6fT6I3VF30wGVilebi9hsicJu kVaQxBIiJrGH98SHsDS4lneXnAFFLEHRItWFNxEZ6809iBdL3QwkT9O2GMrGRMfO/SzQ +5TL7LiwYCZ3szaLlFr/prEhE1KDP/EkPu6j0hYayCljipr23vDO2EEJi37WRLLfDMmQ MsiVB56G9bpfkkPx+1MgJZf6/k70CP9yP3/U6OVb/bTVl2E5hM2kRMfSXLJRNqHofBKf g93g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=aIC8umMWPJ4U1i6ZK2rLt3ui+R7VUKVGh9d70C83Sf8=; b=Il5XCWzzOk0MBFtK2euXS6mSJord47DqYZXVFiLszZsfyGdm4HXAiZdjhzXnnKdwqc UlCsmyObEpllarIf1RYM3wiQ5e+F5/s8H6EwzE0FuXfVCzwVPAW5QLSjOk2RbgjQd5zE tttAeS+znOb9NL9AMTMa4aVbCkJ/a6pwsINI2XdjHtZy1Uk+Yr6YhcJTk+d4fq3OmOig GP4t+lQnpKSBroX3xkOFzh+hRXZX2k/6XjkAvL/vmZdI+gv1rfibjrJMffRLa7EVbwPI hxoDDQYtiSDaAuaFiE64Isbxwv9RwnvnvGRZWAkcQEV5uE2nGE56IlWPvFGWhNLq2WN0 oKfg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=QLeLLPQj; 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 n196-v6si3325162wmg.186.2018.07.25.08.53.58; Wed, 25 Jul 2018 08:53:59 -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=20161025 header.b=QLeLLPQj; 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 65F6B68A40B; Wed, 25 Jul 2018 18:53:43 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f194.google.com (mail-qt0-f194.google.com [209.85.216.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BCADD68A402 for ; Wed, 25 Jul 2018 18:53:36 +0300 (EEST) Received: by mail-qt0-f194.google.com with SMTP id e19-v6so8098736qtp.8 for ; Wed, 25 Jul 2018 08:53:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=IVOo4fxU4C7hImK5QsuKoxf2dL97j4X1TMSd8PUX9gQ=; b=QLeLLPQjB7KZJ1Qpsu+vQ0M0vQ8XtsPS8qL7WGga+4DVcQ0x/L3rHYIO6SelVijx35 IAxq9XPFQeW7prybFiOVnhXSN9gdYFV++OeMUUWxInhXIPkNaPof1hBigcTPxtRqx0bP DN8E5s9/bE6HBh5fZi+mUfzHDRvYQUSFqVHov6gjuZiI9M5XmY/kGiVYv10uxtvhUguC bU7lbdtSczb+5kZk9WbpNVLDJ47I7poB+lFVRHMaMprITFA2TPWtWir5+2yp4e1HPSem Cs6neJdpxdQC5+PdXCCwQWS3wvwDjcO2CU1kIEmRAZZoAxGMGaOCnSosPEKCoeA5tgGm p/yg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=IVOo4fxU4C7hImK5QsuKoxf2dL97j4X1TMSd8PUX9gQ=; b=jVZH5eqBdiqOji5LSAg9bmd84xfCwnqRVK+tHXGgcz89AlSBw0XJcUxabMs1g43G+w sYELTgvdY1BEKfb5dVH8v7hE4LqWIKZ0jCNgdWDaur1Yq1rJdfPaT8wn9wkTDc9ut5YJ hj5OQ0PCQo47Y6grutFoKPCeZbXc6H0cy684zPg7JxDOb5V/j2B79wfrscQ+EF6HzZFy hoObJYfLafGKw1YY3rUxsuzZAm0g3R9bQLLavZtLnF3pCfYUdq8pa0JiZe9UPqVVmTrY dGRmhZw4V3jft+3qum5vcp1a1sGEaTxxxdaMFXWT+PyZd/GsynfDCGIx4YjJPdsKWySg fegw== X-Gm-Message-State: AOUpUlEzlJv5nAbztxsTRksXw+dkEDAxWdon8p2Ha781xWrcQ44qyPJP 3HgsvXE4qXw0dy5UIZgNE4eALCiA X-Received: by 2002:ac8:6143:: with SMTP id d3-v6mr21059258qtm.298.1532533607060; Wed, 25 Jul 2018 08:46:47 -0700 (PDT) Received: from vimacnew.vimeo.iac.corp (mi-18-10-107.service.infuturo.it. [151.18.10.107]) by smtp.gmail.com with ESMTPSA id l22-v6sm14928196qkh.72.2018.07.25.08.46.45 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 25 Jul 2018 08:46:46 -0700 (PDT) From: Vittorio Giovara To: ffmpeg-devel@ffmpeg.org Date: Wed, 25 Jul 2018 17:46:38 +0200 Message-Id: <20180725154640.89762-2-vittorio.giovara@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180725154640.89762-1-vittorio.giovara@gmail.com> References: <20180725154640.89762-1-vittorio.giovara@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/4] vf_tonemap[_opencl]: Move determine_signal_peak() to a shared file X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The two functions are identical. Use the shared LumaCoeffients type too. --- libavfilter/Makefile | 2 +- libavfilter/colorspace.c | 29 +++++++++++++++++++++++++ libavfilter/colorspace.h | 6 ++++++ libavfilter/vf_tonemap.c | 38 +++------------------------------ libavfilter/vf_tonemap_opencl.c | 28 +----------------------- 5 files changed, 40 insertions(+), 63 deletions(-) diff --git a/libavfilter/Makefile b/libavfilter/Makefile index 86b04e3efb..245302bbe8 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -365,7 +365,7 @@ OBJS-$(CONFIG_TILE_FILTER) += vf_tile.o OBJS-$(CONFIG_TINTERLACE_FILTER) += vf_tinterlace.o OBJS-$(CONFIG_TLUT2_FILTER) += vf_lut2.o framesync.o OBJS-$(CONFIG_TMIX_FILTER) += vf_mix.o framesync.o -OBJS-$(CONFIG_TONEMAP_FILTER) += vf_tonemap.o +OBJS-$(CONFIG_TONEMAP_FILTER) += vf_tonemap.o colorspace.o OBJS-$(CONFIG_TONEMAP_OPENCL_FILTER) += vf_tonemap_opencl.o colorspace.o opencl.o \ opencl/tonemap.o opencl/colorspace_common.o OBJS-$(CONFIG_TRANSPOSE_FILTER) += vf_transpose.o diff --git a/libavfilter/colorspace.c b/libavfilter/colorspace.c index 45da1dd124..d6f6055401 100644 --- a/libavfilter/colorspace.c +++ b/libavfilter/colorspace.c @@ -17,6 +17,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/frame.h" +#include "libavutil/mastering_display_metadata.h" +#include "libavutil/pixdesc.h" + #include "colorspace.h" @@ -89,3 +93,28 @@ void ff_fill_rgb2xyz_table(const struct PrimaryCoefficients *coeffs, rgb2xyz[2][1] *= sg; rgb2xyz[2][2] *= sb; } + +double ff_determine_signal_peak(AVFrame *in) +{ + AVFrameSideData *sd = av_frame_get_side_data(in, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL); + double peak = 0; + + if (sd) { + AVContentLightMetadata *clm = (AVContentLightMetadata *)sd->data; + peak = clm->MaxCLL / REFERENCE_WHITE; + } + + sd = av_frame_get_side_data(in, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA); + if (!peak && sd) { + AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)sd->data; + if (metadata->has_luminance) + peak = av_q2d(metadata->max_luminance) / REFERENCE_WHITE; + } + + // For untagged source, use peak of 10000 if SMPTE ST.2084 + // otherwise assume HLG with reference display peak 1000. + if (!peak) + peak = in->color_trc == AVCOL_TRC_SMPTE2084 ? 100.0f : 10.0f; + + return peak; +} diff --git a/libavfilter/colorspace.h b/libavfilter/colorspace.h index 9d45ee2366..75705ecfc7 100644 --- a/libavfilter/colorspace.h +++ b/libavfilter/colorspace.h @@ -21,6 +21,9 @@ #define AVFILTER_COLORSPACE_H #include "libavutil/common.h" +#include "libavutil/frame.h" + +#define REFERENCE_WHITE 100.0f struct LumaCoefficients { double cr, cg, cb; @@ -40,4 +43,7 @@ void ff_matrix_mul_3x3(double dst[3][3], void ff_fill_rgb2xyz_table(const struct PrimaryCoefficients *coeffs, const struct WhitepointCoefficients *wp, double rgb2xyz[3][3]); + +double ff_determine_signal_peak(AVFrame *in); + #endif diff --git a/libavfilter/vf_tonemap.c b/libavfilter/vf_tonemap.c index 10fd7ea016..b62532946b 100644 --- a/libavfilter/vf_tonemap.c +++ b/libavfilter/vf_tonemap.c @@ -30,17 +30,15 @@ #include "libavutil/imgutils.h" #include "libavutil/internal.h" #include "libavutil/intreadwrite.h" -#include "libavutil/mastering_display_metadata.h" #include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "avfilter.h" +#include "colorspace.h" #include "formats.h" #include "internal.h" #include "video.h" -#define REFERENCE_WHITE 100.0f - enum TonemapAlgorithm { TONEMAP_NONE, TONEMAP_LINEAR, @@ -52,11 +50,6 @@ enum TonemapAlgorithm { TONEMAP_MAX, }; -typedef struct LumaCoefficients { - double cr, cg, cb; -} LumaCoefficients; - - static const struct LumaCoefficients luma_coefficients[AVCOL_SPC_NB] = { [AVCOL_SPC_FCC] = { 0.30, 0.59, 0.11 }, [AVCOL_SPC_BT470BG] = { 0.299, 0.587, 0.114 }, @@ -75,7 +68,7 @@ typedef struct TonemapContext { double desat; double peak; - const LumaCoefficients *coeffs; + const struct LumaCoefficients *coeffs; } TonemapContext; static const enum AVPixelFormat pix_fmts[] = { @@ -114,31 +107,6 @@ static av_cold int init(AVFilterContext *ctx) return 0; } -static double determine_signal_peak(AVFrame *in) -{ - AVFrameSideData *sd = av_frame_get_side_data(in, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL); - double peak = 0; - - if (sd) { - AVContentLightMetadata *clm = (AVContentLightMetadata *)sd->data; - peak = clm->MaxCLL / REFERENCE_WHITE; - } - - sd = av_frame_get_side_data(in, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA); - if (!peak && sd) { - AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)sd->data; - if (metadata->has_luminance) - peak = av_q2d(metadata->max_luminance) / REFERENCE_WHITE; - } - - // For untagged source, use peak of 10000 if SMPTE ST.2084 - // otherwise assume HLG with reference display peak 1000. - if (!peak) - peak = in->color_trc == AVCOL_TRC_SMPTE2084 ? 100.0f : 10.0f; - - return peak; -} - static float hable(float in) { float a = 0.15f, b = 0.50f, c = 0.10f, d = 0.20f, e = 0.02f, f = 0.30f; @@ -260,7 +228,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) /* read peak from side data if not passed in */ if (!peak) { - peak = determine_signal_peak(in); + peak = ff_determine_signal_peak(in); av_log(s, AV_LOG_DEBUG, "Computed signal peak: %f\n", peak); } diff --git a/libavfilter/vf_tonemap_opencl.c b/libavfilter/vf_tonemap_opencl.c index 241f95e6c3..7455ebb9fb 100644 --- a/libavfilter/vf_tonemap_opencl.c +++ b/libavfilter/vf_tonemap_opencl.c @@ -40,7 +40,6 @@ // - more format support #define DETECTION_FRAMES 63 -#define REFERENCE_WHITE 100.0f enum TonemapAlgorithm { TONEMAP_NONE, @@ -343,31 +342,6 @@ fail: return err; } -static double determine_signal_peak(AVFrame *in) -{ - AVFrameSideData *sd = av_frame_get_side_data(in, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL); - double peak = 0; - - if (sd) { - AVContentLightMetadata *clm = (AVContentLightMetadata *)sd->data; - peak = clm->MaxCLL / REFERENCE_WHITE; - } - - sd = av_frame_get_side_data(in, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA); - if (!peak && sd) { - AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)sd->data; - if (metadata->has_luminance) - peak = av_q2d(metadata->max_luminance) / REFERENCE_WHITE; - } - - // For untagged source, use peak of 10000 if SMPTE ST.2084 - // otherwise assume HLG with reference display peak 1000. - if (!peak) - peak = in->color_trc == AVCOL_TRC_SMPTE2084 ? 100.0f : 10.0f; - - return peak; -} - static void update_metadata(AVFrame *in, double peak) { AVFrameSideData *sd = av_frame_get_side_data(in, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL); @@ -415,7 +389,7 @@ static int tonemap_opencl_filter_frame(AVFilterLink *inlink, AVFrame *input) goto fail; if (!peak) - peak = determine_signal_peak(input); + peak = ff_determine_signal_peak(input); if (ctx->trc != -1) output->color_trc = ctx->trc;