Mercurial > libavcodec.hg
comparison flac.c @ 7304:ac25a6f7147e libavcodec
Support reading large metadata.
fixes issue187
author | michael |
---|---|
date | Fri, 18 Jul 2008 12:03:21 +0000 |
parents | f0fc58bb9780 |
children | 85ab7655ad4d |
comparison
equal
deleted
inserted
replaced
7303:f0fc58bb9780 | 7304:ac25a6f7147e |
---|---|
179 * @return 1 if some metadata was read, 0 if no fLaC marker was found | 179 * @return 1 if some metadata was read, 0 if no fLaC marker was found |
180 */ | 180 */ |
181 static int metadata_parse(FLACContext *s) | 181 static int metadata_parse(FLACContext *s) |
182 { | 182 { |
183 int i, metadata_last, metadata_type, metadata_size, streaminfo_updated=0; | 183 int i, metadata_last, metadata_type, metadata_size, streaminfo_updated=0; |
184 int initial_pos= get_bits_count(&s->gb); | |
184 | 185 |
185 if (show_bits_long(&s->gb, 32) == MKBETAG('f','L','a','C')) { | 186 if (show_bits_long(&s->gb, 32) == MKBETAG('f','L','a','C')) { |
186 skip_bits(&s->gb, 32); | 187 skip_bits(&s->gb, 32); |
187 | 188 |
188 av_log(s->avctx, AV_LOG_DEBUG, "STREAM HEADER\n"); | 189 av_log(s->avctx, AV_LOG_DEBUG, "STREAM HEADER\n"); |
189 do { | 190 do { |
190 metadata_last = get_bits1(&s->gb); | 191 metadata_last = get_bits1(&s->gb); |
191 metadata_type = get_bits(&s->gb, 7); | 192 metadata_type = get_bits(&s->gb, 7); |
192 metadata_size = get_bits_long(&s->gb, 24); | 193 metadata_size = get_bits_long(&s->gb, 24); |
194 | |
195 if(get_bits_count(&s->gb) + 8*metadata_size > s->gb.size_in_bits){ | |
196 skip_bits_long(&s->gb, initial_pos - get_bits_count(&s->gb)); | |
197 break; | |
198 } | |
193 | 199 |
194 av_log(s->avctx, AV_LOG_DEBUG, | 200 av_log(s->avctx, AV_LOG_DEBUG, |
195 " metadata block: flag = %d, type = %d, size = %d\n", | 201 " metadata block: flag = %d, type = %d, size = %d\n", |
196 metadata_last, metadata_type, metadata_size); | 202 metadata_last, metadata_type, metadata_size); |
197 if (metadata_size) { | 203 if (metadata_size) { |
610 s->max_framesize= 65536; // should hopefully be enough for the first header | 616 s->max_framesize= 65536; // should hopefully be enough for the first header |
611 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize); | 617 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize); |
612 } | 618 } |
613 | 619 |
614 if(1 && s->max_framesize){//FIXME truncated | 620 if(1 && s->max_framesize){//FIXME truncated |
615 buf_size= FFMAX(FFMIN(buf_size, s->max_framesize - s->bitstream_size), 0); | 621 if(s->bitstream_size < 4 || AV_RL32(s->bitstream) != MKTAG('f','L','a','C')) |
622 buf_size= FFMIN(buf_size, s->max_framesize - FFMIN(s->bitstream_size, s->max_framesize)); | |
616 input_buf_size= buf_size; | 623 input_buf_size= buf_size; |
624 | |
625 if(s->bitstream_size + buf_size < buf_size || s->bitstream_index + s->bitstream_size + buf_size < s->bitstream_index) | |
626 return -1; | |
627 | |
628 if(s->allocated_bitstream_size < s->bitstream_size + buf_size) | |
629 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->bitstream_size + buf_size); | |
617 | 630 |
618 if(s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size){ | 631 if(s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size){ |
619 // printf("memmove\n"); | 632 // printf("memmove\n"); |
620 memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size); | 633 memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size); |
621 s->bitstream_index=0; | 634 s->bitstream_index=0; |