ffmpeg / libswscale / rgb2rgb.c @ 8a322796
History | View | Annotate | Download (17.3 KB)
1 |
/*
|
---|---|
2 |
* software RGB to RGB converter
|
3 |
* pluralize by software PAL8 to RGB converter
|
4 |
* software YUV to YUV converter
|
5 |
* software YUV to RGB converter
|
6 |
* Written by Nick Kurshev.
|
7 |
* palette & YUV & runtime CPU stuff by Michael (michaelni@gmx.at)
|
8 |
*
|
9 |
* This file is part of FFmpeg.
|
10 |
*
|
11 |
* FFmpeg is free software; you can redistribute it and/or modify
|
12 |
* it under the terms of the GNU General Public License as published by
|
13 |
* the Free Software Foundation; either version 2 of the License, or
|
14 |
* (at your option) any later version.
|
15 |
*
|
16 |
* FFmpeg is distributed in the hope that it will be useful,
|
17 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
18 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
19 |
* GNU General Public License for more details.
|
20 |
*
|
21 |
* You should have received a copy of the GNU General Public License
|
22 |
* along with FFmpeg; if not, write to the Free Software
|
23 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
24 |
*
|
25 |
* The C code (not assembly, MMX, ...) of this file can be used
|
26 |
* under the LGPL license.
|
27 |
*/
|
28 |
#include <inttypes.h> |
29 |
#include "config.h" |
30 |
#include "libavutil/x86_cpu.h" |
31 |
#include "libavutil/bswap.h" |
32 |
#include "rgb2rgb.h" |
33 |
#include "swscale.h" |
34 |
#include "swscale_internal.h" |
35 |
|
36 |
#define FAST_BGR2YV12 // use 7-bit instead of 15-bit coefficients |
37 |
|
38 |
void (*rgb24to32)(const uint8_t *src, uint8_t *dst, long src_size); |
39 |
void (*rgb24to16)(const uint8_t *src, uint8_t *dst, long src_size); |
40 |
void (*rgb24to15)(const uint8_t *src, uint8_t *dst, long src_size); |
41 |
void (*rgb32to24)(const uint8_t *src, uint8_t *dst, long src_size); |
42 |
void (*rgb32to16)(const uint8_t *src, uint8_t *dst, long src_size); |
43 |
void (*rgb32to15)(const uint8_t *src, uint8_t *dst, long src_size); |
44 |
void (*rgb15to16)(const uint8_t *src, uint8_t *dst, long src_size); |
45 |
void (*rgb15to24)(const uint8_t *src, uint8_t *dst, long src_size); |
46 |
void (*rgb15to32)(const uint8_t *src, uint8_t *dst, long src_size); |
47 |
void (*rgb16to15)(const uint8_t *src, uint8_t *dst, long src_size); |
48 |
void (*rgb16to24)(const uint8_t *src, uint8_t *dst, long src_size); |
49 |
void (*rgb16to32)(const uint8_t *src, uint8_t *dst, long src_size); |
50 |
//void (*rgb24tobgr32)(const uint8_t *src, uint8_t *dst, long src_size);
|
51 |
void (*rgb24tobgr24)(const uint8_t *src, uint8_t *dst, long src_size); |
52 |
void (*rgb24tobgr16)(const uint8_t *src, uint8_t *dst, long src_size); |
53 |
void (*rgb24tobgr15)(const uint8_t *src, uint8_t *dst, long src_size); |
54 |
void (*rgb32tobgr32)(const uint8_t *src, uint8_t *dst, long src_size); |
55 |
//void (*rgb32tobgr24)(const uint8_t *src, uint8_t *dst, long src_size);
|
56 |
void (*rgb32tobgr16)(const uint8_t *src, uint8_t *dst, long src_size); |
57 |
void (*rgb32tobgr15)(const uint8_t *src, uint8_t *dst, long src_size); |
58 |
|
59 |
void (*yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, |
60 |
long width, long height, |
61 |
long lumStride, long chromStride, long dstStride); |
62 |
void (*yv12touyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, |
63 |
long width, long height, |
64 |
long lumStride, long chromStride, long dstStride); |
65 |
void (*yuv422ptoyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, |
66 |
long width, long height, |
67 |
long lumStride, long chromStride, long dstStride); |
68 |
void (*yuy2toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, |
69 |
long width, long height, |
70 |
long lumStride, long chromStride, long srcStride); |
71 |
void (*rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, |
72 |
long width, long height, |
73 |
long lumStride, long chromStride, long srcStride); |
74 |
void (*planar2x)(const uint8_t *src, uint8_t *dst, long width, long height, |
75 |
long srcStride, long dstStride); |
76 |
void (*interleaveBytes)(uint8_t *src1, uint8_t *src2, uint8_t *dst,
|
77 |
long width, long height, long src1Stride, |
78 |
long src2Stride, long dstStride); |
79 |
void (*vu9_to_vu12)(const uint8_t *src1, const uint8_t *src2, |
80 |
uint8_t *dst1, uint8_t *dst2, |
81 |
long width, long height, |
82 |
long srcStride1, long srcStride2, |
83 |
long dstStride1, long dstStride2); |
84 |
void (*yvu9_to_yuy2)(const uint8_t *src1, const uint8_t *src2, const uint8_t *src3, |
85 |
uint8_t *dst, |
86 |
long width, long height, |
87 |
long srcStride1, long srcStride2, |
88 |
long srcStride3, long dstStride); |
89 |
|
90 |
#if defined(ARCH_X86) && defined(CONFIG_GPL)
|
91 |
DECLARE_ASM_CONST(8, uint64_t, mmx_null) = 0x0000000000000000ULL; |
92 |
DECLARE_ASM_CONST(8, uint64_t, mmx_one) = 0xFFFFFFFFFFFFFFFFULL; |
93 |
DECLARE_ASM_CONST(8, uint64_t, mask32b) = 0x000000FF000000FFULL; |
94 |
DECLARE_ASM_CONST(8, uint64_t, mask32g) = 0x0000FF000000FF00ULL; |
95 |
DECLARE_ASM_CONST(8, uint64_t, mask32r) = 0x00FF000000FF0000ULL; |
96 |
DECLARE_ASM_CONST(8, uint64_t, mask32) = 0x00FFFFFF00FFFFFFULL; |
97 |
DECLARE_ASM_CONST(8, uint64_t, mask3216br) = 0x00F800F800F800F8ULL; |
98 |
DECLARE_ASM_CONST(8, uint64_t, mask3216g) = 0x0000FC000000FC00ULL; |
99 |
DECLARE_ASM_CONST(8, uint64_t, mask3215g) = 0x0000F8000000F800ULL; |
100 |
DECLARE_ASM_CONST(8, uint64_t, mul3216) = 0x2000000420000004ULL; |
101 |
DECLARE_ASM_CONST(8, uint64_t, mul3215) = 0x2000000820000008ULL; |
102 |
DECLARE_ASM_CONST(8, uint64_t, mask24b) = 0x00FF0000FF0000FFULL; |
103 |
DECLARE_ASM_CONST(8, uint64_t, mask24g) = 0xFF0000FF0000FF00ULL; |
104 |
DECLARE_ASM_CONST(8, uint64_t, mask24r) = 0x0000FF0000FF0000ULL; |
105 |
DECLARE_ASM_CONST(8, uint64_t, mask24l) = 0x0000000000FFFFFFULL; |
106 |
DECLARE_ASM_CONST(8, uint64_t, mask24h) = 0x0000FFFFFF000000ULL; |
107 |
DECLARE_ASM_CONST(8, uint64_t, mask24hh) = 0xffff000000000000ULL; |
108 |
DECLARE_ASM_CONST(8, uint64_t, mask24hhh) = 0xffffffff00000000ULL; |
109 |
DECLARE_ASM_CONST(8, uint64_t, mask24hhhh) = 0xffffffffffff0000ULL; |
110 |
DECLARE_ASM_CONST(8, uint64_t, mask15b) = 0x001F001F001F001FULL; /* 00000000 00011111 xxB */ |
111 |
DECLARE_ASM_CONST(8, uint64_t, mask15rg) = 0x7FE07FE07FE07FE0ULL; /* 01111111 11100000 RGx */ |
112 |
DECLARE_ASM_CONST(8, uint64_t, mask15s) = 0xFFE0FFE0FFE0FFE0ULL; |
113 |
DECLARE_ASM_CONST(8, uint64_t, mask15g) = 0x03E003E003E003E0ULL; |
114 |
DECLARE_ASM_CONST(8, uint64_t, mask15r) = 0x7C007C007C007C00ULL; |
115 |
#define mask16b mask15b
|
116 |
DECLARE_ASM_CONST(8, uint64_t, mask16g) = 0x07E007E007E007E0ULL; |
117 |
DECLARE_ASM_CONST(8, uint64_t, mask16r) = 0xF800F800F800F800ULL; |
118 |
DECLARE_ASM_CONST(8, uint64_t, red_16mask) = 0x0000f8000000f800ULL; |
119 |
DECLARE_ASM_CONST(8, uint64_t, green_16mask) = 0x000007e0000007e0ULL; |
120 |
DECLARE_ASM_CONST(8, uint64_t, blue_16mask) = 0x0000001f0000001fULL; |
121 |
DECLARE_ASM_CONST(8, uint64_t, red_15mask) = 0x00007c0000007c00ULL; |
122 |
DECLARE_ASM_CONST(8, uint64_t, green_15mask) = 0x000003e0000003e0ULL; |
123 |
DECLARE_ASM_CONST(8, uint64_t, blue_15mask) = 0x0000001f0000001fULL; |
124 |
|
125 |
#if 0
|
126 |
static volatile uint64_t __attribute__((aligned(8))) b5Dither;
|
127 |
static volatile uint64_t __attribute__((aligned(8))) g5Dither;
|
128 |
static volatile uint64_t __attribute__((aligned(8))) g6Dither;
|
129 |
static volatile uint64_t __attribute__((aligned(8))) r5Dither;
|
130 |
|
131 |
static uint64_t __attribute__((aligned(8))) dither4[2]={
|
132 |
0x0103010301030103LL,
|
133 |
0x0200020002000200LL,};
|
134 |
|
135 |
static uint64_t __attribute__((aligned(8))) dither8[2]={
|
136 |
0x0602060206020602LL,
|
137 |
0x0004000400040004LL,};
|
138 |
#endif
|
139 |
#endif /* defined(ARCH_X86) */ |
140 |
|
141 |
#define RGB2YUV_SHIFT 8 |
142 |
#define BY ((int)( 0.098*(1<<RGB2YUV_SHIFT)+0.5)) |
143 |
#define BV ((int)(-0.071*(1<<RGB2YUV_SHIFT)+0.5)) |
144 |
#define BU ((int)( 0.439*(1<<RGB2YUV_SHIFT)+0.5)) |
145 |
#define GY ((int)( 0.504*(1<<RGB2YUV_SHIFT)+0.5)) |
146 |
#define GV ((int)(-0.368*(1<<RGB2YUV_SHIFT)+0.5)) |
147 |
#define GU ((int)(-0.291*(1<<RGB2YUV_SHIFT)+0.5)) |
148 |
#define RY ((int)( 0.257*(1<<RGB2YUV_SHIFT)+0.5)) |
149 |
#define RV ((int)( 0.439*(1<<RGB2YUV_SHIFT)+0.5)) |
150 |
#define RU ((int)(-0.148*(1<<RGB2YUV_SHIFT)+0.5)) |
151 |
|
152 |
//Note: We have C, MMX, MMX2, 3DNOW versions, there is no 3DNOW + MMX2 one.
|
153 |
//plain C versions
|
154 |
#undef HAVE_MMX
|
155 |
#undef HAVE_MMX2
|
156 |
#undef HAVE_3DNOW
|
157 |
#undef HAVE_SSE2
|
158 |
#define RENAME(a) a ## _C |
159 |
#include "rgb2rgb_template.c" |
160 |
|
161 |
#if defined(ARCH_X86) && defined(CONFIG_GPL)
|
162 |
|
163 |
//MMX versions
|
164 |
#undef RENAME
|
165 |
#define HAVE_MMX
|
166 |
#undef HAVE_MMX2
|
167 |
#undef HAVE_3DNOW
|
168 |
#undef HAVE_SSE2
|
169 |
#define RENAME(a) a ## _MMX |
170 |
#include "rgb2rgb_template.c" |
171 |
|
172 |
//MMX2 versions
|
173 |
#undef RENAME
|
174 |
#define HAVE_MMX
|
175 |
#define HAVE_MMX2
|
176 |
#undef HAVE_3DNOW
|
177 |
#undef HAVE_SSE2
|
178 |
#define RENAME(a) a ## _MMX2 |
179 |
#include "rgb2rgb_template.c" |
180 |
|
181 |
//3DNOW versions
|
182 |
#undef RENAME
|
183 |
#define HAVE_MMX
|
184 |
#undef HAVE_MMX2
|
185 |
#define HAVE_3DNOW
|
186 |
#undef HAVE_SSE2
|
187 |
#define RENAME(a) a ## _3DNOW |
188 |
#include "rgb2rgb_template.c" |
189 |
|
190 |
#endif //ARCH_X86 || ARCH_X86_64 |
191 |
|
192 |
/*
|
193 |
RGB15->RGB16 original by Strepto/Astral
|
194 |
ported to gcc & bugfixed : A'rpi
|
195 |
MMX2, 3DNOW optimization by Nick Kurshev
|
196 |
32-bit C version, and and&add trick by Michael Niedermayer
|
197 |
*/
|
198 |
|
199 |
void sws_rgb2rgb_init(int flags){ |
200 |
#if (defined(HAVE_MMX2) || defined(HAVE_3DNOW) || defined(HAVE_MMX)) && defined(CONFIG_GPL)
|
201 |
if (flags & SWS_CPU_CAPS_MMX2)
|
202 |
rgb2rgb_init_MMX2(); |
203 |
else if (flags & SWS_CPU_CAPS_3DNOW) |
204 |
rgb2rgb_init_3DNOW(); |
205 |
else if (flags & SWS_CPU_CAPS_MMX) |
206 |
rgb2rgb_init_MMX(); |
207 |
else
|
208 |
#endif /* defined(HAVE_MMX2) || defined(HAVE_3DNOW) || defined(HAVE_MMX) */ |
209 |
rgb2rgb_init_C(); |
210 |
} |
211 |
|
212 |
/**
|
213 |
* Palette is assumed to contain BGR32.
|
214 |
*/
|
215 |
void palette8torgb32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) |
216 |
{ |
217 |
long i;
|
218 |
|
219 |
/*
|
220 |
for (i=0; i<num_pixels; i++)
|
221 |
((unsigned *)dst)[i] = ((unsigned *)palette)[src[i]];
|
222 |
*/
|
223 |
|
224 |
for (i=0; i<num_pixels; i++) |
225 |
{ |
226 |
#ifdef WORDS_BIGENDIAN
|
227 |
dst[3]= palette[src[i]*4+2]; |
228 |
dst[2]= palette[src[i]*4+1]; |
229 |
dst[1]= palette[src[i]*4+0]; |
230 |
#else
|
231 |
//FIXME slow?
|
232 |
dst[0]= palette[src[i]*4+2]; |
233 |
dst[1]= palette[src[i]*4+1]; |
234 |
dst[2]= palette[src[i]*4+0]; |
235 |
//dst[3]= 0; /* do we need this cleansing? */
|
236 |
#endif
|
237 |
dst+= 4;
|
238 |
} |
239 |
} |
240 |
|
241 |
void palette8tobgr32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) |
242 |
{ |
243 |
long i;
|
244 |
for (i=0; i<num_pixels; i++) |
245 |
{ |
246 |
#ifdef WORDS_BIGENDIAN
|
247 |
dst[3]= palette[src[i]*4+0]; |
248 |
dst[2]= palette[src[i]*4+1]; |
249 |
dst[1]= palette[src[i]*4+2]; |
250 |
#else
|
251 |
//FIXME slow?
|
252 |
dst[0]= palette[src[i]*4+0]; |
253 |
dst[1]= palette[src[i]*4+1]; |
254 |
dst[2]= palette[src[i]*4+2]; |
255 |
//dst[3]= 0; /* do we need this cleansing? */
|
256 |
#endif
|
257 |
|
258 |
dst+= 4;
|
259 |
} |
260 |
} |
261 |
|
262 |
/**
|
263 |
* Palette is assumed to contain BGR32.
|
264 |
*/
|
265 |
void palette8torgb24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) |
266 |
{ |
267 |
long i;
|
268 |
/*
|
269 |
Writes 1 byte too much and might cause alignment issues on some architectures?
|
270 |
for (i=0; i<num_pixels; i++)
|
271 |
((unsigned *)(&dst[i*3])) = ((unsigned *)palette)[src[i]];
|
272 |
*/
|
273 |
for (i=0; i<num_pixels; i++) |
274 |
{ |
275 |
//FIXME slow?
|
276 |
dst[0]= palette[src[i]*4+2]; |
277 |
dst[1]= palette[src[i]*4+1]; |
278 |
dst[2]= palette[src[i]*4+0]; |
279 |
dst+= 3;
|
280 |
} |
281 |
} |
282 |
|
283 |
void palette8tobgr24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) |
284 |
{ |
285 |
long i;
|
286 |
/*
|
287 |
Writes 1 byte too much and might cause alignment issues on some architectures?
|
288 |
for (i=0; i<num_pixels; i++)
|
289 |
((unsigned *)(&dst[i*3])) = ((unsigned *)palette)[src[i]];
|
290 |
*/
|
291 |
for (i=0; i<num_pixels; i++) |
292 |
{ |
293 |
//FIXME slow?
|
294 |
dst[0]= palette[src[i]*4+0]; |
295 |
dst[1]= palette[src[i]*4+1]; |
296 |
dst[2]= palette[src[i]*4+2]; |
297 |
dst+= 3;
|
298 |
} |
299 |
} |
300 |
|
301 |
/**
|
302 |
* Palette is assumed to contain BGR16, see rgb32to16 to convert the palette.
|
303 |
*/
|
304 |
void palette8torgb16(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) |
305 |
{ |
306 |
long i;
|
307 |
for (i=0; i<num_pixels; i++) |
308 |
((uint16_t *)dst)[i] = ((const uint16_t *)palette)[src[i]];
|
309 |
} |
310 |
void palette8tobgr16(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) |
311 |
{ |
312 |
long i;
|
313 |
for (i=0; i<num_pixels; i++) |
314 |
((uint16_t *)dst)[i] = bswap_16(((const uint16_t *)palette)[src[i]]);
|
315 |
} |
316 |
|
317 |
/**
|
318 |
* Palette is assumed to contain BGR15, see rgb32to15 to convert the palette.
|
319 |
*/
|
320 |
void palette8torgb15(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) |
321 |
{ |
322 |
long i;
|
323 |
for (i=0; i<num_pixels; i++) |
324 |
((uint16_t *)dst)[i] = ((const uint16_t *)palette)[src[i]];
|
325 |
} |
326 |
void palette8tobgr15(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) |
327 |
{ |
328 |
long i;
|
329 |
for (i=0; i<num_pixels; i++) |
330 |
((uint16_t *)dst)[i] = bswap_16(((const uint16_t *)palette)[src[i]]);
|
331 |
} |
332 |
|
333 |
void rgb32tobgr24(const uint8_t *src, uint8_t *dst, long src_size) |
334 |
{ |
335 |
long i;
|
336 |
long num_pixels = src_size >> 2; |
337 |
for (i=0; i<num_pixels; i++) |
338 |
{ |
339 |
#ifdef WORDS_BIGENDIAN
|
340 |
/* RGB32 (= A,B,G,R) -> BGR24 (= B,G,R) */
|
341 |
dst[3*i + 0] = src[4*i + 1]; |
342 |
dst[3*i + 1] = src[4*i + 2]; |
343 |
dst[3*i + 2] = src[4*i + 3]; |
344 |
#else
|
345 |
dst[3*i + 0] = src[4*i + 2]; |
346 |
dst[3*i + 1] = src[4*i + 1]; |
347 |
dst[3*i + 2] = src[4*i + 0]; |
348 |
#endif
|
349 |
} |
350 |
} |
351 |
|
352 |
void rgb24tobgr32(const uint8_t *src, uint8_t *dst, long src_size) |
353 |
{ |
354 |
long i;
|
355 |
for (i=0; 3*i<src_size; i++) |
356 |
{ |
357 |
#ifdef WORDS_BIGENDIAN
|
358 |
/* RGB24 (= R,G,B) -> BGR32 (= A,R,G,B) */
|
359 |
dst[4*i + 0] = 0; |
360 |
dst[4*i + 1] = src[3*i + 0]; |
361 |
dst[4*i + 2] = src[3*i + 1]; |
362 |
dst[4*i + 3] = src[3*i + 2]; |
363 |
#else
|
364 |
dst[4*i + 0] = src[3*i + 2]; |
365 |
dst[4*i + 1] = src[3*i + 1]; |
366 |
dst[4*i + 2] = src[3*i + 0]; |
367 |
dst[4*i + 3] = 0; |
368 |
#endif
|
369 |
} |
370 |
} |
371 |
|
372 |
void rgb16tobgr32(const uint8_t *src, uint8_t *dst, long src_size) |
373 |
{ |
374 |
const uint16_t *end;
|
375 |
uint8_t *d = dst; |
376 |
const uint16_t *s = (const uint16_t *)src; |
377 |
end = s + src_size/2;
|
378 |
while (s < end)
|
379 |
{ |
380 |
register uint16_t bgr;
|
381 |
bgr = *s++; |
382 |
#ifdef WORDS_BIGENDIAN
|
383 |
*d++ = 0;
|
384 |
*d++ = (bgr&0x1F)<<3; |
385 |
*d++ = (bgr&0x7E0)>>3; |
386 |
*d++ = (bgr&0xF800)>>8; |
387 |
#else
|
388 |
*d++ = (bgr&0xF800)>>8; |
389 |
*d++ = (bgr&0x7E0)>>3; |
390 |
*d++ = (bgr&0x1F)<<3; |
391 |
*d++ = 0;
|
392 |
#endif
|
393 |
} |
394 |
} |
395 |
|
396 |
void rgb16tobgr24(const uint8_t *src, uint8_t *dst, long src_size) |
397 |
{ |
398 |
const uint16_t *end;
|
399 |
uint8_t *d = dst; |
400 |
const uint16_t *s = (const uint16_t *)src; |
401 |
end = s + src_size/2;
|
402 |
while (s < end)
|
403 |
{ |
404 |
register uint16_t bgr;
|
405 |
bgr = *s++; |
406 |
*d++ = (bgr&0xF800)>>8; |
407 |
*d++ = (bgr&0x7E0)>>3; |
408 |
*d++ = (bgr&0x1F)<<3; |
409 |
} |
410 |
} |
411 |
|
412 |
void rgb16tobgr16(const uint8_t *src, uint8_t *dst, long src_size) |
413 |
{ |
414 |
long i;
|
415 |
long num_pixels = src_size >> 1; |
416 |
|
417 |
for (i=0; i<num_pixels; i++) |
418 |
{ |
419 |
unsigned b,g,r;
|
420 |
register uint16_t rgb;
|
421 |
rgb = src[2*i];
|
422 |
r = rgb&0x1F;
|
423 |
g = (rgb&0x7E0)>>5; |
424 |
b = (rgb&0xF800)>>11; |
425 |
dst[2*i] = (b&0x1F) | ((g&0x3F)<<5) | ((r&0x1F)<<11); |
426 |
} |
427 |
} |
428 |
|
429 |
void rgb16tobgr15(const uint8_t *src, uint8_t *dst, long src_size) |
430 |
{ |
431 |
long i;
|
432 |
long num_pixels = src_size >> 1; |
433 |
|
434 |
for (i=0; i<num_pixels; i++) |
435 |
{ |
436 |
unsigned b,g,r;
|
437 |
register uint16_t rgb;
|
438 |
rgb = src[2*i];
|
439 |
r = rgb&0x1F;
|
440 |
g = (rgb&0x7E0)>>5; |
441 |
b = (rgb&0xF800)>>11; |
442 |
dst[2*i] = (b&0x1F) | ((g&0x1F)<<5) | ((r&0x1F)<<10); |
443 |
} |
444 |
} |
445 |
|
446 |
void rgb15tobgr32(const uint8_t *src, uint8_t *dst, long src_size) |
447 |
{ |
448 |
const uint16_t *end;
|
449 |
uint8_t *d = dst; |
450 |
const uint16_t *s = (const uint16_t *)src; |
451 |
end = s + src_size/2;
|
452 |
while (s < end)
|
453 |
{ |
454 |
register uint16_t bgr;
|
455 |
bgr = *s++; |
456 |
#ifdef WORDS_BIGENDIAN
|
457 |
*d++ = 0;
|
458 |
*d++ = (bgr&0x1F)<<3; |
459 |
*d++ = (bgr&0x3E0)>>2; |
460 |
*d++ = (bgr&0x7C00)>>7; |
461 |
#else
|
462 |
*d++ = (bgr&0x7C00)>>7; |
463 |
*d++ = (bgr&0x3E0)>>2; |
464 |
*d++ = (bgr&0x1F)<<3; |
465 |
*d++ = 0;
|
466 |
#endif
|
467 |
} |
468 |
} |
469 |
|
470 |
void rgb15tobgr24(const uint8_t *src, uint8_t *dst, long src_size) |
471 |
{ |
472 |
const uint16_t *end;
|
473 |
uint8_t *d = dst; |
474 |
const uint16_t *s = (const uint16_t *)src; |
475 |
end = s + src_size/2;
|
476 |
while (s < end)
|
477 |
{ |
478 |
register uint16_t bgr;
|
479 |
bgr = *s++; |
480 |
*d++ = (bgr&0x7C00)>>7; |
481 |
*d++ = (bgr&0x3E0)>>2; |
482 |
*d++ = (bgr&0x1F)<<3; |
483 |
} |
484 |
} |
485 |
|
486 |
void rgb15tobgr16(const uint8_t *src, uint8_t *dst, long src_size) |
487 |
{ |
488 |
long i;
|
489 |
long num_pixels = src_size >> 1; |
490 |
|
491 |
for (i=0; i<num_pixels; i++) |
492 |
{ |
493 |
unsigned b,g,r;
|
494 |
register uint16_t rgb;
|
495 |
rgb = src[2*i];
|
496 |
r = rgb&0x1F;
|
497 |
g = (rgb&0x3E0)>>5; |
498 |
b = (rgb&0x7C00)>>10; |
499 |
dst[2*i] = (b&0x1F) | ((g&0x3F)<<5) | ((r&0x1F)<<11); |
500 |
} |
501 |
} |
502 |
|
503 |
void rgb15tobgr15(const uint8_t *src, uint8_t *dst, long src_size) |
504 |
{ |
505 |
long i;
|
506 |
long num_pixels = src_size >> 1; |
507 |
|
508 |
for (i=0; i<num_pixels; i++) |
509 |
{ |
510 |
unsigned b,g,r;
|
511 |
register uint16_t rgb;
|
512 |
rgb = src[2*i];
|
513 |
r = rgb&0x1F;
|
514 |
g = (rgb&0x3E0)>>5; |
515 |
b = (rgb&0x7C00)>>10; |
516 |
dst[2*i] = (b&0x1F) | ((g&0x1F)<<5) | ((r&0x1F)<<10); |
517 |
} |
518 |
} |
519 |
|
520 |
void rgb8tobgr8(const uint8_t *src, uint8_t *dst, long src_size) |
521 |
{ |
522 |
long i;
|
523 |
long num_pixels = src_size;
|
524 |
for (i=0; i<num_pixels; i++) |
525 |
{ |
526 |
unsigned b,g,r;
|
527 |
register uint8_t rgb;
|
528 |
rgb = src[i]; |
529 |
r = (rgb&0x07);
|
530 |
g = (rgb&0x38)>>3; |
531 |
b = (rgb&0xC0)>>6; |
532 |
dst[i] = ((b<<1)&0x07) | ((g&0x07)<<3) | ((r&0x03)<<6); |
533 |
} |
534 |
} |