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/avstring.h"
29 #include "libavutil/common.h"
30 #include "libavutil/eval.h"
31 #include "libavutil/opt.h"
32 #include "libavutil/pixdesc.h"
33 #include "avfilter.h"
34 #include "drawutils.h"
35 #include "internal.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 {
53  const AVClass *class;
54  int type;
56  int start_frame, nb_frames;
57  unsigned int frame_index, stop_frame;
58  int hsub, vsub, bpp;
59  unsigned int black_level, black_level_scaled;
61  uint8_t rgba_map[4];
62  int alpha;
63 
64 } FadeContext;
65 
66 static av_cold int init(AVFilterContext *ctx)
67 {
68  FadeContext *fade = ctx->priv;
69 
70  fade->fade_per_frame = (1 << 16) / fade->nb_frames;
71  if (fade->type == FADE_IN) {
72  fade->factor = 0;
73  } else if (fade->type == FADE_OUT) {
74  fade->fade_per_frame = -fade->fade_per_frame;
75  fade->factor = (1 << 16);
76  }
77  fade->stop_frame = fade->start_frame + fade->nb_frames;
78 
80  "type:%s start_frame:%d nb_frames:%d alpha:%d\n",
81  fade->type == FADE_IN ? "in" : "out", fade->start_frame,
82  fade->nb_frames, fade->alpha);
83  return 0;
84 }
85 
87 {
88  static const enum AVPixelFormat pix_fmts[] = {
98  };
99 
101  return 0;
102 }
103 
104 const static enum AVPixelFormat studio_level_pix_fmts[] = {
109 };
110 
111 static int config_props(AVFilterLink *inlink)
112 {
113  FadeContext *fade = inlink->dst->priv;
114  const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(inlink->format);
115 
116  fade->hsub = pixdesc->log2_chroma_w;
117  fade->vsub = pixdesc->log2_chroma_h;
118 
119  fade->bpp = av_get_bits_per_pixel(pixdesc) >> 3;
120  fade->alpha &= pixdesc->flags & PIX_FMT_ALPHA;
121  fade->is_packed_rgb = ff_fill_rgba_map(fade->rgba_map, inlink->format) >= 0;
122 
123  /* use CCIR601/709 black level for studio-level pixel non-alpha components */
124  fade->black_level =
125  ff_fmt_is_in(inlink->format, studio_level_pix_fmts) && !fade->alpha ? 16 : 0;
126  /* 32768 = 1 << 15, it is an integer representation
127  * of 0.5 and is for rounding. */
128  fade->black_level_scaled = (fade->black_level << 16) + 32768;
129  return 0;
130 }
131 
132 static void fade_plane(int y, int h, int w,
133  int fade_factor, int black_level, int black_level_scaled,
134  uint8_t offset, uint8_t step, int bytes_per_plane,
135  uint8_t *data, int line_size)
136 {
137  uint8_t *p;
138  int i, j;
139 
140  /* luma, alpha or rgb plane */
141  for (i = 0; i < h; i++) {
142  p = data + offset + (y+i) * line_size;
143  for (j = 0; j < w * bytes_per_plane; j++) {
144  /* fade->factor is using 16 lower-order bits for decimal places. */
145  *p = ((*p - black_level) * fade_factor + black_level_scaled) >> 16;
146  p+=step;
147  }
148  }
149 }
150 
151 static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
152 {
153  FadeContext *fade = inlink->dst->priv;
154  uint8_t *p;
155  int i, j, plane;
156 
157  if (fade->factor < UINT16_MAX) {
158  if (fade->alpha) {
159  // alpha only
160  plane = fade->is_packed_rgb ? 0 : A; // alpha is on plane 0 for packed formats
161  // or plane 3 for planar formats
162  fade_plane(0, frame->height, inlink->w,
163  fade->factor, fade->black_level, fade->black_level_scaled,
164  fade->is_packed_rgb ? fade->rgba_map[A] : 0, // alpha offset for packed formats
165  fade->is_packed_rgb ? 4 : 1, // pixstep for 8 bit packed formats
166  1, frame->data[plane], frame->linesize[plane]);
167  } else {
168  /* luma or rgb plane */
169  fade_plane(0, frame->height, inlink->w,
170  fade->factor, fade->black_level, fade->black_level_scaled,
171  0, 1, // offset & pixstep for Y plane or RGB packed format
172  fade->bpp, frame->data[0], frame->linesize[0]);
173  if (frame->data[1] && frame->data[2]) {
174  /* chroma planes */
175  for (plane = 1; plane < 3; plane++) {
176  for (i = 0; i < frame->height; i++) {
177  p = frame->data[plane] + (i >> fade->vsub) * frame->linesize[plane];
178  for (j = 0; j < inlink->w >> fade->hsub; j++) {
179  /* 8421367 = ((128 << 1) + 1) << 15. It is an integer
180  * representation of 128.5. The .5 is for rounding
181  * purposes. */
182  *p = ((*p - 128) * fade->factor + 8421367) >> 16;
183  p++;
184  }
185  }
186  }
187  }
188  }
189  }
190 
191  if (fade->frame_index >= fade->start_frame &&
192  fade->frame_index <= fade->stop_frame)
193  fade->factor += fade->fade_per_frame;
194  fade->factor = av_clip_uint16(fade->factor);
195  fade->frame_index++;
196 
197  return ff_filter_frame(inlink->dst->outputs[0], frame);
198 }
199 
200 
201 #define OFFSET(x) offsetof(FadeContext, x)
202 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
203 
204 static const AVOption fade_options[] = {
205  { "type", "'in' or 'out' for fade-in/fade-out", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, "type" },
206  { "t", "'in' or 'out' for fade-in/fade-out", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, "type" },
207  { "in", "fade-in", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_IN }, .unit = "type" },
208  { "out", "fade-out", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_OUT }, .unit = "type" },
209  { "start_frame", "Number of the first frame to which to apply the effect.",
210  OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
211  { "s", "Number of the first frame to which to apply the effect.",
212  OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
213  { "nb_frames", "Number of frames to which the effect should be applied.",
214  OFFSET(nb_frames), AV_OPT_TYPE_INT, { .i64 = 25 }, 0, INT_MAX, FLAGS },
215  { "n", "Number of frames to which the effect should be applied.",
216  OFFSET(nb_frames), AV_OPT_TYPE_INT, { .i64 = 25 }, 0, INT_MAX, FLAGS },
217  { "alpha", "fade alpha if it is available on the input", OFFSET(alpha), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, FLAGS },
218  { NULL },
219 };
220 
222 
224  {
225  .name = "default",
226  .type = AVMEDIA_TYPE_VIDEO,
227  .config_props = config_props,
228  .get_video_buffer = ff_null_get_video_buffer,
229  .filter_frame = filter_frame,
230  .needs_writable = 1,
231  },
232  { NULL }
233 };
234 
236  {
237  .name = "default",
238  .type = AVMEDIA_TYPE_VIDEO,
239  },
240  { NULL }
241 };
242 
244  .name = "fade",
245  .description = NULL_IF_CONFIG_SMALL("Fade in/out input video."),
246  .init = init,
247  .priv_size = sizeof(FadeContext),
248  .priv_class = &fade_class,
250 
251  .inputs = avfilter_vf_fade_inputs,
252  .outputs = avfilter_vf_fade_outputs,
253 };
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:1778
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
static const AVFilterPad avfilter_vf_fade_outputs[]
Definition: vf_fade.c:235
AVOption.
Definition: opt.h:251
int bpp
Definition: vf_fade.c:58
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:73
static const AVFilterPad outputs[]
Definition: af_ashowinfo.c:117
external API header
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:70
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:1731
AVFrame * ff_null_get_video_buffer(AVFilterLink *link, int w, int h)
Definition: video.c:35
static int config_props(AVFilterLink *inlink)
Definition: vf_fade.c:111
unsigned int black_level
Definition: vf_fade.c:59
static const AVOption fade_options[]
Definition: vf_fade.c:204
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:66
output residual component w
AVFilterFormats * ff_make_format_list(const int *fmts)
Create a list of supported formats.
Definition: formats.c:308
initialize output if(nPeaks >3)%at least 3 peaks in spectrum for trying to find f0 nf0peaks
const char * name
Pad name.
static void fade_plane(int y, int h, int w, int fade_factor, int black_level, int black_level_scaled, uint8_t offset, uint8_t step, int bytes_per_plane, uint8_t *data, int line_size)
Definition: vf_fade.c:132
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition: pixfmt.h:105
uint8_t
it can be given away to ff_start_frame *A reference passed to ff_filter_frame(or the deprecated ff_start_frame) is given away and must no longer be used.*A reference created with avfilter_ref_buffer belongs to the code that created it.*A reference obtained with ff_get_video_buffer or ff_get_audio_buffer belongs to the code that requested it.*A reference given as return value by the get_video_buffer or get_audio_buffer method is given away and must no longer be used.Link reference fields---------------------The AVFilterLink structure has a few AVFilterBufferRef fields.The cur_buf and out_buf were used with the deprecated start_frame/draw_slice/end_frame API and should no longer be used.src_buf
#define av_cold
Definition: attributes.h:78
AVOptions.
#define FLAGS
Definition: vf_fade.c:202
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
Definition: pixfmt.h:98
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of PIX_FMT_YUV440P and setting color_range ...
Definition: pixfmt.h:104
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_...
Definition: pixfmt.h:81
int alpha
Definition: vf_fade.c:62
void 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:545
int ff_fmt_is_in(int fmt, const int *fmts)
Tell is a format is contained in the provided list terminated by -1.
Definition: formats.c:254
frame
Definition: stft.m:14
A filter pad used for either input or output.
static int query_formats(AVFilterContext *ctx)
Definition: vf_fade.c:86
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
Definition: pixfmt.h:219
static double alpha(void *priv, double x, double y)
Definition: vf_geq.c:86
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:75
static av_cold int init(AVFilterContext *ctx)
Definition: vf_fade.c:66
uint8_t is_packed_rgb
Definition: vf_fade.c:60
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition: pixfmt.h:99
Spectrum Plot time data
void * priv
private data for use by the filter
Definition: avfilter.h:545
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
#define A
Definition: vf_fade.c:43
static const uint8_t offset[127][2]
Definition: vf_spp.c:70
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
Definition: vf_fade.c:151
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
Definition: pixfmt.h:96
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition: pixfmt.h:97
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:72
#define AV_LOG_VERBOSE
Definition: log.h:157
int fade_per_frame
Definition: vf_fade.c:55
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_...
Definition: pixfmt.h:80
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:71
static const AVFilterPad avfilter_vf_fade_inputs[]
Definition: vf_fade.c:223
int ff_fill_rgba_map(uint8_t *rgba_map, enum AVPixelFormat pix_fmt)
Definition: drawutils.c:33
#define FADE_OUT
Definition: vf_fade.c:50
NULL
Definition: eval.c:55
misc drawing utilities
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition: pixfmt.h:218
uint8_t flags
Definition: pixdesc.h:76
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:55
AVFilter avfilter_vf_fade
Definition: vf_fade.c:243
int start_frame
Definition: vf_fade.c:56
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:74
Describe the class of an AVClass context structure.
Definition: log.h:50
int vsub
Definition: vf_fade.c:58
Filter definition.
Definition: avfilter.h:436
synthesis window for stochastic i
static const int factor[16]
Definition: vf_pp7.c:202
const char * name
filter name
Definition: avfilter.h:437
int type
Definition: vf_fade.c:54
#define type
AVFilterLink ** outputs
array of pointers to output links
Definition: avfilter.h:539
#define FADE_IN
Definition: vf_fade.c:49
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:68
common internal and external API header
unsigned int stop_frame
Definition: vf_fade.c:57
int nb_frames
Definition: vf_fade.c:56
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_...
Definition: pixfmt.h:82
#define PIX_FMT_ALPHA
The pixel format has an alpha channel.
Definition: pixdesc.h:102
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:75
function y
Definition: D.m:1
#define OFFSET(x)
Definition: vf_fade.c:201
int factor
Definition: vf_fade.c:55
unsigned int black_level_scaled
Definition: vf_fade.c:59
int hsub
Definition: vf_fade.c:58
An instance of a filter.
Definition: avfilter.h:524
uint8_t rgba_map[4]
Definition: vf_fade.c:61
int height
Definition: frame.h:122
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:103
Note except for filters that can have queued request_frame does not push and as a the filter_frame method will be called and do the work Legacy the filter_frame method was it was made of start_frame
internal API functions
static const enum AVPixelFormat studio_level_pix_fmts[]
Definition: vf_fade.c:104
AVPixelFormat
Pixel format.
Definition: pixfmt.h:66
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
for(j=16;j >0;--j)
unsigned int frame_index
Definition: vf_fade.c:57
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
simple arithmetic expression evaluator
AVFILTER_DEFINE_CLASS(fade)