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  AVFilterFormats *fmts_list;
153 
154  if (s->alpha) {
155  if (s->black_fade)
156  fmts_list = ff_make_format_list(pix_fmts_alpha);
157  else
158  fmts_list = ff_make_format_list(pix_fmts_rgba);
159  } else {
160  if (s->black_fade)
161  fmts_list = ff_make_format_list(pix_fmts);
162  else
163  fmts_list = ff_make_format_list(pix_fmts_rgb);
164  }
165  if (!fmts_list)
166  return AVERROR(ENOMEM);
167  return ff_set_common_formats(ctx, fmts_list);
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)
243  filter_rgb_planar(s, frame, slice_start, slice_end, 1);
244  else if (s->is_planar)
245  filter_rgb_planar(s, frame, slice_start, slice_end, 0);
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 {
447  AVFilterContext *ctx = inlink->dst;
448  FadeContext *s = ctx->priv;
449 
450  // Calculate Fade assuming this is a Fade In
451  if (s->fade_state == VF_FADE_WAITING) {
452  s->factor=0;
453  if (frame->pts >= s->start_time_pts
454  && inlink->frame_count_out >= s->start_frame) {
455  // Time to start fading
456  s->fade_state = VF_FADE_FADING;
457 
458  // Save start time in case we are starting based on frames and fading based on time
459  if (s->start_time_pts == 0 && s->start_frame != 0) {
460  s->start_time_pts = frame->pts;
461  }
462 
463  // Save start frame in case we are starting based on time and fading based on frames
464  if (s->start_time_pts != 0 && s->start_frame == 0) {
465  s->start_frame = inlink->frame_count_out;
466  }
467  }
468  }
469  if (s->fade_state == VF_FADE_FADING) {
470  if (s->duration_pts == 0) {
471  // Fading based on frame count
472  s->factor = (inlink->frame_count_out - s->start_frame) * s->fade_per_frame;
473  if (inlink->frame_count_out > s->start_frame + s->nb_frames) {
474  s->fade_state = VF_FADE_DONE;
475  }
476 
477  } else {
478  // Fading based on duration
479  s->factor = (frame->pts - s->start_time_pts) * UINT16_MAX / s->duration_pts;
480  if (frame->pts > s->start_time_pts + s->duration_pts) {
481  s->fade_state = VF_FADE_DONE;
482  }
483  }
484  }
485  if (s->fade_state == VF_FADE_DONE) {
486  s->factor=UINT16_MAX;
487  }
488 
489  s->factor = av_clip_uint16(s->factor);
490 
491  // Invert fade_factor if Fading Out
492  if (s->type == FADE_OUT) {
493  s->factor=UINT16_MAX-s->factor;
494  }
495 
496  if (s->factor < UINT16_MAX) {
497  if (s->alpha) {
498  ctx->internal->execute(ctx, s->filter_slice_alpha, frame, NULL,
500  } else if (s->is_rgb && !s->black_fade) {
501  ctx->internal->execute(ctx, filter_slice_rgb, frame, NULL,
503  } else {
504  /* luma, or rgb plane in case of black */
505  ctx->internal->execute(ctx, s->filter_slice_luma, frame, NULL,
507 
508  if (frame->data[1] && frame->data[2] && !s->is_rgb) {
509  /* chroma planes */
510  ctx->internal->execute(ctx, s->filter_slice_chroma, frame, NULL,
512  }
513  }
514  }
515 
516  return ff_filter_frame(inlink->dst->outputs[0], frame);
517 }
518 
519 
520 #define OFFSET(x) offsetof(FadeContext, x)
521 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
522 
523 static const AVOption fade_options[] = {
524  { "type", "set the fade direction", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, "type" },
525  { "t", "set the fade direction", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, "type" },
526  { "in", "fade-in", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_IN }, .flags = FLAGS, .unit = "type" },
527  { "out", "fade-out", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_OUT }, .flags = FLAGS, .unit = "type" },
528  { "start_frame", "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  { "s", "Number of the first frame to which to apply the effect.",
531  OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
532  { "nb_frames", "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  { "n", "Number of frames to which the effect should be applied.",
535  OFFSET(nb_frames), AV_OPT_TYPE_INT, { .i64 = 25 }, 1, INT_MAX, FLAGS },
536  { "alpha", "fade alpha if it is available on the input", OFFSET(alpha), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, FLAGS },
537  { "start_time", "Number of seconds of the beginning of the effect.",
538  OFFSET(start_time), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
539  { "st", "Number of seconds of the beginning of the effect.",
540  OFFSET(start_time), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
541  { "duration", "Duration of the effect in seconds.",
542  OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
543  { "d", "Duration of the effect in seconds.",
544  OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
545  { "color", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGS },
546  { "c", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGS },
547  { NULL }
548 };
549 
551 
553  {
554  .name = "default",
555  .type = AVMEDIA_TYPE_VIDEO,
556  .config_props = config_input,
557  .filter_frame = filter_frame,
558  .needs_writable = 1,
559  },
560  { NULL }
561 };
562 
564  {
565  .name = "default",
566  .type = AVMEDIA_TYPE_VIDEO,
567  },
568  { NULL }
569 };
570 
572  .name = "fade",
573  .description = NULL_IF_CONFIG_SMALL("Fade in/out input video."),
574  .init = init,
575  .priv_size = sizeof(FadeContext),
576  .priv_class = &fade_class,
582 };
AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_YUVA422P16
Definition: pixfmt.h:432
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:48
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
filter_slice_rgb
static int filter_slice_rgb(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:234
ff_make_format_list
AVFilterFormats * ff_make_format_list(const int *fmts)
Create a list of supported formats.
Definition: formats.c:286
FadeContext::VF_FADE_WAITING
@ VF_FADE_WAITING
Definition: vf_fade.c:66
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:978
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2541
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:424
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:303
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:431
AVComponentDescriptor::depth
int depth
Number of bits in the component.
Definition: pixdesc.h:58
AV_PIX_FMT_YUVA420P10
#define AV_PIX_FMT_YUVA420P10
Definition: pixfmt.h:426
studio_level_pix_fmts
const static enum AVPixelFormat studio_level_pix_fmts[]
Definition: vf_fade.c:170
AVOption
AVOption.
Definition: opt.h:248
AV_OPT_TYPE_DURATION
@ AV_OPT_TYPE_DURATION
Definition: opt.h:239
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:389
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:197
FadeContext::start_frame
int start_frame
Definition: vf_fade.c:56
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:2493
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:149
filter_slice_alpha
static int filter_slice_alpha(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:357
video.h
AVFormatContext::internal
AVFormatInternal * internal
An opaque field for libavformat internal usage.
Definition: avformat.h:1555
AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_YUVA422P10
Definition: pixfmt.h:427
AVFilterFormats
A list of supported formats for one end of a filter link.
Definition: formats.h:65
formats.h
AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_YUVA420P9
Definition: pixfmt.h:423
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:279
AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA444P16
Definition: pixfmt.h:433
AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_YUV422P9
Definition: pixfmt.h:387
avfilter_vf_fade_inputs
static const AVFilterPad avfilter_vf_fade_inputs[]
Definition: vf_fade.c:552
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: internal.h:54
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:392
avassert.h
av_cold
#define av_cold
Definition: attributes.h:90
fade_options
static const AVOption fade_options[]
Definition: vf_fade.c:523
inputs
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 inputs
Definition: filter_design.txt:243
AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_YUV422P16
Definition: pixfmt.h:401
ff_set_common_formats
int ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
A helper for query_formats() which sets all links to the same list of formats.
Definition: formats.c:580
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:571
s
#define s(width, name)
Definition: cbs_vp9.c:257
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:402
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:58
slice_end
static int slice_end(AVCodecContext *avctx, AVFrame *pict)
Handle slice ends.
Definition: mpeg12dec.c:2031
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
outputs
static const AVFilterPad outputs[]
Definition: af_acontrast.c:203
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:290
AV_PIX_FMT_YUVA444P12
#define AV_PIX_FMT_YUVA444P12
Definition: pixfmt.h:430
AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUV420P9
Definition: pixfmt.h:386
AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV420P16
Definition: pixfmt.h:400
AV_PIX_FMT_FLAG_ALPHA
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition: pixdesc.h:148
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:81
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:521
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:67
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:331
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:257
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:390
FadeContext::VF_FADE_FADING
@ VF_FADE_FADING
Definition: vf_fade.c:66
AVPixFmtDescriptor::flags
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
Definition: pixdesc.h:95
FadeContext::VF_FADE_DONE
@ VF_FADE_DONE
Definition: vf_fade.c:66
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:407
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:117
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:137
FadeContext::duration_pts
uint64_t duration_pts
Definition: vf_fade.c:65
start_time
static int64_t start_time
Definition: ffplay.c:332
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:394
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:186
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:396
R
#define R
Definition: vf_fade.c:40
height
#define height
FFMIN
#define FFMIN(a, b)
Definition: common.h:105
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:428
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
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:126
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
i
int i
Definition: input.c:407
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
OFFSET
#define OFFSET(x)
Definition: vf_fade.c:520
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:762
av_always_inline
#define av_always_inline
Definition: attributes.h:49
FadeContext::type
int type
Definition: vf_fade.c:54
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:60
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:492
AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV444P9
Definition: pixfmt.h:388
AVFilter
Filter definition.
Definition: avfilter.h:145
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:425
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:393
AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_YUV422P14
Definition: pixfmt.h:398
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:429
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:106
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:133
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:333
av_clip_uint16
#define av_clip_uint16
Definition: common.h:134
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:36
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:70
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:242
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
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
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:28
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:395
AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUV444P14
Definition: pixfmt.h:399
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:563
drawutils.h
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: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:90
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:397
FadeContext::fade_state
enum FadeContext::@223 fade_state