Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4349 | Serge | 1 | /* |
2 | * software YUV to RGB converter |
||
3 | * |
||
4 | * Copyright (C) 2001-2007 Michael Niedermayer |
||
5 | * (c) 2010 Konstantin Shishkov |
||
6 | * |
||
7 | * This file is part of FFmpeg. |
||
8 | * |
||
9 | * FFmpeg is free software; you can redistribute it and/or |
||
10 | * modify it under the terms of the GNU Lesser General Public |
||
11 | * License as published by the Free Software Foundation; either |
||
12 | * version 2.1 of the License, or (at your option) any later version. |
||
13 | * |
||
14 | * FFmpeg is distributed in the hope that it will be useful, |
||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||
17 | * Lesser General Public License for more details. |
||
18 | * |
||
19 | * You should have received a copy of the GNU Lesser General Public |
||
20 | * License along with FFmpeg; if not, write to the Free Software |
||
21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||
22 | */ |
||
23 | |||
24 | #undef MOVNTQ |
||
25 | #undef EMMS |
||
26 | #undef SFENCE |
||
27 | |||
28 | #if COMPILE_TEMPLATE_MMXEXT |
||
29 | #define MOVNTQ "movntq" |
||
30 | #define SFENCE "sfence" |
||
31 | #else |
||
32 | #define MOVNTQ "movq" |
||
33 | #define SFENCE " # nop" |
||
34 | #endif |
||
35 | |||
36 | #define REG_BLUE "0" |
||
37 | #define REG_RED "1" |
||
38 | #define REG_GREEN "2" |
||
39 | #define REG_ALPHA "3" |
||
40 | |||
41 | #define YUV2RGB_LOOP(depth) \ |
||
42 | h_size = (c->dstW + 7) & ~7; \ |
||
43 | if (h_size * depth > FFABS(dstStride[0])) \ |
||
44 | h_size -= 8; \ |
||
45 | \ |
||
46 | vshift = c->srcFormat != AV_PIX_FMT_YUV422P; \ |
||
47 | \ |
||
48 | __asm__ volatile ("pxor %mm4, %mm4\n\t"); \ |
||
49 | for (y = 0; y < srcSliceH; y++) { \ |
||
50 | uint8_t *image = dst[0] + (y + srcSliceY) * dstStride[0]; \ |
||
51 | const uint8_t *py = src[0] + y * srcStride[0]; \ |
||
52 | const uint8_t *pu = src[1] + (y >> vshift) * srcStride[1]; \ |
||
53 | const uint8_t *pv = src[2] + (y >> vshift) * srcStride[2]; \ |
||
54 | x86_reg index = -h_size / 2; \ |
||
55 | |||
56 | #define YUV2RGB_INITIAL_LOAD \ |
||
57 | __asm__ volatile ( \ |
||
58 | "movq (%5, %0, 2), %%mm6\n\t" \ |
||
59 | "movd (%2, %0), %%mm0\n\t" \ |
||
60 | "movd (%3, %0), %%mm1\n\t" \ |
||
61 | "1: \n\t" \ |
||
62 | |||
63 | /* YUV2RGB core |
||
64 | * Conversion is performed in usual way: |
||
65 | * R = Y' * Ycoef + Vred * V' |
||
66 | * G = Y' * Ycoef + Vgreen * V' + Ugreen * U' |
||
67 | * B = Y' * Ycoef + Ublue * U' |
||
68 | * |
||
69 | * where X' = X * 8 - Xoffset (multiplication is performed to increase |
||
70 | * precision a bit). |
||
71 | * Since it operates in YUV420 colorspace, Y component is additionally |
||
72 | * split into Y1 and Y2 for even and odd pixels. |
||
73 | * |
||
74 | * Input: |
||
75 | * mm0 - U (4 elems), mm1 - V (4 elems), mm6 - Y (8 elems), mm4 - zero register |
||
76 | * Output: |
||
77 | * mm1 - R, mm2 - G, mm0 - B |
||
78 | */ |
||
79 | #define YUV2RGB \ |
||
80 | /* convert Y, U, V into Y1', Y2', U', V' */ \ |
||
81 | "movq %%mm6, %%mm7\n\t" \ |
||
82 | "punpcklbw %%mm4, %%mm0\n\t" \ |
||
83 | "punpcklbw %%mm4, %%mm1\n\t" \ |
||
84 | "pand "MANGLE(mmx_00ffw)", %%mm6\n\t" \ |
||
85 | "psrlw $8, %%mm7\n\t" \ |
||
86 | "psllw $3, %%mm0\n\t" \ |
||
87 | "psllw $3, %%mm1\n\t" \ |
||
88 | "psllw $3, %%mm6\n\t" \ |
||
89 | "psllw $3, %%mm7\n\t" \ |
||
90 | "psubsw "U_OFFSET"(%4), %%mm0\n\t" \ |
||
91 | "psubsw "V_OFFSET"(%4), %%mm1\n\t" \ |
||
92 | "psubw "Y_OFFSET"(%4), %%mm6\n\t" \ |
||
93 | "psubw "Y_OFFSET"(%4), %%mm7\n\t" \ |
||
94 | \ |
||
95 | /* multiply by coefficients */ \ |
||
96 | "movq %%mm0, %%mm2\n\t" \ |
||
97 | "movq %%mm1, %%mm3\n\t" \ |
||
98 | "pmulhw "UG_COEFF"(%4), %%mm2\n\t" \ |
||
99 | "pmulhw "VG_COEFF"(%4), %%mm3\n\t" \ |
||
100 | "pmulhw "Y_COEFF" (%4), %%mm6\n\t" \ |
||
101 | "pmulhw "Y_COEFF" (%4), %%mm7\n\t" \ |
||
102 | "pmulhw "UB_COEFF"(%4), %%mm0\n\t" \ |
||
103 | "pmulhw "VR_COEFF"(%4), %%mm1\n\t" \ |
||
104 | "paddsw %%mm3, %%mm2\n\t" \ |
||
105 | /* now: mm0 = UB, mm1 = VR, mm2 = CG */ \ |
||
106 | /* mm6 = Y1, mm7 = Y2 */ \ |
||
107 | \ |
||
108 | /* produce RGB */ \ |
||
109 | "movq %%mm7, %%mm3\n\t" \ |
||
110 | "movq %%mm7, %%mm5\n\t" \ |
||
111 | "paddsw %%mm0, %%mm3\n\t" \ |
||
112 | "paddsw %%mm1, %%mm5\n\t" \ |
||
113 | "paddsw %%mm2, %%mm7\n\t" \ |
||
114 | "paddsw %%mm6, %%mm0\n\t" \ |
||
115 | "paddsw %%mm6, %%mm1\n\t" \ |
||
116 | "paddsw %%mm6, %%mm2\n\t" \ |
||
117 | |||
118 | #define RGB_PACK_INTERLEAVE \ |
||
119 | /* pack and interleave even/odd pixels */ \ |
||
120 | "packuswb %%mm1, %%mm0\n\t" \ |
||
121 | "packuswb %%mm5, %%mm3\n\t" \ |
||
122 | "packuswb %%mm2, %%mm2\n\t" \ |
||
123 | "movq %%mm0, %%mm1\n\n" \ |
||
124 | "packuswb %%mm7, %%mm7\n\t" \ |
||
125 | "punpcklbw %%mm3, %%mm0\n\t" \ |
||
126 | "punpckhbw %%mm3, %%mm1\n\t" \ |
||
127 | "punpcklbw %%mm7, %%mm2\n\t" \ |
||
128 | |||
129 | #define YUV2RGB_ENDLOOP(depth) \ |
||
130 | "movq 8 (%5, %0, 2), %%mm6\n\t" \ |
||
131 | "movd 4 (%3, %0), %%mm1\n\t" \ |
||
132 | "movd 4 (%2, %0), %%mm0\n\t" \ |
||
133 | "add $"AV_STRINGIFY(depth * 8)", %1\n\t" \ |
||
134 | "add $4, %0\n\t" \ |
||
135 | "js 1b\n\t" \ |
||
136 | |||
137 | #define YUV2RGB_OPERANDS \ |
||
138 | : "+r" (index), "+r" (image) \ |
||
139 | : "r" (pu - index), "r" (pv - index), "r"(&c->redDither), \ |
||
140 | "r" (py - 2*index) \ |
||
141 | : "memory" \ |
||
142 | ); \ |
||
143 | } \ |
||
144 | |||
145 | #define YUV2RGB_OPERANDS_ALPHA \ |
||
146 | : "+r" (index), "+r" (image) \ |
||
147 | : "r" (pu - index), "r" (pv - index), "r"(&c->redDither), \ |
||
148 | "r" (py - 2*index), "r" (pa - 2*index) \ |
||
149 | : "memory" \ |
||
150 | ); \ |
||
151 | } \ |
||
152 | |||
153 | #define YUV2RGB_ENDFUNC \ |
||
154 | __asm__ volatile (SFENCE"\n\t" \ |
||
155 | "emms \n\t"); \ |
||
156 | return srcSliceH; \ |
||
157 | |||
158 | #define IF0(x) |
||
159 | #define IF1(x) x |
||
160 | |||
161 | #define RGB_PACK16(gmask, is15) \ |
||
162 | "pand "MANGLE(mmx_redmask)", %%mm0\n\t" \ |
||
163 | "pand "MANGLE(mmx_redmask)", %%mm1\n\t" \ |
||
164 | "movq %%mm2, %%mm3\n\t" \ |
||
165 | "psllw $"AV_STRINGIFY(3-is15)", %%mm2\n\t" \ |
||
166 | "psrlw $"AV_STRINGIFY(5+is15)", %%mm3\n\t" \ |
||
167 | "psrlw $3, %%mm0\n\t" \ |
||
168 | IF##is15("psrlw $1, %%mm1\n\t") \ |
||
169 | "pand "MANGLE(pb_e0)", %%mm2\n\t" \ |
||
170 | "pand "MANGLE(gmask)", %%mm3\n\t" \ |
||
171 | "por %%mm2, %%mm0\n\t" \ |
||
172 | "por %%mm3, %%mm1\n\t" \ |
||
173 | "movq %%mm0, %%mm2\n\t" \ |
||
174 | "punpcklbw %%mm1, %%mm0\n\t" \ |
||
175 | "punpckhbw %%mm1, %%mm2\n\t" \ |
||
176 | MOVNTQ " %%mm0, (%1)\n\t" \ |
||
177 | MOVNTQ " %%mm2, 8(%1)\n\t" \ |
||
178 | |||
179 | #define DITHER_RGB \ |
||
180 | "paddusb "BLUE_DITHER"(%4), %%mm0\n\t" \ |
||
181 | "paddusb "GREEN_DITHER"(%4), %%mm2\n\t" \ |
||
182 | "paddusb "RED_DITHER"(%4), %%mm1\n\t" \ |
||
183 | |||
184 | #if !COMPILE_TEMPLATE_MMXEXT |
||
185 | static inline int RENAME(yuv420_rgb15)(SwsContext *c, const uint8_t *src[], |
||
186 | int srcStride[], |
||
187 | int srcSliceY, int srcSliceH, |
||
188 | uint8_t *dst[], int dstStride[]) |
||
189 | { |
||
190 | int y, h_size, vshift; |
||
191 | |||
192 | YUV2RGB_LOOP(2) |
||
193 | |||
194 | #ifdef DITHER1XBPP |
||
195 | c->blueDither = ff_dither8[y & 1]; |
||
196 | c->greenDither = ff_dither8[y & 1]; |
||
197 | c->redDither = ff_dither8[(y + 1) & 1]; |
||
198 | #endif |
||
199 | |||
200 | YUV2RGB_INITIAL_LOAD |
||
201 | YUV2RGB |
||
202 | RGB_PACK_INTERLEAVE |
||
203 | #ifdef DITHER1XBPP |
||
204 | DITHER_RGB |
||
205 | #endif |
||
206 | RGB_PACK16(pb_03, 1) |
||
207 | |||
208 | YUV2RGB_ENDLOOP(2) |
||
209 | YUV2RGB_OPERANDS |
||
210 | YUV2RGB_ENDFUNC |
||
211 | } |
||
212 | |||
213 | static inline int RENAME(yuv420_rgb16)(SwsContext *c, const uint8_t *src[], |
||
214 | int srcStride[], |
||
215 | int srcSliceY, int srcSliceH, |
||
216 | uint8_t *dst[], int dstStride[]) |
||
217 | { |
||
218 | int y, h_size, vshift; |
||
219 | |||
220 | YUV2RGB_LOOP(2) |
||
221 | |||
222 | #ifdef DITHER1XBPP |
||
223 | c->blueDither = ff_dither8[y & 1]; |
||
224 | c->greenDither = ff_dither4[y & 1]; |
||
225 | c->redDither = ff_dither8[(y + 1) & 1]; |
||
226 | #endif |
||
227 | |||
228 | YUV2RGB_INITIAL_LOAD |
||
229 | YUV2RGB |
||
230 | RGB_PACK_INTERLEAVE |
||
231 | #ifdef DITHER1XBPP |
||
232 | DITHER_RGB |
||
233 | #endif |
||
234 | RGB_PACK16(pb_07, 0) |
||
235 | |||
236 | YUV2RGB_ENDLOOP(2) |
||
237 | YUV2RGB_OPERANDS |
||
238 | YUV2RGB_ENDFUNC |
||
239 | } |
||
240 | #endif /* !COMPILE_TEMPLATE_MMXEXT */ |
||
241 | |||
242 | #define RGB_PACK24(blue, red)\ |
||
243 | "packuswb %%mm3, %%mm0 \n" /* R0 R2 R4 R6 R1 R3 R5 R7 */\ |
||
244 | "packuswb %%mm5, %%mm1 \n" /* B0 B2 B4 B6 B1 B3 B5 B7 */\ |
||
245 | "packuswb %%mm7, %%mm2 \n" /* G0 G2 G4 G6 G1 G3 G5 G7 */\ |
||
246 | "movq %%mm"red", %%mm3 \n"\ |
||
247 | "movq %%mm"blue", %%mm6 \n"\ |
||
248 | "psrlq $32, %%mm"red" \n" /* R1 R3 R5 R7 */\ |
||
249 | "punpcklbw %%mm2, %%mm3 \n" /* R0 G0 R2 G2 R4 G4 R6 G6 */\ |
||
250 | "punpcklbw %%mm"red", %%mm6 \n" /* B0 R1 B2 R3 B4 R5 B6 R7 */\ |
||
251 | "movq %%mm3, %%mm5 \n"\ |
||
252 | "punpckhbw %%mm"blue", %%mm2 \n" /* G1 B1 G3 B3 G5 B5 G7 B7 */\ |
||
253 | "punpcklwd %%mm6, %%mm3 \n" /* R0 G0 B0 R1 R2 G2 B2 R3 */\ |
||
254 | "punpckhwd %%mm6, %%mm5 \n" /* R4 G4 B4 R5 R6 G6 B6 R7 */\ |
||
255 | RGB_PACK24_B |
||
256 | |||
257 | #if COMPILE_TEMPLATE_MMXEXT |
||
258 | DECLARE_ASM_CONST(8, int16_t, mask1101[4]) = {-1,-1, 0,-1}; |
||
259 | DECLARE_ASM_CONST(8, int16_t, mask0010[4]) = { 0, 0,-1, 0}; |
||
260 | DECLARE_ASM_CONST(8, int16_t, mask0110[4]) = { 0,-1,-1, 0}; |
||
261 | DECLARE_ASM_CONST(8, int16_t, mask1001[4]) = {-1, 0, 0,-1}; |
||
262 | DECLARE_ASM_CONST(8, int16_t, mask0100[4]) = { 0,-1, 0, 0}; |
||
263 | #undef RGB_PACK24_B |
||
264 | #define RGB_PACK24_B\ |
||
265 | "pshufw $0xc6, %%mm2, %%mm1 \n"\ |
||
266 | "pshufw $0x84, %%mm3, %%mm6 \n"\ |
||
267 | "pshufw $0x38, %%mm5, %%mm7 \n"\ |
||
268 | "pand "MANGLE(mask1101)", %%mm6 \n" /* R0 G0 B0 R1 -- -- R2 G2 */\ |
||
269 | "movq %%mm1, %%mm0 \n"\ |
||
270 | "pand "MANGLE(mask0110)", %%mm7 \n" /* -- -- R6 G6 B6 R7 -- -- */\ |
||
271 | "movq %%mm1, %%mm2 \n"\ |
||
272 | "pand "MANGLE(mask0100)", %%mm1 \n" /* -- -- G3 B3 -- -- -- -- */\ |
||
273 | "psrlq $48, %%mm3 \n" /* B2 R3 -- -- -- -- -- -- */\ |
||
274 | "pand "MANGLE(mask0010)", %%mm0 \n" /* -- -- -- -- G1 B1 -- -- */\ |
||
275 | "psllq $32, %%mm5 \n" /* -- -- -- -- R4 G4 B4 R5 */\ |
||
276 | "pand "MANGLE(mask1001)", %%mm2 \n" /* G5 B5 -- -- -- -- G7 B7 */\ |
||
277 | "por %%mm3, %%mm1 \n"\ |
||
278 | "por %%mm6, %%mm0 \n"\ |
||
279 | "por %%mm5, %%mm1 \n"\ |
||
280 | "por %%mm7, %%mm2 \n"\ |
||
281 | MOVNTQ" %%mm0, (%1) \n"\ |
||
282 | MOVNTQ" %%mm1, 8(%1) \n"\ |
||
283 | MOVNTQ" %%mm2, 16(%1) \n"\ |
||
284 | |||
285 | #else |
||
286 | #undef RGB_PACK24_B |
||
287 | #define RGB_PACK24_B\ |
||
288 | "movd %%mm3, (%1) \n" /* R0 G0 B0 R1 */\ |
||
289 | "movd %%mm2, 4(%1) \n" /* G1 B1 */\ |
||
290 | "psrlq $32, %%mm3 \n"\ |
||
291 | "psrlq $16, %%mm2 \n"\ |
||
292 | "movd %%mm3, 6(%1) \n" /* R2 G2 B2 R3 */\ |
||
293 | "movd %%mm2, 10(%1) \n" /* G3 B3 */\ |
||
294 | "psrlq $16, %%mm2 \n"\ |
||
295 | "movd %%mm5, 12(%1) \n" /* R4 G4 B4 R5 */\ |
||
296 | "movd %%mm2, 16(%1) \n" /* G5 B5 */\ |
||
297 | "psrlq $32, %%mm5 \n"\ |
||
298 | "movd %%mm2, 20(%1) \n" /* -- -- G7 B7 */\ |
||
299 | "movd %%mm5, 18(%1) \n" /* R6 G6 B6 R7 */\ |
||
300 | |||
301 | #endif |
||
302 | |||
303 | static inline int RENAME(yuv420_rgb24)(SwsContext *c, const uint8_t *src[], |
||
304 | int srcStride[], |
||
305 | int srcSliceY, int srcSliceH, |
||
306 | uint8_t *dst[], int dstStride[]) |
||
307 | { |
||
308 | int y, h_size, vshift; |
||
309 | |||
310 | YUV2RGB_LOOP(3) |
||
311 | |||
312 | YUV2RGB_INITIAL_LOAD |
||
313 | YUV2RGB |
||
314 | RGB_PACK24(REG_BLUE, REG_RED) |
||
315 | |||
316 | YUV2RGB_ENDLOOP(3) |
||
317 | YUV2RGB_OPERANDS |
||
318 | YUV2RGB_ENDFUNC |
||
319 | } |
||
320 | |||
321 | static inline int RENAME(yuv420_bgr24)(SwsContext *c, const uint8_t *src[], |
||
322 | int srcStride[], |
||
323 | int srcSliceY, int srcSliceH, |
||
324 | uint8_t *dst[], int dstStride[]) |
||
325 | { |
||
326 | int y, h_size, vshift; |
||
327 | |||
328 | YUV2RGB_LOOP(3) |
||
329 | |||
330 | YUV2RGB_INITIAL_LOAD |
||
331 | YUV2RGB |
||
332 | RGB_PACK24(REG_RED, REG_BLUE) |
||
333 | |||
334 | YUV2RGB_ENDLOOP(3) |
||
335 | YUV2RGB_OPERANDS |
||
336 | YUV2RGB_ENDFUNC |
||
337 | } |
||
338 | |||
339 | |||
340 | #define SET_EMPTY_ALPHA \ |
||
341 | "pcmpeqd %%mm"REG_ALPHA", %%mm"REG_ALPHA"\n\t" /* set alpha to 0xFF */ \ |
||
342 | |||
343 | #define LOAD_ALPHA \ |
||
344 | "movq (%6, %0, 2), %%mm"REG_ALPHA"\n\t" \ |
||
345 | |||
346 | #define RGB_PACK32(red, green, blue, alpha) \ |
||
347 | "movq %%mm"blue", %%mm5\n\t" \ |
||
348 | "movq %%mm"red", %%mm6\n\t" \ |
||
349 | "punpckhbw %%mm"green", %%mm5\n\t" \ |
||
350 | "punpcklbw %%mm"green", %%mm"blue"\n\t" \ |
||
351 | "punpckhbw %%mm"alpha", %%mm6\n\t" \ |
||
352 | "punpcklbw %%mm"alpha", %%mm"red"\n\t" \ |
||
353 | "movq %%mm"blue", %%mm"green"\n\t" \ |
||
354 | "movq %%mm5, %%mm"alpha"\n\t" \ |
||
355 | "punpcklwd %%mm"red", %%mm"blue"\n\t" \ |
||
356 | "punpckhwd %%mm"red", %%mm"green"\n\t" \ |
||
357 | "punpcklwd %%mm6, %%mm5\n\t" \ |
||
358 | "punpckhwd %%mm6, %%mm"alpha"\n\t" \ |
||
359 | MOVNTQ " %%mm"blue", 0(%1)\n\t" \ |
||
360 | MOVNTQ " %%mm"green", 8(%1)\n\t" \ |
||
361 | MOVNTQ " %%mm5, 16(%1)\n\t" \ |
||
362 | MOVNTQ " %%mm"alpha", 24(%1)\n\t" \ |
||
363 | |||
364 | #if !COMPILE_TEMPLATE_MMXEXT |
||
365 | static inline int RENAME(yuv420_rgb32)(SwsContext *c, const uint8_t *src[], |
||
366 | int srcStride[], |
||
367 | int srcSliceY, int srcSliceH, |
||
368 | uint8_t *dst[], int dstStride[]) |
||
369 | { |
||
370 | int y, h_size, vshift; |
||
371 | |||
372 | YUV2RGB_LOOP(4) |
||
373 | |||
374 | YUV2RGB_INITIAL_LOAD |
||
375 | YUV2RGB |
||
376 | RGB_PACK_INTERLEAVE |
||
377 | SET_EMPTY_ALPHA |
||
378 | RGB_PACK32(REG_RED, REG_GREEN, REG_BLUE, REG_ALPHA) |
||
379 | |||
380 | YUV2RGB_ENDLOOP(4) |
||
381 | YUV2RGB_OPERANDS |
||
382 | YUV2RGB_ENDFUNC |
||
383 | } |
||
384 | |||
385 | #if HAVE_7REGS && CONFIG_SWSCALE_ALPHA |
||
386 | static inline int RENAME(yuva420_rgb32)(SwsContext *c, const uint8_t *src[], |
||
387 | int srcStride[], |
||
388 | int srcSliceY, int srcSliceH, |
||
389 | uint8_t *dst[], int dstStride[]) |
||
390 | { |
||
391 | int y, h_size, vshift; |
||
392 | |||
393 | YUV2RGB_LOOP(4) |
||
394 | |||
395 | const uint8_t *pa = src[3] + y * srcStride[3]; |
||
396 | YUV2RGB_INITIAL_LOAD |
||
397 | YUV2RGB |
||
398 | RGB_PACK_INTERLEAVE |
||
399 | LOAD_ALPHA |
||
400 | RGB_PACK32(REG_RED, REG_GREEN, REG_BLUE, REG_ALPHA) |
||
401 | |||
402 | YUV2RGB_ENDLOOP(4) |
||
403 | YUV2RGB_OPERANDS_ALPHA |
||
404 | YUV2RGB_ENDFUNC |
||
405 | } |
||
406 | #endif |
||
407 | |||
408 | static inline int RENAME(yuv420_bgr32)(SwsContext *c, const uint8_t *src[], |
||
409 | int srcStride[], |
||
410 | int srcSliceY, int srcSliceH, |
||
411 | uint8_t *dst[], int dstStride[]) |
||
412 | { |
||
413 | int y, h_size, vshift; |
||
414 | |||
415 | YUV2RGB_LOOP(4) |
||
416 | |||
417 | YUV2RGB_INITIAL_LOAD |
||
418 | YUV2RGB |
||
419 | RGB_PACK_INTERLEAVE |
||
420 | SET_EMPTY_ALPHA |
||
421 | RGB_PACK32(REG_BLUE, REG_GREEN, REG_RED, REG_ALPHA) |
||
422 | |||
423 | YUV2RGB_ENDLOOP(4) |
||
424 | YUV2RGB_OPERANDS |
||
425 | YUV2RGB_ENDFUNC |
||
426 | } |
||
427 | |||
428 | #if HAVE_7REGS && CONFIG_SWSCALE_ALPHA |
||
429 | static inline int RENAME(yuva420_bgr32)(SwsContext *c, const uint8_t *src[], |
||
430 | int srcStride[], |
||
431 | int srcSliceY, int srcSliceH, |
||
432 | uint8_t *dst[], int dstStride[]) |
||
433 | { |
||
434 | int y, h_size, vshift; |
||
435 | |||
436 | YUV2RGB_LOOP(4) |
||
437 | |||
438 | const uint8_t *pa = src[3] + y * srcStride[3]; |
||
439 | YUV2RGB_INITIAL_LOAD |
||
440 | YUV2RGB |
||
441 | RGB_PACK_INTERLEAVE |
||
442 | LOAD_ALPHA |
||
443 | RGB_PACK32(REG_BLUE, REG_GREEN, REG_RED, REG_ALPHA) |
||
444 | |||
445 | YUV2RGB_ENDLOOP(4) |
||
446 | YUV2RGB_OPERANDS_ALPHA |
||
447 | YUV2RGB_ENDFUNC |
||
448 | } |
||
449 | #endif |
||
450 | |||
451 | #endif /* !COMPILE_TEMPLATE_MMXEXT */> |