|  |  |  | @ -105,16 +105,20 @@ int FFAudioResample::openOutputFile(const char *filename, int sample_rate) { | 
			
		
	
		
			
				
					|  |  |  |  |     return 0; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | int FFAudioResample::initResample() { | 
			
		
	
		
			
				
					|  |  |  |  |     resample->resampleCtx = swr_alloc_set_opts(nullptr, | 
			
		
	
		
			
				
					|  |  |  |  |                                            av_get_default_channel_layout(resample->outCodecCtx->channels), | 
			
		
	
		
			
				
					|  |  |  |  |                                            resample->outCodecCtx->sample_fmt, | 
			
		
	
		
			
				
					|  |  |  |  |                                            resample->outCodecCtx->sample_rate, | 
			
		
	
		
			
				
					|  |  |  |  |                                            av_get_default_channel_layout(resample->inCodecCtx->channels), | 
			
		
	
		
			
				
					|  |  |  |  |                                            resample->inCodecCtx->sample_fmt, | 
			
		
	
		
			
				
					|  |  |  |  |                                            resample->inCodecCtx->sample_rate, | 
			
		
	
		
			
				
					|  |  |  |  | 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); | 
			
		
	
		
			
				
					|  |  |  |  |     return swr_init(resample->resampleCtx); | 
			
		
	
		
			
				
					|  |  |  |  |     int ret = swr_init(context); | 
			
		
	
		
			
				
					|  |  |  |  |     ar->resampleCtx = context; | 
			
		
	
		
			
				
					|  |  |  |  |     *pResample = ar; | 
			
		
	
		
			
				
					|  |  |  |  |     return ret; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | int FFAudioResample::decodeAudioFrame(AVFrame *frame, int *data_present, int *finished) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -227,17 +231,18 @@ cleanup: | 
			
		
	
		
			
				
					|  |  |  |  |     return ret; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static int initOutputFrame(AVFrame **frame, AVCodecContext *output_codec_context) { | 
			
		
	
		
			
				
					|  |  |  |  |     *frame = av_frame_alloc(); | 
			
		
	
		
			
				
					|  |  |  |  |     (*frame)->nb_samples     = output_codec_context->frame_size; | 
			
		
	
		
			
				
					|  |  |  |  |     (*frame)->channel_layout = output_codec_context->channel_layout; | 
			
		
	
		
			
				
					|  |  |  |  |     (*frame)->format         = output_codec_context->sample_fmt; | 
			
		
	
		
			
				
					|  |  |  |  |     (*frame)->sample_rate    = output_codec_context->sample_rate; | 
			
		
	
		
			
				
					|  |  |  |  | static int initOutputFrame(AudioResample **pResample) { | 
			
		
	
		
			
				
					|  |  |  |  |     AudioResample *ar = *pResample; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     int ret = av_frame_get_buffer(*frame, 0); | 
			
		
	
		
			
				
					|  |  |  |  |     if (ret < 0) { | 
			
		
	
		
			
				
					|  |  |  |  |         ALOGE("Could not allocate output frame samples (error:%s)\n", av_err2str(ret)); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     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; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -313,12 +318,12 @@ int FFAudioResample::resampling(const char *src_file, const char *dst_file, int | 
			
		
	
		
			
				
					|  |  |  |  |     if (openOutputFile(dst_file, sampleRate)) | 
			
		
	
		
			
				
					|  |  |  |  |         goto cleanup; | 
			
		
	
		
			
				
					|  |  |  |  |     /* Initialize the re-sampler to be able to convert audio sample formats. */ | 
			
		
	
		
			
				
					|  |  |  |  |     if (initResample()) | 
			
		
	
		
			
				
					|  |  |  |  |     if (initResample(&resample)) | 
			
		
	
		
			
				
					|  |  |  |  |         goto cleanup; | 
			
		
	
		
			
				
					|  |  |  |  |     /* Initialize the FIFO buffer to store audio samples to be encoded. */ | 
			
		
	
		
			
				
					|  |  |  |  |     resample->fifo = av_audio_fifo_alloc(resample->outCodecCtx->sample_fmt, | 
			
		
	
		
			
				
					|  |  |  |  |                                          resample->outCodecCtx->channels, 1024 * 10); | 
			
		
	
		
			
				
					|  |  |  |  |     if (initOutputFrame(&resample->outFrame, resample->outCodecCtx)) | 
			
		
	
		
			
				
					|  |  |  |  |     if (initOutputFrame(&resample)) | 
			
		
	
		
			
				
					|  |  |  |  |         goto cleanup; | 
			
		
	
		
			
				
					|  |  |  |  |     /* Write the header of the output file container. */ | 
			
		
	
		
			
				
					|  |  |  |  |     if ((ret = avformat_write_header(resample->outFormatCtx, nullptr)) < 0) { | 
			
		
	
	
		
			
				
					|  |  |  | 
 |