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 {
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)
242  else if (s->is_planar)
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 {
446  AVFilterContext *ctx = inlink->dst;
447  FadeContext *s = ctx->priv;
448 
449  // Calculate Fade assuming this is a Fade In
450  if (s->fade_state == VF_FADE_WAITING) {
451  s->factor=0;
452  if (frame->pts >= s->start_time_pts
453  && inl->frame_count_out >= s->start_frame) {
454  // Time to start fading
455  s->fade_state = VF_FADE_FADING;
456 
457  // Save start time in case we are starting based on frames and fading based on time
458  if (s->start_time_pts == 0 && s->start_frame != 0) {
459  s->start_time_pts = frame->pts;
460  }
461 
462  // Save start frame in case we are starting based on time and fading based on frames
463  if (s->start_time_pts != 0 && s->start_frame == 0) {
464  s->start_frame = inl->frame_count_out;
465  }
466  }
467  }
468  if (s->fade_state == VF_FADE_FADING) {
469  if (s->duration_pts == 0) {
470  // Fading based on frame count
471  s->factor = (inl->frame_count_out - s->start_frame) * s->fade_per_frame;
472  if (inl->frame_count_out > s->start_frame + s->nb_frames) {
473  s->fade_state = VF_FADE_DONE;
474  }
475 
476  } else {
477  // Fading based on duration
478  s->factor = (frame->pts - s->start_time_pts) * UINT16_MAX / s->duration_pts;
479  if (frame->pts > s->start_time_pts + s->duration_pts) {
480  s->fade_state = VF_FADE_DONE;
481  }
482  }
483  }
484  if (s->fade_state == VF_FADE_DONE) {
485  s->factor=UINT16_MAX;
486  }
487 
488  s->factor = av_clip_uint16(s->factor);
489 
490  // Invert fade_factor if Fading Out
491  if (s->type == FADE_OUT) {
492  s->factor=UINT16_MAX-s->factor;
493  }
494 
495  if (s->factor < UINT16_MAX) {
496  if (s->alpha) {
497  ff_filter_execute(ctx, s->filter_slice_alpha, frame, NULL,
499  } else if (s->is_rgb && !s->black_fade) {
502  } else {
503  /* luma, or rgb plane in case of black */
504  ff_filter_execute(ctx, s->filter_slice_luma, frame, NULL,
506 
507  if (frame->data[1] && frame->data[2] && !s->is_rgb) {
508  /* chroma planes */
509  ff_filter_execute(ctx, s->filter_slice_chroma, frame, NULL,
511  }
512  }
513  }
514 
515  return ff_filter_frame(inlink->dst->outputs[0], frame);
516 }
517 
518 
519 #define OFFSET(x) offsetof(FadeContext, x)
520 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
521 
522 static const AVOption fade_options[] = {
523  { "type", "set the fade direction", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, .unit = "type" },
524  { "t", "set the fade direction", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, .unit = "type" },
525  { "in", "fade-in", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_IN }, .flags = FLAGS, .unit = "type" },
526  { "out", "fade-out", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_OUT }, .flags = FLAGS, .unit = "type" },
527  { "start_frame", "Number of the first frame to which to apply the effect.",
528  OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
529  { "s", "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  { "nb_frames", "Number of frames to which the effect should be applied.",
532  OFFSET(nb_frames), AV_OPT_TYPE_INT, { .i64 = 25 }, 1, INT_MAX, FLAGS },
533  { "n", "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  { "alpha", "fade alpha if it is available on the input", OFFSET(alpha), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, FLAGS },
536  { "start_time", "Number of seconds of the beginning of the effect.",
537  OFFSET(start_time), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
538  { "st", "Number of seconds of the beginning of the effect.",
539  OFFSET(start_time), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
540  { "duration", "Duration of the effect in seconds.",
541  OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
542  { "d", "Duration of the effect in seconds.",
543  OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
544  { "color", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGS },
545  { "c", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGS },
546  { NULL }
547 };
548 
550 
552  {
553  .name = "default",
554  .type = AVMEDIA_TYPE_VIDEO,
556  .config_props = config_input,
557  .filter_frame = filter_frame,
558  },
559 };
560 
562  .name = "fade",
563  .description = NULL_IF_CONFIG_SMALL("Fade in/out input video."),
564  .init = init,
565  .priv_size = sizeof(FadeContext),
566  .priv_class = &fade_class,
570  .flags = AVFILTER_FLAG_SLICE_THREADS |
572 };
AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_YUVA422P16
Definition: pixfmt.h:522
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: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:1025
FadeContext::VF_FADE_WAITING
@ VF_FADE_WAITING
Definition: vf_fade.c:66
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2965
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
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:514
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:521
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:516
studio_level_pix_fmts
const static enum AVPixelFormat studio_level_pix_fmts[]
Definition: vf_fade.c:168
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:478
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:2917
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:355
video.h
AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_YUVA422P10
Definition: pixfmt.h:517
formats.h
AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_YUVA420P9
Definition: pixfmt.h:513
slice_end
static int slice_end(AVCodecContext *avctx, AVFrame *pict, int *got_output)
Handle slice ends.
Definition: mpeg12dec.c:1719
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:277
AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA444P16
Definition: pixfmt.h:523
AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_YUV422P9
Definition: pixfmt.h:476
avfilter_vf_fade_inputs
static const AVFilterPad avfilter_vf_fade_inputs[]
Definition: vf_fade.c:551
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: filters.h:38
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:481
avassert.h
av_cold
#define av_cold
Definition: attributes.h:90
fade_options
static const AVOption fade_options[]
Definition: vf_fade.c:522
AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_YUV422P16
Definition: pixfmt.h:490
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:561
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:491
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
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:873
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
AV_PIX_FMT_YUVA444P12
#define AV_PIX_FMT_YUVA444P12
Definition: pixfmt.h:520
AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUV420P9
Definition: pixfmt.h:475
AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV420P16
Definition: pixfmt.h:489
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:520
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:329
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:479
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
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:405
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:483
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:485
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:518
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:209
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
OFFSET
#define OFFSET(x)
Definition: vf_fade.c:519
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:836
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:477
slice_start
static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, const CodedBitstreamUnit *unit, const int is_first_slice)
Definition: dec.c:737
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:515
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:482
AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_YUV422P14
Definition: pixfmt.h:487
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:1653
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:519
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
FadeContext::VF_FADE_FADING
@ VF_FADE_FADING
Definition: vf_fade.c:66
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
FadeContext::fade_state
enum FadeContext::@338 fade_state
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: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: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:484
AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUV444P14
Definition: pixfmt.h:488
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:443
FadeContext::VF_FADE_DONE
@ VF_FADE_DONE
Definition: vf_fade.c:66
FILTER_QUERY_FUNC
#define FILTER_QUERY_FUNC(func)
Definition: filters.h:236
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:486