|
|
|
@ -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); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|