FFmpeg
Loading...
Searching...
No Matches
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
52typedef struct FadeContext {
53 const AVClass *class;
54 int type;
59 uint8_t is_rgb;
61 uint8_t rgba_map[4];
62 int alpha;
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);
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_pixel_formats_from_list2(ctx, cfg_in, cfg_out, pixel_fmts);
185}
186
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
251static 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 = ff_slice_pos(frame->height, jobnr, nb_jobs);
257 int slice_end = ff_slice_pos(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
271static 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 = ff_slice_pos(frame->height, jobnr, nb_jobs);
277 int slice_end = ff_slice_pos(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
296static 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 = ff_slice_pos(frame->height, jobnr, nb_jobs);
302 int slice_end = ff_slice_pos(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
321static 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 = ff_slice_pos(height, jobnr, nb_jobs);
330 int slice_end = FFMIN((ff_slice_pos(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
348static 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 = ff_slice_pos(height, jobnr, nb_jobs);
359 int slice_end = FFMIN((ff_slice_pos(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
374static 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 = ff_slice_pos(frame->height, jobnr, nb_jobs);
381 int slice_end = ff_slice_pos(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
399static 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 = ff_slice_pos(frame->height, jobnr, nb_jobs);
406 int slice_end = ff_slice_pos(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
424static int config_input(AVFilterLink *inlink)
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_pixfmt_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{
464 FilterLink *inl = ff_filter_link(inlink);
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
541static 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};
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Definition aeval.c:246
static int config_input(AVFilterLink *inlink)
const FFFilter ff_vf_fade
Definition vf_fade.c:580
#define A(x)
Definition vpx_arith.h:28
static enum AVPixelFormat pix_fmts_rgb[3]
Definition av1_parser.c:51
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition avfilter.c:1068
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition avfilter.c:1696
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Definition avfilter.c:846
Main libavfilter public API header.
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define FLAGS
Definition cmdutils.c:598
common internal and external API header
#define AV_CEIL_RSHIFT(a, b)
Definition common.h:60
#define av_clip_uint16
Definition common.h:112
#define NULL
Definition coverity.c:32
static AVFrame * frame
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
Definition dolby_e.c:1067
int ff_fill_rgba_map(uint8_t *rgba_map, enum AVPixelFormat pix_fmt)
Definition drawutils.c:80
misc drawing utilities
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
simple arithmetic expression evaluator
static int64_t duration
Definition ffplay.c:330
static int64_t start_time
Definition ffplay.c:329
int ff_set_common_alpha_modes_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const int *alpha_modes)
Definition formats.c:1122
int ff_set_pixel_formats_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const enum AVPixelFormat *fmts)
Definition formats.c:1162
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition opt.h:298
@ AV_OPT_TYPE_DURATION
Underlying C type is int64_t.
Definition opt.h:318
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition opt.h:326
@ AV_OPT_TYPE_COLOR
Underlying C type is uint8_t[4].
Definition opt.h:322
#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:196
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
Definition avfilter.h:166
#define AV_LOG_VERBOSE
Detailed information.
Definition log.h:226
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define AV_TIME_BASE
Internal time base represented as integer.
Definition avutil.h:253
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition avutil.h:263
#define B
Definition huffyuv.h:42
#define R
Definition huffyuv.h:44
#define G
Definition huffyuv.h:43
cl_device_type type
static const int16_t alpha[]
Definition ilbcdata.h:55
const char * arg
Definition jacosubdec.c:65
#define FILTER_INPUTS(array)
Definition filters.h:264
#define FILTER_OUTPUTS(array)
Definition filters.h:265
static int ff_slice_pos(int total, int jobnr, int nb_jobs)
Compute the boundary index for a slice when work of size total is split into nb_jobs slices.
Definition filters.h:763
int ff_pixfmt_is_in(enum AVPixelFormat fmt, const enum AVPixelFormat *fmts)
Tell if a pixel format is contained in the provided AV_PIX_FMT_NONE-terminated list.
Definition formats.c:471
#define AVFILTERPAD_FLAG_NEEDS_WRITABLE
The filter expects writable frames from its input link, duplicating data buffers if needed.
Definition filters.h:59
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition filters.h:199
#define AVFILTER_DEFINE_CLASS(fname)
Definition filters.h:478
#define FILTER_QUERY_FUNC2(func)
Definition filters.h:241
#define av_always_inline
Definition attributes.h:72
#define av_cold
Definition attributes.h:117
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
static enum AVPixelFormat pix_fmts[]
Definition libkvazaar.c:296
#define FFMIN(a, b)
Definition macros.h:49
static int slice_end(AVCodecContext *avctx, AVFrame *pict, int *got_output)
Handle slice ends.
Definition mpeg12dec.c:1697
AVOptions.
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:3412
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition pixdesc.h:147
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
Definition pixdesc.h:136
#define AV_PIX_FMT_FLAG_PLANAR
At least one pixel component is not in the first data plane.
Definition pixdesc.h:132
#define AV_PIX_FMT_YUV420P16
Definition pixfmt.h:556
#define AV_PIX_FMT_YUV444P12
Definition pixfmt.h:552
#define AV_PIX_FMT_YUV444P9
Definition pixfmt.h:544
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:545
#define AV_PIX_FMT_YUV440P12
Definition pixfmt.h:551
#define AV_PIX_FMT_YUV422P9
Definition pixfmt.h:543
#define AV_PIX_FMT_YUVA444P10
Definition pixfmt.h:598
#define AV_PIX_FMT_YUVA420P16
Definition pixfmt.h:601
#define AV_PIX_FMT_YUV420P12
Definition pixfmt.h:549
#define AV_PIX_FMT_YUVA420P10
Definition pixfmt.h:596
@ AVALPHA_MODE_STRAIGHT
Alpha channel is independent of color values.
Definition pixfmt.h:819
@ AVALPHA_MODE_UNSPECIFIED
Unknown alpha handling, or no alpha channel.
Definition pixfmt.h:817
#define AV_PIX_FMT_YUVA422P9
Definition pixfmt.h:594
#define AV_PIX_FMT_YUV422P12
Definition pixfmt.h:550
#define AV_PIX_FMT_YUV422P10
Definition pixfmt.h:546
#define AV_PIX_FMT_YUV420P9
Definition pixfmt.h:542
#define AV_PIX_FMT_YUVA420P9
Definition pixfmt.h:593
#define AV_PIX_FMT_YUVA422P10
Definition pixfmt.h:597
#define AV_PIX_FMT_YUV420P14
Definition pixfmt.h:553
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition pixfmt.h:75
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition pixfmt.h:106
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
Definition pixfmt.h:99
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition pixfmt.h:102
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
Definition pixfmt.h:101
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition pixfmt.h:108
@ 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
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition pixfmt.h:79
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition pixfmt.h:80
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition pixfmt.h:100
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
@ 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_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition pixfmt.h:212
@ 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
@ 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_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition pixfmt.h:76
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition pixfmt.h:165
@ 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
@ 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
#define AV_PIX_FMT_YUVA422P12
Definition pixfmt.h:599
#define AV_PIX_FMT_YUV422P14
Definition pixfmt.h:554
#define AV_PIX_FMT_YUV422P16
Definition pixfmt.h:557
#define AV_PIX_FMT_YUVA444P16
Definition pixfmt.h:603
#define AV_PIX_FMT_YUVA422P16
Definition pixfmt.h:602
#define AV_PIX_FMT_YUV444P14
Definition pixfmt.h:555
#define AV_PIX_FMT_YUVA444P9
Definition pixfmt.h:595
#define AV_PIX_FMT_YUVA444P12
Definition pixfmt.h:600
#define AV_PIX_FMT_YUV444P16
Definition pixfmt.h:558
#define AV_PIX_FMT_YUV444P10
Definition pixfmt.h:548
Describe the class of an AVClass context structure.
Definition log.h:76
int depth
Number of bits in the component.
Definition pixdesc.h:57
An instance of a filter.
Definition avfilter.h:273
void * priv
private data for use by the filter
Definition avfilter.h:288
AVFilterLink ** outputs
array of pointers to output links
Definition avfilter.h:285
Lists of formats / etc.
Definition avfilter.h:120
A filter pad used for either input or output.
Definition filters.h:40
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
AVOption.
Definition opt.h:428
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition pixdesc.h:105
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition pixdesc.h:80
uint64_t flags
Combination of AV_PIX_FMT_FLAG_... flags.
Definition pixdesc.h:94
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition pixdesc.h:89
uint64_t duration
Definition vf_fade.c:64
int start_frame
Definition vf_fade.c:56
uint8_t rgba_map[4]
Definition vf_fade.c:61
uint8_t is_rgb
Definition vf_fade.c:59
unsigned int black_level_scaled
Definition vf_fade.c:58
enum FadeContext::@363326054352076225030000322234127320174027277125 fade_state
uint64_t duration_pts
Definition vf_fade.c:65
@ VF_FADE_FADING
Definition vf_fade.c:66
@ VF_FADE_WAITING
Definition vf_fade.c:66
@ VF_FADE_DONE
Definition vf_fade.c:66
int black_fade
if color_rgba is black
Definition vf_fade.c:68
uint8_t is_packed_rgb
Definition vf_fade.c:60
uint64_t start_time_pts
Definition vf_fade.c:65
int(* filter_slice_alpha)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition vf_fade.c:71
int(* filter_slice_chroma)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition vf_fade.c:70
uint64_t start_time
Definition vf_fade.c:64
int(* filter_slice_luma)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition vf_fade.c:69
uint8_t color_rgba[4]
fade color
Definition vf_fade.c:67
int is_planar
Definition vf_fade.c:63
unsigned int black_level
Definition vf_fade.c:58
int depth
Definition vf_fade.c:57
int nb_frames
Definition vf_fade.c:56
int alpha
Definition vf_fade.c:62
int factor
Definition vf_fade.c:55
int fade_per_frame
Definition vf_fade.c:55
#define av_log(a,...)
static AVFormatContext * ctx
Definition movenc.c:49
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89
static enum AVPixelFormat pixel_fmts[]
Definition vf_amplify.c:52
#define FADE_IN
Definition vf_fade.c:49
static const AVFilterPad avfilter_vf_fade_inputs[]
Definition vf_fade.c:570
static int filter_slice_chroma(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition vf_fade.c:321
static int filter_slice_chroma16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition vf_fade.c:348
static int filter_slice_rgb(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition vf_fade.c:251
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
static int config_input(AVFilterLink *inlink)
Definition vf_fade.c:424
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
Definition vf_fade.c:462
static const AVOption fade_options[]
Definition vf_fade.c:541
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
#define INTERP(c_name, c_idx)
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Definition vf_fade.c:104
static const enum AVPixelFormat studio_level_pix_fmts[]
Definition vf_fade.c:187
static int filter_slice_alpha(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition vf_fade.c:374
static int filter_slice_alpha16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition vf_fade.c:399
#define OFFSET(x)
Definition vf_fade.c:538
static int filter_slice_luma(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition vf_fade.c:271
#define INTERPP(c_name, c_idx)
#define FADE_OUT
Definition vf_fade.c:50
static int filter_slice_luma16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Definition vf_fade.c:296
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
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:512
static double c[64]
static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, const CodedBitstreamUnit *unit, const int is_first_slice)
Definition dec.c:844