# HG changeset patch # User chainsaw # Date 1152831717 25200 # Node ID 1ddaf20ab50eb2aa74337a787dac1d8289beb0e0 # Parent 86242883ddc7c64becb877580be4c805e56e3b3c [svn] AltiVec support for WMA, by Luca "lu_zero" Barbato from Gentoo. diff -r 86242883ddc7 -r 1ddaf20ab50e ChangeLog --- 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 + 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 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. diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/Makefile.in --- 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 diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/allformats.c --- 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 } diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/asf.c --- 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) { diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/avcodec.h --- 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); diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/avio.c --- 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; diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/aviobuf.c --- 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; diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/common.h --- 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 */ diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/dsputil.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 #undef pixel diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/fft.c --- 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 +#endif + +#ifdef CONFIG_DARWIN +#include +#else /* CONFIG_DARWIN */ +#include +#include + +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 diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/futils.c --- 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; diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/mdct.c --- 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; diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/mms.c --- 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); } - - diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/utils.c --- 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; diff -r 86242883ddc7 -r 1ddaf20ab50e Plugins/Input/wma/libffwma/wmadec.c --- 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 +#include #include #include #include @@ -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); diff -r 86242883ddc7 -r 1ddaf20ab50e configure.ac --- 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]