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;