changeset 1398:1ddaf20ab50e trunk

[svn] AltiVec support for WMA, by Luca "lu_zero" Barbato from Gentoo.
author chainsaw
date Thu, 13 Jul 2006 16:01:57 -0700
parents 86242883ddc7
children 57de7a460283
files ChangeLog Plugins/Input/wma/libffwma/Makefile.in Plugins/Input/wma/libffwma/allformats.c Plugins/Input/wma/libffwma/asf.c Plugins/Input/wma/libffwma/avcodec.h Plugins/Input/wma/libffwma/avio.c Plugins/Input/wma/libffwma/aviobuf.c Plugins/Input/wma/libffwma/common.h Plugins/Input/wma/libffwma/dsputil.h Plugins/Input/wma/libffwma/fft.c Plugins/Input/wma/libffwma/futils.c Plugins/Input/wma/libffwma/mdct.c Plugins/Input/wma/libffwma/mms.c Plugins/Input/wma/libffwma/utils.c Plugins/Input/wma/libffwma/wmadec.c Plugins/Input/wma/wma.c configure.ac
diffstat 17 files changed, 247 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Jul 12 21:16:35 2006 -0700
+++ b/ChangeLog	Thu Jul 13 16:01:57 2006 -0700
@@ -1,3 +1,13 @@
+2006-07-13 04:16:35 +0000  William Pitcock <nenolod@nenolod.net>
+  revision [1708]
+  - handle a situation where ID3 tags are bolted on the front.
+  (BladeEnc -- I am looking at you, and I am not very happy.)
+  
+
+  Changes:        Modified:
+  +5 -0           trunk/Plugins/Input/mpg123/mpg123.c  
+
+
 2006-07-12 18:25:26 +0000  Derek Pomery <nemo@m8y.org>
   revision [1706]
   This alert is uninformative and due to design, spawns repeatedly instead of using one window.  No other plugin does this, and if it is considered useful, should perhaps go to some sort of log window.
--- a/Plugins/Input/wma/libffwma/Makefile.in	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/Makefile.in	Thu Jul 13 16:01:57 2006 -0700
@@ -11,7 +11,7 @@
 		fft.c file.c futils.c mdct.c mms.c \
 		os_support.c os_support.h \
 		parser.c simple_idct.c simple_idct.h \
-		utils.h utils.c wmadata.h wmadec.c
+		utils.h utils.c wmadata.h wmadec.c mem.c
 
 CFLAGS+=	-fPIC -DPIC $(GTK_CFLAGS) -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_GNU_SOURCE -c -I../../../.. -I../../../../intl
 
--- a/Plugins/Input/wma/libffwma/allformats.c	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/allformats.c	Thu Jul 13 16:01:57 2006 -0700
@@ -29,7 +29,7 @@
     register_protocol(&file_protocol);
     register_protocol(&pipe_protocol);
 
-#if 0
+#if 1
     register_protocol(&mms_protocol);
 #endif
 }
