diff --git a/app/src/main/cpp/ff_audio_resample.cpp b/app/src/main/cpp/ff_audio_resample.cpp index 53229cf..2a93685 100644 --- a/app/src/main/cpp/ff_audio_resample.cpp +++ b/app/src/main/cpp/ff_audio_resample.cpp @@ -15,6 +15,54 @@ FFAudioResample::~FFAudioResample() { delete resample; } +static int initOutputFrame(AudioResample **pResample) { + AudioResample *ar = *pResample; + + AVFrame *frame = av_frame_alloc(); + frame->format = ar->outCodecCtx->sample_fmt; + frame->nb_samples = ar->outCodecCtx->frame_size; + frame->sample_rate = ar->outCodecCtx->sample_rate; + frame->channel_layout = ar->outCodecCtx->channel_layout; + + int ret = av_frame_get_buffer(frame, 0); + ar->outFrame = frame; + *pResample = ar; + return ret; +} + +static int initResample(AudioResample **pResample) { + AudioResample *ar = *pResample; + SwrContext *context = swr_alloc_set_opts(nullptr, + av_get_default_channel_layout(ar->outCodecCtx->channels), + ar->outCodecCtx->sample_fmt, + ar->outCodecCtx->sample_rate, + av_get_default_channel_layout(ar->inCodecCtx->channels), + ar->inCodecCtx->sample_fmt, + ar->inCodecCtx->sample_rate, + 0, nullptr); + int ret = swr_init(context); + ar->resampleCtx = context; + *pResample = ar; + return ret; +} + +static int initConvertedSamples(AudioResample **pResample, uint8_t ***converted_input_samples, int frame_size) { + int ret; + AudioResample *ar = *pResample; + *converted_input_samples = (uint8_t **) calloc(ar->outCodecCtx->channels, sizeof(**converted_input_samples)); + + if ((ret = av_samples_alloc(*converted_input_samples, nullptr, + ar->outCodecCtx->channels, + frame_size, + ar->outCodecCtx->sample_fmt, 0)) < 0) { + ALOGE("av_samples_alloc error:%s", av_err2str(ret)); + av_freep(&(*converted_input_samples)[0]); + free(*converted_input_samples); + return ret; + } + return 0; +} + int FFAudioResample::openInputFile(const char *filename) { int ret; const AVCodec *input_codec; @@ -105,22 +153,6 @@ int FFAudioResample::openOutputFile(const char *filename, int sample_rate) { return 0; } -static int initResample(AudioResample **pResample) { - AudioResample *ar = *pResample; - SwrContext *context = swr_alloc_set_opts(nullptr, - av_get_default_channel_layout(ar->outCodecCtx->channels), - ar->outCodecCtx->sample_fmt, - ar->outCodecCtx->sample_rate, - av_get_default_channel_layout(ar->inCodecCtx->channels), - ar->inCodecCtx->sample_fmt, - ar->inCodecCtx->sample_rate, - 0, nullptr); - int ret = swr_init(context); - ar->resampleCtx = context; - *pResample = ar; - return ret; -} - int FFAudioResample::decodeAudioFrame(AVFrame *frame, int *data_present, int *finished) { int ret; @@ -165,26 +197,6 @@ cleanup: return ret; } -int FFAudioResample::initConvertedSamples(uint8_t ***converted_input_samples, int frame_size) { - int ret; - if (!(*converted_input_samples = (uint8_t **) calloc(resample->outCodecCtx->channels, - sizeof(**converted_input_samples)))) { - ALOGE("Could not allocate converted input sample pointers\n"); - return AVERROR(ENOMEM); - } - - if ((ret = av_samples_alloc(*converted_input_samples, nullptr, - resample->outCodecCtx->channels, - frame_size, - resample->outCodecCtx->sample_fmt, 0)) < 0) { - ALOGE("Could not allocate converted input samples (error:%s)\n", av_err2str(ret)); - av_freep(&(*converted_input_samples)[0]); - free(*converted_input_samples); - return ret; - } - return 0; -} - /** * Read one audio frame from the input file, decode, convert and store * it in the FIFO buffer. @@ -207,7 +219,7 @@ int FFAudioResample::decodeAndConvert(int *finished) { int dst_nb_samples = (int) av_rescale_rnd(resample->inFrame->nb_samples, resample->outCodecCtx->sample_rate, resample->inCodecCtx->sample_rate, AV_ROUND_UP); - if (initConvertedSamples(&converted_dst_samples, dst_nb_samples)) + if (initConvertedSamples(&resample, &converted_dst_samples, dst_nb_samples)) goto cleanup; ret = swr_convert(resample->resampleCtx, converted_dst_samples, dst_nb_samples, @@ -231,21 +243,6 @@ cleanup: return ret; } -static int initOutputFrame(AudioResample **pResample) { - AudioResample *ar = *pResample; - - AVFrame *frame = av_frame_alloc(); - frame->format = ar->outCodecCtx->sample_fmt; - frame->nb_samples = ar->outCodecCtx->frame_size; - frame->sample_rate = ar->outCodecCtx->sample_rate; - frame->channel_layout = ar->outCodecCtx->channel_layout; - - int ret = av_frame_get_buffer(frame, 0); - ar->outFrame = frame; - *pResample = ar; - return ret; -} - int FFAudioResample::encodeAudioFrame(AVFrame *frame, int *data_present) { int ret; diff --git a/app/src/main/cpp/ff_audio_resample.h b/app/src/main/cpp/ff_audio_resample.h index 3a81b29..2a4547e 100644 --- a/app/src/main/cpp/ff_audio_resample.h +++ b/app/src/main/cpp/ff_audio_resample.h @@ -54,8 +54,6 @@ private: int decodeAudioFrame(AVFrame *frame, int *data_present, int *finished); - int initConvertedSamples(uint8_t ***converted_input_samples, int frame_size); - int decodeAndConvert(int *finished); int encodeAudioFrame(AVFrame *frame, int *data_present);