Mercurial > libavcodec.hg
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) |