FFmpeg
vf_fade.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010 Brandon Mintern
3  * Copyright (c) 2007 Bobby Bingham
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * video fade filter
25  * based heavily on vf_negate.c by Bobby Bingham
26  */
27 
28 #include "libavutil/avassert.h"
29 #include "libavutil/avstring.h"
30 #include "libavutil/common.h"
31 #include "libavutil/eval.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/pixdesc.h"
34 #include "avfilter.h"
35 #include "drawutils.h"
36 #include "filters.h"
37 #include "formats.h"
38 #include "video.h"
39 
40 #define R 0
41 #define G 1
42 #define B 2
43 #define A 3
44 
45 #define Y 0
46 #define U 1
47 #define V 2
48 
49 #define FADE_IN 0
50 #define FADE_OUT 1
51 
52 typedef struct FadeContext {
53  const AVClass *class;
54  int type;
57  int hsub, vsub, bpp, depth;
59  uint8_t is_rgb;
60  uint8_t is_packed_rgb;
61  uint8_t rgba_map[4];
62  int alpha;
63  int is_planar;
64  uint64_t start_time, duration;
67  uint8_t color_rgba[4]; ///< fade color
68  int black_fade; ///< if color_rgba is black
69  int (*filter_slice_luma)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
70  int (*filter_slice_chroma)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
71  int (*filter_slice_alpha)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
72 } FadeContext;
73 
75 {
76  FadeContext *s = ctx->priv;
77 
78  s->fade_per_frame = (1 << 16) / s->nb_frames;
79  s->fade_state = VF_FADE_WAITING;
80 
81  if (s->duration != 0) {
82  // If duration (seconds) is non-zero, assume that we are not fading based on frames
83  s->nb_frames = 0; // Mostly to clean up logging
84  }
85 
86  // Choose what to log. If both time-based and frame-based options, both lines will be in the log
87  if (s->start_frame || s->nb_frames) {
89  "type:%s start_frame:%d nb_frames:%d alpha:%d\n",
90  s->type == FADE_IN ? "in" : "out", s->start_frame,
91  s->nb_frames,s->alpha);
92  }
93  if (s->start_time || s->duration) {
95  "type:%s start_time:%f duration:%f alpha:%d\n",
96  s->type == FADE_IN ? "in" : "out", (s->start_time / (double)AV_TIME_BASE),
97  (s->duration / (double)AV_TIME_BASE),s->alpha);
98  }
99 
100  s->black_fade = !memcmp(s->color_rgba, "\x00\x00\x00\xff", 4);
101  return 0;
102 }
103 
105  AVFilterFormatsConfig **cfg_in,
106  AVFilterFormatsConfig **cfg_out)
107 {
108  const FadeContext *s = ctx->priv;
109  static const enum AVPixelFormat pix_fmts[] = {
129  };
130  static const enum AVPixelFormat pix_fmts_rgb[] = {
136  };
137  static const enum AVPixelFormat pix_fmts_alpha[] = {
147  };
148  static const enum AVPixelFormat pix_fmts_rgba[] = {
153  };
154  const static int straight_alpha[] = {
157  -1,
158  };
159  const enum AVPixelFormat *pixel_fmts;
160  int need_straight = 0;
161  int ret;
162 
163  if (s->alpha) {
164  if (s->black_fade)
165  pixel_fmts = pix_fmts_alpha;
166  else
167  pixel_fmts = pix_fmts_rgba;
168  need_straight = 1;
169  } else {
170  if (s->black_fade)
172  else {
174  need_straight = 1;
175  }
176  }
177 
178  if (need_straight) {
179  ret = ff_set_common_alpha_modes_from_list2(ctx, cfg_in, cfg_out, straight_alpha);
180  if (ret < 0)
181  return ret;
182  }
183 
184  return ff_set_common_formats_from_list2(ctx, cfg_in, cfg_out, pixel_fmts);
185 }
186 
187 const static enum AVPixelFormat studio_level_pix_fmts[] = {
201 };
202 
204  int slice_start, int slice_end,
205  int do_alpha, int step)
206 {
207  int i, j;
208  const uint8_t r_idx = s->rgba_map[R];
209  const uint8_t g_idx = s->rgba_map[G];
210  const uint8_t b_idx = s->rgba_map[B];
211  const uint8_t a_idx = s->rgba_map[A];
212  const uint8_t *c = s->color_rgba;
213 
214  for (i = slice_start; i < slice_end; i++) {
215  uint8_t *p = frame->data[0] + i * frame->linesize[0];
216  for (j = 0; j < frame->width; j++) {
217 #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)
218  p[r_idx] = INTERP(r_idx, 0);
219  p[g_idx] = INTERP(g_idx, 1);
220  p[b_idx] = INTERP(b_idx, 2);
221  if (do_alpha)
222  p[a_idx] = INTERP(a_idx, 3);
223  p += step;
224  }
225  }
226 }
227 
229  int slice_start, int slice_end,
230  int do_alpha)
231 {
232  int i, j;
233  const uint8_t *c = s->color_rgba;
234 
235  for (i = slice_start; i < slice_end; i++) {
236  uint8_t *pg = frame->data[0] + i * frame->linesize[0];
237  uint8_t *pb = frame->data[1] + i * frame->linesize[1];
238  uint8_t *pr = frame->data[2] + i * frame->linesize[2];
239  uint8_t *pa = frame->data[3] + i * frame->linesize[3];
240  for (j = 0; j < frame->width; j++) {
241 #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)
242  pr[j] = INTERPP(pr[j], 0);
243  pg[j] = INTERPP(pg[j], 1);
244  pb[j] = INTERPP(pb[j], 2);
245  if (do_alpha)
246  pa[j] = INTERPP(pa[j], 3);
247  }
248  }
249 }
250 
251 static int filter_slice_rgb(AVFilterContext *ctx, void *arg, int jobnr,
252  int nb_jobs)
253 {
254  FadeContext *s = ctx->priv;
255  AVFrame *frame = arg;
256  int slice_start = (frame->height * jobnr ) / nb_jobs;
257  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
258 
259  if (s->is_planar && s->alpha)
261  else if (s->is_planar)
263  else if (s->alpha) filter_rgb(s, frame, slice_start, slice_end, 1, 4);
264  else if (s->bpp == 3) filter_rgb(s, frame, slice_start, slice_end, 0, 3);
265  else if (s->bpp == 4) filter_rgb(s, frame, slice_start, slice_end, 0, 4);
266  else av_assert0(0);
267 
268  return 0;
269 }
270 
271 static int filter_slice_luma(AVFilterContext *ctx, void *arg, int jobnr,
272  int nb_jobs)
273 {
274  FadeContext *s = ctx->priv;
275  AVFrame *frame = arg;
276  int slice_start = (frame->height * jobnr ) / nb_jobs;
277  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
278  int i, j;
279 
280  for (int k = 0; k < 1 + 2 * (s->is_planar && s->is_rgb); k++) {
281  for (i = slice_start; i < slice_end; i++) {
282  uint8_t *p = frame->data[k] + i * frame->linesize[k];
283  for (j = 0; j < frame->width * s->bpp; j++) {
284  /* s->factor is using 16 lower-order bits for decimal
285  * places. 32768 = 1 << 15, it is an integer representation
286  * of 0.5 and is for rounding. */
287  *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
288  p++;
289  }
290  }
291  }
292 
293  return 0;
294 }
295 
296 static int filter_slice_luma16(AVFilterContext *ctx, void *arg, int jobnr,
297  int nb_jobs)
298 {
299  FadeContext *s = ctx->priv;
300  AVFrame *frame = arg;
301  int slice_start = (frame->height * jobnr ) / nb_jobs;
302  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
303  int i, j;
304 
305  for (int k = 0; k < 1 + 2 * (s->is_planar && s->is_rgb); k++) {
306  for (i = slice_start; i < slice_end; i++) {
307  uint16_t *p = (uint16_t *)(frame->data[k] + i * frame->linesize[k]);
308  for (j = 0; j < frame->width * s->bpp; j++) {
309  /* s->factor is using 16 lower-order bits for decimal
310  * places. 32768 = 1 << 15, it is an integer representation
311  * of 0.5 and is for rounding. */
312  *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
313  p++;
314  }
315  }
316  }
317 
318  return 0;
319 }
320 
321 static int filter_slice_chroma(AVFilterContext *ctx, void *arg, int jobnr,
322  int nb_jobs)
323 {
324  FadeContext *s = ctx->priv;
325  AVFrame *frame = arg;
326  int i, j, plane;
327  const int width = AV_CEIL_RSHIFT(frame->width, s->hsub);
328  const int height= AV_CEIL_RSHIFT(frame->height, s->vsub);
329  int slice_start = (height * jobnr ) / nb_jobs;
330  int slice_end = FFMIN(((height * (jobnr+1)) / nb_jobs), frame->height);
331 
332  for (plane = 1; plane < 3; plane++) {
333  for (i = slice_start; i < slice_end; i++) {
334  uint8_t *p = frame->data[plane] + i * frame->linesize[plane];
335  for (j = 0; j < width; j++) {
336  /* 8421367 = ((128 << 1) + 1) << 15. It is an integer
337  * representation of 128.5. The .5 is for rounding
338  * purposes. */
339  *p = ((*p - 128) * s->factor + 8421367) >> 16;
340  p++;
341  }
342  }
343  }
344 
345  return 0;
346 }
347 
348 static int filter_slice_chroma16(AVFilterContext *ctx, void *arg, int jobnr,
349  int nb_jobs)
350 {
351  FadeContext *s = ctx->priv;
352  AVFrame *frame = arg;
353  int i, j, plane;
354  const int width = AV_CEIL_RSHIFT(frame->width, s->hsub);
355  const int height= AV_CEIL_RSHIFT(frame->height, s->vsub);
356  const int mid = 1 << (s->depth - 1);
357  const int add = ((mid << 1) + 1) << 15;
358  int slice_start = (height * jobnr ) / nb_jobs;
359  int slice_end = FFMIN(((height * (jobnr+1)) / nb_jobs), frame->height);
360 
361  for (plane = 1; plane < 3; plane++) {
362  for (i = slice_start; i < slice_end; i++) {
363  uint16_t *p = (uint16_t *)(frame->data[plane] + i * frame->linesize[plane]);
364  for (j = 0; j < width; j++) {
365  *p = ((*p - mid) * s->factor + add) >> 16;
366  p++;
367  }
368  }
369  }
370 
371  return 0;
372 }
373 
374 static int filter_slice_alpha(AVFilterContext *ctx, void *arg, int jobnr,
375  int nb_jobs)
376 {
377  FadeContext *s = ctx->priv;
378  AVFrame *frame = arg;
379  int plane = s->is_packed_rgb ? 0 : A;
380  int slice_start = (frame->height * jobnr ) / nb_jobs;
381  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
382  int i, j;
383 
384  for (i = slice_start; i < slice_end; i++) {
385  uint8_t *p = frame->data[plane] + i * frame->linesize[plane] + s->is_packed_rgb*s->rgba_map[A];
386  int step = s->is_packed_rgb ? 4 : 1;
387  for (j = 0; j < frame->width; j++) {
388  /* s->factor is using 16 lower-order bits for decimal
389  * places. 32768 = 1 << 15, it is an integer representation
390  * of 0.5 and is for rounding. */
391  *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
392  p += step;
393  }
394  }
395 
396  return 0;
397 }
398 
399 static int filter_slice_alpha16(AVFilterContext *ctx, void *arg, int jobnr,
400  int nb_jobs)
401 {
402  FadeContext *s = ctx->priv;
403  AVFrame *frame = arg;
404  int plane = s->is_packed_rgb ? 0 : A;
405  int slice_start = (frame->height * jobnr ) / nb_jobs;
406  int slice_end = (frame->height * (jobnr+1)) / nb_jobs;
407  int i, j;
408 
409  for (i = slice_start; i < slice_end; i++) {
410  uint16_t *p = (uint16_t *)(frame->data[plane] + i * frame->linesize[plane]) + s->is_packed_rgb*s->rgba_map[A];
411  int step = s->is_packed_rgb ? 4 : 1;
412  for (j = 0; j < frame->width; j++) {
413  /* s->factor is using 16 lower-order bits for decimal
414  * places. 32768 = 1 << 15, it is an integer representation
415  * of 0.5 and is for rounding. */
416  *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
417  p += step;
418  }
419  }
420 
421  return 0;
422 }
423 
425 {
426  FadeContext *s = inlink->dst->priv;
427  const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(inlink->format);
428 
429  s->hsub = pixdesc->log2_chroma_w;
430  s->vsub = pixdesc->log2_chroma_h;
431 
432  ff_fill_rgba_map(s->rgba_map, inlink->format);
433 
434  s->depth = pixdesc->comp[0].depth;
435  s->bpp = pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR ?
436  1 :
437  av_get_bits_per_pixel(pixdesc) >> 3;
438  s->alpha &= !!(pixdesc->flags & AV_PIX_FMT_FLAG_ALPHA);
439  s->is_planar = pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR;
440  s->is_rgb = pixdesc->flags & AV_PIX_FMT_FLAG_RGB;
441  s->is_packed_rgb = !s->is_planar && s->is_rgb;
442 
443  if (s->duration)
444  s->duration_pts = av_rescale_q(s->duration, AV_TIME_BASE_Q, inlink->time_base);
445  if (s->start_time)
446  s->start_time_pts = av_rescale_q(s->start_time, AV_TIME_BASE_Q, inlink->time_base);
447 
448  /* use CCIR601/709 black level for studio-level pixel non-alpha components */
449  s->black_level =
450  ff_fmt_is_in(inlink->format, studio_level_pix_fmts) && !s->alpha ? 16 * (1 << (s->depth - 8)): 0;
451  /* 32768 = 1 << 15, it is an integer representation
452  * of 0.5 and is for rounding. */
453  s->black_level_scaled = (s->black_level << 16) + 32768;
454 
455  s->filter_slice_luma = s->depth <= 8 ? filter_slice_luma : filter_slice_luma16;
456  s->filter_slice_chroma = s->depth <= 8 ? filter_slice_chroma : filter_slice_chroma16;
457  s->filter_slice_alpha = s->depth <= 8 ? filter_slice_alpha : filter_slice_alpha16;
458 
459  return 0;
460 }
461 
463 {
465  AVFilterContext *ctx = inlink->dst;
466  FadeContext *s = ctx->priv;
467 
468  // Calculate Fade assuming this is a Fade In
469  if (s->fade_state == VF_FADE_WAITING) {
470  s->factor=0;
471  if (frame->pts >= s->start_time_pts
472  && inl->frame_count_out >= s->start_frame) {
473  // Time to start fading
474  s->fade_state = VF_FADE_FADING;
475 
476  // Save start time in case we are starting based on frames and fading based on time
477  if (s->start_time_pts == 0 && s->start_frame != 0) {
478  s->start_time_pts = frame->pts;
479  }
480 
481  // Save start frame in case we are starting based on time and fading based on frames
482  if (s->start_time_pts != 0 && s->start_frame == 0) {
483  s->start_frame = inl->frame_count_out;
484  }
485  }
486  }
487  if (s->fade_state == VF_FADE_FADING) {
488  if (s->duration_pts == 0) {
489  // Fading based on frame count
490  s->factor = (inl->frame_count_out - s->start_frame) * s->fade_per_frame;
491  if (inl->frame_count_out > s->start_frame + s->nb_frames) {
492  s->fade_state = VF_FADE_DONE;
493  }
494 
495  } else {
496  // Fading based on duration
497  s->factor = (frame->pts - s->start_time_pts) * UINT16_MAX / s->duration_pts;
498  if (frame->pts > s->start_time_pts + s->duration_pts) {
499  s->fade_state = VF_FADE_DONE;
500  }
501  }
502  }
503  if (s->fade_state == VF_FADE_DONE) {
504  s->factor=UINT16_MAX;
505  }
506 
507  s->factor = av_clip_uint16(s->factor);
508 
509  // Invert fade_factor if Fading Out
510  if (s->type == FADE_OUT) {
511  s->factor=UINT16_MAX-s->factor;
512  }
513 
514  if (s->factor < UINT16_MAX) {
515  if (s->alpha) {
516  ff_filter_execute(ctx, s->filter_slice_alpha, frame, NULL,
518  } else if (s->is_rgb && !s->black_fade) {
521  } else {
522  /* luma, or rgb plane in case of black */
523  ff_filter_execute(ctx, s->filter_slice_luma, frame, NULL,
525 
526  if (frame->data[1] && frame->data[2] && !s->is_rgb) {
527  /* chroma planes */
528  ff_filter_execute(ctx, s->filter_slice_chroma, frame, NULL,
530  }
531  }
532  }
533 
534  return ff_filter_frame(inlink->dst->outputs[0], frame);
535 }
536 
537 
538 #define OFFSET(x) offsetof(FadeContext, x)
539 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
540 
541 static const AVOption fade_options[] = {
542  { "type", "set the fade direction", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, .unit = "type" },
543  { "t", "set the fade direction", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, .unit = "type" },
544  { "in", "fade-in", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_IN }, .flags = FLAGS, .unit = "type" },
545  { "out", "fade-out", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_OUT }, .flags = FLAGS, .unit = "type" },
546  { "start_frame", "Number of the first frame to which to apply the effect.",
547  OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
548  { "s", "Number of the first frame to which to apply the effect.",
549  OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
550  { "nb_frames", "Number of frames to which the effect should be applied.",
551  OFFSET(nb_frames), AV_OPT_TYPE_INT, { .i64 = 25 }, 1, INT_MAX, FLAGS },
552  { "n", "Number of frames to which the effect should be applied.",
553  OFFSET(nb_frames), AV_OPT_TYPE_INT, { .i64 = 25 }, 1, INT_MAX, FLAGS },
554  { "alpha", "fade alpha if it is available on the input", OFFSET(alpha), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, FLAGS },
555  { "start_time", "Number of seconds of the beginning of the effect.",
556  OFFSET(start_time), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
557  { "st", "Number of seconds of the beginning of the effect.",
558  OFFSET(start_time), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
559  { "duration", "Duration of the effect in seconds.",
560  OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
561  { "d", "Duration of the effect in seconds.",
562  OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
563  { "color", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGS },
564  { "c", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGS },
565  { NULL }
566 };
567 
569 
571  {
572  .name = "default",
573  .type = AVMEDIA_TYPE_VIDEO,
575  .config_props = config_input,
576  .filter_frame = filter_frame,
577  },
578 };
579 
581  .p.name = "fade",
582  .p.description = NULL_IF_CONFIG_SMALL("Fade in/out input video."),
583  .p.priv_class = &fade_class,
584  .p.flags = AVFILTER_FLAG_SLICE_THREADS |
586  .init = init,
587  .priv_size = sizeof(FadeContext),
591 };
AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_YUVA422P16
Definition: pixfmt.h:596
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:50
opt.h
filter_slice_rgb
static int filter_slice_rgb(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:251
AVALPHA_MODE_STRAIGHT
@ AVALPHA_MODE_STRAIGHT
Alpha channel is independent of color values.
Definition: pixfmt.h:803
filter_slice_alpha16
static int filter_slice_alpha16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:399
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1067
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3447
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:263
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
AV_PIX_FMT_YUVA422P9
#define AV_PIX_FMT_YUVA422P9
Definition: pixfmt.h:588
FILTER_INPUTS
#define FILTER_INPUTS(array)
Definition: filters.h:263
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
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:595
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:590
studio_level_pix_fmts
const static enum AVPixelFormat studio_level_pix_fmts[]
Definition: vf_fade.c:187
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:539
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
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:3399
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:220
filter_slice_alpha
static int filter_slice_alpha(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:374
video.h
AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_YUVA422P10
Definition: pixfmt.h:591
formats.h
AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_YUVA420P9
Definition: pixfmt.h:587
slice_end
static int slice_end(AVCodecContext *avctx, AVFrame *pict, int *got_output)
Handle slice ends.
Definition: mpeg12dec.c:1688
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:296
AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA444P16
Definition: pixfmt.h:597
AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_YUV422P9
Definition: pixfmt.h:537
avfilter_vf_fade_inputs
static const AVFilterPad avfilter_vf_fade_inputs[]
Definition: vf_fade.c:570
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:321
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:39
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:542
avassert.h
av_cold
#define av_cold
Definition: attributes.h:90
fade_options
static const AVOption fade_options[]
Definition: vf_fade.c:541
AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_YUV422P16
Definition: pixfmt.h:551
ff_video_default_filterpad
const AVFilterPad ff_video_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_VIDEO.
Definition: video.c:37
FFFilter
Definition: filters.h:266
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
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:552
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
FadeContext::fade_state
enum FadeContext::@377 fade_state
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
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:298
query_formats
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Definition: vf_fade.c:104
AV_PIX_FMT_YUVA444P12
#define AV_PIX_FMT_YUVA444P12
Definition: pixfmt.h:594
AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUV420P9
Definition: pixfmt.h:536
AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV420P16
Definition: pixfmt.h:550
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:422
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:539
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: filters.h:264
FadeContext::VF_FADE_FADING
@ VF_FADE_FADING
Definition: vf_fade.c:66
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:76
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:348
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:540
AVPixFmtDescriptor::flags
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
Definition: pixdesc.h:94
AV_PIX_FMT_ABGR
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
Definition: pixfmt.h:101
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
AVFilterFormatsConfig
Lists of formats / etc.
Definition: avfilter.h:121
ff_filter_link
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition: filters.h:198
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:58
config_input
static int config_input(AVFilterLink *inlink)
Definition: vf_fade.c:424
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:89
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:544
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:203
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:546
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:592
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:197
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
ff_set_common_alpha_modes_from_list2
int ff_set_common_alpha_modes_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const int *alpha_modes)
Definition: formats.c:1061
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:228
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
OFFSET
#define OFFSET(x)
Definition: vf_fade.c:538
filter_slice_luma
static int filter_slice_luma(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition: vf_fade.c:271
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:253
ff_vf_fade
const FFFilter ff_vf_fade
Definition: vf_fade.c:580
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:845
FILTER_QUERY_FUNC2
#define FILTER_QUERY_FUNC2(func)
Definition: filters.h:240
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:45
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:538
slice_start
static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, const CodedBitstreamUnit *unit, const int is_first_slice)
Definition: dec.c:845
FADE_IN
#define FADE_IN
Definition: vf_fade.c:49
ret
ret
Definition: filter_design.txt:187
FadeContext::is_rgb
uint8_t is_rgb
Definition: vf_fade.c:59
AVALPHA_MODE_UNSPECIFIED
@ AVALPHA_MODE_UNSPECIFIED
Unknown alpha handling, or no alpha channel.
Definition: pixfmt.h:801
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:265
AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_YUVA444P9
Definition: pixfmt.h:589
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:543
AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_YUV422P14
Definition: pixfmt.h:548
FadeContext::VF_FADE_DONE
@ VF_FADE_DONE
Definition: vf_fade.c:66
ff_set_common_formats_from_list2
int ff_set_common_formats_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const int *fmts)
Definition: formats.c:1085
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:1693
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:593
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
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
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:274
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:167
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
FFFilter::p
AVFilter p
The public AVFilter.
Definition: filters.h:270
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:77
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
FadeContext::is_packed_rgb
uint8_t is_packed_rgb
Definition: vf_fade.c:60
alpha
static const int16_t alpha[]
Definition: ilbcdata.h:55
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
INTERPP
#define INTERPP(c_name, c_idx)
AV_PIX_FMT_YUV411P
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:80
ff_fill_rgba_map
int ff_fill_rgba_map(uint8_t *rgba_map, enum AVPixelFormat pix_fmt)
Definition: drawutils.c:80
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:545
AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUV444P14
Definition: pixfmt.h:549
FadeContext::factor
int factor
Definition: vf_fade.c:55
avstring.h
width
#define width
Definition: dsp.h:89
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:462
FadeContext::VF_FADE_WAITING
@ VF_FADE_WAITING
Definition: vf_fade.c:66
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:547