Browse code

Try to allocate audio buffer sizes depending on the number of input bytes. Fixes issue1167.

Originally committed as revision 20768 to svn://svn.ffmpeg.org/ffmpeg/trunk

Michael Niedermayer authored on 2009/12/08 23:28:28
Showing 1 changed files
... ...
@@ -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);