Originally committed as revision 20768 to svn://svn.ffmpeg.org/ffmpeg/trunk
Michael Niedermayer authored on 2009/12/08 23:28:28... | ... |
@@ -555,17 +555,33 @@ static void do_audio_out(AVFormatContext *s, |
555 | 555 |
unsigned char *buf, int size) |
556 | 556 |
{ |
557 | 557 |
uint8_t *buftmp; |
558 |
- const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE; |
|
558 |
+ int64_t audio_out_size, audio_buf_size; |
|
559 | 559 |
|
560 | 560 |
int size_out, frame_bytes, ret; |
561 | 561 |
AVCodecContext *enc= ost->st->codec; |
562 | 562 |
AVCodecContext *dec= ist->st->codec; |
563 | 563 |
int osize= av_get_bits_per_sample_format(enc->sample_fmt)/8; |
564 | 564 |
int isize= av_get_bits_per_sample_format(dec->sample_fmt)/8; |
565 |
+ const int coded_bps = av_get_bits_per_sample(enc->codec->id); |
|
566 |
+ |
|
567 |
+ audio_buf_size= (size + isize*dec->channels - 1) / (isize*dec->channels); |
|
568 |
+ audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate; |
|
569 |
+ audio_buf_size= audio_buf_size*2 + 10000; //saftey factors for the deprecated resampling API |
|
570 |
+ audio_buf_size*= osize*enc->channels; |
|
571 |
+ |
|
572 |
+ audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels); |
|
573 |
+ if(coded_bps > 8*osize) |
|
574 |
+ audio_out_size= audio_out_size * coded_bps / (8*osize); |
|
575 |
+ audio_out_size += FF_MIN_BUFFER_SIZE; |
|
576 |
+ |
|
577 |
+ if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){ |
|
578 |
+ fprintf(stderr, "Buffer sizes too large\n"); |
|
579 |
+ av_exit(1); |
|
580 |
+ } |
|
565 | 581 |
|
566 | 582 |
/* SC: dynamic allocation of buffers */ |
567 | 583 |
if (!audio_buf) |
568 |
- audio_buf = av_malloc(audio_out_size); |
|
584 |
+ audio_buf = av_malloc(audio_buf_size); |
|
569 | 585 |
if (!audio_out) |
570 | 586 |
audio_out = av_malloc(audio_out_size); |
571 | 587 |
if (!audio_buf || !audio_out) |
... | ... |
@@ -717,7 +733,6 @@ static void do_audio_out(AVFormatContext *s, |
717 | 717 |
} |
718 | 718 |
} else { |
719 | 719 |
AVPacket pkt; |
720 |
- int coded_bps = av_get_bits_per_sample(enc->codec->id); |
|
721 | 720 |
av_init_packet(&pkt); |
722 | 721 |
|
723 | 722 |
ost->sync_opts += size_out / (osize * enc->channels); |