|
|
@ -39,6 +39,8 @@ static AVPacket input_packet; |
|
|
|
|
|
|
|
|
|
|
|
static AVPacket output_packet; |
|
|
|
static AVPacket output_packet; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static AVFrame *output_frame; |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Open an input file and the required decoder. |
|
|
|
* Open an input file and the required decoder. |
|
|
|
* |
|
|
|
* |
|
|
@ -451,32 +453,18 @@ cleanup: |
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
static int init_output_frame(AVFrame **frame, AVCodecContext *output_codec_context) { |
|
|
|
* Initialize one input frame for writing to the output file. |
|
|
|
*frame = av_frame_alloc(); |
|
|
|
* |
|
|
|
(*frame)->nb_samples = output_codec_context->frame_size; |
|
|
|
*/ |
|
|
|
|
|
|
|
static int init_output_frame(AVFrame **frame, |
|
|
|
|
|
|
|
AVCodecContext *output_codec_context, |
|
|
|
|
|
|
|
int frame_size) { |
|
|
|
|
|
|
|
int error; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!(*frame = av_frame_alloc())) { |
|
|
|
|
|
|
|
ALOGE("Could not allocate output frame\n"); |
|
|
|
|
|
|
|
return AVERROR_EXIT; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(*frame)->nb_samples = frame_size; |
|
|
|
|
|
|
|
(*frame)->channel_layout = output_codec_context->channel_layout; |
|
|
|
(*frame)->channel_layout = output_codec_context->channel_layout; |
|
|
|
(*frame)->format = output_codec_context->sample_fmt; |
|
|
|
(*frame)->format = output_codec_context->sample_fmt; |
|
|
|
(*frame)->sample_rate = output_codec_context->sample_rate; |
|
|
|
(*frame)->sample_rate = output_codec_context->sample_rate; |
|
|
|
|
|
|
|
|
|
|
|
if ((error = av_frame_get_buffer(*frame, 0)) < 0) { |
|
|
|
int ret = av_frame_get_buffer(*frame, 0); |
|
|
|
ALOGE("Could not allocate output frame samples (error:%s)\n", av_err2str(error)); |
|
|
|
if (ret < 0) { |
|
|
|
av_frame_free(frame); |
|
|
|
ALOGE("Could not allocate output frame samples (error:%s)\n", av_err2str(ret)); |
|
|
|
return error; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return ret; |
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -541,25 +529,19 @@ static int load_encode_and_write(AVAudioFifo *fifo, |
|
|
|
AVFormatContext *output_format_context, |
|
|
|
AVFormatContext *output_format_context, |
|
|
|
AVCodecContext *output_codec_context) { |
|
|
|
AVCodecContext *output_codec_context) { |
|
|
|
int data_written; |
|
|
|
int data_written; |
|
|
|
AVFrame *output_frame; |
|
|
|
|
|
|
|
const int frame_size = FFMIN(av_audio_fifo_size(fifo), |
|
|
|
const int frame_size = FFMIN(av_audio_fifo_size(fifo), |
|
|
|
output_codec_context->frame_size); |
|
|
|
output_codec_context->frame_size); |
|
|
|
|
|
|
|
|
|
|
|
if (init_output_frame(&output_frame, output_codec_context, frame_size)) |
|
|
|
output_frame->nb_samples = frame_size; |
|
|
|
return AVERROR_EXIT; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (av_audio_fifo_read(fifo, (void **)output_frame->data, frame_size) < frame_size) { |
|
|
|
if (av_audio_fifo_read(fifo, (void **)output_frame->data, frame_size) < frame_size) { |
|
|
|
ALOGE("Could not read data from FIFO\n"); |
|
|
|
ALOGE("Could not read data from FIFO\n"); |
|
|
|
av_frame_free(&output_frame); |
|
|
|
|
|
|
|
return AVERROR_EXIT; |
|
|
|
return AVERROR_EXIT; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (encode_audio_frame(output_frame, output_format_context, |
|
|
|
if (encode_audio_frame(output_frame, output_format_context, |
|
|
|
output_codec_context, &data_written)) { |
|
|
|
output_codec_context, &data_written)) { |
|
|
|
av_frame_free(&output_frame); |
|
|
|
|
|
|
|
return AVERROR_EXIT; |
|
|
|
return AVERROR_EXIT; |
|
|
|
} |
|
|
|
} |
|
|
|
av_frame_free(&output_frame); |
|
|
|
|
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -598,6 +580,8 @@ int resampling(const char *src_file, const char *dst_file, int sampleRate) { |
|
|
|
/* Initialize the FIFO buffer to store audio samples to be encoded. */ |
|
|
|
/* Initialize the FIFO buffer to store audio samples to be encoded. */ |
|
|
|
if (init_fifo(&fifo, output_codec_context)) |
|
|
|
if (init_fifo(&fifo, output_codec_context)) |
|
|
|
goto cleanup; |
|
|
|
goto cleanup; |
|
|
|
|
|
|
|
if (init_output_frame(&output_frame, output_codec_context)) |
|
|
|
|
|
|
|
goto cleanup; |
|
|
|
/* Write the header of the output file container. */ |
|
|
|
/* Write the header of the output file container. */ |
|
|
|
if (write_output_file_header(output_format_context)) |
|
|
|
if (write_output_file_header(output_format_context)) |
|
|
|
goto cleanup; |
|
|
|
goto cleanup; |
|
|
@ -656,6 +640,8 @@ cleanup: |
|
|
|
avcodec_free_context(&input_codec_context); |
|
|
|
avcodec_free_context(&input_codec_context); |
|
|
|
if (input_format_context) |
|
|
|
if (input_format_context) |
|
|
|
avformat_close_input(&input_format_context); |
|
|
|
avformat_close_input(&input_format_context); |
|
|
|
|
|
|
|
if (output_frame) |
|
|
|
|
|
|
|
av_frame_free(&output_frame); |
|
|
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|