FFmpeg
vf_tonemap.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Vittorio Giovara <vittorio.giovara@gmail.com>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * tonemap algorithms
24  */
25 
26 #include <float.h>
27 #include <stdio.h>
28 #include <string.h>
29 
30 #include "libavutil/csp.h"
31 #include "libavutil/imgutils.h"
32 #include "libavutil/internal.h"
33 #include "libavutil/intreadwrite.h"
34 #include "libavutil/opt.h"
35 #include "libavutil/pixdesc.h"
36 
37 #include "avfilter.h"
38 #include "colorspace.h"
39 #include "formats.h"
40 #include "internal.h"
41 #include "video.h"
42 
52 };
53 
54 typedef struct TonemapContext {
55  const AVClass *class;
56 
58  double param;
59  double desat;
60  double peak;
61 
64 
66 {
67  TonemapContext *s = ctx->priv;
68 
69  switch(s->tonemap) {
70  case TONEMAP_GAMMA:
71  if (isnan(s->param))
72  s->param = 1.8f;
73  break;
74  case TONEMAP_REINHARD:
75  if (!isnan(s->param))
76  s->param = (1.0f - s->param) / s->param;
77  break;
78  case TONEMAP_MOBIUS:
79  if (isnan(s->param))
80  s->param = 0.3f;
81  break;
82  }
83 
84  if (isnan(s->param))
85  s->param = 1.0f;
86 
87  return 0;
88 }
89 
90 static float hable(float in)
91 {
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;
94 }
95 
96 static float mobius(float in, float j, double peak)
97 {
98  float a, b;
99 
100  if (in <= j)
101  return in;
102 
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);
105 
106  return (b * b + 2.0f * b * j + j * j) / (b - a) * (in + a) / (in + b);
107 }
108 
109 #define MIX(x,y,a) (x) * (1 - (a)) + (y) * (a)
110 static void tonemap(TonemapContext *s, AVFrame *out, const AVFrame *in,
111  const AVPixFmtDescriptor *desc, int x, int y, double peak)
112 {
113  int map[3] = { desc->comp[0].plane, desc->comp[1].plane, desc->comp[2].plane };
114  const float *r_in = (const float *)(in->data[map[0]] + x * desc->comp[map[0]].step + y * in->linesize[map[0]]);
115  const float *g_in = (const float *)(in->data[map[1]] + x * desc->comp[map[1]].step + y * in->linesize[map[1]]);
116  const float *b_in = (const float *)(in->data[map[2]] + x * desc->comp[map[2]].step + y * in->linesize[map[2]]);
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]]);
120  float sig, sig_orig;
121 
122  /* load values */
123  *r_out = *r_in;
124  *g_out = *g_in;
125  *b_out = *b_in;
126 
127  /* desaturate to prevent unnatural colors */
128  if (s->desat > 0) {
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);
134  }
135 
136  /* pick the brightest component, reducing the value range as necessary
137  * to keep the entire signal in range and preventing discoloration due to
138  * out-of-bounds clipping */
139  sig = FFMAX(FFMAX3(*r_out, *g_out, *b_out), 1e-6);
140  sig_orig = sig;
141 
142  switch(s->tonemap) {
143  default:
144  case TONEMAP_NONE:
145  // do nothing
146  break;
147  case TONEMAP_LINEAR:
148  sig = sig * s->param / peak;
149  break;
150  case TONEMAP_GAMMA:
151  sig = sig > 0.05f ? pow(sig / peak, 1.0f / s->param)
152  : sig * pow(0.05f / peak, 1.0f / s->param) / 0.05f;
153  break;
154  case TONEMAP_CLIP:
155  sig = av_clipf(sig * s->param, 0, 1.0f);
156  break;
157  case TONEMAP_HABLE:
158  sig = hable(sig) / hable(peak);
159  break;
160  case TONEMAP_REINHARD:
161  sig = sig / (sig + s->param) * (peak + s->param) / peak;
162  break;
163  case TONEMAP_MOBIUS:
164  sig = mobius(sig, s->param, peak);
165  break;
166  }
167 
168  /* apply the computed scale factor to the color,
169  * linearly to prevent discoloration */
170  *r_out *= sig / sig_orig;
171  *g_out *= sig / sig_orig;
172  *b_out *= sig / sig_orig;
173 }
174 
175 typedef struct ThreadData {
176  AVFrame *in, *out;
178  double peak;
179 } ThreadData;
180 
181 static int tonemap_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
182 {
183  TonemapContext *s = ctx->priv;
184  ThreadData *td = arg;
185  AVFrame *in = td->in;
186  AVFrame *out = td->out;
187  const AVPixFmtDescriptor *desc = td->desc;
188  const int slice_start = (in->height * jobnr) / nb_jobs;
189  const int slice_end = (in->height * (jobnr+1)) / nb_jobs;
190  double peak = td->peak;
191 
192  for (int y = slice_start; y < slice_end; y++)
193  for (int x = 0; x < out->width; x++)
194  tonemap(s, out, in, desc, x, y, peak);
195 
196  return 0;
197 }
198 
200 {
201  AVFilterContext *ctx = link->dst;
202  TonemapContext *s = ctx->priv;
203  AVFilterLink *outlink = ctx->outputs[0];
204  ThreadData td;
205  AVFrame *out;
207  const AVPixFmtDescriptor *odesc = av_pix_fmt_desc_get(outlink->format);
208  int ret, x, y;
209  double peak = s->peak;
210 
211  if (!desc || !odesc) {
212  av_frame_free(&in);
213  return AVERROR_BUG;
214  }
215 
216  out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
217  if (!out) {
218  av_frame_free(&in);
219  return AVERROR(ENOMEM);
220  }
221 
222  ret = av_frame_copy_props(out, in);
223  if (ret < 0) {
224  av_frame_free(&in);
225  av_frame_free(&out);
226  return ret;
227  }
228 
229  /* input and output transfer will be linear */
230  if (in->color_trc == AVCOL_TRC_UNSPECIFIED) {
231  av_log(s, AV_LOG_WARNING, "Untagged transfer, assuming linear light\n");
232  out->color_trc = AVCOL_TRC_LINEAR;
233  } else if (in->color_trc != AVCOL_TRC_LINEAR)
234  av_log(s, AV_LOG_WARNING, "Tonemapping works on linear light only\n");
235 
236  /* read peak from side data if not passed in */
237  if (!peak) {
238  peak = ff_determine_signal_peak(in);
239  av_log(s, AV_LOG_DEBUG, "Computed signal peak: %f\n", peak);
240  }
241 
242  /* load original color space even if pixel format is RGB to compute overbrights */
244  if (s->desat > 0 && (in->colorspace == AVCOL_SPC_UNSPECIFIED || !s->coeffs)) {
246  av_log(s, AV_LOG_WARNING, "Missing color space information, ");
247  else if (!s->coeffs)
248  av_log(s, AV_LOG_WARNING, "Unsupported color space '%s', ",
250  av_log(s, AV_LOG_WARNING, "desaturation is disabled\n");
251  s->desat = 0;
252  }
253 
254  /* do the tone map */
255  td.out = out;
256  td.in = in;
257  td.desc = desc;
258  td.peak = peak;
261 
262  /* copy/generate alpha if needed */
263  if (desc->flags & AV_PIX_FMT_FLAG_ALPHA && odesc->flags & AV_PIX_FMT_FLAG_ALPHA) {
264  av_image_copy_plane(out->data[3], out->linesize[3],
265  in->data[3], in->linesize[3],
266  out->linesize[3], outlink->h);
267  } else if (odesc->flags & AV_PIX_FMT_FLAG_ALPHA) {
268  for (y = 0; y < out->height; y++) {
269  for (x = 0; x < out->width; x++) {
270  AV_WN32(out->data[3] + x * odesc->comp[3].step + y * out->linesize[3],
271  av_float2int(1.0f));
272  }
273  }
274  }
275 
276  av_frame_free(&in);
277 
279 
280  return ff_filter_frame(outlink, out);
281 }
282 
283 #define OFFSET(x) offsetof(TonemapContext, x)
284 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
285 static const AVOption tonemap_options[] = {
286  { "tonemap", "tonemap algorithm selection", OFFSET(tonemap), AV_OPT_TYPE_INT, {.i64 = TONEMAP_NONE}, TONEMAP_NONE, TONEMAP_MAX - 1, FLAGS, "tonemap" },
287  { "none", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_NONE}, 0, 0, FLAGS, "tonemap" },
288  { "linear", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_LINEAR}, 0, 0, FLAGS, "tonemap" },
289  { "gamma", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_GAMMA}, 0, 0, FLAGS, "tonemap" },
290  { "clip", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_CLIP}, 0, 0, FLAGS, "tonemap" },
291  { "reinhard", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_REINHARD}, 0, 0, FLAGS, "tonemap" },
292  { "hable", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_HABLE}, 0, 0, FLAGS, "tonemap" },
293  { "mobius", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_MOBIUS}, 0, 0, FLAGS, "tonemap" },
294  { "param", "tonemap parameter", OFFSET(param), AV_OPT_TYPE_DOUBLE, {.dbl = NAN}, DBL_MIN, DBL_MAX, FLAGS },
295  { "desat", "desaturation strength", OFFSET(desat), AV_OPT_TYPE_DOUBLE, {.dbl = 2}, 0, DBL_MAX, FLAGS },
296  { "peak", "signal peak override", OFFSET(peak), AV_OPT_TYPE_DOUBLE, {.dbl = 0}, 0, DBL_MAX, FLAGS },
297  { NULL }
298 };
299 
301 
302 static const AVFilterPad tonemap_inputs[] = {
303  {
304  .name = "default",
305  .type = AVMEDIA_TYPE_VIDEO,
306  .filter_frame = filter_frame,
307  },
308 };
309 
310 static const AVFilterPad tonemap_outputs[] = {
311  {
312  .name = "default",
313  .type = AVMEDIA_TYPE_VIDEO,
314  },
315 };
316 
318  .name = "tonemap",
319  .description = NULL_IF_CONFIG_SMALL("Conversion to/from different dynamic ranges."),
320  .init = init,
321  .priv_size = sizeof(TonemapContext),
322  .priv_class = &tonemap_class,
327 };
ff_get_video_buffer
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition: video.c:101
AVFrame::color_trc
enum AVColorTransferCharacteristic color_trc
Definition: frame.h:596
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
td
#define td
Definition: regdef.h:70
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
out
FILE * out
Definition: movenc.c:54
TONEMAP_GAMMA
@ TONEMAP_GAMMA
Definition: vf_tonemap.c:46
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:969
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2888
AVCOL_TRC_LINEAR
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
Definition: pixfmt.h:567
hable
static float hable(float in)
Definition: vf_tonemap.c:90
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:99
AVFrame::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: frame.h:603
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:330
pixdesc.h
av_csp_luma_coeffs_from_avcsp
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...
Definition: csp.c:58
AVOption
AVOption.
Definition: opt.h:251
b
#define b
Definition: input.c:41
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:561
AVComponentDescriptor::step
int step
Number of elements between 2 horizontally consecutive pixels.
Definition: pixdesc.h:40
tonemap_options
static const AVOption tonemap_options[]
Definition: vf_tonemap.c:285
ff_determine_signal_peak
double ff_determine_signal_peak(AVFrame *in)
Definition: colorspace.c:153
ThreadData::desc
const AVPixFmtDescriptor * desc
Definition: vf_tonemap.c:177
float.h
FLAGS
#define FLAGS
Definition: vf_tonemap.c:284
AVLumaCoefficients
Struct containing luma coefficients to be used for RGB to YUV/YCoCg, or similar calculations.
Definition: csp.h:48
ThreadData::peak
double peak
Definition: vf_tonemap.c:178
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
tonemap_inputs
static const AVFilterPad tonemap_inputs[]
Definition: vf_tonemap.c:302
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:165
av_float2int
static av_always_inline uint32_t av_float2int(float f)
Reinterpret a float as a 32-bit integer.
Definition: intfloat.h:50
ThreadData::out
AVFrame * out
Definition: af_adeclick.c:473
video.h
ThreadData::in
AVFrame * in
Definition: af_adecorrelate.c:154
tonemap_outputs
static const AVFilterPad tonemap_outputs[]
Definition: vf_tonemap.c:310
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:351
av_image_copy_plane
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.
Definition: imgutils.c:374
formats.h
av_color_space_name
const char * av_color_space_name(enum AVColorSpace space)
Definition: pixdesc.c:3264
colorspace.h
tonemap
static void tonemap(TonemapContext *s, AVFrame *out, const AVFrame *in, const AVPixFmtDescriptor *desc, int x, int y, double peak)
Definition: vf_tonemap.c:110
TonemapContext::desat
double desat
Definition: vf_tonemap.c:59
AVFilterPad
A filter pad used for either input or output.
Definition: internal.h:49
av_cold
#define av_cold
Definition: attributes.h:90
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:256
AV_OPT_TYPE_DOUBLE
@ AV_OPT_TYPE_DOUBLE
Definition: opt.h:227
slice_end
static int slice_end(AVCodecContext *avctx, AVFrame *pict)
Handle slice ends.
Definition: mpeg12dec.c:2006
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
tonemap_slice
static int tonemap_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_tonemap.c:181
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
AV_PIX_FMT_FLAG_ALPHA
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition: pixdesc.h:147
ctx
AVFormatContext * ctx
Definition: movenc.c:48
TonemapContext::peak
double peak
Definition: vf_tonemap.c:60
NAN
#define NAN
Definition: mathematics.h:64
FILTER_INPUTS
#define FILTER_INPUTS(array)
Definition: internal.h:194
link
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a link
Definition: filter_design.txt:23
arg
const char * arg
Definition: jacosubdec.c:67
if
if(ret)
Definition: filter_design.txt:179
init
static av_cold int init(AVFilterContext *ctx)
Definition: vf_tonemap.c:65
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
MIX
#define MIX(x, y, a)
Definition: vf_tonemap.c:109
NULL
#define NULL
Definition: coverity.c:32
av_frame_copy_props
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:594
isnan
#define isnan(x)
Definition: libm.h:340
av_clipf
av_clipf
Definition: af_crystalizer.c:122
AVPixFmtDescriptor::flags
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
Definition: pixdesc.h:94
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
TonemapAlgorithm
TonemapAlgorithm
Definition: vf_tonemap.c:43
f
f
Definition: af_crystalizer.c:122
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:115
AV_WN32
#define AV_WN32(p, v)
Definition: intreadwrite.h:376
FILTER_PIXFMTS
#define FILTER_PIXFMTS(...)
Definition: internal.h:180
AV_PIX_FMT_GBRPF32
#define AV_PIX_FMT_GBRPF32
Definition: pixfmt.h:488
ff_update_hdr_metadata
void ff_update_hdr_metadata(AVFrame *in, double peak)
Definition: colorspace.c:178
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:417
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
csp.h
internal.h
AVFILTER_DEFINE_CLASS
AVFILTER_DEFINE_CLASS(tonemap)
internal.h
ff_filter_get_nb_threads
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Definition: avfilter.c:777
ThreadData
Used for passing data between threads.
Definition: dsddec.c:69
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AVFilterPad::name
const char * name
Pad name.
Definition: internal.h:55
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:590
TONEMAP_CLIP
@ TONEMAP_CLIP
Definition: vf_tonemap.c:47
AVFilter
Filter definition.
Definition: avfilter.h:161
TonemapContext
Definition: vf_tonemap.c:54
ret
ret
Definition: filter_design.txt:187
mobius
static float mobius(float in, float j, double peak)
Definition: vf_tonemap.c:96
ff_vf_tonemap
const AVFilter ff_vf_tonemap
Definition: vf_tonemap.c:317
TONEMAP_HABLE
@ TONEMAP_HABLE
Definition: vf_tonemap.c:49
TonemapContext::param
double param
Definition: vf_tonemap.c:58
AVFrame::height
int height
Definition: frame.h:402
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:225
avfilter.h
AV_PIX_FMT_GBRAPF32
#define AV_PIX_FMT_GBRAPF32
Definition: pixfmt.h:489
AVPixFmtDescriptor::comp
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:105
TONEMAP_MAX
@ TONEMAP_MAX
Definition: vf_tonemap.c:51
AVFilterContext
An instance of a filter.
Definition: avfilter.h:392
OFFSET
#define OFFSET(x)
Definition: vf_tonemap.c:283
AVFILTER_FLAG_SLICE_THREADS
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
Definition: avfilter.h:117
desc
const char * desc
Definition: libsvtav1.c:83
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
TONEMAP_NONE
@ TONEMAP_NONE
Definition: vf_tonemap.c:44
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
map
const VDPAUPixFmtMap * map
Definition: hwcontext_vdpau.c:71
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: internal.h:195
TonemapContext::tonemap
enum TonemapAlgorithm tonemap
Definition: vf_tonemap.c:57
FFMAX3
#define FFMAX3(a, b, c)
Definition: macros.h:48
d
d
Definition: ffmpeg_filter.c:156
imgutils.h
TonemapContext::coeffs
const AVLumaCoefficients * coeffs
Definition: vf_tonemap.c:62
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:375
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
filter_frame
static int filter_frame(AVFilterLink *link, AVFrame *in)
Definition: vf_tonemap.c:199
ff_filter_execute
static av_always_inline int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition: internal.h:146
TONEMAP_MOBIUS
@ TONEMAP_MOBIUS
Definition: vf_tonemap.c:50
TONEMAP_LINEAR
@ TONEMAP_LINEAR
Definition: vf_tonemap.c:45
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:234
TONEMAP_REINHARD
@ TONEMAP_REINHARD
Definition: vf_tonemap.c:48