Mercurial > libavcodec.hg
changeset 7286:e267f2519248 libavcodec
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.
author | lorenm |
---|---|
date | Wed, 16 Jul 2008 00:50:12 +0000 |
parents | 1fe3ae6a9491 |
children | 697213189d07 |
files | dsputil.c dsputil.h i386/dsputil_mmx.c vorbis_dec.c |
diffstat | 4 files changed, 21 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/dsputil.c Tue Jul 15 23:04:28 2008 +0000 +++ b/dsputil.c Wed Jul 16 00:50:12 2008 +0000 @@ -3962,17 +3962,17 @@ 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; i<len; i++){ - dst[2*i] = float_to_int16_one(src+i); - dst[2*i+1] = float_to_int16_one(src+i+len); + dst[2*i] = float_to_int16_one(src[0]+i); + dst[2*i+1] = float_to_int16_one(src[1]+i); } }else{ - for(c=0; c<channels; c++, src+=len) + for(c=0; c<channels; c++) for(i=0, j=c; i<len; i++, j+=channels) - dst[j] = float_to_int16_one(src+i); + dst[j] = float_to_int16_one(src[c]+i); } }
--- a/dsputil.h Tue Jul 15 23:04:28 2008 +0000 +++ b/dsputil.h Wed Jul 16 00:50:12 2008 +0000 @@ -372,7 +372,7 @@ /* C version: convert floats from the range [384.0,386.0] to ints in [-32768,32767] * simd versions: convert floats from [-32768.0,32767.0] without rescaling and arrays are 16byte aligned */ void (*float_to_int16)(int16_t *dst, const float *src, long len); - void (*float_to_int16_interleave)(int16_t *dst, const float *src, long len, int channels); + void (*float_to_int16_interleave)(int16_t *dst, const float **src, long len, int channels); /* (I)DCT */ void (*fdct)(DCTELEM *block/* align 16*/);
--- a/i386/dsputil_mmx.c Tue Jul 15 23:04:28 2008 +0000 +++ b/i386/dsputil_mmx.c Wed Jul 16 00:50:12 2008 +0000 @@ -2156,32 +2156,32 @@ #define FLOAT_TO_INT16_INTERLEAVE(cpu, body) \ /* gcc pessimizes register allocation if this is in the same function as float_to_int16_interleave_sse2*/\ -static av_noinline void float_to_int16_interleave2_##cpu(int16_t *dst, const float *src, long len, int channels){\ - DECLARE_ALIGNED_16(int16_t, tmp[len*channels]);\ +static av_noinline void float_to_int16_interleave2_##cpu(int16_t *dst, const float **src, long len, int channels){\ + DECLARE_ALIGNED_16(int16_t, tmp[len]);\ int i,j,c;\ - float_to_int16_##cpu(tmp, src, len*channels);\ for(c=0; c<channels; c++){\ - int16_t *ptmp = tmp+c*len;\ + float_to_int16_##cpu(tmp, src[c], len);\ for(i=0, j=c; i<len; i++, j+=channels)\ - dst[j] = ptmp[i];\ + dst[j] = tmp[i];\ }\ }\ \ -static void float_to_int16_interleave_##cpu(int16_t *dst, const float *src, long len, int channels){\ +static void float_to_int16_interleave_##cpu(int16_t *dst, const float **src, long len, int channels){\ if(channels==1)\ - float_to_int16_##cpu(dst, src, len);\ + float_to_int16_##cpu(dst, src[0], len);\ else if(channels>2)\ 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)\ );\ }\ }
--- a/vorbis_dec.c Tue Jul 15 23:04:28 2008 +0000 +++ b/vorbis_dec.c Wed Jul 16 00:50:12 2008 +0000 @@ -1553,6 +1553,8 @@ { 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 @@ 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; i<vc->audio_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 ;