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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 851, Sat Feb 15 15:22:19 2003 UTC revision 1540, Sun Aug 29 10:02:38 2004 UTC
# Line 1  Line 1 
1  ;/**************************************************************************  ;/*****************************************************************************
2  ; *  ; *
3  ; *     XVID MPEG-4 VIDEO CODEC  ; *     XVID MPEG-4 VIDEO CODEC
4  ; *     colorspace rgb  ; *  - RGB colorspace conversions -
5    ; *
6    ; *  Copyright(C) 2002-2003 Michael Militzer <isibaar@xvid.org>
7    ; *               2002-2003 Peter Ross <pross@xvid.org>
8  ; *  ; *
9  ; *     This program is free software; you can redistribute it and/or modify  ; *     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  ; *     it under the terms of the GNU General Public License as published by
# Line 15  Line 18 
18  ; *  ; *
19  ; *     You should have received a copy of the GNU General Public License  ; *     You should have received a copy of the GNU General Public License
20  ; *     along with this program; if not, write to the Free Software  ; *     along with this program; if not, write to the Free Software
21  ; *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 ; *  
 ; *************************************************************************/  
   
 ;/**************************************************************************  
 ; *  
 ; *     History:  
22  ; *  ; *
23  ; *     10.10.2001      initial version; (c)2002 peter ross <pross@xvid.org>  ; ****************************************************************************/
 ; *  
 ; *************************************************************************/  
   
24    
25  bits 32  BITS 32
26    
27  %macro cglobal 1  %macro cglobal 1
28          %ifdef PREFIX          %ifdef PREFIX
29                    %ifdef MARK_FUNCS
30                            global _%1:function %1.endfunc-%1
31                            %define %1 _%1:function %1.endfunc-%1
32                    %else
33                  global _%1                  global _%1
34                  %define %1 _%1                  %define %1 _%1
35                    %endif
36            %else
37                    %ifdef MARK_FUNCS
38                            global %1:function %1.endfunc-%1
39          %else          %else
40                  global %1                  global %1
41          %endif          %endif
42            %endif
43  %endmacro  %endmacro
44    
45    ;=============================================================================
46    ; Some constants
47    ;=============================================================================
48    
49  section .data  ;-----------------------------------------------------------------------------
 align 16  
   
 ;===========================================================================  
50  ; RGB->YV12 yuv constants  ; RGB->YV12 yuv constants
51  ;===========================================================================  ;-----------------------------------------------------------------------------
52    
53  %define Y_R             0.257  %define Y_R             0.257
54  %define Y_G             0.504  %define Y_G             0.504
55  %define Y_B             0.098  %define Y_B             0.098
# Line 61  Line 65 
65  %define V_B             0.071  %define V_B             0.071
66  %define V_ADD   128  %define V_ADD   128
67    
68  ;===========================================================================  ; Scaling used during conversion
69  ; RGB->YV12 multiplication matrices  %define SCALEBITS 6
 ;===========================================================================  
 ;                               FIX(Y_B)        FIX(Y_G)        FIX(Y_R)  
 y_mul   dw               25,             129,            66,                    0  
 u_mul   dw               112,           -74,            -38,                    0  
 v_mul   dw              -18,            -94,             112,                   0  
70    
71    ;=============================================================================
72    ; Read only data
73    ;=============================================================================
74    
75  ;===========================================================================  %ifdef FORMAT_COFF
76  ; YV12->RGB data  SECTION .rodata
77  ;===========================================================================  %else
78  %define SCALEBITS 6  SECTION .rodata align=16
79  Y_SUB           dw  16,  16,  16,  16  %endif
80  U_SUB           dw 128, 128, 128, 128  ALIGN 16
81  V_SUB           dw 128, 128, 128, 128  
82    ;-----------------------------------------------------------------------------
83    ; RGB->YV12 multiplication matrices
84    ;-----------------------------------------------------------------------------
85    ;         FIX(Y_B)      FIX(Y_G)        FIX(Y_R) Ignored
86    
87    y_mul: dw    25,      129,        66,      0
88    u_mul: dw   112,      -74,       -38,      0
89    v_mul: dw   -18,      -94,       112,      0
90    
 Y_MUL           dw  74,  74,  74,  74  
