summaryrefslogtreecommitdiff
path: root/apps/plugins/mpegplayer/motion_comp.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/mpegplayer/motion_comp.c')
-rw-r--r--apps/plugins/mpegplayer/motion_comp.c133
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
32mpeg2_mc_t mpeg2_mc; 32/* These are defined in their respective target files - motion_comp_X.c */
33 33extern mpeg2_mc_fct MC_put_o_16;
34void mpeg2_mc_init (uint32_t accel) 34extern mpeg2_mc_fct MC_put_o_8;
35extern mpeg2_mc_fct MC_put_x_16;
36extern mpeg2_mc_fct MC_put_x_8;
37extern mpeg2_mc_fct MC_put_y_16;
38extern mpeg2_mc_fct MC_put_y_8;
39extern mpeg2_mc_fct MC_put_xy_16;
40extern mpeg2_mc_fct MC_put_xy_8;
41
42extern mpeg2_mc_fct MC_avg_o_16;
43extern mpeg2_mc_fct MC_avg_o_8;
44extern mpeg2_mc_fct MC_avg_x_16;
45extern mpeg2_mc_fct MC_avg_x_8;
46extern mpeg2_mc_fct MC_avg_y_16;
47extern mpeg2_mc_fct MC_avg_y_8;
48extern mpeg2_mc_fct MC_avg_xy_16;
49extern mpeg2_mc_fct MC_avg_xy_8;
50
51mpeg2_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) \
84static 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} \
108static 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
127MC_FUNC (put,o)
128MC_FUNC (avg,o)
129MC_FUNC (put,x)
130MC_FUNC (avg,x)
131MC_FUNC (put,y)
132MC_FUNC (avg,y)
133MC_FUNC (put,xy)
134MC_FUNC (avg,xy)
135
136MPEG2_MC_EXTERN (c)