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