91    
92  UG_MUL          dw  25,  25,  25,  25  ;-----------------------------------------------------------------------------
93  VG_MUL          dw  52,  52,  52,  52  ; YV12->RGB data
94    ;-----------------------------------------------------------------------------
95    
96  UB_MUL          dw 129, 129, 129, 129  Y_SUB: dw  16,  16,  16,  16
97  VR_MUL          dw 102, 102, 102, 102  U_SUB: dw 128, 128, 128, 128
98    V_SUB: dw 128, 128, 128, 128
99    
100    Y_MUL: dw  74,  74,  74,  74
101    
102    UG_MUL: dw  25,  25,  25,  25
103    VG_MUL: dw  52,  52,  52,  52
104    
105  section .text  UB_MUL: dw 129, 129, 129, 129
106    VR_MUL: dw 102, 102, 102, 102
107    
108  %include "colorspace_mmx.inc"  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  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
115  ; BGR_TO_YV12( BYTES )  ; BGR_TO_YV12( BYTES )
# Line 100  Line 118 
118  ;  ;
119  ; bytes=3/4, pixels = 2, vpixels=2  ; bytes=3/4, pixels = 2, vpixels=2
120  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
121    
122  %macro BGR_TO_YV12_INIT         2  %macro BGR_TO_YV12_INIT         2
123                  movq mm7, [y_mul]                  movq mm7, [y_mul]
124  %endmacro  %endmacro
# Line 164  Line 183 
183                  mov [esi + eax + 1], dl                 ; y_ptr[y_stride + 1]                  mov [esi + eax + 1], dl                 ; y_ptr[y_stride + 1]
184    
185                  ; u_ptr, v_ptr                  ; u_ptr, v_ptr
   
186                  movq mm0, mm6                   ; = [  |b4|g4|r4]                  movq mm0, mm6                   ; = [  |b4|g4|r4]
187                  pmaddwd mm6, [v_mul]            ; *= V_MUL                  pmaddwd mm6, [v_mul]            ; *= V_MUL
188                  pmaddwd mm0, [u_mul]            ; *= U_MUL                  pmaddwd mm0, [u_mul]            ; *= U_MUL
# Line 187  Line 205 
205    
206                  pop edx                  pop edx
207  %endmacro  %endmacro
 ;------------------------------------------------------------------------------  
   
   
   
   
208    
209  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
210  ; YV12_TO_BGR( BYTES )  ; YV12_TO_BGR( BYTES )
# Line 200  Line 213 
213  ;  ;
214  ; bytes=3/4, pixels = 8, vpixels=2  ; bytes=3/4, pixels = 8, vpixels=2
215  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
216    
217  %macro YV12_TO_BGR_INIT         2  %macro YV12_TO_BGR_INIT         2
218                  pxor mm7, mm7                   ; clear mm7                  pxor mm7, mm7                   ; clear mm7
219  %endmacro  %endmacro
220    
   
221  %macro YV12_TO_BGR                      2  %macro YV12_TO_BGR                      2
222  %define TEMP_Y1  esp  %define TEMP_Y1  esp
223  %define TEMP_Y2  esp + 8  %define TEMP_Y2  esp + 8
# Line 212  Line 225 
225  %define TEMP_G2  esp + 24  %define TEMP_G2  esp + 24
226  %define TEMP_B1  esp + 32  %define TEMP_B1  esp + 32
227  %define TEMP_B2  esp + 40  %define TEMP_B2  esp + 40
228    
229          movd mm2, [ebx]         ; u_ptr[0]          movd mm2, [ebx]         ; u_ptr[0]
230          movd mm3, [ecx]         ; v_ptr[0]          movd mm3, [ecx]         ; v_ptr[0]
   
231          punpcklbw mm2, mm7              ; u3u2u1u0 -> mm2          punpcklbw mm2, mm7              ; u3u2u1u0 -> mm2
232          punpcklbw mm3, mm7              ; v3v2v1v0 -> mm3          punpcklbw mm3, mm7              ; v3v2v1v0 -> mm3
   
233          psubsw mm2, [U_SUB]             ; U - 128          psubsw mm2, [U_SUB]             ; U - 128
234          psubsw mm3, [V_SUB]             ; V - 128          psubsw mm3, [V_SUB]             ; V - 128
   
235          movq mm4, mm2          movq mm4, mm2
236          movq mm5, mm3          movq mm5, mm3
   
237          pmullw mm2, [UG_MUL]          pmullw mm2, [UG_MUL]
238          pmullw mm3, [VG_MUL]          pmullw mm3, [VG_MUL]
   
