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) {