[svn] / trunk / xvidcore / src / image / x86_asm / colorspace_rgb_mmx.asm Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/image/x86_asm/colorspace_rgb_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1535 - (view) (download)

1 : edgomez 1382 ;/*****************************************************************************
2 : edgomez 851 ; *
3 : edgomez 1382 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - RGB colorspace conversions -
5 : edgomez 851 ; *
6 : edgomez 1382 ; * Copyright(C) 2002-2003 Michael Militzer <isibaar@xvid.org>
7 :     ; * 2002-2003 Peter Ross <pross@xvid.org>
8 : edgomez 851 ; *
9 : edgomez 1382 ; * 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 : edgomez 1382 ; * 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 : edgomez 1382 ; * 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 : edgomez 1382 ; ****************************************************************************/
24 : edgomez 851
25 : edgomez 1382 BITS 32
26 : edgomez 851
27 : edgomez 1382 %macro cglobal 1
28 : edgomez 851 %ifdef PREFIX
29 : edgomez 1535 %ifdef MARK_FUNCS
30 :     global _%1:function
31 :     %define %1 _%1:function
32 :     %else
33 :     global _%1
34 :     %define %1 _%1
35 :     %endif
36 : edgomez 851 %else
37 : edgomez 1535 %ifdef MARK_FUNCS
38 :     global %1:function
39 :     %else
40 :     global %1
41 :     %endif
42 : edgomez 851 %endif
43 :     %endmacro
44 :    
45 : edgomez 1382 ;=============================================================================
46 :     ; Some constants
47 :     ;=============================================================================
48 : edgomez 851
49 : edgomez 1382 ;-----------------------------------------------------------------------------
50 : edgomez 851 ; RGB->YV12 yuv constants
51 : edgomez 1382 ;-----------------------------------------------------------------------------
52 :    
53 : edgomez 851 %define Y_R 0.257
54 :     %define Y_G 0.504
55 :     %define Y_B 0.098
56 :     %define Y_ADD 16
57 :    
58 :     %define U_R 0.148
59 :     %define U_G 0.291
60 :     %define U_B 0.439
61 :     %define U_ADD 128
62 :    
63 :     %define V_R 0.439
64 :     %define V_G 0.368
65 :     %define V_B 0.071
66 :     %define V_ADD 128
67 :    
68 : edgomez 1382 ; Scaling used during conversion
69 :     %define SCALEBITS 6
70 : edgomez 851
71 : edgomez 1382 ;=============================================================================
72 :     ; Read only data
73 :     ;=============================================================================
74 : edgomez 851
75 : edgomez 1382 %ifdef FORMAT_COFF
76 : edgomez 1519 SECTION .rodata
77 : edgomez 1382 %else
78 : edgomez 1519 SECTION .rodata align=16
79 : edgomez 1382 %endif
80 :     ALIGN 16
81 : edgomez 851
82 : edgomez 1382 ;-----------------------------------------------------------------------------
83 :     ; RGB->YV12 multiplication matrices
84 :     ;-----------------------------------------------------------------------------
85 :     ; FIX(Y_B) FIX(Y_G) FIX(Y_R) Ignored
86 : edgomez 851
87 : edgomez 1382 y_mul: dw 25, 129, 66, 0
88 :     u_mul: dw 112, -74, -38, 0
89 :     v_mul: dw -18, -94, 112, 0
90 : edgomez 851
91 :    
92 : edgomez 1382 ;-----------------------------------------------------------------------------
93 :     ; YV12->RGB data
94 :     ;-----------------------------------------------------------------------------
95 : edgomez 851
96 : edgomez 1382 Y_SUB: dw 16, 16, 16, 16
97 :     U_SUB: dw 128, 128, 128, 128
98 :     V_SUB: dw 128, 128, 128, 128
99 : edgomez 851
100 : edgomez 1382 Y_MUL: dw 74, 74, 74, 74
101 : edgomez 851
102 : edgomez 1382 UG_MUL: dw 25, 25, 25, 25
103 :     VG_MUL: dw 52, 52, 52, 52
104 : edgomez 851
105 : edgomez 1382 UB_MUL: dw 129, 129, 129, 129
106 :     VR_MUL: dw 102, 102, 102, 102
107 : edgomez 851
108 : edgomez 1382 BRIGHT: db 128, 128, 128, 128, 128, 128, 128, 128
109 :    
110 :     ;=============================================================================
111 :     ; Helper macros used with the colorspace_mmx.inc file
112 :     ;=============================================================================
113 :    
114 : edgomez 851 ;------------------------------------------------------------------------------
115 :     ; BGR_TO_YV12( BYTES )
116 :     ;
117 :     ; BYTES 3=bgr(24bit), 4=bgra(32-bit)
118 :     ;
119 :     ; bytes=3/4, pixels = 2, vpixels=2
120 :     ;------------------------------------------------------------------------------
121 : edgomez 1382
122 : edgomez 851 %macro BGR_TO_YV12_INIT 2
123 : edgomez 1382 movq mm7, [y_mul]
124 : edgomez 851 %endmacro
125 :    
126 :    
127 :     %macro BGR_TO_YV12 2
128 : edgomez 1382 ; y_out
129 :     pxor mm4, mm4
130 :     pxor mm5, mm5
131 :     movd mm0, [edi] ; x_ptr[0...]
132 :     movd mm2, [edi+edx] ; x_ptr[x_stride...]
133 :     punpcklbw mm0, mm4 ; [ |b |g |r ]
134 :     punpcklbw mm2, mm5 ; [ |b |g |r ]
135 :     movq mm6, mm0 ; = [ |b4|g4|r4]
136 :     paddw mm6, mm2 ; +[ |b4|g4|r4]
137 :     pmaddwd mm0, mm7 ; *= Y_MUL
138 :     pmaddwd mm2, mm7 ; *= Y_MUL
139 :     movq mm4, mm0 ; [r]
140 :     movq mm5, mm2 ; [r]
141 :     psrlq mm4, 32 ; +[g]
142 :     psrlq mm5, 32 ; +[g]
143 :     paddd mm0, mm4 ; +[b]
144 :     paddd mm2, mm5 ; +[b]
145 : edgomez 851
146 : edgomez 1382 pxor mm4, mm4
147 :     pxor mm5, mm5
148 :     movd mm1, [edi+%1] ; src[%1...]
149 :     movd mm3, [edi+edx+%1] ; src[x_stride+%1...]
150 :     punpcklbw mm1, mm4 ; [ |b |g |r ]
151 :     punpcklbw mm3, mm5 ; [ |b |g |r ]
152 :     paddw mm6, mm1 ; +[ |b4|g4|r4]
153 :     paddw mm6, mm3 ; +[ |b4|g4|r4]
154 :     pmaddwd mm1, mm7 ; *= Y_MUL
155 :     pmaddwd mm3, mm7 ; *= Y_MUL
156 :     movq mm4, mm1 ; [r]
157 :     movq mm5, mm3 ; [r]
158 :     psrlq mm4, 32 ; +[g]
159 :     psrlq mm5, 32 ; +[g]
160 :     paddd mm1, mm4 ; +[b]
161 :     paddd mm3, mm5 ; +[b]
162 : edgomez 851
163 : edgomez 1382 push edx
164 : edgomez 851
165 : edgomez 1382 movd edx, mm0
166 :     shr edx, 8
167 :     add edx, Y_ADD
168 :     mov [esi], dl ; y_ptr[0]
169 : edgomez 851
170 : edgomez 1382 movd edx, mm1
171 :     shr edx, 8
172 :     add edx, Y_ADD
173 :     mov [esi + 1], dl ; y_ptr[1]
174 : edgomez 851
175 : edgomez 1382 movd edx, mm2
176 :     shr edx, 8
177 :     add edx, Y_ADD
178 :     mov [esi + eax + 0], dl ; y_ptr[y_stride + 0]
179 : edgomez 851
180 : edgomez 1382 movd edx, mm3
181 :     shr edx, 8
182 :     add edx, Y_ADD
183 :     mov [esi + eax + 1], dl ; y_ptr[y_stride + 1]
184 : edgomez 851
185 : edgomez 1382 ; u_ptr, v_ptr
186 :     movq mm0, mm6 ; = [ |b4|g4|r4]
187 :     pmaddwd mm6, [v_mul] ; *= V_MUL
188 :     pmaddwd mm0, [u_mul] ; *= U_MUL
189 :     movq mm1, mm0
190 :     movq mm2, mm6
191 :     psrlq mm1, 32
192 :     psrlq mm2, 32
193 :     paddd mm0, mm1
194 :     paddd mm2, mm6
195 : edgomez 851
196 : edgomez 1382 movd edx, mm0
197 :     shr edx, 10
198 :     add edx, U_ADD
199 :     mov [ebx], dl
200 : edgomez 851
201 : edgomez 1382 movd edx, mm2
202 :     shr edx, 10
203 :     add edx, V_ADD
204 :     mov [ecx], dl
205 : edgomez 851
206 : edgomez 1382 pop edx
207 : edgomez 851 %endmacro
208 :    
209 :     ;------------------------------------------------------------------------------
210 :     ; YV12_TO_BGR( BYTES )
211 :     ;
212 :     ; BYTES 3=bgr(24-bit), 4=bgra(32-bit)
213 :     ;
214 :     ; bytes=3/4, pixels = 8, vpixels=2
215 :     ;------------------------------------------------------------------------------
216 : edgomez 1382
217 : edgomez 851 %macro YV12_TO_BGR_INIT 2
218 : edgomez 1382 pxor mm7, mm7 ; clear mm7
219 : edgomez 851 %endmacro
220 :    
221 :     %macro YV12_TO_BGR 2
222 :     %define TEMP_Y1 esp
223 :     %define TEMP_Y2 esp + 8
224 :     %define TEMP_G1 esp + 16
225 :     %define TEMP_G2 esp + 24
226 :     %define TEMP_B1 esp + 32
227 :     %define TEMP_B2 esp + 40
228 :    
229 : edgomez 1382 movd mm2, [ebx] ; u_ptr[0]
230 :     movd mm3, [ecx] ; v_ptr[0]
231 :     punpcklbw mm2, mm7 ; u3u2u1u0 -> mm2
232 :     punpcklbw mm3, mm7 ; v3v2v1v0 -> mm3
233 :     psubsw mm2, [U_SUB] ; U - 128
234 :     psubsw mm3, [V_SUB] ; V - 128
235 :     movq mm4, mm2
236 :     movq mm5, mm3
237 :     pmullw mm2, [UG_MUL]
238 :     pmullw mm3, [VG_MUL]
239 :     movq mm6, mm2 ; u3u2u1u0 -> mm6
240 :     punpckhwd mm2, mm2 ; u3u3u2u2 -> mm2
241 :     punpcklwd mm6, mm6 ; u1u1u0u0 -> mm6
242 :     pmullw mm4, [UB_MUL] ; B_ADD -> mm4
243 :     movq mm0, mm3
244 :     punpckhwd mm3, mm3 ; v3v3v2v2 -> mm2
245 :     punpcklwd mm0, mm0 ; v1v1v0v0 -> mm6
246 :     paddsw mm2, mm3
247 :     paddsw mm6, mm0
248 :     pmullw mm5, [VR_MUL] ; R_ADD -> mm5
249 :     movq mm0, [esi] ; y7y6y5y4y3y2y1y0 -> mm0
250 :     movq mm1, mm0
251 :     punpckhbw mm1, mm7 ; y7y6y5y4 -> mm1
252 :     punpcklbw mm0, mm7 ; y3y2y1y0 -> mm0
253 :     psubsw mm0, [Y_SUB] ; Y - Y_SUB
254 :     psubsw mm1, [Y_SUB] ; Y - Y_SUB
255 :     pmullw mm1, [Y_MUL]
256 :     pmullw mm0, [Y_MUL]
257 :     movq [TEMP_Y2], mm1 ; y7y6y5y4 -> mm3
258 :     movq [TEMP_Y1], mm0 ; y3y2y1y0 -> mm7
259 :     psubsw mm1, mm2 ; g7g6g5g4 -> mm1
260 :     psubsw mm0, mm6 ; g3g2g1g0 -> mm0
261 :     psraw mm1, SCALEBITS
262 :     psraw mm0, SCALEBITS
263 :     packuswb mm0, mm1 ;g7g6g5g4g3g2g1g0 -> mm0
264 :     movq [TEMP_G1], mm0
265 :     movq mm0, [esi+eax] ; y7y6y5y4y3y2y1y0 -> mm0
266 :     movq mm1, mm0
267 :     punpckhbw mm1, mm7 ; y7y6y5y4 -> mm1
268 :     punpcklbw mm0, mm7 ; y3y2y1y0 -> mm0
269 :     psubsw mm0, [Y_SUB] ; Y - Y_SUB
270 :     psubsw mm1, [Y_SUB] ; Y - Y_SUB
271 :     pmullw mm1, [Y_MUL]
272 :     pmullw mm0, [Y_MUL]
273 :     movq mm3, mm1
274 :     psubsw mm1, mm2 ; g7g6g5g4 -> mm1
275 :     movq mm2, mm0
276 :     psubsw mm0, mm6 ; g3g2g1g0 -> mm0
277 :     psraw mm1, SCALEBITS
278 :     psraw mm0, SCALEBITS
279 :     packuswb mm0, mm1 ; g7g6g5g4g3g2g1g0 -> mm0
280 :     movq [TEMP_G2], mm0
281 :     movq mm0, mm4
282 :     punpckhwd mm4, mm4 ; u3u3u2u2 -> mm2
283 :     punpcklwd mm0, mm0 ; u1u1u0u0 -> mm6
284 :     movq mm1, mm3 ; y7y6y5y4 -> mm1
285 :     paddsw mm3, mm4 ; b7b6b5b4 -> mm3
286 :     movq mm7, mm2 ; y3y2y1y0 -> mm7
287 :     paddsw mm2, mm0 ; b3b2b1b0 -> mm2
288 :     psraw mm3, SCALEBITS
289 :     psraw mm2, SCALEBITS
290 :     packuswb mm2, mm3 ; b7b6b5b4b3b2b1b0 -> mm2
291 :     movq [TEMP_B2], mm2
292 :     movq mm3, [TEMP_Y2]
293 :     movq mm2, [TEMP_Y1]
294 :     movq mm6, mm3 ; TEMP_Y2 -> mm6
295 :     paddsw mm3, mm4 ; b7b6b5b4 -> mm3
296 :     movq mm4, mm2 ; TEMP_Y1 -> mm4
297 :     paddsw mm2, mm0 ; b3b2b1b0 -> mm2
298 :     psraw mm3, SCALEBITS
299 :     psraw mm2, SCALEBITS
300 :     packuswb mm2, mm3 ; b7b6b5b4b3b2b1b0 -> mm2
301 :     movq [TEMP_B1], mm2
302 :     movq mm0, mm5
303 :     punpckhwd mm5, mm5 ; v3v3v2v2 -> mm5
304 :     punpcklwd mm0, mm0 ; v1v1v0v0 -> mm0
305 :     paddsw mm1, mm5 ; r7r6r5r4 -> mm1
306 :     paddsw mm7, mm0 ; r3r2r1r0 -> mm7
307 :     psraw mm1, SCALEBITS
308 :     psraw mm7, SCALEBITS
309 :     packuswb mm7, mm1 ; r7r6r5r4r3r2r1r0 -> mm7 (TEMP_R2)
310 :     paddsw mm6, mm5 ; r7r6r5r4 -> mm6
311 :     paddsw mm4, mm0 ; r3r2r1r0 -> mm4
312 :     psraw mm6, SCALEBITS
313 :     psraw mm4, SCALEBITS
314 :     packuswb mm4, mm6 ; r7r6r5r4r3r2r1r0 -> mm4 (TEMP_R1)
315 :     movq mm0, [TEMP_B1]
316 :     movq mm1, [TEMP_G1]
317 :     movq mm6, mm7
318 :     movq mm2, mm0
319 :     punpcklbw mm2, mm4 ; r3b3r2b2r1b1r0b0 -> mm2
320 :     punpckhbw mm0, mm4 ; r7b7r6b6r5b5r4b4 -> mm0
321 :     pxor mm7, mm7
322 :     movq mm3, mm1
323 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
324 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
325 :     movq mm4, mm2
326 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
327 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
328 :     movq mm5, mm0
329 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
330 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
331 :     %if %1 == 3 ; BGR (24-bit)
332 :     movd [edi], mm2
333 :     psrlq mm2, 32
334 :     movd [edi + 3], mm2
335 :     movd [edi + 6], mm4
336 :     psrlq mm4, 32
337 :     movd [edi + 9], mm4
338 :     movd [edi + 12], mm0
339 :     psrlq mm0, 32
340 :     movd [edi + 15], mm0
341 :     movq mm2, mm5
342 :     psrlq mm0, 8 ; 000000r5g5 -> mm0
343 :     psllq mm2, 32 ; 0r6g6b60000 -> mm2
344 :     psrlq mm5, 32 ; 00000r7g7b7 -> mm5
345 :     psrlq mm2, 16 ; 000r6g6b600 -> mm2
346 :     por mm0, mm2 ; 000r6g6b6r5g5 -> mm0
347 :     psllq mm5, 40 ; r7g7b700000 -> mm5
348 :     por mm5, mm0 ; r7g7b7r6g6b6r5g5 -> mm5
349 :     movq [edi + 16], mm5
350 :     movq mm0, [TEMP_B2]
351 :     movq mm1, [TEMP_G2]
352 :     movq mm2, mm0
353 :     punpcklbw mm2, mm6 ; r3b3r2b2r1b1r0b0 -> mm2
354 :     punpckhbw mm0, mm6 ; r7b7r6b6r5b5r4b4 -> mm0
355 :     movq mm3, mm1
356 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
357 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
358 :     movq mm4, mm2
359 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
360 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
361 :     movq mm5, mm0
362 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
363 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
364 :     movd [edi+edx], mm2
365 :     psrlq mm2, 32
366 :     movd [edi+edx + 3], mm2
367 :     movd [edi+edx + 6], mm4
368 :     psrlq mm4, 32
369 :     movd [edi+edx + 9], mm4
370 :     movd [edi+edx + 12], mm0
371 :     psrlq mm0, 32
372 :     movd [edi+edx + 15], mm0
373 :     movq mm2, mm5
374 :     psrlq mm0, 8 ; 000000r5g5 -> mm0
375 :     psllq mm2, 32 ; 0r6g6b60000 -> mm2
376 :     psrlq mm5, 32 ; 00000r7g7b7 -> mm5
377 :     psrlq mm2, 16 ; 000r6g6b600 -> mm2
378 :     por mm0, mm2 ; 000r6g6b6r5g5 -> mm0
379 :     psllq mm5, 40 ; r7g7b700000 -> mm5
380 :     por mm5, mm0 ; r7g7b7r6g6b6r5g5 -> mm5
381 :     movq [edi + edx + 16], mm5
382 : edgomez 851
383 : edgomez 1382 %else ; BGRA (32-bit)
384 :     movq [edi], mm2
385 :     movq [edi + 8], mm4
386 :     movq [edi + 16], mm0
387 :     movq [edi + 24], mm5
388 :     movq mm0, [TEMP_B2]
389 :     movq mm1, [TEMP_G2]
390 :     movq mm2, mm0
391 :     punpcklbw mm2, mm6 ; r3b3r2b2r1b1r0b0 -> mm2
392 :     punpckhbw mm0, mm6 ; r7b7r6b6r5b5r4b4 -> mm0
393 :     movq mm3, mm1
394 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
395 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
396 :     movq mm4, mm2
397 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
398 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
399 :     movq mm5, mm0
400 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
401 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
402 :     movq [edi + edx], mm2
403 :     movq [edi + edx + 8], mm4
404 :     movq [edi + edx + 16], mm0
405 :     movq [edi + edx + 24], mm5
406 : edgomez 851 %endif
407 :    
408 :     %undef TEMP_Y1
409 :     %undef TEMP_Y2
410 :     %undef TEMP_G1
411 :     %undef TEMP_G2
412 :     %undef TEMP_B1
413 :     %undef TEMP_B2
414 :     %endmacro
415 :    
416 : edgomez 1382 ;=============================================================================
417 :     ; Code
418 :     ;=============================================================================
419 : edgomez 851
420 : edgomez 1382 SECTION .text
421 : edgomez 851
422 : edgomez 1382 %include "colorspace_mmx.inc"
423 : edgomez 851
424 :     ; input
425 :     MAKE_COLORSPACE bgr_to_yv12_mmx,0, 3,2,2, BGR_TO_YV12, 3, -1
426 :     MAKE_COLORSPACE bgra_to_yv12_mmx,0, 4,2,2, BGR_TO_YV12, 4, -1
427 :    
428 :     ; output
429 :     MAKE_COLORSPACE yv12_to_bgr_mmx,48, 3,8,2, YV12_TO_BGR, 3, -1
430 :     MAKE_COLORSPACE yv12_to_bgra_mmx,48, 4,8,2, YV12_TO_BGR, 4, -1
431 :    

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