diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-03-21 16:55:30 -0400 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-03-23 01:19:43 -0400 |
commit | 9869e963a6a6bd3a8bd118cee698df08d84cbfba (patch) | |
tree | e3211255cc301ce02198bc6c1191af151e485d6d /avconv.c | |
parent | f3ab3e1aeec318763065303a1569796131d3a561 (diff) | |
download | ffmpeg-9869e963a6a6bd3a8bd118cee698df08d84cbfba.tar.gz |
avconv: move audio output buffer allocation to a separate function
Allows for removing a goto and makes the code easier to follow.
Diffstat (limited to 'avconv.c')
-rw-r--r-- | avconv.c | 52 |
1 files changed, 32 insertions, 20 deletions
@@ -1011,11 +1011,37 @@ static int encode_audio_frame(AVFormatContext *s, OutputStream *ost, return pkt.size; } +static int alloc_audio_output_buf(AVCodecContext *dec, AVCodecContext *enc, + int nb_samples) +{ + int64_t audio_buf_samples; + int audio_buf_size; + + /* calculate required number of samples to allocate */ + audio_buf_samples = ((int64_t)nb_samples * enc->sample_rate + dec->sample_rate) / + dec->sample_rate; + audio_buf_samples = audio_buf_samples * 2 + 10000; // safety factors for the deprecated resampling API + audio_buf_samples = FFMAX(audio_buf_samples, enc->frame_size); + if (audio_buf_samples > INT_MAX) + return AVERROR(EINVAL); + + audio_buf_size = av_samples_get_buffer_size(NULL, enc->channels, + audio_buf_samples, + enc->sample_fmt, 32); + if (audio_buf_size < 0) + return audio_buf_size; + + av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size); + if (!audio_buf) + return AVERROR(ENOMEM); + + return 0; +} + static void do_audio_out(AVFormatContext *s, OutputStream *ost, InputStream *ist, AVFrame *decoded_frame) { uint8_t *buftmp; - int64_t audio_buf_size; int size_out, frame_bytes, resample_changed; AVCodecContext *enc = ost->st->codec; @@ -1024,23 +1050,9 @@ static void do_audio_out(AVFormatContext *s, OutputStream *ost, int isize = av_get_bytes_per_sample(dec->sample_fmt); uint8_t *buf = decoded_frame->data[0]; int size = decoded_frame->nb_samples * dec->channels * isize; - int64_t allocated_for_size = size; - -need_realloc: - audio_buf_size = (allocated_for_size + isize * dec->channels - 1) / (isize * dec->channels); - audio_buf_size = (audio_buf_size * enc->sample_rate + dec->sample_rate) / dec->sample_rate; - audio_buf_size = audio_buf_size * 2 + 10000; // safety factors for the deprecated resampling API - audio_buf_size = FFMAX(audio_buf_size, enc->frame_size); - audio_buf_size *= osize * enc->channels; - - if (audio_buf_size > INT_MAX) { - av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n"); - exit_program(1); - } - av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size); - if (!audio_buf) { - av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n"); + if (alloc_audio_output_buf(dec, enc, decoded_frame->nb_samples) < 0) { + av_log(NULL, AV_LOG_FATAL, "Error allocating audio buffer\n"); exit_program(1); } @@ -1128,9 +1140,9 @@ need_realloc: exit_program(1); } - if (byte_delta > allocated_for_size - size) { - allocated_for_size = byte_delta + (int64_t)size; - goto need_realloc; + if (alloc_audio_output_buf(dec, enc, decoded_frame->nb_samples + idelta) < 0) { + av_log(NULL, AV_LOG_FATAL, "Error allocating audio buffer\n"); + exit_program(1); } ist->is_start = 0; |