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;