Signed-off-by: Benjamin Steffes <benjaminst123@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
... | ... |
@@ -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++; |