Mercurial > libavcodec.hg
comparison flacdec.c @ 9121:7f11c330c5d6 libavcodec
flacdec: When there is not enough data to read the next header block,
reset the bitstream reader instead of skipping backwards.
author | jbr |
---|---|
date | Wed, 04 Mar 2009 01:08:26 +0000 |
parents | dfd80d6fabfe |
children | 721e21aca252 |
comparison
equal
deleted
inserted
replaced
9120:dfd80d6fabfe | 9121:7f11c330c5d6 |
---|---|
227 * @return non-zero if metadata is invalid | 227 * @return non-zero if metadata is invalid |
228 */ | 228 */ |
229 static int metadata_parse(FLACContext *s) | 229 static int metadata_parse(FLACContext *s) |
230 { | 230 { |
231 int i, metadata_last, metadata_type, metadata_size; | 231 int i, metadata_last, metadata_type, metadata_size; |
232 int initial_pos= get_bits_count(&s->gb); | |
233 | 232 |
234 skip_bits_long(&s->gb, 32); | 233 skip_bits_long(&s->gb, 32); |
235 | 234 |
236 do { | 235 do { |
237 metadata_last = get_bits1(&s->gb); | 236 metadata_last = get_bits1(&s->gb); |
238 metadata_type = get_bits(&s->gb, 7); | 237 metadata_type = get_bits(&s->gb, 7); |
239 metadata_size = get_bits_long(&s->gb, 24); | 238 metadata_size = get_bits_long(&s->gb, 24); |
240 | 239 |
241 if (get_bits_count(&s->gb) + 8*metadata_size > s->gb.size_in_bits) { | 240 if (get_bits_count(&s->gb) + 8*metadata_size > s->gb.size_in_bits) { |
242 skip_bits_long(&s->gb, initial_pos - get_bits_count(&s->gb)); | 241 /* need more data. reset the bitstream reader and return. */ |
242 init_get_bits(&s->gb, s->gb.buffer, s->gb.size_in_bits); | |
243 break; | 243 break; |
244 } | 244 } |
245 | 245 |
246 if (metadata_size) { | 246 if (metadata_size) { |
247 switch (metadata_type) { | 247 switch (metadata_type) { |