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