summaryrefslogtreecommitdiff
path: root/libavfilter/vf_tinterlace.c
diff options
context:
space:
mode:
authorStefano Sabatini <stefasab@gmail.com>2011-12-31 14:12:01 +0100
committerStefano Sabatini <stefasab@gmail.com>2012-01-01 16:16:50 +0100
commit42a8ac94d9481a5ab7e016d3621d265e3e1364d3 (patch)
tree521249fcb5e1e917ce1befc8903eb3a82815fe3d /libavfilter/vf_tinterlace.c
parent8dc973e6d1442e6427dfcb9817f9d15695555465 (diff)
vf_tinterlace: implement interlace mode 5
Allow creating interlaced bottom field first video.
Diffstat (limited to 'libavfilter/vf_tinterlace.c')
-rw-r--r--libavfilter/vf_tinterlace.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/libavfilter/vf_tinterlace.c b/libavfilter/vf_tinterlace.c
index 7ba164e0ba..8407d1f050 100644
--- a/libavfilter/vf_tinterlace.c
+++ b/libavfilter/vf_tinterlace.c
@@ -68,9 +68,9 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
if (args) {
n = sscanf(args, "%d", &tinterlace->mode);
- if (n != 1 || tinterlace->mode < 0 || tinterlace->mode > 4) {
+ if (n != 1 || tinterlace->mode < 0 || tinterlace->mode > 5) {
av_log(ctx, AV_LOG_ERROR,
- "Invalid mode '%s', use an integer between 0 and 4\n", args);
+ "Invalid mode '%s', use an integer between 0 and 5\n", args);
return AVERROR(EINVAL);
}
}
@@ -179,7 +179,7 @@ static void end_frame(AVFilterLink *inlink)
AVFilterBufferRef *cur = tinterlace->cur;
AVFilterBufferRef *next = tinterlace->next;
AVFilterBufferRef *out = NULL;
- int field;
+ int field, tff;
/* we need at least two frames */
if (!tinterlace->cur)
@@ -234,23 +234,26 @@ static void end_frame(AVFilterLink *inlink)
FIELD_UPPER_AND_LOWER, 1, !field);
break;
- case 4: /* interleave upper lines from odd frames with lower lines from even frames,
- * halving the frame rate and preserving image height */
+ /* interleave upper/lower lines from odd frames with lower/upper lines from even frames,
+ * halving the frame rate and preserving image height */
+ case 4: /* top field first */
+ case 5: /* bottom field first */
+ tff = tinterlace->mode == 4;
out = avfilter_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h);
avfilter_copy_buffer_ref_props(out, cur);
out->video->interlaced = 1;
- out->video->top_field_first = 1;
+ out->video->top_field_first = tff;
- /* copy upper field from cur */
+ /* copy upper/lower field from cur */
copy_picture_field(out->data, out->linesize,
cur->data, cur->linesize,
inlink->format, inlink->w, inlink->h,
- FIELD_UPPER, 1, FIELD_UPPER);
- /* copy lower fields from next */
+ tff ? FIELD_UPPER : FIELD_LOWER, 1, tff ? FIELD_UPPER : FIELD_LOWER);
+ /* copy lower/upper field from next */
copy_picture_field(out->data, out->linesize,
next->data, next->linesize,
inlink->format, inlink->w, inlink->h,
- FIELD_LOWER, 1, FIELD_LOWER);
+ tff ? FIELD_LOWER : FIELD_UPPER, 1, tff ? FIELD_LOWER : FIELD_UPPER);
avfilter_unref_buffer(tinterlace->next);
tinterlace->next = NULL;
break;