[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