This treats mono as planar internally within libavresample rather than changing the sample format. Signed-off-by: Luca Barbato <lu_zero@gentoo.org>tags/n2.4
| @@ -288,8 +288,8 @@ AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, | |||||
| return ac; | return ac; | ||||
| } | } | ||||
| in_planar = av_sample_fmt_is_planar(in_fmt); | |||||
| out_planar = av_sample_fmt_is_planar(out_fmt); | |||||
| in_planar = ff_sample_fmt_is_planar(in_fmt, channels); | |||||
| out_planar = ff_sample_fmt_is_planar(out_fmt, channels); | |||||
| if (in_planar == out_planar) { | if (in_planar == out_planar) { | ||||
| ac->func_type = CONV_FUNC_TYPE_FLAT; | ac->func_type = CONV_FUNC_TYPE_FLAT; | ||||
| @@ -48,6 +48,14 @@ static void calc_ptr_alignment(AudioData *a) | |||||
| a->ptr_align = min_align; | a->ptr_align = min_align; | ||||
| } | } | ||||
| int ff_sample_fmt_is_planar(enum AVSampleFormat sample_fmt, int channels) | |||||
| { | |||||
| if (channels == 1) | |||||
| return 1; | |||||
| else | |||||
| return av_sample_fmt_is_planar(sample_fmt); | |||||
| } | |||||
| int ff_audio_data_set_channels(AudioData *a, int channels) | int ff_audio_data_set_channels(AudioData *a, int channels) | ||||
| { | { | ||||
| if (channels < 1 || channels > AVRESAMPLE_MAX_CHANNELS || | if (channels < 1 || channels > AVRESAMPLE_MAX_CHANNELS || | ||||
| @@ -81,7 +89,7 @@ int ff_audio_data_init(AudioData *a, uint8_t **src, int plane_size, int channels | |||||
| av_log(a, AV_LOG_ERROR, "invalid sample format\n"); | av_log(a, AV_LOG_ERROR, "invalid sample format\n"); | ||||
| return AVERROR(EINVAL); | return AVERROR(EINVAL); | ||||
| } | } | ||||
| a->is_planar = av_sample_fmt_is_planar(sample_fmt); | |||||
| a->is_planar = ff_sample_fmt_is_planar(sample_fmt, channels); | |||||
| a->planes = a->is_planar ? channels : 1; | a->planes = a->is_planar ? channels : 1; | ||||
| a->stride = a->sample_size * (a->is_planar ? 1 : channels); | a->stride = a->sample_size * (a->is_planar ? 1 : channels); | ||||
| @@ -125,7 +133,7 @@ AudioData *ff_audio_data_alloc(int channels, int nb_samples, | |||||
| av_free(a); | av_free(a); | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| a->is_planar = av_sample_fmt_is_planar(sample_fmt); | |||||
| a->is_planar = ff_sample_fmt_is_planar(sample_fmt, channels); | |||||
| a->planes = a->is_planar ? channels : 1; | a->planes = a->is_planar ? channels : 1; | ||||
| a->stride = a->sample_size * (a->is_planar ? 1 : channels); | a->stride = a->sample_size * (a->is_planar ? 1 : channels); | ||||
| @@ -29,6 +29,8 @@ | |||||
| #include "avresample.h" | #include "avresample.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| int ff_sample_fmt_is_planar(enum AVSampleFormat sample_fmt, int channels); | |||||
| /** | /** | ||||
| * Audio buffer used for intermediate storage between conversion phases. | * Audio buffer used for intermediate storage between conversion phases. | ||||
| */ | */ | ||||
| @@ -101,16 +101,10 @@ int avresample_open(AVAudioResampleContext *avr) | |||||
| av_get_sample_fmt_name(avr->internal_sample_fmt)); | av_get_sample_fmt_name(avr->internal_sample_fmt)); | ||||
| } | } | ||||
| /* treat all mono as planar for easier comparison */ | |||||
| if (avr->in_channels == 1) | |||||
| avr->in_sample_fmt = av_get_planar_sample_fmt(avr->in_sample_fmt); | |||||
| if (avr->out_channels == 1) | |||||
| avr->out_sample_fmt = av_get_planar_sample_fmt(avr->out_sample_fmt); | |||||
| /* we may need to add an extra conversion in order to remap channels if | /* we may need to add an extra conversion in order to remap channels if | ||||
| the output format is not planar */ | the output format is not planar */ | ||||
| if (avr->use_channel_map && !avr->mixing_needed && !avr->resample_needed && | if (avr->use_channel_map && !avr->mixing_needed && !avr->resample_needed && | ||||
| !av_sample_fmt_is_planar(avr->out_sample_fmt)) { | |||||
| !ff_sample_fmt_is_planar(avr->out_sample_fmt, avr->out_channels)) { | |||||
| avr->internal_sample_fmt = av_get_planar_sample_fmt(avr->out_sample_fmt); | avr->internal_sample_fmt = av_get_planar_sample_fmt(avr->out_sample_fmt); | ||||
| } | } | ||||
| @@ -119,7 +113,7 @@ int avresample_open(AVAudioResampleContext *avr) | |||||
| avr->in_convert_needed = avr->in_sample_fmt != avr->internal_sample_fmt; | avr->in_convert_needed = avr->in_sample_fmt != avr->internal_sample_fmt; | ||||
| else | else | ||||
| avr->in_convert_needed = avr->use_channel_map && | avr->in_convert_needed = avr->use_channel_map && | ||||
| !av_sample_fmt_is_planar(avr->out_sample_fmt); | |||||
| !ff_sample_fmt_is_planar(avr->out_sample_fmt, avr->out_channels); | |||||
| if (avr->resample_needed || avr->mixing_needed || avr->in_convert_needed) | if (avr->resample_needed || avr->mixing_needed || avr->in_convert_needed) | ||||
| avr->out_convert_needed = avr->internal_sample_fmt != avr->out_sample_fmt; | avr->out_convert_needed = avr->internal_sample_fmt != avr->out_sample_fmt; | ||||