annotate postproc/yuv2rgb_altivec.c @ 18715:30d7ddf08889

Fix window position when changing videos while in fullscreen and for window managers that modify position on Map. Oked by Alexander Strasser.
author reimar
date Thu, 15 Jun 2006 08:00:37 +0000
parents 62cdcca26777
children
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
17638
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
213 #define vec_clip_s16(x) \
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
214 vec_max (vec_min (x, (vector signed short)AVV(235,235,235,235,235,235,235,235)),\
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
215 (vector signed short)AVV(16, 16, 16, 16, 16, 16, 16, 16 ))
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
216
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
217 #define vec_packclp(x,y) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
218 (vector unsigned char)vec_packs \
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
219 ((vector unsigned short)vec_max (x,(vector signed short) AVV(0)), \
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
220 (vector unsigned short)vec_max (y,(vector signed short) AVV(0)))
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
221
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
222 //#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
223
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
224
12836
9a310b31359f some fixes
alex
parents: 12698
diff changeset
225 static inline void cvtyuvtoRGB (SwsContext *c,
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
226 vector signed short Y, vector signed short U, vector signed short V,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
227 vector signed short *R, vector signed short *G, vector signed short *B)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
228 {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
229 vector signed short vx,ux,uvx;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
230
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
231 Y = vec_mradds (Y, c->CY, c->OY);
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
232 U = vec_sub (U,(vector signed short)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
233 vec_splat((vector signed short)AVV(128),0));
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
234 V = vec_sub (V,(vector signed short)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
235 vec_splat((vector signed short)AVV(128),0));
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
236
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
237 // ux = (CBU*(u<<c->CSHIFT)+0x4000)>>15;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
238 ux = vec_sl (U, c->CSHIFT);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
239 *B = vec_mradds (ux, c->CBU, Y);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
240
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
241 // vx = (CRV*(v<<c->CSHIFT)+0x4000)>>15;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
242 vx = vec_sl (V, c->CSHIFT);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
243 *R = vec_mradds (vx, c->CRV, Y);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
244
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
245 // uvx = ((CGU*u) + (CGV*v))>>15;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
246 uvx = vec_mradds (U, c->CGU, Y);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
247 *G = vec_mradds (V, c->CGV, uvx);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
248 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
249
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 CS converters
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
254 ------------------------------------------------------------------------------
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
255 */
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 #define DEFCSP420_CVT(name,out_pixels) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
259 static int altivec_##name (SwsContext *c, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
260 unsigned char **in, int *instrides, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
261 int srcSliceY, int srcSliceH, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
262 unsigned char **oplanes, int *outstrides) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
263 { \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
264 int w = c->srcW; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
265 int h = srcSliceH; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
266 int i,j; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
267 int instrides_scl[3]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
268 vector unsigned char y0,y1; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
269 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
270 vector signed char u,v; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
271 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
272 vector signed short Y0,Y1,Y2,Y3; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
273 vector signed short U,V; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
274 vector signed short vx,ux,uvx; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
275 vector signed short vx0,ux0,uvx0; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
276 vector signed short vx1,ux1,uvx1; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
277 vector signed short R0,G0,B0; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
278 vector signed short R1,G1,B1; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
279 vector unsigned char R,G,B; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
280 \
18322
62cdcca26777 Fix some bugs handling input that is not aligned at 16 bytes or has
pacman
parents: 17844
diff changeset
281 vector unsigned char *y1ivP, *y2ivP, *uivP, *vivP; \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
282 vector unsigned char align_perm; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
283 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
284 vector signed short \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
285 lCY = c->CY, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
286 lOY = c->OY, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
287 lCRV = c->CRV, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
288 lCBU = c->CBU, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
289 lCGU = c->CGU, \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
290 lCGV = c->CGV; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
291 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
292 vector unsigned short lCSHIFT = c->CSHIFT; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
293 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
294 ubyte *y1i = in[0]; \
18322
62cdcca26777 Fix some bugs handling input that is not aligned at 16 bytes or has
pacman
parents: 17844
diff changeset
295 ubyte *y2i = in[0]+instrides[0]; \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
296 ubyte *ui = in[1]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
297 ubyte *vi = in[2]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
298 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
299 vector unsigned char *oute \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
300 = (vector unsigned char *) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
301 (oplanes[0]+srcSliceY*outstrides[0]); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
302 vector unsigned char *outo \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
303 = (vector unsigned char *) \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
304 (oplanes[0]+srcSliceY*outstrides[0]+outstrides[0]); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
305 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
306 \
18322
62cdcca26777 Fix some bugs handling input that is not aligned at 16 bytes or has
pacman
parents: 17844
diff changeset
307 instrides_scl[0] = instrides[0]*2-w; /* the loop moves y{1,2}i by w */ \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
308 instrides_scl[1] = instrides[1]-w/2; /* the loop moves ui by w/2 */ \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
309 instrides_scl[2] = instrides[2]-w/2; /* the loop moves vi by w/2 */ \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
310 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
311 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
312 for (i=0;i<h/2;i++) { \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
313 vec_dstst (outo, (0x02000002|(((w*3+32)/32)<<16)), 0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
314 vec_dstst (oute, (0x02000002|(((w*3+32)/32)<<16)), 1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
315 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
316 for (j=0;j<w/16;j++) { \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
317 \
18322
62cdcca26777 Fix some bugs handling input that is not aligned at 16 bytes or has
pacman
parents: 17844
diff changeset
318 y1ivP = (vector unsigned char *)y1i; \
62cdcca26777 Fix some bugs handling input that is not aligned at 16 bytes or has
pacman
parents: 17844
diff changeset
319 y2ivP = (vector unsigned char *)y2i; \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
320 uivP = (vector unsigned char *)ui; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
321 vivP = (vector unsigned char *)vi; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
322 \
18322
62cdcca26777 Fix some bugs handling input that is not aligned at 16 bytes or has
pacman
parents: 17844
diff changeset
323 align_perm = vec_lvsl (0, y1i); \
62cdcca26777 Fix some bugs handling input that is not aligned at 16 bytes or has
pacman
parents: 17844
diff changeset
324 y0 = (vector unsigned char)vec_perm (y1ivP[0], y1ivP[1], align_perm);\
62cdcca26777 Fix some bugs handling input that is not aligned at 16 bytes or has
pacman
parents: 17844
diff changeset
325 \
62cdcca26777 Fix some bugs handling input that is not aligned at 16 bytes or has
pacman
parents: 17844
diff changeset
326 align_perm = vec_lvsl (0, y2i); \
62cdcca26777 Fix some bugs handling input that is not aligned at 16 bytes or has
pacman
parents: 17844
diff changeset
327 y1 = (vector unsigned char)vec_perm (y2ivP[0], y2ivP[1], align_perm);\
62cdcca26777 Fix some bugs handling input that is not aligned at 16 bytes or has
pacman
parents: 17844
diff changeset
328 \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
329 align_perm = vec_lvsl (0, ui); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
330 u = (vector signed char)vec_perm (uivP[0], uivP[1], align_perm); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
331 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
332 align_perm = vec_lvsl (0, vi); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
333 v = (vector signed char)vec_perm (vivP[0], vivP[1], align_perm); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
334 \
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
335 u = (vector signed char) \
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
336 vec_sub (u,(vector signed char) \
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
337 vec_splat((vector signed char)AVV(128),0));\
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
338 v = (vector signed char) \
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
339 vec_sub (v,(vector signed char) \
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
340 vec_splat((vector signed char)AVV(128),0));\
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
341 \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
342 U = vec_unpackh (u); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
343 V = vec_unpackh (v); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
344 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
345 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
346 Y0 = vec_unh (y0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
347 Y1 = vec_unl (y0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
348 Y2 = vec_unh (y1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
349 Y3 = vec_unl (y1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
350 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
351 Y0 = vec_mradds (Y0, lCY, lOY); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
352 Y1 = vec_mradds (Y1, lCY, lOY); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
353 Y2 = vec_mradds (Y2, lCY, lOY); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
354 Y3 = vec_mradds (Y3, lCY, lOY); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
355 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
356 /* ux = (CBU*(u<<CSHIFT)+0x4000)>>15 */ \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
357 ux = vec_sl (U, lCSHIFT); \
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
358 ux = vec_mradds (ux, lCBU, (vector signed short)AVV(0)); \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
359 ux0 = vec_mergeh (ux,ux); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
360 ux1 = vec_mergel (ux,ux); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
361 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
362 /* vx = (CRV*(v<<CSHIFT)+0x4000)>>15; */ \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
363 vx = vec_sl (V, lCSHIFT); \
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
364 vx = vec_mradds (vx, lCRV, (vector signed short)AVV(0)); \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
365 vx0 = vec_mergeh (vx,vx); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
366 vx1 = vec_mergel (vx,vx); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
367 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
368 /* uvx = ((CGU*u) + (CGV*v))>>15 */ \
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
369 uvx = vec_mradds (U, lCGU, (vector signed short)AVV(0)); \
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
370 uvx = vec_mradds (V, lCGV, uvx); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
371 uvx0 = vec_mergeh (uvx,uvx); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
372 uvx1 = vec_mergel (uvx,uvx); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
373 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
374 R0 = vec_add (Y0,vx0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
375 G0 = vec_add (Y0,uvx0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
376 B0 = vec_add (Y0,ux0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
377 R1 = vec_add (Y1,vx1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
378 G1 = vec_add (Y1,uvx1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
379 B1 = vec_add (Y1,ux1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
380 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
381 R = vec_packclp (R0,R1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
382 G = vec_packclp (G0,G1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
383 B = vec_packclp (B0,B1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
384 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
385 out_pixels(R,G,B,oute); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
386 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
387 R0 = vec_add (Y2,vx0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
388 G0 = vec_add (Y2,uvx0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
389 B0 = vec_add (Y2,ux0); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
390 R1 = vec_add (Y3,vx1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
391 G1 = vec_add (Y3,uvx1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
392 B1 = vec_add (Y3,ux1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
393 R = vec_packclp (R0,R1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
394 G = vec_packclp (G0,G1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
395 B = vec_packclp (B0,B1); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
396 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
397 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
398 out_pixels(R,G,B,outo); \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
399 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
400 y1i += 16; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
401 y2i += 16; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
402 ui += 8; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
403 vi += 8; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
404 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
405 } \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
406 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
407 outo += (outstrides[0])>>4; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
408 oute += (outstrides[0])>>4; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
409 \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
410 ui += instrides_scl[1]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
411 vi += instrides_scl[2]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
412 y1i += instrides_scl[0]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
413 y2i += instrides_scl[0]; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
414 } \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
415 return srcSliceH; \
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
416 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
417
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
418
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
419 #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
420 #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
421 #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
422 #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
423 #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
424 #define out_bgr24(a,b,c,ptr) vec_mstbgr24(a,b,c,ptr)
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
425
17844
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
426 DEFCSP420_CVT (yuv2_abgr, out_abgr)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
427 #if 1
17844
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
428 DEFCSP420_CVT (yuv2_bgra, out_bgra)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
429 #else
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
430 static int altivec_yuv2_bgra32 (SwsContext *c,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
431 unsigned char **in, int *instrides,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
432 int srcSliceY, int srcSliceH,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
433 unsigned char **oplanes, int *outstrides)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
434 {
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
435 int w = c->srcW;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
436 int h = srcSliceH;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
437 int i,j;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
438 int instrides_scl[3];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
439 vector unsigned char y0,y1;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
440
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
441 vector signed char u,v;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
442
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
443 vector signed short Y0,Y1,Y2,Y3;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
444 vector signed short U,V;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
445 vector signed short vx,ux,uvx;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
446 vector signed short vx0,ux0,uvx0;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
447 vector signed short vx1,ux1,uvx1;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
448 vector signed short R0,G0,B0;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
449 vector signed short R1,G1,B1;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
450 vector unsigned char R,G,B;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
451
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
452 vector unsigned char *uivP, *vivP;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
453 vector unsigned char align_perm;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
454
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
455 vector signed short
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
456 lCY = c->CY,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
457 lOY = c->OY,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
458 lCRV = c->CRV,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
459 lCBU = c->CBU,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
460 lCGU = c->CGU,
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
461 lCGV = c->CGV;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
462
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
463 vector unsigned short lCSHIFT = c->CSHIFT;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
464
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
465 ubyte *y1i = in[0];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
466 ubyte *y2i = in[0]+w;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
467 ubyte *ui = in[1];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
468 ubyte *vi = in[2];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
469
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
470 vector unsigned char *oute
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
471 = (vector unsigned char *)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
472 (oplanes[0]+srcSliceY*outstrides[0]);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
473 vector unsigned char *outo
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
474 = (vector unsigned char *)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
475 (oplanes[0]+srcSliceY*outstrides[0]+outstrides[0]);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
476
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 instrides_scl[0] = instrides[0];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
479 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
480 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
481
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 (i=0;i<h/2;i++) {
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
484 vec_dstst (outo, (0x02000002|(((w*3+32)/32)<<16)), 0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
485 vec_dstst (oute, (0x02000002|(((w*3+32)/32)<<16)), 1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
486
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
487 for (j=0;j<w/16;j++) {
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
488
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
489 y0 = vec_ldl (0,y1i);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
490 y1 = vec_ldl (0,y2i);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
491 uivP = (vector unsigned char *)ui;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
492 vivP = (vector unsigned char *)vi;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
493
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
494 align_perm = vec_lvsl (0, ui);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
495 u = (vector signed char)vec_perm (uivP[0], uivP[1], align_perm);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
496
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
497 align_perm = vec_lvsl (0, vi);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
498 v = (vector signed char)vec_perm (vivP[0], vivP[1], align_perm);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
499 u = (vector signed char)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
500 vec_sub (u,(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 v = (vector signed char)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
504 vec_sub (v, (vector signed char)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
505 vec_splat((vector signed char)AVV(128),0));
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 U = vec_unpackh (u);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
508 V = vec_unpackh (v);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
509
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
510
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
511 Y0 = vec_unh (y0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
512 Y1 = vec_unl (y0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
513 Y2 = vec_unh (y1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
514 Y3 = vec_unl (y1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
515
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
516 Y0 = vec_mradds (Y0, lCY, lOY);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
517 Y1 = vec_mradds (Y1, lCY, lOY);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
518 Y2 = vec_mradds (Y2, lCY, lOY);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
519 Y3 = vec_mradds (Y3, lCY, lOY);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
520
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
521 /* ux = (CBU*(u<<CSHIFT)+0x4000)>>15 */
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
522 ux = vec_sl (U, lCSHIFT);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
523 ux = vec_mradds (ux, lCBU, (vector signed short)AVV(0));
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
524 ux0 = vec_mergeh (ux,ux);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
525 ux1 = vec_mergel (ux,ux);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
526
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
527 /* vx = (CRV*(v<<CSHIFT)+0x4000)>>15; */
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
528 vx = vec_sl (V, lCSHIFT);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
529 vx = vec_mradds (vx, lCRV, (vector signed short)AVV(0));
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
530 vx0 = vec_mergeh (vx,vx);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
531 vx1 = vec_mergel (vx,vx);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
532 /* uvx = ((CGU*u) + (CGV*v))>>15 */
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
533 uvx = vec_mradds (U, lCGU, (vector signed short)AVV(0));
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
534 uvx = vec_mradds (V, lCGV, uvx);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
535 uvx0 = vec_mergeh (uvx,uvx);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
536 uvx1 = vec_mergel (uvx,uvx);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
537 R0 = vec_add (Y0,vx0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
538 G0 = vec_add (Y0,uvx0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
539 B0 = vec_add (Y0,ux0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
540 R1 = vec_add (Y1,vx1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
541 G1 = vec_add (Y1,uvx1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
542 B1 = vec_add (Y1,ux1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
543 R = vec_packclp (R0,R1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
544 G = vec_packclp (G0,G1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
545 B = vec_packclp (B0,B1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
546
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
547 out_argb(R,G,B,oute);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
548 R0 = vec_add (Y2,vx0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
549 G0 = vec_add (Y2,uvx0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
550 B0 = vec_add (Y2,ux0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
551 R1 = vec_add (Y3,vx1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
552 G1 = vec_add (Y3,uvx1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
553 B1 = vec_add (Y3,ux1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
554 R = vec_packclp (R0,R1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
555 G = vec_packclp (G0,G1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
556 B = vec_packclp (B0,B1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
557
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
558 out_argb(R,G,B,outo);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
559 y1i += 16;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
560 y2i += 16;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
561 ui += 8;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
562 vi += 8;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
563
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
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
566 outo += (outstrides[0])>>4;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
567 oute += (outstrides[0])>>4;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
568
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
569 ui += instrides_scl[1];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
570 vi += instrides_scl[2];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
571 y1i += instrides_scl[0];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
572 y2i += instrides_scl[0];
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
573 }
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
574 return srcSliceH;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
575 }
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
576
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
577 #endif
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
578
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
579
17844
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
580 DEFCSP420_CVT (yuv2_rgba, out_rgba)
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
581 DEFCSP420_CVT (yuv2_argb, out_argb)
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
582 DEFCSP420_CVT (yuv2_rgb24, out_rgb24)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
583 DEFCSP420_CVT (yuv2_bgr24, out_bgr24)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
584
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
585
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
586 // uyvy|uyvy|uyvy|uyvy
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
587 // 0123 4567 89ab cdef
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
588 static
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
589 const vector unsigned char
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
590 demux_u = (const vector unsigned char)AVV(0x10,0x00,0x10,0x00,
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
591 0x10,0x04,0x10,0x04,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
592 0x10,0x08,0x10,0x08,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
593 0x10,0x0c,0x10,0x0c),
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
594 demux_v = (const vector unsigned char)AVV(0x10,0x02,0x10,0x02,
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
595 0x10,0x06,0x10,0x06,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
596 0x10,0x0A,0x10,0x0A,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
597 0x10,0x0E,0x10,0x0E),
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
598 demux_y = (const vector unsigned char)AVV(0x10,0x01,0x10,0x03,
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
599 0x10,0x05,0x10,0x07,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
600 0x10,0x09,0x10,0x0B,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
601 0x10,0x0D,0x10,0x0F);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
602
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
603 /*
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
604 this is so I can play live CCIR raw video
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
605 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
606 static int altivec_uyvy_rgb32 (SwsContext *c,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
607 unsigned char **in, int *instrides,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
608 int srcSliceY, int srcSliceH,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
609 unsigned char **oplanes, int *outstrides)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
610 {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
611 int w = c->srcW;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
612 int h = srcSliceH;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
613 int i,j;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
614 vector unsigned char uyvy;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
615 vector signed short Y,U,V;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
616 vector signed short vx,ux,uvx;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
617 vector signed short R0,G0,B0,R1,G1,B1;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
618 vector unsigned char R,G,B;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
619 vector unsigned char *out;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
620 ubyte *img;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
621
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
622 img = in[0];
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
623 out = (vector unsigned char *)(oplanes[0]+srcSliceY*outstrides[0]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
624
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
625 for (i=0;i<h;i++) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
626 for (j=0;j<w/16;j++) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
627 uyvy = vec_ld (0, img);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
628 U = (vector signed short)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
629 vec_perm (uyvy, (vector unsigned char)AVV(0), demux_u);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
630
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
631 V = (vector signed short)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
632 vec_perm (uyvy, (vector unsigned char)AVV(0), demux_v);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
633
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
634 Y = (vector signed short)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
635 vec_perm (uyvy, (vector unsigned char)AVV(0), demux_y);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
636
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
637 cvtyuvtoRGB (c, Y,U,V,&R0,&G0,&B0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
638
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
639 uyvy = vec_ld (16, img);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
640 U = (vector signed short)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
641 vec_perm (uyvy, (vector unsigned char)AVV(0), demux_u);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
642
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
643 V = (vector signed short)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
644 vec_perm (uyvy, (vector unsigned char)AVV(0), demux_v);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
645
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
646 Y = (vector signed short)
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
647 vec_perm (uyvy, (vector unsigned char)AVV(0), demux_y);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
648
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
649 cvtyuvtoRGB (c, Y,U,V,&R1,&G1,&B1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
650
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
651 R = vec_packclp (R0,R1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
652 G = vec_packclp (G0,G1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
653 B = vec_packclp (B0,B1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
654
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
655 // vec_mstbgr24 (R,G,B, out);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
656 out_rgba (R,G,B,out);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
657
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
658 img += 32;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
659 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
660 }
12836
9a310b31359f some fixes
alex
parents: 12698
diff changeset
661 return srcSliceH;
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
662 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
663
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
664
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
665
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
666 /* Ok currently the acceleration routine only supports
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
667 inputs of widths a multiple of 16
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
668 and heights a multiple 2
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
669
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
670 So we just fall back to the C codes for this.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
671 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
672 SwsFunc yuv2rgb_init_altivec (SwsContext *c)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
673 {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
674 if (!(c->flags & SWS_CPU_CAPS_ALTIVEC))
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
675 return NULL;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
676
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
677 /*
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
678 and this seems not to matter too much I tried a bunch of
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
679 videos with abnormal widths and mplayer crashes else where.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
680 mplayer -vo x11 -rawvideo on:w=350:h=240 raw-350x240.eyuv
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
681 boom with X11 bad match.
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
682
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
683 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
684 if ((c->srcW & 0xf) != 0) return NULL;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
685
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
686 switch (c->srcFormat) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
687 case IMGFMT_YVU9:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
688 case IMGFMT_IF09:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
689 case IMGFMT_YV12:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
690 case IMGFMT_I420:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
691 case IMGFMT_IYUV:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
692 case IMGFMT_CLPL:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
693 case IMGFMT_Y800:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
694 case IMGFMT_Y8:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
695 case IMGFMT_NV12:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
696 case IMGFMT_NV21:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
697 if ((c->srcH & 0x1) != 0)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
698 return NULL;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
699
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
700 switch(c->dstFormat){
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
701 case IMGFMT_RGB24:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
702 MSG_WARN("ALTIVEC: Color Space RGB24\n");
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
703 return altivec_yuv2_rgb24;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
704 case IMGFMT_BGR24:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
705 MSG_WARN("ALTIVEC: Color Space BGR24\n");
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
706 return altivec_yuv2_bgr24;
17844
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
707 case IMGFMT_ARGB:
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
708 MSG_WARN("ALTIVEC: Color Space ARGB\n");
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
709 return altivec_yuv2_argb;
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
710 case IMGFMT_ABGR:
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
711 MSG_WARN("ALTIVEC: Color Space ABGR\n");
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
712 return altivec_yuv2_abgr;
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
713 case IMGFMT_RGBA:
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
714 MSG_WARN("ALTIVEC: Color Space RGBA\n");
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
715 return altivec_yuv2_rgba;
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
716 case IMGFMT_BGRA:
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
717 MSG_WARN("ALTIVEC: Color Space BGRA\n");
194a848d907f Support all 4 of ARGB/RGBA/BGRA/ABGR unscaled conversions, with more
pacman
parents: 17642
diff changeset
718 return altivec_yuv2_bgra;
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
719 default: return NULL;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
720 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
721 break;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
722
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
723 case IMGFMT_UYVY:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
724 switch(c->dstFormat){
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
725 case IMGFMT_RGB32:
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
726 MSG_WARN("ALTIVEC: Color Space UYVY -> RGB32\n");
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
727 return altivec_uyvy_rgb32;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
728 default: return NULL;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
729 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
730 break;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
731
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
732 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
733 return NULL;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
734 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
735
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
736 static uint16_t roundToInt16(int64_t f){
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
737 int r= (f + (1<<15))>>16;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
738 if(r<-0x7FFF) return 0x8000;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
739 else if(r> 0x7FFF) return 0x7FFF;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
740 else return r;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
741 }
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
742
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
743 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
744 {
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
745 union {
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
746 signed short tmp[8] __attribute__ ((aligned(16)));
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
747 vector signed short vec;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
748 } buf;
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
749
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
750 buf.tmp[0] = ( (0xffffLL) * contrast>>8 )>>9; //cy
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
751 buf.tmp[1] = -256*brightness; //oy
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
752 buf.tmp[2] = (inv_table[0]>>3) *(contrast>>16)*(saturation>>16); //crv
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
753 buf.tmp[3] = (inv_table[1]>>3) *(contrast>>16)*(saturation>>16); //cbu
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
754 buf.tmp[4] = -((inv_table[2]>>1)*(contrast>>16)*(saturation>>16)); //cgu
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
755 buf.tmp[5] = -((inv_table[3]>>1)*(contrast>>16)*(saturation>>16)); //cgv
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
756
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
757
17638
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
758 c->CSHIFT = (vector unsigned short)vec_splat_u16(2);
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
759 c->CY = vec_splat ((vector signed short)buf.vec, 0);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
760 c->OY = vec_splat ((vector signed short)buf.vec, 1);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
761 c->CRV = vec_splat ((vector signed short)buf.vec, 2);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
762 c->CBU = vec_splat ((vector signed short)buf.vec, 3);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
763 c->CGU = vec_splat ((vector signed short)buf.vec, 4);
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
764 c->CGV = vec_splat ((vector signed short)buf.vec, 5);
12836
9a310b31359f some fixes
alex
parents: 12698
diff changeset
765 #if 0
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
766 {
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
767 int i;
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
768 char *v[6]={"cy","oy","crv","cbu","cgu","cgv"};
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
769 for (i=0; i<6;i++)
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
770 printf("%s %d ", v[i],buf.tmp[i] );
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
771 printf("\n");
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
772 }
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
773 #endif
12836
9a310b31359f some fixes
alex
parents: 12698
diff changeset
774 return;
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
775 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
776
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
777
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
778 void
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
779 altivec_yuv2packedX (SwsContext *c,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
780 int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
781 int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize,
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
782 uint8_t *dest, int dstW, int dstY)
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
783 {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
784 int i,j;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
785 short *f;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
786 vector signed short X,X0,X1,Y0,U0,V0,Y1,U1,V1,U,V;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
787 vector signed short R0,G0,B0,R1,G1,B1;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
788
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
789 vector unsigned char R,G,B,pels[3];
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
790 vector unsigned char *out,*nout;
13564
992960f68af0 postproc/yuv2rgb_altivec.c compile fix
michael
parents: 12837
diff changeset
791
17638
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
792 vector signed short RND = vec_splat_s16(1<<3);
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
793 vector unsigned short SCL = vec_splat_u16(4);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
794 unsigned long scratch[16] __attribute__ ((aligned (16)));
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
795
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
796 vector signed short *YCoeffs, *CCoeffs;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
797
17588
79081ba52e00 Move the v{Y,C}CoeffsBank vectors into the SwsContext, filling them in just
diego
parents: 17563
diff changeset
798 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
799 CCoeffs = c->vCCoeffsBank+dstY*chrFilterSize;
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
800
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
801 out = (vector unsigned char *)dest;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
802
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
803 for(i=0; i<dstW; i+=16){
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
804 Y0 = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
805 Y1 = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
806 /* extract 16 coeffs from lumSrc */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
807 for(j=0; j<lumFilterSize; j++) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
808 X0 = vec_ld (0, &lumSrc[j][i]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
809 X1 = vec_ld (16, &lumSrc[j][i]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
810 Y0 = vec_mradds (X0, YCoeffs[j], Y0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
811 Y1 = vec_mradds (X1, YCoeffs[j], Y1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
812 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
813
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
814 U = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
815 V = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
816 /* extract 8 coeffs from U,V */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
817 for(j=0; j<chrFilterSize; j++) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
818 X = vec_ld (0, &chrSrc[j][i/2]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
819 U = vec_mradds (X, CCoeffs[j], U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
820 X = vec_ld (0, &chrSrc[j][i/2+2048]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
821 V = vec_mradds (X, CCoeffs[j], V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
822 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
823
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
824 /* scale and clip signals */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
825 Y0 = vec_sra (Y0, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
826 Y1 = vec_sra (Y1, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
827 U = vec_sra (U, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
828 V = vec_sra (V, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
829
17638
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
830 Y0 = vec_clip_s16 (Y0);
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
831 Y1 = vec_clip_s16 (Y1);
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
832 U = vec_clip_s16 (U);
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
833 V = vec_clip_s16 (V);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
834
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
835 /* now we have
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
836 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
837 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
838
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
839 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
840 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
841 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
842 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
843
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
844 U0 = vec_mergeh (U,U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
845 V0 = vec_mergeh (V,V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
846
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
847 U1 = vec_mergel (U,U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
848 V1 = vec_mergel (V,V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
849
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
850 cvtyuvtoRGB (c, Y0,U0,V0,&R0,&G0,&B0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
851 cvtyuvtoRGB (c, Y1,U1,V1,&R1,&G1,&B1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
852
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
853 R = vec_packclp (R0,R1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
854 G = vec_packclp (G0,G1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
855 B = vec_packclp (B0,B1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
856
17560
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
857 switch(c->dstFormat) {
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
858 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
859 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
860 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
861 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
862 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
863 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
864 default:
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
865 {
17642
64e5c4e34f07 Just a comment update, replacing a FIXME to reflect the new expectation of
pacman
parents: 17638
diff changeset
866 /* If this is reached, the caller should have called yuv2packedXinC
64e5c4e34f07 Just a comment update, replacing a FIXME to reflect the new expectation of
pacman
parents: 17638
diff changeset
867 instead. */
17560
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
868 static int printed_error_message;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
869 if(!printed_error_message) {
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
870 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
871 vo_format_name(c->dstFormat));
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
872 printed_error_message=1;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
873 }
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
874 return;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
875 }
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
876 }
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
877 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
878
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
879 if (i < dstW) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
880 i -= 16;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
881
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
882 Y0 = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
883 Y1 = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
884 /* extract 16 coeffs from lumSrc */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
885 for(j=0; j<lumFilterSize; j++) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
886 X0 = vec_ld (0, &lumSrc[j][i]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
887 X1 = vec_ld (16, &lumSrc[j][i]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
888 Y0 = vec_mradds (X0, YCoeffs[j], Y0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
889 Y1 = vec_mradds (X1, YCoeffs[j], Y1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
890 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
891
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
892 U = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
893 V = RND;
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
894 /* extract 8 coeffs from U,V */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
895 for(j=0; j<chrFilterSize; j++) {
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
896 X = vec_ld (0, &chrSrc[j][i/2]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
897 U = vec_mradds (X, CCoeffs[j], U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
898 X = vec_ld (0, &chrSrc[j][i/2+2048]);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
899 V = vec_mradds (X, CCoeffs[j], V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
900 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
901
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
902 /* scale and clip signals */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
903 Y0 = vec_sra (Y0, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
904 Y1 = vec_sra (Y1, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
905 U = vec_sra (U, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
906 V = vec_sra (V, SCL);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
907
17638
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
908 Y0 = vec_clip_s16 (Y0);
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
909 Y1 = vec_clip_s16 (Y1);
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
910 U = vec_clip_s16 (U);
ee8d71a1b7ba Fix vec_clip for gcc's that don't handle (vector signed short){16} according
pacman
parents: 17588
diff changeset
911 V = vec_clip_s16 (V);
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
912
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
913 /* now we have
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
914 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
915 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
916
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
917 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
918 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
919 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
920 */
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
921
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
922 U0 = vec_mergeh (U,U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
923 V0 = vec_mergeh (V,V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
924
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
925 U1 = vec_mergel (U,U);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
926 V1 = vec_mergel (V,V);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
927
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
928 cvtyuvtoRGB (c, Y0,U0,V0,&R0,&G0,&B0);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
929 cvtyuvtoRGB (c, Y1,U1,V1,&R1,&G1,&B1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
930
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
931 R = vec_packclp (R0,R1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
932 G = vec_packclp (G0,G1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
933 B = vec_packclp (B0,B1);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
934
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
935 nout = (vector unsigned char *)scratch;
17560
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
936 switch(c->dstFormat) {
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
937 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
938 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
939 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
940 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
941 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
942 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
943 default:
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
944 /* Unreachable, I think. */
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
945 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
946 vo_format_name(c->dstFormat));
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
947 return;
1a54f39404b9 altivec_yuv2packedX() ignores the requested output format and unconditionally
diego
parents: 17558
diff changeset
948 }
12698
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
949
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
950 memcpy (&((uint32_t*)dest)[i], scratch, (dstW-i)/4);
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
951 }
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
952
d2aef091743c altivec yuv->rgb converter
michael
parents:
diff changeset
953 }