Mercurial > libavcodec.hg
comparison mpegaudiodec.c @ 4204:672724df5c9a libavcodec
making decoding more error robust
author | michael |
---|---|
date | Tue, 14 Nov 2006 22:06:28 +0000 |
parents | 14250f6ff483 |
children | 8c28f03cfdd5 |
comparison
equal
deleted
inserted
replaced
4203:14250f6ff483 | 4204:672724df5c9a |
---|---|
1746 | 1746 |
1747 /* skip extension bits */ | 1747 /* skip extension bits */ |
1748 bits_left = end_pos - get_bits_count(&s->gb); | 1748 bits_left = end_pos - get_bits_count(&s->gb); |
1749 //av_log(NULL, AV_LOG_ERROR, "left:%d buf:%p\n", bits_left, s->in_gb.buffer); | 1749 //av_log(NULL, AV_LOG_ERROR, "left:%d buf:%p\n", bits_left, s->in_gb.buffer); |
1750 if (bits_left < 0) { | 1750 if (bits_left < 0) { |
1751 dprintf("bits_left=%d\n", bits_left); | 1751 av_log(NULL, AV_LOG_ERROR, "bits_left=%d\n", bits_left); |
1752 return -1; | |
1753 } | 1752 } |
1754 skip_bits_long(&s->gb, bits_left); | 1753 skip_bits_long(&s->gb, bits_left); |
1755 | 1754 |
1756 return 0; | 1755 return 0; |
1757 } | 1756 } |
2272 const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3); | 2271 const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3); |
2273 assert((get_bits_count(&s->gb) & 7) == 0); | 2272 assert((get_bits_count(&s->gb) & 7) == 0); |
2274 /* now we get bits from the main_data_begin offset */ | 2273 /* now we get bits from the main_data_begin offset */ |
2275 dprintf("seekback: %d\n", main_data_begin); | 2274 dprintf("seekback: %d\n", main_data_begin); |
2276 //av_log(NULL, AV_LOG_ERROR, "backstep:%d, lastbuf:%d\n", main_data_begin, s->last_buf_size); | 2275 //av_log(NULL, AV_LOG_ERROR, "backstep:%d, lastbuf:%d\n", main_data_begin, s->last_buf_size); |
2277 if(main_data_begin > s->last_buf_size){ | |
2278 av_log(NULL, AV_LOG_ERROR, "backstep:%d, lastbuf:%d\n", main_data_begin, s->last_buf_size); | |
2279 // s->last_buf_size= main_data_begin; | |
2280 return -1; | |
2281 } | |
2282 | 2276 |
2283 memcpy(s->last_buf + s->last_buf_size, ptr, EXTRABYTES); | 2277 memcpy(s->last_buf + s->last_buf_size, ptr, EXTRABYTES); |
2284 s->in_gb= s->gb; | 2278 s->in_gb= s->gb; |
2285 init_get_bits(&s->gb, s->last_buf + s->last_buf_size - main_data_begin, main_data_begin*8); | 2279 init_get_bits(&s->gb, s->last_buf, s->last_buf_size*8); |
2280 skip_bits_long(&s->gb, 8*(s->last_buf_size - main_data_begin)); | |
2286 } | 2281 } |
2287 | 2282 |
2288 for(gr=0;gr<nb_granules;gr++) { | 2283 for(gr=0;gr<nb_granules;gr++) { |
2289 for(ch=0;ch<s->nb_channels;ch++) { | 2284 for(ch=0;ch<s->nb_channels;ch++) { |
2290 g = &granules[ch][gr]; | 2285 g = &granules[ch][gr]; |
2286 if(get_bits_count(&s->gb)<0){ | |
2287 av_log(NULL, AV_LOG_ERROR, "mdb:%d, lastbuf:%d skiping granule %d\n", | |
2288 main_data_begin, s->last_buf_size, gr); | |
2289 skip_bits_long(&s->gb, g->part2_3_length); | |
2290 memset(g->sb_hybrid, 0, sizeof(g->sb_hybrid)); | |
2291 if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->in_gb.buffer){ | |
2292 skip_bits_long(&s->in_gb, get_bits_count(&s->gb) - s->gb.size_in_bits); | |
2293 s->gb= s->in_gb; | |
2294 s->in_gb.buffer=NULL; | |
2295 } | |
2296 continue; | |
2297 } | |
2291 | 2298 |
2292 bits_pos = get_bits_count(&s->gb); | 2299 bits_pos = get_bits_count(&s->gb); |
2293 | 2300 |
2294 if (!s->lsf) { | 2301 if (!s->lsf) { |
2295 uint8_t *sc; | 2302 uint8_t *sc; |
2416 } | 2423 } |
2417 | 2424 |
2418 exponents_from_scale_factors(s, g, exponents); | 2425 exponents_from_scale_factors(s, g, exponents); |
2419 | 2426 |
2420 /* read Huffman coded residue */ | 2427 /* read Huffman coded residue */ |
2421 if (huffman_decode(s, g, exponents, | 2428 huffman_decode(s, g, exponents, bits_pos + g->part2_3_length); |
2422 bits_pos + g->part2_3_length) < 0) | |
2423 return -1; | |
2424 #if defined(DEBUG) | 2429 #if defined(DEBUG) |
2425 sample_dump(0, g->sb_hybrid, 576); | 2430 sample_dump(0, g->sb_hybrid, 576); |
2426 #endif | 2431 #endif |
2427 } /* ch */ | 2432 } /* ch */ |
2428 | 2433 |
2444 #if defined(DEBUG) | 2449 #if defined(DEBUG) |
2445 sample_dump(2, &s->sb_samples[ch][18 * gr][0], 576); | 2450 sample_dump(2, &s->sb_samples[ch][18 * gr][0], 576); |
2446 #endif | 2451 #endif |
2447 } | 2452 } |
2448 } /* gr */ | 2453 } /* gr */ |
2454 if(get_bits_count(&s->gb)<0) | |
2455 skip_bits_long(&s->gb, -get_bits_count(&s->gb)); | |
2449 return nb_granules * 18; | 2456 return nb_granules * 18; |
2450 } | 2457 } |
2451 | 2458 |
2452 static int mp_decode_frame(MPADecodeContext *s, | 2459 static int mp_decode_frame(MPADecodeContext *s, |
2453 OUT_INT *samples, const uint8_t *buf, int buf_size) | 2460 OUT_INT *samples, const uint8_t *buf, int buf_size) |
2481 memmove(s->last_buf, s->gb.buffer + (get_bits_count(&s->gb)>>3), i); | 2488 memmove(s->last_buf, s->gb.buffer + (get_bits_count(&s->gb)>>3), i); |
2482 s->last_buf_size=i; | 2489 s->last_buf_size=i; |
2483 }else | 2490 }else |
2484 av_log(NULL, AV_LOG_ERROR, "invalid old backstep %d\n", i); | 2491 av_log(NULL, AV_LOG_ERROR, "invalid old backstep %d\n", i); |
2485 s->gb= s->in_gb; | 2492 s->gb= s->in_gb; |
2493 s->in_gb.buffer= NULL; | |
2486 } | 2494 } |
2487 | 2495 |
2488 align_get_bits(&s->gb); | 2496 align_get_bits(&s->gb); |
2489 assert((get_bits_count(&s->gb) & 7) == 0); | 2497 assert((get_bits_count(&s->gb) & 7) == 0); |
2490 i= (s->gb.size_in_bits - get_bits_count(&s->gb))>>3; | 2498 i= (s->gb.size_in_bits - get_bits_count(&s->gb))>>3; |