---
 avconv.c                  |   13 +++++--------
 avplay.c                  |   28 ++++++++++++++--------------
 libavcodec/audioconvert.c |   45 +++++++++++++++++++++++++++++++++++----------
 libavcodec/audioconvert.h |    5 ++---
 libavcodec/resample.c     |   25 ++++++++-----------------
 5 files changed, 64 insertions(+), 52 deletions(-)

diff --git a/avconv.c b/avconv.c
index 6ca9289..7385666 100644
--- a/avconv.c
+++ b/avconv.c
@@ -1085,7 +1085,7 @@ need_realloc:
         if (ost->reformat_ctx)
             av_audio_convert_free(ost->reformat_ctx);
         ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt,
-                                                   dec->sample_fmt, 1);
+                                                   dec->sample_fmt, 
enc->channels);
         if (!ost->reformat_ctx) {
             av_log(NULL, AV_LOG_FATAL, "Cannot convert %s sample format to %s 
sample format\n",
                    av_get_sample_fmt_name(dec->sample_fmt),
@@ -1154,19 +1154,16 @@ need_realloc:
     }
 
     if (!ost->audio_resample && dec->sample_fmt != enc->sample_fmt) {
-        const void *ibuf[6] = { buftmp };
-        void *obuf[6]  = { audio_buf };
-        int istride[6] = { isize };
-        int ostride[6] = { osize };
-        int len = size_out / istride[0];
-        if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, 
len) < 0) {
+        int nb_samples = size_out / (isize * enc->channels);
+        if (av_audio_convert(ost->reformat_ctx, (void **)&audio_buf,
+                             (const void **)&buftmp, nb_samples) < 0) {
             printf("av_audio_convert() failed\n");
             if (exit_on_error)
                 exit_program(1);
             return;
         }
         buftmp = audio_buf;
-        size_out = len * osize;
+        size_out = nb_samples * osize * enc->channels;
     }
 
     /* now encode as many frames as possible */
