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 "formats.h"
37 #include "internal.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 {
106  const FadeContext *s = ctx->priv;
107  static const enum AVPixelFormat pix_fmts[] = {
127  };
128  static const enum AVPixelFormat pix_fmts_rgb[] = {
134  };
135  static const enum AVPixelFormat pix_fmts_alpha[] = {
145  };
146  static const enum AVPixelFormat pix_fmts_rgba[] = {
151  };
152  const enum AVPixelFormat *pixel_fmts;
153 
154  if (s->alpha) {
155  if (s->black_fade)
156  pixel_fmts = pix_fmts_alpha;
157  else
158  pixel_fmts = pix_fmts_rgba;
159  } else {
160  if (s->black_fade)
162  else
164  }
166 }
167 
168 const static enum AVPixelFormat studio_level_pix_fmts[] = {
182 };
183 
185  int slice_start, int slice_end,
186  int do_alpha, int step)
187 {
188  int i, j;
189  const uint8_t r_idx = s->rgba_map[R];
190  const uint8_t g_idx = s->rgba_map[G];
191  const uint8_t b_idx = s->rgba_map[B];
192  const uint8_t a_idx = s->rgba_map[A];
193  const uint8_t *c = s->color_rgba;
194 
195  for (i = slice_start; i < slice_end; i++) {
196  uint8_t *p = frame->data[0] + i * frame->linesize[0];
197  for (j = 0; j < frame->width; j++) {
198 #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)
199  p[r_idx] = INTERP(r_idx, 0);
200  p[g_idx] = INTERP(g_idx, 1);
201  p[b_idx] = INTERP(b_idx, 2);
202  if (do_alpha)
203  p[a_idx] = INTERP(a_idx, 3);
204  p += step;
205  }
206  }
207 }
208 
210  int slice_start, int slice_end,
211  int do_alpha)
212 {
213  int i, j;
214  const uint8_t *c = s->color_rgba;
215 
216  for (i = slice_start; i < slice_end; i++) {
217  uint8_t *pg = frame->data[0] + i * frame->linesize[0];
218  uint8_t *pb = frame->data[1] + i * frame->linesize[1];
219  uint8_t *pr = frame->data[2] + i * frame->linesize[2];
220  uint8_t *pa = frame->data[3] + i * frame->linesize[3];
221  for (j = 0; j < frame->width; j++) {
222 #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)
223  pr[j] = INTERPP(pr[j], 0);
224  pg[j] = INTERPP(pg[j], 1);
225  pb[j] = INTERPP(pb[j], 2);
226  if (do_alpha)
227  pa[j] = INTERPP(pa[j], 3);
228  }
229  }
230 }
231 
232 static int filter_slice_rgb(AVFilterContext *ctx, void *arg, int jobnr,
233  int nb_jobs)
234 {
235  FadeContext *s = ctx->priv;
236  AVFrame *frame = arg;
237  int slice_start = (frame->height * jobnr ) / nb_jobs;
238  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
239 
240  if (s->is_planar && s->alpha)
241  filter_rgb_planar(s, frame, slice_start, slice_end, 1);
242  else if (s->is_planar)
243  filter_rgb_planar(s, frame, slice_start, slice_end, 0);
244  else if (s->alpha) filter_rgb(s, frame, slice_start, slice_end, 1, 4);
245  else if (s->bpp == 3) filter_rgb(s, frame, slice_start, slice_end, 0, 3);
246  else if (s->bpp == 4) filter_rgb(s, frame, slice_start, slice_end, 0, 4);
247  else av_assert0(0);
248 
249  return 0;
250 }
251 
252 static int filter_slice_luma(AVFilterContext *ctx, void *arg, int jobnr,
253  int nb_jobs)
254 {
255  FadeContext *s = ctx->priv;
256  AVFrame *frame = arg;
257  int slice_start = (frame->height * jobnr ) / nb_jobs;
258  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
259  int i, j;
260 
261  for (int k = 0; k < 1 + 2 * (s->is_planar && s->is_rgb); k++) {
262  for (i = slice_start; i < slice_end; i++) {
263  uint8_t *p = frame->data[k] + i * frame->linesize[k];
264  for (j = 0; j < frame->width * s->bpp; j++) {
265  /* s->factor is using 16 lower-order bits for decimal
266  * places. 32768 = 1 << 15, it is an integer representation
267  * of 0.5 and is for rounding. */
268  *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
269  p++;
270  }
271  }
272  }
273 
274  return 0;
275 }
276 
277 static int filter_slice_luma16(AVFilterContext *ctx, void *arg, int jobnr,
278  int nb_jobs)
279 {
280  FadeContext *s = ctx->priv;
281  AVFrame *frame = arg;
282  int slice_start = (frame->height * jobnr ) / nb_jobs;
283  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
284  int i, j;
285 
286  for (int k = 0; k < 1 + 2 * (s->is_planar && s->is_rgb); k++) {
287  for (i = slice_start; i < slice_end; i++) {
288  uint16_t *p = (uint16_t *)(frame->data[k] + i * frame->linesize[k]);
289  for (j = 0; j < frame->width * s->bpp; j++) {
290  /* s->factor is using 16 lower-order bits for decimal
291  * places. 32768 = 1 << 15, it is an integer representation
292  * of 0.5 and is for rounding. */
293  *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
294  p++;
295  }
296  }
297  }
298 
299  return 0;
300 }
301 
302 static int filter_slice_chroma(AVFilterContext *ctx, void *arg, int jobnr,
303  int nb_jobs)
304 {
305  FadeContext *s = ctx->priv;
306  AVFrame *frame = arg;
307  int i, j, plane;
308  const int width = AV_CEIL_RSHIFT(frame->width, s->hsub);
309  const int height= AV_CEIL_RSHIFT(frame->height, s->vsub);
310  int slice_start = (height * jobnr ) / nb_jobs;
311  int slice_end = FFMIN(((height * (jobnr+1)) / nb_jobs), frame->height);
312 
313  for (plane = 1; plane < 3; plane++) {
314  for (i = slice_start; i < slice_end; i++) {
315  uint8_t *p = frame->data[plane] + i * frame->linesize[plane];
316  for (j = 0; j < width; j++) {
317  /* 8421367 = ((128 << 1) + 1) << 15. It is an integer
318  * representation of 128.5. The .5 is for rounding
319  * purposes. */
320  *p = ((*p - 128) * s->factor + 8421367) >> 16;
321  p++;
322  }
323  }
324  }
325 
326  return 0;
327 }
328 
329 static int filter_slice_chroma16(AVFilterContext *ctx, void *arg, int jobnr,
330  int nb_jobs)
331 {
332  FadeContext *s = ctx->priv;
333  AVFrame *frame = arg;
334  int i, j, plane;
335  const int width = AV_CEIL_RSHIFT(frame->width, s->hsub);
336  const int height= AV_CEIL_RSHIFT(frame->height, s->vsub);
337  const int mid = 1 << (s->depth - 1);
338  const int add = ((mid << 1) + 1) << 15;
339  int slice_start = (height * jobnr ) / nb_jobs;
340  int slice_end = FFMIN(((height * (jobnr+1)) / nb_jobs), frame->height);
341 
342  for (plane = 1; plane < 3; plane++) {
343  for (i = slice_start; i < slice_end; i++) {
344  uint16_t *p = (uint16_t *)(frame->data[plane] + i * frame->linesize[plane]);
345  for (j = 0; j < width; j++) {
346  *p = ((*p - mid) * s->factor + add) >> 16;
347  p++;
348  }
349  }
350  }
351 
352  return 0;
353 }
354 
355 static int filter_slice_alpha(AVFilterContext *ctx, void *arg, int jobnr,
356  int nb_jobs)
357 {
358  FadeContext *s = ctx->priv;
359  AVFrame *frame = arg;
360  int plane = s->is_packed_rgb ? 0 : A;
361  int slice_start = (frame->height * jobnr ) / nb_jobs;
362  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
363  int i, j;
364 
365  for (i = slice_start; i < slice_end; i++) {
366  uint8_t *p = frame->data[plane] + i * frame->linesize[plane] + s->is_packed_rgb*s->rgba_map[A];
367  int step = s->is_packed_rgb ? 4 : 1;
368  for (j = 0; j < frame->width; j++) {
369  /* s->factor is using 16 lower-order bits for decimal
370  * places. 32768 = 1 << 15, it is an integer representation
371  * of 0.5 and is for rounding. */
372  *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
373  p += step;
374  }
375  }
376 
377  return 0;
378 }
379 
380 static int filter_slice_alpha16(AVFilterContext *ctx, void *arg, int jobnr,
381  int nb_jobs)
382 {
383  FadeContext *s = ctx->priv;
384  AVFrame *frame = arg;
385  int plane = s->is_packed_rgb ? 0 : A;
386  int slice_start = (frame->height * jobnr ) / nb_jobs;
387  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
388  int i, j;
389 
390  for (i = slice_start; i < slice_end; i++) {
391  uint16_t *p = (uint16_t *)(frame->data[plane] + i * frame->linesize[plane]) + s->is_packed_rgb*s->rgba_map[A];
392  int step = s->is_packed_rgb ? 4 : 1;
393  for (j = 0; j < frame->width; j++) {
394  /* s->factor is using 16 lower-order bits for decimal
395  * places. 32768 = 1 << 15, it is an integer representation
396  * of 0.5 and is for rounding. */
397  *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
398  p += step;
399  }
400  }
401 
402  return 0;
403 }
404 
406 {
407  FadeContext *s = inlink->dst->priv;
408  const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(inlink->format);
409 
410  s->hsub = pixdesc->log2_chroma_w;
411  s->vsub = pixdesc->log2_chroma_h;
412 
413  ff_fill_rgba_map(s->rgba_map, inlink->format);
414 
415  s->depth = pixdesc->comp[0].depth;
416  s->bpp = pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR ?
417  1 :
418  av_get_bits_per_pixel(pixdesc) >> 3;
419  s->alpha &= !!(pixdesc->flags & AV_PIX_FMT_FLAG_ALPHA);
420  s->is_planar = pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR;
421  s->is_rgb = pixdesc->flags & AV_PIX_FMT_FLAG_RGB;
422  s->is_packed_rgb = !s->is_planar && s->is_rgb;
423 
424  if (s->duration)
425  s->duration_pts = av_rescale_q(s->duration, AV_TIME_BASE_Q, inlink->time_base);
426  if (s->start_time)
427  s->start_time_pts = av_rescale_q(s->start_time, AV_TIME_BASE_Q, inlink->time_base);
428 
429  /* use CCIR601/709 black level for studio-level pixel non-alpha components */
430  s->black_level =
431  ff_fmt_is_in(inlink->format, studio_level_pix_fmts) && !s->alpha ? 16 * (1 << (s->depth - 8)): 0;
432  /* 32768 = 1 << 15, it is an integer representation
433  * of 0.5 and is for rounding. */
434  s->black_level_scaled = (s->black_level << 16) + 32768;
435 
436  s->filter_slice_luma = s->depth <= 8 ? filter_slice_luma : filter_slice_luma16;
437  s->filter_slice_chroma = s->depth <= 8 ? filter_slice_chroma : filter_slice_chroma16;
438  s->filter_slice_alpha = s->depth <= 8 ? filter_slice_alpha : filter_slice_alpha16;
439 
440  return 0;
441 }
442 
444 {
445  AVFilterContext *ctx = inlink->dst;
446  FadeContext *s = ctx->priv;
447 
448  // Calculate Fade assuming this is a Fade In
449  if (s->fade_state == VF_FADE_WAITING) {
450  s->factor=0;
451  if (frame->pts >= s->start_time_pts
452  && inlink->frame_count_out >= s->start_frame) {
453  // Time to start fading
454  s->fade_state = VF_FADE_FADING;
455 
456  // Save start time in case we are starting based on frames and fading based on time
457  if (s->start_time_pts == 0 && s->start_frame != 0) {
458  s->start_time_pts = frame->pts;
459  }
460 
461  // Save start frame in case we are starting based on time and fading based on frames
462  if (s->start_time_pts != 0 && s->start_frame == 0) {
463  s->start_frame = inlink->frame_count_out;
464  }
465  }
466  }
467  if (s->fade_state == VF_FADE_FADING) {
468  if (s->duration_pts == 0) {
469  // Fading based on frame count
470  s->factor = (inlink->frame_count_out - s->start_frame) * s->fade_per_frame;
471  if (inlink->frame_count_out > s->start_frame + s->nb_frames) {
472  s->fade_state = VF_FADE_DONE;
473  }
474 
475  } else {
476  // Fading based on duration
477  s->factor = (frame->pts - s->start_time_pts) * UINT16_MAX / s->duration_pts;
478  if (frame->pts > s->start_time_pts + s->duration_pts) {
479  s->fade_state = VF_FADE_DONE;
480  }
481  }
482  }
483  if (s->fade_state == VF_FADE_DONE) {
484  s->factor=UINT16_MAX;
485  }
486 
487  s->factor = av_clip_uint16(s->factor);
488 
489  // Invert fade_factor if Fading Out
490  if (s->type == FADE_OUT) {
491  s->factor=UINT16_MAX-s->factor;
492  }
493 
494  if (s->factor < UINT16_MAX) {
495  if (s->alpha) {
496  ff_filter_execute(ctx, s->filter_slice_alpha, frame, NULL,
498  } else if (s->is_rgb && !s->black_fade) {
501  } else {
502  /* luma, or rgb plane in case of black */
503  ff_filter_execute(ctx, s->filter_slice_luma, frame, NULL,
505 
506  if (frame->data[1] && frame->data[2] && !s->is_rgb) {
507  /* chroma planes */
508  ff_filter_execute(ctx, s->filter_slice_chroma, frame, NULL,
510  }
511  }
512  }
513 
514  return ff_filter_frame(inlink->dst->outputs[0], frame);
515 }
516 
517 
518 #define OFFSET(x) offsetof(FadeContext, x)
519 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
520 
521 static const AVOption fade_options[] = {
522  { "type", "set the fade direction", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, "type" },
523  { "t", "set the fade direction", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, "type" },
524  { "in", "fade-in", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_IN }, .flags = FLAGS, .unit = "type" },
525  { "out", "fade-out", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_OUT }, .flags = FLAGS, .unit = "type" },
526  { "start_frame", "Number of the first frame to which to apply the effect.",
527  OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
528  { "s", "Number of the first frame to which to apply the effect.",
529  OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
530  { "nb_frames", "Number of frames to which the effect should be applied.",
531  OFFSET(nb_frames), AV_OPT_TYPE_INT, { .i64 = 25 }, 1, INT_MAX, FLAGS },
532  { "n", "Number of frames to which the effect should be applied.",
533  OFFSET(nb_frames), AV_OPT_TYPE_INT, { .i64 = 25 }, 1, INT_MAX, FLAGS },
534  { "alpha", "fade alpha if it is available on the input", OFFSET(alpha), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, FLAGS },
535  { "start_time", "Number of seconds of the beginning of the effect.",
536  OFFSET(start_time), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
537  { "st", "Number of seconds of the beginning of the effect.",
538  OFFSET(start_time), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
539  { "duration", "Duration of the effect in seconds.",
540  OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
541  { "d", "Duration of the effect in seconds.",
542  OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
543  { "color", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGS },
544  { "c", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGS },
545  { NULL }
546 };
547 
549 
551  {
552  .name = "default",
553  .type = AVMEDIA_TYPE_VIDEO,
555  .config_props = config_input,
556  .filter_frame = filter_frame,
557  },
558 };
559 
561  {
562  .name = "default",
563  .type = AVMEDIA_TYPE_VIDEO,
564  },
565 };
566 
568  .name = "fade",
569  .description = NULL_IF_CONFIG_SMALL("Fade in/out input video."),
570  .init = init,
571  .priv_size = sizeof(FadeContext),
572  .priv_class = &fade_class,
576  .flags = AVFILTER_FLAG_SLICE_THREADS |
578 };
AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_YUVA422P16
Definition: pixfmt.h:502
FadeContext::vsub
int vsub
Definition: vf_fade.c:57
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
pix_fmts_rgb
static enum AVPixelFormat pix_fmts_rgb[3]
Definition: av1_parser.c:47
opt.h
filter_slice_rgb
static int filter_slice_rgb(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:232
filter_slice_alpha16
static int filter_slice_alpha16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:380
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
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:260
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
query_formats
static int query_formats(AVFilterContext *ctx)
Definition: vf_fade.c:104
AV_PIX_FMT_YUVA422P9
#define AV_PIX_FMT_YUVA422P9
Definition: pixfmt.h:494
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:330
FadeContext::VF_FADE_WAITING
@ VF_FADE_WAITING
Definition: vf_fade.c:66
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:501
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:496
studio_level_pix_fmts
const static enum AVPixelFormat studio_level_pix_fmts[]
Definition: vf_fade.c:168
AVOption
AVOption.
Definition: opt.h:251
FILTER_QUERY_FUNC
#define FILTER_QUERY_FUNC(func)
Definition: internal.h:171
AV_OPT_TYPE_DURATION
@ AV_OPT_TYPE_DURATION
Definition: opt.h:239
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:459
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
FadeContext::start_frame
int start_frame
Definition: vf_fade.c:56
pixel_fmts
static enum AVPixelFormat pixel_fmts[]
Definition: vf_amplify.c:53
AV_PIX_FMT_BGR24
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:69
AV_PIX_FMT_BGRA
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition: pixfmt.h:95
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:2840
AV_PIX_FMT_YUV440P
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:99
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:165
filter_slice_alpha
static int filter_slice_alpha(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:355
video.h
AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_YUVA422P10
Definition: pixfmt.h:497
formats.h
AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_YUVA420P9
Definition: pixfmt.h:493
AV_PIX_FMT_GBRAP
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition: pixfmt.h:205
filter_slice_luma16
static int filter_slice_luma16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:277
AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA444P16
Definition: pixfmt.h:503
AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_YUV422P9
Definition: pixfmt.h:457
avfilter_vf_fade_inputs
static const AVFilterPad avfilter_vf_fade_inputs[]
Definition: vf_fade.c:550
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:302
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: internal.h:49
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:462
avassert.h
av_cold
#define av_cold
Definition: attributes.h:90
fade_options
static const AVOption fade_options[]
Definition: vf_fade.c:521
AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_YUV422P16
Definition: pixfmt.h:471
duration
int64_t duration
Definition: movenc.c:64
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:79
width
#define width
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:567
s
#define s(width, name)
Definition: cbs_vp9.c:256
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:101
FadeContext::nb_frames
int nb_frames
Definition: vf_fade.c:56
AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:472
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:50
slice_end
static int slice_end(AVCodecContext *avctx, AVFrame *pict)
Handle slice ends.
Definition: mpeg12dec.c:2006
ff_set_common_formats_from_list
int ff_set_common_formats_from_list(AVFilterContext *ctx, const int *fmts)
Equivalent to ff_set_common_formats(ctx, ff_make_format_list(fmts))
Definition: formats.c:755
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
FadeContext::black_level_scaled
unsigned int black_level_scaled
Definition: vf_fade.c:58
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:296
AV_PIX_FMT_YUVA444P12
#define AV_PIX_FMT_YUVA444P12
Definition: pixfmt.h:500
AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUV420P9
Definition: pixfmt.h:456
AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV420P16
Definition: pixfmt.h:470
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
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
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:66
FLAGS
#define FLAGS
Definition: vf_fade.c:519
FILTER_INPUTS
#define FILTER_INPUTS(array)
Definition: internal.h:194
AV_PIX_FMT_RGBA
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition: pixfmt.h:93
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:80
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:66
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:78
AV_OPT_TYPE_COLOR
@ AV_OPT_TYPE_COLOR
Definition: opt.h:240
filter_slice_chroma16
static int filter_slice_chroma16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:329
FadeContext::duration
uint64_t duration
Definition: vf_fade.c:64
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:351
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:460
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: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
eval.h
config_input
static int config_input(AVFilterLink *inlink)
Definition: vf_fade.c:405
AV_PIX_FMT_RGB24
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:68
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
FadeContext::is_planar
int is_planar
Definition: vf_fade.c:63
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:331
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:464
FadeContext
Definition: vf_fade.c:52
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:184
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:466
R
#define R
Definition: vf_fade.c:40
height
#define height
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:167
AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA444P10
Definition: pixfmt.h:498
INTERP
#define INTERP(c_name, c_idx)
FadeContext::black_fade
int black_fade
if color_rgba is black
Definition: vf_fade.c:68
internal.h
FadeContext::fade_state
enum FadeContext::@243 fade_state
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:142
AV_PIX_FMT_ARGB
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
Definition: pixfmt.h:92
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:209
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
OFFSET
#define OFFSET(x)
Definition: vf_fade.c:518
filter_slice_luma
static int filter_slice_luma(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:252
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:777
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:100
AVFilterPad::name
const char * name
Pad name.
Definition: internal.h:55
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:522
AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV444P9
Definition: pixfmt.h:458
AVFilter
Filter definition.
Definition: avfilter.h:161
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:495
FadeContext::VF_FADE_FADING
@ VF_FADE_FADING
Definition: vf_fade.c:66
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:463
AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_YUV422P14
Definition: pixfmt.h:468
FadeContext::VF_FADE_DONE
@ VF_FADE_DONE
Definition: vf_fade.c:66
FADE_OUT
#define FADE_OUT
Definition: vf_fade.c:50
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:65
AV_PIX_FMT_YUVA422P12
#define AV_PIX_FMT_YUVA422P12
Definition: pixfmt.h:499
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:225
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:71
FadeContext::color_rgba
uint8_t color_rgba[4]
fade color
Definition: vf_fade.c:67
AVFilterContext
An instance of a filter.
Definition: avfilter.h:392
av_clip_uint16
#define av_clip_uint16
Definition: common.h:107
AV_PIX_FMT_GBRP
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:158
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
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
add
static float add(float src0, float src1)
Definition: dnn_backend_native_layer_mathbinary.c:35
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:70
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
Definition: opt.h:244
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: internal.h:195
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:73
ff_fill_rgba_map
int ff_fill_rgba_map(uint8_t *rgba_map, enum AVPixelFormat pix_fmt)
Definition: drawutils.c:35
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:72
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:465
AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUV444P14
Definition: pixfmt.h:469
FadeContext::factor
int factor
Definition: vf_fade.c:55
avstring.h
avfilter_vf_fade_outputs
static const AVFilterPad avfilter_vf_fade_outputs[]
Definition: vf_fade.c:560
drawutils.h
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
B
#define B
Definition: vf_fade.c:42
int
int
Definition: ffmpeg_filter.c:156
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:234
filter_frame
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
Definition: vf_fade.c:443
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:166
AV_PIX_FMT_YUV420P14
#define AV_PIX_FMT_YUV420P14
Definition: pixfmt.h:467
AVFILTERPAD_FLAG_NEEDS_WRITABLE
#define AVFILTERPAD_FLAG_NEEDS_WRITABLE
The filter expects writable frames from its input link, duplicating data buffers if needed.
Definition: internal.h:68