[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 1763, Sun Nov 12 01:40:36 2006 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
22  ; *  ; *
23  ; *************************************************************************/  ; ****************************************************************************/
24    
25  ;/**************************************************************************  BITS 32
 ; *  
 ; *     History:  
 ; *  
 ; *     10.10.2001      initial version; (c)2002 peter ross <pross@xvid.org>  
 ; *  
 ; *************************************************************************/  
   
   
 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  74,  74,  74,  74  bgr_y_mul: dw    25,      129,        66,      0
88    bgr_u_mul: dw   112,      -74,       -38,      0
89    bgr_v_mul: dw   -18,      -94,       112,      0
90    
91    ;-----------------------------------------------------------------------------
92    ; BGR->YV12 multiplication matrices
93    ;-----------------------------------------------------------------------------
94    ;         FIX(Y_R)      FIX(Y_G)        FIX(Y_B) Ignored
95    
96    rgb_y_mul: dw    66,      129,        25,      0
97    rgb_u_mul: dw   -38,      -74,       112,      0
98    rgb_v_mul: dw   112,      -94,       -18,      0
99    
100  UG_MUL          dw  25,  25,  25,  25  ;-----------------------------------------------------------------------------
101  VG_MUL          dw  52,  52,  52,  52  ; YV12->RGB data
102    ;-----------------------------------------------------------------------------
103    
104  UB_MUL          dw 129, 129, 129, 129  Y_SUB: dw  16,  16,  16,  16
105  VR_MUL          dw 102, 102, 102, 102  U_SUB: dw 128, 128, 128, 128
106    V_SUB: dw 128, 128, 128, 128
107    
108    Y_MUL: dw  74,  74,  74,  74
109    
110    UG_MUL: dw  25,  25,  25,  25
111    VG_MUL: dw  52,  52,  52,  52
112    
113  section .text  UB_MUL: dw 129, 129, 129, 129
114    VR_MUL: dw 102, 102, 102, 102
115    
116  %include "colorspace_mmx.inc"  BRIGHT: db 128, 128, 128, 128, 128, 128, 128, 128
117    
118    ;=============================================================================
119    ; Helper macros used with the colorspace_mmx.inc file
120    ;=============================================================================
121    
122  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
123  ; BGR_TO_YV12( BYTES )  ; BGR_TO_YV12( BYTES )
# Line 100  Line 126 
126  ;  ;
127  ; bytes=3/4, pixels = 2, vpixels=2  ; bytes=3/4, pixels = 2, vpixels=2
128  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
129    
130  %macro BGR_TO_YV12_INIT         2  %macro BGR_TO_YV12_INIT         2
131                  movq mm7, [y_mul]    movq mm7, [bgr_y_mul]
132  %endmacro  %endmacro
133    
134    
# Line 164  Line 191 
191                  mov [esi + eax + 1], dl                 ; y_ptr[y_stride + 1]                  mov [esi + eax + 1], dl                 ; y_ptr[y_stride + 1]
192    
193                  ; u_ptr, v_ptr                  ; u_ptr, v_ptr
   
194                  movq mm0, mm6                   ; = [  |b4|g4|r4]                  movq mm0, mm6                   ; = [  |b4|g4|r4]
195                  pmaddwd mm6, [v_mul]            ; *= V_MUL    pmaddwd mm6, [bgr_v_mul]          ; *= V_MUL
196                  pmaddwd mm0, [u_mul]            ; *= U_MUL    pmaddwd mm0, [bgr_u_mul]          ; *= U_MUL
197                  movq mm1, mm0                  movq mm1, mm0
198                  movq mm2, mm6                  movq mm2, mm6
199                  psrlq mm1, 32                  psrlq mm1, 32
# Line 187  Line 213 
213    
214                  pop edx                  pop edx
215  %endmacro  %endmacro
216    
217  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
218    ; RGB_TO_YV12( BYTES )
219    ;
220    ; BYTES         3=rgb(24bit), 4=rgba(32-bit)
221    ;
222    ; bytes=3/4, pixels = 2, vpixels=2
223    ;------------------------------------------------------------------------------
224    
225    %macro RGB_TO_YV12_INIT         2
226      movq mm7, [rgb_y_mul]
227    %endmacro
228    
229    
230    %macro RGB_TO_YV12                      2
231        ; y_out
232      pxor mm4, mm4
233      pxor mm5, mm5
234      movd mm0, [edi]               ; x_ptr[0...]
235      movd mm2, [edi+edx]           ; x_ptr[x_stride...]
236      punpcklbw mm0, mm4            ; [  |b |g |r ]
237      punpcklbw mm2, mm5            ; [  |b |g |r ]
238      movq mm6, mm0                 ; = [  |b4|g4|r4]
239      paddw mm6, mm2                ; +[  |b4|g4|r4]
240      pmaddwd mm0, mm7              ; *= Y_MUL
241      pmaddwd mm2, mm7              ; *= Y_MUL
242      movq mm4, mm0                 ; [r]
243      movq mm5, mm2                 ; [r]
244      psrlq mm4, 32                 ; +[g]
245      psrlq mm5, 32                 ; +[g]
246      paddd mm0, mm4                ; +[b]
247      paddd mm2, mm5                ; +[b]
248    
249      pxor mm4, mm4
250      pxor mm5, mm5
251      movd mm1, [edi+%1]            ; src[%1...]
252      movd mm3, [edi+edx+%1]        ; src[x_stride+%1...]
253      punpcklbw mm1, mm4            ; [  |b |g |r ]
254      punpcklbw mm3, mm5            ; [  |b |g |r ]
255      paddw mm6, mm1                ; +[  |b4|g4|r4]
256      paddw mm6, mm3                ; +[  |b4|g4|r4]
257      pmaddwd mm1, mm7              ; *= Y_MUL
258      pmaddwd mm3, mm7              ; *= Y_MUL
259      movq mm4, mm1                 ; [r]
260      movq mm5, mm3                 ; [r]
261      psrlq mm4, 32                 ; +[g]
262      psrlq mm5, 32                 ; +[g]
263      paddd mm1, mm4                ; +[b]
264      paddd mm3, mm5                ; +[b]
265    
266      push edx
267    
268      movd edx, mm0
269      shr edx, 8
270      add edx, Y_ADD
271      mov [esi], dl                 ; y_ptr[0]
272    
273      movd edx, mm1
274      shr edx, 8
275      add edx, Y_ADD
276      mov [esi + 1], dl             ; y_ptr[1]
277    
278      movd edx, mm2
279      shr edx, 8
280      add edx, Y_ADD
281      mov [esi + eax + 0], dl       ; y_ptr[y_stride + 0]
282    
283      movd edx, mm3
284      shr edx, 8
285      add edx, Y_ADD
286      mov [esi + eax + 1], dl       ; y_ptr[y_stride + 1]
287    
288      ; u_ptr, v_ptr
289      movq mm0, mm6                 ; = [  |b4|g4|r4]
290      pmaddwd mm6, [rgb_v_mul]          ; *= V_MUL
291      pmaddwd mm0, [rgb_u_mul]          ; *= U_MUL
292      movq mm1, mm0
293      movq mm2, mm6
294      psrlq mm1, 32
295      psrlq mm2, 32
296      paddd mm0, mm1
297      paddd mm2, mm6
298    
299      movd edx, mm0
300      shr edx, 10
301      add edx, U_ADD
302      mov [ebx], dl
303    
304      movd edx, mm2
305      shr edx, 10
306      add edx, V_ADD
307      mov [ecx], dl
308    
309      pop edx
310    %endmacro
311    
312  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
313  ; YV12_TO_BGR( BYTES )  ; YV12_TO_BGR( BYTES )
# Line 200  Line 316 
316  ;  ;
317  ; bytes=3/4, pixels = 8, vpixels=2  ; bytes=3/4, pixels = 8, vpixels=2
318  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
319    
320  %macro YV12_TO_BGR_INIT         2  %macro YV12_TO_BGR_INIT         2
321                  pxor mm7, mm7                   ; clear mm7                  pxor mm7, mm7                   ; clear mm7
322  %endmacro  %endmacro
323    
   
324  %macro YV12_TO_BGR                      2  %macro YV12_TO_BGR                      2
325  %define TEMP_Y1  esp  %define TEMP_Y1  esp
326  %define TEMP_Y2  esp + 8  %define TEMP_Y2  esp + 8
# Line 212  Line 328 
328  %define TEMP_G2  esp + 24  %define TEMP_G2  esp + 24
329  %define TEMP_B1  esp + 32  %define TEMP_B1  esp + 32
330  %define TEMP_B2  esp + 40  %define TEMP_B2  esp + 40
331    
332          movd mm2, [ebx]         ; u_ptr[0]          movd mm2, [ebx]         ; u_ptr[0]
333          movd mm3, [ecx]         ; v_ptr[0]          movd mm3, [ecx]         ; v_ptr[0]
   
334          punpcklbw mm2, mm7              ; u3u2u1u0 -> mm2          punpcklbw mm2, mm7              ; u3u2u1u0 -> mm2
335          punpcklbw mm3, mm7              ; v3v2v1v0 -> mm3          punpcklbw mm3, mm7              ; v3v2v1v0 -> mm3
   
336          psubsw mm2, [U_SUB]             ; U - 128          psubsw mm2, [U_SUB]             ; U - 128
337          psubsw mm3, [V_SUB]             ; V - 128          psubsw mm3, [V_SUB]             ; V - 128
   
338          movq mm4, mm2          movq mm4, mm2
339          movq mm5, mm3          movq mm5, mm3
   
340          pmullw mm2, [UG_MUL]          pmullw mm2, [UG_MUL]
341          pmullw mm3, [VG_MUL]          pmullw mm3, [VG_MUL]
   
342          movq mm6, mm2                   ; u3u2u1u0 -> mm6          movq mm6, mm2                   ; u3u2u1u0 -> mm6
343          punpckhwd mm2, mm2              ; u3u3u2u2 -> mm2          punpckhwd mm2, mm2              ; u3u3u2u2 -> mm2
344          punpcklwd mm6, mm6              ; u1u1u0u0 -> mm6          punpcklwd mm6, mm6              ; u1u1u0u0 -> mm6
   
345          pmullw mm4, [UB_MUL]            ; B_ADD -> mm4          pmullw mm4, [UB_MUL]            ; B_ADD -> mm4
   
346          movq mm0, mm3          movq mm0, mm3
347          punpckhwd mm3, mm3              ; v3v3v2v2 -> mm2          punpckhwd mm3, mm3              ; v3v3v2v2 -> mm2
348          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm6          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm6
   
349          paddsw mm2, mm3          paddsw mm2, mm3
350          paddsw mm6, mm0          paddsw mm6, mm0
   
351          pmullw mm5, [VR_MUL]            ; R_ADD -> mm5          pmullw mm5, [VR_MUL]            ; R_ADD -> mm5
   
352          movq mm0, [esi]                 ; y7y6y5y4y3y2y1y0 -> mm0          movq mm0, [esi]                 ; y7y6y5y4y3y2y1y0 -> mm0
   
353          movq mm1, mm0          movq mm1, mm0
354          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1
355          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0
   
356          psubsw mm0, [Y_SUB]             ; Y - Y_SUB          psubsw mm0, [Y_SUB]             ; Y - Y_SUB
357          psubsw mm1, [Y_SUB]             ; Y - Y_SUB          psubsw mm1, [Y_SUB]             ; Y - Y_SUB
   
358          pmullw mm1, [Y_MUL]          pmullw mm1, [Y_MUL]
359          pmullw mm0, [Y_MUL]          pmullw mm0, [Y_MUL]
   
360          movq [TEMP_Y2], mm1             ; y7y6y5y4 -> mm3          movq [TEMP_Y2], mm1             ; y7y6y5y4 -> mm3
361          movq [TEMP_Y1], mm0             ; y3y2y1y0 -> mm7          movq [TEMP_Y1], mm0             ; y3y2y1y0 -> mm7
   
362          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1
363          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0
   
364          psraw mm1, SCALEBITS          psraw mm1, SCALEBITS
365          psraw mm0, SCALEBITS          psraw mm0, SCALEBITS
   
366          packuswb mm0, mm1               ;g7g6g5g4g3g2g1g0 -> mm0          packuswb mm0, mm1               ;g7g6g5g4g3g2g1g0 -> mm0
   
367          movq [TEMP_G1], mm0          movq [TEMP_G1], mm0
   
368          movq mm0, [esi+eax]                     ; y7y6y5y4y3y2y1y0 -> mm0          movq mm0, [esi+eax]                     ; y7y6y5y4y3y2y1y0 -> mm0
   
369          movq mm1, mm0          movq mm1, mm0
   
370          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1
371          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0
   
372          psubsw mm0, [Y_SUB]             ; Y - Y_SUB          psubsw mm0, [Y_SUB]             ; Y - Y_SUB
373          psubsw mm1, [Y_SUB]             ; Y - Y_SUB          psubsw mm1, [Y_SUB]             ; Y - Y_SUB
   
374          pmullw mm1, [Y_MUL]          pmullw mm1, [Y_MUL]
375          pmullw mm0, [Y_MUL]          pmullw mm0, [Y_MUL]
   
376          movq mm3, mm1          movq mm3, mm1
377          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1
   
378          movq mm2, mm0          movq mm2, mm0
379          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0
   
380          psraw mm1, SCALEBITS          psraw mm1, SCALEBITS
381          psraw mm0, SCALEBITS          psraw mm0, SCALEBITS
   
382          packuswb mm0, mm1               ; g7g6g5g4g3g2g1g0 -> mm0          packuswb mm0, mm1               ; g7g6g5g4g3g2g1g0 -> mm0
   
383          movq [TEMP_G2], mm0          movq [TEMP_G2], mm0
   
384          movq mm0, mm4          movq mm0, mm4
385          punpckhwd mm4, mm4              ; u3u3u2u2 -> mm2          punpckhwd mm4, mm4              ; u3u3u2u2 -> mm2
386          punpcklwd mm0, mm0              ; u1u1u0u0 -> mm6          punpcklwd mm0, mm0              ; u1u1u0u0 -> mm6
   
387          movq mm1, mm3                   ; y7y6y5y4 -> mm1          movq mm1, mm3                   ; y7y6y5y4 -> mm1
388          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3
   
389          movq mm7, mm2                   ; y3y2y1y0 -> mm7          movq mm7, mm2                   ; y3y2y1y0 -> mm7
   
390          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2
   
391          psraw mm3, SCALEBITS          psraw mm3, SCALEBITS
392          psraw mm2, SCALEBITS          psraw mm2, SCALEBITS
   
393          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2
   
394          movq [TEMP_B2], mm2          movq [TEMP_B2], mm2
   
395          movq mm3, [TEMP_Y2]          movq mm3, [TEMP_Y2]
396          movq mm2, [TEMP_Y1]          movq mm2, [TEMP_Y1]
   
397          movq mm6, mm3                   ; TEMP_Y2 -> mm6          movq mm6, mm3                   ; TEMP_Y2 -> mm6
398          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3
   
399          movq mm4, mm2                   ; TEMP_Y1 -> mm4          movq mm4, mm2                   ; TEMP_Y1 -> mm4
400          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2
   
401          psraw mm3, SCALEBITS          psraw mm3, SCALEBITS
402          psraw mm2, SCALEBITS          psraw mm2, SCALEBITS
   
403          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2
   
404          movq [TEMP_B1], mm2          movq [TEMP_B1], mm2
   
405          movq mm0, mm5          movq mm0, mm5
406          punpckhwd mm5, mm5              ; v3v3v2v2 -> mm5          punpckhwd mm5, mm5              ; v3v3v2v2 -> mm5
407          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm0          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm0
   
408          paddsw mm1, mm5                 ; r7r6r5r4 -> mm1          paddsw mm1, mm5                 ; r7r6r5r4 -> mm1
409          paddsw mm7, mm0                 ; r3r2r1r0 -> mm7          paddsw mm7, mm0                 ; r3r2r1r0 -> mm7
   
410          psraw mm1, SCALEBITS          psraw mm1, SCALEBITS
411          psraw mm7, SCALEBITS          psraw mm7, SCALEBITS
   
412          packuswb mm7, mm1               ; r7r6r5r4r3r2r1r0 -> mm7 (TEMP_R2)          packuswb mm7, mm1               ; r7r6r5r4r3r2r1r0 -> mm7 (TEMP_R2)
   
413          paddsw mm6, mm5                 ; r7r6r5r4 -> mm6          paddsw mm6, mm5                 ; r7r6r5r4 -> mm6
414          paddsw mm4, mm0                 ; r3r2r1r0 -> mm4          paddsw mm4, mm0                 ; r3r2r1r0 -> mm4
   
415          psraw mm6, SCALEBITS          psraw mm6, SCALEBITS
416          psraw mm4, SCALEBITS          psraw mm4, SCALEBITS
   
417          packuswb mm4, mm6               ; r7r6r5r4r3r2r1r0 -> mm4 (TEMP_R1)          packuswb mm4, mm6               ; r7r6r5r4r3r2r1r0 -> mm4 (TEMP_R1)
   
418          movq mm0, [TEMP_B1]          movq mm0, [TEMP_B1]
419          movq mm1, [TEMP_G1]          movq mm1, [TEMP_G1]
   
420          movq mm6, mm7          movq mm6, mm7
   
421          movq mm2, mm0          movq mm2, mm0
422          punpcklbw mm2, mm4              ; r3b3r2b2r1b1r0b0 -> mm2          punpcklbw mm2, mm4              ; r3b3r2b2r1b1r0b0 -> mm2
423          punpckhbw mm0, mm4              ; r7b7r6b6r5b5r4b4 -> mm0          punpckhbw mm0, mm4              ; r7b7r6b6r5b5r4b4 -> mm0
   
424          pxor mm7, mm7          pxor mm7, mm7
   
425          movq mm3, mm1          movq mm3, mm1
426          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1
427          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3
   
428          movq mm4, mm2          movq mm4, mm2
429          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2
430          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4
   
431          movq mm5, mm0          movq mm5, mm0
432          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0
433          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5
   
434  %if %1 == 3             ; BGR (24-bit)  %if %1 == 3             ; BGR (24-bit)
435          movd [edi], mm2          movd [edi], mm2
436          psrlq mm2, 32          psrlq mm2, 32
   
437          movd [edi + 3], mm2          movd [edi + 3], mm2
438          movd [edi + 6], mm4          movd [edi + 6], mm4
   
439          psrlq mm4, 32          psrlq mm4, 32
   
440          movd [edi + 9], mm4          movd [edi + 9], mm4
441          movd [edi + 12], mm0          movd [edi + 12], mm0
   
442          psrlq mm0, 32          psrlq mm0, 32
   
443          movd [edi + 15], mm0          movd [edi + 15], mm0
444          movd [edi + 18], mm5    movq mm2, mm5
445      psrlq mm0, 8              ; 000000r5g5 -> mm0
446          psrlq mm5, 32    psllq mm2, 32             ; 0r6g6b60000 -> mm2
447      psrlq mm5, 32             ; 00000r7g7b7 -> mm5
448          movd [edi + 21], mm5    psrlq mm2, 16             ; 000r6g6b600 -> mm2
449      por mm0, mm2              ; 000r6g6b6r5g5 -> mm0
450      psllq mm5, 40             ; r7g7b700000 -> mm5
451      por mm5, mm0              ; r7g7b7r6g6b6r5g5 -> mm5
452      movq [edi + 16], mm5
453          movq mm0, [TEMP_B2]          movq mm0, [TEMP_B2]
454          movq mm1, [TEMP_G2]          movq mm1, [TEMP_G2]
   
455          movq mm2, mm0          movq mm2, mm0
456          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2
457          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0
   
458          movq mm3, mm1          movq mm3, mm1
459          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1
460          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3
   
461          movq mm4, mm2          movq mm4, mm2
462          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2
463          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4
   
464          movq mm5, mm0          movq mm5, mm0
465          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0
466          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5
   
467          movd [edi+edx], mm2          movd [edi+edx], mm2
468          psrlq mm2, 32          psrlq mm2, 32
   
469          movd [edi+edx + 3], mm2          movd [edi+edx + 3], mm2
470          movd [edi+edx + 6], mm4          movd [edi+edx + 6], mm4
   
471          psrlq mm4, 32          psrlq mm4, 32
   
472          movd [edi+edx + 9], mm4          movd [edi+edx + 9], mm4
473          movd [edi+edx + 12], mm0          movd [edi+edx + 12], mm0
   
474          psrlq mm0, 32          psrlq mm0, 32
   
475          movd [edi+edx + 15], mm0          movd [edi+edx + 15], mm0
476          movd [edi+edx + 18], mm5    movq mm2, mm5
477      psrlq mm0, 8              ; 000000r5g5 -> mm0
478          psrlq mm5, 32    psllq mm2, 32             ; 0r6g6b60000 -> mm2
479      psrlq mm5, 32             ; 00000r7g7b7 -> mm5
480          movd [edi+edx + 21], mm5    psrlq mm2, 16             ; 000r6g6b600 -> mm2
481      por mm0, mm2              ; 000r6g6b6r5g5 -> mm0
482      psllq mm5, 40             ; r7g7b700000 -> mm5
483      por mm5, mm0              ; r7g7b7r6g6b6r5g5 -> mm5
484      movq [edi + edx + 16], mm5
485    
486  %else           ; BGRA (32-bit)  %else           ; BGRA (32-bit)
487          movq [edi], mm2          movq [edi], mm2
488          movq [edi + 8], mm4          movq [edi + 8], mm4
489          movq [edi + 16], mm0          movq [edi + 16], mm0
490          movq [edi + 24], mm5          movq [edi + 24], mm5
   
491          movq mm0, [TEMP_B2]          movq mm0, [TEMP_B2]
492          movq mm1, [TEMP_G2]          movq mm1, [TEMP_G2]
   
493          movq mm2, mm0          movq mm2, mm0
494          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2
495          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0
   
496          movq mm3, mm1          movq mm3, mm1
497          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1
498          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3
   
499          movq mm4, mm2          movq mm4, mm2
500          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2
501          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4
   
502          movq mm5, mm0          movq mm5, mm0
503          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0
504          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5
   
505          movq [edi + edx], mm2          movq [edi + edx], mm2
506          movq [edi + edx + 8], mm4          movq [edi + edx + 8], mm4
507          movq [edi + edx + 16], mm0          movq [edi + edx + 16], mm0
# Line 468  Line 515 
515  %undef TEMP_B1  %undef TEMP_B1
516  %undef TEMP_B2  %undef TEMP_B2
517  %endmacro  %endmacro
 ;------------------------------------------------------------------------------  
518    
519    ;=============================================================================
520    ; Code
521    ;=============================================================================
522    
523    SECTION .text
524    
525    %include "colorspace_mmx.inc"
526    
527  ; input  ; input
   
528  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
529  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
530    MAKE_COLORSPACE  rgb_to_yv12_mmx,0,    3,2,2,  RGB_TO_YV12,  3, -1
531    MAKE_COLORSPACE  rgba_to_yv12_mmx,0,   4,2,2,  RGB_TO_YV12,  4, -1
532    
533  ; output  ; output
   
534  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
535  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
536    

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

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