vf_crop.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2007 Bobby Bingham
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * video crop filter
24  */
25 
26 /* #define DEBUG */
27 
28 #include <stdio.h>
29 
30 #include "avfilter.h"
31 #include "formats.h"
32 #include "internal.h"
33 #include "video.h"
34 #include "libavutil/eval.h"
35 #include "libavutil/avstring.h"
36 #include "libavutil/internal.h"
37 #include "libavutil/libm.h"
38 #include "libavutil/imgutils.h"
39 #include "libavutil/mathematics.h"
40 #include "libavutil/opt.h"
41 
42 static const char *const var_names[] = {
43  "in_w", "iw", ///< width of the input video
44  "in_h", "ih", ///< height of the input video
45  "out_w", "ow", ///< width of the cropped video
46  "out_h", "oh", ///< height of the cropped video
47  "a",
48  "sar",
49  "dar",
50  "hsub",
51  "vsub",
52  "x",
53  "y",
54  "n", ///< number of frame
55  "pos", ///< position in the file
56  "t", ///< timestamp expressed in seconds
57  NULL
58 };
59 
60 enum var_name {
76 };
77 
78 typedef struct {
79  const AVClass *class;
80  int x; ///< x offset of the non-cropped area with respect to the input area
81  int y; ///< y offset of the non-cropped area with respect to the input area
82  int w; ///< width of the cropped area
83  int h; ///< height of the cropped area
84 
85  AVRational out_sar; ///< output sample aspect ratio
86  int keep_aspect; ///< keep display aspect ratio when cropping
87 
88  int max_step[4]; ///< max pixel step for each plane, expressed as a number of bytes
89  int hsub, vsub; ///< chroma subsampling
90  char *x_expr, *y_expr, *w_expr, *h_expr;
91  AVExpr *x_pexpr, *y_pexpr; /* parsed expressions for x and y */
92  double var_values[VAR_VARS_NB];
93 } CropContext;
94 
96 {
97  static const enum AVPixelFormat pix_fmts[] = {
121  };
122 
124 
125  return 0;
126 }
127 
128 static av_cold void uninit(AVFilterContext *ctx)
129 {
130  CropContext *crop = ctx->priv;
131 
132  av_expr_free(crop->x_pexpr); crop->x_pexpr = NULL;
133  av_expr_free(crop->y_pexpr); crop->y_pexpr = NULL;
134 }
135 
136 static inline int normalize_double(int *n, double d)
137 {
138  int ret = 0;
139 
140  if (isnan(d)) {
141  ret = AVERROR(EINVAL);
142  } else if (d > INT_MAX || d < INT_MIN) {
143  *n = d > INT_MAX ? INT_MAX : INT_MIN;
144  ret = AVERROR(EINVAL);
145  } else
146  *n = round(d);
147 
148  return ret;
149 }
150 
152 {
153  AVFilterContext *ctx = link->dst;
154  CropContext *crop = ctx->priv;
155  const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(link->format);
156  int ret;
157  const char *expr;
158  double res;
159 
160  crop->var_values[VAR_IN_W] = crop->var_values[VAR_IW] = ctx->inputs[0]->w;
161  crop->var_values[VAR_IN_H] = crop->var_values[VAR_IH] = ctx->inputs[0]->h;
162  crop->var_values[VAR_A] = (float) link->w / link->h;
164  crop->var_values[VAR_DAR] = crop->var_values[VAR_A] * crop->var_values[VAR_SAR];
165  crop->var_values[VAR_HSUB] = 1<<pix_desc->log2_chroma_w;
166  crop->var_values[VAR_VSUB] = 1<<pix_desc->log2_chroma_h;
167  crop->var_values[VAR_X] = NAN;
168  crop->var_values[VAR_Y] = NAN;
169  crop->var_values[VAR_OUT_W] = crop->var_values[VAR_OW] = NAN;
170  crop->var_values[VAR_OUT_H] = crop->var_values[VAR_OH] = NAN;
171  crop->var_values[VAR_N] = 0;
172  crop->var_values[VAR_T] = NAN;
173  crop->var_values[VAR_POS] = NAN;
174 
175  av_image_fill_max_pixsteps(crop->max_step, NULL, pix_desc);
176  crop->hsub = pix_desc->log2_chroma_w;
177  crop->vsub = pix_desc->log2_chroma_h;
178 
179  if ((ret = av_expr_parse_and_eval(&res, (expr = crop->w_expr),
180  var_names, crop->var_values,
181  NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0) goto fail_expr;
182  crop->var_values[VAR_OUT_W] = crop->var_values[VAR_OW] = res;
183  if ((ret = av_expr_parse_and_eval(&res, (expr = crop->h_expr),
184  var_names, crop->var_values,
185  NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0) goto fail_expr;
186  crop->var_values[VAR_OUT_H] = crop->var_values[VAR_OH] = res;
187  /* evaluate again ow as it may depend on oh */
188  if ((ret = av_expr_parse_and_eval(&res, (expr = crop->w_expr),
189  var_names, crop->var_values,
190  NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0) goto fail_expr;
191  crop->var_values[VAR_OUT_W] = crop->var_values[VAR_OW] = res;
192  if (normalize_double(&crop->w, crop->var_values[VAR_OUT_W]) < 0 ||
193  normalize_double(&crop->h, crop->var_values[VAR_OUT_H]) < 0) {
194  av_log(ctx, AV_LOG_ERROR,
195  "Too big value or invalid expression for out_w/ow or out_h/oh. "
196  "Maybe the expression for out_w:'%s' or for out_h:'%s' is self-referencing.\n",
197  crop->w_expr, crop->h_expr);
198  return AVERROR(EINVAL);
199  }
200  crop->w &= ~((1 << crop->hsub) - 1);
201  crop->h &= ~((1 << crop->vsub) - 1);
202 
203  if ((ret = av_expr_parse(&crop->x_pexpr, crop->x_expr, var_names,
204  NULL, NULL, NULL, NULL, 0, ctx)) < 0 ||
205  (ret = av_expr_parse(&crop->y_pexpr, crop->y_expr, var_names,
206  NULL, NULL, NULL, NULL, 0, ctx)) < 0)
207  return AVERROR(EINVAL);
208 
209  if (crop->keep_aspect) {
211  (AVRational){ link->w, link->h });
212  av_reduce(&crop->out_sar.num, &crop->out_sar.den,
213  dar.num * crop->h, dar.den * crop->w, INT_MAX);
214  } else
215  crop->out_sar = link->sample_aspect_ratio;
216 
217  av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d sar:%d/%d -> w:%d h:%d sar:%d/%d\n",
218  link->w, link->h, link->sample_aspect_ratio.num, link->sample_aspect_ratio.den,
219  crop->w, crop->h, crop->out_sar.num, crop->out_sar.den);
220 
221  if (crop->w <= 0 || crop->h <= 0 ||
222  crop->w > link->w || crop->h > link->h) {
223  av_log(ctx, AV_LOG_ERROR,
224  "Invalid too big or non positive size for width '%d' or height '%d'\n",
225  crop->w, crop->h);
226  return AVERROR(EINVAL);
227  }
228 
229  /* set default, required in the case the first computed value for x/y is NAN */
230  crop->x = (link->w - crop->w) / 2;
231  crop->y = (link->h - crop->h) / 2;
232  crop->x &= ~((1 << crop->hsub) - 1);
233  crop->y &= ~((1 << crop->vsub) - 1);
234  return 0;
235 
236 fail_expr:
237  av_log(NULL, AV_LOG_ERROR, "Error when evaluating the expression '%s'\n", expr);
238  return ret;
239 }
240 
242 {
243  CropContext *crop = link->src->priv;
244 
245  link->w = crop->w;
246  link->h = crop->h;
247  link->sample_aspect_ratio = crop->out_sar;
248 
249  return 0;
250 }
251 
253 {
254  AVFilterContext *ctx = link->dst;
255  CropContext *crop = ctx->priv;
256  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format);
257  int i;
258 
259  frame->width = crop->w;
260  frame->height = crop->h;
261 
262  crop->var_values[VAR_T] = frame->pts == AV_NOPTS_VALUE ?
263  NAN : frame->pts * av_q2d(link->time_base);
264  crop->var_values[VAR_POS] = av_frame_get_pkt_pos(frame) == -1 ?
265  NAN : av_frame_get_pkt_pos(frame);
266  crop->var_values[VAR_X] = av_expr_eval(crop->x_pexpr, crop->var_values, NULL);
267  crop->var_values[VAR_Y] = av_expr_eval(crop->y_pexpr, crop->var_values, NULL);
268  crop->var_values[VAR_X] = av_expr_eval(crop->x_pexpr, crop->var_values, NULL);
269 
270  normalize_double(&crop->x, crop->var_values[VAR_X]);
271  normalize_double(&crop->y, crop->var_values[VAR_Y]);
272 
273  if (crop->x < 0) crop->x = 0;
274  if (crop->y < 0) crop->y = 0;
275  if ((unsigned)crop->x + (unsigned)crop->w > link->w) crop->x = link->w - crop->w;
276  if ((unsigned)crop->y + (unsigned)crop->h > link->h) crop->y = link->h - crop->h;
277  crop->x &= ~((1 << crop->hsub) - 1);
278  crop->y &= ~((1 << crop->vsub) - 1);
279 
280  av_dlog(ctx, "n:%d t:%f pos:%f x:%d y:%d x+w:%d y+h:%d\n",
281  (int)crop->var_values[VAR_N], crop->var_values[VAR_T], crop->var_values[VAR_POS],
282  crop->x, crop->y, crop->x+crop->w, crop->y+crop->h);
283 
284  frame->data[0] += crop->y * frame->linesize[0];
285  frame->data[0] += crop->x * crop->max_step[0];
286 
287  if (!(desc->flags & PIX_FMT_PAL || desc->flags & PIX_FMT_PSEUDOPAL)) {
288  for (i = 1; i < 3; i ++) {
289  if (frame->data[i]) {
290  frame->data[i] += (crop->y >> crop->vsub) * frame->linesize[i];
291  frame->data[i] += (crop->x * crop->max_step[i]) >> crop->hsub;
292  }
293  }
294  }
295 
296  /* alpha plane */
297  if (frame->data[3]) {
298  frame->data[3] += crop->y * frame->linesize[3];
299  frame->data[3] += crop->x * crop->max_step[3];
300  }
301 
302  crop->var_values[VAR_N] += 1.0;
303 
304  return ff_filter_frame(link->dst->outputs[0], frame);
305 }
306 
307 #define OFFSET(x) offsetof(CropContext, x)
308 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
309 
310 static const AVOption crop_options[] = {
311  { "out_w", "set the width crop area expression", OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, CHAR_MIN, CHAR_MAX, FLAGS },
312  { "w", "set the width crop area expression", OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, CHAR_MIN, CHAR_MAX, FLAGS },
313  { "out_h", "set the height crop area expression", OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, CHAR_MIN, CHAR_MAX, FLAGS },
314  { "h", "set the height crop area expression", OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, CHAR_MIN, CHAR_MAX, FLAGS },
315  { "x", "set the x crop area expression", OFFSET(x_expr), AV_OPT_TYPE_STRING, {.str = "(in_w-out_w)/2"}, CHAR_MIN, CHAR_MAX, FLAGS },
316  { "y", "set the y crop area expression", OFFSET(y_expr), AV_OPT_TYPE_STRING, {.str = "(in_h-out_h)/2"}, CHAR_MIN, CHAR_MAX, FLAGS },
317  { "keep_aspect", "keep aspect ratio", OFFSET(keep_aspect), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS },
318  {NULL}
319 };
320 
322 
324  {
325  .name = "default",
326  .type = AVMEDIA_TYPE_VIDEO,
327  .filter_frame = filter_frame,
328  .get_video_buffer = ff_null_get_video_buffer,
329  .config_props = config_input,
330  },
331  { NULL }
332 };
333 
335  {
336  .name = "default",
337  .type = AVMEDIA_TYPE_VIDEO,
338  .config_props = config_output,
339  },
340  { NULL }
341 };
342 
344  .name = "crop",
345  .description = NULL_IF_CONFIG_SMALL("Crop the input video to width:height:x:y."),
346 
347  .priv_size = sizeof(CropContext),
348  .priv_class = &crop_class,
349 
351  .uninit = uninit,
352 
353  .inputs = avfilter_vf_crop_inputs,
354  .outputs = avfilter_vf_crop_outputs,
355 };
AVExpr * x_pexpr
Definition: vf_crop.c:91
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
#define FLAGS
Definition: vf_crop.c:308
AVOption.
Definition: opt.h:251
static int config_input(AVFilterLink *link)
Definition: vf_crop.c:151
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:73
misc image utilities
static const AVFilterPad outputs[]
Definition: af_ashowinfo.c:117
external API header
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:70
int num
numerator
Definition: rational.h:44
packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), little-endian, most significant bit to 0 ...
Definition: pixfmt.h:117
AVFrame * ff_null_get_video_buffer(AVFilterLink *link, int w, int h)
Definition: video.c:35
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
Definition: pixfmt.h:120
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
int av_expr_parse(AVExpr **expr, const char *s, const char *const *const_names, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), int log_offset, void *log_ctx)
Parse an expression.
Definition: eval.c:640
planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
Definition: pixfmt.h:128
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:66
AVFilterFormats * ff_make_format_list(const int *fmts)
Create a list of supported formats.
Definition: formats.c:308
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
Definition: pixfmt.h:115
set threshold d
Definition: vf_crop.c:63
packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
Definition: pixfmt.h:89
void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4], const AVPixFmtDescriptor *pixdesc)
Compute the max pixel step for each plane of an image with a format described by pixdesc.
Definition: imgutils.c:32
const char * name
Pad name.
AVFilterLink ** inputs
array of pointers to input links
Definition: avfilter.h:532
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition: pixfmt.h:105
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
int x
x offset of the non-cropped area with respect to the input area
Definition: vf_crop.c:80
8 bit with PIX_FMT_RGB32 palette
Definition: pixfmt.h:79
AVOptions.
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as lit...
Definition: pixfmt.h:112
int y
y offset of the non-cropped area with respect to the input area
Definition: vf_crop.c:81
static av_always_inline av_const int isnan(float x)
Definition: libm.h:96
int max_step[4]
max pixel step for each plane, expressed as a number of bytes
Definition: vf_crop.c:88
#define NAN
Definition: math.h:7
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:159
Definition: eval.c:140
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
Definition: pixfmt.h:114
static const AVFilterPad avfilter_vf_crop_outputs[]
Definition: vf_crop.c:334
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
Definition: pixfmt.h:98
static double av_q2d(AVRational a)
Convert rational to double.
Definition: rational.h:69
AVFilter avfilter_vf_crop
Definition: vf_crop.c:343
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of PIX_FMT_YUV440P and setting color_range ...
Definition: pixfmt.h:104
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_...
Definition: pixfmt.h:81
Definition: vf_crop.c:62
char * w_expr
Definition: vf_crop.c:90
static const AVFilterPad avfilter_vf_crop_inputs[]
Definition: vf_crop.c:323
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
frame
Definition: stft.m:14
A filter pad used for either input or output.
int hsub
Definition: vf_crop.c:89
int av_expr_parse_and_eval(double *d, const char *s, const char *const *const_names, const double *const_values, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), void *opaque, int log_offset, void *log_ctx)
Parse and evaluate an expression.
Definition: eval.c:701
int width
width and height of the video frame
Definition: frame.h:122
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:75
Definition: vf_crop.c:72
planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
Definition: pixfmt.h:133
double var_values[VAR_VARS_NB]
Definition: vf_crop.c:92
#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
void * priv
private data for use by the filter
Definition: avfilter.h:545
#define PIX_FMT_PAL
Pixel format has a palette in data[1], values are indexes in this palette.
Definition: pixdesc.h:90
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
static av_always_inline av_const double round(double x)
Definition: libm.h:162
planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
Definition: pixfmt.h:131
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
Definition: pixfmt.h:96
packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as lit...
Definition: pixfmt.h:143
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
Definition: pixfmt.h:97
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer 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 link
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:72
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:36
common internal API header
#define AV_LOG_VERBOSE
Definition: log.h:157
packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
Definition: pixfmt.h:92
var_name
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_...
Definition: pixfmt.h:80
char * x_expr
Definition: vf_crop.c:90
ret
Definition: avfilter.c:821
AVRational out_sar
output sample aspect ratio
Definition: vf_crop.c:85
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:71
#define OFFSET(x)
Definition: vf_crop.c:307
AVExpr * y_pexpr
Definition: vf_crop.c:91
static int query_formats(AVFilterContext *ctx)
Definition: vf_crop.c:95
char * h_expr
Definition: vf_crop.c:90
packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big...
Definition: pixfmt.h:142
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
Definition: pixfmt.h:119
int h
height of the cropped area
Definition: vf_crop.c:83
int vsub
chroma subsampling
Definition: vf_crop.c:89
NULL
Definition: eval.c:55
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
Definition: pixfmt.h:87
planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
Definition: pixfmt.h:129
Definition: vf_crop.c:70
void av_expr_free(AVExpr *e)
Free a parsed expression previously created with av_expr_parse().
Definition: eval.c:302
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
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
static av_cold void uninit(AVFilterContext *ctx)
Definition: vf_crop.c:128
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
Definition: vf_crop.c:61
Replacements for frequently missing libm functions.
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
Filter definition.
Definition: avfilter.h:436
Y , 16bpp, big-endian.
Definition: pixfmt.h:101
synthesis window for stochastic i
rational number numerator/denominator
Definition: rational.h:43
const char * name
filter name
Definition: avfilter.h:437
packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), little-endian, most significant bit to 1 ...
Definition: pixfmt.h:122
static const AVOption crop_options[]
Definition: vf_crop.c:310
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer 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.Buffer references ownership and permissions
AVFilterLink ** outputs
array of pointers to output links
Definition: avfilter.h:539
Definition: vf_crop.c:64
static const char *const var_names[]
Definition: vf_crop.c:42
packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), big-endian, most significant bit to 0 ...
Definition: pixfmt.h:116
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
Definition: pixfmt.h:132
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:68
Y , 8bpp.
Definition: pixfmt.h:76
static int normalize_double(int *n, double d)
Definition: vf_crop.c:136
static int config_output(AVFilterLink *link)
Definition: vf_crop.c:241
Definition: vf_crop.c:71
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big...
Definition: pixfmt.h:111
AVFILTER_DEFINE_CLASS(crop)
planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
Definition: pixfmt.h:130
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_...
Definition: pixfmt.h:82
packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
Definition: pixfmt.h:90
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:75
int den
denominator
Definition: rational.h:45
Definition: vf_crop.c:74
Definition: vf_crop.c:65
#define PIX_FMT_PSEUDOPAL
The pixel format is "pseudo-paletted".
Definition: pixdesc.h:100
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
Evaluate a previously parsed expression.
Definition: eval.c:691
Y , 16bpp, little-endian.
Definition: pixfmt.h:102
int keep_aspect
keep display aspect ratio when cropping
Definition: vf_crop.c:86
int64_t av_frame_get_pkt_pos(const AVFrame *frame)
An instance of a filter.
Definition: avfilter.h:524
packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), big-endian, most significant bit to 1 ...
Definition: pixfmt.h:121
int height
Definition: frame.h:122
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:103
int w
width of the cropped area
Definition: vf_crop.c:82
internal API functions
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
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:190
simple arithmetic expression evaluator
static int filter_frame(AVFilterLink *link, AVFrame *frame)
Definition: vf_crop.c:252
char * y_expr
Definition: vf_crop.c:90