| @@ -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; | |||
| } | |||