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

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