FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
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 
29 #include "libavutil/csp.h"
30 #include "libavutil/imgutils.h"
31 #include "libavutil/internal.h"
32 #include "libavutil/intfloat.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 "filters.h"
40 #include "video.h"
41 
51 };
52 
53 typedef struct TonemapContext {
54  const AVClass *class;
55 
57  double param;
58  double desat;
59  double peak;
60 
63 
65 {
66  TonemapContext *s = ctx->priv;
67 
68  switch(s->tonemap) {
69  case TONEMAP_GAMMA:
70  if (isnan(s->param))
71  s->param = 1.8f;
72  break;
73  case TONEMAP_REINHARD:
74  if (!isnan(s->param))
75  s->param = (1.0f - s->param) / s->param;
76  break;
77  case TONEMAP_MOBIUS:
78  if (isnan(s->param))
79  s->param = 0.3f;
80  break;
81  }
82 
83  if (isnan(s->param))
84  s->param = 1.0f;
85 
86  return 0;
87 }
88 
89 static float hable(float in)
90 {
91  float a = 0.15f, b = 0.50f, c = 0.10f, d = 0.20f, e = 0.02f, f = 0.30f;
92  return (in * (in * a + b * c) + d * e) / (in * (in * a + b) + d * f) - e / f;
93 }
94 
95 static float mobius(float in, float j, double peak)
96 {
97  float a, b;
98 
99  if (in <= j)
100  return in;
101 
102  a = -j * j * (peak - 1.0f) / (j * j - 2.0f * j + peak);
103  b = (j * j - 2.0f * j * peak + peak) / FFMAX(peak - 1.0f, 1e-6);
104 
105  return (b * b + 2.0f * b * j + j * j) / (b - a) * (in + a) / (in + b);
106 }
107 
108 #define MIX(x,y,a) (x) * (1 - (a)) + (y) * (a)
109 static void tonemap(TonemapContext *s, AVFrame *out, const AVFrame *in,
110  const AVPixFmtDescriptor *desc, int x, int y, double peak)
111 {
112  int map[3] = { desc->comp[0].plane, desc->comp[1].plane, desc->comp[2].plane };
113  const float *r_in = (const float *)(in->data[map[0]] + x * desc->comp[map[0]].step + y * in->linesize[map[0]]);
114  const float *g_in = (const float *)(in->data[map[1]] + x * desc->comp[map[1]].step + y * in->linesize[map[1]]);
115  const float *b_in = (const float *)(in->data[map[2]] + x * desc->comp[map[2]].step + y * in->linesize[map[2]]);
116  float *r_out = (float *)(out->data[map[0]] + x * desc->comp[map[0]].step + y * out->linesize[map[0]]);
117  float *g_out = (float *)(out->data[map[1]] + x * desc->comp[map[1]].step + y * out->linesize[map[1]]);
118  float *b_out = (float *)(out->data[map[2]] + x * desc->comp[map[2]].step + y * out->linesize[map[2]]);
119  float sig, sig_orig;
120 
121  /* load values */
122  *r_out = *r_in;
123  *g_out = *g_in;
124  *b_out = *b_in;
125 
126  /* desaturate to prevent unnatural colors */
127  if (s->desat > 0) {
128  float luma = av_q2d(s->coeffs->cr) * *r_in + av_q2d(s->coeffs->cg) * *g_in + av_q2d(s->coeffs->cb) * *b_in;
129  float overbright = FFMAX(luma - s->desat, 1e-6) / FFMAX(luma, 1e-6);
130  *r_out = MIX(*r_in, luma, overbright);
131  *g_out = MIX(*g_in, luma, overbright);
132  *b_out = MIX(*b_in, luma, overbright);
133  }
134 
135  /* pick the brightest component, reducing the value range as necessary
136  * to keep the entire signal in range and preventing discoloration due to
137  * out-of-bounds clipping */
138  sig = FFMAX(FFMAX3(*r_out, *g_out, *b_out), 1e-6);
139  sig_orig = sig;
140 
141  switch(s->tonemap) {
142  default:
143  case TONEMAP_NONE:
144  // do nothing
145  break;
146  case TONEMAP_LINEAR:
147  sig = sig * s->param / peak;
148  break;
149  case TONEMAP_GAMMA:
150  sig = sig > 0.05f ? pow(sig / peak, 1.0f / s->param)
151  : sig * pow(0.05f / peak, 1.0f / s->param) / 0.05f;
152  break;
153  case TONEMAP_CLIP:
154  sig = av_clipf(sig * s->param, 0, 1.0f);
155  break;
156  case TONEMAP_HABLE:
157  sig = hable(sig) / hable(peak);
158  break;
159  case TONEMAP_REINHARD:
160  sig = sig / (sig + s->param) * (peak + s->param) / peak;
161  break;
162  case TONEMAP_MOBIUS:
163  sig = mobius(sig, s->param, peak);
164  break;
165  }
166 
167  /* apply the computed scale factor to the color,
168  * linearly to prevent discoloration */
169  *r_out *= sig / sig_orig;
170  *g_out *= sig / sig_orig;
171  *b_out *= sig / sig_orig;
172 }
173 
174 typedef struct ThreadData {
175  AVFrame *in, *out;
177  double peak;
178 } ThreadData;
179 
180 static int tonemap_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
181 {
182  TonemapContext *s = ctx->priv;
183  ThreadData *td = arg;
184  AVFrame *in = td->in;
185  AVFrame *out = td->out;
186  const AVPixFmtDescriptor *desc = td->desc;
187  const int slice_start = (in->height * jobnr) / nb_jobs;
188  const int slice_end = (in->height * (jobnr+1)) / nb_jobs;
189  double peak = td->peak;
190 
191  for (int y = slice_start; y < slice_end; y++)
192  for (int x = 0; x < out->width; x++)
193  tonemap(s, out, in, desc, x, y, peak);
194 
195  return 0;
196 }
197 
199 {
200  AVFilterContext *ctx = link->dst;
201  TonemapContext *s = ctx->priv;
202  AVFilterLink *outlink = ctx->outputs[0];
203  ThreadData td;
204  AVFrame *out;
206  const AVPixFmtDescriptor *odesc = av_pix_fmt_desc_get(outlink->format);
207  int ret, x, y;
208  double peak = s->peak;
209 
210  if (!desc || !odesc) {
211  av_frame_free(&in);
212  return AVERROR_BUG;
213  }
214 
215  out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
216  if (!out) {
217  av_frame_free(&in);
218  return AVERROR(ENOMEM);
219  }
220 
221  ret = av_frame_copy_props(out, in);
222  if (ret < 0) {
223  av_frame_free(&in);
224  av_frame_free(&out);
225  return ret;
226  }
227 
228  /* input and output transfer will be linear */
229  if (in->color_trc == AVCOL_TRC_UNSPECIFIED) {
230  av_log(s, AV_LOG_WARNING, "Untagged transfer, assuming linear light\n");
231  out->color_trc = AVCOL_TRC_LINEAR;
232  } else if (in->color_trc != AVCOL_TRC_LINEAR)
233  av_log(s, AV_LOG_WARNING, "Tonemapping works on linear light only\n");
234 
235  /* read peak from side data if not passed in */
236  if (!peak) {
237  peak = ff_determine_signal_peak(in);
238  av_log(s, AV_LOG_DEBUG, "Computed signal peak: %f\n", peak);
239  }
240 
241  /* load original color space even if pixel format is RGB to compute overbrights */
243  if (s->desat > 0 && (in->colorspace == AVCOL_SPC_UNSPECIFIED || !s->coeffs)) {
245  av_log(s, AV_LOG_WARNING, "Missing color space information, ");
246  else if (!s->coeffs)
247  av_log(s, AV_LOG_WARNING, "Unsupported color space '%s', ",
249  av_log(s, AV_LOG_WARNING, "desaturation is disabled\n");
250  s->desat = 0;
251  }
252 
253  /* do the tone map */
254  td.out = out;
255  td.in = in;
256  td.desc = desc;
257  td.peak = peak;
260 
261  /* copy/generate alpha if needed */
262  if (desc->flags & AV_PIX_FMT_FLAG_ALPHA && odesc->flags & AV_PIX_FMT_FLAG_ALPHA) {
263  av_image_copy_plane(out->data[3], out->linesize[3],
264  in->data[3], in->linesize[3],
265  out->linesize[3], outlink->h);
266  } else if (odesc->flags & AV_PIX_FMT_FLAG_ALPHA) {
267  for (y = 0; y < out->height; y++) {
268  for (x = 0; x < out->width; x++) {
269  AV_WN32(out->data[3] + x * odesc->comp[3].step + y * out->linesize[3],
270  av_float2int(1.0f));
271  }
272  }
273  }
274 
275  av_frame_free(&in);
276 
278 
279  return ff_filter_frame(outlink, out);
280 }
281 
282 #define OFFSET(x) offsetof(TonemapContext, x)
283 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
284 static const AVOption tonemap_options[] = {
285  { "tonemap", "tonemap algorithm selection", OFFSET(tonemap), AV_OPT_TYPE_INT, {.i64 = TONEMAP_NONE}, TONEMAP_NONE, TONEMAP_MAX - 1, FLAGS, .unit = "tonemap" },
286  { "none", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_NONE}, 0, 0, FLAGS, .unit = "tonemap" },
287  { "linear", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_LINEAR}, 0, 0, FLAGS, .unit = "tonemap" },
288  { "gamma", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_GAMMA}, 0, 0, FLAGS, .unit = "tonemap" },
289  { "clip", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_CLIP}, 0, 0, FLAGS, .unit = "tonemap" },
290  { "reinhard", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_REINHARD}, 0, 0, FLAGS, .unit = "tonemap" },
291  { "hable", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_HABLE}, 0, 0, FLAGS, .unit = "tonemap" },
292  { "mobius", 0, 0, AV_OPT_TYPE_CONST, {.i64 = TONEMAP_MOBIUS}, 0, 0, FLAGS, .unit = "tonemap" },
293  { "param", "tonemap parameter", OFFSET(param), AV_OPT_TYPE_DOUBLE, {.dbl = NAN}, DBL_MIN, DBL_MAX, FLAGS },
294  { "desat", "desaturation strength", OFFSET(desat), AV_OPT_TYPE_DOUBLE, {.dbl = 2}, 0, DBL_MAX, FLAGS },
295  { "peak", "signal peak override", OFFSET(peak), AV_OPT_TYPE_DOUBLE, {.dbl = 0}, 0, DBL_MAX, FLAGS },
296  { NULL }
297 };
298 
300 
301 static const AVFilterPad tonemap_inputs[] = {
302  {
303  .name = "default",
304  .type = AVMEDIA_TYPE_VIDEO,
305  .filter_frame = filter_frame,
306  },
307 };
308 
310  .p.name = "tonemap",
311  .p.description = NULL_IF_CONFIG_SMALL("Conversion to/from different dynamic ranges."),
312  .p.priv_class = &tonemap_class,
313  .p.flags = AVFILTER_FLAG_SLICE_THREADS,
314  .init = init,
315  .priv_size = sizeof(TonemapContext),
319 };
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:116
AVFrame::color_trc
enum AVColorTransferCharacteristic color_trc
Definition: frame.h:701
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:215
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
ff_vf_tonemap
const FFFilter ff_vf_tonemap
Definition: vf_tonemap.c:309
out
FILE * out
Definition: movenc.c:55
TONEMAP_GAMMA
@ TONEMAP_GAMMA
Definition: vf_tonemap.c:45
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1078
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3341
AVCOL_TRC_LINEAR
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
Definition: pixfmt.h:653
hable
static float hable(float in)
Definition: vf_tonemap.c:89
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:70
AVFrame::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: frame.h:708
FILTER_INPUTS
#define FILTER_INPUTS(array)
Definition: filters.h:262
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
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:429
b
#define b
Definition: input.c:42
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:647
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:284
ff_determine_signal_peak
double ff_determine_signal_peak(AVFrame *in)
Definition: colorspace.c:153
ThreadData::desc
const AVPixFmtDescriptor * desc
Definition: vf_tonemap.c:176
float.h
FLAGS
#define FLAGS
Definition: vf_tonemap.c:283
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:177
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
tonemap_inputs
static const AVFilterPad tonemap_inputs[]
Definition: vf_tonemap.c:301
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:203
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:526
intfloat.h
video.h
ThreadData::in
AVFrame * in
Definition: af_adecorrelate.c:155
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:431
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
slice_end
static int slice_end(AVCodecContext *avctx, AVFrame *pict, int *got_output)
Handle slice ends.
Definition: mpeg12dec.c:1720
av_color_space_name
const char * av_color_space_name(enum AVColorSpace space)
Definition: pixdesc.c:3717
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:109
TonemapContext::desat
double desat
Definition: vf_tonemap.c:58
AVFilterPad
A filter pad used for either input or output.
Definition: filters.h:38
av_cold
#define av_cold
Definition: attributes.h:90
ff_video_default_filterpad
const AVFilterPad ff_video_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_VIDEO.
Definition: video.c:37
FFFilter
Definition: filters.h:265
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_OPT_TYPE_DOUBLE
@ AV_OPT_TYPE_DOUBLE
Underlying C type is double.
Definition: opt.h:267
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:180
filters.h
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
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:49
TonemapContext::peak
double peak
Definition: vf_tonemap.c:59
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: filters.h:263
NAN
#define NAN
Definition: mathematics.h:115
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:64
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
MIX
#define MIX(x, y, a)
Definition: vf_tonemap.c:108
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:633
isnan
#define isnan(x)
Definition: libm.h:342
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:42
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:94
AV_WN32
#define AV_WN32(p, v)
Definition: intreadwrite.h:372
AV_PIX_FMT_GBRPF32
#define AV_PIX_FMT_GBRPF32
Definition: pixfmt.h:561
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:497
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
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:857
ThreadData
Used for passing data between threads.
Definition: dsddec.c:71
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AVFilterPad::name
const char * name
Pad name.
Definition: filters.h:44
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:676
FILTER_PIXFMTS
#define FILTER_PIXFMTS(...)
Definition: filters.h:248
TONEMAP_CLIP
@ TONEMAP_CLIP
Definition: vf_tonemap.c:46
slice_start
static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, const CodedBitstreamUnit *unit, const int is_first_slice)
Definition: dec.c:734
TonemapContext
Definition: vf_tonemap.c:53
ret
ret
Definition: filter_design.txt:187
mobius
static float mobius(float in, float j, double peak)
Definition: vf_tonemap.c:95
TONEMAP_HABLE
@ TONEMAP_HABLE
Definition: vf_tonemap.c:48
TonemapContext::param
double param
Definition: vf_tonemap.c:57
AVFrame::height
int height
Definition: frame.h:482
ff_filter_execute
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition: avfilter.c:1683
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
avfilter.h
AV_PIX_FMT_GBRAPF32
#define AV_PIX_FMT_GBRAPF32
Definition: pixfmt.h:562
AVPixFmtDescriptor::comp
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:105
TONEMAP_MAX
@ TONEMAP_MAX
Definition: vf_tonemap.c:50
AVFilterContext
An instance of a filter.
Definition: avfilter.h:257
OFFSET
#define OFFSET(x)
Definition: vf_tonemap.c:282
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:150
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
FFFilter::p
AVFilter p
The public AVFilter.
Definition: filters.h:269
TONEMAP_NONE
@ TONEMAP_NONE
Definition: vf_tonemap.c:43
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
TonemapContext::tonemap
enum TonemapAlgorithm tonemap
Definition: vf_tonemap.c:56
FFMAX3
#define FFMAX3(a, b, c)
Definition: macros.h:48
imgutils.h
TonemapContext::coeffs
const AVLumaCoefficients * coeffs
Definition: vf_tonemap.c:61
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:455
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:198
TONEMAP_MOBIUS
@ TONEMAP_MOBIUS
Definition: vf_tonemap.c:49
TONEMAP_LINEAR
@ TONEMAP_LINEAR
Definition: vf_tonemap.c:44
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
TONEMAP_REINHARD
@ TONEMAP_REINHARD
Definition: vf_tonemap.c:47