[svn] / branches / dev-api-4 / xvidcore / src / image / x86_asm / colorspace_rgb_mmx.asm Repository:
ViewVC logotype

Annotation of /branches/dev-api-4/xvidcore/src/image/x86_asm/colorspace_rgb_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1068 - (view) (download)

1 : Isibaar 1068 ;/*****************************************************************************
2 : edgomez 851 ; *
3 : Isibaar 1068 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - RGB colorspace conversions -
5 : edgomez 851 ; *
6 : Isibaar 1068 ; * Copyright(C) 2002-2003 Michael Militzer <isibaar@xvid.org>
7 :     ; * 2002-2003 Peter Ross <pross@xvid.org>
8 : edgomez 851 ; *
9 : Isibaar 1068 ; * This program is free software ; you can redistribute it and/or modify
10 :     ; * it under the terms of the GNU General Public License as published by
11 :     ; * the Free Software Foundation ; either version 2 of the License, or
12 :     ; * (at your option) any later version.
13 : edgomez 851 ; *
14 : Isibaar 1068 ; * This program is distributed in the hope that it will be useful,
15 :     ; * but WITHOUT ANY WARRANTY ; without even the implied warranty of
16 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 :     ; * GNU General Public License for more details.
18 : edgomez 851 ; *
19 : Isibaar 1068 ; * You should have received a copy of the GNU General Public License
20 :     ; * along with this program ; if not, write to the Free Software
21 :     ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 : edgomez 851 ; *
23 : Isibaar 1068 ; ****************************************************************************/
24 : edgomez 851
25 :     bits 32
26 :    
27 :     %macro cglobal 1
28 :     %ifdef PREFIX
29 :     global _%1
30 :     %define %1 _%1
31 :     %else
32 :     global %1
33 :     %endif
34 :     %endmacro
35 :    
36 :    
37 :     section .data
38 :     align 16
39 :    
40 :     ;===========================================================================
41 :     ; RGB->YV12 yuv constants
42 :     ;===========================================================================
43 :     %define Y_R 0.257
44 :     %define Y_G 0.504
45 :     %define Y_B 0.098
46 :     %define Y_ADD 16
47 :    
48 :     %define U_R 0.148
49 :     %define U_G 0.291
50 :     %define U_B 0.439
51 :     %define U_ADD 128
52 :    
53 :     %define V_R 0.439
54 :     %define V_G 0.368
55 :     %define V_B 0.071
56 :     %define V_ADD 128
57 :    
58 :     ;===========================================================================
59 :     ; RGB->YV12 multiplication matrices
60 :     ;===========================================================================
61 :     ; FIX(Y_B) FIX(Y_G) FIX(Y_R)
62 :     y_mul dw 25, 129, 66, 0
63 :     u_mul dw 112, -74, -38, 0
64 :     v_mul dw -18, -94, 112, 0
65 :    
66 :    
67 :     ;===========================================================================
68 :     ; YV12->RGB data
69 :     ;===========================================================================
70 :     %define SCALEBITS 6
71 :     Y_SUB dw 16, 16, 16, 16
72 :     U_SUB dw 128, 128, 128, 128
73 :     V_SUB dw 128, 128, 128, 128
74 :    
75 :     Y_MUL dw 74, 74, 74, 74
76 :    
77 :     UG_MUL dw 25, 25, 25, 25
78 :     VG_MUL dw 52, 52, 52, 52
79 :    
80 :     UB_MUL dw 129, 129, 129, 129
81 :     VR_MUL dw 102, 102, 102, 102
82 :    
83 : Isibaar 1068 BRIGHT db 128, 128, 128, 128, 128, 128, 128, 128
84 : edgomez 851
85 :     section .text
86 :    
87 :     %include "colorspace_mmx.inc"
88 :    
89 :    
90 :     ;------------------------------------------------------------------------------
91 :     ; BGR_TO_YV12( BYTES )
92 :     ;
93 :     ; BYTES 3=bgr(24bit), 4=bgra(32-bit)
94 :     ;
95 :     ; bytes=3/4, pixels = 2, vpixels=2
96 :     ;------------------------------------------------------------------------------
97 :     %macro BGR_TO_YV12_INIT 2
98 :     movq mm7, [y_mul]
99 :     %endmacro
100 :    
101 :    
102 :     %macro BGR_TO_YV12 2
103 :     ; y_out
104 :     pxor mm4, mm4
105 :     pxor mm5, mm5
106 :     movd mm0, [edi] ; x_ptr[0...]
107 :     movd mm2, [edi+edx] ; x_ptr[x_stride...]
108 :     punpcklbw mm0, mm4 ; [ |b |g |r ]
109 :     punpcklbw mm2, mm5 ; [ |b |g |r ]
110 :     movq mm6, mm0 ; = [ |b4|g4|r4]
111 :     paddw mm6, mm2 ; +[ |b4|g4|r4]
112 :     pmaddwd mm0, mm7 ; *= Y_MUL
113 :     pmaddwd mm2, mm7 ; *= Y_MUL
114 :     movq mm4, mm0 ; [r]
115 :     movq mm5, mm2 ; [r]
116 :     psrlq mm4, 32 ; +[g]
117 :     psrlq mm5, 32 ; +[g]
118 :     paddd mm0, mm4 ; +[b]
119 :     paddd mm2, mm5 ; +[b]
120 :    
121 :     pxor mm4, mm4
122 :     pxor mm5, mm5
123 :     movd mm1, [edi+%1] ; src[%1...]
124 :     movd mm3, [edi+edx+%1] ; src[x_stride+%1...]
125 :     punpcklbw mm1, mm4 ; [ |b |g |r ]
126 :     punpcklbw mm3, mm5 ; [ |b |g |r ]
127 :     paddw mm6, mm1 ; +[ |b4|g4|r4]
128 :     paddw mm6, mm3 ; +[ |b4|g4|r4]
129 :     pmaddwd mm1, mm7 ; *= Y_MUL
130 :     pmaddwd mm3, mm7 ; *= Y_MUL
131 :     movq mm4, mm1 ; [r]
132 :     movq mm5, mm3 ; [r]
133 :     psrlq mm4, 32 ; +[g]
134 :     psrlq mm5, 32 ; +[g]
135 :     paddd mm1, mm4 ; +[b]
136 :     paddd mm3, mm5 ; +[b]
137 :    
138 :     push edx
139 :    
140 :     movd edx, mm0
141 :     shr edx, 8
142 :     add edx, Y_ADD
143 :     mov [esi], dl ; y_ptr[0]
144 :    
145 :     movd edx, mm1
146 :     shr edx, 8
147 :     add edx, Y_ADD
148 :     mov [esi + 1], dl ; y_ptr[1]
149 :    
150 :     movd edx, mm2
151 :     shr edx, 8
152 :     add edx, Y_ADD
153 :     mov [esi + eax + 0], dl ; y_ptr[y_stride + 0]
154 :    
155 :     movd edx, mm3
156 :     shr edx, 8
157 :     add edx, Y_ADD
158 :     mov [esi + eax + 1], dl ; y_ptr[y_stride + 1]
159 :    
160 :     ; u_ptr, v_ptr
161 :    
162 :     movq mm0, mm6 ; = [ |b4|g4|r4]
163 :     pmaddwd mm6, [v_mul] ; *= V_MUL
164 :     pmaddwd mm0, [u_mul] ; *= U_MUL
165 :     movq mm1, mm0
166 :     movq mm2, mm6
167 :     psrlq mm1, 32
168 :     psrlq mm2, 32
169 :     paddd mm0, mm1
170 :     paddd mm2, mm6
171 :    
172 :     movd edx, mm0
173 :     shr edx, 10
174 :     add edx, U_ADD
175 :     mov [ebx], dl
176 :    
177 :     movd edx, mm2
178 :     shr edx, 10
179 :     add edx, V_ADD
180 :     mov [ecx], dl
181 :    
182 :     pop edx
183 :     %endmacro
184 :     ;------------------------------------------------------------------------------
185 :    
186 :    
187 :    
188 :    
189 :    
190 :     ;------------------------------------------------------------------------------
191 :     ; YV12_TO_BGR( BYTES )
192 :     ;
193 :     ; BYTES 3=bgr(24-bit), 4=bgra(32-bit)
194 :     ;
195 :     ; bytes=3/4, pixels = 8, vpixels=2
196 :     ;------------------------------------------------------------------------------
197 :     %macro YV12_TO_BGR_INIT 2
198 :     pxor mm7, mm7 ; clear mm7
199 :     %endmacro
200 :    
201 :     %macro YV12_TO_BGR 2
202 :     %define TEMP_Y1 esp
203 :     %define TEMP_Y2 esp + 8
204 :     %define TEMP_G1 esp + 16
205 :     %define TEMP_G2 esp + 24
206 :     %define TEMP_B1 esp + 32
207 :     %define TEMP_B2 esp + 40
208 : Isibaar 1068
209 : edgomez 851 movd mm2, [ebx] ; u_ptr[0]
210 :     movd mm3, [ecx] ; v_ptr[0]
211 :    
212 :     punpcklbw mm2, mm7 ; u3u2u1u0 -> mm2
213 :     punpcklbw mm3, mm7 ; v3v2v1v0 -> mm3
214 :    
215 :     psubsw mm2, [U_SUB] ; U - 128
216 :     psubsw mm3, [V_SUB] ; V - 128
217 :    
218 :     movq mm4, mm2
219 :     movq mm5, mm3
220 :    
221 :     pmullw mm2, [UG_MUL]
222 :     pmullw mm3, [VG_MUL]
223 :    
224 :     movq mm6, mm2 ; u3u2u1u0 -> mm6
225 :     punpckhwd mm2, mm2 ; u3u3u2u2 -> mm2
226 :     punpcklwd mm6, mm6 ; u1u1u0u0 -> mm6
227 :    
228 :     pmullw mm4, [UB_MUL] ; B_ADD -> mm4
229 :    
230 :     movq mm0, mm3
231 :     punpckhwd mm3, mm3 ; v3v3v2v2 -> mm2
232 :     punpcklwd mm0, mm0 ; v1v1v0v0 -> mm6
233 :    
234 :     paddsw mm2, mm3
235 :     paddsw mm6, mm0
236 :    
237 :     pmullw mm5, [VR_MUL] ; R_ADD -> mm5
238 :    
239 :     movq mm0, [esi] ; y7y6y5y4y3y2y1y0 -> mm0
240 :    
241 :     movq mm1, mm0
242 :     punpckhbw mm1, mm7 ; y7y6y5y4 -> mm1
243 :     punpcklbw mm0, mm7 ; y3y2y1y0 -> mm0
244 :    
245 :     psubsw mm0, [Y_SUB] ; Y - Y_SUB
246 :     psubsw mm1, [Y_SUB] ; Y - Y_SUB
247 :    
248 :     pmullw mm1, [Y_MUL]
249 :     pmullw mm0, [Y_MUL]
250 :    
251 :     movq [TEMP_Y2], mm1 ; y7y6y5y4 -> mm3
252 :     movq [TEMP_Y1], mm0 ; y3y2y1y0 -> mm7
253 :    
254 :     psubsw mm1, mm2 ; g7g6g5g4 -> mm1
255 :     psubsw mm0, mm6 ; g3g2g1g0 -> mm0
256 :    
257 :     psraw mm1, SCALEBITS
258 :     psraw mm0, SCALEBITS
259 :    
260 :     packuswb mm0, mm1 ;g7g6g5g4g3g2g1g0 -> mm0
261 :    
262 :     movq [TEMP_G1], mm0
263 :    
264 :     movq mm0, [esi+eax] ; y7y6y5y4y3y2y1y0 -> mm0
265 :    
266 :     movq mm1, mm0
267 :    
268 :     punpckhbw mm1, mm7 ; y7y6y5y4 -> mm1
269 :     punpcklbw mm0, mm7 ; y3y2y1y0 -> mm0
270 :    
271 :     psubsw mm0, [Y_SUB] ; Y - Y_SUB
272 :     psubsw mm1, [Y_SUB] ; Y - Y_SUB
273 :    
274 :     pmullw mm1, [Y_MUL]
275 :     pmullw mm0, [Y_MUL]
276 :    
277 :     movq mm3, mm1
278 :     psubsw mm1, mm2 ; g7g6g5g4 -> mm1
279 :    
280 :     movq mm2, mm0
281 :     psubsw mm0, mm6 ; g3g2g1g0 -> mm0
282 :    
283 :     psraw mm1, SCALEBITS
284 :     psraw mm0, SCALEBITS
285 :    
286 :     packuswb mm0, mm1 ; g7g6g5g4g3g2g1g0 -> mm0
287 :    
288 :     movq [TEMP_G2], mm0
289 :    
290 :     movq mm0, mm4
291 :     punpckhwd mm4, mm4 ; u3u3u2u2 -> mm2
292 :     punpcklwd mm0, mm0 ; u1u1u0u0 -> mm6
293 :    
294 :     movq mm1, mm3 ; y7y6y5y4 -> mm1
295 :     paddsw mm3, mm4 ; b7b6b5b4 -> mm3
296 :    
297 :     movq mm7, mm2 ; y3y2y1y0 -> mm7
298 :    
299 :     paddsw mm2, mm0 ; b3b2b1b0 -> mm2
300 :    
301 :     psraw mm3, SCALEBITS
302 :     psraw mm2, SCALEBITS
303 :    
304 :     packuswb mm2, mm3 ; b7b6b5b4b3b2b1b0 -> mm2
305 :    
306 :     movq [TEMP_B2], mm2
307 :    
308 :     movq mm3, [TEMP_Y2]
309 :     movq mm2, [TEMP_Y1]
310 :    
311 :     movq mm6, mm3 ; TEMP_Y2 -> mm6
312 :     paddsw mm3, mm4 ; b7b6b5b4 -> mm3
313 :    
314 :     movq mm4, mm2 ; TEMP_Y1 -> mm4
315 :     paddsw mm2, mm0 ; b3b2b1b0 -> mm2
316 :    
317 :     psraw mm3, SCALEBITS
318 :     psraw mm2, SCALEBITS
319 :    
320 :     packuswb mm2, mm3 ; b7b6b5b4b3b2b1b0 -> mm2
321 :    
322 :     movq [TEMP_B1], mm2
323 :    
324 :     movq mm0, mm5
325 :     punpckhwd mm5, mm5 ; v3v3v2v2 -> mm5
326 :     punpcklwd mm0, mm0 ; v1v1v0v0 -> mm0
327 :    
328 :     paddsw mm1, mm5 ; r7r6r5r4 -> mm1
329 :     paddsw mm7, mm0 ; r3r2r1r0 -> mm7
330 :    
331 :     psraw mm1, SCALEBITS
332 :     psraw mm7, SCALEBITS
333 :    
334 :     packuswb mm7, mm1 ; r7r6r5r4r3r2r1r0 -> mm7 (TEMP_R2)
335 :    
336 :     paddsw mm6, mm5 ; r7r6r5r4 -> mm6
337 :     paddsw mm4, mm0 ; r3r2r1r0 -> mm4
338 :    
339 :     psraw mm6, SCALEBITS
340 :     psraw mm4, SCALEBITS
341 :    
342 :     packuswb mm4, mm6 ; r7r6r5r4r3r2r1r0 -> mm4 (TEMP_R1)
343 :    
344 :     movq mm0, [TEMP_B1]
345 :     movq mm1, [TEMP_G1]
346 :    
347 :     movq mm6, mm7
348 :    
349 :     movq mm2, mm0
350 :     punpcklbw mm2, mm4 ; r3b3r2b2r1b1r0b0 -> mm2
351 :     punpckhbw mm0, mm4 ; r7b7r6b6r5b5r4b4 -> mm0
352 :    
353 :     pxor mm7, mm7
354 :    
355 :     movq mm3, mm1
356 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
357 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
358 :    
359 :     movq mm4, mm2
360 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
361 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
362 :    
363 :     movq mm5, mm0
364 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
365 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
366 :    
367 :     %if %1 == 3 ; BGR (24-bit)
368 :     movd [edi], mm2
369 :     psrlq mm2, 32
370 :    
371 :     movd [edi + 3], mm2
372 :     movd [edi + 6], mm4
373 :    
374 :     psrlq mm4, 32
375 :    
376 :     movd [edi + 9], mm4
377 :     movd [edi + 12], mm0
378 :    
379 :     psrlq mm0, 32
380 :    
381 :     movd [edi + 15], mm0
382 : Isibaar 1068 movq mm2, mm5
383 : edgomez 851
384 : Isibaar 1068 psrlq mm0, 8 ; 000000r5g5 -> mm0
385 :     psllq mm2, 32 ; 0r6g6b60000 -> mm2
386 :    
387 :     psrlq mm5, 32 ; 00000r7g7b7 -> mm5
388 :     psrlq mm2, 16 ; 000r6g6b600 -> mm2
389 : edgomez 851
390 : Isibaar 1068 por mm0, mm2 ; 000r6g6b6r5g5 -> mm0
391 :     psllq mm5, 40 ; r7g7b700000 -> mm5
392 :    
393 :     por mm5, mm0 ; r7g7b7r6g6b6r5g5 -> mm5
394 :     movq [edi + 16], mm5
395 : edgomez 851
396 :     movq mm0, [TEMP_B2]
397 :     movq mm1, [TEMP_G2]
398 :    
399 :     movq mm2, mm0
400 :     punpcklbw mm2, mm6 ; r3b3r2b2r1b1r0b0 -> mm2
401 :     punpckhbw mm0, mm6 ; r7b7r6b6r5b5r4b4 -> mm0
402 :    
403 :     movq mm3, mm1
404 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
405 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
406 :    
407 :     movq mm4, mm2
408 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
409 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
410 :    
411 :     movq mm5, mm0
412 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
413 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
414 :    
415 :     movd [edi+edx], mm2
416 :     psrlq mm2, 32
417 :    
418 :     movd [edi+edx + 3], mm2
419 :     movd [edi+edx + 6], mm4
420 :    
421 :     psrlq mm4, 32
422 :    
423 :     movd [edi+edx + 9], mm4
424 :     movd [edi+edx + 12], mm0
425 :    
426 :     psrlq mm0, 32
427 :    
428 :     movd [edi+edx + 15], mm0
429 : Isibaar 1068 movq mm2, mm5
430 : edgomez 851
431 : Isibaar 1068 psrlq mm0, 8 ; 000000r5g5 -> mm0
432 :     psllq mm2, 32 ; 0r6g6b60000 -> mm2
433 :    
434 :     psrlq mm5, 32 ; 00000r7g7b7 -> mm5
435 :     psrlq mm2, 16 ; 000r6g6b600 -> mm2
436 : edgomez 851
437 : Isibaar 1068 por mm0, mm2 ; 000r6g6b6r5g5 -> mm0
438 :     psllq mm5, 40 ; r7g7b700000 -> mm5
439 :    
440 :     por mm5, mm0 ; r7g7b7r6g6b6r5g5 -> mm5
441 :     movq [edi + edx + 16], mm5
442 : edgomez 851
443 :     %else ; BGRA (32-bit)
444 :     movq [edi], mm2
445 :     movq [edi + 8], mm4
446 :     movq [edi + 16], mm0
447 :     movq [edi + 24], mm5
448 :    
449 :     movq mm0, [TEMP_B2]
450 :     movq mm1, [TEMP_G2]
451 :    
452 :     movq mm2, mm0
453 :     punpcklbw mm2, mm6 ; r3b3r2b2r1b1r0b0 -> mm2
454 :     punpckhbw mm0, mm6 ; r7b7r6b6r5b5r4b4 -> mm0
455 :    
456 :     movq mm3, mm1
457 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
458 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
459 :    
460 :     movq mm4, mm2
461 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
462 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
463 :    
464 :     movq mm5, mm0
465 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
466 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
467 :    
468 :     movq [edi + edx], mm2
469 :     movq [edi + edx + 8], mm4
470 :     movq [edi + edx + 16], mm0
471 :     movq [edi + edx + 24], mm5
472 :     %endif
473 :    
474 :     %undef TEMP_Y1
475 :     %undef TEMP_Y2
476 :     %undef TEMP_G1
477 :     %undef TEMP_G2
478 :     %undef TEMP_B1
479 :     %undef TEMP_B2
480 :     %endmacro
481 :     ;------------------------------------------------------------------------------
482 :    
483 :    
484 :    
485 :    
486 :     ; input
487 :    
488 :     MAKE_COLORSPACE bgr_to_yv12_mmx,0, 3,2,2, BGR_TO_YV12, 3, -1
489 :     MAKE_COLORSPACE bgra_to_yv12_mmx,0, 4,2,2, BGR_TO_YV12, 4, -1
490 :    
491 :     ; output
492 :    
493 :     MAKE_COLORSPACE yv12_to_bgr_mmx,48, 3,8,2, YV12_TO_BGR, 3, -1
494 :     MAKE_COLORSPACE yv12_to_bgra_mmx,48, 4,8,2, YV12_TO_BGR, 4, -1
495 :    

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4