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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 886 - (view) (download)

1 : edgomez 851 ;/**************************************************************************
2 : Isibaar 3 ; *
3 : edgomez 851 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * mmx yuyv/uyvy to yuv planar
5 : Isibaar 3 ; *
6 : edgomez 851 ; * This program is free software; you can redistribute it and/or modify
7 :     ; * it under the terms of the GNU General Public License as published by
8 :     ; * the Free Software Foundation; either version 2 of the License, or
9 :     ; * (at your option) any later version.
10 : Isibaar 3 ; *
11 : edgomez 851 ; * This program is distributed in the hope that it will be useful,
12 :     ; * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 :     ; * GNU General Public License for more details.
15 : Isibaar 3 ; *
16 : edgomez 851 ; * You should have received a copy of the GNU General Public License
17 :     ; * along with this program; if not, write to the Free Software
18 :     ; * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 : Isibaar 3 ; *
20 : edgomez 851 ; *************************************************************************/
21 :    
22 :     ;/**************************************************************************
23 : Isibaar 3 ; *
24 : edgomez 851 ; * History:
25 : Isibaar 3 ; *
26 : edgomez 851 ; * 30.11.2001 initial version; (c)2001 peter ross <pross@cs.rmit.edu.au>
27 : edgomez 651 ; *
28 : edgomez 851 ; *************************************************************************/
29 : Isibaar 3
30 :     bits 32
31 :    
32 :    
33 :     section .data
34 :    
35 :     %macro cglobal 1
36 :     %ifdef PREFIX
37 :     global _%1
38 :     %define %1 _%1
39 :     %else
40 :     global %1
41 :     %endif
42 :     %endmacro
43 :    
44 :     align 16
45 :    
46 :    
47 :     section .data
48 :    
49 :    
50 :     ;===========================================================================
51 :     ; masks for extracting yuv components
52 :     ;===========================================================================
53 :     ; y u y v y u y v
54 :    
55 :     mask1 db 0xff, 0, 0xff, 0, 0xff, 0, 0xff, 0
56 :     mask2 db 0, 0xff, 0, 0xff, 0, 0xff, 0, 0xff
57 :    
58 :    
59 :     section .text
60 :    
61 :     ;===========================================================================
62 :     ;
63 :     ; void yuyv_to_yv12_mmx(uint8_t * const y_out,
64 :     ; uint8_t * const u_out,
65 :     ; uint8_t * const v_out,
66 :     ; const uint8_t * const src,
67 :     ; const uint32_t width,
68 :     ; const uint32_t height,
69 :     ; const uint32_t stride);
70 :     ;
71 :     ; width must be multiple of 8
72 :     ; does not flip
73 :     ; ~30% faster than plain c
74 :     ;
75 :     ;===========================================================================
76 :    
77 :     align 16
78 :     cglobal yuyv_to_yv12_mmx
79 :     yuyv_to_yv12_mmx
80 :    
81 :     push ebx
82 :     push ecx
83 :     push esi
84 :     push edi
85 :     push ebp ; STACK BASE = 20
86 :    
87 :     ; some global consants
88 :    
89 :     mov ecx, [esp + 20 + 20] ; width
90 :     mov eax, [esp + 20 + 28] ; stride
91 :     sub eax, ecx ; eax = stride - width
92 :     mov edx, eax
93 :     add edx, [esp + 20 + 28] ; edx = y_dif + stride
94 :     push edx ; [esp + 12] = y_dif
95 :    
96 :     shr eax, 1
97 :     push eax ; [esp + 8] = uv_dif
98 :    
99 :     shr ecx, 3
100 :     push ecx ; [esp + 4] = width/8
101 :    
102 :     sub esp, 4 ; [esp + 0] = tmp_height_counter
103 :     ; STACK_BASE = 36
104 :    
105 :     movq mm6, [mask1]
106 :     movq mm7, [mask2]
107 :    
108 :     mov edi, [esp + 36 + 4] ; y_out
109 :     mov ebx, [esp + 36 + 8] ; u_out
110 :     mov edx, [esp + 36 + 12] ; v_out
111 :     mov esi, [esp + 36 + 16] ; src
112 :    
113 :     mov eax, [esp + 36 + 20]
114 :     mov ebp, [esp + 36 + 24]
115 :     mov ecx, [esp + 36 + 28] ; ecx = stride
116 :     shr ebp, 1 ; ebp = height /= 2
117 :     add eax, eax ; eax = 2 * width
118 :    
119 :     .yloop
120 :     mov [esp], ebp
121 :     mov ebp, [esp + 4] ; width/8
122 :     .xloop
123 :     movq mm2, [esi] ; y 1st row
124 :     movq mm3, [esi + 8]
125 :     movq mm0, mm2
126 :     movq mm1, mm3
127 :     pand mm2, mm6 ; mask1
128 :     pand mm3, mm6 ; mask1
129 :     pand mm0, mm7 ; mask2
130 :     pand mm1, mm7 ; mask2
131 :     packuswb mm2, mm3
132 :     psrlq mm0, 8
133 :     psrlq mm1, 8
134 :     movq [edi], mm2
135 :    
136 :     movq mm4, [esi + eax] ; y 2nd row
137 :     movq mm5, [esi + eax + 8]
138 :     movq mm2, mm4
139 :     movq mm3, mm5
140 :     pand mm4, mm6 ; mask1
141 :     pand mm5, mm6 ; mask1
142 :     pand mm2, mm7 ; mask2
143 :     pand mm3, mm7 ; mask2
144 :     packuswb mm4, mm5
145 :     psrlq mm2, 8
146 :     psrlq mm3, 8
147 :     movq [edi + ecx], mm4
148 :    
149 :     paddw mm0, mm2 ; uv avg 1st & 2nd
150 :     paddw mm1, mm3
151 :     psrlw mm0, 1
152 :     psrlw mm1, 1
153 :     packuswb mm0, mm1
154 :     movq mm2, mm0
155 :     pand mm0, mm6 ; mask1
156 :     pand mm2, mm7 ; mask2
157 :     packuswb mm0, mm0
158 :     psrlq mm2, 8
159 :     movd [ebx], mm0
160 :     packuswb mm2, mm2
161 :     movd [edx], mm2
162 :    
163 :     add esi, 16
164 :     add edi, 8
165 :     add ebx, 4
166 :     add edx, 4
167 :     dec ebp
168 :     jnz near .xloop
169 :    
170 :     mov ebp, [esp]
171 :    
172 :     add esi, eax ; += width2
173 :     add edi, [esp + 12] ; += y_dif + stride
174 :     add ebx, [esp + 8] ; += uv_dif
175 :     add edx, [esp + 8] ; += uv_dif
176 :    
177 :     dec ebp
178 :     jnz near .yloop
179 :    
180 :     emms
181 :    
182 :     add esp, 16
183 :     pop ebp
184 :     pop edi
185 :     pop esi
186 :     pop ecx
187 :     pop ebx
188 :    
189 :     ret
190 :    
191 :    
192 :     ;===========================================================================
193 :     ;
194 :     ; void uyvy_to_yv12_mmx(uint8_t * const y_out,
195 :     ; uint8_t * const u_out,
196 :     ; uint8_t * const v_out,
197 :     ; const uint8_t * const src,
198 :     ; const uint32_t width,
199 :     ; const uint32_t height,
200 :     ; const uint32_t stride);
201 :     ;
202 :     ; width must be multiple of 8
203 :     ; does not flip
204 :     ; ~30% faster than plain c
205 :     ;
206 :     ;===========================================================================
207 :    
208 :     align 16
209 :     cglobal uyvy_to_yv12_mmx
210 :     uyvy_to_yv12_mmx
211 :    
212 :     push ebx
213 :     push ecx
214 :     push esi
215 :     push edi
216 :     push ebp ; STACK BASE = 20
217 :    
218 :     ; some global consants
219 :    
220 :     mov ecx, [esp + 20 + 20] ; width
221 :     mov eax, [esp + 20 + 28] ; stride
222 :     sub eax, ecx ; eax = stride - width
223 :     mov edx, eax
224 :     add edx, [esp + 20 + 28] ; edx = y_dif + stride
225 :     push edx ; [esp + 12] = y_dif
226 :    
227 :     shr eax, 1
228 :     push eax ; [esp + 8] = uv_dif
229 :    
230 :     shr ecx, 3
231 :     push ecx ; [esp + 4] = width/8
232 :    
233 :     sub esp, 4 ; [esp + 0] = tmp_height_counter
234 :     ; STACK_BASE = 36
235 :    
236 :     movq mm6, [mask1]
237 :     movq mm7, [mask2]
238 :    
239 :     mov edi, [esp + 36 + 4] ; y_out
240 :     mov ebx, [esp + 36 + 8] ; u_out
241 :     mov edx, [esp + 36 + 12] ; v_out
242 :     mov esi, [esp + 36 + 16] ; src
243 :    
244 :     mov eax, [esp + 36 + 20]
245 :     mov ebp, [esp + 36 + 24]
246 :     mov ecx, [esp + 36 + 28] ; ecx = stride
247 :     shr ebp, 1 ; ebp = height /= 2
248 :     add eax, eax ; eax = 2 * width
249 :    
250 :     .yloop
251 :     mov [esp], ebp
252 :     mov ebp, [esp + 4] ; width/8
253 :     .xloop
254 :     movq mm2, [esi] ; y 1st row
255 :     movq mm3, [esi + 8]
256 :     movq mm0, mm2
257 :     movq mm1, mm3
258 :     pand mm2, mm7 ; mask2
259 :     pand mm3, mm7 ; mask2
260 :     psrlq mm2, 8
261 :     psrlq mm3, 8
262 :     pand mm0, mm6 ; mask1
263 :     pand mm1, mm6 ; mask1
264 :     packuswb mm2, mm3
265 :     movq [edi], mm2
266 :    
267 :     movq mm4, [esi + eax] ; y 2nd row
268 :     movq mm5, [esi + eax + 8]
269 :     movq mm2, mm4
270 :     movq mm3, mm5
271 :     pand mm4, mm7 ; mask2
272 :     pand mm5, mm7 ; mask2
273 :     psrlq mm4, 8
274 :     psrlq mm5, 8
275 :     pand mm2, mm6 ; mask1
276 :     pand mm3, mm6 ; mask1
277 :     packuswb mm4, mm5
278 :     movq [edi + ecx], mm4
279 :    
280 :     paddw mm0, mm2 ; uv avg 1st & 2nd
281 :     paddw mm1, mm3
282 :     psrlw mm0, 1
283 :     psrlw mm1, 1
284 :     packuswb mm0, mm1
285 :     movq mm2, mm0
286 :     pand mm0, mm6 ; mask1
287 :     pand mm2, mm7 ; mask2
288 :     packuswb mm0, mm0
289 :     psrlq mm2, 8
290 :     movd [ebx], mm0
291 :     packuswb mm2, mm2
292 :     movd [edx], mm2
293 :    
294 :     add esi, 16
295 :     add edi, 8
296 :     add ebx, 4
297 :     add edx, 4
298 :     dec ebp
299 :     jnz near .xloop
300 :    
301 :     mov ebp, [esp]
302 :    
303 :     add esi, eax ; += width2
304 :     add edi, [esp + 12] ; += y_dif + stride
305 :     add ebx, [esp + 8] ; += uv_dif
306 :     add edx, [esp + 8] ; += uv_dif
307 :    
308 :     dec ebp
309 :     jnz near .yloop
310 :    
311 :     emms
312 :    
313 :     add esp, 16
314 :     pop ebp
315 :     pop edi
316 :     pop esi
317 :     pop ecx
318 :     pop ebx
319 :    
320 :     ret

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