--- a/Plugins/Input/wma/libffwma/asf.c	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/asf.c	Thu Jul 13 16:01:57 2006 -0700
@@ -757,7 +757,7 @@
 	    /* return packet */
 	    if (asf_st->ds_span > 1) {
 		/* packet descrambling */
-		unsigned char* newdata = malloc(asf_st->pkt.size);
+		unsigned char* newdata = av_malloc(asf_st->pkt.size);
 		if (newdata) {
 		    int offset = 0;
 		    while (offset < asf_st->pkt.size) {
--- a/Plugins/Input/wma/libffwma/avcodec.h	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/avcodec.h	Thu Jul 13 16:01:57 2006 -0700
@@ -1761,6 +1761,10 @@
 void __av_freep(void **ptr);
 #define av_freep(p) __av_freep((void **)(p))
 void *av_fast_realloc(void *ptr, int *size, unsigned int min_size);
+void *av_malloc(unsigned int size);
+void *av_mallocz(unsigned int size);
+void *av_realloc(void *ptr, unsigned int size);
+void av_free(void *ptr);
 /* for static data only */
 /* call av_free_static to release all staticaly allocated tables */
 void av_free_static(void);
--- a/Plugins/Input/wma/libffwma/avio.c	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/avio.c	Thu Jul 13 16:01:57 2006 -0700
@@ -69,7 +69,7 @@
     err = -ENOENT;
     goto fail;
  found:
-    uc = malloc(sizeof(URLContext) + strlen(filename));
+    uc = av_malloc(sizeof(URLContext) + strlen(filename));
     if (!uc) {
         err = -ENOMEM;
         goto fail;
--- a/Plugins/Input/wma/libffwma/aviobuf.c	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/aviobuf.c	Thu Jul 13 16:01:57 2006 -0700
@@ -279,7 +279,7 @@
     } else {
         buffer_size = IO_BUFFER_SIZE;
     }
-    buffer = malloc(buffer_size);
+    buffer = av_malloc(buffer_size);
     if (!buffer)
         return -ENOMEM;
 
@@ -298,7 +298,7 @@
 int url_setbufsize(ByteIOContext *s, int buf_size)
 {
     uint8_t *buffer;
-    buffer = malloc(buf_size);
+    buffer = av_malloc(buf_size);
     if (!buffer)
         return -ENOMEM;
 
--- a/Plugins/Input/wma/libffwma/common.h	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/common.h	Thu Jul 13 16:01:57 2006 -0700
@@ -924,11 +924,6 @@
 
 #define CLAMP_TO_8BIT(d) ((d > 0xff) ? 0xff : (d < 0) ? 0 : d)
 
-/* avoid usage of various functions */
-/*#define malloc please_use_av_malloc
-#define free please_use_av_free
-#define realloc please_use_av_realloc*/
-
 #define CHECKED_ALLOCZ(p, size)\
 {\
     p= av_mallocz(size);\
@@ -938,6 +933,9 @@
     }\
 }
 
+
+
+
 #endif /* HAVE_AV_CONFIG_H */
 
 #endif /* COMMON_H */
--- a/Plugins/Input/wma/libffwma/dsputil.h	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/dsputil.h	Thu Jul 13 16:01:57 2006 -0700
@@ -385,7 +385,7 @@
 
 extern int mm_flags;
 
-#if defined(BLAH_NO_ALTIVEC) && !defined(CONFIG_DARWIN)
+#if defined(HAVE_ALTIVEC) && !defined(CONFIG_DARWIN)
 #define pixel altivec_pixel
 #include <altivec.h>
 #undef pixel
--- a/Plugins/Input/wma/libffwma/fft.c	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/fft.c	Thu Jul 13 16:01:57 2006 -0700
@@ -24,6 +24,205 @@
 
 #include "dsputil.h"
 
+#ifdef HAVE_ALTIVEC
+
+#ifdef HAVE_ALTIVEC_H
+#include <altivec.h>
+#endif
+
+#ifdef CONFIG_DARWIN
+#include <sys/sysctl.h>
+#else /* CONFIG_DARWIN */
+#include <signal.h>
+#include <setjmp.h>
+
+static sigjmp_buf jmpbuf;
+static volatile sig_atomic_t canjump = 0;
+
+static void sigill_handler (int sig)
+{
+    if (!canjump) {
+        signal (sig, SIG_DFL);
+        raise (sig);
+    }
+
+    canjump = 0;
+    siglongjmp (jmpbuf, 1);
+}
+#endif /* CONFIG_DARWIN */
+
+
+#define WORD_0 0x00,0x01,0x02,0x03
+#define WORD_1 0x04,0x05,0x06,0x07
+#define WORD_2 0x08,0x09,0x0a,0x0b
+#define WORD_3 0x0c,0x0d,0x0e,0x0f
+#define WORD_s0 0x10,0x11,0x12,0x13
+#define WORD_s1 0x14,0x15,0x16,0x17
+#define WORD_s2 0x18,0x19,0x1a,0x1b
+#define WORD_s3 0x1c,0x1d,0x1e,0x1f
+
+#ifdef CONFIG_DARWIN
+#define vcprm(a,b,c,d) (const vector unsigned char)(WORD_ ## a, WORD_ ## b, WORD_ ## c, WORD_ ## d)
+#else
+#define vcprm(a,b,c,d) (const vector unsigned char){WORD_ ## a, WORD_ ## b, WORD_ ## c, WORD_ ## d}
+#endif
+
+// vcprmle is used to keep the same index as in the SSE version.
+// it's the same as vcprm, with the index inversed
+// ('le' is Little Endian)
+#define vcprmle(a,b,c,d) vcprm(d,c,b,a)
+
+// used to build inverse/identity vectors (vcii)
+// n is _n_egative, p is _p_ositive
+#define FLOAT_n -1.
+#define FLOAT_p 1.
+
+
+#ifdef CONFIG_DARWIN
+#define vcii(a,b,c,d) (const vector float)(FLOAT_ ## a, FLOAT_ ## b, FLOAT_ ## c, FLOAT_ ## d)
+#else
+#define vcii(a,b,c,d) (const vector float){FLOAT_ ## a, FLOAT_ ## b, FLOAT_ ## c, FLOAT_ ## d}
+#endif
+
+int has_altivec(void)
+{
+#ifdef CONFIG_DARWIN
+    int sels[2] = {CTL_HW, HW_VECTORUNIT};
+    int has_vu = 0;
+    size_t len = sizeof(has_vu);
+    int err;
+
+    err = sysctl(sels, 2, &has_vu, &len, NULL, 0);
+
+    if (err == 0) return (has_vu != 0);
+#else /* CONFIG_DARWIN */
+/* no Darwin, do it the brute-force way */
+/* this is borrowed from the libmpeg2 library */
+    {
+      signal (SIGILL, sigill_handler);
+      if (sigsetjmp (jmpbuf, 1)) {
+        signal (SIGILL, SIG_DFL);
+      } else {
+        canjump = 1;
+
+        asm volatile ("mtspr 256, %0\n\t"
+                      "vand %%v0, %%v0, %%v0"
+                      :
+                      : "r" (-1));
+
+        signal (SIGILL, SIG_DFL);
+        return 1;
+      }
+    }
+#endif /* CONFIG_DARWIN */
+    return 0;
+}
+
+
+void fft_calc_altivec(FFTContext *s, FFTComplex *z)
+{
+#ifdef CONFIG_DARWIN
+    register const vector float vczero = (const vector float)(0.);
+#else
+    register const vector float vczero = (const vector float){0.,0.,0.,0.};
+#endif
+
+    int ln = s->nbits;
+    int j, np, np2;
+    int nblocks, nloops;
+    register FFTComplex *p, *q;
+    FFTComplex *cptr, *cptr1;
+    int k;
+
+    np = 1 << ln;
+
+    {
+        vector float *r, a, b, a1, c1, c2;
+
+        r = (vector float *)&z[0];
+
+        c1 = vcii(p,p,n,n);
+
+        if (s->inverse)
+            {
+                c2 = vcii(p,p,n,p);
+            }
+        else
+            {
+                c2 = vcii(p,p,p,n);
+            }
+
+        j = (np >> 2);
+        do {
+            a = vec_ld(0, r);
+            a1 = vec_ld(sizeof(vector float), r);
+
+            b = vec_perm(a,a,vcprmle(1,0,3,2));
+            a = vec_madd(a,c1,b);
+            /* do the pass 0 butterfly */
+
+            b = vec_perm(a1,a1,vcprmle(1,0,3,2));
+            b = vec_madd(a1,c1,b);
+            /* do the pass 0 butterfly */
+
+            /* multiply third by -i */
+            b = vec_perm(b,b,vcprmle(2,3,1,0));
+
+            /* do the pass 1 butterfly */
+            vec_st(vec_madd(b,c2,a), 0, r);
+            vec_st(vec_nmsub(b,c2,a), sizeof(vector float), r);
+
+            r += 2;
+        } while (--j != 0);
+    }
+    /* pass 2 .. ln-1 */
+
+    nblocks = np >> 3;
+    nloops = 1 << 2;
+    np2 = np >> 1;
+
+    cptr1 = s->exptab1;
+    do {
+        p = z;
+        q = z + nloops;
+        j = nblocks;
+        do {
+            cptr = cptr1;
+            k = nloops >> 1;
+            do {
+                vector float a,b,c,t1;
+
+                a = vec_ld(0, (float*)p);
+                b = vec_ld(0, (float*)q);
+
+                /* complex mul */
+                c = vec_ld(0, (float*)cptr);
+                /*  cre*re cim*re */
+                t1 = vec_madd(c, vec_perm(b,b,vcprmle(2,2,0,0)),vczero);
+                c = vec_ld(sizeof(vector float), (float*)cptr);
+                /*  -cim*im cre*im */
+                b = vec_madd(c, vec_perm(b,b,vcprmle(3,3,1,1)),t1);
+
+                /* butterfly */
+                vec_st(vec_add(a,b), 0, (float*)p);
+                vec_st(vec_sub(a,b), 0, (float*)q);
+
+                p += 2;
+                q += 2;
+                cptr += 4;
+            } while (--k);
+
+            p += nloops;
+            q += nloops;
+        } while (--j);
+        cptr1 += nloops * 2;
+        nblocks = nblocks >> 1;
+        nloops = nloops << 1;
+    } while (nblocks != 0);
+}
+
+#endif
+
 /**
  * The size of the FFT is 2^nbits. If inverse is TRUE, inverse FFT is
  * done 
@@ -36,10 +235,10 @@
     s->nbits = nbits;
     n = 1 << nbits;
 
-    s->exptab = malloc((n / 2) * sizeof(FFTComplex));
+    s->exptab = av_malloc((n / 2) * sizeof(FFTComplex));
     if (!s->exptab)
         goto fail;
-    s->revtab = malloc(n * sizeof(uint16_t));
+    s->revtab = av_malloc(n * sizeof(uint16_t));
     if (!s->revtab)
         goto fail;
     s->inverse = inverse;
@@ -56,15 +255,12 @@
     s->fft_calc = fft_calc_c;
     s->exptab1 = NULL;
     /* compute constant table for HAVE_SSE version */
-#if (defined(HAVE_MMX) && defined(HAVE_BUILTIN_VECTOR)) || defined(BLAH_NO_ALTIVEC)
+#if (defined(HAVE_ALTIVEC))
     {
         int has_vectors = 0;
 
-#if defined(HAVE_MMX)
-        has_vectors = mm_support() & MM_SSE;
-#endif
-#if defined(BLAH_NO_ALTIVEC) && !defined(ALTIVEC_USE_REFERENCE_C_CODE)
-        has_vectors = mm_support() & MM_ALTIVEC;
+#if defined(HAVE_ALTIVEC)
+        has_vectors =  has_altivec();
 #endif
         if (has_vectors) {
             int np, nblocks, np2, l;
@@ -73,7 +269,7 @@
             np = 1 << nbits;
             nblocks = np >> 3;
             np2 = np >> 1;
-            s->exptab1 = malloc(np * 2 * sizeof(FFTComplex));
+            s->exptab1 = av_malloc(np * 2 * sizeof(FFTComplex));
             if (!s->exptab1)
                 goto fail;
             q = s->exptab1;
@@ -92,11 +288,7 @@
                 nblocks = nblocks >> 1;
             } while (nblocks != 0);
             av_freep(&s->exptab);
-#if defined(HAVE_MMX)
-            s->fft_calc = fft_calc_sse;
-#else
             s->fft_calc = fft_calc_altivec;
-#endif
         }
     }
 #endif
--- a/Plugins/Input/wma/libffwma/futils.c	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/futils.c	Thu Jul 13 16:01:57 2006 -0700
@@ -146,7 +146,7 @@
  */
 int av_new_packet(AVPacket *pkt, int size)
 {
-    unsigned char *data = malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
+    unsigned char *data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
     if (!data)
         return AVERROR_NOMEM;
     memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
@@ -166,7 +166,7 @@
         uint8_t *data;
         /* we duplicate the packet and don't forget to put the padding
            again */
-        data = malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
+        data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
         if (!data) {
             return AVERROR_NOMEM;
         }
@@ -182,7 +182,7 @@
 
 int fifo_init(FifoBuffer *f, int size)
 {
-    f->buffer = malloc(size);
+    f->buffer = av_malloc(size);
     if (!f->buffer)
         return -1;
     f->end = f->buffer + size;
@@ -1300,7 +1300,7 @@
         return ret;
     switch(st->codec.codec_type) {
     	case CODEC_TYPE_AUDIO:
-        	samples = malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
+        	samples = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
         	if (!samples)
             		goto fail;
         	
--- a/Plugins/Input/wma/libffwma/mdct.c	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/mdct.c	Thu Jul 13 16:01:57 2006 -0700
@@ -36,10 +36,10 @@
     s->nbits = nbits;
     s->n = n;
     n4 = n >> 2;
-    s->tcos = malloc(n4 * sizeof(FFTSample));
+    s->tcos = av_malloc(n4 * sizeof(FFTSample));
     if (!s->tcos)
         goto fail;
-    s->tsin = malloc(n4 * sizeof(FFTSample));
+    s->tsin = av_malloc(n4 * sizeof(FFTSample));
     if (!s->tsin)
         goto fail;
 
--- a/Plugins/Input/wma/libffwma/mms.c	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/mms.c	Thu Jul 13 16:01:57 2006 -0700
@@ -530,7 +530,7 @@
     return NULL;
   }
   hostlen = hostend - url - 6;
-  host = malloc (hostlen+1);
+  host = av_malloc (hostlen+1);
   strncpy (host, &url[6], hostlen);
   host[hostlen]=0;
 
@@ -551,7 +551,7 @@
     return NULL;
   }
 
-  this = (mms_t*) malloc (sizeof (mms_t));
+  this = (mms_t*) av_malloc (sizeof (mms_t));
 
   this->url             = url;
   this->host            = host;
@@ -811,5 +811,3 @@
   free (this->url);
   free (this);
 }
-
-
--- a/Plugins/Input/wma/libffwma/utils.c	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/utils.c	Thu Jul 13 16:01:57 2006 -0700
@@ -28,7 +28,7 @@
 {
 	void *ptr;
     
-    	ptr = malloc(size);
+    	ptr = av_malloc(size);
     	if (!ptr)
         	return NULL;
     
--- a/Plugins/Input/wma/libffwma/wmadec.c	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/libffwma/wmadec.c	Thu Jul 13 16:01:57 2006 -0700
@@ -178,8 +178,8 @@
 
     init_vlc(vlc, 9, n, table_bits, 1, 1, table_codes, 4, 4);
 
-    run_table = malloc(n * sizeof(uint16_t));
-    level_table = malloc(n * sizeof(uint16_t));
+    run_table = av_malloc(n * sizeof(uint16_t));
+    level_table = av_malloc(n * sizeof(uint16_t));
     p = levels_table;
     i = 2;
     level = 1;
@@ -453,7 +453,7 @@
         int n, j;
         float alpha;
         n = 1 << (s->frame_len_bits - i);
-        window = malloc(sizeof(float) * n);
+        window = av_malloc(sizeof(float) * n);
         alpha = M_PI / (2.0 * n);
         for(j=0;j<n;j++) {
             window[n - j - 1] = sin((j + 0.5) * alpha);
@@ -698,8 +698,8 @@
     int n, v, a, ch, code, bsize;
     int coef_nb_bits, total_gain, parse_exponents;
     float window[BLOCK_MAX_SIZE * 2];
-// XXX: FIXME!! there's a bug somewhere which makes this mandatory under altivec
-#ifdef BLAH_NO_ALTIVEC
+
+#ifdef HAVE_ALTIVEC
     volatile int nb_coefs[MAX_CHANNELS] __attribute__((aligned(16)));
 #else
     int nb_coefs[MAX_CHANNELS];
--- a/Plugins/Input/wma/wma.c	Wed Jul 12 21:16:35 2006 -0700
+++ b/Plugins/Input/wma/wma.c	Thu Jul 13 16:01:57 2006 -0700
@@ -23,6 +23,7 @@
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 #include <stdlib.h>
+#include <malloc.h>
 #include <math.h>
 #include <stdbool.h>
 #include <stdio.h>
@@ -430,8 +431,8 @@
 	
     wma_ip.set_info(wsong_title, wsong_time, c->bit_rate, c->sample_rate, c->channels);
 
-    wma_s_outbuf = g_malloc0(wma_st_buff);
-    wma_outbuf = g_malloc0(AVCODEC_MAX_AUDIO_FRAME_SIZE);
+    wma_s_outbuf = memalign(16, wma_st_buff);
+    wma_outbuf = memalign(16, AVCODEC_MAX_AUDIO_FRAME_SIZE);
     wma_seekpos = -1;
     wma_decode = 1;
     wma_decode_thread = g_thread_create((GThreadFunc)wma_play_loop, NULL, TRUE, NULL);
--- a/configure.ac	Wed Jul 12 21:16:35 2006 -0700
+++ b/configure.ac	Thu Jul 13 16:01:57 2006 -0700
@@ -276,6 +276,7 @@
 
 AC_CHECK_HEADERS(altivec.h,
     [AC_DEFINE(HAVE_ALTIVEC, 1, [Define to 1 if your system has AltiVec.])
+     AC_DEFINE(HAVE_ALTIVEC_H, 1, [Define to 1 if your system has an altivec.h file.])
      AC_DEFINE(ARCH_POWERPC, 1, [Define to 1 if your system is a PowerPC.])
      DCT64=dct64_altivec.c],
     [DCT64=dct64.c]