FFmpeg
vf_fade.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010 Brandon Mintern
3  * Copyright (c) 2007 Bobby Bingham
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * video fade filter
25  * based heavily on vf_negate.c by Bobby Bingham
26  */
27 
28 #include "libavutil/avassert.h"
29 #include "libavutil/avstring.h"
30 #include "libavutil/common.h"
31 #include "libavutil/eval.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/pixdesc.h"
34 #include "avfilter.h"
35 #include "drawutils.h"
36 #include "filters.h"
37 #include "formats.h"
38 #include "video.h"
39 
40 #define R 0
41 #define G 1
42 #define B 2
43 #define A 3
44 
45 #define Y 0
46 #define U 1
47 #define V 2
48 
49 #define FADE_IN 0
50 #define FADE_OUT 1
51 
52 typedef struct FadeContext {
53  const AVClass *class;
54  int type;
57  int hsub, vsub, bpp, depth;
59  uint8_t is_rgb;
60  uint8_t is_packed_rgb;
61  uint8_t rgba_map[4];
62  int alpha;
63  int is_planar;
64  uint64_t start_time, duration;
67  uint8_t color_rgba[4]; ///< fade color
68  int black_fade; ///< if color_rgba is black
69  int (*filter_slice_luma)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
70  int (*filter_slice_chroma)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
71  int (*filter_slice_alpha)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
72 } FadeContext;
73 
75 {
76  FadeContext *s = ctx->priv;
77 
78  s->fade_per_frame = (1 << 16) / s->nb_frames;
79  s->fade_state = VF_FADE_WAITING;
80 
81  if (s->duration != 0) {
82  // If duration (seconds) is non-zero, assume that we are not fading based on frames
83  s->nb_frames = 0; // Mostly to clean up logging
84  }
85 
86  // Choose what to log. If both time-based and frame-based options, both lines will be in the log
87  if (s->start_frame || s->nb_frames) {
89  "type:%s start_frame:%d nb_frames:%d alpha:%d\n",
90  s->type == FADE_IN ? "in" : "out", s->start_frame,
91  s->nb_frames,s->alpha);
92  }
93  if (s->start_time || s->duration) {
95  "type:%s start_time:%f duration:%f alpha:%d\n",
96  s->type == FADE_IN ? "in" : "out", (s->start_time / (double)AV_TIME_BASE),
97  (s->duration / (double)AV_TIME_BASE),s->alpha);
98  }
99 
100  s->black_fade = !memcmp(s->color_rgba, "\x00\x00\x00\xff", 4);
101  return 0;
102 }
103 
105  AVFilterFormatsConfig **cfg_in,
106  AVFilterFormatsConfig **cfg_out)
107 {
108  const FadeContext *s = ctx->priv;
109  static const enum AVPixelFormat pix_fmts[] = {
129  };
130  static const enum AVPixelFormat pix_fmts_rgb[] = {
136  };
137  static const enum AVPixelFormat pix_fmts_alpha[] = {
147  };
148  static const enum AVPixelFormat pix_fmts_rgba[] = {
153  };
154  const enum AVPixelFormat *pixel_fmts;
155 
156  if (s->alpha) {
157  if (s->black_fade)
158  pixel_fmts = pix_fmts_alpha;
159  else
160  pixel_fmts = pix_fmts_rgba;
161  } else {
162  if (s->black_fade)
164  else
166  }
167  return ff_set_common_formats_from_list2(ctx, cfg_in, cfg_out, pixel_fmts);
168 }
169 
170 const static enum AVPixelFormat studio_level_pix_fmts[] = {
184 };
185 
187  int slice_start, int slice_end,
188  int do_alpha, int step)
189 {
190  int i, j;
191  const uint8_t r_idx = s->rgba_map[R];
192  const uint8_t g_idx = s->rgba_map[G];
193  const uint8_t b_idx = s->rgba_map[B];
194  const uint8_t a_idx = s->rgba_map[A];
195  const uint8_t *c = s->color_rgba;
196 
197  for (i = slice_start; i < slice_end; i++) {
198  uint8_t *p = frame->data[0] + i * frame->linesize[0];
199  for (j = 0; j < frame->width; j++) {
200 #define INTERP(c_name, c_idx) av_clip_uint8(((c[c_idx]<<16) + ((int)p[c_name] - (int)c[c_idx]) * s->factor + (1<<15)) >> 16)
201  p[r_idx] = INTERP(r_idx, 0);
202  p[g_idx] = INTERP(g_idx, 1);
203  p[b_idx] = INTERP(b_idx, 2);
204  if (do_alpha)
205  p[a_idx] = INTERP(a_idx, 3);
206  p += step;
207  }
208  }
209 }
210 
212  int slice_start, int slice_end,
213  int do_alpha)
214 {
215  int i, j;
216  const uint8_t *c = s->color_rgba;
217 
218  for (i = slice_start; i < slice_end; i++) {
219  uint8_t *pg = frame->data[0] + i * frame->linesize[0];
220  uint8_t *pb = frame->data[1] + i * frame->linesize[1];
221  uint8_t *pr = frame->data[2] + i * frame->linesize[2];
222  uint8_t *pa = frame->data[3] + i * frame->linesize[3];
223  for (j = 0; j < frame->width; j++) {
224 #define INTERPP(c_name, c_idx) av_clip_uint8(((c[c_idx]<<16) + ((int)c_name - (int)c[c_idx]) * s->factor + (1<<15)) >> 16)
225  pr[j] = INTERPP(pr[j], 0);
226  pg[j] = INTERPP(pg[j], 1);
227  pb[j] = INTERPP(pb[j], 2);
228  if (do_alpha)
229  pa[j] = INTERPP(pa[j], 3);
230  }
231  }
232 }
233 
234 static int filter_slice_rgb(AVFilterContext *ctx, void *arg, int jobnr,
235  int nb_jobs)
236 {
237  FadeContext *s = ctx->priv;
238  AVFrame *frame = arg;
239  int slice_start = (frame->height * jobnr ) / nb_jobs;
240  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
241 
242  if (s->is_planar && s->alpha)
244  else if (s->is_planar)
246  else if (s->alpha) filter_rgb(s, frame, slice_start, slice_end, 1, 4);
247  else if (s->bpp == 3) filter_rgb(s, frame, slice_start, slice_end, 0, 3);
248  else if (s->bpp == 4) filter_rgb(s, frame, slice_start, slice_end, 0, 4);
249  else av_assert0(0);
250 
251  return 0;
252 }
253 
254 static int filter_slice_luma(AVFilterContext *ctx, void *arg, int jobnr,
255  int nb_jobs)
256 {
257  FadeContext *s = ctx->priv;
258  AVFrame *frame = arg;
259  int slice_start = (frame->height * jobnr ) / nb_jobs;
260  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
261  int i, j;
262 
263  for (int k = 0; k < 1 + 2 * (s->is_planar && s->is_rgb); k++) {
264  for (i = slice_start; i < slice_end; i++) {
265  uint8_t *p = frame->data[k] + i * frame->linesize[k];
266  for (j = 0; j < frame->width * s->bpp; j++) {
267  /* s->factor is using 16 lower-order bits for decimal
268  * places. 32768 = 1 << 15, it is an integer representation
269  * of 0.5 and is for rounding. */
270  *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
271  p++;
272  }
273  }
274  }
275 
276  return 0;
277 }
278 
279 static int filter_slice_luma16(AVFilterContext *ctx, void *arg, int jobnr,
280  int nb_jobs)
281 {
282  FadeContext *s = ctx->priv;
283  AVFrame *frame = arg;
284  int slice_start = (frame->height * jobnr ) / nb_jobs;
285  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
286  int i, j;
287 
288  for (int k = 0; k < 1 + 2 * (s->is_planar && s->is_rgb); k++) {
289  for (i = slice_start; i < slice_end; i++) {
290  uint16_t *p = (uint16_t *)(frame->data[k] + i * frame->linesize[k]);
291  for (j = 0; j < frame->width * s->bpp; j++) {
292  /* s->factor is using 16 lower-order bits for decimal
293  * places. 32768 = 1 << 15, it is an integer representation
294  * of 0.5 and is for rounding. */
295  *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
296  p++;
297  }
298  }
299  }
300 
301  return 0;
302 }
303 
304 static int filter_slice_chroma(AVFilterContext *ctx, void *arg, int jobnr,
305  int nb_jobs)
306 {
307  FadeContext *s = ctx->priv;
308  AVFrame *frame = arg;
309  int i, j, plane;
310  const int width = AV_CEIL_RSHIFT(frame->width, s->hsub);
311  const int height= AV_CEIL_RSHIFT(frame->height, s->vsub);
312  int slice_start = (height * jobnr ) / nb_jobs;
313  int slice_end = FFMIN(((height * (jobnr+1)) / nb_jobs), frame->height);
314 
315  for (plane = 1; plane < 3; plane++) {
316  for (i = slice_start; i < slice_end; i++) {
317  uint8_t *p = frame->data[plane] + i * frame->linesize[plane];
318  for (j = 0; j < width; j++) {
319  /* 8421367 = ((128 << 1) + 1) << 15. It is an integer
320  * representation of 128.5. The .5 is for rounding
321  * purposes. */
322  *p = ((*p - 128) * s->factor + 8421367) >> 16;
323  p++;
324  }
325  }
326  }
327 
328  return 0;
329 }
330 
331 static int filter_slice_chroma16(AVFilterContext *ctx, void *arg, int jobnr,
332  int nb_jobs)
333 {
334  FadeContext *s = ctx->priv;
335  AVFrame *frame = arg;
336  int i, j, plane;
337  const int width = AV_CEIL_RSHIFT(frame->width, s->hsub);
338  const int height= AV_CEIL_RSHIFT(frame->height, s->vsub);
339  const int mid = 1 << (s->depth - 1);
340  const int add = ((mid << 1) + 1) << 15;
341  int slice_start = (height * jobnr ) / nb_jobs;
342  int slice_end = FFMIN(((height * (jobnr+1)) / nb_jobs), frame->height);
343 
344  for (plane = 1; plane < 3; plane++) {
345  for (i = slice_start; i < slice_end; i++) {
346  uint16_t *p = (uint16_t *)(frame->data[plane] + i * frame->linesize[plane]);
347  for (j = 0; j < width; j++) {
348  *p = ((*p - mid) * s->factor + add) >> 16;
349  p++;
350  }
351  }
352  }
353 
354  return 0;
355 }
356 
357 static int filter_slice_alpha(AVFilterContext *ctx, void *arg, int jobnr,
358  int nb_jobs)
359 {
360  FadeContext *s = ctx->priv;
361  AVFrame *frame = arg;
362  int plane = s->is_packed_rgb ? 0 : A;
363  int slice_start = (frame->height * jobnr ) / nb_jobs;
364  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
365  int i, j;
366 
367  for (i = slice_start; i < slice_end; i++) {
368  uint8_t *p = frame->data[plane] + i * frame->linesize[plane] + s->is_packed_rgb*s->rgba_map[A];
369  int step = s->is_packed_rgb ? 4 : 1;
370  for (j = 0; j < frame->width; j++) {
371  /* s->factor is using 16 lower-order bits for decimal
372  * places. 32768 = 1 << 15, it is an integer representation
373  * of 0.5 and is for rounding. */
374  *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
375  p += step;
376  }
377  }
378 
379  return 0;
380 }
381 
382 static int filter_slice_alpha16(AVFilterContext *ctx, void *arg, int jobnr,
383  int nb_jobs)
384 {
385  FadeContext *s = ctx->priv;
386  AVFrame *frame = arg;
387  int plane = s->is_packed_rgb ? 0 : A;
388  int slice_start = (frame->height * jobnr ) / nb_jobs;
389  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
390  int i, j;
391 
392  for (i = slice_start; i < slice_end; i++) {
393  uint16_t *p = (uint16_t *)(frame->data[plane] + i * frame->linesize[plane]) + s->is_packed_rgb*s->rgba_map[A];
394  int step = s->is_packed_rgb ? 4 : 1;
395  for (j = 0; j < frame->width; j++) {
396  /* s->factor is using 16 lower-order bits for decimal
397  * places. 32768 = 1 << 15, it is an integer representation
398  * of 0.5 and is for rounding. */
399  *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
400  p += step;
401  }
402  }
403 
404  return 0;
405 }
406 
408 {
409  FadeContext *s = inlink->dst->priv;
410  const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(inlink->format);
411 
412  s->hsub = pixdesc->log2_chroma_w;
413  s->vsub = pixdesc->log2_chroma_h;
414 
415  ff_fill_rgba_map(s->rgba_map, inlink->format);
416 
417  s->depth = pixdesc->comp[0].depth;
418  s->bpp = pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR ?
419  1 :
420  av_get_bits_per_pixel(pixdesc) >> 3;
421  s->alpha &= !!(pixdesc->flags & AV_PIX_FMT_FLAG_ALPHA);
422  s->is_planar = pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR;
423  s->is_rgb = pixdesc->flags & AV_PIX_FMT_FLAG_RGB;
424  s->is_packed_rgb = !s->is_planar && s->is_rgb;
425 
426  if (s->duration)
427  s->duration_pts = av_rescale_q(s->duration, AV_TIME_BASE_Q, inlink->time_base);
428  if (s->start_time)
429  s->start_time_pts = av_rescale_q(s->start_time, AV_TIME_BASE_Q, inlink->time_base);
430 
431  /* use CCIR601/709 black level for studio-level pixel non-alpha components */
432  s->black_level =
433  ff_fmt_is_in(inlink->format, studio_level_pix_fmts) && !s->alpha ? 16 * (1 << (s->depth - 8)): 0;
434  /* 32768 = 1 << 15, it is an integer representation
435  * of 0.5 and is for rounding. */
436  s->black_level_scaled = (s->black_level << 16) + 32768;
437 
438  s->filter_slice_luma = s->depth <= 8 ? filter_slice_luma : filter_slice_luma16;
439  s->filter_slice_chroma = s->depth <= 8 ? filter_slice_chroma : filter_slice_chroma16;
440  s->filter_slice_alpha = s->depth <= 8 ? filter_slice_alpha : filter_slice_alpha16;
441 
442  return 0;
443 }
444 
446 {
448  AVFilterContext *ctx = inlink->dst;
449  FadeContext *s = ctx->priv;
450 
451  // Calculate Fade assuming this is a Fade In
452  if (s->fade_state == VF_FADE_WAITING) {
453  s->factor=0;
454  if (frame->pts >= s->start_time_pts
455  && inl->frame_count_out >= s->start_frame) {
456  // Time to start fading
457  s->fade_state = VF_FADE_FADING;
458 
459  // Save start time in case we are starting based on frames and fading based on time
460  if (s->start_time_pts == 0 && s->start_frame != 0) {
461  s->start_time_pts = frame->pts;
462  }
463 
464  // Save start frame in case we are starting based on time and fading based on frames
465  if (s->start_time_pts != 0 && s->start_frame == 0) {
466  s->start_frame = inl->frame_count_out;
467  }
468  }
469  }
470  if (s->fade_state == VF_FADE_FADING) {
471  if (s->duration_pts == 0) {
472  // Fading based on frame count
473  s->factor = (inl->frame_count_out - s->start_frame) * s->fade_per_frame;
474  if (inl->frame_count_out > s->start_frame + s->nb_frames) {
475  s->fade_state = VF_FADE_DONE;
476  }
477 
478  } else {
479  // Fading based on duration
480  s->factor = (frame->pts - s->start_time_pts) * UINT16_MAX / s->duration_pts;
481  if (frame->pts > s->start_time_pts + s->duration_pts) {
482  s->fade_state = VF_FADE_DONE;
483  }
484  }
485  }
486  if (s->fade_state == VF_FADE_DONE) {
487  s->factor=UINT16_MAX;
488  }
489 
490  s->factor = av_clip_uint16(s->factor);
491 
492  // Invert fade_factor if Fading Out
493  if (s->type == FADE_OUT) {
494  s->factor=UINT16_MAX-s->factor;
495  }
496 
497  if (s->factor < UINT16_MAX) {
498  if (s->alpha) {
499  ff_filter_execute(ctx, s->filter_slice_alpha, frame, NULL,
501  } else if (s->is_rgb && !s->black_fade) {
504  } else {
505  /* luma, or rgb plane in case of black */
506  ff_filter_execute(ctx, s->filter_slice_luma, frame, NULL,
508 
509  if (frame->data[1] && frame->data[2] && !s->is_rgb) {
510  /* chroma planes */
511  ff_filter_execute(ctx, s->filter_slice_chroma, frame, NULL,
513  }
514  }
515  }
516 
517  return ff_filter_frame(inlink->dst->outputs[0], frame);
518 }
519 
520 
521 #define OFFSET(x) offsetof(FadeContext, x)
522 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
523 
524 static const AVOption fade_options[] = {
525  { "type", "set the fade direction", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, .unit = "type" },
526  { "t", "set the fade direction", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, .unit = "type" },
527  { "in", "fade-in", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_IN }, .flags = FLAGS, .unit = "type" },
528  { "out", "fade-out", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_OUT }, .flags = FLAGS, .unit = "type" },
529  { "start_frame", "Number of the first frame to which to apply the effect.",
530  OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
531  { "s", "Number of the first frame to which to apply the effect.",
532  OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
533  { "nb_frames", "Number of frames to which the effect should be applied.",
534  OFFSET(nb_frames), AV_OPT_TYPE_INT, { .i64 = 25 }, 1, INT_MAX, FLAGS },
535  { "n", "Number of frames to which the effect should be applied.",
536  OFFSET(nb_frames), AV_OPT_TYPE_INT, { .i64 = 25 }, 1, INT_MAX, FLAGS },
537  { "alpha", "fade alpha if it is available on the input", OFFSET(alpha), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, FLAGS },
538  { "start_time", "Number of seconds of the beginning of the effect.",
539  OFFSET(start_time), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
540  { "st", "Number of seconds of the beginning of the effect.",
541  OFFSET(start_time), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
542  { "duration", "Duration of the effect in seconds.",
543  OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
544  { "d", "Duration of the effect in seconds.",
545  OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
546  { "color", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGS },
547  { "c", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGS },
548  { NULL }
549 };
550 
552 
554  {
555  .name = "default",
556  .type = AVMEDIA_TYPE_VIDEO,
558  .config_props = config_input,
559  .filter_frame = filter_frame,
560  },
561 };
562 
564  .name = "fade",
565  .description = NULL_IF_CONFIG_SMALL("Fade in/out input video."),
566  .init = init,
567  .priv_size = sizeof(FadeContext),
568  .priv_class = &fade_class,
572  .flags = AVFILTER_FLAG_SLICE_THREADS |
574 };
AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_YUVA422P16
Definition: pixfmt.h:546
FadeContext::vsub
int vsub
Definition: vf_fade.c:57
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
pix_fmts_rgb
static enum AVPixelFormat pix_fmts_rgb[3]
Definition: av1_parser.c:49
opt.h
filter_slice_rgb
static int filter_slice_rgb(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:234
filter_slice_alpha16
static int filter_slice_alpha16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:382
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1061
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3170
init
static av_cold int init(AVFilterContext *ctx)
Definition: vf_fade.c:74
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:264
FadeContext::filter_slice_luma
int(* filter_slice_luma)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:69
inlink
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
Definition: filter_design.txt:212
FadeContext::VF_FADE_DONE
@ VF_FADE_DONE
Definition: vf_fade.c:66
AV_PIX_FMT_YUVA422P9
#define AV_PIX_FMT_YUVA422P9
Definition: pixfmt.h:538
FILTER_INPUTS
#define FILTER_INPUTS(array)
Definition: filters.h:262
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:389
pixdesc.h
step
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
Definition: rate_distortion.txt:58
AV_PIX_FMT_YUVA420P16
#define AV_PIX_FMT_YUVA420P16
Definition: pixfmt.h:545
AVComponentDescriptor::depth
int depth
Number of bits in the component.
Definition: pixdesc.h:57
AV_PIX_FMT_YUVA420P10
#define AV_PIX_FMT_YUVA420P10
Definition: pixfmt.h:540
studio_level_pix_fmts
const static enum AVPixelFormat studio_level_pix_fmts[]
Definition: vf_fade.c:170
AVOption
AVOption.
Definition: opt.h:429
AV_OPT_TYPE_DURATION
@ AV_OPT_TYPE_DURATION
Underlying C type is int64_t.
Definition: opt.h:319
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:502
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:225
FadeContext::start_frame
int start_frame
Definition: vf_fade.c:56
pixel_fmts
static enum AVPixelFormat pixel_fmts[]
Definition: vf_amplify.c:52
AV_PIX_FMT_BGR24
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:76
AV_PIX_FMT_BGRA
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition: pixfmt.h:102
av_get_bits_per_pixel
int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
Return the number of bits per pixel used by the pixel format described by pixdesc.
Definition: pixdesc.c:3122
AV_PIX_FMT_YUV440P
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:106
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:205
filter_slice_alpha
static int filter_slice_alpha(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:357
video.h
AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_YUVA422P10
Definition: pixfmt.h:541
formats.h
AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_YUVA420P9
Definition: pixfmt.h:537
slice_end
static int slice_end(AVCodecContext *avctx, AVFrame *pict, int *got_output)
Handle slice ends.
Definition: mpeg12dec.c:1720
AV_PIX_FMT_GBRAP
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition: pixfmt.h:212
filter_slice_luma16
static int filter_slice_luma16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:279
AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA444P16
Definition: pixfmt.h:547
AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_YUV422P9
Definition: pixfmt.h:500
avfilter_vf_fade_inputs
static const AVFilterPad avfilter_vf_fade_inputs[]
Definition: vf_fade.c:553
FadeContext::black_level
unsigned int black_level
Definition: vf_fade.c:58
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
filter_slice_chroma
static int filter_slice_chroma(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:304
FadeContext::bpp
int bpp
Definition: vf_fade.c:57
A
#define A
Definition: vf_fade.c:43
AVFilterPad
A filter pad used for either input or output.
Definition: filters.h:38
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:505
FadeContext::VF_FADE_FADING
@ VF_FADE_FADING
Definition: vf_fade.c:66
avassert.h
av_cold
#define av_cold
Definition: attributes.h:90
fade_options
static const AVOption fade_options[]
Definition: vf_fade.c:524
AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_YUV422P16
Definition: pixfmt.h:514
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
duration
int64_t duration
Definition: movenc.c:65
AV_PIX_FMT_YUVJ422P
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
Definition: pixfmt.h:86
FadeContext::fade_per_frame
int fade_per_frame
Definition: vf_fade.c:55
ff_vf_fade
const AVFilter ff_vf_fade
Definition: vf_fade.c:563
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_PIX_FMT_YUVA420P
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition: pixfmt.h:108
FadeContext::nb_frames
int nb_frames
Definition: vf_fade.c:56
AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:515
FadeContext::start_time_pts
uint64_t start_time_pts
Definition: vf_fade.c:65
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:60
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
FadeContext::black_level_scaled
unsigned int black_level_scaled
Definition: vf_fade.c:58
filters.h
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:304
query_formats
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Definition: vf_fade.c:104
FadeContext::fade_state
enum FadeContext::@339 fade_state
AV_PIX_FMT_YUVA444P12
#define AV_PIX_FMT_YUVA444P12
Definition: pixfmt.h:544
AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUV420P9
Definition: pixfmt.h:499
AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV420P16
Definition: pixfmt.h:513
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
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
AVPixFmtDescriptor::log2_chroma_w
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:80
ff_fmt_is_in
int ff_fmt_is_in(int fmt, const int *fmts)
Tell if an integer is contained in the provided -1-terminated list of integers.
Definition: formats.c:406
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
FLAGS
#define FLAGS
Definition: vf_fade.c:522
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: filters.h:263
AV_PIX_FMT_RGBA
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition: pixfmt.h:100
AV_PIX_FMT_YUVJ444P
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
Definition: pixfmt.h:87
arg
const char * arg
Definition: jacosubdec.c:67
if
if(ret)
Definition: filter_design.txt:179
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
NULL
#define NULL
Definition: coverity.c:32
FadeContext::hsub
int hsub
Definition: vf_fade.c:57
AV_PIX_FMT_YUVJ420P
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Definition: pixfmt.h:85
AV_OPT_TYPE_COLOR
@ AV_OPT_TYPE_COLOR
Underlying C type is uint8_t[4].
Definition: opt.h:323
filter_slice_chroma16
static int filter_slice_chroma16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:331
FadeContext::duration
uint64_t duration
Definition: vf_fade.c:64
FadeContext::filter_slice_chroma
int(* filter_slice_chroma)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:70
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:503
AVPixFmtDescriptor::flags
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
Definition: pixdesc.h:94
AV_PIX_FMT_ABGR
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
Definition: pixfmt.h:101
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
AVFilterFormatsConfig
Lists of formats / etc.
Definition: avfilter.h:111
ff_filter_link
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition: filters.h:197
eval.h
AVFILTERPAD_FLAG_NEEDS_WRITABLE
#define AVFILTERPAD_FLAG_NEEDS_WRITABLE
The filter expects writable frames from its input link, duplicating data buffers if needed.
Definition: filters.h:57
config_input
static int config_input(AVFilterLink *inlink)
Definition: vf_fade.c:407
AV_PIX_FMT_RGB24
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:75
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
FadeContext::is_planar
int is_planar
Definition: vf_fade.c:63
height
#define height
Definition: dsp.h:85
AV_PIX_FMT_FLAG_RGB
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
Definition: pixdesc.h:136
FadeContext::duration_pts
uint64_t duration_pts
Definition: vf_fade.c:65
start_time
static int64_t start_time
Definition: ffplay.c:326
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:507
FadeContext
Definition: vf_fade.c:52
FadeContext::VF_FADE_WAITING
@ VF_FADE_WAITING
Definition: vf_fade.c:66
filter_rgb
static av_always_inline void filter_rgb(FadeContext *s, const AVFrame *frame, int slice_start, int slice_end, int do_alpha, int step)
Definition: vf_fade.c:186
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:509
R
#define R
Definition: vf_fade.c:40
AV_PIX_FMT_YUVA444P
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition: pixfmt.h:174
AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA444P10
Definition: pixfmt.h:542
INTERP
#define INTERP(c_name, c_idx)
FadeContext::black_fade
int black_fade
if color_rgba is black
Definition: vf_fade.c:68
AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
Some filters support a generic "enable" expression option that can be used to enable or disable a fil...
Definition: avfilter.h:182
AV_PIX_FMT_ARGB
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
Definition: pixfmt.h:99
FadeContext::alpha
int alpha
Definition: vf_fade.c:62
filter_rgb_planar
static av_always_inline void filter_rgb_planar(FadeContext *s, const AVFrame *frame, int slice_start, int slice_end, int do_alpha)
Definition: vf_fade.c:211
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
OFFSET
#define OFFSET(x)
Definition: vf_fade.c:521
filter_slice_luma
static int filter_slice_luma(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:254
FadeContext::filter_slice_alpha
int(* filter_slice_alpha)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:71
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:254
common.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:840
FILTER_QUERY_FUNC2
#define FILTER_QUERY_FUNC2(func)
Definition: filters.h:239
av_always_inline
#define av_always_inline
Definition: attributes.h:49
FadeContext::type
int type
Definition: vf_fade.c:54
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AV_PIX_FMT_YUVJ440P
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
Definition: pixfmt.h:107
AVFilterPad::name
const char * name
Pad name.
Definition: filters.h:44
fade
static void fade(uint8_t *dst, ptrdiff_t dst_linesize, const uint8_t *src, ptrdiff_t src_linesize, int width, int height, int alpha, int beta)
Definition: vp8.c:507
AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV444P9
Definition: pixfmt.h:501
slice_start
static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, const CodedBitstreamUnit *unit, const int is_first_slice)
Definition: dec.c:736
AVFilter
Filter definition.
Definition: avfilter.h:201
FADE_IN
#define FADE_IN
Definition: vf_fade.c:49
FadeContext::is_rgb
uint8_t is_rgb
Definition: vf_fade.c:59
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_YUVA444P9
Definition: pixfmt.h:539
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:506
AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_YUV422P14
Definition: pixfmt.h:511
ff_set_common_formats_from_list2
int ff_set_common_formats_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const int *fmts)
Definition: formats.c:1016
FADE_OUT
#define FADE_OUT
Definition: vf_fade.c:50
ff_filter_execute
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition: avfilter.c:1666
G
#define G
Definition: vf_fade.c:41
AVFILTER_DEFINE_CLASS
AVFILTER_DEFINE_CLASS(fade)
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_PIX_FMT_YUVA422P12
#define AV_PIX_FMT_YUVA422P12
Definition: pixfmt.h:543
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
avfilter.h
AVPixFmtDescriptor::comp
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:105
AV_PIX_FMT_FLAG_PLANAR
#define AV_PIX_FMT_FLAG_PLANAR
At least one pixel component is not in the first data plane.
Definition: pixdesc.h:132
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:78
FadeContext::color_rgba
uint8_t color_rgba[4]
fade color
Definition: vf_fade.c:67
AVFilterContext
An instance of a filter.
Definition: avfilter.h:457
av_clip_uint16
#define av_clip_uint16
Definition: common.h:112
AV_PIX_FMT_GBRP
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:165
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:152
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:77
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
FadeContext::is_packed_rgb
uint8_t is_packed_rgb
Definition: vf_fade.c:60
alpha
static const int16_t alpha[]
Definition: ilbcdata.h:55
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
INTERPP
#define INTERPP(c_name, c_idx)
AV_PIX_FMT_YUV411P
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:80
ff_fill_rgba_map
int ff_fill_rgba_map(uint8_t *rgba_map, enum AVPixelFormat pix_fmt)
Definition: drawutils.c:79
AV_PIX_FMT_YUV410P
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:79
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
FadeContext::depth
int depth
Definition: vf_fade.c:57
FadeContext::start_time
uint64_t start_time
Definition: vf_fade.c:64
FadeContext::rgba_map
uint8_t rgba_map[4]
Definition: vf_fade.c:61
AV_PIX_FMT_YUV440P12
#define AV_PIX_FMT_YUV440P12
Definition: pixfmt.h:508
AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUV444P14
Definition: pixfmt.h:512
FadeContext::factor
int factor
Definition: vf_fade.c:55
avstring.h
width
#define width
Definition: dsp.h:85
drawutils.h
B
#define B
Definition: vf_fade.c:42
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
filter_frame
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
Definition: vf_fade.c:445
AVPixFmtDescriptor::log2_chroma_h
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:89
AV_PIX_FMT_YUVA422P
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
Definition: pixfmt.h:173
AV_PIX_FMT_YUV420P14
#define AV_PIX_FMT_YUV420P14
Definition: pixfmt.h:510