mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avconv: use avcodec_decode_audio4() instead of avcodec_decode_audio3()
This commit is contained in:
parent
6d23d19729
commit
d1241ff3b2
55
avconv.c
55
avconv.c
@ -137,8 +137,6 @@ static uint8_t *audio_buf;
|
||||
static uint8_t *audio_out;
|
||||
static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
|
||||
|
||||
static void *samples;
|
||||
|
||||
#define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
|
||||
|
||||
typedef struct InputStream {
|
||||
@ -541,7 +539,6 @@ void exit_program(int ret)
|
||||
av_free(audio_buf);
|
||||
av_free(audio_out);
|
||||
allocated_audio_buf_size= allocated_audio_out_size= 0;
|
||||
av_free(samples);
|
||||
|
||||
#if CONFIG_AVFILTER
|
||||
avfilter_uninit();
|
||||
@ -737,14 +734,11 @@ static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_
|
||||
memset(buf, fill_char, size);
|
||||
}
|
||||
|
||||
static void do_audio_out(AVFormatContext *s,
|
||||
OutputStream *ost,
|
||||
InputStream *ist,
|
||||
unsigned char *buf, int size)
|
||||
static void do_audio_out(AVFormatContext *s, OutputStream *ost,
|
||||
InputStream *ist, AVFrame *decoded_frame)
|
||||
{
|
||||
uint8_t *buftmp;
|
||||
int64_t audio_out_size, audio_buf_size;
|
||||
int64_t allocated_for_size= size;
|
||||
|
||||
int size_out, frame_bytes, ret, resample_changed;
|
||||
AVCodecContext *enc= ost->st->codec;
|
||||
@ -752,6 +746,9 @@ static void do_audio_out(AVFormatContext *s,
|
||||
int osize = av_get_bytes_per_sample(enc->sample_fmt);
|
||||
int isize = av_get_bytes_per_sample(dec->sample_fmt);
|
||||
const int coded_bps = av_get_bits_per_sample(enc->codec->id);
|
||||
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);
|
||||
@ -1620,39 +1617,40 @@ static void rate_emu_sleep(InputStream *ist)
|
||||
|
||||
static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||
{
|
||||
static unsigned int samples_size = 0;
|
||||
AVFrame *decoded_frame;
|
||||
AVCodecContext *avctx = ist->st->codec;
|
||||
int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
|
||||
uint8_t *decoded_data_buf = NULL;
|
||||
int decoded_data_size = 0;
|
||||
int i, ret;
|
||||
|
||||
if (pkt && samples_size < FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
|
||||
av_free(samples);
|
||||
samples_size = FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE);
|
||||
samples = av_malloc(samples_size);
|
||||
}
|
||||
decoded_data_size = samples_size;
|
||||
if (!(decoded_frame = avcodec_alloc_frame()))
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
|
||||
pkt);
|
||||
if (ret < 0)
|
||||
ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
|
||||
if (ret < 0) {
|
||||
av_freep(&decoded_frame);
|
||||
return ret;
|
||||
*got_output = decoded_data_size > 0;
|
||||
}
|
||||
|
||||
/* Some bug in mpeg audio decoder gives */
|
||||
/* decoded_data_size < 0, it seems they are overflows */
|
||||
if (!*got_output) {
|
||||
/* no audio frame */
|
||||
return ret;
|
||||
}
|
||||
|
||||
decoded_data_buf = (uint8_t *)samples;
|
||||
ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
|
||||
(ist->st->codec->sample_rate * ist->st->codec->channels);
|
||||
/* if the decoder provides a pts, use it instead of the last packet pts.
|
||||
the decoder could be delaying output by a packet or more. */
|
||||
if (decoded_frame->pts != AV_NOPTS_VALUE)
|
||||
ist->next_pts = decoded_frame->pts;
|
||||
|
||||
/* increment next_pts to use for the case where the input stream does not
|
||||
have timestamps or there are multiple frames in the packet */
|
||||
ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
|
||||
avctx->sample_rate;
|
||||
|
||||
// preprocess audio (volume)
|
||||
if (audio_volume != 256) {
|
||||
switch (ist->st->codec->sample_fmt) {
|
||||
int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
|
||||
void *samples = decoded_frame->data[0];
|
||||
switch (avctx->sample_fmt) {
|
||||
case AV_SAMPLE_FMT_U8:
|
||||
{
|
||||
uint8_t *volp = samples;
|
||||
@ -1713,8 +1711,7 @@ static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||
|
||||
if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
|
||||
continue;
|
||||
do_audio_out(output_files[ost->file_index].ctx, ost, ist,
|
||||
decoded_data_buf, decoded_data_size);
|
||||
do_audio_out(output_files[ost->file_index].ctx, ost, ist, decoded_frame);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user