diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2007-04-14 16:35:44 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2007-04-14 16:35:44 +0000 |
commit | f4b5a723b06b25babe201b0a97bdeebc716f5bba (patch) | |
tree | 10a759a0438df774a7b1eab6af0e3995f85ae4d3 /apps | |
parent | 32bd59d4f75f135b26a537f438e0d6b893f1cdfb (diff) |
mpeg2dec in mpegplayer: Do a little code slashing and organizing. Much more to come I think.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13159 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/plugins/mpegplayer/SOURCES | 11 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/cpu_accel.c | 220 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/cpu_state.c | 129 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/decode.c | 23 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/header.c | 4 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/idct.c | 86 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/motion_comp.c | 133 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/motion_comp.h | 84 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/motion_comp_arm.c | 183 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/motion_comp_arm_c.c | 37 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/motion_comp_arm_s.S | 104 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/mpeg2.h | 14 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/mpeg2_internal.h | 46 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/slice.c | 67 |
14 files changed, 274 insertions, 867 deletions
diff --git a/apps/plugins/mpegplayer/SOURCES b/apps/plugins/mpegplayer/SOURCES index fc23a2ab11..e9a01b73d0 100644 --- a/apps/plugins/mpegplayer/SOURCES +++ b/apps/plugins/mpegplayer/SOURCES @@ -1,14 +1,17 @@ alloc.c -cpu_accel.c -cpu_state.c decode.c header.c idct.c + motion_comp.c + #ifdef CPU_ARM -motion_comp_arm.c +motion_comp_arm_c.c motion_comp_arm_s.S -#endif +#else /* other CPU or SIM */ +motion_comp_c.c +#endif /* CPU_* */ + slice.c video_out_rockbox.c mpeg_settings.c diff --git a/apps/plugins/mpegplayer/cpu_accel.c b/apps/plugins/mpegplayer/cpu_accel.c deleted file mode 100644 index 2616e04cd0..0000000000 --- a/apps/plugins/mpegplayer/cpu_accel.c +++ /dev/null @@ -1,220 +0,0 @@ -/* - * cpu_accel.c - * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org> - * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - * - * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. - * See http://libmpeg2.sourceforge.net/ for updates. - * - * mpeg2dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * mpeg2dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "plugin.h" - -#include "mpeg2dec_config.h" - -#include "mpeg2.h" -#include "attributes.h" -#include "mpeg2_internal.h" - -#ifdef ACCEL_DETECT -#ifdef ARCH_X86 -static inline uint32_t arch_accel (void) -{ - uint32_t eax, ebx, ecx, edx; - int AMD; - uint32_t caps; - -#if !defined(PIC) && !defined(__PIC__) -#define cpuid(op,eax,ebx,ecx,edx) \ - __asm__ ("cpuid" \ - : "=a" (eax), \ - "=b" (ebx), \ - "=c" (ecx), \ - "=d" (edx) \ - : "a" (op) \ - : "cc") -#else /* PIC version : save ebx */ -#define cpuid(op,eax,ebx,ecx,edx) \ - __asm__ ("push %%ebx\n\t" \ - "cpuid\n\t" \ - "movl %%ebx,%1\n\t" \ - "pop %%ebx" \ - : "=a" (eax), \ - "=r" (ebx), \ - "=c" (ecx), \ - "=d" (edx) \ - : "a" (op) \ - : "cc") -#endif - - __asm__ ("pushf\n\t" - "pushf\n\t" - "pop %0\n\t" - "movl %0,%1\n\t" - "xorl $0x200000,%0\n\t" - "push %0\n\t" - "popf\n\t" - "pushf\n\t" - "pop %0\n\t" - "popf" - : "=r" (eax), - "=r" (ebx) - : - : "cc"); - - if (eax == ebx) /* no cpuid */ - return 0; - - cpuid (0x00000000, eax, ebx, ecx, edx); - if (!eax) /* vendor string only */ - return 0; - - AMD = (ebx == 0x68747541) && (ecx == 0x444d4163) && (edx == 0x69746e65); - - cpuid (0x00000001, eax, ebx, ecx, edx); - if (! (edx & 0x00800000)) /* no MMX */ - return 0; - - caps = MPEG2_ACCEL_X86_MMX; - if (edx & 0x02000000) /* SSE - identical to AMD MMX extensions */ - caps = MPEG2_ACCEL_X86_MMX | MPEG2_ACCEL_X86_MMXEXT; - - cpuid (0x80000000, eax, ebx, ecx, edx); - if (eax < 0x80000001) /* no extended capabilities */ - return caps; - - cpuid (0x80000001, eax, ebx, ecx, edx); - - if (edx & 0x80000000) - caps |= MPEG2_ACCEL_X86_3DNOW; - - if (AMD && (edx & 0x00400000)) /* AMD MMX extensions */ - caps |= MPEG2_ACCEL_X86_MMXEXT; - - return caps; -} -#endif /* ARCH_X86 */ - -#if defined(ARCH_PPC) || defined(ARCH_SPARC) -#include <signal.h> -#include <setjmp.h> - -static sigjmp_buf jmpbuf; -static volatile sig_atomic_t canjump = 0; - -static RETSIGTYPE sigill_handler (int sig) -{ - if (!canjump) { - signal (sig, SIG_DFL); - raise (sig); - } - - canjump = 0; - siglongjmp (jmpbuf, 1); -} - -#ifdef ARCH_PPC -static inline uint32_t arch_accel (void) -{ - static RETSIGTYPE (* oldsig) (int); - - oldsig = signal (SIGILL, sigill_handler); - if (sigsetjmp (jmpbuf, 1)) { - signal (SIGILL, oldsig); - return 0; - } - - canjump = 1; - -#ifdef HAVE_ALTIVEC_H /* gnu */ -#define VAND(a,b,c) "vand " #a "," #b "," #c "\n\t" -#else /* apple */ -#define VAND(a,b,c) "vand v" #a ",v" #b ",v" #c "\n\t" -#endif - asm volatile ("mtspr 256, %0\n\t" - VAND (0, 0, 0) - : - : "r" (-1)); - - canjump = 0; - - signal (SIGILL, oldsig); - return MPEG2_ACCEL_PPC_ALTIVEC; -} -#endif /* ARCH_PPC */ - -#ifdef ARCH_SPARC -static inline uint32_t arch_accel (void) -{ - static RETSIGTYPE (* oldsig) (int); - - oldsig = signal (SIGILL, sigill_handler); - if (sigsetjmp (jmpbuf, 1)) { - signal (SIGILL, oldsig); - return 0; - } - - canjump = 1; - - /* pdist %f0, %f0, %f0 */ - __asm__ __volatile__(".word\t0x81b007c0"); - - canjump = 0; - - if (sigsetjmp (jmpbuf, 1)) { - signal (SIGILL, oldsig); - return MPEG2_ACCEL_SPARC_VIS; - } - - canjump = 1; - - /* edge8n %g0, %g0, %g0 */ - __asm__ __volatile__(".word\t0x81b00020"); - - canjump = 0; - - signal (SIGILL, oldsig); - return MPEG2_ACCEL_SPARC_VIS | MPEG2_ACCEL_SPARC_VIS2; -} -#endif /* ARCH_SPARC */ -#endif /* ARCH_PPC || ARCH_SPARC */ - -#ifdef ARCH_ALPHA -static inline uint32_t arch_accel (void) -{ - uint64_t no_mvi; - - asm volatile ("amask %1, %0" - : "=r" (no_mvi) - : "rI" (256)); /* AMASK_MVI */ - return no_mvi ? MPEG2_ACCEL_ALPHA : (MPEG2_ACCEL_ALPHA | - MPEG2_ACCEL_ALPHA_MVI); -} -#endif /* ARCH_ALPHA */ -#endif /* ACCEL_DETECT */ - -uint32_t mpeg2_detect_accel (void) -{ - uint32_t accel; - - accel = 0; -#ifdef ACCEL_DETECT -#if defined (ARCH_X86) || defined (ARCH_PPC) || defined (ARCH_ALPHA) || defined (ARCH_SPARC) - accel = arch_accel (); -#endif -#endif - return accel; -} diff --git a/apps/plugins/mpegplayer/cpu_state.c b/apps/plugins/mpegplayer/cpu_state.c deleted file mode 100644 index 4406853626..0000000000 --- a/apps/plugins/mpegplayer/cpu_state.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * cpu_state.c - * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org> - * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - * - * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. - * See http://libmpeg2.sourceforge.net/ for updates. - * - * mpeg2dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * mpeg2dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "plugin.h" - -#include "mpeg2dec_config.h" - -#include "mpeg2.h" -#include "attributes.h" -#include "mpeg2_internal.h" -#ifdef ARCH_X86 -#include "mmx.h" -#endif - -void (* mpeg2_cpu_state_save) (cpu_state_t * state) = NULL; -void (* mpeg2_cpu_state_restore) (cpu_state_t * state) = NULL; - -#ifdef ARCH_X86 -static void state_restore_mmx (cpu_state_t * state) -{ - emms (); -} -#endif - -#ifdef ARCH_PPC -#ifdef HAVE_ALTIVEC_H /* gnu */ -#define LI(a,b) "li " #a "," #b "\n\t" -#define STVX0(a,b,c) "stvx " #a ",0," #c "\n\t" -#define STVX(a,b,c) "stvx " #a "," #b "," #c "\n\t" -#define LVX0(a,b,c) "lvx " #a ",0," #c "\n\t" -#define LVX(a,b,c) "lvx " #a "," #b "," #c "\n\t" -#else /* apple */ -#define LI(a,b) "li r" #a "," #b "\n\t" -#define STVX0(a,b,c) "stvx v" #a ",0,r" #c "\n\t" -#define STVX(a,b,c) "stvx v" #a ",r" #b ",r" #c "\n\t" -#define LVX0(a,b,c) "lvx v" #a ",0,r" #c "\n\t" -#define LVX(a,b,c) "lvx v" #a ",r" #b ",r" #c "\n\t" -#endif - -static void state_save_altivec (cpu_state_t * state) -{ - asm (LI (9, 16) - STVX0 (20, 0, 3) - LI (11, 32) - STVX (21, 9, 3) - LI (9, 48) - STVX (22, 11, 3) - LI (11, 64) - STVX (23, 9, 3) - LI (9, 80) - STVX (24, 11, 3) - LI (11, 96) - STVX (25, 9, 3) - LI (9, 112) - STVX (26, 11, 3) - LI (11, 128) - STVX (27, 9, 3) - LI (9, 144) - STVX (28, 11, 3) - LI (11, 160) - STVX (29, 9, 3) - LI (9, 176) - STVX (30, 11, 3) - STVX (31, 9, 3)); -} - -static void state_restore_altivec (cpu_state_t * state) -{ - asm (LI (9, 16) - LVX0 (20, 0, 3) - LI (11, 32) - LVX (21, 9, 3) - LI (9, 48) - LVX (22, 11, 3) - LI (11, 64) - LVX (23, 9, 3) - LI (9, 80) - LVX (24, 11, 3) - LI (11, 96) - LVX (25, 9, 3) - LI (9, 112) - LVX (26, 11, 3) - LI (11, 128) - LVX (27, 9, 3) - LI (9, 144) - LVX (28, 11, 3) - LI (11, 160) - LVX (29, 9, 3) - LI (9, 176) - LVX (30, 11, 3) - LVX (31, 9, 3)); -} -#endif - -void mpeg2_cpu_state_init (uint32_t accel) -{ - (void)accel; -#ifdef ARCH_X86 - if (accel & MPEG2_ACCEL_X86_MMX) { - mpeg2_cpu_state_restore = state_restore_mmx; - } -#endif -#ifdef ARCH_PPC - if (accel & MPEG2_ACCEL_PPC_ALTIVEC) { - mpeg2_cpu_state_save = state_save_altivec; - mpeg2_cpu_state_restore = state_restore_altivec; - } -#endif -} diff --git a/apps/plugins/mpegplayer/decode.c b/apps/plugins/mpegplayer/decode.c index 613292699d..299abc9663 100644 --- a/apps/plugins/mpegplayer/decode.c +++ b/apps/plugins/mpegplayer/decode.c @@ -31,8 +31,6 @@ extern struct plugin_api* rb; #include "attributes.h" #include "mpeg2_internal.h" -static int mpeg2_accels = 0; - #define BUFFER_SIZE (1194 * 1024) const mpeg2_info_t * mpeg2_info (mpeg2dec_t * mpeg2dec) @@ -270,7 +268,7 @@ mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec) break; case RECEIVED (0x01, STATE_PICTURE): case RECEIVED (0x01, STATE_PICTURE_2ND): - mpeg2_header_picture_finalize (mpeg2dec, mpeg2_accels); + mpeg2_header_picture_finalize (mpeg2dec); mpeg2dec->action = mpeg2_header_slice_start; break; @@ -302,7 +300,7 @@ int mpeg2_convert (mpeg2dec_t * mpeg2dec, mpeg2_convert_t convert, void * arg) int error; error = convert (MPEG2_CONVERT_SET, NULL, &(mpeg2dec->sequence), 0, - mpeg2_accels, arg, &convert_init); + arg, &convert_init); if (!error) { mpeg2dec->convert = convert; mpeg2dec->convert_arg = arg; @@ -323,7 +321,7 @@ int mpeg2_stride (mpeg2dec_t * mpeg2dec, int stride) stride = mpeg2dec->convert (MPEG2_CONVERT_STRIDE, NULL, &(mpeg2dec->sequence), stride, - mpeg2_accels, mpeg2dec->convert_arg, + mpeg2dec->convert_arg, &convert_init); mpeg2dec->convert_id_size = convert_init.id_size; mpeg2dec->convert_stride = stride; @@ -382,19 +380,6 @@ void mpeg2_tag_picture (mpeg2dec_t * mpeg2dec, uint32_t tag, uint32_t tag2) mpeg2dec->bytes_since_tag = 0; } -uint32_t mpeg2_accel (uint32_t accel) -{ - if (!mpeg2_accels) { - if (accel & MPEG2_ACCEL_DETECT) - accel |= mpeg2_detect_accel (); - mpeg2_accels = accel |= MPEG2_ACCEL_DETECT; - mpeg2_cpu_state_init (accel); - mpeg2_idct_init (accel); - mpeg2_mc_init (accel); - } - return mpeg2_accels & ~MPEG2_ACCEL_DETECT; -} - void mpeg2_reset (mpeg2dec_t * mpeg2dec, int full_reset) { mpeg2dec->buf_start = mpeg2dec->buf_end = NULL; @@ -420,7 +405,7 @@ mpeg2dec_t * mpeg2_init (void) { mpeg2dec_t * mpeg2dec; - mpeg2_accel (MPEG2_ACCEL_DETECT); + mpeg2_idct_init (); mpeg2dec = (mpeg2dec_t *) mpeg2_malloc (sizeof (mpeg2dec_t), MPEG2_ALLOC_MPEG2DEC); diff --git a/apps/plugins/mpegplayer/header.c b/apps/plugins/mpegplayer/header.c index 6e8cfc213a..7f94705f52 100644 --- a/apps/plugins/mpegplayer/header.c +++ b/apps/plugins/mpegplayer/header.c @@ -603,7 +603,7 @@ static int picture_display_ext (mpeg2dec_t * mpeg2dec) return 0; } -void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec, uint32_t accels) +void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec) { mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); int old_type_b = (decoder->coding_type == B_TYPE); @@ -661,7 +661,7 @@ void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec, uint32_t accels) mpeg2dec->convert (MPEG2_CONVERT_START, mpeg2dec->decoder.convert_id, &(mpeg2dec->sequence), - mpeg2dec->convert_stride, accels, + mpeg2dec->convert_stride, mpeg2dec->convert_arg, &convert_init); mpeg2dec->convert_start = convert_init.start; mpeg2dec->decoder.convert = convert_init.copy; diff --git a/apps/plugins/mpegplayer/idct.c b/apps/plugins/mpegplayer/idct.c index 7ad78bfcd9..ee02e72a6f 100644 --- a/apps/plugins/mpegplayer/idct.c +++ b/apps/plugins/mpegplayer/idct.c @@ -77,18 +77,18 @@ uint8_t mpeg2_clip[3840 * 2 + 256] IBSS_ATTR; #endif #if 0 -#define BUTTERFLY(t0,t1,W0,W1,d0,d1) \ -do { \ - t0 = W0 * d0 + W1 * d1; \ - t1 = W0 * d1 - W1 * d0; \ -} while (0) +#define BUTTERFLY(t0,t1,W0,W1,d0,d1) \ + do { \ + t0 = W0 * d0 + W1 * d1; \ + t1 = W0 * d1 - W1 * d0; \ + } while (0) #else -#define BUTTERFLY(t0,t1,W0,W1,d0,d1) \ -do { \ - int tmp = W0 * (d0 + d1); \ - t0 = tmp + (W1 - W0) * d1; \ - t1 = tmp - (W1 + W0) * d0; \ -} while (0) +#define BUTTERFLY(t0,t1,W0,W1,d0,d1) \ + do { \ + int tmp = W0 * (d0 + d1); \ + t0 = tmp + (W1 - W0) * d1; \ + t1 = tmp - (W1 + W0) * d0; \ + } while (0) #endif static inline void idct_row (int16_t * const block) @@ -258,58 +258,26 @@ static void mpeg2_idct_add_c (const int last, int16_t * block, } } -void mpeg2_idct_init (uint32_t accel) +void mpeg2_idct_init (void) { - (void)accel; -#ifdef ARCH_X86 - if (accel & MPEG2_ACCEL_X86_MMXEXT) { - mpeg2_idct_copy = mpeg2_idct_copy_mmxext; - mpeg2_idct_add = mpeg2_idct_add_mmxext; - mpeg2_idct_mmx_init (); - } else if (accel & MPEG2_ACCEL_X86_MMX) { - mpeg2_idct_copy = mpeg2_idct_copy_mmx; - mpeg2_idct_add = mpeg2_idct_add_mmx; - mpeg2_idct_mmx_init (); - } else -#endif -#ifdef ARCH_PPC - if (accel & MPEG2_ACCEL_PPC_ALTIVEC) { - mpeg2_idct_copy = mpeg2_idct_copy_altivec; - mpeg2_idct_add = mpeg2_idct_add_altivec; - mpeg2_idct_altivec_init (); - } else -#endif -#ifdef ARCH_ALPHA - if (accel & MPEG2_ACCEL_ALPHA_MVI) { - mpeg2_idct_copy = mpeg2_idct_copy_mvi; - mpeg2_idct_add = mpeg2_idct_add_mvi; - mpeg2_idct_alpha_init (); - } else if (accel & MPEG2_ACCEL_ALPHA) { - int i; + extern uint8_t mpeg2_scan_norm[64]; + extern uint8_t mpeg2_scan_alt[64]; + int i, j; - mpeg2_idct_copy = mpeg2_idct_copy_alpha; - mpeg2_idct_add = mpeg2_idct_add_alpha; - mpeg2_idct_alpha_init (); - for (i = -3840; i < 3840 + 256; i++) - CLIP(i) = (i < 0) ? 0 : ((i > 255) ? 255 : i); - } else -#endif - { - extern uint8_t mpeg2_scan_norm[64]; - extern uint8_t mpeg2_scan_alt[64]; - int i, j; + mpeg2_idct_copy = mpeg2_idct_copy_c; + mpeg2_idct_add = mpeg2_idct_add_c; - mpeg2_idct_copy = mpeg2_idct_copy_c; - mpeg2_idct_add = mpeg2_idct_add_c; #if !defined(CPU_COLDFIRE) && !defined(CPU_ARM) - for (i = -3840; i < 3840 + 256; i++) - CLIP(i) = (i < 0) ? 0 : ((i > 255) ? 255 : i); + for (i = -3840; i < 3840 + 256; i++) + CLIP(i) = (i < 0) ? 0 : ((i > 255) ? 255 : i); #endif - for (i = 0; i < 64; i++) { - j = mpeg2_scan_norm[i]; - mpeg2_scan_norm[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2); - j = mpeg2_scan_alt[i]; - mpeg2_scan_alt[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2); - } + + for (i = 0; i < 64; i++) + { + j = mpeg2_scan_norm[i]; + mpeg2_scan_norm[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2); + + j = mpeg2_scan_alt[i]; + mpeg2_scan_alt[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2); } } diff --git a/apps/plugins/mpegplayer/motion_comp.c b/apps/plugins/mpegplayer/motion_comp.c index b2f30c01ff..beb5c00228 100644 --- a/apps/plugins/mpegplayer/motion_comp.c +++ b/apps/plugins/mpegplayer/motion_comp.c @@ -29,108 +29,33 @@ #include "attributes.h" #include "mpeg2_internal.h" -mpeg2_mc_t mpeg2_mc; - -void mpeg2_mc_init (uint32_t accel) +/* These are defined in their respective target files - motion_comp_X.c */ +extern mpeg2_mc_fct MC_put_o_16; +extern mpeg2_mc_fct MC_put_o_8; +extern mpeg2_mc_fct MC_put_x_16; +extern mpeg2_mc_fct MC_put_x_8; +extern mpeg2_mc_fct MC_put_y_16; +extern mpeg2_mc_fct MC_put_y_8; +extern mpeg2_mc_fct MC_put_xy_16; +extern mpeg2_mc_fct MC_put_xy_8; + +extern mpeg2_mc_fct MC_avg_o_16; +extern mpeg2_mc_fct MC_avg_o_8; +extern mpeg2_mc_fct MC_avg_x_16; +extern mpeg2_mc_fct MC_avg_x_8; +extern mpeg2_mc_fct MC_avg_y_16; +extern mpeg2_mc_fct MC_avg_y_8; +extern mpeg2_mc_fct MC_avg_xy_16; +extern mpeg2_mc_fct MC_avg_xy_8; + +mpeg2_mc_t mpeg2_mc = { - (void)accel; -#ifdef ARCH_X86 - if (accel & MPEG2_ACCEL_X86_MMXEXT) - mpeg2_mc = mpeg2_mc_mmxext; - else if (accel & MPEG2_ACCEL_X86_3DNOW) - mpeg2_mc = mpeg2_mc_3dnow; - else if (accel & MPEG2_ACCEL_X86_MMX) - mpeg2_mc = mpeg2_mc_mmx; - else -#endif -#ifdef ARCH_PPC - if (accel & MPEG2_ACCEL_PPC_ALTIVEC) - mpeg2_mc = mpeg2_mc_altivec; - else -#endif -#ifdef ARCH_ALPHA - if (accel & MPEG2_ACCEL_ALPHA) - mpeg2_mc = mpeg2_mc_alpha; - else -#endif -#ifdef ARCH_SPARC - if (accel & MPEG2_ACCEL_SPARC_VIS) - mpeg2_mc = mpeg2_mc_vis; - else -#endif - -#ifdef CPU_ARM - mpeg2_mc = mpeg2_mc_arm; -#else - mpeg2_mc = mpeg2_mc_c; -#endif -} - -#define avg2(a,b) ((a+b+1)>>1) -#define avg4(a,b,c,d) ((a+b+c+d+2)>>2) - -#define predict_o(i) (ref[i]) -#define predict_x(i) (avg2 (ref[i], ref[i+1])) -#define predict_y(i) (avg2 (ref[i], (ref+stride)[i])) -#define predict_xy(i) (avg4 (ref[i], ref[i+1], \ - (ref+stride)[i], (ref+stride)[i+1])) - -#define put(predictor,i) dest[i] = predictor (i) -#define avg(predictor,i) dest[i] = avg2 (predictor (i), dest[i]) - -/* mc function template */ - -#define MC_FUNC(op,xy) \ -static void MC_##op##_##xy##_16_c (uint8_t * dest, const uint8_t * ref, \ - const int stride, int height) \ -{ \ - do { \ - op (predict_##xy, 0); \ - op (predict_##xy, 1); \ - op (predict_##xy, 2); \ - op (predict_##xy, 3); \ - op (predict_##xy, 4); \ - op (predict_##xy, 5); \ - op (predict_##xy, 6); \ - op (predict_##xy, 7); \ - op (predict_##xy, 8); \ - op (predict_##xy, 9); \ - op (predict_##xy, 10); \ - op (predict_##xy, 11); \ - op (predict_##xy, 12); \ - op (predict_##xy, 13); \ - op (predict_##xy, 14); \ - op (predict_##xy, 15); \ - ref += stride; \ - dest += stride; \ - } while (--height); \ -} \ -static void MC_##op##_##xy##_8_c (uint8_t * dest, const uint8_t * ref, \ - const int stride, int height) \ -{ \ - do { \ - op (predict_##xy, 0); \ - op (predict_##xy, 1); \ - op (predict_##xy, 2); \ - op (predict_##xy, 3); \ - op (predict_##xy, 4); \ - op (predict_##xy, 5); \ - op (predict_##xy, 6); \ - op (predict_##xy, 7); \ - ref += stride; \ - dest += stride; \ - } while (--height); \ -} - -/* definitions of the actual mc functions */ - -MC_FUNC (put,o) -MC_FUNC (avg,o) -MC_FUNC (put,x) -MC_FUNC (avg,x) -MC_FUNC (put,y) -MC_FUNC (avg,y) -MC_FUNC (put,xy) -MC_FUNC (avg,xy) - -MPEG2_MC_EXTERN (c) + { + MC_put_o_16, MC_put_x_16, MC_put_y_16, MC_put_xy_16, + MC_put_o_8, MC_put_x_8, MC_put_y_8, MC_put_xy_8 + }, + { + MC_avg_o_16, MC_avg_x_16, MC_avg_y_16, MC_avg_xy_16, + MC_avg_o_8, MC_avg_x_8, MC_avg_y_8, MC_avg_xy_8 + } +}; diff --git a/apps/plugins/mpegplayer/motion_comp.h b/apps/plugins/mpegplayer/motion_comp.h new file mode 100644 index 0000000000..2823cc6da1 --- /dev/null +++ b/apps/plugins/mpegplayer/motion_comp.h @@ -0,0 +1,84 @@ +/* + * motion_comp.h + * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org> + * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> + * + * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. + * See http://libmpeg2.sourceforge.net/ for updates. + * + * mpeg2dec is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * mpeg2dec is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#define avg2(a,b) ((a+b+1)>>1) +#define avg4(a,b,c,d) ((a+b+c+d+2)>>2) + +#define predict_o(i) (ref[i]) +#define predict_x(i) (avg2 (ref[i], ref[i+1])) +#define predict_y(i) (avg2 (ref[i], (ref+stride)[i])) +#define predict_xy(i) (avg4 (ref[i], ref[i+1], \ + (ref+stride)[i], (ref+stride)[i+1])) + +#define put(predictor,i) dest[i] = predictor (i) +#define avg(predictor,i) dest[i] = avg2 (predictor (i), dest[i]) + +/* mc function template */ +#define MC_FUNC(op, xy) \ + MC_FUNC_16(op, xy) \ + MC_FUNC_8(op, xy) + +#define MC_FUNC_16(op, xy) \ + void MC_##op##_##xy##_16 (uint8_t * dest, const uint8_t * ref, \ + const int stride, int height) \ + { \ + do { \ + op (predict_##xy, 0); \ + op (predict_##xy, 1); \ + op (predict_##xy, 2); \ + op (predict_##xy, 3); \ + op (predict_##xy, 4); \ + op (predict_##xy, 5); \ + op (predict_##xy, 6); \ + op (predict_##xy, 7); \ + op (predict_##xy, 8); \ + op (predict_##xy, 9); \ + op (predict_##xy, 10); \ + op (predict_##xy, 11); \ + op (predict_##xy, 12); \ + op (predict_##xy, 13); \ + op (predict_##xy, 14); \ + op (predict_##xy, 15); \ + ref += stride; \ + dest += stride; \ + } while (--height); \ + } + +#define MC_FUNC_8(op, xy) \ + void MC_##op##_##xy##_8 (uint8_t * dest, const uint8_t * ref, \ + const int stride, int height) \ + { \ + do { \ + op (predict_##xy, 0); \ + op (predict_##xy, 1); \ + op (predict_##xy, 2); \ + op (predict_##xy, 3); \ + op (predict_##xy, 4); \ + op (predict_##xy, 5); \ + op (predict_##xy, 6); \ + op (predict_##xy, 7); \ + ref += stride; \ + dest += stride; \ + } while (--height); \ + } diff --git a/apps/plugins/mpegplayer/motion_comp_arm.c b/apps/plugins/mpegplayer/motion_comp_arm.c deleted file mode 100644 index ec9eddab72..0000000000 --- a/apps/plugins/mpegplayer/motion_comp_arm.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * motion_comp_arm.c - * Copyright (C) 2004 AGAWA Koji <i (AT) atty (DOT) jp> - * - * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. - * See http://libmpeg2.sourceforge.net/ for updates. - * - * mpeg2dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * mpeg2dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "mpeg2dec_config.h" - -#include <inttypes.h> - -#include "mpeg2.h" -#include "attributes.h" -#include "mpeg2_internal.h" - -#define avg2(a,b) ((a+b+1)>>1) -#define avg4(a,b,c,d) ((a+b+c+d+2)>>2) - -#define predict_o(i) (ref[i]) -#define predict_x(i) (avg2 (ref[i], ref[i+1])) -#define predict_y(i) (avg2 (ref[i], (ref+stride)[i])) -#define predict_xy(i) (avg4 (ref[i], ref[i+1], \ - (ref+stride)[i], (ref+stride)[i+1])) - -#define put(predictor,i) dest[i] = predictor (i) -#define avg(predictor,i) dest[i] = avg2 (predictor (i), dest[i]) - -/* mc function template */ - -#define MC_FUNC(op,xy) \ -inline static void MC_##op##_##xy##_16_c (uint8_t * dest, const uint8_t * ref, \ - const int stride, int height) \ -{ \ - do { \ - op (predict_##xy, 0); \ - op (predict_##xy, 1); \ - op (predict_##xy, 2); \ - op (predict_##xy, 3); \ - op (predict_##xy, 4); \ - op (predict_##xy, 5); \ - op (predict_##xy, 6); \ - op (predict_##xy, 7); \ - op (predict_##xy, 8); \ - op (predict_##xy, 9); \ - op (predict_##xy, 10); \ - op (predict_##xy, 11); \ - op (predict_##xy, 12); \ - op (predict_##xy, 13); \ - op (predict_##xy, 14); \ - op (predict_##xy, 15); \ - ref += stride; \ - dest += stride; \ - } while (--height); \ -} \ -static void MC_##op##_##xy##_8_c (uint8_t * dest, const uint8_t * ref, \ - const int stride, int height) \ -{ \ - do { \ - op (predict_##xy, 0); \ - op (predict_##xy, 1); \ - op (predict_##xy, 2); \ - op (predict_##xy, 3); \ - op (predict_##xy, 4); \ - op (predict_##xy, 5); \ - op (predict_##xy, 6); \ - op (predict_##xy, 7); \ - ref += stride; \ - dest += stride; \ - } while (--height); \ -} \ -/* definitions of the actual mc functions */ - -/* MC_FUNC (put,o) */ -MC_FUNC (avg,o) -/* MC_FUNC (put,x) */ -MC_FUNC (avg,x) -MC_FUNC (put,y) -MC_FUNC (avg,y) -MC_FUNC (put,xy) -MC_FUNC (avg,xy) - - -extern void MC_put_o_16_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height); - -extern void MC_put_x_16_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height); - - -static void MC_put_y_16_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height) -{ - MC_put_y_16_c(dest, ref, stride, height); -} - -static void MC_put_xy_16_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height) -{ - MC_put_xy_16_c(dest, ref, stride, height); -} - -extern void MC_put_o_8_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height); - -extern void MC_put_x_8_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height); - -static void MC_put_y_8_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height) -{ - MC_put_y_8_c(dest, ref, stride, height); -} - -static void MC_put_xy_8_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height) -{ - MC_put_xy_8_c(dest, ref, stride, height); -} - -static void MC_avg_o_16_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height) -{ - MC_avg_o_16_c(dest, ref, stride, height); -} - -static void MC_avg_x_16_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height) -{ - MC_avg_x_16_c(dest, ref, stride, height); -} - -static void MC_avg_y_16_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height) -{ - MC_avg_y_16_c(dest, ref, stride, height); -} - -static void MC_avg_xy_16_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height) -{ - MC_avg_xy_16_c(dest, ref, stride, height); -} - -static void MC_avg_o_8_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height) -{ - MC_avg_o_8_c(dest, ref, stride, height); -} - -static void MC_avg_x_8_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height) -{ - MC_avg_x_8_c(dest, ref, stride, height); -} - -static void MC_avg_y_8_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height) -{ - MC_avg_y_8_c(dest, ref, stride, height); -} - -static void MC_avg_xy_8_arm (uint8_t * dest, const uint8_t * ref, - int stride, int height) -{ - MC_avg_xy_8_c(dest, ref, stride, height); -} - -MPEG2_MC_EXTERN (arm) diff --git a/apps/plugins/mpegplayer/motion_comp_arm_c.c b/apps/plugins/mpegplayer/motion_comp_arm_c.c new file mode 100644 index 0000000000..1d0f9d22fc --- /dev/null +++ b/apps/plugins/mpegplayer/motion_comp_arm_c.c @@ -0,0 +1,37 @@ +/* + * motion_comp_arm.c + * Copyright (C) 2004 AGAWA Koji <i (AT) atty (DOT) jp> + * + * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. + * See http://libmpeg2.sourceforge.net/ for updates. + * + * mpeg2dec is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * mpeg2dec is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include <inttypes.h> +#include "mpeg2.h" +#include "attributes.h" +#include "mpeg2_internal.h" +#include "motion_comp.h" + +/* definitions of the actual mc functions */ + +/* MC_FUNC (put, o) <= ASM */ +MC_FUNC (avg, o) +/* MC_FUNC (put, x) <= ASM */ +MC_FUNC (avg, x) +MC_FUNC (put, y) +MC_FUNC (avg, y) +MC_FUNC (put, xy) +MC_FUNC (avg, xy) diff --git a/apps/plugins/mpegplayer/motion_comp_arm_s.S b/apps/plugins/mpegplayer/motion_comp_arm_s.S index 82be8e6a8e..e515f8b516 100644 --- a/apps/plugins/mpegplayer/motion_comp_arm_s.S +++ b/apps/plugins/mpegplayer/motion_comp_arm_s.S @@ -22,24 +22,24 @@ @ ---------------------------------------------------------------- .align - .global MC_put_o_16_arm -MC_put_o_16_arm: + .global MC_put_o_16 +MC_put_o_16: @@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height) @@ pld [r1] stmfd sp!, {r4-r11, lr} @ R14 is also called LR and r4, r1, #3 - adr r5, MC_put_o_16_arm_align_jt + adr r5, MC_put_o_16_align_jt add r5, r5, r4, lsl #2 ldr pc, [r5] -MC_put_o_16_arm_align0: +MC_put_o_16_align0: ldmia r1, {r4-r7} add r1, r1, r2 @@ pld [r1] stmia r0, {r4-r7} subs r3, r3, #1 add r0, r0, r2 - bne MC_put_o_16_arm_align0 + bne MC_put_o_16_align0 ldmfd sp!, {r4-r11, pc} @@ update PC with LR content. .macro PROC shift @@ -59,46 +59,46 @@ MC_put_o_16_arm_align0: add r0, r0, r2 .endm -MC_put_o_16_arm_align1: +MC_put_o_16_align1: and r1, r1, #0xFFFFFFFC 1: PROC(8) bne 1b ldmfd sp!, {r4-r11, pc} @@ update PC with LR content. -MC_put_o_16_arm_align2: +MC_put_o_16_align2: and r1, r1, #0xFFFFFFFC 1: PROC(16) bne 1b ldmfd sp!, {r4-r11, pc} @@ update PC with LR content. -MC_put_o_16_arm_align3: +MC_put_o_16_align3: and r1, r1, #0xFFFFFFFC 1: PROC(24) bne 1b ldmfd sp!, {r4-r11, pc} @@ update PC with LR content. -MC_put_o_16_arm_align_jt: - .word MC_put_o_16_arm_align0 - .word MC_put_o_16_arm_align1 - .word MC_put_o_16_arm_align2 - .word MC_put_o_16_arm_align3 +MC_put_o_16_align_jt: + .word MC_put_o_16_align0 + .word MC_put_o_16_align1 + .word MC_put_o_16_align2 + .word MC_put_o_16_align3 @ ---------------------------------------------------------------- .align - .global MC_put_o_8_arm -MC_put_o_8_arm: + .global MC_put_o_8 +MC_put_o_8: @@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height) @@ pld [r1] stmfd sp!, {r4-r10, lr} @ R14 is also called LR and r4, r1, #3 - adr r5, MC_put_o_8_arm_align_jt + adr r5, MC_put_o_8_align_jt add r5, r5, r4, lsl #2 ldr pc, [r5] -MC_put_o_8_arm_align0: +MC_put_o_8_align0: ldmia r1, {r4-r5} add r1, r1, r2 @@ pld [r1] stmia r0, {r4-r5} add r0, r0, r2 subs r3, r3, #1 - bne MC_put_o_8_arm_align0 + bne MC_put_o_8_align0 ldmfd sp!, {r4-r10, pc} @@ update PC with LR content. .macro PROC8 shift @@ -114,29 +114,29 @@ MC_put_o_8_arm_align0: add r0, r0, r2 .endm -MC_put_o_8_arm_align1: +MC_put_o_8_align1: and r1, r1, #0xFFFFFFFC 1: PROC8(8) bne 1b ldmfd sp!, {r4-r10, pc} @@ update PC with LR content. -MC_put_o_8_arm_align2: +MC_put_o_8_align2: and r1, r1, #0xFFFFFFFC 1: PROC8(16) bne 1b ldmfd sp!, {r4-r10, pc} @@ update PC with LR content. -MC_put_o_8_arm_align3: +MC_put_o_8_align3: and r1, r1, #0xFFFFFFFC 1: PROC8(24) bne 1b ldmfd sp!, {r4-r10, pc} @@ update PC with LR content. -MC_put_o_8_arm_align_jt: - .word MC_put_o_8_arm_align0 - .word MC_put_o_8_arm_align1 - .word MC_put_o_8_arm_align2 - .word MC_put_o_8_arm_align3 +MC_put_o_8_align_jt: + .word MC_put_o_8_align0 + .word MC_put_o_8_align1 + .word MC_put_o_8_align2 + .word MC_put_o_8_align3 @ ---------------------------------------------------------------- .macro AVG_PW rW1, rW2 @@ -151,13 +151,13 @@ MC_put_o_8_arm_align_jt: .endm .align - .global MC_put_x_16_arm -MC_put_x_16_arm: + .global MC_put_x_16 +MC_put_x_16: @@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height) @@ pld [r1] stmfd sp!, {r4-r11,lr} @ R14 is also called LR and r4, r1, #3 - adr r5, MC_put_x_16_arm_align_jt + adr r5, MC_put_x_16_align_jt ldr r11, [r5] mvn r12, r11 add r5, r5, r4, lsl #2 @@ -176,7 +176,7 @@ MC_put_x_16_arm: @ and \R4, \R4, #0xFF .endm -MC_put_x_16_arm_align0: +MC_put_x_16_align0: ldmia r1, {r4-r8} add r1, r1, r2 @@ pld [r1] @@ -187,9 +187,9 @@ MC_put_x_16_arm_align0: stmia r0, {r5-r8} subs r3, r3, #1 add r0, r0, r2 - bne MC_put_x_16_arm_align0 + bne MC_put_x_16_align0 ldmfd sp!, {r4-r11,pc} @@ update PC with LR content. -MC_put_x_16_arm_align1: +MC_put_x_16_align1: and r1, r1, #0xFFFFFFFC 1: ldmia r1, {r4-r8} add r1, r1, r2 @@ -204,7 +204,7 @@ MC_put_x_16_arm_align1: add r0, r0, r2 bne 1b ldmfd sp!, {r4-r11,pc} @@ update PC with LR content. -MC_put_x_16_arm_align2: +MC_put_x_16_align2: and r1, r1, #0xFFFFFFFC 1: ldmia r1, {r4-r8} add r1, r1, r2 @@ -219,7 +219,7 @@ MC_put_x_16_arm_align2: add r0, r0, r2 bne 1b ldmfd sp!, {r4-r11,pc} @@ update PC with LR content. -MC_put_x_16_arm_align3: +MC_put_x_16_align3: and r1, r1, #0xFFFFFFFC 1: ldmia r1, {r4-r8} add r1, r1, r2 @@ -234,22 +234,22 @@ MC_put_x_16_arm_align3: add r0, r0, r2 bne 1b ldmfd sp!, {r4-r11,pc} @@ update PC with LR content. -MC_put_x_16_arm_align_jt: +MC_put_x_16_align_jt: .word 0x01010101 - .word MC_put_x_16_arm_align0 - .word MC_put_x_16_arm_align1 - .word MC_put_x_16_arm_align2 - .word MC_put_x_16_arm_align3 + .word MC_put_x_16_align0 + .word MC_put_x_16_align1 + .word MC_put_x_16_align2 + .word MC_put_x_16_align3 @ ---------------------------------------------------------------- .align - .global MC_put_x_8_arm -MC_put_x_8_arm: + .global MC_put_x_8 +MC_put_x_8: @@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height) @@ pld [r1] stmfd sp!, {r4-r11,lr} @ R14 is also called LR and r4, r1, #3 - adr r5, MC_put_x_8_arm_align_jt + adr r5, MC_put_x_8_align_jt ldr r11, [r5] mvn r12, r11 add r5, r5, r4, lsl #2 @@ -264,7 +264,7 @@ MC_put_x_8_arm: @ and \R4, \R4, #0xFF .endm -MC_put_x_8_arm_align0: +MC_put_x_8_align0: ldmia r1, {r4-r6} add r1, r1, r2 @@ pld [r1] @@ -273,9 +273,9 @@ MC_put_x_8_arm_align0: stmia r0, {r5-r6} subs r3, r3, #1 add r0, r0, r2 - bne MC_put_x_8_arm_align0 + bne MC_put_x_8_align0 ldmfd sp!, {r4-r11,pc} @@ update PC with LR content. -MC_put_x_8_arm_align1: +MC_put_x_8_align1: and r1, r1, #0xFFFFFFFC 1: ldmia r1, {r4-r6} add r1, r1, r2 @@ -288,7 +288,7 @@ MC_put_x_8_arm_align1: add r0, r0, r2 bne 1b ldmfd sp!, {r4-r11,pc} @@ update PC with LR content. -MC_put_x_8_arm_align2: +MC_put_x_8_align2: and r1, r1, #0xFFFFFFFC 1: ldmia r1, {r4-r6} add r1, r1, r2 @@ -301,7 +301,7 @@ MC_put_x_8_arm_align2: add r0, r0, r2 bne 1b ldmfd sp!, {r4-r11,pc} @@ update PC with LR content. -MC_put_x_8_arm_align3: +MC_put_x_8_align3: and r1, r1, #0xFFFFFFFC 1: ldmia r1, {r4-r6} add r1, r1, r2 @@ -314,9 +314,9 @@ MC_put_x_8_arm_align3: add r0, r0, r2 bne 1b ldmfd sp!, {r4-r11,pc} @@ update PC with LR content. -MC_put_x_8_arm_align_jt: +MC_put_x_8_align_jt: .word 0x01010101 - .word MC_put_x_8_arm_align0 - .word MC_put_x_8_arm_align1 - .word MC_put_x_8_arm_align2 - .word MC_put_x_8_arm_align3 + .word MC_put_x_8_align0 + .word MC_put_x_8_align1 + .word MC_put_x_8_align2 + .word MC_put_x_8_align3 diff --git a/apps/plugins/mpegplayer/mpeg2.h b/apps/plugins/mpegplayer/mpeg2.h index 6062f93010..01b3de49eb 100644 --- a/apps/plugins/mpegplayer/mpeg2.h +++ b/apps/plugins/mpegplayer/mpeg2.h @@ -144,24 +144,12 @@ typedef enum { } mpeg2_convert_stage_t; typedef int mpeg2_convert_t (int stage, void * id, const mpeg2_sequence_t * sequence, int stride, - uint32_t accel, void * arg, - mpeg2_convert_init_t * result); + void * arg, mpeg2_convert_init_t * result); int mpeg2_convert (mpeg2dec_t * mpeg2dec, mpeg2_convert_t convert, void * arg); int mpeg2_stride (mpeg2dec_t * mpeg2dec, int stride); void mpeg2_set_buf (mpeg2dec_t * mpeg2dec, uint8_t * buf[3], void * id); void mpeg2_custom_fbuf (mpeg2dec_t * mpeg2dec, int custom_fbuf); -#define MPEG2_ACCEL_X86_MMX 1 -#define MPEG2_ACCEL_X86_3DNOW 2 -#define MPEG2_ACCEL_X86_MMXEXT 4 -#define MPEG2_ACCEL_PPC_ALTIVEC 1 -#define MPEG2_ACCEL_ALPHA 1 -#define MPEG2_ACCEL_ALPHA_MVI 2 -#define MPEG2_ACCEL_SPARC_VIS 1 -#define MPEG2_ACCEL_SPARC_VIS2 2 -#define MPEG2_ACCEL_DETECT 0x80000000 - -uint32_t mpeg2_accel (uint32_t accel); mpeg2dec_t * mpeg2_init (void); const mpeg2_info_t * mpeg2_info (mpeg2dec_t * mpeg2dec); void mpeg2_close (mpeg2dec_t * mpeg2dec); diff --git a/apps/plugins/mpegplayer/mpeg2_internal.h b/apps/plugins/mpegplayer/mpeg2_internal.h index 443b6d6114..0c552b766f 100644 --- a/apps/plugins/mpegplayer/mpeg2_internal.h +++ b/apps/plugins/mpegplayer/mpeg2_internal.h @@ -244,58 +244,18 @@ int mpeg2_header_extension (mpeg2dec_t * mpeg2dec); int mpeg2_header_user_data (mpeg2dec_t * mpeg2dec); void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec); void mpeg2_header_gop_finalize (mpeg2dec_t * mpeg2dec); -void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec, uint32_t accels); +void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec); mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec); mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec); void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int b_type); /* idct.c */ -void mpeg2_idct_init (uint32_t accel); - -/* idct_mmx.c */ -void mpeg2_idct_copy_mmxext (int16_t * block, uint8_t * dest, int stride); -void mpeg2_idct_add_mmxext (int last, int16_t * block, - uint8_t * dest, int stride); -void mpeg2_idct_copy_mmx (int16_t * block, uint8_t * dest, int stride); -void mpeg2_idct_add_mmx (int last, int16_t * block, - uint8_t * dest, int stride); -void mpeg2_idct_mmx_init (void); - -/* idct_altivec.c */ -void mpeg2_idct_copy_altivec (int16_t * block, uint8_t * dest, int stride); -void mpeg2_idct_add_altivec (int last, int16_t * block, - uint8_t * dest, int stride); -void mpeg2_idct_altivec_init (void); - -/* idct_alpha.c */ -void mpeg2_idct_copy_mvi (int16_t * block, uint8_t * dest, int stride); -void mpeg2_idct_add_mvi (int last, int16_t * block, - uint8_t * dest, int stride); -void mpeg2_idct_copy_alpha (int16_t * block, uint8_t * dest, int stride); -void mpeg2_idct_add_alpha (int last, int16_t * block, - uint8_t * dest, int stride); -void mpeg2_idct_alpha_init (void); +void mpeg2_idct_init (void); /* motion_comp.c */ -void mpeg2_mc_init (uint32_t accel); +void mpeg2_mc_init (void); typedef struct { mpeg2_mc_fct * put [8]; mpeg2_mc_fct * avg [8]; } mpeg2_mc_t; - -#define MPEG2_MC_EXTERN(x) mpeg2_mc_t mpeg2_mc_##x = { \ - {MC_put_o_16_##x, MC_put_x_16_##x, MC_put_y_16_##x, MC_put_xy_16_##x, \ - MC_put_o_8_##x, MC_put_x_8_##x, MC_put_y_8_##x, MC_put_xy_8_##x}, \ - {MC_avg_o_16_##x, MC_avg_x_16_##x, MC_avg_y_16_##x, MC_avg_xy_16_##x, \ - MC_avg_o_8_##x, MC_avg_x_8_##x, MC_avg_y_8_##x, MC_avg_xy_8_##x} \ -}; - -extern mpeg2_mc_t mpeg2_mc_c; -extern mpeg2_mc_t mpeg2_mc_mmx; -extern mpeg2_mc_t mpeg2_mc_mmxext; -extern mpeg2_mc_t mpeg2_mc_3dnow; -extern mpeg2_mc_t mpeg2_mc_altivec; -extern mpeg2_mc_t mpeg2_mc_alpha; -extern mpeg2_mc_t mpeg2_mc_vis; -extern mpeg2_mc_t mpeg2_mc_arm; diff --git a/apps/plugins/mpegplayer/slice.c b/apps/plugins/mpegplayer/slice.c index 8ee341739d..7c1c07bf37 100644 --- a/apps/plugins/mpegplayer/slice.c +++ b/apps/plugins/mpegplayer/slice.c @@ -34,8 +34,6 @@ extern mpeg2_mc_t mpeg2_mc; extern void (* mpeg2_idct_copy) (int16_t * block, uint8_t * dest, int stride); extern void (* mpeg2_idct_add) (int last, int16_t * block, uint8_t * dest, int stride); -extern void (* mpeg2_cpu_state_save) (cpu_state_t * state); -extern void (* mpeg2_cpu_state_restore) (cpu_state_t * state); #include "vlc.h" @@ -1554,39 +1552,36 @@ static void motion_fi_conceal (mpeg2_decoder_t * const decoder) #undef bits #undef bit_ptr -#define MOTION_CALL(routine,direction) \ -do { \ - if ((direction) & MACROBLOCK_MOTION_FORWARD) \ - routine (decoder, &(decoder->f_motion), mpeg2_mc.put); \ - if ((direction) & MACROBLOCK_MOTION_BACKWARD) \ - routine (decoder, &(decoder->b_motion), \ - ((direction) & MACROBLOCK_MOTION_FORWARD ? \ - mpeg2_mc.avg : mpeg2_mc.put)); \ +#define MOTION_CALL(routine,direction) \ +do { \ + if ((direction) & MACROBLOCK_MOTION_FORWARD) \ + routine (decoder, &(decoder->f_motion), mpeg2_mc.put); \ + if ((direction) & MACROBLOCK_MOTION_BACKWARD) \ + routine (decoder, &(decoder->b_motion), \ + ((direction) & MACROBLOCK_MOTION_FORWARD ? \ + mpeg2_mc.avg : mpeg2_mc.put)); \ } while (0) -#define NEXT_MACROBLOCK \ -do { \ - decoder->offset += 16; \ - if (decoder->offset == decoder->width) { \ - do { /* just so we can use the break statement */ \ - if (decoder->convert) { \ - decoder->convert (decoder->convert_id, decoder->dest, \ - decoder->v_offset); \ - if (decoder->coding_type == B_TYPE) \ - break; \ - } \ - decoder->dest[0] += decoder->slice_stride; \ - decoder->dest[1] += decoder->slice_uv_stride; \ - decoder->dest[2] += decoder->slice_uv_stride; \ - } while (0); \ - decoder->v_offset += 16; \ - if (decoder->v_offset > decoder->limit_y) { \ - if (mpeg2_cpu_state_restore) \ - mpeg2_cpu_state_restore (&cpu_state); \ - return; \ - } \ - decoder->offset = 0; \ - } \ +#define NEXT_MACROBLOCK \ +do { \ + decoder->offset += 16; \ + if (decoder->offset == decoder->width) { \ + do { /* just so we can use the break statement */ \ + if (decoder->convert) { \ + decoder->convert (decoder->convert_id, decoder->dest, \ + decoder->v_offset); \ + if (decoder->coding_type == B_TYPE) \ + break; \ + } \ + decoder->dest[0] += decoder->slice_stride; \ + decoder->dest[1] += decoder->slice_uv_stride; \ + decoder->dest[2] += decoder->slice_uv_stride; \ + } while (0); \ + decoder->v_offset += 16; \ + if (decoder->v_offset > decoder->limit_y) \ + return; \ + decoder->offset = 0; \ + } \ } while (0) void mpeg2_init_fbuf (mpeg2_decoder_t * decoder, uint8_t * current_fbuf[3], @@ -1780,16 +1775,12 @@ void mpeg2_slice (mpeg2_decoder_t * const decoder, const int code, #define bit_buf (decoder->bitstream_buf) #define bits (decoder->bitstream_bits) #define bit_ptr (decoder->bitstream_ptr) - cpu_state_t cpu_state; bitstream_init (decoder, buffer); if (slice_init (decoder, code)) return; - if (mpeg2_cpu_state_save) - mpeg2_cpu_state_save (&cpu_state); - while (1) { int macroblock_modes; int mba_inc; @@ -2028,8 +2019,6 @@ void mpeg2_slice (mpeg2_decoder_t * const decoder, const int code, NEEDBITS (bit_buf, bits, bit_ptr); continue; default: /* end of slice, or error */ - if (mpeg2_cpu_state_restore) - mpeg2_cpu_state_restore (&cpu_state); return; } } |