comparison mpegaudiodec.c @ 3647:4a93d7102793 libavcodec

fix buffer handling
author michael
date Mon, 28 Aug 2006 16:15:40 +0000
parents 9eb3d84b6eef
children faa8dc533ad3
comparison
equal deleted inserted replaced
3646:e324e5ce41a1 3647:4a93d7102793
88 #define EXTRABYTES 24 88 #define EXTRABYTES 24
89 89
90 struct GranuleDef; 90 struct GranuleDef;
91 91
92 typedef struct MPADecodeContext { 92 typedef struct MPADecodeContext {
93 DECLARE_ALIGNED_8(uint8_t, last_buf[BACKSTEP_SIZE + EXTRABYTES + MPA_MAX_CODED_FRAME_SIZE]); //FIXME we dont need that much 93 DECLARE_ALIGNED_8(uint8_t, last_buf[2*BACKSTEP_SIZE + EXTRABYTES]);
94 int last_buf_size; 94 int last_buf_size;
95 int frame_size; 95 int frame_size;
96 int free_format_frame_size; /* frame size in case of free format 96 int free_format_frame_size; /* frame size in case of free format
97 (zero if currently unknown) */ 97 (zero if currently unknown) */
98 /* next header (used in free format parsing) */ 98 /* next header (used in free format parsing) */
1686 if(s->in_gb.buffer && pos >= s->gb.size_in_bits){ 1686 if(s->in_gb.buffer && pos >= s->gb.size_in_bits){
1687 s->gb= s->in_gb; 1687 s->gb= s->in_gb;
1688 s->in_gb.buffer=NULL; 1688 s->in_gb.buffer=NULL;
1689 assert((get_bits_count(&s->gb) & 7) == 0); 1689 assert((get_bits_count(&s->gb) & 7) == 0);
1690 skip_bits_long(&s->gb, pos - end_pos); 1690 skip_bits_long(&s->gb, pos - end_pos);
1691 end_pos2=
1691 end_pos= end_pos2 + get_bits_count(&s->gb) - pos; 1692 end_pos= end_pos2 + get_bits_count(&s->gb) - pos;
1692 pos= get_bits_count(&s->gb); 1693 pos= get_bits_count(&s->gb);
1693 } 1694 }
1694 // av_log(NULL, AV_LOG_ERROR, "new pos: %d %d\n", pos, end_pos); 1695 // av_log(NULL, AV_LOG_ERROR, "new pos: %d %d\n", pos, end_pos);
1695 if(pos >= end_pos) 1696 if(pos >= end_pos)
1754 last_pos=0; 1755 last_pos=0;
1755 while (s_index <= 572) { 1756 while (s_index <= 572) {
1756 int pos, code; 1757 int pos, code;
1757 pos = get_bits_count(&s->gb); 1758 pos = get_bits_count(&s->gb);
1758 if (pos >= end_pos) { 1759 if (pos >= end_pos) {
1760 if (pos > end_pos2 && last_pos){
1761 /* some encoders generate an incorrect size for this
1762 part. We must go back into the data */
1763 s_index -= 4;
1764 skip_bits_long(&s->gb, last_pos - pos);
1765 av_log(NULL, AV_LOG_INFO, "overread, skip %d enddists: %d %d\n", last_pos - pos, end_pos-pos, end_pos2-pos);
1766 break;
1767 }
1759 // av_log(NULL, AV_LOG_ERROR, "pos2: %d %d %d %d\n", pos, end_pos, end_pos2, s_index); 1768 // av_log(NULL, AV_LOG_ERROR, "pos2: %d %d %d %d\n", pos, end_pos, end_pos2, s_index);
1760 if(s->in_gb.buffer && pos >= s->gb.size_in_bits){ 1769 if(s->in_gb.buffer && pos >= s->gb.size_in_bits){
1761 s->gb= s->in_gb; 1770 s->gb= s->in_gb;
1762 s->in_gb.buffer=NULL; 1771 s->in_gb.buffer=NULL;
1763 assert((get_bits_count(&s->gb) & 7) == 0); 1772 assert((get_bits_count(&s->gb) & 7) == 0);
1764 skip_bits_long(&s->gb, pos - end_pos); 1773 skip_bits_long(&s->gb, pos - end_pos);
1774 end_pos2=
1765 end_pos= end_pos2 + get_bits_count(&s->gb) - pos; 1775 end_pos= end_pos2 + get_bits_count(&s->gb) - pos;
1766 pos= get_bits_count(&s->gb); 1776 pos= get_bits_count(&s->gb);
1767 } 1777 }
1768 // av_log(NULL, AV_LOG_ERROR, "new pos2: %d %d %d\n", pos, end_pos, s_index); 1778 // av_log(NULL, AV_LOG_ERROR, "new pos2: %d %d %d\n", pos, end_pos, s_index);
1769 if (pos > end_pos && last_pos){ //FIXME last_pos is messed if we switch buffers
1770 /* some encoders generate an incorrect size for this
1771 part. We must go back into the data */
1772 s_index -= 4;
1773 skip_bits_long(&s->gb, last_pos - pos);
1774 av_log(NULL, AV_LOG_DEBUG, "overread, skip %d\n", last_pos - pos);
1775 }
1776 if(pos >= end_pos) 1779 if(pos >= end_pos)
1777 break; 1780 break;
1778 } 1781 }
1779 last_pos= pos; 1782 last_pos= pos;
1780 1783
2316 } 2319 }
2317 } 2320 }
2318 2321
2319 if (!s->adu_mode) { 2322 if (!s->adu_mode) {
2320 const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3); 2323 const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3);
2324 assert((get_bits_count(&s->gb) & 7) == 0);
2321 /* now we get bits from the main_data_begin offset */ 2325 /* now we get bits from the main_data_begin offset */
2322 dprintf("seekback: %d\n", main_data_begin); 2326 dprintf("seekback: %d\n", main_data_begin);
2323 //av_log(NULL, AV_LOG_ERROR, "backstep:%d, lastbuf:%d\n", main_data_begin, s->last_buf_size); 2327 //av_log(NULL, AV_LOG_ERROR, "backstep:%d, lastbuf:%d\n", main_data_begin, s->last_buf_size);
2324 if(main_data_begin > s->last_buf_size) 2328 if(main_data_begin > s->last_buf_size){
2329 av_log(NULL, AV_LOG_ERROR, "backstep:%d, lastbuf:%d\n", main_data_begin, s->last_buf_size);
2325 s->last_buf_size= main_data_begin; 2330 s->last_buf_size= main_data_begin;
2331 }
2326 2332
2327 memcpy(s->last_buf + s->last_buf_size, ptr, EXTRABYTES); 2333 memcpy(s->last_buf + s->last_buf_size, ptr, EXTRABYTES);
2328 s->in_gb= s->gb; 2334 s->in_gb= s->gb;
2329 init_get_bits(&s->gb, s->last_buf + s->last_buf_size - main_data_begin, main_data_begin*8); 2335 init_get_bits(&s->gb, s->last_buf + s->last_buf_size - main_data_begin, main_data_begin*8);
2330 } 2336 }
2519 2525
2520 s->last_buf_size=0; 2526 s->last_buf_size=0;
2521 if(s->in_gb.buffer){ 2527 if(s->in_gb.buffer){
2522 align_get_bits(&s->gb); 2528 align_get_bits(&s->gb);
2523 i= (s->gb.size_in_bits - get_bits_count(&s->gb))>>3; 2529 i= (s->gb.size_in_bits - get_bits_count(&s->gb))>>3;
2524 if(i > 0 && i <= BACKSTEP_SIZE){ 2530 if(i >= 0 && i <= BACKSTEP_SIZE){
2525 memmove(s->last_buf, s->gb.buffer + (get_bits_count(&s->gb)>>3), i); 2531 memmove(s->last_buf, s->gb.buffer + (get_bits_count(&s->gb)>>3), i);
2526 s->last_buf_size=i; 2532 s->last_buf_size=i;
2527 } 2533 }else
2534 av_log(NULL, AV_LOG_ERROR, "invalid old backstep %d\n", i);
2528 s->gb= s->in_gb; 2535 s->gb= s->in_gb;
2529 } 2536 }
2530 2537
2531 align_get_bits(&s->gb); 2538 align_get_bits(&s->gb);
2532 assert((get_bits_count(&s->gb) & 7) == 0); 2539 assert((get_bits_count(&s->gb) & 7) == 0);
2533 i= (s->gb.size_in_bits - get_bits_count(&s->gb))>>3; 2540 i= (s->gb.size_in_bits - get_bits_count(&s->gb))>>3;
2534 2541
2535 if(i<0 || s->last_buf_size + i > BACKSTEP_SIZE || nb_frames<0) 2542 if(i<0 || i > BACKSTEP_SIZE || nb_frames<0){
2536 i= FFMIN(BACKSTEP_SIZE-s->last_buf_size, buf_size - HEADER_SIZE); 2543 av_log(NULL, AV_LOG_ERROR, "invalid new backstep %d\n", i);
2544 i= FFMIN(BACKSTEP_SIZE, buf_size - HEADER_SIZE);
2545 }
2537 assert(i <= buf_size - HEADER_SIZE && i>= 0); 2546 assert(i <= buf_size - HEADER_SIZE && i>= 0);
2538 memcpy(s->last_buf + s->last_buf_size, s->gb.buffer + buf_size - HEADER_SIZE - i, i); 2547 memcpy(s->last_buf + s->last_buf_size, s->gb.buffer + buf_size - HEADER_SIZE - i, i);
2539 s->last_buf_size += i; 2548 s->last_buf_size += i;
2540 2549
2541 break; 2550 break;
2542 } 2551 }
2543 #if defined(DEBUG) 2552 #if defined(DEBUG)