[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 1192 - (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 1192 ; * $Id: colorspace_yuyv_mmx.asm,v 1.2.2.1 2003-10-28 22:23:03 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 1192 SECTION .rodata
42 : edgomez 851
43 : edgomez 1192 ;-----------------------------------------------------------------------------
44 : edgomez 851 ; yuyv/uyvy mask for extracting yuv components
45 : edgomez 1192 ;-----------------------------------------------------------------------------
46 : edgomez 851 ; y u y v y u y v
47 :    
48 : edgomez 1192 ALIGN 16
49 :     yuyv_mask: db 0xff, 0, 0xff, 0, 0xff, 0, 0xff, 0
50 :     mmx_one: dw 1, 1, 1, 1
51 : edgomez 851
52 : edgomez 1192 ;=============================================================================
53 :     ; helper macros used with colorspace_mmx.inc
54 :     ;=============================================================================
55 : edgomez 851
56 : edgomez 1192 ;-----------------------------------------------------------------------------
57 : edgomez 851 ; YUYV_TO_YV12( TYPE, PAVG )
58 :     ;
59 :     ; TYPE 0=yuyv, 1=uyvy
60 :     ; PAVG 0=mmx, pavgusb=3dnow, pavgb=xmm
61 :     ;
62 :     ; bytes=2, pixels = 8, vpixels=2
63 : edgomez 1192 ;-----------------------------------------------------------------------------
64 :    
65 : edgomez 851 %macro YUYV_TO_YV12_INIT 2
66 : edgomez 1192 movq mm7, [yuyv_mask]
67 : edgomez 851 %endmacro
68 :    
69 :    
70 : edgomez 1192 %macro YUYV_TO_YV12 2
71 :     movq mm0, [edi] ; x_ptr[0]
72 :     movq mm1, [edi + 8] ; x_ptr[8]
73 :     movq mm2, [edi + edx] ; x_ptr[x_stride + 0]
74 :     movq mm3, [edi + edx + 8] ; x_ptr[x_stride + 8]
75 : edgomez 851
76 : edgomez 1192 ; average uv-components
77 : edgomez 851 ;---[ plain mmx ]----------------------------------------------------
78 : edgomez 1192 %ifidn %2,0 ; if (%2 eq "0")
79 :     movq mm4, mm0
80 :     movq mm5, mm2
81 :     %if %1 == 0 ; yuyv
82 :     psrlw mm4, 8
83 :     psrlw mm5, 8
84 : edgomez 851 %endif
85 : edgomez 1192 pand mm4, mm7
86 :     pand mm5, mm7
87 :     paddw mm4, mm5
88 : edgomez 851
89 : edgomez 1192 movq mm5, mm1
90 :     movq mm6, mm3
91 :     %if %1 == 0 ; yuyv
92 :     psrlw mm5, 8
93 :     psrlw mm6, 8
94 : edgomez 851 %endif
95 : edgomez 1192 pand mm5, mm7
96 :     pand mm6, mm7
97 :     paddw mm5, mm6
98 :     paddw mm4, [mmx_one] ; +1 rounding
99 :     paddw mm5, [mmx_one] ;
100 :     psrlw mm4, 1
101 :     psrlw mm5, 1
102 : edgomez 851 ;---[ 3dnow/xmm ]----------------------------------------------------
103 :     %else
104 : edgomez 1192 movq mm4, mm0
105 :     movq mm5, mm1
106 :     %2 mm4, mm2 ;pavgb/pavgusb mm4, mm2
107 :     %2 mm5, mm3 ;pavgb/pavgusb mm5, mm3
108 : edgomez 851
109 : edgomez 1192 ;;movq mm6, mm0 ; 0 rounding
110 :     ;;pxor mm6, mm2 ;
111 :     ;;psubb mm4, mm6 ;
112 :     ;;movq mm6, mm1 ;
113 :     ;;pxor mm6, mm3 ;
114 :     ;;psubb mm5, mm5 ;
115 : edgomez 851
116 : edgomez 1192 %if %1 == 0 ; yuyv
117 :     psrlw mm4, 8
118 :     psrlw mm5, 8
119 : edgomez 851 %endif
120 : edgomez 1192 pand mm4, mm7
121 :     pand mm5, mm7
122 : edgomez 851 %endif
123 :     ;--------------------------------------------------------------------
124 :    
125 : edgomez 1192 ; write y-component
126 :     %if %1 == 1 ; uyvy
127 :     psrlw mm0, 8
128 :     psrlw mm1, 8
129 :     psrlw mm2, 8
130 :     psrlw mm3, 8
131 : edgomez 851 %endif
132 : edgomez 1192 pand mm0, mm7
133 :     pand mm1, mm7
134 :     pand mm2, mm7
135 :     pand mm3, mm7
136 :     packuswb mm0, mm1
137 :     packuswb mm2, mm3
138 : edgomez 851
139 : edgomez 1192 %ifidn %2,pavgb ; xmm
140 :     movntq [esi], mm0
141 :     movntq [esi+eax], mm2
142 :     %else ; plain mmx,3dnow
143 :     movq [esi], mm0
144 :     movq [esi+eax], mm2
145 : edgomez 851 %endif
146 :    
147 : edgomez 1192 ; write uv-components
148 :     packuswb mm4, mm5
149 :     movq mm5, mm4
150 :     psrlq mm4, 8
151 :     pand mm5, mm7
152 :     pand mm4, mm7
153 :     packuswb mm5,mm5
154 :     packuswb mm4,mm4
155 :     movd [ebx],mm5
156 :     movd [ecx],mm4
157 : edgomez 851 %endmacro
158 :    
159 : edgomez 1192 ;-----------------------------------------------------------------------------
160 : edgomez 851 ; YV12_TO_YUYV( TYPE )
161 :     ;
162 : edgomez 1192 ; TYPE 0=yuyv, 1=uyvy
163 : edgomez 851 ;
164 :     ; bytes=2, pixels = 8, vpixels=2
165 : edgomez 1192 ;-----------------------------------------------------------------------------
166 :    
167 :     %macro YV12_TO_YUYV_INIT 2
168 : edgomez 851 %endmacro
169 :    
170 :    
171 : edgomez 1192 %macro YV12_TO_YUYV 2
172 :     movd mm4, [ebx] ; [ |uuuu]
173 :     movd mm5, [ecx] ; [ |vvvv]
174 :     movq mm0, [esi] ; [yyyy|yyyy] ; y row 0
175 :     movq mm1, [esi+eax] ; [yyyy|yyyy] ; y row 1
176 :     punpcklbw mm4, mm5 ; [vuvu|vuvu] ; uv row 0
177 : edgomez 851
178 : edgomez 1192 %if %1 == 0 ; YUYV
179 :     movq mm2, mm0
180 :     movq mm3, mm1
181 :     punpcklbw mm0, mm4 ; [vyuy|vyuy] ; y row 0 + 0
182 :     punpckhbw mm2, mm4 ; [vyuy|vyuy] ; y row 0 + 8
183 :     punpcklbw mm1, mm4 ; [vyuy|vyuy] ; y row 1 + 0
184 :     punpckhbw mm3, mm4 ; [vyuy|vyuy] ; y row 1 + 8
185 :     movq [edi], mm0
186 :     movq [edi+8], mm2
187 :     movq [edi+edx], mm1
188 :     movq [edi+edx+8], mm3
189 :     %else ; UYVY
190 :     movq mm5, mm4
191 :     movq mm6, mm4
192 :     movq mm7, mm4
193 :     punpcklbw mm4, mm0 ; [yvyu|yvyu] ; y row 0 + 0
194 :     punpckhbw mm5, mm0 ; [yvyu|yvyu] ; y row 0 + 8
195 :     punpcklbw mm6, mm1 ; [yvyu|yvyu] ; y row 1 + 0
196 :     punpckhbw mm7, mm1 ; [yvyu|yvyu] ; y row 1 + 8
197 :     movq [edi], mm4
198 :     movq [edi+8], mm5
199 :     movq [edi+edx], mm6
200 :     movq [edi+edx+8], mm7
201 : edgomez 851 %endif
202 :     %endmacro
203 :    
204 :     ;------------------------------------------------------------------------------
205 :     ; YV12_TO_YUYVI( TYPE )
206 :     ;
207 : edgomez 1192 ; TYPE 0=yuyv, 1=uyvy
208 : edgomez 851 ;
209 :     ; bytes=2, pixels = 8, vpixels=4
210 :     ;------------------------------------------------------------------------------
211 : edgomez 1192
212 :     %macro YV12_TO_YUYVI_INIT 2
213 : edgomez 851 %endmacro
214 :    
215 : edgomez 1192 %macro YV12_TO_YUYVI 2
216 :     xchg ebp, [uv_stride]
217 :     movd mm0, [ebx] ; [ |uuuu]
218 :     movd mm1, [ebx+ebp] ; [ |uuuu]
219 :     punpcklbw mm0, [ecx] ; [vuvu|vuvu] ; uv row 0
220 :     punpcklbw mm1, [ecx+ebp] ; [vuvu|vuvu] ; uv row 1
221 :     xchg ebp, [uv_stride]
222 : edgomez 851
223 : edgomez 1192 %if %1 == 0 ; YUYV
224 :     movq mm4, [esi] ; [yyyy|yyyy] ; y row 0
225 :     movq mm6, [esi+eax] ; [yyyy|yyyy] ; y row 1
226 :     movq mm5, mm4
227 :     movq mm7, mm6
228 :     punpcklbw mm4, mm0 ; [yuyv|yuyv] ; y row 0 + 0
229 :     punpckhbw mm5, mm0 ; [yuyv|yuyv] ; y row 0 + 8
230 :     punpcklbw mm6, mm1 ; [yuyv|yuyv] ; y row 1 + 0
231 :     punpckhbw mm7, mm1 ; [yuyv|yuyv] ; y row 1 + 8
232 :     movq [edi], mm4
233 :     movq [edi+8], mm5
234 :     movq [edi+edx], mm6
235 :     movq [edi+edx+8], mm7
236 : edgomez 851
237 : edgomez 1192 push esi
238 :     push edi
239 :     add esi, eax
240 :     add edi, edx
241 :     movq mm4, [esi+eax] ; [yyyy|yyyy] ; y row 2
242 :     movq mm6, [esi+2*eax] ; [yyyy|yyyy] ; y row 3
243 :     movq mm5, mm4
244 :     movq mm7, mm6
245 :     punpcklbw mm4, mm0 ; [yuyv|yuyv] ; y row 2 + 0
246 :     punpckhbw mm5, mm0 ; [yuyv|yuyv] ; y row 2 + 8
247 :     punpcklbw mm6, mm1 ; [yuyv|yuyv] ; y row 3 + 0
248 :     punpckhbw mm7, mm1 ; [yuyv|yuyv] ; y row 3 + 8
249 :     movq [edi+edx], mm4
250 :     movq [edi+edx+8], mm5
251 :     movq [edi+2*edx], mm6
252 :     movq [edi+2*edx+8], mm7
253 :     pop edi
254 :     pop esi
255 :     %else ; UYVY
256 :     movq mm2, [esi] ; [yyyy|yyyy] ; y row 0
257 :     movq mm3, [esi+eax] ; [yyyy|yyyy] ; y row 1
258 :     movq mm4, mm0
259 :     movq mm5, mm0
260 :     movq mm6, mm1
261 :     movq mm7, mm1
262 :     punpcklbw mm4, mm2 ; [uyvy|uyvy] ; y row 0 + 0
263 :     punpckhbw mm5, mm2 ; [uyvy|uyvy] ; y row 0 + 8
264 :     punpcklbw mm6, mm3 ; [uyvy|uyvy] ; y row 1 + 0
265 :     punpckhbw mm7, mm3 ; [uyvy|uyvy] ; y row 1 + 8
266 :     movq [edi], mm4
267 :     movq [edi+8], mm5
268 :     movq [edi+edx], mm6
269 :     movq [edi+edx+8], mm7
270 : edgomez 851
271 : edgomez 1192 push esi
272 :     push edi
273 :     add esi, eax
274 :     add edi, edx
275 :     movq mm2, [esi+eax] ; [yyyy|yyyy] ; y row 2
276 :     movq mm3, [esi+2*eax] ; [yyyy|yyyy] ; y row 3
277 :     movq mm4, mm0
278 :     movq mm5, mm0
279 :     movq mm6, mm1
280 :     movq mm7, mm1
281 :     punpcklbw mm4, mm2 ; [uyvy|uyvy] ; y row 2 + 0
282 :     punpckhbw mm5, mm2 ; [uyvy|uyvy] ; y row 2 + 8
283 :     punpcklbw mm6, mm3 ; [uyvy|uyvy] ; y row 3 + 0
284 :     punpckhbw mm7, mm3 ; [uyvy|uyvy] ; y row 3 + 8
285 :     movq [edi+edx], mm4
286 :     movq [edi+edx+8], mm5
287 :     movq [edi+2*edx], mm6
288 :     movq [edi+2*edx+8], mm7
289 :     pop edi
290 :     pop esi
291 : edgomez 851 %endif
292 :     %endmacro
293 :    
294 : edgomez 1192 ;=============================================================================
295 :     ; Code
296 :     ;=============================================================================
297 : edgomez 851
298 : edgomez 1192 SECTION .text
299 :    
300 :     %include "colorspace_mmx.inc"
301 :    
302 : edgomez 851 ; input
303 :    
304 :     MAKE_COLORSPACE yuyv_to_yv12_mmx,0, 2,8,2, YUYV_TO_YV12, 0, 0
305 :     MAKE_COLORSPACE yuyv_to_yv12_3dn,0, 2,8,2, YUYV_TO_YV12, 0, pavgusb
306 :     MAKE_COLORSPACE yuyv_to_yv12_xmm,0, 2,8,2, YUYV_TO_YV12, 0, pavgb
307 :    
308 :     MAKE_COLORSPACE uyvy_to_yv12_mmx,0, 2,8,2, YUYV_TO_YV12, 1, 0
309 :     MAKE_COLORSPACE uyvy_to_yv12_3dn,0, 2,8,2, YUYV_TO_YV12, 1, pavgusb
310 :     MAKE_COLORSPACE uyvy_to_yv12_xmm,0, 2,8,2, YUYV_TO_YV12, 1, pavgb
311 :    
312 :     ; output
313 :    
314 :     MAKE_COLORSPACE yv12_to_yuyv_mmx,0, 2,8,2, YV12_TO_YUYV, 0, -1
315 :     MAKE_COLORSPACE yv12_to_uyvy_mmx,0, 2,8,2, YV12_TO_YUYV, 1, -1
316 :    
317 :     MAKE_COLORSPACE yv12_to_yuyvi_mmx,0, 2,8,4, YV12_TO_YUYVI, 0, -1
318 :     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