54 int black_linesize[4];
57 #define OFFSET(x) offsetof(TInterlaceContext, x)
58 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
59 #define TINTERLACE_FLAG_VLPF 01
80 #define FULL_SCALE_YUVJ_FORMATS \
81 AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P
103 static const char *shorthand[] = {
"mode",
NULL };
105 tinterlace->
class = &tinterlace_class;
130 outlink->
w = inlink->
w;
132 inlink->
h*2 : inlink->
h;
135 uint8_t black[4] = { 16, 128, 128, 16 };
138 black[0] = black[3] = 0;
140 outlink->
w, outlink->
h, outlink->
format, 1);
145 for (i = 0; i < 4 && tinterlace->
black_data[i]; i++) {
146 int h = i == 1 || i == 2 ? outlink->
h >> desc->
log2_chroma_h : outlink->
h;
160 inlink->
h, outlink->
h);
165 #define FIELD_UPPER 0
166 #define FIELD_LOWER 1
167 #define FIELD_UPPER_AND_LOWER 2
180 const uint8_t *src[4],
int src_linesize[4],
191 int lines = plane == 1 || plane == 2 ? src_h >> vsub : src_h;
194 const uint8_t *srcp = src[plane];
201 srcp += src_linesize[plane];
203 dstp += dst_linesize[plane];
208 int srcp_linesize = src_linesize[plane] * k;
209 int dstp_linesize = dst_linesize[plane] * (interleave ? 2 : 1);
210 for (h = lines; h > 0; h--) {
211 const uint8_t *srcp_above = srcp - src_linesize[plane];
212 const uint8_t *srcp_below = srcp + src_linesize[plane];
213 if (h == lines) srcp_above = srcp;
214 if (h == 1) srcp_below = srcp;
215 for (i = 0; i < linesize; i++) {
219 dstp[i] = (1 + srcp[i] + srcp[i] + srcp_above[i] + srcp_below[i]) >> 2;
221 dstp += dstp_linesize;
222 srcp += srcp_linesize;
226 srcp, src_linesize[plane]*k, linesize, lines);
240 tinterlace->
cur = tinterlace->
next;
241 tinterlace->
next = picref;
243 cur = tinterlace->
cur;
244 next = tinterlace->
next;
246 if (!tinterlace->
cur)
249 switch (tinterlace->
mode) {
263 inlink->
format, inlink->
w, inlink->
h,
268 inlink->
format, inlink->
w, inlink->
h,
289 inlink->
format, inlink->
w, inlink->
h,
294 inlink->
format, inlink->
w, inlink->
h,
313 inlink->
format, inlink->
w, inlink->
h,
318 (
const uint8_t **)next->data, next->linesize,
319 inlink->
format, inlink->
w, inlink->
h,
320 tff ? FIELD_LOWER :
FIELD_UPPER, 1, tff ? FIELD_LOWER : FIELD_UPPER,
335 tff = next->video->top_field_first;
345 inlink->
format, inlink->
w, inlink->
h,
346 tff ? FIELD_LOWER : FIELD_UPPER, 1, tff ? FIELD_LOWER : FIELD_UPPER,
350 (
const uint8_t **)next->data, next->linesize,
351 inlink->
format, inlink->
w, inlink->
h,
352 tff ? FIELD_UPPER : FIELD_LOWER, 1, tff ? FIELD_UPPER : FIELD_LOWER,
375 }
while (!tinterlace->
cur);
400 .
name =
"tinterlace",
406 .
inputs = tinterlace_inputs,
408 .priv_class = &tinterlace_class,