1
mirror of https://git.videolan.org/git/ffmpeg.git synced 2024-10-02 17:12:49 +02:00

avconv: move audio output buffer allocation to a separate function

Allows for removing a goto and makes the code easier to follow.
This commit is contained in:
Justin Ruggles 2012-03-21 16:55:30 -04:00
parent f3ab3e1aee
commit 9869e963a6

View File

@ -1011,11 +1011,37 @@ static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
return pkt.size; 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, static void do_audio_out(AVFormatContext *s, OutputStream *ost,
InputStream *ist, AVFrame *decoded_frame) InputStream *ist, AVFrame *decoded_frame)
{ {
uint8_t *buftmp; uint8_t *buftmp;
int64_t audio_buf_size;
int size_out, frame_bytes, resample_changed; int size_out, frame_bytes, resample_changed;
AVCodecContext *enc = ost->st->codec; 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); int isize = av_get_bytes_per_sample(dec->sample_fmt);
uint8_t *buf = decoded_frame->data[0]; uint8_t *buf = decoded_frame->data[0];
int size = decoded_frame->nb_samples * dec->channels * isize; int size = decoded_frame->nb_samples * dec->channels * isize;
int64_t allocated_for_size = size;
need_realloc: if (alloc_audio_output_buf(dec, enc, decoded_frame->nb_samples) < 0) {
audio_buf_size = (allocated_for_size + isize * dec->channels - 1) / (isize * dec->channels); av_log(NULL, AV_LOG_FATAL, "Error allocating audio buffer\n");
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");
exit_program(1); exit_program(1);
} }
@ -1128,9 +1140,9 @@ need_realloc:
exit_program(1); exit_program(1);
} }
if (byte_delta > allocated_for_size - size) { if (alloc_audio_output_buf(dec, enc, decoded_frame->nb_samples + idelta) < 0) {
allocated_for_size = byte_delta + (int64_t)size; av_log(NULL, AV_LOG_FATAL, "Error allocating audio buffer\n");
goto need_realloc; exit_program(1);
} }
ist->is_start = 0; ist->is_start = 0;