avconv: make the async buffer global and free it in exit_program()
authorJustin Ruggles <justin.ruggles@gmail.com>
Wed, 21 Mar 2012 20:36:23 +0000 (16:36 -0400)
committerJustin Ruggles <justin.ruggles@gmail.com>
Fri, 23 Mar 2012 05:19:42 +0000 (01:19 -0400)
avconv.c

index 9a3c75d..f1da50f 100644 (file)
--- a/avconv.c
+++ b/avconv.c
@@ -142,6 +142,8 @@ static int print_stats = 1;
 
 static uint8_t *audio_buf;
 static unsigned int allocated_audio_buf_size;
+static uint8_t *async_buf;
+static unsigned int allocated_async_buf_size;
 
 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
 
@@ -718,6 +720,8 @@ void exit_program(int ret)
     uninit_opts();
     av_free(audio_buf);
     allocated_audio_buf_size = 0;
+    av_free(async_buf);
+    allocated_async_buf_size = 0;
 
 #if CONFIG_AVFILTER
     avfilter_uninit();
@@ -1117,8 +1121,12 @@ need_realloc:
                         return;
                     ist->is_start = 0;
                 } else {
-                    static uint8_t *input_tmp = NULL;
-                    input_tmp = av_realloc(input_tmp, byte_delta + size);
+                    av_fast_malloc(&async_buf, &allocated_async_buf_size,
+                                   byte_delta + size);
+                    if (!async_buf) {
+                        av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
+                        exit_program(1);
+                    }
 
                     if (byte_delta > allocated_for_size - size) {
                         allocated_for_size = byte_delta + (int64_t)size;
@@ -1126,9 +1134,9 @@ need_realloc:
                     }
                     ist->is_start = 0;
 
-                    generate_silence(input_tmp, dec->sample_fmt, byte_delta);
-                    memcpy(input_tmp + byte_delta, buf, size);
-                    buf = input_tmp;
+                    generate_silence(async_buf, dec->sample_fmt, byte_delta);
+                    memcpy(async_buf + byte_delta, buf, size);
+                    buf = async_buf;
                     size += byte_delta;
                     av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
                 }