239          movq mm6, mm2                   ; u3u2u1u0 -> mm6          movq mm6, mm2                   ; u3u2u1u0 -> mm6
240          punpckhwd mm2, mm2              ; u3u3u2u2 -> mm2          punpckhwd mm2, mm2              ; u3u3u2u2 -> mm2
241          punpcklwd mm6, mm6              ; u1u1u0u0 -> mm6          punpcklwd mm6, mm6              ; u1u1u0u0 -> mm6
   
242          pmullw mm4, [UB_MUL]            ; B_ADD -> mm4          pmullw mm4, [UB_MUL]            ; B_ADD -> mm4
   
243          movq mm0, mm3          movq mm0, mm3
244          punpckhwd mm3, mm3              ; v3v3v2v2 -> mm2          punpckhwd mm3, mm3              ; v3v3v2v2 -> mm2
245          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm6          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm6
   
246          paddsw mm2, mm3          paddsw mm2, mm3
247          paddsw mm6, mm0          paddsw mm6, mm0
   
248          pmullw mm5, [VR_MUL]            ; R_ADD -> mm5          pmullw mm5, [VR_MUL]            ; R_ADD -> mm5
   
249          movq mm0, [esi]                 ; y7y6y5y4y3y2y1y0 -> mm0          movq mm0, [esi]                 ; y7y6y5y4y3y2y1y0 -> mm0
   
250          movq mm1, mm0          movq mm1, mm0
251          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1
252          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0
   
253          psubsw mm0, [Y_SUB]             ; Y - Y_SUB          psubsw mm0, [Y_SUB]             ; Y - Y_SUB
254          psubsw mm1, [Y_SUB]             ; Y - Y_SUB          psubsw mm1, [Y_SUB]             ; Y - Y_SUB
   
255          pmullw mm1, [Y_MUL]          pmullw mm1, [Y_MUL]
256          pmullw mm0, [Y_MUL]          pmullw mm0, [Y_MUL]
   
257          movq [TEMP_Y2], mm1             ; y7y6y5y4 -> mm3          movq [TEMP_Y2], mm1             ; y7y6y5y4 -> mm3
258          movq [TEMP_Y1], mm0             ; y3y2y1y0 -> mm7          movq [TEMP_Y1], mm0             ; y3y2y1y0 -> mm7
   
259          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1
260          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0
   
261          psraw mm1, SCALEBITS          psraw mm1, SCALEBITS
262          psraw mm0, SCALEBITS          psraw mm0, SCALEBITS
   
263          packuswb mm0, mm1               ;g7g6g5g4g3g2g1g0 -> mm0          packuswb mm0, mm1               ;g7g6g5g4g3g2g1g0 -> mm0
   
264          movq [TEMP_G1], mm0          movq [TEMP_G1], mm0
   
265          movq mm0, [esi+eax]                     ; y7y6y5y4y3y2y1y0 -> mm0          movq mm0, [esi+eax]                     ; y7y6y5y4y3y2y1y0 -> mm0
   
266          movq mm1, mm0          movq mm1, mm0
   
267          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1
268          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0
   
269          psubsw mm0, [Y_SUB]             ; Y - Y_SUB          psubsw mm0, [Y_SUB]             ; Y - Y_SUB
270          psubsw mm1, [Y_SUB]             ; Y - Y_SUB          psubsw mm1, [Y_SUB]             ; Y - Y_SUB
   
271          pmullw mm1, [Y_MUL]          pmullw mm1, [Y_MUL]
272          pmullw mm0, [Y_MUL]          pmullw mm0, [Y_MUL]
   
273          movq mm3, mm1          movq mm3, mm1
274          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1
   
275          movq mm2, mm0          movq mm2, mm0
276          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0
   
277          psraw mm1, SCALEBITS          psraw mm1, SCALEBITS
278          psraw mm0, SCALEBITS          psraw mm0, SCALEBITS
   
279          packuswb mm0, mm1               ; g7g6g5g4g3g2g1g0 -> mm0          packuswb mm0, mm1               ; g7g6g5g4g3g2g1g0 -> mm0
   
280          movq [TEMP_G2], mm0          movq [TEMP_G2], mm0
   
281          movq mm0, mm4          movq mm0, mm4
282          punpckhwd mm4, mm4              ; u3u3u2u2 -> mm2          punpckhwd mm4, mm4              ; u3u3u2u2 -> mm2
283          punpcklwd mm0, mm0              ; u1u1u0u0 -> mm6          punpcklwd mm0, mm0              ; u1u1u0u0 -> mm6
   
