mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-16 12:24:52 +00: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:
parent
f3ab3e1aee
commit
9869e963a6
52
avconv.c
52
avconv.c
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user