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

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