284          movq mm1, mm3                   ; y7y6y5y4 -> mm1          movq mm1, mm3                   ; y7y6y5y4 -> mm1
285          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3
   
286          movq mm7, mm2                   ; y3y2y1y0 -> mm7          movq mm7, mm2                   ; y3y2y1y0 -> mm7
   
287          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2
   
288          psraw mm3, SCALEBITS          psraw mm3, SCALEBITS
289          psraw mm2, SCALEBITS          psraw mm2, SCALEBITS
   
290          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2
   
291          movq [TEMP_B2], mm2          movq [TEMP_B2], mm2
   
292          movq mm3, [TEMP_Y2]          movq mm3, [TEMP_Y2]
293          movq mm2, [TEMP_Y1]          movq mm2, [TEMP_Y1]
   
294          movq mm6, mm3                   ; TEMP_Y2 -> mm6          movq mm6, mm3                   ; TEMP_Y2 -> mm6
295          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3
   
296          movq mm4, mm2                   ; TEMP_Y1 -> mm4          movq mm4, mm2                   ; TEMP_Y1 -> mm4
297          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2
   
298          psraw mm3, SCALEBITS          psraw mm3, SCALEBITS
299          psraw mm2, SCALEBITS          psraw mm2, SCALEBITS
   
300          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2
   
301          movq [TEMP_B1], mm2          movq [TEMP_B1], mm2
   
302          movq mm0, mm5          movq mm0, mm5
303          punpckhwd mm5, mm5              ; v3v3v2v2 -> mm5          punpckhwd mm5, mm5              ; v3v3v2v2 -> mm5
304          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm0          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm0
   
305          paddsw mm1, mm5                 ; r7r6r5r4 -> mm1          paddsw mm1, mm5                 ; r7r6r5r4 -> mm1
306          paddsw mm7, mm0                 ; r3r2r1r0 -> mm7          paddsw mm7, mm0                 ; r3r2r1r0 -> mm7
   
307          psraw mm1, SCALEBITS          psraw mm1, SCALEBITS
308          psraw mm7, SCALEBITS          psraw mm7, SCALEBITS
   
309          packuswb mm7, mm1               ; r7r6r5r4r3r2r1r0 -> mm7 (TEMP_R2)          packuswb mm7, mm1               ; r7r6r5r4r3r2r1r0 -> mm7 (TEMP_R2)
   
310          paddsw mm6, mm5                 ; r7r6r5r4 -> mm6          paddsw mm6, mm5                 ; r7r6r5r4 -> mm6
311          paddsw mm4, mm0                 ; r3r2r1r0 -> mm4          paddsw mm4, mm0                 ; r3r2r1r0 -> mm4
   
312          psraw mm6, SCALEBITS          psraw mm6, SCALEBITS
313          psraw mm4, SCALEBITS          psraw mm4, SCALEBITS
   
314          packuswb mm4, mm6               ; r7r6r5r4r3r2r1r0 -> mm4 (TEMP_R1)          packuswb mm4, mm6               ; r7r6r5r4r3r2r1r0 -> mm4 (TEMP_R1)
   
315          movq mm0, [TEMP_B1]          movq mm0, [TEMP_B1]
316          movq mm1, [TEMP_G1]          movq mm1, [TEMP_G1]
   
317          movq mm6, mm7          movq mm6, mm7
   
318          movq mm2, mm0          movq mm2, mm0
319          punpcklbw mm2, mm4              ; r3b3r2b2r1b1r0b0 -> mm2          punpcklbw mm2, mm4              ; r3b3r2b2r1b1r0b0 -> mm2
320          punpckhbw mm0, mm4              ; r7b7r6b6r5b5r4b4 -> mm0          punpckhbw mm0, mm4              ; r7b7r6b6r5b5r4b4 -> mm0
   
321          pxor mm7, mm7          pxor mm7, mm7
   
322          movq mm3, mm1          movq mm3, mm1
323          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1
324          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3
   
325          movq mm4, mm2          movq mm4, mm2
326          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2
327          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4
   
328          movq mm5, mm0          movq mm5, mm0
329          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0
330          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5
   
331  %if %1 == 3             ; BGR (24-bit)  %if %1 == 3             ; BGR (24-bit)
332          movd [edi], mm2          movd [edi], mm2
333          psrlq mm2, 32          psrlq mm2, 32
   
334          movd [edi + 3], mm2          movd [edi + 3], mm2
335          movd [edi + 6], mm4          movd [edi + 6], mm4
   
