annotate libswscale/yuv2rgb_altivec.c @ 22997:fd0fda0c6555

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