[svn] / branches / dev-api-4 / xvidcore / src / image / x86_asm / colorspace_yuyv_mmx.asm Repository:
ViewVC logotype

Annotation of /branches/dev-api-4/xvidcore/src/image/x86_asm/colorspace_yuyv_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1198 - (view) (download)

1 : edgomez 1192 ;/****************************************************************************
2 : edgomez 851 ; *
3 : edgomez 1192 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - MMX and XMM YUYV<->YV12 conversion -
5 : edgomez 851 ; *
6 : edgomez 1192 ; * Copyright(C) 2002 Peter Ross <pross@xvid.org>
7 : edgomez 851 ; *
8 : edgomez 1192 ; * This program is free software; you can redistribute it and/or modify it
9 :     ; * under the terms of the GNU General Public License as published by
10 :     ; * the Free Software Foundation; either version 2 of the License, or
11 :     ; * (at your option) any later version.
12 : edgomez 851 ; *
13 : edgomez 1192 ; * This program is distributed in the hope that it will be useful,
14 :     ; * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 :     ; * GNU General Public License for more details.
17 : edgomez 851 ; *
18 : edgomez 1192 ; * You should have received a copy of the GNU General Public License
19 :     ; * along with this program; if not, write to the Free Software
20 :     ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 : edgomez 851 ; *
22 : edgomez 1198 ; * $Id: colorspace_yuyv_mmx.asm,v 1.2.2.2 2003-11-03 15:51:50 edgomez Exp $
23 : edgomez 851 ; *
24 : edgomez 1192 ; ***************************************************************************/
25 : edgomez 851
26 : edgomez 1192 BITS 32
27 : edgomez 851
28 : edgomez 1192 %macro cglobal 1
29 : edgomez 851 %ifdef PREFIX
30 : edgomez 1192 global _%1
31 : edgomez 851 %define %1 _%1
32 :     %else
33 :     global %1
34 :     %endif
35 :     %endmacro
36 :    
37 : edgomez 1192 ;=============================================================================
38 :     ; Read only data
39 :     ;=============================================================================
40 : edgomez 851
41 : edgomez 1198 %ifdef FORMAT_COFF
42 :     SECTION .rodata data
43 :     %else
44 :     SECTION .rodata data align=16
45 :     %endif
46 : edgomez 851
47 : edgomez 1192 ;-----------------------------------------------------------------------------
48 : edgomez 851 ; yuyv/uyvy mask for extracting yuv components
49 : edgomez 1192 ;-----------------------------------------------------------------------------
50 : edgomez 851 ; y u y v y u y v
51 :    
52 : edgomez 1192 ALIGN 16
53 :     yuyv_mask: db 0xff, 0, 0xff, 0, 0xff, 0, 0xff, 0
54 :     mmx_one: dw 1, 1, 1, 1
55 : edgomez 851
56 : edgomez 1192 ;=============================================================================
57 :     ; helper macros used with colorspace_mmx.inc
58 :     ;=============================================================================
59 : edgomez 851
60 : edgomez 1192 ;-----------------------------------------------------------------------------
61 : edgomez 851 ; YUYV_TO_YV12( TYPE, PAVG )
62 :     ;
63 :     ; TYPE 0=yuyv, 1=uyvy
64 :     ; PAVG 0=mmx, pavgusb=3dnow, pavgb=xmm
65 :     ;
66 :     ; bytes=2, pixels = 8, vpixels=2
67 : edgomez 1192 ;-----------------------------------------------------------------------------
68 :    
69 : edgomez 851 %macro YUYV_TO_YV12_INIT 2
70 : edgomez 1192 movq mm7, [yuyv_mask]
71 : edgomez 851 %endmacro
72 :    
73 :    
74 : edgomez 1192 %macro YUYV_TO_YV12 2
75 :     movq mm0, [edi] ; x_ptr[0]
76 :     movq mm1, [edi + 8] ; x_ptr[8]
77 :     movq mm2, [edi + edx] ; x_ptr[x_stride + 0]
78 :     movq mm3, [edi + edx + 8] ; x_ptr[x_stride + 8]
79 : edgomez 851
80 : edgomez 1192 ; average uv-components
81 : edgomez 851 ;---[ plain mmx ]----------------------------------------------------
82 : edgomez 1192 %ifidn %2,0 ; if (%2 eq "0")
83 :     movq mm4, mm0
84 :     movq mm5, mm2
85 :     %if %1 == 0 ; yuyv
86 :     psrlw mm4, 8
87 :     psrlw mm5, 8
88 : edgomez 851 %endif
89 : edgomez 1192 pand mm4, mm7
90 :     pand mm5, mm7
91 :     paddw mm4, mm5
92 : edgomez 851
93 : edgomez 1192 movq mm5, mm1
94 :     movq mm6, mm3
95 :     %if %1 == 0 ; yuyv
96 :     psrlw mm5, 8
97 :     psrlw mm6, 8
98 : edgomez 851 %endif
99 : edgomez 1192 pand mm5, mm7
100 :     pand mm6, mm7
101 :     paddw mm5, mm6
102 :     paddw mm4, [mmx_one] ; +1 rounding
103 :     paddw mm5, [mmx_one] ;
104 :     psrlw mm4, 1
105 :     psrlw mm5, 1
106 : edgomez 851 ;---[ 3dnow/xmm ]----------------------------------------------------
107 :     %else
108 : edgomez 1192 movq mm4, mm0
109 :     movq mm5, mm1
110 :     %2 mm4, mm2 ;pavgb/pavgusb mm4, mm2
111 :     %2 mm5, mm3 ;pavgb/pavgusb mm5, mm3
112 : edgomez 851
113 : edgomez 1192 ;;movq mm6, mm0 ; 0 rounding
114 :     ;;pxor mm6, mm2 ;
115 :     ;;psubb mm4, mm6 ;
116 :     ;;movq mm6, mm1 ;
117 :     ;;pxor mm6, mm3 ;
118 :     ;;psubb mm5, mm5 ;
119 : edgomez 851
120 : edgomez 1192 %if %1 == 0 ; yuyv
121 :     psrlw mm4, 8
122 :     psrlw mm5, 8
123 : edgomez 851 %endif
124 : edgomez 1192 pand mm4, mm7
125 :     pand mm5, mm7
126 : edgomez 851 %endif
127 :     ;--------------------------------------------------------------------
128 :    
129 : edgomez 1192 ; write y-component
130 :     %if %1 == 1 ; uyvy
131 :     psrlw mm0, 8
132 :     psrlw mm1, 8
133 :     psrlw mm2, 8
134 :     psrlw mm3, 8
135 : edgomez 851 %endif
136 : edgomez 1192 pand mm0, mm7
137 :     pand mm1, mm7
138 :     pand mm2, mm7
139 :     pand mm3, mm7
140 :     packuswb mm0, mm1
141 :     packuswb mm2, mm3
142 : edgomez 851
143 : edgomez 1192 %ifidn %2,pavgb ; xmm
144 :     movntq [esi], mm0
145 :     movntq [esi+eax], mm2
146 :     %else ; plain mmx,3dnow
147 :     movq [esi], mm0
148 :     movq [esi+eax], mm2
149 : edgomez 851 %endif
150 :    
151 : edgomez 1192 ; write uv-components
152 :     packuswb mm4, mm5
153 :     movq mm5, mm4
154 :     psrlq mm4, 8
155 :     pand mm5, mm7
156 :     pand mm4, mm7
157 :     packuswb mm5,mm5
158 :     packuswb mm4,mm4
159 :     movd [ebx],mm5
160 :     movd [ecx],mm4
161 : edgomez 851 %endmacro
162 :    
163 : edgomez 1192 ;-----------------------------------------------------------------------------
164 : edgomez 851 ; YV12_TO_YUYV( TYPE )
165 :     ;
166 : edgomez 1192 ; TYPE 0=yuyv, 1=uyvy
167 : edgomez 851 ;
168 :     ; bytes=2, pixels = 8, vpixels=2
169 : edgomez 1192 ;-----------------------------------------------------------------------------
170 :    
171 :     %macro YV12_TO_YUYV_INIT 2
172 : edgomez 851 %endmacro
173 :    
174 :    
175 : edgomez 1192 %macro YV12_TO_YUYV 2
176 :     movd mm4, [ebx] ; [ |uuuu]
177 :     movd mm5, [ecx] ; [ |vvvv]
178 :     movq mm0, [esi] ; [yyyy|yyyy] ; y row 0
179 :     movq mm1, [esi+eax] ; [yyyy|yyyy] ; y row 1
180 :     punpcklbw mm4, mm5 ; [vuvu|vuvu] ; uv row 0
181 : edgomez 851
182 : edgomez 1192 %if %1 == 0 ; YUYV
183 :     movq mm2, mm0
184 :     movq mm3, mm1
185 :     punpcklbw mm0, mm4 ; [vyuy|vyuy] ; y row 0 + 0
186 :     punpckhbw mm2, mm4 ; [vyuy|vyuy] ; y row 0 + 8
187 :     punpcklbw mm1, mm4 ; [vyuy|vyuy] ; y row 1 + 0
188 :     punpckhbw mm3, mm4 ; [vyuy|vyuy] ; y row 1 + 8
189 :     movq [edi], mm0
190 :     movq [edi+8], mm2
191 :     movq [edi+edx], mm1
192 :     movq [edi+edx+8], mm3
193 :     %else ; UYVY
194 :     movq mm5, mm4
195 :     movq mm6, mm4
196 :     movq mm7, mm4
197 :     punpcklbw mm4, mm0 ; [yvyu|yvyu] ; y row 0 + 0
198 :     punpckhbw mm5, mm0 ; [yvyu|yvyu] ; y row 0 + 8
199 :     punpcklbw mm6, mm1 ; [yvyu|yvyu] ; y row 1 + 0
200 :     punpckhbw mm7, mm1 ; [yvyu|yvyu] ; y row 1 + 8
201 :     movq [edi], mm4
202 :     movq [edi+8], mm5
203 :     movq [edi+edx], mm6
204 :     movq [edi+edx+8], mm7
205 : edgomez 851 %endif
206 :     %endmacro
207 :    
208 :     ;------------------------------------------------------------------------------
209 :     ; YV12_TO_YUYVI( TYPE )
210 :     ;
211 : edgomez 1192 ; TYPE 0=yuyv, 1=uyvy
212 : edgomez 851 ;
213 :     ; bytes=2, pixels = 8, vpixels=4
214 :     ;------------------------------------------------------------------------------
215 : edgomez 1192
216 :     %macro YV12_TO_YUYVI_INIT 2
217 : edgomez 851 %endmacro
218 :    
219 : edgomez 1192 %macro YV12_TO_YUYVI 2
220 :     xchg ebp, [uv_stride]
221 :     movd mm0, [ebx] ; [ |uuuu]
222 :     movd mm1, [ebx+ebp] ; [ |uuuu]
223 :     punpcklbw mm0, [ecx] ; [vuvu|vuvu] ; uv row 0
224 :     punpcklbw mm1, [ecx+ebp] ; [vuvu|vuvu] ; uv row 1
225 :     xchg ebp, [uv_stride]
226 : edgomez 851
227 : edgomez 1192 %if %1 == 0 ; YUYV
228 :     movq mm4, [esi] ; [yyyy|yyyy] ; y row 0
229 :     movq mm6, [esi+eax] ; [yyyy|yyyy] ; y row 1
230 :     movq mm5, mm4
231 :     movq mm7, mm6
232 :     punpcklbw mm4, mm0 ; [yuyv|yuyv] ; y row 0 + 0
233 :     punpckhbw mm5, mm0 ; [yuyv|yuyv] ; y row 0 + 8
234 :     punpcklbw mm6, mm1 ; [yuyv|yuyv] ; y row 1 + 0
235 :     punpckhbw mm7, mm1 ; [yuyv|yuyv] ; y row 1 + 8
236 :     movq [edi], mm4
237 :     movq [edi+8], mm5
238 :     movq [edi+edx], mm6
239 :     movq [edi+edx+8], mm7
240 : edgomez 851
241 : edgomez 1192 push esi
242 :     push edi
243 :     add esi, eax
244 :     add edi, edx
245 :     movq mm4, [esi+eax] ; [yyyy|yyyy] ; y row 2
246 :     movq mm6, [esi+2*eax] ; [yyyy|yyyy] ; y row 3
247 :     movq mm5, mm4
248 :     movq mm7, mm6
249 :     punpcklbw mm4, mm0 ; [yuyv|yuyv] ; y row 2 + 0
250 :     punpckhbw mm5, mm0 ; [yuyv|yuyv] ; y row 2 + 8
251 :     punpcklbw mm6, mm1 ; [yuyv|yuyv] ; y row 3 + 0
252 :     punpckhbw mm7, mm1 ; [yuyv|yuyv] ; y row 3 + 8
253 :     movq [edi+edx], mm4
254 :     movq [edi+edx+8], mm5
255 :     movq [edi+2*edx], mm6
256 :     movq [edi+2*edx+8], mm7
257 :     pop edi
258 :     pop esi
259 :     %else ; UYVY
260 :     movq mm2, [esi] ; [yyyy|yyyy] ; y row 0
261 :     movq mm3, [esi+eax] ; [yyyy|yyyy] ; y row 1
262 :     movq mm4, mm0
263 :     movq mm5, mm0
264 :     movq mm6, mm1
265 :     movq mm7, mm1
266 :     punpcklbw mm4, mm2 ; [uyvy|uyvy] ; y row 0 + 0
267 :     punpckhbw mm5, mm2 ; [uyvy|uyvy] ; y row 0 + 8
268 :     punpcklbw mm6, mm3 ; [uyvy|uyvy] ; y row 1 + 0
269 :     punpckhbw mm7, mm3 ; [uyvy|uyvy] ; y row 1 + 8
270 :     movq [edi], mm4
271 :     movq [edi+8], mm5
272 :     movq [edi+edx], mm6
273 :     movq [edi+edx+8], mm7
274 : edgomez 851
275 : edgomez 1192 push esi
276 :     push edi
277 :     add esi, eax
278 :     add edi, edx
279 :     movq mm2, [esi+eax] ; [yyyy|yyyy] ; y row 2
280 :     movq mm3, [esi+2*eax] ; [yyyy|yyyy] ; y row 3
281 :     movq mm4, mm0
282 :     movq mm5, mm0
283 :     movq mm6, mm1
284 :     movq mm7, mm1
285 :     punpcklbw mm4, mm2 ; [uyvy|uyvy] ; y row 2 + 0
286 :     punpckhbw mm5, mm2 ; [uyvy|uyvy] ; y row 2 + 8
287 :     punpcklbw mm6, mm3 ; [uyvy|uyvy] ; y row 3 + 0
288 :     punpckhbw mm7, mm3 ; [uyvy|uyvy] ; y row 3 + 8
289 :     movq [edi+edx], mm4
290 :     movq [edi+edx+8], mm5
291 :     movq [edi+2*edx], mm6
292 :     movq [edi+2*edx+8], mm7
293 :     pop edi
294 :     pop esi
295 : edgomez 851 %endif
296 :     %endmacro
297 :    
298 : edgomez 1192 ;=============================================================================
299 :     ; Code
300 :     ;=============================================================================
301 : edgomez 851
302 : edgomez 1192 SECTION .text
303 :    
304 :     %include "colorspace_mmx.inc"
305 :    
306 : edgomez 851 ; input
307 :    
308 :     MAKE_COLORSPACE yuyv_to_yv12_mmx,0, 2,8,2, YUYV_TO_YV12, 0, 0
309 :     MAKE_COLORSPACE yuyv_to_yv12_3dn,0, 2,8,2, YUYV_TO_YV12, 0, pavgusb
310 :     MAKE_COLORSPACE yuyv_to_yv12_xmm,0, 2,8,2, YUYV_TO_YV12, 0, pavgb
311 :    
312 :     MAKE_COLORSPACE uyvy_to_yv12_mmx,0, 2,8,2, YUYV_TO_YV12, 1, 0
313 :     MAKE_COLORSPACE uyvy_to_yv12_3dn,0, 2,8,2, YUYV_TO_YV12, 1, pavgusb
314 :     MAKE_COLORSPACE uyvy_to_yv12_xmm,0, 2,8,2, YUYV_TO_YV12, 1, pavgb
315 :    
316 :     ; output
317 :    
318 :     MAKE_COLORSPACE yv12_to_yuyv_mmx,0, 2,8,2, YV12_TO_YUYV, 0, -1
319 :     MAKE_COLORSPACE yv12_to_uyvy_mmx,0, 2,8,2, YV12_TO_YUYV, 1, -1
320 :    
321 :     MAKE_COLORSPACE yv12_to_yuyvi_mmx,0, 2,8,4, YV12_TO_YUYVI, 0, -1
322 :     MAKE_COLORSPACE yv12_to_uyvyi_mmx,0, 2,8,4, YV12_TO_YUYVI, 1, -1

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