FFmpeg
vf_tinterlace.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Thomas Mundt <tmundt75@gmail.com>
3  * Copyright (c) 2011 Stefano Sabatini
4  * Copyright (c) 2010 Baptiste Coudurier
5  * Copyright (c) 2003 Michael Zucchi <notzed@ximian.com>
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with FFmpeg if not, write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22  */
23 
24 /**
25  * @file
26  * temporal field interlace filter, ported from MPlayer/libmpcodecs
27  */
28 
29 #include "libavutil/mem.h"
30 #include "libavutil/opt.h"
31 #include "libavutil/imgutils.h"
32 #include "libavutil/avassert.h"
33 #include "avfilter.h"
34 #include "internal.h"
35 #include "tinterlace.h"
36 #include "video.h"
37 
38 #define OFFSET(x) offsetof(TInterlaceContext, x)
39 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
40 
41 static const AVOption tinterlace_options[] = {
42  {"mode", "select interlace mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=MODE_MERGE}, 0, MODE_NB-1, FLAGS, .unit = "mode"},
43  {"merge", "merge fields", 0, AV_OPT_TYPE_CONST, {.i64=MODE_MERGE}, INT_MIN, INT_MAX, FLAGS, .unit = "mode"},
44  {"drop_even", "drop even fields", 0, AV_OPT_TYPE_CONST, {.i64=MODE_DROP_EVEN}, INT_MIN, INT_MAX, FLAGS, .unit = "mode"},
45  {"drop_odd", "drop odd fields", 0, AV_OPT_TYPE_CONST, {.i64=MODE_DROP_ODD}, INT_MIN, INT_MAX, FLAGS, .unit = "mode"},
46  {"pad", "pad alternate lines with black", 0, AV_OPT_TYPE_CONST, {.i64=MODE_PAD}, INT_MIN, INT_MAX, FLAGS, .unit = "mode"},
47  {"interleave_top", "interleave top and bottom fields", 0, AV_OPT_TYPE_CONST, {.i64=MODE_INTERLEAVE_TOP}, INT_MIN, INT_MAX, FLAGS, .unit = "mode"},
48  {"interleave_bottom", "interleave bottom and top fields", 0, AV_OPT_TYPE_CONST, {.i64=MODE_INTERLEAVE_BOTTOM}, INT_MIN, INT_MAX, FLAGS, .unit = "mode"},
49  {"interlacex2", "interlace fields from two consecutive frames", 0, AV_OPT_TYPE_CONST, {.i64=MODE_INTERLACEX2}, INT_MIN, INT_MAX, FLAGS, .unit = "mode"},
50  {"mergex2", "merge fields keeping same frame rate", 0, AV_OPT_TYPE_CONST, {.i64=MODE_MERGEX2}, INT_MIN, INT_MAX, FLAGS, .unit = "mode"},
51 
52  {"flags", "set flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, INT_MAX, 0, .unit = "flags" },
53  {"low_pass_filter", "enable vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_VLPF}, INT_MIN, INT_MAX, FLAGS, .unit = "flags" },
54  {"vlpf", "enable vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_VLPF}, INT_MIN, INT_MAX, FLAGS, .unit = "flags" },
55  {"complex_filter", "enable complex vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_CVLPF},INT_MIN, INT_MAX, FLAGS, .unit = "flags" },
56  {"cvlpf", "enable complex vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_CVLPF},INT_MIN, INT_MAX, FLAGS, .unit = "flags" },
57  {"exact_tb", "force a timebase which can represent timestamps exactly", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_EXACT_TB}, INT_MIN, INT_MAX, FLAGS, .unit = "flags" },
58  {"bypass_il", "bypass already interlaced frames", 0, AV_OPT_TYPE_CONST, {.i64 = TINTERLACE_FLAG_BYPASS_IL}, INT_MIN, INT_MAX, FLAGS, .unit = "flags" },
59 
60  {NULL}
61 };
62 
63 AVFILTER_DEFINE_CLASS(tinterlace);
64 
65 static const AVOption interlace_options[] = {
66  { "scan", "scanning mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64 = MODE_TFF}, 0, 1, FLAGS, .unit = "mode"},
67  { "tff", "top field first", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_TFF}, INT_MIN, INT_MAX, FLAGS, .unit = "mode"},
68  { "bff", "bottom field first", 0, AV_OPT_TYPE_CONST, {.i64 = MODE_BFF}, INT_MIN, INT_MAX, FLAGS, .unit = "mode"},
69  { "lowpass", "set vertical low-pass filter", OFFSET(lowpass), AV_OPT_TYPE_INT, {.i64 = VLPF_LIN}, 0, 2, FLAGS, .unit = "lowpass" },
70  { "off", "disable vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = VLPF_OFF}, INT_MIN, INT_MAX, FLAGS, .unit = "lowpass" },
71  { "linear", "linear vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = VLPF_LIN}, INT_MIN, INT_MAX, FLAGS, .unit = "lowpass" },
72  { "complex", "complex vertical low-pass filter", 0, AV_OPT_TYPE_CONST, {.i64 = VLPF_CMP}, INT_MIN, INT_MAX, FLAGS, .unit = "lowpass" },
73 
74  { NULL }
75 };
76 
77 AVFILTER_DEFINE_CLASS(interlace);
78 
79 #define FULL_SCALE_YUVJ_FORMATS \
80  AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P
81 
82 static const enum AVPixelFormat full_scale_yuvj_pix_fmts[] = {
84 };
85 
86 static const AVRational standard_tbs[] = {
87  {1, 25},
88  {1, 30},
89  {1001, 30000},
90 };
91 
92 static const enum AVPixelFormat pix_fmts[] = {
104 };
105 
106 static void lowpass_line_c(uint8_t *dstp, ptrdiff_t width, const uint8_t *srcp,
107  ptrdiff_t mref, ptrdiff_t pref, int clip_max)
108 {
109  const uint8_t *srcp_above = srcp + mref;
110  const uint8_t *srcp_below = srcp + pref;
111  int i;
112  for (i = 0; i < width; i++) {
113  // this calculation is an integer representation of
114  // '0.5 * current + 0.25 * above + 0.25 * below'
115  // '1 +' is for rounding.
116  dstp[i] = (1 + srcp[i] + srcp[i] + srcp_above[i] + srcp_below[i]) >> 2;
117  }
118 }
119 
120 static void lowpass_line_c_16(uint8_t *dst8, ptrdiff_t width, const uint8_t *src8,
121  ptrdiff_t mref, ptrdiff_t pref, int clip_max)
122 {
123  uint16_t *dstp = (uint16_t *)dst8;
124  const uint16_t *srcp = (const uint16_t *)src8;
125  const uint16_t *srcp_above = srcp + mref / 2;
126  const uint16_t *srcp_below = srcp + pref / 2;
127  int i, src_x;
128  for (i = 0; i < width; i++) {
129  // this calculation is an integer representation of
130  // '0.5 * current + 0.25 * above + 0.25 * below'
131  // '1 +' is for rounding.
132  src_x = av_le2ne16(srcp[i]) << 1;
133  dstp[i] = av_le2ne16((1 + src_x + av_le2ne16(srcp_above[i])
134  + av_le2ne16(srcp_below[i])) >> 2);
135  }
136 }
137 
138 static void lowpass_line_complex_c(uint8_t *dstp, ptrdiff_t width, const uint8_t *srcp,
139  ptrdiff_t mref, ptrdiff_t pref, int clip_max)
140 {
141  const uint8_t *srcp_above = srcp + mref;
142  const uint8_t *srcp_below = srcp + pref;
143  const uint8_t *srcp_above2 = srcp + mref * 2;
144  const uint8_t *srcp_below2 = srcp + pref * 2;
145  int i, src_x, src_ab;
146  for (i = 0; i < width; i++) {
147  // this calculation is an integer representation of
148  // '0.75 * current + 0.25 * above + 0.25 * below - 0.125 * above2 - 0.125 * below2'
149  // '4 +' is for rounding.
150  src_x = srcp[i] << 1;
151  src_ab = srcp_above[i] + srcp_below[i];
152  dstp[i] = av_clip_uint8((4 + ((srcp[i] + src_x + src_ab) << 1)
153  - srcp_above2[i] - srcp_below2[i]) >> 3);
154  // Prevent over-sharpening:
155  // dst must not exceed src when the average of above and below
156  // is less than src. And the other way around.
157  if (src_ab > src_x) {
158  if (dstp[i] < srcp[i])
159  dstp[i] = srcp[i];
160  } else if (dstp[i] > srcp[i])
161  dstp[i] = srcp[i];
162  }
163 }
164 
165 static void lowpass_line_complex_c_16(uint8_t *dst8, ptrdiff_t width, const uint8_t *src8,
166  ptrdiff_t mref, ptrdiff_t pref, int clip_max)
167 {
168  uint16_t *dstp = (uint16_t *)dst8;
169  const uint16_t *srcp = (const uint16_t *)src8;
170  const uint16_t *srcp_above = srcp + mref / 2;
171  const uint16_t *srcp_below = srcp + pref / 2;
172  const uint16_t *srcp_above2 = srcp + mref;
173  const uint16_t *srcp_below2 = srcp + pref;
174  int i, dst_le, src_le, src_x, src_ab;
175  for (i = 0; i < width; i++) {
176  // this calculation is an integer representation of
177  // '0.75 * current + 0.25 * above + 0.25 * below - 0.125 * above2 - 0.125 * below2'
178  // '4 +' is for rounding.
179  src_le = av_le2ne16(srcp[i]);
180  src_x = src_le << 1;
181  src_ab = av_le2ne16(srcp_above[i]) + av_le2ne16(srcp_below[i]);
182  dst_le = av_clip((4 + ((src_le + src_x + src_ab) << 1)
183  - av_le2ne16(srcp_above2[i])
184  - av_le2ne16(srcp_below2[i])) >> 3, 0, clip_max);
185  // Prevent over-sharpening:
186  // dst must not exceed src when the average of above and below
187  // is less than src. And the other way around.
188  if (src_ab > src_x) {
189  if (dst_le < src_le)
190  dstp[i] = av_le2ne16(src_le);
191  else
192  dstp[i] = av_le2ne16(dst_le);
193  } else if (dst_le > src_le) {
194  dstp[i] = av_le2ne16(src_le);
195  } else
196  dstp[i] = av_le2ne16(dst_le);
197  }
198 }
199 
201 {
202  TInterlaceContext *tinterlace = ctx->priv;
203 
204  av_frame_free(&tinterlace->cur );
205  av_frame_free(&tinterlace->next);
206  av_freep(&tinterlace->black_data[0][0]);
207  av_freep(&tinterlace->black_data[1][0]);
208  ff_ccfifo_uninit(&tinterlace->cc_fifo);
209 }
210 
211 static int config_out_props(AVFilterLink *outlink)
212 {
213  AVFilterContext *ctx = outlink->src;
214  AVFilterLink *inlink = outlink->src->inputs[0];
216  TInterlaceContext *tinterlace = ctx->priv;
217  int ret, i;
218 
219  tinterlace->vsub = desc->log2_chroma_h;
220  outlink->w = inlink->w;
221  outlink->h = tinterlace->mode == MODE_MERGE || tinterlace->mode == MODE_PAD || tinterlace->mode == MODE_MERGEX2?
222  inlink->h*2 : inlink->h;
223  if (tinterlace->mode == MODE_MERGE || tinterlace->mode == MODE_PAD || tinterlace->mode == MODE_MERGEX2)
224  outlink->sample_aspect_ratio = av_mul_q(inlink->sample_aspect_ratio,
225  av_make_q(2, 1));
226 
227  if (tinterlace->mode == MODE_PAD) {
228  uint8_t black[4] = { 0, 0, 0, 16 };
229  ff_draw_init2(&tinterlace->draw, outlink->format, outlink->colorspace, outlink->color_range, 0);
230  ff_draw_color(&tinterlace->draw, &tinterlace->color, black);
231  /* limited range */
232  if (!ff_fmt_is_in(outlink->format, full_scale_yuvj_pix_fmts)) {
233  ret = av_image_alloc(tinterlace->black_data[0], tinterlace->black_linesize,
234  outlink->w, outlink->h, outlink->format, 16);
235  if (ret < 0)
236  return ret;
237  ff_fill_rectangle(&tinterlace->draw, &tinterlace->color, tinterlace->black_data[0],
238  tinterlace->black_linesize, 0, 0, outlink->w, outlink->h);
239  }
240  /* full range */
241  tinterlace->color.comp[0].u8[0] = 0;
242  ret = av_image_alloc(tinterlace->black_data[1], tinterlace->black_linesize,
243  outlink->w, outlink->h, outlink->format, 16);
244  if (ret < 0)
245  return ret;
246  ff_fill_rectangle(&tinterlace->draw, &tinterlace->color, tinterlace->black_data[1],
247  tinterlace->black_linesize, 0, 0, outlink->w, outlink->h);
248  }
249  if (tinterlace->flags & (TINTERLACE_FLAG_VLPF | TINTERLACE_FLAG_CVLPF)
250  && !(tinterlace->mode == MODE_INTERLEAVE_TOP
251  || tinterlace->mode == MODE_INTERLEAVE_BOTTOM)) {
252  av_log(ctx, AV_LOG_WARNING, "low_pass_filter flags ignored with mode %d\n",
253  tinterlace->mode);
255  }
256  tinterlace->preout_time_base = inlink->time_base;
257  if (tinterlace->mode == MODE_INTERLACEX2) {
258  tinterlace->preout_time_base.den *= 2;
259  outlink->frame_rate = av_mul_q(inlink->frame_rate, (AVRational){2,1});
260  outlink->time_base = av_mul_q(inlink->time_base , (AVRational){1,2});
261  } else if (tinterlace->mode == MODE_MERGEX2) {
262  outlink->frame_rate = inlink->frame_rate;
263  outlink->time_base = inlink->time_base;
264  } else if (tinterlace->mode != MODE_PAD) {
265  outlink->frame_rate = av_mul_q(inlink->frame_rate, (AVRational){1,2});
266  outlink->time_base = av_mul_q(inlink->time_base , (AVRational){2,1});
267  }
268 
269  for (i = 0; i<FF_ARRAY_ELEMS(standard_tbs); i++){
270  if (!av_cmp_q(standard_tbs[i], outlink->time_base))
271  break;
272  }
273  if (i == FF_ARRAY_ELEMS(standard_tbs) ||
274  (tinterlace->flags & TINTERLACE_FLAG_EXACT_TB))
275  outlink->time_base = tinterlace->preout_time_base;
276 
277  tinterlace->csp = av_pix_fmt_desc_get(outlink->format);
278  if (tinterlace->flags & TINTERLACE_FLAG_CVLPF) {
279  if (tinterlace->csp->comp[0].depth > 8)
281  else
282  tinterlace->lowpass_line = lowpass_line_complex_c;
283 #if ARCH_X86
284  ff_tinterlace_init_x86(tinterlace);
285 #endif
286  } else if (tinterlace->flags & TINTERLACE_FLAG_VLPF) {
287  if (tinterlace->csp->comp[0].depth > 8)
288  tinterlace->lowpass_line = lowpass_line_c_16;
289  else
290  tinterlace->lowpass_line = lowpass_line_c;
291 #if ARCH_X86
292  ff_tinterlace_init_x86(tinterlace);
293 #endif
294  }
295 
296  ret = ff_ccfifo_init(&tinterlace->cc_fifo, outlink->frame_rate, ctx);
297  if (ret < 0) {
298  av_log(ctx, AV_LOG_ERROR, "Failure to setup CC FIFO queue\n");
299  return ret;
300  }
301 
302  av_log(ctx, AV_LOG_VERBOSE, "mode:%d filter:%s h:%d -> h:%d\n", tinterlace->mode,
303  (tinterlace->flags & TINTERLACE_FLAG_CVLPF) ? "complex" :
304  (tinterlace->flags & TINTERLACE_FLAG_VLPF) ? "linear" : "off",
305  inlink->h, outlink->h);
306 
307  return 0;
308 }
309 
310 #define FIELD_UPPER 0
311 #define FIELD_LOWER 1
312 #define FIELD_UPPER_AND_LOWER 2
313 
314 /**
315  * Copy picture field from src to dst.
316  *
317  * @param src_field copy from upper, lower field or both
318  * @param interleave leave a padding line between each copied line
319  * @param dst_field copy to upper or lower field,
320  * only meaningful when interleave is selected
321  * @param flags context flags
322  */
323 static inline
325  uint8_t *dst[4], int dst_linesize[4],
326  const uint8_t *src[4], int src_linesize[4],
327  enum AVPixelFormat format, int w, int src_h,
328  int src_field, int interleave, int dst_field,
329  int flags)
330 {
332  int hsub = desc->log2_chroma_w;
333  int plane, vsub = desc->log2_chroma_h;
334  int k = src_field == FIELD_UPPER_AND_LOWER ? 1 : 2;
335  int h;
336 
337  for (plane = 0; plane < desc->nb_components; plane++) {
338  int lines = plane == 1 || plane == 2 ? AV_CEIL_RSHIFT(src_h, vsub) : src_h;
339  int cols = plane == 1 || plane == 2 ? AV_CEIL_RSHIFT( w, hsub) : w;
340  uint8_t *dstp = dst[plane];
341  const uint8_t *srcp = src[plane];
342  int srcp_linesize = src_linesize[plane] * k;
343  int dstp_linesize = dst_linesize[plane] * (interleave ? 2 : 1);
344  int clip_max = (1 << tinterlace->csp->comp[plane].depth) - 1;
345 
346  lines = (lines + (src_field == FIELD_UPPER)) / k;
347  if (src_field == FIELD_LOWER)
348  srcp += src_linesize[plane];
349  if (interleave && dst_field == FIELD_LOWER)
350  dstp += dst_linesize[plane];
351  // Low-pass filtering is required when creating an interlaced destination from
352  // a progressive source which contains high-frequency vertical detail.
353  // Filtering will reduce interlace 'twitter' and Moire patterning.
355  int x = !!(flags & TINTERLACE_FLAG_CVLPF);
356  for (h = lines; h > 0; h--) {
357  ptrdiff_t pref = src_linesize[plane];
358  ptrdiff_t mref = -pref;
359  if (h >= (lines - x)) mref = 0; // there is no line above
360  else if (h <= (1 + x)) pref = 0; // there is no line below
361 
362  tinterlace->lowpass_line(dstp, cols, srcp, mref, pref, clip_max);
363  dstp += dstp_linesize;
364  srcp += srcp_linesize;
365  }
366  } else {
367  if (tinterlace->csp->comp[plane].depth > 8)
368  cols *= 2;
369  av_image_copy_plane(dstp, dstp_linesize, srcp, srcp_linesize, cols, lines);
370  }
371  }
372 }
373 
375 {
376  AVFilterContext *ctx = inlink->dst;
377  AVFilterLink *outlink = ctx->outputs[0];
378  TInterlaceContext *tinterlace = ctx->priv;
379  AVFrame *cur, *next, *out;
380  int field, tff, full, ret;
381 
382  av_frame_free(&tinterlace->cur);
383  tinterlace->cur = tinterlace->next;
384  tinterlace->next = picref;
385 
386  ff_ccfifo_extract(&tinterlace->cc_fifo, picref);
387 
388  cur = tinterlace->cur;
389  next = tinterlace->next;
390  /* we need at least two frames */
391  if (!tinterlace->cur)
392  return 0;
393 
394  switch (tinterlace->mode) {
395  case MODE_MERGEX2: /* move the odd frame into the upper field of the new image, even into
396  * the lower field, generating a double-height video at same framerate */
397  case MODE_MERGE: /* move the odd frame into the upper field of the new image, even into
398  * the lower field, generating a double-height video at half framerate */
399  out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
400  if (!out)
401  return AVERROR(ENOMEM);
402  av_frame_copy_props(out, cur);
403  out->height = outlink->h;
404 #if FF_API_INTERLACED_FRAME
406  out->interlaced_frame = 1;
407  out->top_field_first = 1;
409 #endif
411  out->sample_aspect_ratio = av_mul_q(cur->sample_aspect_ratio, av_make_q(2, 1));
412 
413  /* write odd frame lines into the upper field of the new frame */
414  copy_picture_field(tinterlace, out->data, out->linesize,
415  (const uint8_t **)cur->data, cur->linesize,
416  inlink->format, inlink->w, inlink->h,
417  FIELD_UPPER_AND_LOWER, 1, tinterlace->mode == MODE_MERGEX2 ? (1 + inlink->frame_count_out) & 1 ? FIELD_LOWER : FIELD_UPPER : FIELD_UPPER, tinterlace->flags);
418  /* write even frame lines into the lower field of the new frame */
419  copy_picture_field(tinterlace, out->data, out->linesize,
420  (const uint8_t **)next->data, next->linesize,
421  inlink->format, inlink->w, inlink->h,
422  FIELD_UPPER_AND_LOWER, 1, tinterlace->mode == MODE_MERGEX2 ? (1 + inlink->frame_count_out) & 1 ? FIELD_UPPER : FIELD_LOWER : FIELD_LOWER, tinterlace->flags);
423  if (tinterlace->mode != MODE_MERGEX2)
424  av_frame_free(&tinterlace->next);
425  break;
426 
427  case MODE_DROP_ODD: /* only output even frames, odd frames are dropped; height unchanged, half framerate */
428  case MODE_DROP_EVEN: /* only output odd frames, even frames are dropped; height unchanged, half framerate */
429  out = av_frame_clone(tinterlace->mode == MODE_DROP_EVEN ? cur : next);
430  if (!out)
431  return AVERROR(ENOMEM);
432  av_frame_free(&tinterlace->next);
433  break;
434 
435  case MODE_PAD: /* expand each frame to double height, but pad alternate
436  * lines with black; framerate unchanged */
437  out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
438  if (!out)
439  return AVERROR(ENOMEM);
440  av_frame_copy_props(out, cur);
441  out->height = outlink->h;
442  out->sample_aspect_ratio = av_mul_q(cur->sample_aspect_ratio, av_make_q(2, 1));
443 
444  field = (1 + outlink->frame_count_in) & 1 ? FIELD_UPPER : FIELD_LOWER;
445  full = out->color_range == AVCOL_RANGE_JPEG || ff_fmt_is_in(out->format, full_scale_yuvj_pix_fmts);
446  /* copy upper and lower fields */
447  copy_picture_field(tinterlace, out->data, out->linesize,
448  (const uint8_t **)cur->data, cur->linesize,
449  inlink->format, inlink->w, inlink->h,
450  FIELD_UPPER_AND_LOWER, 1, field, tinterlace->flags);
451  /* pad with black the other field */
452  copy_picture_field(tinterlace, out->data, out->linesize,
453  (const uint8_t **)tinterlace->black_data[full], tinterlace->black_linesize,
454  inlink->format, inlink->w, inlink->h,
455  FIELD_UPPER_AND_LOWER, 1, !field, tinterlace->flags);
456  break;
457 
458  /* interleave upper/lower lines from odd frames with lower/upper lines from even frames,
459  * halving the frame rate and preserving image height */
460  case MODE_INTERLEAVE_TOP: /* top field first */
461  case MODE_INTERLEAVE_BOTTOM: /* bottom field first */
462  if ((tinterlace->flags & TINTERLACE_FLAG_BYPASS_IL) && (cur->flags & AV_FRAME_FLAG_INTERLACED)) {
464  "video is already interlaced, adjusting framerate only\n");
465  out = av_frame_clone(cur);
466  if (!out)
467  return AVERROR(ENOMEM);
468  out->pts /= 2; // adjust pts to new framerate
469  ff_ccfifo_inject(&tinterlace->cc_fifo, out);
470  ret = ff_filter_frame(outlink, out);
471  return ret;
472  }
473  tff = tinterlace->mode == MODE_INTERLEAVE_TOP;
474  out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
475  if (!out)
476  return AVERROR(ENOMEM);
477  av_frame_copy_props(out, cur);
478 #if FF_API_INTERLACED_FRAME
480  out->interlaced_frame = 1;
481  out->top_field_first = tff;
483 #endif
484  out->flags |= AV_FRAME_FLAG_INTERLACED;
485  if (tff)
487  else
489 
490  /* copy upper/lower field from cur */
491  copy_picture_field(tinterlace, out->data, out->linesize,
492  (const uint8_t **)cur->data, cur->linesize,
493  inlink->format, inlink->w, inlink->h,
494  tff ? FIELD_UPPER : FIELD_LOWER, 1, tff ? FIELD_UPPER : FIELD_LOWER,
495  tinterlace->flags);
496  /* copy lower/upper field from next */
497  copy_picture_field(tinterlace, out->data, out->linesize,
498  (const uint8_t **)next->data, next->linesize,
499  inlink->format, inlink->w, inlink->h,
500  tff ? FIELD_LOWER : FIELD_UPPER, 1, tff ? FIELD_LOWER : FIELD_UPPER,
501  tinterlace->flags);
502  av_frame_free(&tinterlace->next);
503  break;
504  case MODE_INTERLACEX2: /* re-interlace preserving image height, double frame rate */
505  /* output current frame first */
506  out = av_frame_clone(cur);
507  if (!out)
508  return AVERROR(ENOMEM);
509 #if FF_API_INTERLACED_FRAME
511  out->interlaced_frame = 1;
513 #endif
514  out->flags |= AV_FRAME_FLAG_INTERLACED;
515  if (cur->pts != AV_NOPTS_VALUE)
516  out->pts = cur->pts*2;
517 
518  out->pts = av_rescale_q(out->pts, tinterlace->preout_time_base, outlink->time_base);
519  ff_ccfifo_inject(&tinterlace->cc_fifo, out);
520  if ((ret = ff_filter_frame(outlink, out)) < 0)
521  return ret;
522 
523  /* output mix of current and next frame */
524  tff = !!(next->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST);
525  out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
526  if (!out)
527  return AVERROR(ENOMEM);
528  av_frame_copy_props(out, next);
529 #if FF_API_INTERLACED_FRAME
531  out->interlaced_frame = 1;
532  out->top_field_first = !tff;
534 #endif
535  out->flags |= AV_FRAME_FLAG_INTERLACED;
536  if (tff)
538  else
540 
541  if (next->pts != AV_NOPTS_VALUE && cur->pts != AV_NOPTS_VALUE)
542  out->pts = cur->pts + next->pts;
543  else
544  out->pts = AV_NOPTS_VALUE;
545  /* write current frame second field lines into the second field of the new frame */
546  copy_picture_field(tinterlace, out->data, out->linesize,
547  (const uint8_t **)cur->data, cur->linesize,
548  inlink->format, inlink->w, inlink->h,
549  tff ? FIELD_LOWER : FIELD_UPPER, 1, tff ? FIELD_LOWER : FIELD_UPPER,
550  tinterlace->flags);
551  /* write next frame first field lines into the first field of the new frame */
552  copy_picture_field(tinterlace, out->data, out->linesize,
553  (const uint8_t **)next->data, next->linesize,
554  inlink->format, inlink->w, inlink->h,
555  tff ? FIELD_UPPER : FIELD_LOWER, 1, tff ? FIELD_UPPER : FIELD_LOWER,
556  tinterlace->flags);
557  break;
558  default:
559  av_assert0(0);
560  }
561 
562  out->pts = av_rescale_q(out->pts, tinterlace->preout_time_base, outlink->time_base);
563  out->duration = av_rescale_q(1, av_inv_q(outlink->frame_rate), outlink->time_base);
564  ff_ccfifo_inject(&tinterlace->cc_fifo, out);
565  ret = ff_filter_frame(outlink, out);
566 
567  return ret;
568 }
569 
571 {
572  TInterlaceContext *tinterlace = ctx->priv;
573 
574  if (tinterlace->mode <= MODE_BFF)
575  tinterlace->mode += MODE_INTERLEAVE_TOP;
576 
577  tinterlace->flags |= TINTERLACE_FLAG_BYPASS_IL;
578  if (tinterlace->lowpass == VLPF_LIN)
579  tinterlace->flags |= TINTERLACE_FLAG_VLPF;
580  if (tinterlace->lowpass == VLPF_CMP)
581  tinterlace->flags |= TINTERLACE_FLAG_CVLPF;
582 
583  return 0;
584 }
585 
586 static const AVFilterPad tinterlace_inputs[] = {
587  {
588  .name = "default",
589  .type = AVMEDIA_TYPE_VIDEO,
590  .filter_frame = filter_frame,
591  },
592 };
593 
594 static const AVFilterPad tinterlace_outputs[] = {
595  {
596  .name = "default",
597  .type = AVMEDIA_TYPE_VIDEO,
598  .config_props = config_out_props,
599  },
600 };
601 
603  .name = "tinterlace",
604  .description = NULL_IF_CONFIG_SMALL("Perform temporal field interlacing."),
605  .priv_size = sizeof(TInterlaceContext),
606  .uninit = uninit,
610  .priv_class = &tinterlace_class,
611 };
612 
613 
615  .name = "interlace",
616  .description = NULL_IF_CONFIG_SMALL("Convert progressive video into interlaced."),
617  .priv_size = sizeof(TInterlaceContext),
618  .init = init_interlace,
619  .uninit = uninit,
623  .priv_class = &interlace_class,
624 };
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
filter_frame
static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
Definition: vf_tinterlace.c:374
FF_ENABLE_DEPRECATION_WARNINGS
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:73
MODE_MERGE
@ MODE_MERGE
Definition: tinterlace.h:49
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
av_clip
#define av_clip
Definition: common.h:99
init_interlace
static int init_interlace(AVFilterContext *ctx)
Definition: vf_tinterlace.c:570
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
out
FILE * out
Definition: movenc.c:55
TINTERLACE_FLAG_BYPASS_IL
#define TINTERLACE_FLAG_BYPASS_IL
Definition: tinterlace.h:40
standard_tbs
static const AVRational standard_tbs[]
Definition: vf_tinterlace.c:86
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1015
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2965
FILTER_PIXFMTS_ARRAY
#define FILTER_PIXFMTS_ARRAY(array)
Definition: internal.h:162
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
TInterlaceContext::lowpass_line
void(* lowpass_line)(uint8_t *dstp, ptrdiff_t width, const uint8_t *srcp, ptrdiff_t mref, ptrdiff_t pref, int clip_max)
Definition: tinterlace.h:79
lowpass_line_complex_c
static void lowpass_line_complex_c(uint8_t *dstp, ptrdiff_t width, const uint8_t *srcp, ptrdiff_t mref, ptrdiff_t pref, int clip_max)
Definition: vf_tinterlace.c:138
FIELD_UPPER_AND_LOWER
#define FIELD_UPPER_AND_LOWER
Definition: vf_tinterlace.c:312
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:160
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:375
AVFrame::pts
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:487
w
uint8_t w
Definition: llviddspenc.c:38
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:686
TInterlaceContext
Definition: tinterlace.h:65
AVComponentDescriptor::depth
int depth
Number of bits in the component.
Definition: pixdesc.h:57
TInterlaceContext::color
FFDrawColor color
Definition: tinterlace.h:77
AVOption
AVOption.
Definition: opt.h:346
TInterlaceContext::black_linesize
int black_linesize[4]
Definition: tinterlace.h:75
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
AV_PIX_FMT_YUV440P
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:106
AVFrame::flags
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition: frame.h:647
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:170
video.h
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:396
av_image_copy_plane
void av_image_copy_plane(uint8_t *dst, int dst_linesize, const uint8_t *src, int src_linesize, int bytewidth, int height)
Copy image plane from src to dst.
Definition: imgutils.c:374
hsub
static void hsub(htype *dst, const htype *src, int bins)
Definition: vf_median.c:74
VLPF_LIN
@ VLPF_LIN
Definition: tinterlace.h:44
AV_FRAME_FLAG_TOP_FIELD_FIRST
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
Definition: frame.h:639
MODE_INTERLEAVE_TOP
@ MODE_INTERLEAVE_TOP
Definition: tinterlace.h:53
TInterlaceContext::vsub
int vsub
chroma vertical subsampling
Definition: tinterlace.h:71
TInterlaceContext::preout_time_base
AVRational preout_time_base
Definition: tinterlace.h:68
AV_PIX_FMT_YUV420P12LE
@ AV_PIX_FMT_YUV420P12LE
planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
Definition: pixfmt.h:268
OFFSET
#define OFFSET(x)
Definition: vf_tinterlace.c:38
config_out_props
static int config_out_props(AVFilterLink *outlink)
Definition: vf_tinterlace.c:211
FIELD_LOWER
#define FIELD_LOWER
Definition: vf_tinterlace.c:311
ff_ccfifo_uninit
void ff_ccfifo_uninit(CCFifo *ccf)
Free all memory allocated in a CCFifo and clear the context.
Definition: ccfifo.c:46
tinterlace_inputs
static const AVFilterPad tinterlace_inputs[]
Definition: vf_tinterlace.c:586
AVFilterPad
A filter pad used for either input or output.
Definition: internal.h:33
AV_PIX_FMT_YUV420P10LE
@ AV_PIX_FMT_YUV420P10LE
planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
Definition: pixfmt.h:156
uninit
static av_cold void uninit(AVFilterContext *ctx)
Definition: vf_tinterlace.c:200
AV_PIX_FMT_YUV444P12LE
@ AV_PIX_FMT_YUV444P12LE
planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
Definition: pixfmt.h:276
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:90
MODE_MERGEX2
@ MODE_MERGEX2
Definition: tinterlace.h:56
ff_ccfifo_inject
int ff_ccfifo_inject(CCFifo *ccf, AVFrame *frame)
Insert CC data from the FIFO into an AVFrame (as side data)
Definition: ccfifo.c:133
TInterlaceContext::flags
int flags
flags affecting interlacing algorithm
Definition: tinterlace.h:69
TInterlaceContext::csp
const AVPixFmtDescriptor * csp
Definition: tinterlace.h:78
width
#define width
TInterlaceContext::cur
AVFrame * cur
Definition: tinterlace.h:72
AV_PIX_FMT_YUVA420P
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition: pixfmt.h:108
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:59
format
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 format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
VLPF_CMP
@ VLPF_CMP
Definition: tinterlace.h:45
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
TInterlaceContext::next
AVFrame * next
Definition: tinterlace.h:73
ctx
AVFormatContext * ctx
Definition: movenc.c:49
av_frame_clone
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
Definition: frame.c:593
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
field
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this field
Definition: writing_filters.txt:78
TInterlaceContext::black_data
uint8_t * black_data[2][4]
buffer used to fill padded lines (limited/full)
Definition: tinterlace.h:74
ff_tinterlace_init_x86
void ff_tinterlace_init_x86(TInterlaceContext *interlace)
Definition: vf_tinterlace_init.c:57
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
ff_vf_tinterlace
const AVFilter ff_vf_tinterlace
Definition: vf_tinterlace.c:602
TInterlaceContext::cc_fifo
CCFifo cc_fifo
Definition: tinterlace.h:81
AV_PIX_FMT_YUV444P10LE
@ AV_PIX_FMT_YUV444P10LE
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
Definition: pixfmt.h:162
AV_PIX_FMT_YUVA422P10LE
@ AV_PIX_FMT_YUVA422P10LE
planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
Definition: pixfmt.h:184
TINTERLACE_FLAG_EXACT_TB
#define TINTERLACE_FLAG_EXACT_TB
Definition: tinterlace.h:39
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:709
tinterlace_options
static const AVOption tinterlace_options[]
Definition: vf_tinterlace.c:41
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
ff_vf_interlace
const AVFilter ff_vf_interlace
Definition: vf_tinterlace.c:614
AVFilterContext::inputs
AVFilterLink ** inputs
array of pointers to input links
Definition: avfilter.h:415
TInterlaceContext::mode
int mode
TInterlaceMode, interlace mode selected.
Definition: tinterlace.h:67
ff_ccfifo_extract
int ff_ccfifo_extract(CCFifo *ccf, AVFrame *frame)
Extract CC data from an AVFrame.
Definition: ccfifo.c:183
ff_fmt_is_in
int ff_fmt_is_in(int fmt, const int *fmts)
Tell if an integer is contained in the provided -1-terminated list of integers.
Definition: formats.c:407
MODE_DROP_EVEN
@ MODE_DROP_EVEN
Definition: tinterlace.h:50
FFDrawColor::u8
uint8_t u8[16]
Definition: drawutils.h:55
AV_PIX_FMT_YUV440P10LE
@ AV_PIX_FMT_YUV440P10LE
planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
Definition: pixfmt.h:298
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
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
interleave
static void interleave(uint8_t *dst, uint8_t *src, int w, int h, int dst_linesize, int src_linesize, enum FilterMode mode, int swap)
Definition: vf_il.c:110
lowpass
@ lowpass
Definition: af_biquads.c:87
FFDrawColor::comp
union FFDrawColor::@255 comp[MAX_PLANES]
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:366
AV_PIX_FMT_YUV440P12LE
@ AV_PIX_FMT_YUV440P12LE
planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
Definition: pixfmt.h:300
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: vf_tinterlace.c:92
AV_PIX_FMT_YUV422P10LE
@ AV_PIX_FMT_YUV422P10LE
planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
Definition: pixfmt.h:158
ff_draw_init2
int ff_draw_init2(FFDrawContext *draw, enum AVPixelFormat format, enum AVColorSpace csp, enum AVColorRange range, unsigned flags)
Init a draw context.
Definition: drawutils.c:80
TINTERLACE_FLAG_CVLPF
#define TINTERLACE_FLAG_CVLPF
Definition: tinterlace.h:38
av_make_q
static AVRational av_make_q(int num, int den)
Create an AVRational.
Definition: rational.h:71
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
ff_fill_rectangle
void ff_fill_rectangle(FFDrawContext *draw, FFDrawColor *color, uint8_t *dst[], int dst_linesize[], int dst_x, int dst_y, int w, int h)
Fill a rectangle with an uniform color.
Definition: drawutils.c:231
av_le2ne16
#define av_le2ne16(x)
Definition: bswap.h:97
AV_PIX_FMT_YUVA444P
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition: pixfmt.h:174
FULL_SCALE_YUVJ_FORMATS
#define FULL_SCALE_YUVJ_FORMATS
Definition: vf_tinterlace.c:79
copy_picture_field
static void copy_picture_field(TInterlaceContext *tinterlace, uint8_t *dst[4], int dst_linesize[4], const uint8_t *src[4], int src_linesize[4], enum AVPixelFormat format, int w, int src_h, int src_field, int interleave, int dst_field, int flags)
Copy picture field from src to dst.
Definition: vf_tinterlace.c:324
AV_PIX_FMT_YUVA420P10LE
@ AV_PIX_FMT_YUVA420P10LE
planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
Definition: pixfmt.h:182
internal.h
MODE_NB
@ MODE_NB
Definition: avf_avectorscope.c:41
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
MODE_INTERLEAVE_BOTTOM
@ MODE_INTERLEAVE_BOTTOM
Definition: tinterlace.h:54
FIELD_UPPER
#define FIELD_UPPER
Definition: vf_tinterlace.c:310
MODE_BFF
@ MODE_BFF
Definition: tinterlace.h:62
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
AVFilterPad::name
const char * name
Pad name.
Definition: internal.h:39
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:634
ff_draw_color
void ff_draw_color(FFDrawContext *draw, FFDrawColor *color, const uint8_t rgba[4])
Prepare a color.
Definition: drawutils.c:156
av_cmp_q
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
Definition: rational.h:89
AVFilter
Filter definition.
Definition: avfilter.h:166
ff_ccfifo_init
int ff_ccfifo_init(CCFifo *ccf, AVRational framerate, void *log_ctx)
Initialize a CCFifo.
Definition: ccfifo.c:53
TInterlaceContext::lowpass
int lowpass
legacy interlace filter lowpass mode
Definition: tinterlace.h:70
ret
ret
Definition: filter_design.txt:187
AVFrame::sample_aspect_ratio
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
Definition: frame.h:482
tinterlace.h
AVRational::den
int den
Denominator.
Definition: rational.h:60
mode
mode
Definition: ebur128.h:83
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:235
MODE_PAD
@ MODE_PAD
Definition: tinterlace.h:52
avfilter.h
TInterlaceContext::draw
FFDrawContext draw
Definition: tinterlace.h:76
AVPixFmtDescriptor::comp
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:105
av_mul_q
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
av_clip_uint8
#define av_clip_uint8
Definition: common.h:105
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
MODE_INTERLACEX2
@ MODE_INTERLACEX2
Definition: tinterlace.h:55
FF_DISABLE_DEPRECATION_WARNINGS
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:72
lowpass_line_c
static void lowpass_line_c(uint8_t *dstp, ptrdiff_t width, const uint8_t *srcp, ptrdiff_t mref, ptrdiff_t pref, int clip_max)
Definition: vf_tinterlace.c:106
desc
const char * desc
Definition: libsvtav1.c:75
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
VLPF_OFF
@ VLPF_OFF
Definition: tinterlace.h:43
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
mem.h
full_scale_yuvj_pix_fmts
static enum AVPixelFormat full_scale_yuvj_pix_fmts[]
Definition: vf_tinterlace.c:82
AV_PIX_FMT_YUVA444P10LE
@ AV_PIX_FMT_YUVA444P10LE
planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
Definition: pixfmt.h:186
lowpass_line_complex_c_16
static void lowpass_line_complex_c_16(uint8_t *dst8, ptrdiff_t width, const uint8_t *src8, ptrdiff_t mref, ptrdiff_t pref, int clip_max)
Definition: vf_tinterlace.c:165
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
MODE_TFF
@ MODE_TFF
Definition: tinterlace.h:61
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
AV_PIX_FMT_YUV411P
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:80
TINTERLACE_FLAG_VLPF
#define TINTERLACE_FLAG_VLPF
Definition: tinterlace.h:37
AV_OPT_TYPE_FLAGS
@ AV_OPT_TYPE_FLAGS
Definition: opt.h:234
imgutils.h
interlace_options
static const AVOption interlace_options[]
Definition: vf_tinterlace.c:65
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:474
lowpass_line_c_16
static void lowpass_line_c_16(uint8_t *dst8, ptrdiff_t width, const uint8_t *src8, ptrdiff_t mref, ptrdiff_t pref, int clip_max)
Definition: vf_tinterlace.c:120
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:420
AV_PIX_FMT_YUV410P
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:79
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
h
h
Definition: vp9dsp_template.c:2038
FLAGS
#define FLAGS
Definition: vf_tinterlace.c:39
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:244
AV_PIX_FMT_YUV422P12LE
@ AV_PIX_FMT_YUV422P12LE
planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
Definition: pixfmt.h:272
AVFILTER_DEFINE_CLASS
AVFILTER_DEFINE_CLASS(tinterlace)
AV_PIX_FMT_YUVA422P
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
Definition: pixfmt.h:173
MODE_DROP_ODD
@ MODE_DROP_ODD
Definition: tinterlace.h:51
tinterlace_outputs
static const AVFilterPad tinterlace_outputs[]
Definition: vf_tinterlace.c:594