FFmpeg
vf_tiltandshift.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 Vittorio Giovara
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 vf_tiltandshift.c
23  * Simple time and space inverter.
24  */
25 
26 #include <string.h>
27 
28 #include "libavutil/common.h"
29 #include "libavutil/imgutils.h"
30 #include "libavutil/opt.h"
31 #include "libavutil/pixdesc.h"
32 #include "libavutil/rational.h"
33 
34 #include "avfilter.h"
35 #include "formats.h"
36 #include "internal.h"
37 #include "video.h"
38 
44 };
45 
46 typedef struct TiltandshiftContext {
47  const AVClass *class;
48 
49  /* set when all input frames have been processed and we have to
50  * empty buffers, pad and then return */
51  int eof_recv;
52 
53  /* live or static sliding */
54  int tilt;
55 
56  /* initial or final actions to perform (pad/hold a frame/black/nothing) */
59 
60  /* columns to hold or pad at the beginning or at the end (respectively) */
61  int hold;
62  int pad;
63 
64  /* buffers for black columns */
65  uint8_t *black_buffers[4];
67 
68  /* list containing all input frames */
69  size_t input_size;
72 
75 
77 {
78  if (s->input == NULL) {
79  s->input = frame;
80  } else {
81  AVFrame *head = s->input;
82  while (head->opaque)
83  head = head->opaque;
84  head->opaque = frame;
85  }
86  s->input_size++;
87  return 0;
88 }
89 
91 {
92  AVFrame *head = s->input;
93  if (head) {
94  s->input = head->opaque;
95  av_frame_free(&head);
96  }
97  s->input_size--;
98 }
99 
100 static const enum AVPixelFormat pix_fmts[] = {
106 };
107 
109 {
110  TiltandshiftContext *s = ctx->priv;
111  while (s->input)
113  av_freep(&s->black_buffers);
114 }
115 
116 static int config_props(AVFilterLink *outlink)
117 {
118  AVFilterContext *ctx = outlink->src;
119  TiltandshiftContext *s = ctx->priv;
120 
121  outlink->w = ctx->inputs[0]->w;
122  outlink->h = ctx->inputs[0]->h;
123  outlink->format = ctx->inputs[0]->format;
124 
125  // when we have to pad black or a frame at the start, skip navigating
126  // the list and use either the frame or black for the requested value
127  if (s->start != TILT_NONE && !s->hold)
128  s->hold = outlink->w;
129 
130  // Init black buffers if we pad with black at the start or at the end.
131  // For the end, we always have to init on NONE and BLACK because we never
132  // know if there are going to be enough input frames to fill an output one.
133  if (s->start == TILT_BLACK || s->end != TILT_FRAME) {
134  int i, j, ret;
135  uint8_t black_data[] = { 0x10, 0x80, 0x80, 0x10 };
137  if (!desc)
138  return AVERROR_BUG;
139 
140  if (outlink->format == AV_PIX_FMT_YUVJ420P ||
141  outlink->format == AV_PIX_FMT_YUVJ422P ||
142  outlink->format == AV_PIX_FMT_YUVJ444P ||
143  outlink->format == AV_PIX_FMT_YUVJ440P ||
144  outlink->color_range == AVCOL_RANGE_JPEG)
145  black_data[0] = black_data[3] = 0;
146 
147  ret = av_image_alloc(s->black_buffers, s->black_linesizes, 1,
148  outlink->h, outlink->format, 1);
149  if (ret < 0)
150  return ret;
151 
152  for (i = 0; i < FFMIN(desc->nb_components, 4); i++)
153  for (j = 0; j < (!i ? outlink->h
154  : -((-outlink->h) >> desc->log2_chroma_h)); j++)
155  memset(s->black_buffers[i] + j * s->black_linesizes[i],
156  black_data[i], 1);
157 
158  av_log(ctx, AV_LOG_VERBOSE, "Padding buffers initialized.\n");
159  }
160 
161  s->desc = av_pix_fmt_desc_get(outlink->format);
162  if (!s->desc)
163  return AVERROR_BUG;
164 
165  return 0;
166 }
167 
168 
169 static void copy_column(AVFilterLink *outlink,
170  uint8_t *dst_data[4], int dst_linesizes[4],
171  const uint8_t *src_data[4], const int src_linesizes[4],
172  int ncol, int tilt)
173 {
174  AVFilterContext *ctx = outlink->src;
175  TiltandshiftContext *s = ctx->priv;
176  uint8_t *dst[4];
177  const uint8_t *src[4];
178 
179  dst[0] = dst_data[0] + ncol;
180  dst[1] = dst_data[1] + (ncol >> s->desc->log2_chroma_w);
181  dst[2] = dst_data[2] + (ncol >> s->desc->log2_chroma_w);
182 
183  if (!tilt)
184  ncol = 0;
185  src[0] = src_data[0] + ncol;
186  src[1] = src_data[1] + (ncol >> s->desc->log2_chroma_w);
187  src[2] = src_data[2] + (ncol >> s->desc->log2_chroma_w);
188 
189  av_image_copy(dst, dst_linesizes, src, src_linesizes, outlink->format, 1, outlink->h);
190 }
191 
192 static int output_frame(AVFilterLink *outlink)
193 {
194  TiltandshiftContext *s = outlink->src->priv;
195  AVFrame *head;
196  int ret;
197 
198  int ncol = 0;
199  AVFrame *dst = ff_get_video_buffer(outlink, outlink->w, outlink->h);
200  if (!dst)
201  return AVERROR(ENOMEM);
202 
203  // in case we have to do any initial black padding
204  if (s->start == TILT_BLACK) {
205  for ( ; ncol < s->hold; ncol++)
206  copy_column(outlink, dst->data, dst->linesize,
207  (const uint8_t **)s->black_buffers, s->black_linesizes,
208  ncol, 0);
209  }
210 
211  head = s->input;
212  // copy a column from each input frame
213  for ( ; ncol < s->input_size; ncol++) {
214  AVFrame *src = head;
215 
216  copy_column(outlink, dst->data, dst->linesize,
217  (const uint8_t **)src->data, src->linesize,
218  ncol, s->tilt);
219 
220  // keep track of the last known frame in case we need it below
221  s->prev = head;
222  // advance to the next frame unless we have to hold it
223  if (s->hold <= ncol)
224  head = head->opaque;
225  }
226 
227  // pad any remaining space with black or last frame
228  if (s->end == TILT_FRAME) {
229  for ( ; ncol < outlink->w; ncol++)
230  copy_column(outlink, dst->data, dst->linesize,
231  (const uint8_t **)s->prev->data,
232  s->prev->linesize, ncol, 1);
233  } else { // TILT_BLACK and TILT_NONE
234  for ( ; ncol < outlink->w; ncol++)
235  copy_column(outlink, dst->data, dst->linesize,
236  (const uint8_t **)s->black_buffers, s->black_linesizes,
237  ncol, 0);
238  }
239 
240  // set correct timestamps and props as long as there is proper input
241  ret = av_frame_copy_props(dst, s->input);
242  if (ret < 0) {
243  av_frame_free(&dst);
244  return ret;
245  }
246 
247  // discard frame at the top of the list since it has been fully processed
249  // and it is safe to reduce the hold value (even if unused)
250  s->hold--;
251 
252  // output
253  return ff_filter_frame(outlink, dst);
254 }
255 
256 // This function just polls for new frames and queues them on a list
258 {
259  AVFilterLink *outlink = inlink->dst->outputs[0];
260  AVFilterContext *ctx = outlink->src;
261  TiltandshiftContext *s = inlink->dst->priv;
262 
263  int ret = list_add_frame(s, frame);
264  if (ret < 0) {
265  return ret;
266  }
267 
268  // load up enough frames to fill a frame and keep the queue filled on subsequent
269  // calls, until we receive EOF, and then we either pad or end
270  if (!s->eof_recv && s->input_size < outlink->w - s->pad) {
271  av_log(ctx, AV_LOG_DEBUG, "Not enough frames in the list (%zu/%d), waiting for more.\n", s->input_size, outlink->w - s->pad);
272  return 0;
273  }
274 
275  return output_frame(outlink);
276 }
277 
278 static int request_frame(AVFilterLink *outlink)
279 {
280  AVFilterContext *ctx = outlink->src;
281  TiltandshiftContext *s = ctx->priv;
282  int ret;
283 
284  // signal job finished when list is empty or when padding is either
285  // limited or disabled and eof was received
286  if ((s->input_size <= 0 || s->input_size == outlink->w - s->pad || s->end == TILT_NONE) && s->eof_recv) {
287  return AVERROR_EOF;
288  }
289 
290  ret = ff_request_frame(ctx->inputs[0]);
291  if (ret == AVERROR_EOF) {
292  s->eof_recv = 1;
293  } else if (ret < 0) {
294  return ret;
295  }
296 
297  if (s->eof_recv) {
298  while (s->input_size) {
299  av_log(ctx, AV_LOG_DEBUG, "Emptying buffers (%zu/%d).\n", s->input_size, outlink->w - s->pad);
300  ret = output_frame(outlink);
301  if (ret < 0) {
302  return ret;
303  }
304  }
305  }
306 
307  return 0;
308 }
309 
310 #define OFFSET(x) offsetof(TiltandshiftContext, x)
311 #define V AV_OPT_FLAG_VIDEO_PARAM
312 static const AVOption tiltandshift_options[] = {
313  { "tilt", "Tilt the video horizontally while shifting", OFFSET(tilt), AV_OPT_TYPE_INT,
314  { .i64 = 1 }, 0, 1, .flags = V, .unit = "tilt" },
315 
316  { "start", "Action at the start of input", OFFSET(start), AV_OPT_TYPE_INT,
317  { .i64 = TILT_NONE }, 0, TILT_OPT_MAX, .flags = V, .unit = "start" },
318  { "none", "Start immediately (default)", 0, AV_OPT_TYPE_CONST,
319  { .i64 = TILT_NONE }, INT_MIN, INT_MAX, .flags = V, .unit = "start" },
320  { "frame", "Use the first frames", 0, AV_OPT_TYPE_CONST,
321  { .i64 = TILT_FRAME }, INT_MIN, INT_MAX, .flags = V, .unit = "start" },
322  { "black", "Fill with black", 0, AV_OPT_TYPE_CONST,
323  { .i64 = TILT_BLACK }, INT_MIN, INT_MAX, .flags = V, .unit = "start" },
324 
325  { "end", "Action at the end of input", OFFSET(end), AV_OPT_TYPE_INT,
326  { .i64 = TILT_NONE }, 0, TILT_OPT_MAX, .flags = V, .unit = "end" },
327  { "none", "Do not pad at the end (default)", 0, AV_OPT_TYPE_CONST,
328  { .i64 = TILT_NONE }, INT_MIN, INT_MAX, .flags = V, .unit = "end" },
329  { "frame", "Use the last frame", 0, AV_OPT_TYPE_CONST,
330  { .i64 = TILT_FRAME }, INT_MIN, INT_MAX, .flags = V, .unit = "end" },
331  { "black", "Fill with black", 0, AV_OPT_TYPE_CONST,
332  { .i64 = TILT_BLACK }, INT_MIN, INT_MAX, .flags = V, .unit = "end" },
333 
334  { "hold", "Number of columns to hold at the start of the video", OFFSET(hold), AV_OPT_TYPE_INT,
335  { .i64 = 0 }, 0, INT_MAX, .flags = V, .unit = "hold" },
336  { "pad", "Number of columns to pad at the end of the video", OFFSET(pad), AV_OPT_TYPE_INT,
337  { .i64 = 0 }, 0, INT_MAX, .flags = V, .unit = "pad" },
338 
339  { NULL },
340 };
341 
342 AVFILTER_DEFINE_CLASS(tiltandshift);
343 
345  {
346  .name = "in",
347  .type = AVMEDIA_TYPE_VIDEO,
348  .filter_frame = filter_frame,
349  },
350 };
351 
353  {
354  .name = "out",
355  .type = AVMEDIA_TYPE_VIDEO,
356  .config_props = config_props,
357  .request_frame = request_frame,
358  },
359 };
360 
362  .name = "tiltandshift",
363  .description = NULL_IF_CONFIG_SMALL("Generate a tilt-and-shift'd video."),
364  .priv_size = sizeof(TiltandshiftContext),
365  .priv_class = &tiltandshift_class,
366  .uninit = uninit,
370 };
ff_get_video_buffer
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition: video.c:112
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
TILT_NONE
@ TILT_NONE
Definition: vf_tiltandshift.c:40
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
tiltandshift_inputs
static const AVFilterPad tiltandshift_inputs[]
Definition: vf_tiltandshift.c:344
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1018
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2962
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
FILTER_PIXFMTS_ARRAY
#define FILTER_PIXFMTS_ARRAY(array)
Definition: internal.h:162
rational.h
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
TiltandshiftContext
Definition: vf_tiltandshift.c:46
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:130
AVFrame::opaque
void * opaque
Frame owner's private data.
Definition: frame.h:492
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:344
pixdesc.h
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:683
AVOption
AVOption.
Definition: opt.h:346
V
#define V
Definition: vf_tiltandshift.c:311
ff_request_frame
int ff_request_frame(AVFilterLink *link)
Request an input frame from the filter at the other end of the link.
Definition: avfilter.c:462
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
list_remove_head
static void list_remove_head(TiltandshiftContext *s)
Definition: vf_tiltandshift.c:90
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:170
uninit
static av_cold void uninit(AVFilterContext *ctx)
Definition: vf_tiltandshift.c:108
video.h
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:365
formats.h
TILT_BLACK
@ TILT_BLACK
Definition: vf_tiltandshift.c:42
AVFilterContext::priv
void * priv
private data for use by the filter
Definition: avfilter.h:422
AVFilterPad
A filter pad used for either input or output.
Definition: internal.h:33
TILT_OPT_MAX
@ TILT_OPT_MAX
Definition: vf_tiltandshift.c:43
av_cold
#define av_cold
Definition: attributes.h:90
OFFSET
#define OFFSET(x)
Definition: vf_tiltandshift.c:310
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
s
#define s(width, name)
Definition: cbs_vp9.c:198
filter_frame
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
Definition: vf_tiltandshift.c:257
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
ctx
AVFormatContext * ctx
Definition: movenc.c:48
ff_vf_tiltandshift
const AVFilter ff_vf_tiltandshift
Definition: vf_tiltandshift.c:361
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
FILTER_INPUTS
#define FILTER_INPUTS(array)
Definition: internal.h:182
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
frame
static AVFrame * frame
Definition: demux_decode.c:54
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
av_frame_copy_props
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:679
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
request_frame
static int request_frame(AVFilterLink *outlink)
Definition: vf_tiltandshift.c:278
tiltandshift_outputs
static const AVFilterPad tiltandshift_outputs[]
Definition: vf_tiltandshift.c:352
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: vf_tiltandshift.c:100
av_image_alloc
int av_image_alloc(uint8_t *pointers[4], int linesizes[4], int w, int h, enum AVPixelFormat pix_fmt, int align)
Allocate an image with size w and h and pixel format pix_fmt, and fill pointers and linesizes accordi...
Definition: imgutils.c:218
TiltandshiftContext::tilt
int tilt
Definition: vf_tiltandshift.c:54
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:106
TiltandshiftContext::start
enum PaddingOption start
Definition: vf_tiltandshift.c:57
TiltandshiftContext::desc
const AVPixFmtDescriptor * desc
Definition: vf_tiltandshift.c:73
TiltandshiftContext::hold
int hold
Definition: vf_tiltandshift.c:61
internal.h
config_props
static int config_props(AVFilterLink *outlink)
Definition: vf_tiltandshift.c:116
TiltandshiftContext::pad
int pad
Definition: vf_tiltandshift.c:62
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
common.h
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: internal.h:39
tiltandshift_options
static const AVOption tiltandshift_options[]
Definition: vf_tiltandshift.c:312
TILT_FRAME
@ TILT_FRAME
Definition: vf_tiltandshift.c:41
AVFilter
Filter definition.
Definition: avfilter.h:166
list_add_frame
static int list_add_frame(TiltandshiftContext *s, AVFrame *frame)
Definition: vf_tiltandshift.c:76
ret
ret
Definition: filter_design.txt:187
TiltandshiftContext::prev
AVFrame * prev
Definition: vf_tiltandshift.c:71
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:235
avfilter.h
TiltandshiftContext::end
enum PaddingOption end
Definition: vf_tiltandshift.c:58
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
AVFilterContext
An instance of a filter.
Definition: avfilter.h:407
desc
const char * desc
Definition: libsvtav1.c:75
output_frame
static int output_frame(AVFilterLink *outlink)
Definition: vf_tiltandshift.c:192
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
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
TiltandshiftContext::input
AVFrame * input
Definition: vf_tiltandshift.c:70
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: internal.h:183
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
PaddingOption
PaddingOption
Definition: vf_tiltandshift.c:39
imgutils.h
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:389
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
copy_column
static void copy_column(AVFilterLink *outlink, uint8_t *dst_data[4], int dst_linesizes[4], const uint8_t *src_data[4], const int src_linesizes[4], int ncol, int tilt)
Definition: vf_tiltandshift.c:169
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
TiltandshiftContext::black_buffers
uint8_t * black_buffers[4]
Definition: vf_tiltandshift.c:65
TiltandshiftContext::eof_recv
int eof_recv
Definition: vf_tiltandshift.c:51
av_image_copy
void av_image_copy(uint8_t *const dst_data[4], const int dst_linesizes[4], const uint8_t *const src_data[4], const int src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height)
Copy image in src_data to dst_data.
Definition: imgutils.c:422
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:244
TiltandshiftContext::input_size
size_t input_size
Definition: vf_tiltandshift.c:69
AVFILTER_DEFINE_CLASS
AVFILTER_DEFINE_CLASS(tiltandshift)
TiltandshiftContext::black_linesizes
int black_linesizes[4]
Definition: vf_tiltandshift.c:66