From 5eb0f2a425b6e1e0f821b52972b7af75de3480e2 Mon Sep 17 00:00:00 2001 From: Loren Merritt Date: Wed, 16 Jul 2008 00:50:12 +0000 Subject: [PATCH] float_to_int16_interleave: change src to an array of pointers instead of assuming it's contiguous. this has no immediate effect, but will allow it to be used in more codecs. Originally committed as revision 14252 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/dsputil.c | 10 +++++----- libavcodec/dsputil.h | 2 +- libavcodec/i386/dsputil_mmx.c | 20 ++++++++++---------- libavcodec/vorbis_dec.c | 6 +++++- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c index 212e2415da..a9661eb2b5 100644 --- a/libavcodec/dsputil.c +++ b/libavcodec/dsputil.c @@ -3962,17 +3962,17 @@ void ff_float_to_int16_c(int16_t *dst, const float *src, long len){ dst[i] = float_to_int16_one(src+i); } -void ff_float_to_int16_interleave_c(int16_t *dst, const float *src, long len, int channels){ +void ff_float_to_int16_interleave_c(int16_t *dst, const float **src, long len, int channels){ int i,j,c; if(channels==2){ for(i=0; i2)\ float_to_int16_interleave2_##cpu(dst, src, len, channels);\ else{\ - float *src1;\ + const float *src0 = src[0];\ + const float *src1 = src[1];\ asm volatile(\ "shl $2, %0 \n"\ "add %0, %1 \n"\ "add %0, %2 \n"\ - "lea (%2,%0), %3 \n"\ + "add %0, %3 \n"\ "neg %0 \n"\ body\ - :"+r"(len), "+r"(dst), "+r"(src), "=r"(src1)\ + :"+r"(len), "+r"(dst), "+r"(src0), "+r"(src1)\ );\ }\ } diff --git a/libavcodec/vorbis_dec.c b/libavcodec/vorbis_dec.c index a338141b92..0f0c17b617 100644 --- a/libavcodec/vorbis_dec.c +++ b/libavcodec/vorbis_dec.c @@ -1553,6 +1553,8 @@ static int vorbis_decode_frame(AVCodecContext *avccontext, { vorbis_context *vc = avccontext->priv_data ; GetBitContext *gb = &(vc->gb); + const float *channel_ptrs[vc->audio_channels]; + int i; int_fast16_t len; @@ -1579,7 +1581,9 @@ static int vorbis_decode_frame(AVCodecContext *avccontext, AV_DEBUG("parsed %d bytes %d bits, returned %d samples (*ch*bits) \n", get_bits_count(gb)/8, get_bits_count(gb)%8, len); - vc->dsp.float_to_int16_interleave(data, vc->channel_residues, len, vc->audio_channels); + for(i=0; iaudio_channels; i++) + channel_ptrs[i] = vc->channel_residues+i*len; + vc->dsp.float_to_int16_interleave(data, channel_ptrs, len, vc->audio_channels); *data_size=len*2*vc->audio_channels; return buf_size ;