[FFmpeg-devel] [PATCH 2/4] vf_tonemap[_opencl]: Move determine_signal_peak() to a shared file

Vittorio Giovara vittorio.giovara at gmail.com
Wed Jul 25 18:46:38 EEST 2018


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;
-- 
2.17.1



More information about the ffmpeg-devel mailing list