annotate postproc/yuv2rgb_altivec.c @ 17588:79081ba52e00

Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just once when the scaler is initialized, instead of building them and freeing them over and over. This gives massive performance improvements. patch by Alan Curry, pacman*at*TheWorld*dot*com
author diego
date Sat, 11 Feb 2006 14:16:10 +0000
parents 8084bcdb4898
children ee8d71a1b7ba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
1 /*
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
2 marc.hoffman@analog.com March 8, 2004
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
3
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
4 Altivec Acceleration for Color Space Conversion revision 0.2
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
5
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
6 convert I420 YV12 to RGB in various formats,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
7 it rejects images that are not in 420 formats
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
8 it rejects images that don't have widths of multiples of 16
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
9 it rejects images that don't have heights of multiples of 2
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
10 reject defers to C simulation codes.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
11
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
12 lots of optimizations to be done here
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
13
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
14 1. need to fix saturation code, I just couldn't get it to fly with packs and adds.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
15 so we currently use max min to clip
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
16
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
17 2. the inefficient use of chroma loading needs a bit of brushing up
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
18
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
19 3. analysis of pipeline stalls needs to be done, use shark to identify pipeline stalls
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
20
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
21
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
22 MODIFIED to calculate coeffs from currently selected color space.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
23 MODIFIED core to be a macro which you spec the output format.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
24 ADDED UYVY conversion which is never called due to some thing in SWSCALE.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
25 CORRECTED algorithim selection to be strict on input formats.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
26 ADDED runtime detection of altivec.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
27
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
28 ADDED altivec_yuv2packedX vertical scl + RGB converter
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
29
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
30 March 27,2004
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
31 PERFORMANCE ANALYSIS
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
32
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
33 The C version use 25% of the processor or ~250Mips for D1 video rawvideo used as test
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
34 The ALTIVEC version uses 10% of the processor or ~100Mips for D1 video same sequence
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
35
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
36 720*480*30 ~10MPS
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
37
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
38 so we have roughly 10clocks per pixel this is too high something has to be wrong.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
39
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
40 OPTIMIZED clip codes to utilize vec_max and vec_packs removing the need for vec_min.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
41
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
42 OPTIMIZED DST OUTPUT cache/dma controls. we are pretty much
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
43 guaranteed to have the input video frame it was just decompressed so
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
44 it probably resides in L1 caches. However we are creating the
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
45 output video stream this needs to use the DSTST instruction to
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
46 optimize for the cache. We couple this with the fact that we are
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
47 not going to be visiting the input buffer again so we mark it Least
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
48 Recently Used. This shaves 25% of the processor cycles off.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
49
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
50 Now MEMCPY is the largest mips consumer in the system, probably due
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
51 to the inefficient X11 stuff.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
52
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
53 GL libraries seem to be very slow on this machine 1.33Ghz PB running
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
54 Jaguar, this is not the case for my 1Ghz PB. I thought it might be
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
55 a versioning issues, however i have libGL.1.2.dylib for both
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
56 machines. ((We need to figure this out now))
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
57
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
58 GL2 libraries work now with patch for RGB32
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
59
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
60 NOTE quartz vo driver ARGB32_to_RGB24 consumes 30% of the processor
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
61
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
62 Integrated luma prescaling adjustment for saturation/contrast/brightness adjustment.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
63
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
64 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
65 #include <stdio.h>
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
66 #include <stdlib.h>
12836
9a310b31359f some fixes
alex
parents: 12698
diff changeset
67 #include <string.h>
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
68 #include <inttypes.h>
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
69 #include <assert.h>
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
70 #include "config.h"
17558
ad90899eeee6 AltiVec operations need to have memory aligned on 16-byte boundaries.
diego
parents: 17557
diff changeset
71 #ifdef HAVE_MALLOC_H
ad90899eeee6 AltiVec operations need to have memory aligned on 16-byte boundaries.
diego
parents: 17557
diff changeset
72 #include <malloc.h>
ad90899eeee6 AltiVec operations need to have memory aligned on 16-byte boundaries.
diego
parents: 17557
diff changeset
73 #endif
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
74 #include "rgb2rgb.h"
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
75 #include "swscale.h"
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
76 #include "swscale_internal.h"
16985
08cac43f1e38 Unify include paths, -I.. is in CFLAGS.
diego
parents: 13564
diff changeset
77 #include "mangle.h"
08cac43f1e38 Unify include paths, -I.. is in CFLAGS.
diego
parents: 13564
diff changeset
78 #include "libvo/img_format.h" //FIXME try to reduce dependency of such stuff
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
79
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
80 #undef PROFILE_THE_BEAST
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
81 #undef INC_SCALING
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
82
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
83 typedef unsigned char ubyte;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
84 typedef signed char sbyte;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
85
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
86
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
87 /* RGB interleaver, 16 planar pels 8-bit samples per channel in
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
88 homogeneous vector registers x0,x1,x2 are interleaved with the
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
89 following technique:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
90
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
91 o0 = vec_mergeh (x0,x1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
92 o1 = vec_perm (o0, x2, perm_rgb_0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
93 o2 = vec_perm (o0, x2, perm_rgb_1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
94 o3 = vec_mergel (x0,x1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
95 o4 = vec_perm (o3,o2,perm_rgb_2);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
96 o5 = vec_perm (o3,o2,perm_rgb_3);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
97
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
98 perm_rgb_0: o0(RG).h v1(B) --> o1*
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
99 0 1 2 3 4
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
100 rgbr|gbrg|brgb|rgbr
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
101 0010 0100 1001 0010
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
102 0102 3145 2673 894A
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
103
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
104 perm_rgb_1: o0(RG).h v1(B) --> o2
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
105 0 1 2 3 4
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
106 gbrg|brgb|bbbb|bbbb
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
107 0100 1001 1111 1111
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
108 B5CD 6EF7 89AB CDEF
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
109
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
110 perm_rgb_2: o3(RG).l o2(rgbB.l) --> o4*
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
111 0 1 2 3 4
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
112 gbrg|brgb|rgbr|gbrg
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
113 1111 1111 0010 0100
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
114 89AB CDEF 0182 3945
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
115
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
116 perm_rgb_2: o3(RG).l o2(rgbB.l) ---> o5*
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
117 0 1 2 3 4
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
118 brgb|rgbr|gbrg|brgb
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
119 1001 0010 0100 1001
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
120 a67b 89cA BdCD eEFf
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
121
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
122 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
123 static
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
124 const vector unsigned char
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
125 perm_rgb_0 = (const vector unsigned char)AVV(0x00,0x01,0x10,0x02,0x03,0x11,0x04,0x05,
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
126 0x12,0x06,0x07,0x13,0x08,0x09,0x14,0x0a),
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
127 perm_rgb_1 = (const vector unsigned char)AVV(0x0b,0x15,0x0c,0x0d,0x16,0x0e,0x0f,0x17,
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
128 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f),
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
129 perm_rgb_2 = (const vector unsigned char)AVV(0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
130 0x00,0x01,0x18,0x02,0x03,0x19,0x04,0x05),
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
131 perm_rgb_3 = (const vector unsigned char)AVV(0x1a,0x06,0x07,0x1b,0x08,0x09,0x1c,0x0a,
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
132 0x0b,0x1d,0x0c,0x0d,0x1e,0x0e,0x0f,0x1f);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
133
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
134 #define vec_merge3(x2,x1,x0,y0,y1,y2) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
135 do { \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
136 typeof(x0) o0,o2,o3; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
137 o0 = vec_mergeh (x0,x1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
138 y0 = vec_perm (o0, x2, perm_rgb_0);\
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
139 o2 = vec_perm (o0, x2, perm_rgb_1);\
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
140 o3 = vec_mergel (x0,x1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
141 y1 = vec_perm (o3,o2,perm_rgb_2); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
142 y2 = vec_perm (o3,o2,perm_rgb_3); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
143 } while(0)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
144
17563
8084bcdb4898 Correct RGB vs. BGR confusion, the macros vec_mstrgb24 and vec_mstbgr24 each
diego
parents: 17560
diff changeset
145 #define vec_mstbgr24(x0,x1,x2,ptr) \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
146 do { \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
147 typeof(x0) _0,_1,_2; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
148 vec_merge3 (x0,x1,x2,_0,_1,_2); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
149 vec_st (_0, 0, ptr++); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
150 vec_st (_1, 0, ptr++); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
151 vec_st (_2, 0, ptr++); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
152 } while (0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
153
17563
8084bcdb4898 Correct RGB vs. BGR confusion, the macros vec_mstrgb24 and vec_mstbgr24 each
diego
parents: 17560
diff changeset
154 #define vec_mstrgb24(x0,x1,x2,ptr) \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
155 do { \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
156 typeof(x0) _0,_1,_2; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
157 vec_merge3 (x2,x1,x0,_0,_1,_2); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
158 vec_st (_0, 0, ptr++); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
159 vec_st (_1, 0, ptr++); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
160 vec_st (_2, 0, ptr++); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
161 } while (0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
162
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
163 /* pack the pixels in rgb0 format
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
164 msb R
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
165 lsb 0
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
166 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
167 #define vec_mstrgb32(T,x0,x1,x2,x3,ptr) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
168 do { \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
169 T _0,_1,_2,_3; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
170 _0 = vec_mergeh (x0,x1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
171 _1 = vec_mergeh (x2,x3); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
172 _2 = (T)vec_mergeh ((vector unsigned short)_0,(vector unsigned short)_1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
173 _3 = (T)vec_mergel ((vector unsigned short)_0,(vector unsigned short)_1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
174 vec_st (_2, 0*16, (T *)ptr); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
175 vec_st (_3, 1*16, (T *)ptr); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
176 _0 = vec_mergel (x0,x1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
177 _1 = vec_mergel (x2,x3); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
178 _2 = (T)vec_mergeh ((vector unsigned short)_0,(vector unsigned short)_1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
179 _3 = (T)vec_mergel ((vector unsigned short)_0,(vector unsigned short)_1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
180 vec_st (_2, 2*16, (T *)ptr); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
181 vec_st (_3, 3*16, (T *)ptr); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
182 ptr += 4; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
183 } while (0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
184
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
185 /*
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
186
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
187 | 1 0 1.4021 | | Y |
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
188 | 1 -0.3441 -0.7142 |x| Cb|
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
189 | 1 1.7718 0 | | Cr|
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
190
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
191
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
192 Y: [-128 127]
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
193 Cb/Cr : [-128 127]
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
194
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
195 typical yuv conversion work on Y: 0-255 this version has been optimized for jpeg decode.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
196
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
197 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
198
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
199
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
200
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
201
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
202 #define vec_unh(x) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
203 (vector signed short) \
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
204 vec_perm(x,(typeof(x))AVV(0),\
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
205 (vector unsigned char)AVV(0x10,0x00,0x10,0x01,0x10,0x02,0x10,0x03,\
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
206 0x10,0x04,0x10,0x05,0x10,0x06,0x10,0x07))
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
207 #define vec_unl(x) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
208 (vector signed short) \
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
209 vec_perm(x,(typeof(x))AVV(0),\
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
210 (vector unsigned char)AVV(0x10,0x08,0x10,0x09,0x10,0x0A,0x10,0x0B,\
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
211 0x10,0x0C,0x10,0x0D,0x10,0x0E,0x10,0x0F))
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
212
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
213 #define vec_clip(x) \
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
214 vec_max (vec_min (x, (typeof(x))AVV(235)), (typeof(x))AVV(16))
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
215
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
216 #define vec_packclp_a(x,y) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
217 (vector unsigned char)vec_pack (vec_clip (x), vec_clip (y))
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
218
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
219 #define vec_packclp(x,y) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
220 (vector unsigned char)vec_packs \
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
221 ((vector unsigned short)vec_max (x,(vector signed short) AVV(0)), \
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
222 (vector unsigned short)vec_max (y,(vector signed short) AVV(0)))
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
223
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
224 //#define out_pixels(a,b,c,ptr) vec_mstrgb32(typeof(a),((typeof (a))AVV(0)),a,a,a,ptr)
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
225
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
226
12836
9a310b31359f some fixes
alex
parents: 12698
diff changeset
227 static inline void cvtyuvtoRGB (SwsContext *c,
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
228 vector signed short Y, vector signed short U, vector signed short V,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
229 vector signed short *R, vector signed short *G, vector signed short *B)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
230 {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
231 vector signed short vx,ux,uvx;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
232
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
233 Y = vec_mradds (Y, c->CY, c->OY);
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
234 U = vec_sub (U,(vector signed short)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
235 vec_splat((vector signed short)AVV(128),0));
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
236 V = vec_sub (V,(vector signed short)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
237 vec_splat((vector signed short)AVV(128),0));
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
238
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
239 // ux = (CBU*(u<<c->CSHIFT)+0x4000)>>15;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
240 ux = vec_sl (U, c->CSHIFT);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
241 *B = vec_mradds (ux, c->CBU, Y);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
242
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
243 // vx = (CRV*(v<<c->CSHIFT)+0x4000)>>15;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
244 vx = vec_sl (V, c->CSHIFT);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
245 *R = vec_mradds (vx, c->CRV, Y);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
246
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
247 // uvx = ((CGU*u) + (CGV*v))>>15;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
248 uvx = vec_mradds (U, c->CGU, Y);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
249 *G = vec_mradds (V, c->CGV, uvx);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
250 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
251
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
252
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
253 /*
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
254 ------------------------------------------------------------------------------
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
255 CS converters
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
256 ------------------------------------------------------------------------------
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
257 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
258
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
259
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
260 #define DEFCSP420_CVT(name,out_pixels) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
261 static int altivec_##name (SwsContext *c, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
262 unsigned char **in, int *instrides, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
263 int srcSliceY, int srcSliceH, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
264 unsigned char **oplanes, int *outstrides) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
265 { \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
266 int w = c->srcW; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
267 int h = srcSliceH; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
268 int i,j; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
269 int instrides_scl[3]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
270 vector unsigned char y0,y1; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
271 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
272 vector signed char u,v; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
273 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
274 vector signed short Y0,Y1,Y2,Y3; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
275 vector signed short U,V; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
276 vector signed short vx,ux,uvx; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
277 vector signed short vx0,ux0,uvx0; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
278 vector signed short vx1,ux1,uvx1; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
279 vector signed short R0,G0,B0; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
280 vector signed short R1,G1,B1; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
281 vector unsigned char R,G,B; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
282 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
283 vector unsigned char *uivP, *vivP; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
284 vector unsigned char align_perm; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
285 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
286 vector signed short \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
287 lCY = c->CY, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
288 lOY = c->OY, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
289 lCRV = c->CRV, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
290 lCBU = c->CBU, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
291 lCGU = c->CGU, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
292 lCGV = c->CGV; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
293 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
294 vector unsigned short lCSHIFT = c->CSHIFT; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
295 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
296 ubyte *y1i = in[0]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
297 ubyte *y2i = in[0]+w; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
298 ubyte *ui = in[1]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
299 ubyte *vi = in[2]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
300 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
301 vector unsigned char *oute \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
302 = (vector unsigned char *) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
303 (oplanes[0]+srcSliceY*outstrides[0]); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
304 vector unsigned char *outo \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
305 = (vector unsigned char *) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
306 (oplanes[0]+srcSliceY*outstrides[0]+outstrides[0]); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
307 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
308 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
309 instrides_scl[0] = instrides[0]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
310 instrides_scl[1] = instrides[1]-w/2; /* the loop moves ui by w/2 */ \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
311 instrides_scl[2] = instrides[2]-w/2; /* the loop moves vi by w/2 */ \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
312 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
313 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
314 for (i=0;i<h/2;i++) { \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
315 vec_dstst (outo, (0x02000002|(((w*3+32)/32)<<16)), 0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
316 vec_dstst (oute, (0x02000002|(((w*3+32)/32)<<16)), 1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
317 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
318 for (j=0;j<w/16;j++) { \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
319 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
320 y0 = vec_ldl (0,y1i); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
321 y1 = vec_ldl (0,y2i); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
322 uivP = (vector unsigned char *)ui; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
323 vivP = (vector unsigned char *)vi; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
324 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
325 align_perm = vec_lvsl (0, ui); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
326 u = (vector signed char)vec_perm (uivP[0], uivP[1], align_perm); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
327 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
328 align_perm = vec_lvsl (0, vi); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
329 v = (vector signed char)vec_perm (vivP[0], vivP[1], align_perm); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
330 \
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
331 u = (vector signed char) \
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
332 vec_sub (u,(vector signed char) \
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
333 vec_splat((vector signed char)AVV(128),0));\
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
334 v = (vector signed char) \
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
335 vec_sub (v,(vector signed char) \
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
336 vec_splat((vector signed char)AVV(128),0));\
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
337 \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
338 U = vec_unpackh (u); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
339 V = vec_unpackh (v); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
340 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
341 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
342 Y0 = vec_unh (y0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
343 Y1 = vec_unl (y0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
344 Y2 = vec_unh (y1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
345 Y3 = vec_unl (y1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
346 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
347 Y0 = vec_mradds (Y0, lCY, lOY); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
348 Y1 = vec_mradds (Y1, lCY, lOY); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
349 Y2 = vec_mradds (Y2, lCY, lOY); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
350 Y3 = vec_mradds (Y3, lCY, lOY); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
351 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
352 /* ux = (CBU*(u<<CSHIFT)+0x4000)>>15 */ \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
353 ux = vec_sl (U, lCSHIFT); \
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
354 ux = vec_mradds (ux, lCBU, (vector signed short)AVV(0)); \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
355 ux0 = vec_mergeh (ux,ux); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
356 ux1 = vec_mergel (ux,ux); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
357 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
358 /* vx = (CRV*(v<<CSHIFT)+0x4000)>>15; */ \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
359 vx = vec_sl (V, lCSHIFT); \
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
360 vx = vec_mradds (vx, lCRV, (vector signed short)AVV(0)); \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
361 vx0 = vec_mergeh (vx,vx); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
362 vx1 = vec_mergel (vx,vx); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
363 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
364 /* uvx = ((CGU*u) + (CGV*v))>>15 */ \
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
365 uvx = vec_mradds (U, lCGU, (vector signed short)AVV(0)); \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
366 uvx = vec_mradds (V, lCGV, uvx); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
367 uvx0 = vec_mergeh (uvx,uvx); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
368 uvx1 = vec_mergel (uvx,uvx); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
369 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
370 R0 = vec_add (Y0,vx0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
371 G0 = vec_add (Y0,uvx0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
372 B0 = vec_add (Y0,ux0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
373 R1 = vec_add (Y1,vx1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
374 G1 = vec_add (Y1,uvx1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
375 B1 = vec_add (Y1,ux1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
376 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
377 R = vec_packclp (R0,R1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
378 G = vec_packclp (G0,G1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
379 B = vec_packclp (B0,B1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
380 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
381 out_pixels(R,G,B,oute); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
382 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
383 R0 = vec_add (Y2,vx0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
384 G0 = vec_add (Y2,uvx0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
385 B0 = vec_add (Y2,ux0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
386 R1 = vec_add (Y3,vx1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
387 G1 = vec_add (Y3,uvx1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
388 B1 = vec_add (Y3,ux1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
389 R = vec_packclp (R0,R1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
390 G = vec_packclp (G0,G1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
391 B = vec_packclp (B0,B1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
392 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
393 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
394 out_pixels(R,G,B,outo); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
395 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
396 y1i += 16; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
397 y2i += 16; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
398 ui += 8; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
399 vi += 8; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
400 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
401 } \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
402 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
403 outo += (outstrides[0])>>4; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
404 oute += (outstrides[0])>>4; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
405 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
406 ui += instrides_scl[1]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
407 vi += instrides_scl[2]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
408 y1i += instrides_scl[0]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
409 y2i += instrides_scl[0]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
410 } \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
411 return srcSliceH; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
412 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
413
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
414
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
415 #define out_abgr(a,b,c,ptr) vec_mstrgb32(typeof(a),((typeof (a))AVV(0)),c,b,a,ptr)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
416 #define out_bgra(a,b,c,ptr) vec_mstrgb32(typeof(a),c,b,a,((typeof (a))AVV(0)),ptr)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
417 #define out_rgba(a,b,c,ptr) vec_mstrgb32(typeof(a),a,b,c,((typeof (a))AVV(0)),ptr)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
418 #define out_argb(a,b,c,ptr) vec_mstrgb32(typeof(a),((typeof (a))AVV(0)),a,b,c,ptr)
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
419 #define out_rgb24(a,b,c,ptr) vec_mstrgb24(a,b,c,ptr)
17563
8084bcdb4898 Correct RGB vs. BGR confusion, the macros vec_mstrgb24 and vec_mstbgr24 each
diego
parents: 17560
diff changeset
420 #define out_bgr24(a,b,c,ptr) vec_mstbgr24(a,b,c,ptr)
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
421
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
422 DEFCSP420_CVT (yuv2_abgr32, out_abgr)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
423 #if 1
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
424 DEFCSP420_CVT (yuv2_bgra32, out_argb)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
425 #else
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
426 static int altivec_yuv2_bgra32 (SwsContext *c,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
427 unsigned char **in, int *instrides,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
428 int srcSliceY, int srcSliceH,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
429 unsigned char **oplanes, int *outstrides)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
430 {
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
431 int w = c->srcW;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
432 int h = srcSliceH;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
433 int i,j;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
434 int instrides_scl[3];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
435 vector unsigned char y0,y1;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
436
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
437 vector signed char u,v;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
438
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
439 vector signed short Y0,Y1,Y2,Y3;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
440 vector signed short U,V;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
441 vector signed short vx,ux,uvx;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
442 vector signed short vx0,ux0,uvx0;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
443 vector signed short vx1,ux1,uvx1;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
444 vector signed short R0,G0,B0;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
445 vector signed short R1,G1,B1;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
446 vector unsigned char R,G,B;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
447
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
448 vector unsigned char *uivP, *vivP;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
449 vector unsigned char align_perm;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
450
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
451 vector signed short
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
452 lCY = c->CY,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
453 lOY = c->OY,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
454 lCRV = c->CRV,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
455 lCBU = c->CBU,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
456 lCGU = c->CGU,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
457 lCGV = c->CGV;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
458
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
459 vector unsigned short lCSHIFT = c->CSHIFT;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
460
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
461 ubyte *y1i = in[0];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
462 ubyte *y2i = in[0]+w;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
463 ubyte *ui = in[1];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
464 ubyte *vi = in[2];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
465
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
466 vector unsigned char *oute
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
467 = (vector unsigned char *)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
468 (oplanes[0]+srcSliceY*outstrides[0]);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
469 vector unsigned char *outo
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
470 = (vector unsigned char *)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
471 (oplanes[0]+srcSliceY*outstrides[0]+outstrides[0]);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
472
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
473
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
474 instrides_scl[0] = instrides[0];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
475 instrides_scl[1] = instrides[1]-w/2; /* the loop moves ui by w/2 */
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
476 instrides_scl[2] = instrides[2]-w/2; /* the loop moves vi by w/2 */
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
477
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
478
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
479 for (i=0;i<h/2;i++) {
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
480 vec_dstst (outo, (0x02000002|(((w*3+32)/32)<<16)), 0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
481 vec_dstst (oute, (0x02000002|(((w*3+32)/32)<<16)), 1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
482
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
483 for (j=0;j<w/16;j++) {
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
484
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
485 y0 = vec_ldl (0,y1i);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
486 y1 = vec_ldl (0,y2i);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
487 uivP = (vector unsigned char *)ui;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
488 vivP = (vector unsigned char *)vi;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
489
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
490 align_perm = vec_lvsl (0, ui);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
491 u = (vector signed char)vec_perm (uivP[0], uivP[1], align_perm);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
492
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
493 align_perm = vec_lvsl (0, vi);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
494 v = (vector signed char)vec_perm (vivP[0], vivP[1], align_perm);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
495 u = (vector signed char)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
496 vec_sub (u,(vector signed char)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
497 vec_splat((vector signed char)AVV(128),0));
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
498
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
499 v = (vector signed char)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
500 vec_sub (v, (vector signed char)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
501 vec_splat((vector signed char)AVV(128),0));
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
502
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
503 U = vec_unpackh (u);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
504 V = vec_unpackh (v);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
505
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
506
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
507 Y0 = vec_unh (y0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
508 Y1 = vec_unl (y0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
509 Y2 = vec_unh (y1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
510 Y3 = vec_unl (y1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
511
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
512 Y0 = vec_mradds (Y0, lCY, lOY);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
513 Y1 = vec_mradds (Y1, lCY, lOY);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
514 Y2 = vec_mradds (Y2, lCY, lOY);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
515 Y3 = vec_mradds (Y3, lCY, lOY);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
516
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
517 /* ux = (CBU*(u<<CSHIFT)+0x4000)>>15 */
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
518 ux = vec_sl (U, lCSHIFT);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
519 ux = vec_mradds (ux, lCBU, (vector signed short)AVV(0));
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
520 ux0 = vec_mergeh (ux,ux);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
521 ux1 = vec_mergel (ux,ux);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
522
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
523 /* vx = (CRV*(v<<CSHIFT)+0x4000)>>15; */
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
524 vx = vec_sl (V, lCSHIFT);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
525 vx = vec_mradds (vx, lCRV, (vector signed short)AVV(0));
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
526 vx0 = vec_mergeh (vx,vx);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
527 vx1 = vec_mergel (vx,vx);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
528 /* uvx = ((CGU*u) + (CGV*v))>>15 */
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
529 uvx = vec_mradds (U, lCGU, (vector signed short)AVV(0));
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
530 uvx = vec_mradds (V, lCGV, uvx);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
531 uvx0 = vec_mergeh (uvx,uvx);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
532 uvx1 = vec_mergel (uvx,uvx);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
533 R0 = vec_add (Y0,vx0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
534 G0 = vec_add (Y0,uvx0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
535 B0 = vec_add (Y0,ux0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
536 R1 = vec_add (Y1,vx1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
537 G1 = vec_add (Y1,uvx1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
538 B1 = vec_add (Y1,ux1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
539 R = vec_packclp (R0,R1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
540 G = vec_packclp (G0,G1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
541 B = vec_packclp (B0,B1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
542
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
543 out_argb(R,G,B,oute);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
544 R0 = vec_add (Y2,vx0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
545 G0 = vec_add (Y2,uvx0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
546 B0 = vec_add (Y2,ux0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
547 R1 = vec_add (Y3,vx1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
548 G1 = vec_add (Y3,uvx1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
549 B1 = vec_add (Y3,ux1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
550 R = vec_packclp (R0,R1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
551 G = vec_packclp (G0,G1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
552 B = vec_packclp (B0,B1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
553
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
554 out_argb(R,G,B,outo);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
555 y1i += 16;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
556 y2i += 16;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
557 ui += 8;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
558 vi += 8;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
559
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
560 }
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
561
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
562 outo += (outstrides[0])>>4;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
563 oute += (outstrides[0])>>4;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
565 ui += instrides_scl[1];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
566 vi += instrides_scl[2];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
567 y1i += instrides_scl[0];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
568 y2i += instrides_scl[0];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
569 }
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
570 return srcSliceH;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
571 }
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
572
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
573 #endif
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
574
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
575
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
576 DEFCSP420_CVT (yuv2_rgba32, out_rgba)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
577 DEFCSP420_CVT (yuv2_argb32, out_argb)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
578 DEFCSP420_CVT (yuv2_rgb24, out_rgb24)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
579 DEFCSP420_CVT (yuv2_bgr24, out_bgr24)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
580
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
581
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
582 // uyvy|uyvy|uyvy|uyvy
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
583 // 0123 4567 89ab cdef
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
584 static
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
585 const vector unsigned char
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
586 demux_u = (const vector unsigned char)AVV(0x10,0x00,0x10,0x00,
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
587 0x10,0x04,0x10,0x04,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
588 0x10,0x08,0x10,0x08,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
589 0x10,0x0c,0x10,0x0c),
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
590 demux_v = (const vector unsigned char)AVV(0x10,0x02,0x10,0x02,
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
591 0x10,0x06,0x10,0x06,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
592 0x10,0x0A,0x10,0x0A,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
593 0x10,0x0E,0x10,0x0E),
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
594 demux_y = (const vector unsigned char)AVV(0x10,0x01,0x10,0x03,
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
595 0x10,0x05,0x10,0x07,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
596 0x10,0x09,0x10,0x0B,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
597 0x10,0x0D,0x10,0x0F);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
598
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
599 /*
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
600 this is so I can play live CCIR raw video
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
601 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
602 static int altivec_uyvy_rgb32 (SwsContext *c,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
603 unsigned char **in, int *instrides,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
604 int srcSliceY, int srcSliceH,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
605 unsigned char **oplanes, int *outstrides)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
606 {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
607 int w = c->srcW;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
608 int h = srcSliceH;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
609 int i,j;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
610 vector unsigned char uyvy;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
611 vector signed short Y,U,V;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
612 vector signed short vx,ux,uvx;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
613 vector signed short R0,G0,B0,R1,G1,B1;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
614 vector unsigned char R,G,B;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
615 vector unsigned char *out;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
616 ubyte *img;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
617
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
618 img = in[0];
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
619 out = (vector unsigned char *)(oplanes[0]+srcSliceY*outstrides[0]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
620
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
621 for (i=0;i<h;i++) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
622 for (j=0;j<w/16;j++) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
623 uyvy = vec_ld (0, img);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
624 U = (vector signed short)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
625 vec_perm (uyvy, (vector unsigned char)AVV(0), demux_u);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
626
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
627 V = (vector signed short)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
628 vec_perm (uyvy, (vector unsigned char)AVV(0), demux_v);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
629
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
630 Y = (vector signed short)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
631 vec_perm (uyvy, (vector unsigned char)AVV(0), demux_y);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
632
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
633 cvtyuvtoRGB (c, Y,U,V,&R0,&G0,&B0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
634
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
635 uyvy = vec_ld (16, img);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
636 U = (vector signed short)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
637 vec_perm (uyvy, (vector unsigned char)AVV(0), demux_u);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
638
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
639 V = (vector signed short)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
640 vec_perm (uyvy, (vector unsigned char)AVV(0), demux_v);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
641
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
642 Y = (vector signed short)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
643 vec_perm (uyvy, (vector unsigned char)AVV(0), demux_y);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
644
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
645 cvtyuvtoRGB (c, Y,U,V,&R1,&G1,&B1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
646
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
647 R = vec_packclp (R0,R1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
648 G = vec_packclp (G0,G1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
649 B = vec_packclp (B0,B1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
650
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
651 // vec_mstbgr24 (R,G,B, out);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
652 out_rgba (R,G,B,out);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
653
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
654 img += 32;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
655 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
656 }
12836
9a310b31359f some fixes
alex
parents: 12698
diff changeset
657 return srcSliceH;
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
658 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
659
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
660
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
661
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
662 /* Ok currently the acceleration routine only supports
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
663 inputs of widths a multiple of 16
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
664 and heights a multiple 2
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
665
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
666 So we just fall back to the C codes for this.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
667 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
668 SwsFunc yuv2rgb_init_altivec (SwsContext *c)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
669 {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
670 if (!(c->flags & SWS_CPU_CAPS_ALTIVEC))
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
671 return NULL;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
672
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
673 /*
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
674 and this seems not to matter too much I tried a bunch of
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
675 videos with abnormal widths and mplayer crashes else where.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
676 mplayer -vo x11 -rawvideo on:w=350:h=240 raw-350x240.eyuv
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
677 boom with X11 bad match.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
678
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
679 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
680 if ((c->srcW & 0xf) != 0) return NULL;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
681
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
682 switch (c->srcFormat) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
683 case IMGFMT_YVU9:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
684 case IMGFMT_IF09:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
685 case IMGFMT_YV12:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
686 case IMGFMT_I420:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
687 case IMGFMT_IYUV:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
688 case IMGFMT_CLPL:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
689 case IMGFMT_Y800:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
690 case IMGFMT_Y8:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
691 case IMGFMT_NV12:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
692 case IMGFMT_NV21:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
693 if ((c->srcH & 0x1) != 0)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
694 return NULL;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
695
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
696 switch(c->dstFormat){
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
697 case IMGFMT_RGB24:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
698 MSG_WARN("ALTIVEC: Color Space RGB24\n");
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
699 return altivec_yuv2_rgb24;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
700 case IMGFMT_BGR24:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
701 MSG_WARN("ALTIVEC: Color Space BGR24\n");
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
702 return altivec_yuv2_bgr24;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
703 case IMGFMT_RGB32:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
704 MSG_WARN("ALTIVEC: Color Space ARGB32\n");
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
705 return altivec_yuv2_argb32;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
706 case IMGFMT_BGR32:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
707 MSG_WARN("ALTIVEC: Color Space BGRA32\n");
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
708 // return profile_altivec_bgra32;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
709
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
710 return altivec_yuv2_bgra32;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
711 default: return NULL;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
712 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
713 break;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
714
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
715 case IMGFMT_UYVY:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
716 switch(c->dstFormat){
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
717 case IMGFMT_RGB32:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
718 MSG_WARN("ALTIVEC: Color Space UYVY -> RGB32\n");
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
719 return altivec_uyvy_rgb32;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
720 default: return NULL;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
721 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
722 break;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
723
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
724 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
725 return NULL;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
726 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
727
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
728 static uint16_t roundToInt16(int64_t f){
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
729 int r= (f + (1<<15))>>16;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
730 if(r<-0x7FFF) return 0x8000;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
731 else if(r> 0x7FFF) return 0x7FFF;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
732 else return r;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
733 }
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
734
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
735 void yuv2rgb_altivec_init_tables (SwsContext *c, const int inv_table[4],int brightness,int contrast, int saturation)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
736 {
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
737 union {
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
738 signed short tmp[8] __attribute__ ((aligned(16)));
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
739 vector signed short vec;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
740 } buf;
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
741
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
742 buf.tmp[0] = ( (0xffffLL) * contrast>>8 )>>9; //cy
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
743 buf.tmp[1] = -256*brightness; //oy
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
744 buf.tmp[2] = (inv_table[0]>>3) *(contrast>>16)*(saturation>>16); //crv
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
745 buf.tmp[3] = (inv_table[1]>>3) *(contrast>>16)*(saturation>>16); //cbu
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
746 buf.tmp[4] = -((inv_table[2]>>1)*(contrast>>16)*(saturation>>16)); //cgu
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
747 buf.tmp[5] = -((inv_table[3]>>1)*(contrast>>16)*(saturation>>16)); //cgv
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
748
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
749
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
750 c->CSHIFT = (vector unsigned short)vec_splat((vector unsigned short)AVV(2),0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
751 c->CY = vec_splat ((vector signed short)buf.vec, 0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
752 c->OY = vec_splat ((vector signed short)buf.vec, 1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
753 c->CRV = vec_splat ((vector signed short)buf.vec, 2);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
754 c->CBU = vec_splat ((vector signed short)buf.vec, 3);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
755 c->CGU = vec_splat ((vector signed short)buf.vec, 4);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
756 c->CGV = vec_splat ((vector signed short)buf.vec, 5);
12836
9a310b31359f some fixes
alex
parents: 12698
diff changeset
757 #if 0
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
758 {
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
759 int i;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
760 char *v[6]={"cy","oy","crv","cbu","cgu","cgv"};
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
761 for (i=0; i<6;i++)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
762 printf("%s %d ", v[i],buf.tmp[i] );
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
763 printf("\n");
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
764 }
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
765 #endif
12836
9a310b31359f some fixes
alex
parents: 12698
diff changeset
766 return;
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
767 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
768
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
769
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
770 void
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
771 altivec_yuv2packedX (SwsContext *c,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
772 int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
773 int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
774 uint8_t *dest, int dstW, int dstY)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
775 {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
776 int i,j;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
777 short *f;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
778 vector signed short X,X0,X1,Y0,U0,V0,Y1,U1,V1,U,V;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
779 vector signed short R0,G0,B0,R1,G1,B1;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
780
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
781 vector unsigned char R,G,B,pels[3];
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
782 vector unsigned char *out,*nout;
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
783
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
784 vector signed short RND = vec_splat((vector signed short)AVV(1<<3),0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
785 vector unsigned short SCL = vec_splat((vector unsigned short)AVV(4),0);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
786 unsigned long scratch[16] __attribute__ ((aligned (16)));
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
787
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
788 vector signed short *YCoeffs, *CCoeffs;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
789
17588
79081ba52e00 Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents: 17563
diff changeset
790 YCoeffs = c->vYCoeffsBank+dstY*lumFilterSize;
79081ba52e00 Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents: 17563
diff changeset
791 CCoeffs = c->vCCoeffsBank+dstY*chrFilterSize;
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
792
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
793 out = (vector unsigned char *)dest;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
794
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
795 for(i=0; i<dstW; i+=16){
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
796 Y0 = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
797 Y1 = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
798 /* extract 16 coeffs from lumSrc */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
799 for(j=0; j<lumFilterSize; j++) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
800 X0 = vec_ld (0, &lumSrc[j][i]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
801 X1 = vec_ld (16, &lumSrc[j][i]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
802 Y0 = vec_mradds (X0, YCoeffs[j], Y0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
803 Y1 = vec_mradds (X1, YCoeffs[j], Y1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
804 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
805
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
806 U = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
807 V = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
808 /* extract 8 coeffs from U,V */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
809 for(j=0; j<chrFilterSize; j++) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
810 X = vec_ld (0, &chrSrc[j][i/2]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
811 U = vec_mradds (X, CCoeffs[j], U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
812 X = vec_ld (0, &chrSrc[j][i/2+2048]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
813 V = vec_mradds (X, CCoeffs[j], V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
814 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
815
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
816 /* scale and clip signals */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
817 Y0 = vec_sra (Y0, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
818 Y1 = vec_sra (Y1, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
819 U = vec_sra (U, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
820 V = vec_sra (V, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
821
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
822 Y0 = vec_clip (Y0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
823 Y1 = vec_clip (Y1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
824 U = vec_clip (U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
825 V = vec_clip (V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
826
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
827 /* now we have
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
828 Y0= y0 y1 y2 y3 y4 y5 y6 y7 Y1= y8 y9 y10 y11 y12 y13 y14 y15
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
829 U= u0 u1 u2 u3 u4 u5 u6 u7 V= v0 v1 v2 v3 v4 v5 v6 v7
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
830
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
831 Y0= y0 y1 y2 y3 y4 y5 y6 y7 Y1= y8 y9 y10 y11 y12 y13 y14 y15
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
832 U0= u0 u0 u1 u1 u2 u2 u3 u3 U1= u4 u4 u5 u5 u6 u6 u7 u7
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
833 V0= v0 v0 v1 v1 v2 v2 v3 v3 V1= v4 v4 v5 v5 v6 v6 v7 v7
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
834 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
835
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
836 U0 = vec_mergeh (U,U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
837 V0 = vec_mergeh (V,V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
838
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
839 U1 = vec_mergel (U,U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
840 V1 = vec_mergel (V,V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
841
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
842 cvtyuvtoRGB (c, Y0,U0,V0,&R0,&G0,&B0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
843 cvtyuvtoRGB (c, Y1,U1,V1,&R1,&G1,&B1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
844
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
845 R = vec_packclp (R0,R1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
846 G = vec_packclp (G0,G1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
847 B = vec_packclp (B0,B1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
848
17560
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
849 switch(c->dstFormat) {
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
850 case IMGFMT_ABGR: out_abgr (R,G,B,out); break;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
851 case IMGFMT_BGRA: out_bgra (R,G,B,out); break;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
852 case IMGFMT_RGBA: out_rgba (R,G,B,out); break;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
853 case IMGFMT_ARGB: out_argb (R,G,B,out); break;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
854 case IMGFMT_RGB24: out_rgb24 (R,G,B,out); break;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
855 case IMGFMT_BGR24: out_bgr24 (R,G,B,out); break;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
856 default:
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
857 {
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
858 /* FIXME: either write more out_* macros or punt to yuv2packedXinC */
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
859 static int printed_error_message;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
860 if(!printed_error_message) {
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
861 MSG_ERR("altivec_yuv2packedX doesn't support %s output\n",
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
862 vo_format_name(c->dstFormat));
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
863 printed_error_message=1;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
864 }
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
865 return;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
866 }
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
867 }
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
868 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
869
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
870 if (i < dstW) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
871 i -= 16;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
872
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
873 Y0 = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
874 Y1 = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
875 /* extract 16 coeffs from lumSrc */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
876 for(j=0; j<lumFilterSize; j++) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
877 X0 = vec_ld (0, &lumSrc[j][i]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
878 X1 = vec_ld (16, &lumSrc[j][i]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
879 Y0 = vec_mradds (X0, YCoeffs[j], Y0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
880 Y1 = vec_mradds (X1, YCoeffs[j], Y1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
881 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
882
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
883 U = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
884 V = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
885 /* extract 8 coeffs from U,V */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
886 for(j=0; j<chrFilterSize; j++) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
887 X = vec_ld (0, &chrSrc[j][i/2]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
888 U = vec_mradds (X, CCoeffs[j], U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
889 X = vec_ld (0, &chrSrc[j][i/2+2048]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
890 V = vec_mradds (X, CCoeffs[j], V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
891 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
892
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
893 /* scale and clip signals */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
894 Y0 = vec_sra (Y0, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
895 Y1 = vec_sra (Y1, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
896 U = vec_sra (U, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
897 V = vec_sra (V, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
898
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
899 Y0 = vec_clip (Y0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
900 Y1 = vec_clip (Y1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
901 U = vec_clip (U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
902 V = vec_clip (V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
903
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
904 /* now we have
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
905 Y0= y0 y1 y2 y3 y4 y5 y6 y7 Y1= y8 y9 y10 y11 y12 y13 y14 y15
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
906 U= u0 u1 u2 u3 u4 u5 u6 u7 V= v0 v1 v2 v3 v4 v5 v6 v7
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
907
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
908 Y0= y0 y1 y2 y3 y4 y5 y6 y7 Y1= y8 y9 y10 y11 y12 y13 y14 y15
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
909 U0= u0 u0 u1 u1 u2 u2 u3 u3 U1= u4 u4 u5 u5 u6 u6 u7 u7
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
910 V0= v0 v0 v1 v1 v2 v2 v3 v3 V1= v4 v4 v5 v5 v6 v6 v7 v7
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
911 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
912
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
913 U0 = vec_mergeh (U,U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
914 V0 = vec_mergeh (V,V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
915
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
916 U1 = vec_mergel (U,U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
917 V1 = vec_mergel (V,V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
918
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
919 cvtyuvtoRGB (c, Y0,U0,V0,&R0,&G0,&B0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
920 cvtyuvtoRGB (c, Y1,U1,V1,&R1,&G1,&B1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
921
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
922 R = vec_packclp (R0,R1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
923 G = vec_packclp (G0,G1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
924 B = vec_packclp (B0,B1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
925
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
926 nout = (vector unsigned char *)scratch;
17560
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
927 switch(c->dstFormat) {
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
928 case IMGFMT_ABGR: out_abgr (R,G,B,nout); break;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
929 case IMGFMT_BGRA: out_bgra (R,G,B,nout); break;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
930 case IMGFMT_RGBA: out_rgba (R,G,B,nout); break;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
931 case IMGFMT_ARGB: out_argb (R,G,B,nout); break;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
932 case IMGFMT_RGB24: out_rgb24 (R,G,B,nout); break;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
933 case IMGFMT_BGR24: out_bgr24 (R,G,B,nout); break;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
934 default:
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
935 /* Unreachable, I think. */
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
936 MSG_ERR("altivec_yuv2packedX doesn't support %s output\n",
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
937 vo_format_name(c->dstFormat));
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
938 return;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
939 }
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
940
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
941 memcpy (&((uint32_t*)dest)[i], scratch, (dstW-i)/4);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
942 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
943
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
944 }