Browse code

Fix start_frame handling in detelecine filter

Signed-off-by: Benjamin Steffes <benjaminst123@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>

Benjamin Steffes authored on 2016/03/18 07:10:00
Showing 1 changed files
... ...
@@ -37,6 +37,7 @@ typedef struct {
37 37
     int first_field;
38 38
     char *pattern;
39 39
     int start_frame;
40
+    int init_len;
40 41
     unsigned int pattern_pos;
41 42
     unsigned int nskip_fields;
42 43
     int64_t start_time;
... ...
@@ -74,6 +75,7 @@ static av_cold int init(AVFilterContext *ctx)
74 74
     DetelecineContext *s = ctx->priv;
75 75
     const char *p;
76 76
     int max = 0;
77
+    int sum = 0;
77 78
 
78 79
     if (!strlen(s->pattern)) {
79 80
         av_log(ctx, AV_LOG_ERROR, "No pattern provided.\n");
... ...
@@ -86,14 +88,21 @@ static av_cold int init(AVFilterContext *ctx)
86 86
             return AVERROR_INVALIDDATA;
87 87
         }
88 88
 
89
+        sum += *p - '0';
89 90
         max = FFMAX(*p - '0', max);
90 91
         s->pts.num += *p - '0';
91 92
         s->pts.den += 2;
92 93
     }
93 94
 
95
+    if (s->start_frame >= sum) {
96
+        av_log(ctx, AV_LOG_ERROR, "Provided start_frame is too big.\n");
97
+        return AVERROR_INVALIDDATA;
98
+    }
99
+
94 100
     s->nskip_fields = 0;
95 101
     s->pattern_pos = 0;
96 102
     s->start_time = AV_NOPTS_VALUE;
103
+    s->init_len = 0;
97 104
 
98 105
     if (s->start_frame != 0) {
99 106
         int nfields = 0;
... ...
@@ -101,7 +110,7 @@ static av_cold int init(AVFilterContext *ctx)
101 101
             nfields += *p - '0';
102 102
             s->pattern_pos++;
103 103
             if (nfields >= 2*s->start_frame) {
104
-                s->nskip_fields = nfields - 2*s->start_frame;
104
+                s->init_len = nfields - 2*s->start_frame;
105 105
                 break;
106 106
             }
107 107
         }
... ...
@@ -211,6 +220,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
211 211
     }
212 212
 
213 213
     if (s->nskip_fields == 0) {
214
+        len = s->init_len;
215
+        s->init_len = 0;
214 216
         while(!len && s->pattern[s->pattern_pos]) {
215 217
             len = s->pattern[s->pattern_pos] - '0';
216 218
             s->pattern_pos++;