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 ;