76 s->param = (1.0f -
s->param) /
s->param;
92 float a = 0.15f,
b = 0.50f,
c = 0.10f, d = 0.20f, e = 0.02f,
f = 0.30f;
93 return (in * (in *
a +
b *
c) + d * e) / (in * (in *
a +
b) + d *
f) - e /
f;
96static float mobius(
float in,
float j,
double peak)
103 a = -j * j * (peak - 1.0f) / (j * j - 2.0f * j + peak);
104 b = (j * j - 2.0f * j * peak + peak) /
FFMAX(peak - 1.0f, 1e-6);
106 return (
b *
b + 2.0f *
b * j + j * j) / (
b -
a) * (in +
a) / (in +
b);
109#define MIX(x,y,a) (x) * (1 - (a)) + (y) * (a)
113 int map[3] = {
desc->comp[0].plane,
desc->comp[1].plane,
desc->comp[2].plane };
117 float *r_out = (
float *)(
out->data[
map[0]] + x *
desc->comp[
map[0]].step + y *
out->linesize[
map[0]]);
118 float *g_out = (
float *)(
out->data[
map[1]] + x *
desc->comp[
map[1]].step + y *
out->linesize[
map[1]]);
119 float *b_out = (
float *)(
out->data[
map[2]] + x *
desc->comp[
map[2]].step + y *
out->linesize[
map[2]]);
129 float luma =
av_q2d(
s->coeffs->cr) * *r_in +
av_q2d(
s->coeffs->cg) * *g_in +
av_q2d(
s->coeffs->cb) * *b_in;
130 float overbright =
FFMAX(luma -
s->desat, 1e-6) /
FFMAX(luma, 1e-6);
131 *r_out =
MIX(*r_in, luma, overbright);
132 *g_out =
MIX(*g_in, luma, overbright);
133 *b_out =
MIX(*b_in, luma, overbright);
151 sig =
sig > 0.05f ? pow(
sig / peak, 1.0f /
s->param)
152 :
sig * pow(0.05f / peak, 1.0f /
s->param) / 0.05f;
161 sig =
sig / (
sig +
s->param) * (peak +
s->param) / peak;
170 *r_out *=
sig / sig_orig;
171 *g_out *=
sig / sig_orig;
172 *b_out *=
sig / sig_orig;
190 double peak = td->
peak;
193 for (
int x = 0; x <
out->width; x++)
209 double peak =
s->peak;
211 if (!
desc || !odesc) {
266 out->linesize[3], outlink->
h);
268 for (y = 0; y <
out->height; y++) {
269 for (x = 0; x <
out->width; x++) {
283#define OFFSET(x) offsetof(TonemapContext, x)
284#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
313 .p.priv_class = &tonemap_class,
const FFFilter ff_vf_tonemap
static AVFormatContext * ctx
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Main libavfilter public API header.
Colorspace value utility functions for libavutil.
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
int(* init)(AVBSFContext *ctx)
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_DOUBLE
Underlying C type is double.
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
const struct AVLumaCoefficients * av_csp_luma_coeffs_from_avcsp(enum AVColorSpace csp)
Retrieves the Luma coefficients necessary to construct a conversion matrix from an enum constant desc...
static double av_q2d(AVRational a)
Convert an AVRational to a double.
void av_image_copy_plane(uint8_t *dst, int dst_linesize, const uint8_t *src, int src_linesize, int bytewidth, int height)
Copy image plane from src to dst.
const VDPAUPixFmtMap * map
static av_always_inline uint32_t av_float2int(float f)
Reinterpret a float as a 32-bit integer.
double ff_determine_signal_peak(AVFrame *in)
void ff_update_hdr_metadata(AVFrame *in, double peak)
#define FILTER_INPUTS(array)
#define FILTER_OUTPUTS(array)
static int ff_slice_pos(int total, int jobnr, int nb_jobs)
Compute the boundary index for a slice when work of size total is split into nb_jobs slices.
#define FILTER_PIXFMTS(...)
#define AVFILTER_DEFINE_CLASS(fname)
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static int slice_end(AVCodecContext *avctx, AVFrame *pict, int *got_output)
Handle slice ends.
const char * av_color_space_name(enum AVColorSpace space)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
#define AV_PIX_FMT_GBRPF32
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
#define AV_PIX_FMT_GBRAPF32
static volatile sig_atomic_t sig
Describe the class of an AVClass context structure.
int step
Number of elements between 2 horizontally consecutive pixels.
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * dst
dest filter
int format
agreed upon media format
A filter pad used for either input or output.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
enum AVColorSpace colorspace
YUV colorspace type.
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
enum AVColorTransferCharacteristic color_trc
Struct containing luma coefficients to be used for RGB to YUV/YCoCg, or similar calculations.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
uint64_t flags
Combination of AV_PIX_FMT_FLAG_... flags.
Used for passing data between threads.
const AVPixFmtDescriptor * desc
const AVLumaCoefficients * coeffs
static int filter_frame(AVFilterLink *link, AVFrame *in)
static float hable(float in)
static const AVOption tonemap_options[]
static int tonemap_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
static const AVFilterPad tonemap_inputs[]
static void tonemap(TonemapContext *s, AVFrame *out, const AVFrame *in, const AVPixFmtDescriptor *desc, int x, int y, double peak)
static float mobius(float in, float j, double peak)
const AVFilterPad ff_video_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_VIDEO.
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, const CodedBitstreamUnit *unit, const int is_first_slice)