Not having the header for a codec is a tell-tale of a broken file.
Luca Barbato authored on 2012/09/20 08:01:43... | ... |
@@ -406,6 +406,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, |
406 | 406 |
s->data_offset = FFMIN(s->data_offset, cur_os->sync_pos); |
407 | 407 |
} |
408 | 408 |
}else{ |
409 |
+ os->nb_header++; |
|
409 | 410 |
os->pstart += os->psize; |
410 | 411 |
os->psize = 0; |
411 | 412 |
} |
... | ... |
@@ -445,7 +446,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, |
445 | 445 |
static int ogg_get_headers(AVFormatContext *s) |
446 | 446 |
{ |
447 | 447 |
struct ogg *ogg = s->priv_data; |
448 |
- int ret; |
|
448 |
+ int ret, i; |
|
449 | 449 |
|
450 | 450 |
do{ |
451 | 451 |
ret = ogg_packet(s, NULL, NULL, NULL, NULL); |
... | ... |
@@ -453,6 +454,16 @@ static int ogg_get_headers(AVFormatContext *s) |
453 | 453 |
return ret; |
454 | 454 |
}while (!ogg->headers); |
455 | 455 |
|
456 |
+ for (i = 0; i < ogg->nstreams; i++) { |
|
457 |
+ struct ogg_stream *os = ogg->streams + i; |
|
458 |
+ |
|
459 |
+ if (os->codec && os->codec->nb_header && |
|
460 |
+ os->nb_header < os->codec->nb_header) { |
|
461 |
+ av_log(s, AV_LOG_ERROR, |
|
462 |
+ "Headers mismatch for stream %d\n", i); |
|
463 |
+ return AVERROR_INVALIDDATA; |
|
464 |
+ } |
|
465 |
+ } |
|
456 | 466 |
av_dlog(s, "found headers\n"); |
457 | 467 |
|
458 | 468 |
return 0; |
... | ... |
@@ -51,6 +51,10 @@ struct ogg_codec { |
51 | 51 |
* 0 if granule is the end time of the associated packet. |
52 | 52 |
*/ |
53 | 53 |
int granule_is_start; |
54 |
+ /** |
|
55 |
+ * Number of expected headers |
|
56 |
+ */ |
|
57 |
+ int nb_header; |
|
54 | 58 |
}; |
55 | 59 |
|
56 | 60 |
struct ogg_stream { |
... | ... |
@@ -75,6 +79,7 @@ struct ogg_stream { |
75 | 75 |
int incomplete; ///< whether we're expecting a continuation in the next page |
76 | 76 |
int page_end; ///< current packet is the last one completed in the page |
77 | 77 |
int keyframe_seek; |
78 |
+ int nb_header; ///< set to the number of parsed headers |
|
78 | 79 |
void *private; |
79 | 80 |
}; |
80 | 81 |
|
... | ... |
@@ -104,6 +104,7 @@ const struct ogg_codec ff_dirac_codec = { |
104 | 104 |
.header = dirac_header, |
105 | 105 |
.gptopts = dirac_gptopts, |
106 | 106 |
.granule_is_start = 1, |
107 |
+ .nb_header = 1, |
|
107 | 108 |
}; |
108 | 109 |
|
109 | 110 |
const struct ogg_codec ff_old_dirac_codec = { |
... | ... |
@@ -112,4 +113,5 @@ const struct ogg_codec ff_old_dirac_codec = { |
112 | 112 |
.header = old_dirac_header, |
113 | 113 |
.gptopts = old_dirac_gptopts, |
114 | 114 |
.granule_is_start = 1, |
115 |
+ .nb_header = 1, |
|
115 | 116 |
}; |
... | ... |
@@ -88,11 +88,13 @@ old_flac_header (AVFormatContext * s, int idx) |
88 | 88 |
const struct ogg_codec ff_flac_codec = { |
89 | 89 |
.magic = "\177FLAC", |
90 | 90 |
.magicsize = 5, |
91 |
- .header = flac_header |
|
91 |
+ .header = flac_header, |
|
92 |
+ .nb_header = 2, |
|
92 | 93 |
}; |
93 | 94 |
|
94 | 95 |
const struct ogg_codec ff_old_flac_codec = { |
95 | 96 |
.magic = "fLaC", |
96 | 97 |
.magicsize = 4, |
97 |
- .header = old_flac_header |
|
98 |
+ .header = old_flac_header, |
|
99 |
+ .nb_header = 0, |
|
98 | 100 |
}; |
... | ... |
@@ -156,6 +156,7 @@ const struct ogg_codec ff_ogm_video_codec = { |
156 | 156 |
.header = ogm_header, |
157 | 157 |
.packet = ogm_packet, |
158 | 158 |
.granule_is_start = 1, |
159 |
+ .nb_header = 2, |
|
159 | 160 |
}; |
160 | 161 |
|
161 | 162 |
const struct ogg_codec ff_ogm_audio_codec = { |
... | ... |
@@ -164,6 +165,7 @@ const struct ogg_codec ff_ogm_audio_codec = { |
164 | 164 |
.header = ogm_header, |
165 | 165 |
.packet = ogm_packet, |
166 | 166 |
.granule_is_start = 1, |
167 |
+ .nb_header = 2, |
|
167 | 168 |
}; |
168 | 169 |
|
169 | 170 |
const struct ogg_codec ff_ogm_text_codec = { |
... | ... |
@@ -172,6 +174,7 @@ const struct ogg_codec ff_ogm_text_codec = { |
172 | 172 |
.header = ogm_header, |
173 | 173 |
.packet = ogm_packet, |
174 | 174 |
.granule_is_start = 1, |
175 |
+ .nb_header = 2, |
|
175 | 176 |
}; |
176 | 177 |
|
177 | 178 |
const struct ogg_codec ff_ogm_old_codec = { |
... | ... |
@@ -180,4 +183,5 @@ const struct ogg_codec ff_ogm_old_codec = { |
180 | 180 |
.header = ogm_dshow_header, |
181 | 181 |
.packet = ogm_packet, |
182 | 182 |
.granule_is_start = 1, |
183 |
+ .nb_header = 1, |
|
183 | 184 |
}; |