author | kergoth <kergoth> | 2002-01-25 22:14:26 (UTC) |
---|---|---|
committer | kergoth <kergoth> | 2002-01-25 22:14:26 (UTC) |
commit | 15318cad33835e4e2dc620d033e43cd930676cdd (patch) (unidiff) | |
tree | c2fa0399a2c47fda8e2cd0092c73a809d17f68eb /core/multimedia/opieplayer/libmpeg3/video/output.c | |
download | opie-15318cad33835e4e2dc620d033e43cd930676cdd.zip opie-15318cad33835e4e2dc620d033e43cd930676cdd.tar.gz opie-15318cad33835e4e2dc620d033e43cd930676cdd.tar.bz2 |
Initial revision
Diffstat (limited to 'core/multimedia/opieplayer/libmpeg3/video/output.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | core/multimedia/opieplayer/libmpeg3/video/output.c | 993 |
1 files changed, 993 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/libmpeg3/video/output.c b/core/multimedia/opieplayer/libmpeg3/video/output.c new file mode 100644 index 0000000..919a0ff --- a/dev/null +++ b/core/multimedia/opieplayer/libmpeg3/video/output.c | |||
@@ -0,0 +1,993 @@ | |||
1 | #include "../libmpeg3.h" | ||
2 | #include "../mpeg3protos.h" | ||
3 | #include "mpeg3video.h" | ||
4 | #include <string.h> | ||
5 | |||
6 | static LONGLONG mpeg3_MMX_0 = 0L; | ||
7 | static unsigned long mpeg3_MMX_10w[] = {0x00100010, 0x00100010}; /*dd 00010 0010h, 000100010h */ | ||
8 | static unsigned long mpeg3_MMX_80w[] = {0x00800080, 0x00800080}; /*dd 00080 0080h, 000800080h */ | ||
9 | |||
10 | static unsigned long mpeg3_MMX_00FFw[] = {0x00ff00ff, 0x00ff00ff}; /*dd 000FF 00FFh, 000FF00FFh */ | ||
11 | |||
12 | static unsigned short mpeg3_MMX_Ublucoeff[] = {0x81, 0x81, 0x81, 0x81}; /*dd 00081 0081h, 000810081h */ | ||
13 | static unsigned short mpeg3_MMX_Vredcoeff[] = {0x66, 0x66, 0x66, 0x66}; /*dd 00066 0066h, 000660066h */ | ||
14 | |||
15 | static unsigned short mpeg3_MMX_Ugrncoeff[] = {0xffe8, 0xffe8, 0xffe8, 0xffe8}; /*dd 0FFE7 FFE7h, 0FFE7FFE7h */ | ||
16 | static unsigned short mpeg3_MMX_Vgrncoeff[] = {0xffcd, 0xffcd, 0xffcd, 0xffcd}; /*dd 0FFCC FFCCh, 0FFCCFFCCh */ | ||
17 | |||
18 | static unsigned short mpeg3_MMX_Ycoeff[] = {0x4a, 0x4a, 0x4a, 0x4a}; /*dd 0004A 004Ah, 0004A004Ah */ | ||
19 | |||
20 | static unsigned short mpeg3_MMX_redmask[] = {0xf800, 0xf800, 0xf800, 0xf800}; /*dd 07c00 7c00h, 07c007c00h */ | ||
21 | |||
22 | static unsigned short mpeg3_MMX_grnmask[] = {0x7e0, 0x7e0, 0x7e0, 0x7e0}; /*dd 003e0 03e0h, 003e003e0h */ | ||
23 | |||
24 | static unsigned char mpeg3_601_to_rgb[256]; | ||
25 | |||
26 | /* Algorithm */ | ||
27 | /* r = (int)(*y + 1.371 * (*cr - 128)); */ | ||
28 | /* g = (int)(*y - 0.698 * (*cr - 128) - 0.336 * (*cb - 128)); */ | ||
29 | /* b = (int)(*y + 1.732 * (*cb - 128)); */ | ||
30 | |||
31 | #ifdef HAVE_MMX | ||
32 | inline void mpeg3video_rgb16_mmx(unsigned char *lum, | ||
33 | unsigned char *cr, | ||
34 | unsigned char *cb, | ||
35 | unsigned char *out, | ||
36 | int rows, | ||
37 | int cols, | ||
38 | int mod) | ||
39 | { | ||
40 | unsigned short *row1; | ||
41 | int x; | ||
42 | unsigned char *y; | ||
43 | int col1; | ||
44 | |||
45 | row1 = (unsigned short *)out; | ||
46 | col1 = cols + mod; | ||
47 | mod += cols + mod; | ||
48 | mod *= 2; | ||
49 | y = lum + cols * rows; | ||
50 | x = 0; | ||
51 | |||
52 | __asm__ __volatile__( | ||
53 | ".align 8\n" | ||
54 | "1:\n" | ||
55 | "movd (%1), %%mm0\n" /* 4 Cb 0 0 0 0 u3 u2 u1 u0 */ | ||
56 | "pxor %%mm7, %%mm7\n" | ||
57 | "movd (%0), %%mm1\n" /* 4 Cr 0 0 0 0 v3 v2 v1 v0 */ | ||
58 | "punpcklbw %%mm7, %%mm0\n" /* 4 W cb 0 u3 0 u2 0 u1 0 u0 */ | ||
59 | "punpcklbw %%mm7, %%mm1\n" /* 4 W cr 0 v3 0 v2 0 v1 0 v0 */ | ||
60 | |||
61 | "psubw mpeg3_MMX_80w, %%mm0\n" | ||
62 | "psubw mpeg3_MMX_80w, %%mm1\n" | ||
63 | "movq %%mm0, %%mm2\n" /* Cb 0 u3 0 u2 0 u1 0 u0 */ | ||
64 | "movq %%mm1, %%mm3\n" /* Cr */ | ||
65 | "pmullw mpeg3_MMX_Ugrncoeff, %%mm2\n" /* Cb2green 0 R3 0 R2 0 R1 0 R0 */ | ||
66 | "movq (%2), %%mm6\n" /* L1 l7 L6 L5 L4 L3 L2 L1 L0 */ | ||
67 | "pmullw mpeg3_MMX_Ublucoeff, %%mm0\n" /* Cb2blue */ | ||
68 | "pand mpeg3_MMX_00FFw, %%mm6\n" /* L1 00 L6 00 L4 00 L2 00 L0 */ | ||
69 | "pmullw mpeg3_MMX_Vgrncoeff, %%mm3\n" /* Cr2green */ | ||
70 | "movq (%2), %%mm7\n" /* L2 */ | ||
71 | "pmullw mpeg3_MMX_Vredcoeff, %%mm1\n" /* Cr2red */ | ||
72 | "psrlw $8, %%mm7\n" /* L2 00 L7 00 L5 00 L3 00 L1 */ | ||
73 | "pmullw mpeg3_MMX_Ycoeff, %%mm6\n" /* lum1 */ | ||
74 | "paddw %%mm3, %%mm2\n" /* Cb2green + Cr2green == green */ | ||
75 | "pmullw mpeg3_MMX_Ycoeff, %%mm7\n" /* lum2 */ | ||
76 | |||
77 | "movq %%mm6, %%mm4\n" /* lum1 */ | ||
78 | "paddw %%mm0, %%mm6\n" /* lum1 +blue 00 B6 00 B4 00 B2 00 B0 */ | ||
79 | "movq %%mm4, %%mm5\n" /* lum1 */ | ||
80 | "paddw %%mm1, %%mm4\n" /* lum1 +red 00 R6 00 R4 00 R2 00 R0 */ | ||
81 | "paddw %%mm2, %%mm5\n" /* lum1 +green 00 G6 00 G4 00 G2 00 G0 */ | ||
82 | "psraw $6, %%mm4\n" /* R1 0 .. 64 */ | ||
83 | "movq %%mm7, %%mm3\n" /* lum2 00 L7 00 L5 00 L3 00 L1 */ | ||
84 | "psraw $6, %%mm5\n" /* G1 - .. + */ | ||
85 | "paddw %%mm0, %%mm7\n" /* Lum2 +blue 00 B7 00 B5 00 B3 00 B1 */ | ||
86 | "psraw $6, %%mm6\n" /* B1 0 .. 64 */ | ||
87 | "packuswb %%mm4, %%mm4\n" /* R1 R1 */ | ||
88 | "packuswb %%mm5, %%mm5\n" /* G1 G1 */ | ||
89 | "packuswb %%mm6, %%mm6\n" /* B1 B1 */ | ||
90 | "punpcklbw %%mm4, %%mm4\n" | ||
91 | "punpcklbw %%mm5, %%mm5\n" | ||
92 | |||
93 | "pand mpeg3_MMX_redmask, %%mm4\n" | ||
94 | "psllw $3, %%mm5\n" /* GREEN 1 */ | ||
95 | "punpcklbw %%mm6, %%mm6\n" | ||
96 | "pand mpeg3_MMX_grnmask, %%mm5\n" | ||
97 | "pand mpeg3_MMX_redmask, %%mm6\n" | ||
98 | "por %%mm5, %%mm4\n" /* */ | ||
99 | "psrlw $11, %%mm6\n" /* BLUE 1 */ | ||
100 | "movq %%mm3, %%mm5\n" /* lum2 */ | ||
101 | "paddw %%mm1, %%mm3\n" /* lum2 +red 00 R7 00 R5 00 R3 00 R1 */ | ||
102 | "paddw %%mm2, %%mm5\n" /* lum2 +green 00 G7 00 G5 00 G3 00 G1 */ | ||
103 | "psraw $6, %%mm3\n" /* R2 */ | ||
104 | "por %%mm6, %%mm4\n" /* MM4 */ | ||
105 | "psraw $6, %%mm5\n" /* G2 */ | ||
106 | "movq (%2, %3), %%mm6\n" /* L3 */ | ||
107 | "psraw $6, %%mm7\n" | ||
108 | "packuswb %%mm3, %%mm3\n" | ||
109 | "packuswb %%mm5, %%mm5\n" | ||
110 | "packuswb %%mm7, %%mm7\n" | ||
111 | "pand mpeg3_MMX_00FFw, %%mm6\n" /* L3 */ | ||
112 | "punpcklbw %%mm3, %%mm3\n" | ||
113 | "punpcklbw %%mm5, %%mm5\n" | ||
114 | "pmullw mpeg3_MMX_Ycoeff, %%mm6\n" /* lum3 */ | ||
115 | "punpcklbw %%mm7, %%mm7\n" | ||
116 | "psllw $3, %%mm5\n" /* GREEN 2 */ | ||
117 | "pand mpeg3_MMX_redmask, %%mm7\n" | ||
118 | "pand mpeg3_MMX_redmask, %%mm3\n" | ||
119 | "psrlw $11, %%mm7\n" /* BLUE 2 */ | ||
120 | "pand mpeg3_MMX_grnmask, %%mm5\n" | ||
121 | "por %%mm7, %%mm3\n" | ||
122 | "movq (%2,%3), %%mm7\n" /* L4 */ | ||
123 | "por %%mm5, %%mm3\n" /* */ | ||
124 | "psrlw $8, %%mm7\n" /* L4 */ | ||
125 | "movq %%mm4, %%mm5\n" | ||
126 | "punpcklwd %%mm3, %%mm4\n" | ||
127 | "pmullw mpeg3_MMX_Ycoeff, %%mm7\n" /* lum4 */ | ||
128 | "punpckhwd %%mm3, %%mm5\n" | ||
129 | |||
130 | "movq %%mm4, (%4)\n" | ||
131 | "movq %%mm5, 8(%4)\n" | ||
132 | |||
133 | "movq %%mm6, %%mm4\n" /* Lum3 */ | ||
134 | "paddw %%mm0, %%mm6\n" /* Lum3 +blue */ | ||
135 | |||
136 | "movq %%mm4, %%mm5\n" /* Lum3 */ | ||
137 | "paddw %%mm1, %%mm4\n" /* Lum3 +red */ | ||
138 | "paddw %%mm2, %%mm5\n" /* Lum3 +green */ | ||
139 | "psraw $6, %%mm4\n" | ||
140 | "movq %%mm7, %%mm3\n"/* Lum4 */ | ||
141 | "psraw $6, %%mm5\n" | ||
142 | "paddw %%mm0, %%mm7\n" /* Lum4 +blue */ | ||
143 | "psraw $6, %%mm6\n" /* Lum3 +blue */ | ||
144 | "movq %%mm3, %%mm0\n" /* Lum4 */ | ||
145 | "packuswb %%mm4, %%mm4\n" | ||
146 | "paddw %%mm1, %%mm3\n" /* Lum4 +red */ | ||
147 | "packuswb %%mm5, %%mm5\n" | ||
148 | "paddw %%mm2, %%mm0\n" /* Lum4 +green */ | ||
149 | "packuswb %%mm6, %%mm6\n" | ||
150 | "punpcklbw %%mm4, %%mm4\n" | ||
151 | "punpcklbw %%mm5, %%mm5\n" | ||
152 | "punpcklbw %%mm6, %%mm6\n" | ||
153 | "psllw $3, %%mm5\n" /* GREEN 3 */ | ||
154 | "pand mpeg3_MMX_redmask, %%mm4\n" | ||
155 | "psraw $6, %%mm3\n" /* psr 6 */ | ||
156 | "psraw $6, %%mm0\n" | ||
157 | "pand mpeg3_MMX_redmask, %%mm6\n" /* BLUE */ | ||
158 | "pand mpeg3_MMX_grnmask, %%mm5\n" | ||
159 | "psrlw $11, %%mm6\n" /* BLUE 3 */ | ||
160 | "por %%mm5, %%mm4\n" | ||
161 | "psraw $6, %%mm7\n" | ||
162 | "por %%mm6, %%mm4\n" | ||
163 | "packuswb %%mm3, %%mm3\n" | ||
164 | "packuswb %%mm0, %%mm0\n" | ||
165 | "packuswb %%mm7, %%mm7\n" | ||
166 | "punpcklbw %%mm3, %%mm3\n" | ||
167 | "punpcklbw %%mm0, %%mm0\n" | ||
168 | "punpcklbw %%mm7, %%mm7\n" | ||
169 | "pand mpeg3_MMX_redmask, %%mm3\n" | ||
170 | "pand mpeg3_MMX_redmask, %%mm7\n" /* BLUE */ | ||
171 | "psllw $3, %%mm0\n" /* GREEN 4 */ | ||
172 | "psrlw $11, %%mm7\n" | ||
173 | "pand mpeg3_MMX_grnmask, %%mm0\n" | ||
174 | "por %%mm7, %%mm3\n" | ||
175 | "addl $8, %6\n" | ||
176 | "por %%mm0, %%mm3\n" | ||
177 | |||
178 | "movq %%mm4, %%mm5\n" | ||
179 | |||
180 | "punpcklwd %%mm3, %%mm4\n" | ||
181 | "punpckhwd %%mm3, %%mm5\n" | ||
182 | |||
183 | "movq %%mm4, (%4,%5,2)\n" | ||
184 | "movq %%mm5, 8(%4,%5,2)\n" | ||
185 | |||
186 | "addl $8, %2\n" | ||
187 | "addl $4, %0\n" | ||
188 | "addl $4, %1\n" | ||
189 | "cmpl %3, %6\n" | ||
190 | "leal 16(%4), %4\n" | ||
191 | "jl 1b\n" | ||
192 | "addl %3, %2\n" /* lum += cols */ | ||
193 | "addl %7, %4\n" /* row1 += mod */ | ||
194 | "movl $0, %6\n" | ||
195 | "cmpl %8, %2\n" | ||
196 | "jl 1b\n" | ||
197 | : : "r" (cr), | ||
198 | "r" (cb), | ||
199 | "r" (lum), | ||
200 | "r" (cols), | ||
201 | "r" (row1) , | ||
202 | "r" (col1), | ||
203 | "m" (x), | ||
204 | "m" (mod), | ||
205 | "m" (y) | ||
206 | ); | ||
207 | } | ||
208 | |||
209 | static unsigned LONGLONG mpeg3_MMX_U_80 = 0x0000008000800000LL; | ||
210 | static unsigned LONGLONG mpeg3_MMX_V_80 = 0x0000000000800080LL; | ||
211 | static LONGLONG mpeg3_MMX_U_COEF = 0x00000058ffd30000LL; | ||
212 | static LONGLONG mpeg3_MMX_V_COEF = 0x00000000ffea006fLL; | ||
213 | static LONGLONG mpeg3_MMX_601_Y_COEF = 0x0000004800480048LL; | ||
214 | static LONGLONG mpeg3_MMX_601_Y_DIFF = 0x0000000000000010LL; | ||
215 | |||
216 | inline void mpeg3_bgra32_mmx(unsigned long y, | ||
217 | unsigned long u, | ||
218 | unsigned long v, | ||
219 | unsigned long *output) | ||
220 | { | ||
221 | asm(" | ||
222 | /* Output will be 0x00rrggbb with the 00 trailing so this can also be used */ | ||
223 | /* for bgr24. */ | ||
224 | movd (%0), %%mm0; /* Load y 0x00000000000000yy */ | ||
225 | movd (%1), %%mm1; /* Load u 0x00000000000000cr */ | ||
226 | movq %%mm0, %%mm3; /* Copy y to temp */ | ||
227 | psllq $16, %%mm1; /* Shift u 0x0000000000cr0000 */ | ||
228 | movd (%2), %%mm2; /* Load v 0x00000000000000cb */ | ||
229 | psllq $16, %%mm3; /* Shift y */ | ||
230 | movq %%mm1, %%mm4; /* Copy u to temp */ | ||
231 | por %%mm3, %%mm0; /* Overlay new y byte 0x0000000000yy00yy */ | ||
232 | psllq $16, %%mm4; /* Shift u */ | ||
233 | movq %%mm2, %%mm5; /* Copy v to temp */ | ||
234 | psllq $16, %%mm3; /* Shift y */ | ||
235 | por %%mm4, %%mm1; /* Overlay new u byte 0x000000cr00cr0000 */ | ||
236 | psllq $16, %%mm5; /* Shift v */ | ||
237 | por %%mm3, %%mm0; /* Overlay new y byte 0x000000yy00yy00yy */ | ||
238 | por %%mm5, %%mm2; /* Overlay new v byte 0x0000000000cb00cb */ | ||
239 | |||
240 | /* mm0: 0x000000yy00yy00yy mm1: 0x000000uu00uu0000 mm2: 0x0000000000vv00vv */ | ||
241 | psubw mpeg3_MMX_U_80, %%mm1; /* Subtract 128 from u 0x000000uu00uu0000 */ | ||
242 | pmullw mpeg3_MMX_U_COEF, %%mm1; /* Multiply u coeffs 0x0000uuuuuuuu0000 */ | ||
243 | psllw $6, %%mm0; /* Shift y coeffs 0x0000yyy0yyy0yyy0 */ | ||
244 | psubw mpeg3_MMX_V_80, %%mm2; /* Subtract 128 from v 0x0000000000cb00cb */ | ||
245 | pmullw mpeg3_MMX_V_COEF, %%mm2; /* Multiply v coeffs 0x0000crcrcrcrcrcr */ | ||
246 | |||
247 | /* mm0: 0x000000yy00yy00yy mm1: 0x0000uuuuuuuu0000 mm2: 0x00000000vvvvvvvv */ | ||
248 | paddsw %%mm1, %%mm0; /* Add u to result */ | ||
249 | paddsw %%mm2, %%mm0; /* Add v to result 0x0000rrrrggggbbbb */ | ||
250 | psraw $6, %%mm0; /* Demote precision */ | ||
251 | packuswb %%mm0, %%mm0; /* Pack into ARGB 0x0000000000rrggbb */ | ||
252 | movd %%mm0, (%3); /* Store output */ | ||
253 | " | ||
254 | : | ||
255 | : "r" (&y), "r" (&u), "r" (&v), "r" (output)); | ||
256 | } | ||
257 | |||
258 | inline void mpeg3_601_bgra32_mmx(unsigned long y, | ||
259 | unsigned long u, | ||
260 | unsigned long v, | ||
261 | unsigned long *output) | ||
262 | { | ||
263 | asm(" | ||
264 | /* Output will be 0x00rrggbb with the 00 trailing so this can also be used */ | ||
265 | /* for bgr24. */ | ||
266 | movd (%0), %%mm0; /* Load y 0x00000000000000yy */ | ||
267 | psubsw mpeg3_MMX_601_Y_DIFF, %%mm0; /* Subtract 16 from y */ | ||
268 | movd (%1), %%mm1; /* Load u 0x00000000000000cr */ | ||
269 | movq %%mm0, %%mm3; /* Copy y to temp */ | ||
270 | psllq $16, %%mm1; /* Shift u 0x0000000000cr0000 */ | ||
271 | movd (%2), %%mm2; /* Load v 0x00000000000000cb */ | ||
272 | psllq $16, %%mm3; /* Shift y */ | ||
273 | movq %%mm1, %%mm4; /* Copy u to temp */ | ||
274 | por %%mm3, %%mm0; /* Overlay new y byte 0x0000000000yy00yy */ | ||
275 | psllq $16, %%mm4; /* Shift u */ | ||
276 | movq %%mm2, %%mm5; /* Copy v to temp */ | ||
277 | psllq $16, %%mm3; /* Shift y */ | ||
278 | por %%mm4, %%mm1; /* Overlay new u byte 0x000000cr00cr0000 */ | ||
279 | psllq $16, %%mm5; /* Shift v */ | ||
280 | por %%mm3, %%mm0; /* Overlay new y byte 0x000000yy00yy00yy */ | ||
281 | por %%mm5, %%mm2; /* Overlay new v byte 0x0000000000cb00cb */ | ||
282 | |||
283 | /* mm0: 0x000000yy00yy00yy mm1: 0x000000uu00uu0000 mm2: 0x0000000000vv00vv */ | ||
284 | pmullw mpeg3_MMX_601_Y_COEF, %%mm0; /* Scale and shift y coeffs */ | ||
285 | psubw mpeg3_MMX_U_80, %%mm1; /* Subtract 128 from u 0x000000uu00uu0000 */ | ||
286 | pmullw mpeg3_MMX_U_COEF, %%mm1; /* Multiply u coeffs 0x0000uuuuuuuu0000 */ | ||
287 | psubw mpeg3_MMX_V_80, %%mm2; /* Subtract 128 from v 0x0000000000cb00cb */ | ||
288 | pmullw mpeg3_MMX_V_COEF, %%mm2; /* Multiply v coeffs 0x0000crcrcrcrcrcr */ | ||
289 | |||
290 | /* mm0: 0x000000yy00yy00yy mm1: 0x0000uuuuuuuu0000 mm2: 0x00000000vvvvvvvv */ | ||
291 | paddsw %%mm1, %%mm0; /* Add u to result */ | ||
292 | paddsw %%mm2, %%mm0; /* Add v to result 0x0000rrrrggggbbbb */ | ||
293 | psraw $6, %%mm0; /* Demote precision */ | ||
294 | packuswb %%mm0, %%mm0; /* Pack into ARGB 0x0000000000rrggbb */ | ||
295 | movd %%mm0, (%3); /* Store output */ | ||
296 | " | ||
297 | : | ||
298 | : "r" (&y), "r" (&u), "r" (&v), "r" (output)); | ||
299 | } | ||
300 | |||
301 | static unsigned LONGLONG mpeg3_MMX_U_80_RGB = 0x0000000000800080LL; | ||
302 | static unsigned LONGLONG mpeg3_MMX_V_80_RGB = 0x0000008000800000LL; | ||
303 | static LONGLONG mpeg3_MMX_U_COEF_RGB = 0x00000000ffd30058LL; | ||
304 | static LONGLONG mpeg3_MMX_V_COEF_RGB = 0x0000006fffea0000LL; | ||
305 | |||
306 | inline void mpeg3_rgba32_mmx(unsigned long y, | ||
307 | unsigned long u, | ||
308 | unsigned long v, | ||
309 | unsigned long *output) | ||
310 | { | ||
311 | asm(" | ||
312 | /* Output will be 0x00bbggrr with the 00 trailing so this can also be used */ | ||
313 | /* for rgb24. */ | ||
314 | movd (%0), %%mm0; /* Load y 0x00000000000000yy */ | ||
315 | movd (%1), %%mm1; /* Load v 0x00000000000000vv */ | ||
316 | movq %%mm0, %%mm3; /* Copy y to temp */ | ||
317 | psllq $16, %%mm1; /* Shift v 0x0000000000vv0000 */ | ||
318 | movd (%2), %%mm2; /* Load u 0x00000000000000uu */ | ||
319 | psllq $16, %%mm3; /* Shift y */ | ||
320 | movq %%mm1, %%mm4; /* Copy v to temp */ | ||
321 | por %%mm3, %%mm0; /* Overlay new y byte 0x0000000000yy00yy */ | ||
322 | psllq $16, %%mm4; /* Shift v */ | ||
323 | movq %%mm2, %%mm5; /* Copy u to temp */ | ||
324 | psllq $16, %%mm3; /* Shift y */ | ||
325 | por %%mm4, %%mm1; /* Overlay new v byte 0x000000vv00vv0000 */ | ||
326 | psllq $16, %%mm5; /* Shift u */ | ||
327 | por %%mm3, %%mm0; /* Overlay new y byte 0x000000yy00yy00yy */ | ||
328 | por %%mm5, %%mm2; /* Overlay new u byte 0x0000000000uu00uu */ | ||
329 | |||
330 | /* mm0: 0x000000yy00yy00yy mm1: 0x000000vv00vv0000 mm2: 0x0000000000uu00uu */ | ||
331 | psubw mpeg3_MMX_V_80_RGB, %%mm1; /* Subtract 128 from v 0x000000vv00vv0000 */ | ||
332 | pmullw mpeg3_MMX_V_COEF_RGB, %%mm1; /* Multiply v coeffs 0x0000vvvvvvvv0000 */ | ||
333 | psllw $6, %%mm0; /* Shift y coeffs 0x0000yyy0yyy0yyy0 */ | ||
334 | psubw mpeg3_MMX_U_80_RGB, %%mm2; /* Subtract 128 from u 0x0000000000uu00uu */ | ||
335 | pmullw mpeg3_MMX_U_COEF_RGB, %%mm2; /* Multiply u coeffs 0x0000uuuuuuuuuuuu */ | ||
336 | |||
337 | /* mm0: 0x000000yy00yy00yy mm1: 0x0000vvvvvvvv0000 mm2: 0x00000000uuuuuuuu */ | ||
338 | paddsw %%mm1, %%mm0; /* Add v to result */ | ||
339 | paddsw %%mm2, %%mm0; /* Add u to result 0x0000bbbbggggrrrr */ | ||
340 | psraw $6, %%mm0; /* Demote precision */ | ||
341 | packuswb %%mm0, %%mm0; /* Pack into RGBA 0x0000000000bbggrr */ | ||
342 | movd %%mm0, (%3); /* Store output */ | ||
343 | " | ||
344 | : | ||
345 | : "r" (&y), "r" (&v), "r" (&u), "r" (output)); | ||
346 | } | ||
347 | |||
348 | inline void mpeg3_601_rgba32_mmx(unsigned long y, | ||
349 | unsigned long u, | ||
350 | unsigned long v, | ||
351 | unsigned long *output) | ||
352 | { | ||
353 | asm(" | ||
354 | /* Output will be 0x00bbggrr with the 00 trailing so this can also be used */ | ||
355 | /* for rgb24. */ | ||
356 | movd (%0), %%mm0; /* Load y 0x00000000000000yy */ | ||
357 | psubsw mpeg3_MMX_601_Y_DIFF, %%mm0; /* Subtract 16 from y */ | ||
358 | movd (%1), %%mm1; /* Load v 0x00000000000000vv */ | ||
359 | movq %%mm0, %%mm3; /* Copy y to temp */ | ||
360 | psllq $16, %%mm1; /* Shift v 0x0000000000vv0000 */ | ||
361 | movd (%2), %%mm2; /* Load u 0x00000000000000uu */ | ||
362 | psllq $16, %%mm3; /* Shift y */ | ||
363 | movq %%mm1, %%mm4; /* Copy v to temp */ | ||
364 | por %%mm3, %%mm0; /* Overlay new y byte 0x0000000000yy00yy */ | ||
365 | psllq $16, %%mm4; /* Shift v */ | ||
366 | movq %%mm2, %%mm5; /* Copy u to temp */ | ||
367 | psllq $16, %%mm3; /* Shift y */ | ||
368 | por %%mm4, %%mm1; /* Overlay new v byte 0x000000vv00vv0000 */ | ||
369 | psllq $16, %%mm5; /* Shift u */ | ||
370 | por %%mm3, %%mm0; /* Overlay new y byte 0x000000yy00yy00yy */ | ||
371 | por %%mm5, %%mm2; /* Overlay new u byte 0x0000000000uu00uu */ | ||
372 | |||
373 | /* mm0: 0x000000yy00yy00yy mm1: 0x000000vv00vv0000 mm2: 0x0000000000uu00uu */ | ||
374 | pmullw mpeg3_MMX_601_Y_COEF, %%mm0; /* Scale y coeffs */ | ||
375 | psubw mpeg3_MMX_V_80_RGB, %%mm1; /* Subtract 128 from v 0x000000vv00vv0000 */ | ||
376 | pmullw mpeg3_MMX_V_COEF_RGB, %%mm1; /* Multiply v coeffs 0x0000vvvvvvvv0000 */ | ||
377 | psubw mpeg3_MMX_U_80_RGB, %%mm2; /* Subtract 128 from u 0x0000000000uu00uu */ | ||
378 | pmullw mpeg3_MMX_U_COEF_RGB, %%mm2; /* Multiply u coeffs 0x0000uuuuuuuuuuuu */ | ||
379 | |||
380 | /* mm0: 0x000000yy00yy00yy mm1: 0x0000vvvvvvvv0000 mm2: 0x00000000uuuuuuuu */ | ||
381 | paddsw %%mm1, %%mm0; /* Add v to result */ | ||
382 | paddsw %%mm2, %%mm0; /* Add u to result 0x0000bbbbggggrrrr */ | ||
383 | psraw $6, %%mm0; /* Demote precision */ | ||
384 | packuswb %%mm0, %%mm0; /* Pack into RGBA 0x0000000000bbggrr */ | ||
385 | movd %%mm0, (%3); /* Store output */ | ||
386 | " | ||
387 | : | ||
388 | : "r" (&y), "r" (&v), "r" (&u), "r" (output)); | ||
389 | } | ||
390 | |||
391 | #endif | ||
392 | |||
393 | #define DITHER_ROW_HEAD \ | ||
394 | for(h = 0; h < video->out_h; h++) \ | ||
395 | { \ | ||
396 | y_in = &src[0][(video->y_table[h] + video->in_y) * video->coded_picture_width] + video->in_x; \ | ||
397 | cb_in = &src[1][((video->y_table[h] + video->in_y) >> 1) * video->chrom_width] + (video->in_x >> 2); \ | ||
398 | cr_in = &src[2][((video->y_table[h] + video->in_y) >> 1) * video->chrom_width] + (video->in_x >> 1); \ | ||
399 | data = output_rows[h]; | ||
400 | |||
401 | #define DITHER_ROW_TAIL \ | ||
402 | } | ||
403 | |||
404 | #define DITHER_SCALE_HEAD \ | ||
405 | for(w = 0; w < video->out_w; w++) \ | ||
406 | { \ | ||
407 | uv_subscript = video->x_table[w] / 2; \ | ||
408 | y_l = y_in[video->x_table[w]]; \ | ||
409 | y_l <<= 16; \ | ||
410 | r_l = (y_l + video->cr_to_r[cr_in[uv_subscript]]) >> 16; \ | ||
411 | g_l = (y_l + video->cr_to_g[cr_in[uv_subscript]] + video->cb_to_g[cb_in[uv_subscript]]) >> 16; \ | ||
412 | b_l = (y_l + video->cb_to_b[cb_in[uv_subscript]]) >> 16; | ||
413 | |||
414 | #define DITHER_SCALE_601_HEAD \ | ||
415 | for(w = 0; w < video->out_w; w++) \ | ||
416 | { \ | ||
417 | uv_subscript = video->x_table[w] / 2; \ | ||
418 | y_l = mpeg3_601_to_rgb[y_in[video->x_table[w]]]; \ | ||
419 | y_l <<= 16; \ | ||
420 | r_l = (y_l + video->cr_to_r[cr_in[uv_subscript]]) >> 16; \ | ||
421 | g_l = (y_l + video->cr_to_g[cr_in[uv_subscript]] + video->cb_to_g[cb_in[uv_subscript]]) >> 16; \ | ||
422 | b_l = (y_l + video->cb_to_b[cb_in[uv_subscript]]) >> 16; | ||
423 | |||
424 | #define DITHER_SCALE_TAIL \ | ||
425 | } | ||
426 | |||
427 | #define DITHER_MMX_SCALE_HEAD \ | ||
428 | for(w = 0; w < video->out_w; w++) \ | ||
429 | { \ | ||
430 | uv_subscript = video->x_table[w] / 2; | ||
431 | |||
432 | #define DITHER_MMX_SCALE_TAIL \ | ||
433 | data += step; \ | ||
434 | } | ||
435 | |||
436 | #define DITHER_MMX_HEAD \ | ||
437 | for(w = 0; w < video->out_w; w += 2) \ | ||
438 | { | ||
439 | |||
440 | #define DITHER_MMX_TAIL \ | ||
441 | data += step; \ | ||
442 | cr_in++; \ | ||
443 | cb_in++; \ | ||
444 | } | ||
445 | |||
446 | #define DITHER_HEAD \ | ||
447 | for(w = 0; w < video->horizontal_size; w++) \ | ||
448 | { \ | ||
449 | y_l = *y_in++; \ | ||
450 | y_l <<= 16; \ | ||
451 | r_l = (y_l + video->cr_to_r[*cr_in]) >> 16; \ | ||
452 | g_l = (y_l + video->cr_to_g[*cr_in] + video->cb_to_g[*cb_in]) >> 16; \ | ||
453 | b_l = (y_l + video->cb_to_b[*cb_in]) >> 16; | ||
454 | |||
455 | #define DITHER_601_HEAD \ | ||
456 | for(w = 0; w < video->horizontal_size; w++) \ | ||
457 | { \ | ||
458 | y_l = mpeg3_601_to_rgb[*y_in++]; \ | ||
459 | y_l <<= 16; \ | ||
460 | r_l = (y_l + video->cr_to_r[*cr_in]) >> 16; \ | ||
461 | g_l = (y_l + video->cr_to_g[*cr_in] + video->cb_to_g[*cb_in]) >> 16; \ | ||
462 | b_l = (y_l + video->cb_to_b[*cb_in]) >> 16; | ||
463 | |||
464 | #define DITHER_TAIL \ | ||
465 | if(w & 1) \ | ||
466 | { \ | ||
467 | cr_in++; \ | ||
468 | cb_in++; \ | ||
469 | } \ | ||
470 | } | ||
471 | |||
472 | |||
473 | #define STORE_PIXEL_BGR888 \ | ||
474 | *data++ = CLIP(b_l); \ | ||
475 | *data++ = CLIP(g_l); \ | ||
476 | *data++ = CLIP(r_l); | ||
477 | |||
478 | #define STORE_PIXEL_BGRA8888 \ | ||
479 | *data++ = CLIP(b_l); \ | ||
480 | *data++ = CLIP(g_l); \ | ||
481 | *data++ = CLIP(r_l); \ | ||
482 | *data++ = 0; | ||
483 | |||
484 | #define STORE_PIXEL_RGB565 \ | ||
485 | *((unsigned short*)data)++ = \ | ||
486 | ((CLIP(r_l) & 0xf8) << 8) | \ | ||
487 | ((CLIP(g_l) & 0xfc) << 3) | \ | ||
488 | ((CLIP(b_l) & 0xf8) >> 3); | ||
489 | |||
490 | #define STORE_PIXEL_RGB888 \ | ||
491 | *data++ = CLIP(r_l); \ | ||
492 | *data++ = CLIP(g_l); \ | ||
493 | *data++ = CLIP(b_l); | ||
494 | |||
495 | #define STORE_PIXEL_RGBA8888 \ | ||
496 | *data++ = CLIP(r_l); \ | ||
497 | *data++ = CLIP(g_l); \ | ||
498 | *data++ = CLIP(b_l); \ | ||
499 | *data++ = 0; | ||
500 | |||
501 | #define STORE_PIXEL_RGBA16161616 \ | ||
502 | *data_s++ = CLIP(r_l); \ | ||
503 | *data_s++ = CLIP(g_l); \ | ||
504 | *data_s++ = CLIP(b_l); \ | ||
505 | *data_s++ = 0; | ||
506 | |||
507 | |||
508 | |||
509 | /* Only good for YUV 4:2:0 */ | ||
510 | int mpeg3video_ditherframe(mpeg3video_t *video, unsigned char **src, unsigned char **output_rows) | ||
511 | { | ||
512 | int h = 0; | ||
513 | register unsigned char *y_in, *cb_in, *cr_in; | ||
514 | long y_l, r_l, b_l, g_l; | ||
515 | register unsigned char *data; | ||
516 | register int uv_subscript, step, w = -1; | ||
517 | |||
518 | #ifdef HAVE_MMX | ||
519 | /* =================================== MMX ===================================== */ | ||
520 | if(video->have_mmx && | ||
521 | video->out_w == video->horizontal_size && | ||
522 | video->out_h == video->vertical_size && | ||
523 | video->in_w == video->out_w && | ||
524 | video->in_h == video->out_h && | ||
525 | video->in_x == 0 && | ||
526 | video->in_y == 0 && | ||
527 | (video->color_model == MPEG3_RGB565 || video->color_model == MPEG3_601_RGB565)) | ||
528 | { | ||
529 | /* Unscaled 16 bit */ | ||
530 | mpeg3video_rgb16_mmx(src[0], | ||
531 | src[2], | ||
532 | src[1], | ||
533 | output_rows[0], | ||
534 | video->out_h, | ||
535 | video->out_w, | ||
536 | (output_rows[1] - output_rows[0]) / 2 - video->out_w); | ||
537 | } | ||
538 | else | ||
539 | if(video->have_mmx && | ||
540 | (video->color_model == MPEG3_BGRA8888 || | ||
541 | video->color_model == MPEG3_BGR888 || | ||
542 | /* video->color_model == MPEG3_RGB888 || */ | ||
543 | video->color_model == MPEG3_RGBA8888 || | ||
544 | video->color_model == MPEG3_601_BGR888 || | ||
545 | video->color_model == MPEG3_601_BGRA8888 || | ||
546 | video->color_model == MPEG3_601_RGB888 || | ||
547 | video->color_model == MPEG3_601_RGBA8888)) | ||
548 | { | ||
549 | /* Original MMX */ | ||
550 | if(video->color_model == MPEG3_BGRA8888 || | ||
551 | video->color_model == MPEG3_RGBA8888 || | ||
552 | video->color_model == MPEG3_601_BGRA8888 || | ||
553 | video->color_model == MPEG3_601_RGBA8888) step = 4; | ||
554 | else | ||
555 | if(video->color_model == MPEG3_BGR888 || | ||
556 | video->color_model == MPEG3_RGB888 || | ||
557 | video->color_model == MPEG3_601_BGR888 || | ||
558 | video->color_model == MPEG3_601_RGB888) step = 3; | ||
559 | |||
560 | DITHER_ROW_HEAD | ||
561 | /* Transfer row with scaling */ | ||
562 | if(video->out_w != video->horizontal_size) | ||
563 | { | ||
564 | switch(video->color_model) | ||
565 | { | ||
566 | case MPEG3_BGRA8888: | ||
567 | case MPEG3_BGR888: | ||
568 | DITHER_MMX_SCALE_HEAD | ||
569 | mpeg3_bgra32_mmx(y_in[video->x_table[w]], | ||
570 | cr_in[uv_subscript], | ||
571 | cb_in[uv_subscript], | ||
572 | (unsigned long*)data); | ||
573 | DITHER_MMX_SCALE_TAIL | ||
574 | break; | ||
575 | |||
576 | case MPEG3_601_BGRA8888: | ||
577 | case MPEG3_601_BGR888: | ||
578 | DITHER_MMX_SCALE_HEAD | ||
579 | mpeg3_601_bgra32_mmx(y_in[video->x_table[w]], | ||
580 | cr_in[uv_subscript], | ||
581 | cb_in[uv_subscript], | ||
582 | (unsigned long*)data); | ||
583 | DITHER_MMX_SCALE_TAIL | ||
584 | break; | ||
585 | |||
586 | case MPEG3_RGBA8888: | ||
587 | case MPEG3_RGB888: | ||
588 | DITHER_MMX_SCALE_HEAD | ||
589 | mpeg3_rgba32_mmx(y_in[video->x_table[w]], | ||
590 | cr_in[uv_subscript], | ||
591 | cb_in[uv_subscript], | ||
592 | (unsigned long*)data); | ||
593 | DITHER_MMX_SCALE_TAIL | ||
594 | break; | ||
595 | |||
596 | case MPEG3_601_RGBA8888: | ||
597 | case MPEG3_601_RGB888: | ||
598 | DITHER_MMX_SCALE_HEAD | ||
599 | mpeg3_601_rgba32_mmx(y_in[video->x_table[w]], | ||
600 | cr_in[uv_subscript], | ||
601 | cb_in[uv_subscript], | ||
602 | (unsigned long*)data); | ||
603 | DITHER_MMX_SCALE_TAIL | ||
604 | break; | ||
605 | } | ||
606 | } | ||
607 | else | ||
608 | /* Transfer row unscaled */ | ||
609 | { | ||
610 | switch(video->color_model) | ||
611 | { | ||
612 | /* MMX byte swap 24 and 32 bit */ | ||
613 | case MPEG3_BGRA8888: | ||
614 | case MPEG3_BGR888: | ||
615 | DITHER_MMX_HEAD | ||
616 | mpeg3_bgra32_mmx(*y_in++, | ||
617 | *cr_in, | ||
618 | *cb_in, | ||
619 | (unsigned long*)data); | ||
620 | data += step; | ||
621 | mpeg3_bgra32_mmx(*y_in++, | ||
622 | *cr_in, | ||
623 | *cb_in, | ||
624 | (unsigned long*)data); | ||
625 | DITHER_MMX_TAIL | ||
626 | break; | ||
627 | |||
628 | /* MMX 601 byte swap 24 and 32 bit */ | ||
629 | case MPEG3_601_BGRA8888: | ||
630 | case MPEG3_601_BGR888: | ||
631 | DITHER_MMX_HEAD | ||
632 | mpeg3_601_bgra32_mmx(*y_in++, | ||
633 | *cr_in, | ||
634 | *cb_in, | ||
635 | (unsigned long*)data); | ||
636 | data += step; | ||
637 | mpeg3_601_bgra32_mmx(*y_in++, | ||
638 | *cr_in, | ||
639 | *cb_in, | ||
640 | (unsigned long*)data); | ||
641 | DITHER_MMX_TAIL | ||
642 | break; | ||
643 | |||
644 | /* MMX 24 and 32 bit no byte swap */ | ||
645 | case MPEG3_RGBA8888: | ||
646 | case MPEG3_RGB888: | ||
647 | DITHER_MMX_HEAD | ||
648 | mpeg3_rgba32_mmx(*y_in++, | ||
649 | *cr_in, | ||
650 | *cb_in, | ||
651 | (unsigned long*)data); | ||
652 | data += step; | ||
653 | mpeg3_rgba32_mmx(*y_in++, | ||
654 | *cr_in, | ||
655 | *cb_in, | ||
656 | (unsigned long*)data); | ||
657 | DITHER_MMX_TAIL | ||
658 | break; | ||
659 | |||
660 | /* MMX 601 24 and 32 bit no byte swap */ | ||
661 | case MPEG3_601_RGBA8888: | ||
662 | case MPEG3_601_RGB888: | ||
663 | DITHER_MMX_HEAD | ||
664 | mpeg3_601_rgba32_mmx(*y_in++, | ||
665 | *cr_in, | ||
666 | *cb_in, | ||
667 | (unsigned long*)data); | ||
668 | data += step; | ||
669 | mpeg3_601_rgba32_mmx(*y_in++, | ||
670 | *cr_in, | ||
671 | *cb_in, | ||
672 | (unsigned long*)data); | ||
673 | DITHER_MMX_TAIL | ||
674 | break; | ||
675 | } | ||
676 | } | ||
677 | DITHER_ROW_TAIL | ||
678 | } | ||
679 | else | ||
680 | #endif | ||
681 | /* ================================== NO MMX ==================================== */ | ||
682 | { | ||
683 | DITHER_ROW_HEAD | ||
684 | /* Transfer row with scaling */ | ||
685 | if(video->out_w != video->horizontal_size) | ||
686 | { | ||
687 | switch(video->color_model) | ||
688 | { | ||
689 | case MPEG3_BGR888: | ||
690 | DITHER_SCALE_HEAD | ||
691 | STORE_PIXEL_BGR888 | ||
692 | DITHER_SCALE_TAIL | ||
693 | break; | ||
694 | case MPEG3_BGRA8888: | ||
695 | DITHER_SCALE_HEAD | ||
696 | STORE_PIXEL_BGRA8888 | ||
697 | DITHER_SCALE_TAIL | ||
698 | break; | ||
699 | case MPEG3_RGB565: | ||
700 | DITHER_SCALE_HEAD | ||
701 | STORE_PIXEL_RGB565 | ||
702 | DITHER_SCALE_TAIL | ||
703 | break; | ||
704 | case MPEG3_RGB888: | ||
705 | DITHER_SCALE_HEAD | ||
706 | STORE_PIXEL_RGB888 | ||
707 | DITHER_SCALE_TAIL | ||
708 | break; | ||
709 | case MPEG3_RGBA8888: | ||
710 | DITHER_SCALE_HEAD | ||
711 | STORE_PIXEL_RGBA8888 | ||
712 | DITHER_SCALE_TAIL | ||
713 | break; | ||
714 | case MPEG3_601_BGR888: | ||
715 | DITHER_SCALE_601_HEAD | ||
716 | STORE_PIXEL_BGR888 | ||
717 | DITHER_SCALE_TAIL | ||
718 | break; | ||
719 | case MPEG3_601_BGRA8888: | ||
720 | DITHER_SCALE_601_HEAD | ||
721 | STORE_PIXEL_BGRA8888 | ||
722 | DITHER_SCALE_TAIL | ||
723 | break; | ||
724 | case MPEG3_601_RGB565: | ||
725 | DITHER_SCALE_601_HEAD | ||
726 | STORE_PIXEL_RGB565 | ||
727 | DITHER_SCALE_TAIL | ||
728 | break; | ||
729 | case MPEG3_601_RGB888: | ||
730 | DITHER_SCALE_601_HEAD | ||
731 | STORE_PIXEL_RGB888 | ||
732 | DITHER_SCALE_TAIL | ||
733 | break; | ||
734 | case MPEG3_601_RGBA8888: | ||
735 | DITHER_SCALE_601_HEAD | ||
736 | STORE_PIXEL_RGBA8888 | ||
737 | DITHER_SCALE_TAIL | ||
738 | break; | ||
739 | case MPEG3_RGBA16161616: | ||
740 | { | ||
741 | register unsigned short *data_s = (unsigned short*)data; | ||
742 | DITHER_SCALE_HEAD | ||
743 | STORE_PIXEL_RGBA16161616 | ||
744 | DITHER_SCALE_TAIL | ||
745 | } | ||
746 | break; | ||
747 | } | ||
748 | } | ||
749 | else | ||
750 | { | ||
751 | /* Transfer row unscaled */ | ||
752 | switch(video->color_model) | ||
753 | { | ||
754 | case MPEG3_BGR888: | ||
755 | DITHER_HEAD | ||
756 | STORE_PIXEL_BGR888 | ||
757 | DITHER_TAIL | ||
758 | break; | ||
759 | case MPEG3_BGRA8888: | ||
760 | DITHER_HEAD | ||
761 | STORE_PIXEL_BGRA8888 | ||
762 | DITHER_TAIL | ||
763 | break; | ||
764 | case MPEG3_RGB565: | ||
765 | DITHER_HEAD | ||
766 | STORE_PIXEL_RGB565 | ||
767 | DITHER_TAIL | ||
768 | break; | ||
769 | case MPEG3_RGB888: | ||
770 | DITHER_HEAD | ||
771 | STORE_PIXEL_RGB888 | ||
772 | DITHER_TAIL | ||
773 | break; | ||
774 | case MPEG3_RGBA8888: | ||
775 | DITHER_HEAD | ||
776 | STORE_PIXEL_RGBA8888 | ||
777 | DITHER_TAIL | ||
778 | break; | ||
779 | case MPEG3_601_BGR888: | ||
780 | DITHER_601_HEAD | ||
781 | STORE_PIXEL_BGR888 | ||
782 | DITHER_TAIL | ||
783 | break; | ||
784 | case MPEG3_601_BGRA8888: | ||
785 | DITHER_601_HEAD | ||
786 | STORE_PIXEL_RGB565 | ||
787 | DITHER_TAIL | ||
788 | break; | ||
789 | case MPEG3_601_RGB565: | ||
790 | DITHER_601_HEAD | ||
791 | STORE_PIXEL_RGB565 | ||
792 | DITHER_TAIL | ||
793 | break; | ||
794 | case MPEG3_601_RGB888: | ||
795 | DITHER_601_HEAD | ||
796 | STORE_PIXEL_RGB888 | ||
797 | DITHER_TAIL | ||
798 | break; | ||
799 | case MPEG3_601_RGBA8888: | ||
800 | DITHER_601_HEAD | ||
801 | STORE_PIXEL_RGBA8888 | ||
802 | DITHER_TAIL | ||
803 | break; | ||
804 | case MPEG3_RGBA16161616: | ||
805 | { | ||
806 | register unsigned short *data_s = (unsigned short*)data; | ||
807 | DITHER_HEAD | ||
808 | STORE_PIXEL_RGBA16161616 | ||
809 | DITHER_TAIL | ||
810 | } | ||
811 | break; | ||
812 | } | ||
813 | } | ||
814 | DITHER_ROW_TAIL | ||
815 | } /* End of non-MMX */ | ||
816 | |||
817 | #ifdef HAVE_MMX | ||
818 | if(video->have_mmx) | ||
819 | __asm__ __volatile__ ("emms"); | ||
820 | #endif | ||
821 | return 0; | ||
822 | } | ||
823 | |||
824 | int mpeg3video_ditherframe444(mpeg3video_t *video, unsigned char *src[]) | ||
825 | { | ||
826 | return 0; | ||
827 | } | ||
828 | |||
829 | int mpeg3video_dithertop(mpeg3video_t *video, unsigned char *src[]) | ||
830 | { | ||
831 | return mpeg3video_ditherframe(video, src, video->output_rows); | ||
832 | } | ||
833 | |||
834 | int mpeg3video_dithertop444(mpeg3video_t *video, unsigned char *src[]) | ||
835 | { | ||
836 | return 0; | ||
837 | } | ||
838 | |||
839 | int mpeg3video_ditherbot(mpeg3video_t *video, unsigned char *src[]) | ||
840 | { | ||
841 | return 0; | ||
842 | } | ||
843 | |||
844 | int mpeg3video_ditherbot444(mpeg3video_t *video, unsigned char *src[]) | ||
845 | { | ||
846 | return 0; | ||
847 | } | ||
848 | |||
849 | void memcpy_fast(unsigned char *output, unsigned char *input, long len) | ||
850 | { | ||
851 | int i, len2; | ||
852 | /* 8 byte alignment */ | ||
853 | /* | ||
854 | * if(!((long)input & 0x7)) | ||
855 | * { | ||
856 | * len2 = len >> 4; | ||
857 | * for(i = 0; i < len2; ) | ||
858 | * { | ||
859 | * ((MPEG3_INT64*)output)[i] = ((MPEG3_INT64*)input)[i]; | ||
860 | * i++; | ||
861 | * ((MPEG3_INT64*)output)[i] = ((MPEG3_INT64*)input)[i]; | ||
862 | * i++; | ||
863 | * } | ||
864 | * | ||
865 | * for(i *= 16; i < len; i++) | ||
866 | * { | ||
867 | * output[i] = input[i]; | ||
868 | * } | ||
869 | * } | ||
870 | * else | ||
871 | */ | ||
872 | memcpy(output, input, len); | ||
873 | } | ||
874 | |||
875 | int mpeg3video_init_output() | ||
876 | { | ||
877 | int i, value; | ||
878 | for(i = 0; i < 256; i++) | ||
879 | { | ||
880 | value = (int)(1.1644 * i - 255 * 0.0627 + 0.5); | ||
881 | if(value < 0) value = 0; | ||
882 | else | ||
883 | if(value > 255) value = 255; | ||
884 | mpeg3_601_to_rgb[i] = value; | ||
885 | } | ||
886 | return 0; | ||
887 | } | ||
888 | |||
889 | int mpeg3video_present_frame(mpeg3video_t *video) | ||
890 | { | ||
891 | int i, j, k, l; | ||
892 | unsigned char **src = video->output_src; | ||
893 | |||
894 | /* Copy YUV buffers */ | ||
895 | if(video->want_yvu) | ||
896 | { | ||
897 | long size[2]; | ||
898 | long offset[2]; | ||
899 | |||
900 | /* Drop a frame */ | ||
901 | if(!video->y_output) return 0; | ||
902 | |||
903 | /* Copy a frame */ | ||
904 | if(video->in_x == 0 && | ||
905 | video->in_w >= video->coded_picture_width) | ||
906 | { | ||
907 | size[0] = video->coded_picture_width * video->in_h; | ||
908 | size[1] = video->chrom_width * (int)((float)video->in_h / 2 + 0.5); | ||
909 | offset[0] = video->coded_picture_width * video->in_y; | ||
910 | offset[1] = video->chrom_width * (int)((float)video->in_y / 2 + 0.5); | ||
911 | |||
912 | /* | ||
913 | * if(video->in_y > 0) | ||
914 | * { | ||
915 | * offset[1] += video->chrom_width / 2; | ||
916 | * size[1] += video->chrom_width / 2; | ||
917 | * } | ||
918 | */ | ||
919 | |||
920 | memcpy(video->y_output, src[0] + offset[0], size[0]); | ||
921 | memcpy(video->u_output, src[1] + offset[1], size[1]); | ||
922 | memcpy(video->v_output, src[2] + offset[1], size[1]); | ||
923 | } | ||
924 | else | ||
925 | { | ||
926 | for(i = 0, j = video->in_y; i < video->in_h; i++, j++) | ||
927 | { | ||
928 | memcpy(video->y_output + i * video->in_w, | ||
929 | src[0] + j * video->coded_picture_width + video->in_x, | ||
930 | video->in_w); | ||
931 | memcpy(video->u_output + i * video->in_w / 4, | ||
932 | src[1] + j * video->chrom_width / 2 + video->in_x / 4, | ||
933 | video->in_w / 4); | ||
934 | memcpy(video->v_output + i * video->in_w / 4, | ||
935 | src[2] + j * video->chrom_width / 2 + video->in_x / 4, | ||
936 | video->in_w / 4); | ||
937 | } | ||
938 | } | ||
939 | |||
940 | return 0; | ||
941 | } | ||
942 | |||
943 | /* Want RGB buffer */ | ||
944 | /* Copy the frame to the output with YUV to RGB conversion */ | ||
945 | if(video->prog_seq) | ||
946 | { | ||
947 | if(video->chroma_format != CHROMA444) | ||
948 | { | ||
949 | mpeg3video_ditherframe(video, src, video->output_rows); | ||
950 | } | ||
951 | else | ||
952 | mpeg3video_ditherframe444(video, src); | ||
953 | } | ||
954 | else | ||
955 | { | ||
956 | if((video->pict_struct == FRAME_PICTURE && video->topfirst) || | ||
957 | video->pict_struct == BOTTOM_FIELD) | ||
958 | { | ||
959 | /* top field first */ | ||
960 | if(video->chroma_format != CHROMA444) | ||
961 | { | ||
962 | mpeg3video_dithertop(video, src); | ||
963 | mpeg3video_ditherbot(video, src); | ||
964 | } | ||
965 | else | ||
966 | { | ||
967 | mpeg3video_dithertop444(video, src); | ||
968 | mpeg3video_ditherbot444(video, src); | ||
969 | } | ||
970 | } | ||
971 | else | ||
972 | { | ||
973 | /* bottom field first */ | ||
974 | if(video->chroma_format != CHROMA444) | ||
975 | { | ||
976 | mpeg3video_ditherbot(video, src); | ||
977 | mpeg3video_dithertop(video, src); | ||
978 | } | ||
979 | else | ||
980 | { | ||
981 | mpeg3video_ditherbot444(video, src); | ||
982 | mpeg3video_dithertop444(video, src); | ||
983 | } | ||
984 | } | ||
985 | } | ||
986 | return 0; | ||
987 | } | ||
988 | |||
989 | int mpeg3video_display_second_field(mpeg3video_t *video) | ||
990 | { | ||
991 | /* Not used */ | ||
992 | return 0; | ||
993 | } | ||