Browse Source

lavr: Do not change the sample format for mono audio

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
Justin Ruggles Luca Barbato 10 years ago
parent
commit
fbc0b86599
4 changed files with 16 additions and 12 deletions
  1. +2
    -2
      libavresample/audio_convert.c
  2. +10
    -2
      libavresample/audio_data.c
  3. +2
    -0
      libavresample/audio_data.h
  4. +2
    -8
      libavresample/utils.c

+ 2
- 2
libavresample/audio_convert.c View File

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


+ 10
- 2
libavresample/audio_data.c View File

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




+ 2
- 0
libavresample/audio_data.h View File

@@ -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.
*/ */


+ 2
- 8
libavresample/utils.c View File

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


Loading…
Cancel
Save