diff options
Diffstat (limited to 'apps/plugins/mpegplayer/motion_comp.c')
-rw-r--r-- | apps/plugins/mpegplayer/motion_comp.c | 133 |
1 files changed, 29 insertions, 104 deletions
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 @@ | |||
29 | #include "attributes.h" | 29 | #include "attributes.h" |
30 | #include "mpeg2_internal.h" | 30 | #include "mpeg2_internal.h" |
31 | 31 | ||
32 | mpeg2_mc_t mpeg2_mc; | 32 | /* These are defined in their respective target files - motion_comp_X.c */ |
33 | 33 | extern mpeg2_mc_fct MC_put_o_16; | |
34 | void mpeg2_mc_init (uint32_t accel) | 34 | extern mpeg2_mc_fct MC_put_o_8; |
35 | extern mpeg2_mc_fct MC_put_x_16; | ||
36 | extern mpeg2_mc_fct MC_put_x_8; | ||
37 | extern mpeg2_mc_fct MC_put_y_16; | ||
38 | extern mpeg2_mc_fct MC_put_y_8; | ||
39 | extern mpeg2_mc_fct MC_put_xy_16; | ||
40 | extern mpeg2_mc_fct MC_put_xy_8; | ||
41 | |||
42 | extern mpeg2_mc_fct MC_avg_o_16; | ||
43 | extern mpeg2_mc_fct MC_avg_o_8; | ||
44 | extern mpeg2_mc_fct MC_avg_x_16; | ||
45 | extern mpeg2_mc_fct MC_avg_x_8; | ||
46 | extern mpeg2_mc_fct MC_avg_y_16; | ||
47 | extern mpeg2_mc_fct MC_avg_y_8; | ||
48 | extern mpeg2_mc_fct MC_avg_xy_16; | ||
49 | extern mpeg2_mc_fct MC_avg_xy_8; | ||
50 | |||
51 | mpeg2_mc_t mpeg2_mc = | ||
35 | { | 52 | { |
36 | (void)accel; | 53 | { |
37 | #ifdef ARCH_X86 | 54 | MC_put_o_16, MC_put_x_16, MC_put_y_16, MC_put_xy_16, |
38 | if (accel & MPEG2_ACCEL_X86_MMXEXT) | 55 | MC_put_o_8, MC_put_x_8, MC_put_y_8, MC_put_xy_8 |
39 | mpeg2_mc = mpeg2_mc_mmxext; | 56 | }, |
40 | else if (accel & MPEG2_ACCEL_X86_3DNOW) | 57 | { |
41 | mpeg2_mc = mpeg2_mc_3dnow; | 58 | MC_avg_o_16, MC_avg_x_16, MC_avg_y_16, MC_avg_xy_16, |
42 | else if (accel & MPEG2_ACCEL_X86_MMX) | 59 | MC_avg_o_8, MC_avg_x_8, MC_avg_y_8, MC_avg_xy_8 |
43 | mpeg2_mc = mpeg2_mc_mmx; | 60 | } |
44 | else | 61 | }; |
45 | #endif | ||
46 | #ifdef ARCH_PPC | ||
47 | if (accel & MPEG2_ACCEL_PPC_ALTIVEC) | ||
48 | mpeg2_mc = mpeg2_mc_altivec; | ||
49 | else | ||
50 | #endif | ||
51 | #ifdef ARCH_ALPHA | ||
52 | if (accel & MPEG2_ACCEL_ALPHA) | ||
53 | mpeg2_mc = mpeg2_mc_alpha; | ||
54 | else | ||
55 | #endif | ||
56 | #ifdef ARCH_SPARC | ||
57 | if (accel & MPEG2_ACCEL_SPARC_VIS) | ||
58 | mpeg2_mc = mpeg2_mc_vis; | ||
59 | else | ||
60 | #endif | ||
61 | |||
62 | #ifdef CPU_ARM | ||
63 | mpeg2_mc = mpeg2_mc_arm; | ||
64 | #else | ||
65 | mpeg2_mc = mpeg2_mc_c; | ||
66 | #endif | ||
67 | } | ||
68 | |||
69 | #define avg2(a,b) ((a+b+1)>>1) | ||
70 | #define avg4(a,b,c,d) ((a+b+c+d+2)>>2) | ||
71 | |||
72 | #define predict_o(i) (ref[i]) | ||
73 | #define predict_x(i) (avg2 (ref[i], ref[i+1])) | ||
74 | #define predict_y(i) (avg2 (ref[i], (ref+stride)[i])) | ||
75 | #define predict_xy(i) (avg4 (ref[i], ref[i+1], \ | ||
76 | (ref+stride)[i], (ref+stride)[i+1])) | ||
77 | |||
78 | #define put(predictor,i) dest[i] = predictor (i) | ||
79 | #define avg(predictor,i) dest[i] = avg2 (predictor (i), dest[i]) | ||
80 | |||
81 | /* mc function template */ | ||
82 | |||
83 | #define MC_FUNC(op,xy) \ | ||
84 | static void MC_##op##_##xy##_16_c (uint8_t * dest, const uint8_t * ref, \ | ||
85 | const int stride, int height) \ | ||
86 | { \ | ||
87 | do { \ | ||
88 | op (predict_##xy, 0); \ | ||
89 | op (predict_##xy, 1); \ | ||
90 | op (predict_##xy, 2); \ | ||
91 | op (predict_##xy, 3); \ | ||
92 | op (predict_##xy, 4); \ | ||
93 | op (predict_##xy, 5); \ | ||
94 | op (predict_##xy, 6); \ | ||
95 | op (predict_##xy, 7); \ | ||
96 | op (predict_##xy, 8); \ | ||
97 | op (predict_##xy, 9); \ | ||
98 | op (predict_##xy, 10); \ | ||
99 | op (predict_##xy, 11); \ | ||
100 | op (predict_##xy, 12); \ | ||
101 | op (predict_##xy, 13); \ | ||
102 | op (predict_##xy, 14); \ | ||
103 | op (predict_##xy, 15); \ | ||
104 | ref += stride; \ | ||
105 | dest += stride; \ | ||
106 | } while (--height); \ | ||
107 | } \ | ||
108 | static void MC_##op##_##xy##_8_c (uint8_t * dest, const uint8_t * ref, \ | ||
109 | const int stride, int height) \ | ||
110 | { \ | ||
111 | do { \ | ||
112 | op (predict_##xy, 0); \ | ||
113 | op (predict_##xy, 1); \ | ||
114 | op (predict_##xy, 2); \ | ||
115 | op (predict_##xy, 3); \ | ||
116 | op (predict_##xy, 4); \ | ||
117 | op (predict_##xy, 5); \ | ||
118 | op (predict_##xy, 6); \ | ||
119 | op (predict_##xy, 7); \ | ||
120 | ref += stride; \ | ||
121 | dest += stride; \ | ||
122 | } while (--height); \ | ||
123 | } | ||
124 | |||
125 | /* definitions of the actual mc functions */ | ||
126 | |||
127 | MC_FUNC (put,o) | ||
128 | MC_FUNC (avg,o) | ||
129 | MC_FUNC (put,x) | ||
130 | MC_FUNC (avg,x) | ||
131 | MC_FUNC (put,y) | ||
132 | MC_FUNC (avg,y) | ||
133 | MC_FUNC (put,xy) | ||
134 | MC_FUNC (avg,xy) | ||
135 | |||
136 | MPEG2_MC_EXTERN (c) | ||