336          psrlq mm4, 32          psrlq mm4, 32
   
337          movd [edi + 9], mm4          movd [edi + 9], mm4
338          movd [edi + 12], mm0          movd [edi + 12], mm0
   
339          psrlq mm0, 32          psrlq mm0, 32
   
340          movd [edi + 15], mm0          movd [edi + 15], mm0
341          movd [edi + 18], mm5    movq mm2, mm5
342      psrlq mm0, 8              ; 000000r5g5 -> mm0
343          psrlq mm5, 32    psllq mm2, 32             ; 0r6g6b60000 -> mm2
344      psrlq mm5, 32             ; 00000r7g7b7 -> mm5
345          movd [edi + 21], mm5    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]          movq mm0, [TEMP_B2]
351          movq mm1, [TEMP_G2]          movq mm1, [TEMP_G2]
   
352          movq mm2, mm0          movq mm2, mm0
353          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2
354          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0
   
355          movq mm3, mm1          movq mm3, mm1
356          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1
357          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3
   
358          movq mm4, mm2          movq mm4, mm2
359          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2
360          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4
   
361          movq mm5, mm0          movq mm5, mm0
362          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0
363          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5
   
364          movd [edi+edx], mm2          movd [edi+edx], mm2
365          psrlq mm2, 32          psrlq mm2, 32
   
366          movd [edi+edx + 3], mm2          movd [edi+edx + 3], mm2
367          movd [edi+edx + 6], mm4          movd [edi+edx + 6], mm4
   
368          psrlq mm4, 32          psrlq mm4, 32
   
369          movd [edi+edx + 9], mm4          movd [edi+edx + 9], mm4
370          movd [edi+edx + 12], mm0          movd [edi+edx + 12], mm0
   
371          psrlq mm0, 32          psrlq mm0, 32
   
372          movd [edi+edx + 15], mm0          movd [edi+edx + 15], mm0
373          movd [edi+edx + 18], mm5    movq mm2, mm5
374      psrlq mm0, 8              ; 000000r5g5 -> mm0
375          psrlq mm5, 32    psllq mm2, 32             ; 0r6g6b60000 -> mm2
376      psrlq mm5, 32             ; 00000r7g7b7 -> mm5
377          movd [edi+edx + 21], mm5    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    
383  %else           ; BGRA (32-bit)  %else           ; BGRA (32-bit)
384          movq [edi], mm2          movq [edi], mm2
385          movq [edi + 8], mm4          movq [edi + 8], mm4
386          movq [edi + 16], mm0          movq [edi + 16], mm0
387          movq [edi + 24], mm5          movq [edi + 24], mm5
   
388          movq mm0, [TEMP_B2]          movq mm0, [TEMP_B2]
389          movq mm1, [TEMP_G2]          movq mm1, [TEMP_G2]
   
390          movq mm2, mm0          movq mm2, mm0
391          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2
392          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0
   
393          movq mm3, mm1          movq mm3, mm1
394          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1
395          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3
   
396          movq mm4, mm2          movq mm4, mm2
397          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2
398          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4
   
399          movq mm5, mm0          movq mm5, mm0
400          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0
401          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5
   
402          movq [edi + edx], mm2          movq [edi + edx], mm2
403          movq [edi + edx + 8], mm4          movq [edi + edx + 8], mm4
404          movq [edi + edx + 16], mm0          movq [edi + edx + 16], mm0
# Line 468  Line 412 
412  %undef TEMP_B1  %undef TEMP_B1
413  %undef TEMP_B2  %undef TEMP_B2
414  %endmacro  %endmacro
 ;------------------------------------------------------------------------------  
415    
416    ;=============================================================================
417    ; Code
418    ;=============================================================================
419    
420    SECTION .text
421    
422    %include "colorspace_mmx.inc"
423    
424  ; input  ; input
   
425  MAKE_COLORSPACE  bgr_to_yv12_mmx,0,    3,2,2,  BGR_TO_YV12,  3, -1  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  MAKE_COLORSPACE  bgra_to_yv12_mmx,0,   4,2,2,  BGR_TO_YV12,  4, -1
427    
428  ; output  ; output
   
429  MAKE_COLORSPACE  yv12_to_bgr_mmx,48,   3,8,2,  YV12_TO_BGR,  3, -1  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  MAKE_COLORSPACE  yv12_to_bgra_mmx,48,  4,8,2,  YV12_TO_BGR,  4, -1
431    

Legend:
Removed from v.851  
changed lines
  Added in v.1540

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