diff --git a/avplay.c b/avplay.c
index af31eda..74bab84 100644
--- a/avplay.c
+++ b/avplay.c
@@ -2048,7 +2048,8 @@ static int audio_decode_frame(VideoState *is, double 
*pts_ptr)
                 if (is->reformat_ctx)
                     av_audio_convert_free(is->reformat_ctx);
                 is->reformat_ctx= av_audio_convert_alloc(AV_SAMPLE_FMT_S16,
-                                                         dec->sample_fmt, 1);
+                                                         dec->sample_fmt,
+                                                         dec->channels);
                 if (!is->reformat_ctx) {
                     fprintf(stderr, "Cannot convert %s sample format to %s 
sample format\n",
                         av_get_sample_fmt_name(dec->sample_fmt),
@@ -2059,24 +2060,23 @@ static int audio_decode_frame(VideoState *is, double 
*pts_ptr)
             }
 
             if (is->reformat_ctx) {
-                const void *ibuf[6] = { is->frame->data[0] };
-                void *obuf[6];
-                int istride[6] = { av_get_bytes_per_sample(dec->sample_fmt) };
-                int ostride[6] = { 2 };
-                int len= data_size/istride[0];
-                obuf[0] = av_realloc(is->audio_buf1, FFALIGN(len * ostride[0], 
32));
-                if (!obuf[0]) {
+                void *obuf;
+                int isize      = av_get_bytes_per_sample(dec->sample_fmt);
+                int osize      = av_get_bytes_per_sample(AV_SAMPLE_FMT_S16);
+                int nb_samples = data_size / (isize * dec->channels);
+                obuf = av_realloc(is->audio_buf1,
+                                  FFALIGN(nb_samples * osize * dec->channels, 
32));
+                if (!obuf)
                     return AVERROR(ENOMEM);
-                }
-                is->audio_buf1 = obuf[0];
-                if (av_audio_convert(is->reformat_ctx, obuf, ostride, ibuf, 
istride, len) < 0) {
+                is->audio_buf1 = obuf;
+                if (av_audio_convert(is->reformat_ctx, &obuf,
+                                     (const void * 
const*)is->frame->extended_data,
+                                     nb_samples) < 0) {
                     printf("av_audio_convert() failed\n");
                     break;
                 }
                 is->audio_buf = is->audio_buf1;
-                /* FIXME: existing code assume that data_size equals 
framesize*channels*2
-                          remove this legacy cruft */
-                data_size = len * 2;
+                data_size = nb_samples * osize * dec->channels;
             } else {
                 is->audio_buf = is->frame->data[0];
             }
diff --git a/libavcodec/audioconvert.c b/libavcodec/audioconvert.c
index 485c63e..0e6015e 100644
--- a/libavcodec/audioconvert.c
+++ b/libavcodec/audioconvert.c
@@ -48,6 +48,14 @@ uint64_t avcodec_guess_channel_layout(int nb_channels, enum 
CodecID codec_id, co
 struct AVAudioConvert {
     int channels;
     int fmt_pair;
+    enum AVSampleFormat out_fmt;
+    int out_planar;
+    int out_stride;
+    int out_offset;
+    enum AVSampleFormat in_fmt;
+    int in_planar;
+    int in_stride;
+    int in_offset;
 };
 
 AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt,
@@ -55,11 +63,23 @@ AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat 
out_fmt,
                                        int channels)
 {
     AVAudioConvert *ctx;
+    int isize, osize;
     ctx = av_malloc(sizeof(AVAudioConvert));
     if (!ctx)
         return NULL;
     ctx->channels = channels;
-    ctx->fmt_pair = out_fmt + AV_SAMPLE_FMT_NB*in_fmt;
+    ctx->fmt_pair   = av_get_alt_sample_fmt(out_fmt, 0) +
+                      av_get_alt_sample_fmt( in_fmt, 0) * AV_SAMPLE_FMT_NB;
+    ctx->out_fmt    = out_fmt;
+    ctx->in_fmt     = in_fmt;
+    ctx->out_planar = av_sample_fmt_is_planar(out_fmt);
+    ctx->in_planar  = av_sample_fmt_is_planar(in_fmt);
+    osize           = av_get_bytes_per_sample(ctx->out_fmt);
+    isize           = av_get_bytes_per_sample(ctx->in_fmt);
+    ctx->out_stride = osize * (ctx->out_planar ? 1 : ctx->channels);
+    ctx->in_stride  = isize * (ctx->in_planar  ? 1 : ctx->channels);
+    ctx->out_offset = !ctx->out_planar * osize;
+    ctx->in_offset  = !ctx->in_planar  * isize;
     return ctx;
 }
 
@@ -69,21 +89,26 @@ void av_audio_convert_free(AVAudioConvert *ctx)
 }
 
 int av_audio_convert(AVAudioConvert *ctx,
-                           void * const out[6], const int out_stride[6],
-                     const void * const  in[6], const int  in_stride[6], int 
len)
+                           void * const *out,
+                     const void * const  *in, int nb_samples)
 {
     int ch;
 
     //FIXME optimize common cases
 
+    const int is         = ctx->in_stride;
+    const int os         = ctx->out_stride;
+    const int in_offset  = ctx->in_offset;
+    const int out_offset = ctx->out_offset;
+
     for (ch = 0; ch < ctx->channels; ch++) {
-        const int is=  in_stride[ch];
-        const int os= out_stride[ch];
-        const uint8_t *pi=  in[ch];
-        uint8_t *po= out[ch];
-        uint8_t *end= po + os*len;
-        if(!out[ch])
-            continue;
+        const uint8_t *pi =  in[ctx->in_planar  * ch];
+        uint8_t *po       = out[ctx->out_planar * ch];
+        uint8_t *end;
+
+        pi += ch * in_offset;
+        po += ch * out_offset;
+        end = po + os * nb_samples;
 
 #define CONV(ofmt, otype, ifmt, expr)\
 if(ctx->fmt_pair == ofmt + AV_SAMPLE_FMT_NB*ifmt){\
diff --git a/libavcodec/audioconvert.h b/libavcodec/audioconvert.h
index be6273d..968061d 100644
--- a/libavcodec/audioconvert.h
+++ b/libavcodec/audioconvert.h
@@ -69,8 +69,7 @@ void av_audio_convert_free(AVAudioConvert *ctx);
  * @param[in] in_stride distance between consecutive input samples (measured 
in bytes)
  * @param len length of audio frame size (measured in samples)
  */
-int av_audio_convert(AVAudioConvert *ctx,
-                           void * const out[6], const int out_stride[6],
-                     const void * const  in[6], const int  in_stride[6], int 
len);
+int av_audio_convert(AVAudioConvert *ctx, void *const *out,
+                     const void *const *in, int nb_samples);
 
 #endif /* AVCODEC_AUDIOCONVERT_H */
diff --git a/libavcodec/resample.c b/libavcodec/resample.c
index 7aa87e1..fdd6385 100644
--- a/libavcodec/resample.c
+++ b/libavcodec/resample.c
@@ -193,7 +193,8 @@ ReSampleContext *av_audio_resample_init(int 
output_channels, int input_channels,
 
     if (s->sample_fmt[0] != AV_SAMPLE_FMT_S16) {
         if (!(s->convert_ctx[0] = av_audio_convert_alloc(AV_SAMPLE_FMT_S16,
-                                                         s->sample_fmt[0], 
1))) {
+                                                         s->sample_fmt[0],
+                                                         s->input_channels))) {
             av_log(s, AV_LOG_ERROR,
                    "Cannot convert %s sample format to s16 sample format\n",
                    av_get_sample_fmt_name(s->sample_fmt[0]));
@@ -204,7 +205,8 @@ ReSampleContext *av_audio_resample_init(int 
output_channels, int input_channels,
 
     if (s->sample_fmt[1] != AV_SAMPLE_FMT_S16) {
         if (!(s->convert_ctx[1] = av_audio_convert_alloc(s->sample_fmt[1],
-                                                         AV_SAMPLE_FMT_S16, 
1))) {
+                                                         AV_SAMPLE_FMT_S16,
+                                                         s->output_channels))) 
{
             av_log(s, AV_LOG_ERROR,
                    "Cannot convert s16 sample format to %s sample format\n",
                    av_get_sample_fmt_name(s->sample_fmt[1]));
@@ -241,10 +243,6 @@ int audio_resample(ReSampleContext *s, short *output, 
short *input, int nb_sampl
     }
 
     if (s->sample_fmt[0] != AV_SAMPLE_FMT_S16) {
-        int istride[1] = { s->sample_size[0] };
-        int ostride[1] = { 2 };
-        const void *ibuf[1] = { input };
-        void       *obuf[1];
         unsigned input_size = nb_samples * s->input_channels * 2;
 
         if (!s->buffer_size[0] || s->buffer_size[0] < input_size) {
@@ -257,10 +255,8 @@ int audio_resample(ReSampleContext *s, short *output, 
short *input, int nb_sampl
             }
         }
 
-        obuf[0] = s->buffer[0];
-
-        if (av_audio_convert(s->convert_ctx[0], obuf, ostride,
-                             ibuf, istride, nb_samples * s->input_channels) < 
0) {
+        if (av_audio_convert(s->convert_ctx[0], (void **)&s->buffer[0],
+                             (const void **)&input, nb_samples) < 0) {
             av_log(s->resample_context, AV_LOG_ERROR,
                    "Audio sample format conversion failed\n");
             return 0;
@@ -337,13 +333,8 @@ int audio_resample(ReSampleContext *s, short *output, 
short *input, int nb_sampl
     }
 
     if (s->sample_fmt[1] != AV_SAMPLE_FMT_S16) {
-        int istride[1] = { 2 };
-        int ostride[1] = { s->sample_size[1] };
-        const void *ibuf[1] = { output };
-        void       *obuf[1] = { output_bak };
-
-        if (av_audio_convert(s->convert_ctx[1], obuf, ostride,
-                             ibuf, istride, nb_samples1 * s->output_channels) 
< 0) {
+        if (av_audio_convert(s->convert_ctx[1], (void **)&output_bak,
+                             (const void **)&output, nb_samples1) < 0) {
             av_log(s->resample_context, AV_LOG_ERROR,
                    "Audio sample format convertion failed\n");
             return 0;
-- 
1.7.1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to