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

Annotation of /trunk/xvidcore/src/image/x86_asm/colorspace_yuyv_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1877 - (view) (download)

1 : edgomez 1382 ;/****************************************************************************
2 : edgomez 851 ; *
3 : edgomez 1382 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - MMX and XMM YUYV<->YV12 conversion -
5 : edgomez 851 ; *
6 : edgomez 1382 ; * Copyright(C) 2002 Peter Ross <pross@xvid.org>
7 : edgomez 851 ; *
8 : edgomez 1382 ; * 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 1382 ; * 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 1382 ; * 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 : Isibaar 1877 ; * $Id: colorspace_yuyv_mmx.asm,v 1.12 2009-09-16 17:07:58 Isibaar Exp $
23 : edgomez 851 ; *
24 : edgomez 1382 ; ***************************************************************************/
25 : edgomez 851
26 : Isibaar 1795 %include "nasm.inc"
27 : edgomez 851
28 : edgomez 1382 ;=============================================================================
29 :     ; Read only data
30 :     ;=============================================================================
31 : edgomez 851
32 : Isibaar 1795 DATA
33 : edgomez 851
34 : edgomez 1382 ;-----------------------------------------------------------------------------
35 : edgomez 851 ; yuyv/uyvy mask for extracting yuv components
36 : edgomez 1382 ;-----------------------------------------------------------------------------
37 : edgomez 851 ; y u y v y u y v
38 :    
39 : Isibaar 1795 ALIGN SECTION_ALIGN
40 : edgomez 1382 yuyv_mask: db 0xff, 0, 0xff, 0, 0xff, 0, 0xff, 0
41 :     mmx_one: dw 1, 1, 1, 1
42 : edgomez 851
43 : edgomez 1382 ;=============================================================================
44 :     ; helper macros used with colorspace_mmx.inc
45 :     ;=============================================================================
46 : edgomez 851
47 : edgomez 1382 ;-----------------------------------------------------------------------------
48 : edgomez 851 ; YUYV_TO_YV12( TYPE, PAVG )
49 :     ;
50 :     ; TYPE 0=yuyv, 1=uyvy
51 :     ; PAVG 0=mmx, pavgusb=3dnow, pavgb=xmm
52 :     ;
53 :     ; bytes=2, pixels = 8, vpixels=2
54 : edgomez 1382 ;-----------------------------------------------------------------------------
55 :    
56 : edgomez 851 %macro YUYV_TO_YV12_INIT 2
57 : edgomez 1382 movq mm7, [yuyv_mask]
58 : edgomez 851 %endmacro
59 :    
60 :    
61 : edgomez 1382 %macro YUYV_TO_YV12 2
62 : Isibaar 1795 movq mm0, [x_ptr] ; x_ptr[0]
63 :     movq mm1, [x_ptr + 8] ; x_ptr[8]
64 :     movq mm2, [x_ptr + x_stride] ; x_ptr[x_stride + 0]
65 :     movq mm3, [x_ptr + x_stride + 8] ; x_ptr[x_stride + 8]
66 : edgomez 851
67 : edgomez 1382 ; average uv-components
68 : edgomez 851 ;---[ plain mmx ]----------------------------------------------------
69 : edgomez 1382 %ifidn %2,0 ; if (%2 eq "0")
70 :     movq mm4, mm0
71 :     movq mm5, mm2
72 :     %if %1 == 0 ; yuyv
73 :     psrlw mm4, 8
74 :     psrlw mm5, 8
75 : edgomez 851 %endif
76 : edgomez 1382 pand mm4, mm7
77 :     pand mm5, mm7
78 :     paddw mm4, mm5
79 : edgomez 851
80 : edgomez 1382 movq mm5, mm1
81 :     movq mm6, mm3
82 :     %if %1 == 0 ; yuyv
83 :     psrlw mm5, 8
84 :     psrlw mm6, 8
85 : edgomez 851 %endif
86 : edgomez 1382 pand mm5, mm7
87 :     pand mm6, mm7
88 :     paddw mm5, mm6
89 :     paddw mm4, [mmx_one] ; +1 rounding
90 :     paddw mm5, [mmx_one] ;
91 :     psrlw mm4, 1
92 :     psrlw mm5, 1
93 : edgomez 851 ;---[ 3dnow/xmm ]----------------------------------------------------
94 :     %else
95 : edgomez 1382 movq mm4, mm0
96 :     movq mm5, mm1
97 :     %2 mm4, mm2 ;pavgb/pavgusb mm4, mm2
98 :     %2 mm5, mm3 ;pavgb/pavgusb mm5, mm3
99 : edgomez 851
100 : edgomez 1382 ;;movq mm6, mm0 ; 0 rounding
101 :     ;;pxor mm6, mm2 ;
102 :     ;;psubb mm4, mm6 ;
103 :     ;;movq mm6, mm1 ;
104 :     ;;pxor mm6, mm3 ;
105 :     ;;psubb mm5, mm5 ;
106 : edgomez 851
107 : edgomez 1382 %if %1 == 0 ; yuyv
108 :     psrlw mm4, 8
109 :     psrlw mm5, 8
110 : edgomez 851 %endif
111 : edgomez 1382 pand mm4, mm7
112 :     pand mm5, mm7
113 : edgomez 851 %endif
114 :     ;--------------------------------------------------------------------
115 :    
116 : edgomez 1382 ; write y-component
117 :     %if %1 == 1 ; uyvy
118 :     psrlw mm0, 8
119 :     psrlw mm1, 8
120 :     psrlw mm2, 8
121 :     psrlw mm3, 8
122 : edgomez 851 %endif
123 : edgomez 1382 pand mm0, mm7
124 :     pand mm1, mm7
125 :     pand mm2, mm7
126 :     pand mm3, mm7
127 :     packuswb mm0, mm1
128 :     packuswb mm2, mm3
129 : edgomez 851
130 : edgomez 1382 %ifidn %2,pavgb ; xmm
131 : Isibaar 1795 movntq [y_ptr], mm0
132 :     movntq [y_ptr+y_stride], mm2
133 : edgomez 1382 %else ; plain mmx,3dnow
134 : Isibaar 1795 movq [y_ptr], mm0
135 :     movq [y_ptr+y_stride], mm2
136 : edgomez 851 %endif
137 :    
138 : edgomez 1382 ; write uv-components
139 :     packuswb mm4, mm5
140 :     movq mm5, mm4
141 :     psrlq mm4, 8
142 :     pand mm5, mm7
143 :     pand mm4, mm7
144 :     packuswb mm5,mm5
145 :     packuswb mm4,mm4
146 : Isibaar 1795 movd [u_ptr],mm5
147 :     movd [v_ptr],mm4
148 : edgomez 851 %endmacro
149 :    
150 : edgomez 1382 ;-----------------------------------------------------------------------------
151 : edgomez 851 ; YV12_TO_YUYV( TYPE )
152 :     ;
153 : Skal 1706 ; bytes=2, pixels = 16, vpixels=2
154 : edgomez 1382 ;-----------------------------------------------------------------------------
155 :    
156 :     %macro YV12_TO_YUYV_INIT 2
157 : edgomez 851 %endmacro
158 :    
159 :    
160 : edgomez 1382 %macro YV12_TO_YUYV 2
161 : Isibaar 1795 movq mm6, [u_ptr] ; [ |uuuu]
162 :     movq mm2, [v_ptr] ; [ |vvvv]
163 :     movq mm0, [y_ptr ] ; [yyyy|yyyy] ; y row 0
164 :     movq mm1, [y_ptr+y_stride] ; [yyyy|yyyy] ; y row 1
165 : Skal 1706 movq mm7, mm6
166 :     punpcklbw mm6, mm2 ; [vuvu|vuvu] ; uv[0..3]
167 :     punpckhbw mm7, mm2 ; [vuvu|vuvu] ; uv[4..7]
168 : edgomez 851
169 : edgomez 1382 %if %1 == 0 ; YUYV
170 :     movq mm2, mm0
171 :     movq mm3, mm1
172 : Isibaar 1795 movq mm4, [y_ptr +8] ; [yyyy|yyyy] ; y[8..15] row 0
173 :     movq mm5, [y_ptr+y_stride+8] ; [yyyy|yyyy] ; y[8..15] row 1
174 : Skal 1706 punpcklbw mm0, mm6 ; [vyuy|vyuy] ; y row 0 + 0
175 :     punpckhbw mm2, mm6 ; [vyuy|vyuy] ; y row 0 + 8
176 :     punpcklbw mm1, mm6 ; [vyuy|vyuy] ; y row 1 + 0
177 :     punpckhbw mm3, mm6 ; [vyuy|vyuy] ; y row 1 + 8
178 : Isibaar 1795 movq [x_ptr ], mm0
179 :     movq [x_ptr+8 ], mm2
180 :     movq [x_ptr+x_stride ], mm1
181 :     movq [x_ptr+x_stride+8], mm3
182 : Skal 1706 movq mm0, mm4
183 :     movq mm2, mm5
184 :     punpcklbw mm0, mm7 ; [vyuy|vyuy] ; y row 0 + 16
185 :     punpckhbw mm4, mm7 ; [vyuy|vyuy] ; y row 0 + 24
186 :     punpcklbw mm2, mm7 ; [vyuy|vyuy] ; y row 1 + 16
187 :     punpckhbw mm5, mm7 ; [vyuy|vyuy] ; y row 1 + 24
188 : Isibaar 1795 movq [x_ptr +16], mm0
189 :     movq [x_ptr +24], mm4
190 :     movq [x_ptr+x_stride+16], mm2
191 :     movq [x_ptr+x_stride+24], mm5
192 : edgomez 1382 %else ; UYVY
193 : Skal 1706 movq mm2, mm6
194 :     movq mm3, mm6
195 :     movq mm4, mm6
196 :     punpcklbw mm2, mm0 ; [yvyu|yvyu] ; y row 0 + 0
197 :     punpckhbw mm3, mm0 ; [yvyu|yvyu] ; y row 0 + 8
198 : Isibaar 1795 movq mm0, [y_ptr +8] ; [yyyy|yyyy] ; y[8..15] row 0
199 :     movq mm5, [y_ptr+y_stride+8] ; [yyyy|yyyy] ; y[8..15] row 1
200 : Skal 1706 punpcklbw mm4, mm1 ; [yvyu|yvyu] ; y row 1 + 0
201 :     punpckhbw mm6, mm1 ; [yvyu|yvyu] ; y row 1 + 8
202 : Isibaar 1795 movq [x_ptr ], mm2
203 :     movq [x_ptr +8], mm3
204 :     movq [x_ptr+x_stride ], mm4
205 :     movq [x_ptr+x_stride+8], mm6
206 : Skal 1706 movq mm2, mm7
207 :     movq mm3, mm7
208 :     movq mm6, mm7
209 :     punpcklbw mm2, mm0 ; [yvyu|yvyu] ; y row 0 + 0
210 :     punpckhbw mm3, mm0 ; [yvyu|yvyu] ; y row 0 + 8
211 :     punpcklbw mm6, mm5 ; [yvyu|yvyu] ; y row 1 + 0
212 :     punpckhbw mm7, mm5 ; [yvyu|yvyu] ; y row 1 + 8
213 : Isibaar 1795 movq [x_ptr +16], mm2
214 :     movq [x_ptr +24], mm3
215 :     movq [x_ptr+x_stride+16], mm6
216 :     movq [x_ptr+x_stride+24], mm7
217 : edgomez 851 %endif
218 :     %endmacro
219 :    
220 :     ;------------------------------------------------------------------------------
221 :     ; YV12_TO_YUYVI( TYPE )
222 :     ;
223 : edgomez 1382 ; TYPE 0=yuyv, 1=uyvy
224 : edgomez 851 ;
225 :     ; bytes=2, pixels = 8, vpixels=4
226 :     ;------------------------------------------------------------------------------
227 : edgomez 1382
228 :     %macro YV12_TO_YUYVI_INIT 2
229 : edgomez 851 %endmacro
230 :    
231 : edgomez 1382 %macro YV12_TO_YUYVI 2
232 : Isibaar 1795 %ifdef ARCH_IS_X86_64
233 :     mov TMP1d, prm_uv_stride
234 :     movd mm0, [u_ptr] ; [ |uuuu]
235 :     movd mm1, [u_ptr+TMP1] ; [ |uuuu]
236 :     punpcklbw mm0, [v_ptr] ; [vuvu|vuvu] ; uv row 0
237 :     punpcklbw mm1, [v_ptr+TMP1] ; [vuvu|vuvu] ; uv row 1
238 :     %else
239 :     xchg width, prm_uv_stride
240 :     movd mm0, [u_ptr] ; [ |uuuu]
241 :     movd mm1, [u_ptr+width] ; [ |uuuu]
242 :     punpcklbw mm0, [v_ptr] ; [vuvu|vuvu] ; uv row 0
243 :     punpcklbw mm1, [v_ptr+width] ; [vuvu|vuvu] ; uv row 1
244 :     xchg width, prm_uv_stride
245 :     %endif
246 : edgomez 851
247 : edgomez 1382 %if %1 == 0 ; YUYV
248 : Isibaar 1795 movq mm4, [y_ptr] ; [yyyy|yyyy] ; y row 0
249 :     movq mm6, [y_ptr+y_stride] ; [yyyy|yyyy] ; y row 1
250 : edgomez 1382 movq mm5, mm4
251 :     movq mm7, mm6
252 :     punpcklbw mm4, mm0 ; [yuyv|yuyv] ; y row 0 + 0
253 :     punpckhbw mm5, mm0 ; [yuyv|yuyv] ; y row 0 + 8
254 :     punpcklbw mm6, mm1 ; [yuyv|yuyv] ; y row 1 + 0
255 :     punpckhbw mm7, mm1 ; [yuyv|yuyv] ; y row 1 + 8
256 : Isibaar 1795 movq [x_ptr], mm4
257 :     movq [x_ptr+8], mm5
258 :     movq [x_ptr+x_stride], mm6
259 :     movq [x_ptr+x_stride+8], mm7
260 : edgomez 851
261 : Isibaar 1795 push y_ptr
262 :     push x_ptr
263 :     add y_ptr, y_stride
264 :     add x_ptr, x_stride
265 :     movq mm4, [y_ptr+y_stride] ; [yyyy|yyyy] ; y row 2
266 :     movq mm6, [y_ptr+2*y_stride] ; [yyyy|yyyy] ; y row 3
267 : edgomez 1382 movq mm5, mm4
268 :     movq mm7, mm6
269 :     punpcklbw mm4, mm0 ; [yuyv|yuyv] ; y row 2 + 0
270 :     punpckhbw mm5, mm0 ; [yuyv|yuyv] ; y row 2 + 8
271 :     punpcklbw mm6, mm1 ; [yuyv|yuyv] ; y row 3 + 0
272 :     punpckhbw mm7, mm1 ; [yuyv|yuyv] ; y row 3 + 8
273 : Isibaar 1795 movq [x_ptr+x_stride], mm4
274 :     movq [x_ptr+x_stride+8], mm5
275 :     movq [x_ptr+2*x_stride], mm6
276 :     movq [x_ptr+2*x_stride+8], mm7
277 :     pop x_ptr
278 :     pop y_ptr
279 : edgomez 1382 %else ; UYVY
280 : Isibaar 1795 movq mm2, [y_ptr] ; [yyyy|yyyy] ; y row 0
281 :     movq mm3, [y_ptr+y_stride] ; [yyyy|yyyy] ; y row 1
282 : edgomez 1382 movq mm4, mm0
283 :     movq mm5, mm0
284 :     movq mm6, mm1
285 :     movq mm7, mm1
286 :     punpcklbw mm4, mm2 ; [uyvy|uyvy] ; y row 0 + 0
287 :     punpckhbw mm5, mm2 ; [uyvy|uyvy] ; y row 0 + 8
288 :     punpcklbw mm6, mm3 ; [uyvy|uyvy] ; y row 1 + 0
289 :     punpckhbw mm7, mm3 ; [uyvy|uyvy] ; y row 1 + 8
290 : Isibaar 1795 movq [x_ptr], mm4
291 :     movq [x_ptr+8], mm5
292 :     movq [x_ptr+x_stride], mm6
293 :     movq [x_ptr+x_stride+8], mm7
294 : edgomez 851
295 : Isibaar 1795 push y_ptr
296 :     push x_ptr
297 :     add y_ptr, y_stride
298 :     add x_ptr, x_stride
299 :     movq mm2, [y_ptr+y_stride] ; [yyyy|yyyy] ; y row 2
300 :     movq mm3, [y_ptr+2*y_stride] ; [yyyy|yyyy] ; y row 3
301 : edgomez 1382 movq mm4, mm0
302 :     movq mm5, mm0
303 :     movq mm6, mm1
304 :     movq mm7, mm1
305 :     punpcklbw mm4, mm2 ; [uyvy|uyvy] ; y row 2 + 0
306 :     punpckhbw mm5, mm2 ; [uyvy|uyvy] ; y row 2 + 8
307 :     punpcklbw mm6, mm3 ; [uyvy|uyvy] ; y row 3 + 0
308 :     punpckhbw mm7, mm3 ; [uyvy|uyvy] ; y row 3 + 8
309 : Isibaar 1795 movq [x_ptr+x_stride], mm4
310 :     movq [x_ptr+x_stride+8], mm5
311 :     movq [x_ptr+2*x_stride], mm6
312 :     movq [x_ptr+2*x_stride+8], mm7
313 :     pop x_ptr
314 :     pop y_ptr
315 : edgomez 851 %endif
316 :     %endmacro
317 :    
318 : edgomez 1382 ;=============================================================================
319 :     ; Code
320 :     ;=============================================================================
321 : edgomez 851
322 : Isibaar 1844 TEXT
323 : edgomez 1382
324 :     %include "colorspace_mmx.inc"
325 :    
326 : edgomez 851 ; input
327 :    
328 :     MAKE_COLORSPACE yuyv_to_yv12_mmx,0, 2,8,2, YUYV_TO_YV12, 0, 0
329 :     MAKE_COLORSPACE yuyv_to_yv12_3dn,0, 2,8,2, YUYV_TO_YV12, 0, pavgusb
330 :     MAKE_COLORSPACE yuyv_to_yv12_xmm,0, 2,8,2, YUYV_TO_YV12, 0, pavgb
331 :    
332 :     MAKE_COLORSPACE uyvy_to_yv12_mmx,0, 2,8,2, YUYV_TO_YV12, 1, 0
333 :     MAKE_COLORSPACE uyvy_to_yv12_3dn,0, 2,8,2, YUYV_TO_YV12, 1, pavgusb
334 :     MAKE_COLORSPACE uyvy_to_yv12_xmm,0, 2,8,2, YUYV_TO_YV12, 1, pavgb
335 :    
336 :     ; output
337 :    
338 : Skal 1706 MAKE_COLORSPACE yv12_to_yuyv_mmx,0, 2,16,2, YV12_TO_YUYV, 0, -1
339 :     MAKE_COLORSPACE yv12_to_uyvy_mmx,0, 2,16,2, YV12_TO_YUYV, 1, -1
340 : edgomez 851
341 :     MAKE_COLORSPACE yv12_to_yuyvi_mmx,0, 2,8,4, YV12_TO_YUYVI, 0, -1
342 :     MAKE_COLORSPACE yv12_to_uyvyi_mmx,0, 2,8,4, YV12_TO_YUYVI, 1, -1
343 : Isibaar 1790
344 : Isibaar 1877 NON_EXEC_STACK

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