summaryrefslogtreecommitdiff
path: root/libavfilter/vf_detelecine.c
diff options
context:
space:
mode:
authorBenjamin Steffes <benjaminst123@gmail.com>2016-03-14 13:44:24 +0100
committerCarl Eugen Hoyos <cehoyos@ag.or.at>2016-03-16 19:58:14 +0100
commit06267afe1cec91656447458e029900dbe8536603 (patch)
treed87c8916890964cf1c61fa26f9ac40d15439b659 /libavfilter/vf_detelecine.c
parent50ef7361cb5f78c94da2323f3bae86c6bbd618c8 (diff)
Fix detelecine filter for patterns like 3444 or 33333334.
Signed-off-by: Benjamin Steffes <benjaminst123@gmail.com> Signed-off-by: Carl Eugen Hoyos <cehoyos@ag.or.at>
Diffstat (limited to 'libavfilter/vf_detelecine.c')
-rw-r--r--libavfilter/vf_detelecine.c40
1 files changed, 19 insertions, 21 deletions
diff --git a/libavfilter/vf_detelecine.c b/libavfilter/vf_detelecine.c
index 6fd9aade07..f5ae350c05 100644
--- a/libavfilter/vf_detelecine.c
+++ b/libavfilter/vf_detelecine.c
@@ -195,21 +195,15 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
s->nskip_fields -= 2;
return 0;
} else if (s->nskip_fields >= 1) {
- if (s->occupied) {
- s->occupied = 0;
- s->nskip_fields--;
- }
- else {
- for (i = 0; i < s->nb_planes; i++) {
- av_image_copy_plane(s->temp->data[i], s->temp->linesize[i],
- inpicref->data[i], inpicref->linesize[i],
- s->stride[i],
- s->planeheight[i]);
- }
- s->occupied = 1;
- s->nskip_fields--;
- return 0;
+ for (i = 0; i < s->nb_planes; i++) {
+ av_image_copy_plane(s->temp->data[i], s->temp->linesize[i],
+ inpicref->data[i], inpicref->linesize[i],
+ s->stride[i],
+ s->planeheight[i]);
}
+ s->occupied = 1;
+ s->nskip_fields--;
+ return 0;
}
if (s->nskip_fields == 0) {
@@ -243,15 +237,19 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
s->stride[i],
(s->planeheight[i] - !s->first_field + 1) / 2);
}
- len -= 2;
- for (i = 0; i < s->nb_planes; i++) {
- av_image_copy_plane(s->temp->data[i], s->temp->linesize[i],
- inpicref->data[i], inpicref->linesize[i],
- s->stride[i],
- s->planeheight[i]);
+
+ s->occupied = 0;
+ if (len <= 2) {
+ for (i = 0; i < s->nb_planes; i++) {
+ av_image_copy_plane(s->temp->data[i], s->temp->linesize[i],
+ inpicref->data[i], inpicref->linesize[i],
+ s->stride[i],
+ s->planeheight[i]);
+ }
+ s->occupied = 1;
}
- s->occupied = 1;
out = 1;
+ len = (len >= 3) ? len - 3 : 0;
} else {
if (len >= 2) {
// output THIS image as-is