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)
9 * This file is part of FFmpeg.
11 * FFmpeg is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
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 GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with FFmpeg; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 #include "libavutil/bswap.h"
30 #include "swscale_internal.h"
32 void (*rgb24tobgr32)(const uint8_t *src, uint8_t *dst, int src_size);
33 void (*rgb24tobgr16)(const uint8_t *src, uint8_t *dst, int src_size);
34 void (*rgb24tobgr15)(const uint8_t *src, uint8_t *dst, int src_size);
35 void (*rgb32tobgr24)(const uint8_t *src, uint8_t *dst, int src_size);
36 void (*rgb32to16)(const uint8_t *src, uint8_t *dst, int src_size);
37 void (*rgb32to15)(const uint8_t *src, uint8_t *dst, int src_size);
38 void (*rgb15to16)(const uint8_t *src, uint8_t *dst, int src_size);
39 void (*rgb15tobgr24)(const uint8_t *src, uint8_t *dst, int src_size);
40 void (*rgb15to32)(const uint8_t *src, uint8_t *dst, int src_size);
41 void (*rgb16to15)(const uint8_t *src, uint8_t *dst, int src_size);
42 void (*rgb16tobgr24)(const uint8_t *src, uint8_t *dst, int src_size);
43 void (*rgb16to32)(const uint8_t *src, uint8_t *dst, int src_size);
44 void (*rgb24tobgr24)(const uint8_t *src, uint8_t *dst, int src_size);
45 void (*rgb24to16)(const uint8_t *src, uint8_t *dst, int src_size);
46 void (*rgb24to15)(const uint8_t *src, uint8_t *dst, int src_size);
47 void (*shuffle_bytes_2103)(const uint8_t *src, uint8_t *dst, int src_size);
48 void (*rgb32tobgr16)(const uint8_t *src, uint8_t *dst, int src_size);
49 void (*rgb32tobgr15)(const uint8_t *src, uint8_t *dst, int src_size);
51 void (*yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
52 int width, int height,
53 int lumStride, int chromStride, int dstStride);
54 void (*yv12touyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
55 int width, int height,
56 int lumStride, int chromStride, int dstStride);
57 void (*yuv422ptoyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
58 int width, int height,
59 int lumStride, int chromStride, int dstStride);
60 void (*yuv422ptouyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,
61 int width, int height,
62 int lumStride, int chromStride, int dstStride);
63 void (*yuy2toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
64 int width, int height,
65 int lumStride, int chromStride, int srcStride);
66 void (*rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
67 int width, int height,
68 int lumStride, int chromStride, int srcStride);
69 void (*planar2x)(const uint8_t *src, uint8_t *dst, int width, int height,
70 int srcStride, int dstStride);
71 void (*interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t *dst,
72 int width, int height, int src1Stride,
73 int src2Stride, int dstStride);
74 void (*vu9_to_vu12)(const uint8_t *src1, const uint8_t *src2,
75 uint8_t *dst1, uint8_t *dst2,
76 int width, int height,
77 int srcStride1, int srcStride2,
78 int dstStride1, int dstStride2);
79 void (*yvu9_to_yuy2)(const uint8_t *src1, const uint8_t *src2, const uint8_t *src3,
81 int width, int height,
82 int srcStride1, int srcStride2,
83 int srcStride3, int dstStride);
84 void (*uyvytoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src,
85 int width, int height,
86 int lumStride, int chromStride, int srcStride);
87 void (*uyvytoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src,
88 int width, int height,
89 int lumStride, int chromStride, int srcStride);
90 void (*yuyvtoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src,
91 int width, int height,
92 int lumStride, int chromStride, int srcStride);
93 void (*yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src,
94 int width, int height,
95 int lumStride, int chromStride, int srcStride);
97 #define RGB2YUV_SHIFT 8
98 #define BY ((int)( 0.098*(1<<RGB2YUV_SHIFT)+0.5))
99 #define BV ((int)(-0.071*(1<<RGB2YUV_SHIFT)+0.5))
100 #define BU ((int)( 0.439*(1<<RGB2YUV_SHIFT)+0.5))
101 #define GY ((int)( 0.504*(1<<RGB2YUV_SHIFT)+0.5))
102 #define GV ((int)(-0.368*(1<<RGB2YUV_SHIFT)+0.5))
103 #define GU ((int)(-0.291*(1<<RGB2YUV_SHIFT)+0.5))
104 #define RY ((int)( 0.257*(1<<RGB2YUV_SHIFT)+0.5))
105 #define RV ((int)( 0.439*(1<<RGB2YUV_SHIFT)+0.5))
106 #define RU ((int)(-0.148*(1<<RGB2YUV_SHIFT)+0.5))
109 #include "rgb2rgb_template.c"
113 RGB15->RGB16 original by Strepto/Astral
114 ported to gcc & bugfixed : A'rpi
115 MMX2, 3DNOW optimization by Nick Kurshev
116 32-bit C version, and and&add trick by Michael Niedermayer
119 void sws_rgb2rgb_init(void)
126 void rgb32to24(const uint8_t *src, uint8_t *dst, int src_size)
129 int num_pixels = src_size >> 2;
130 for (i=0; i<num_pixels; i++) {
132 /* RGB32 (= A,B,G,R) -> BGR24 (= B,G,R) */
133 dst[3*i + 0] = src[4*i + 1];
134 dst[3*i + 1] = src[4*i + 2];
135 dst[3*i + 2] = src[4*i + 3];
137 dst[3*i + 0] = src[4*i + 2];
138 dst[3*i + 1] = src[4*i + 1];
139 dst[3*i + 2] = src[4*i + 0];
144 void rgb24to32(const uint8_t *src, uint8_t *dst, int src_size)
147 for (i=0; 3*i<src_size; i++) {
149 /* RGB24 (= R,G,B) -> BGR32 (= A,R,G,B) */
151 dst[4*i + 1] = src[3*i + 0];
152 dst[4*i + 2] = src[3*i + 1];
153 dst[4*i + 3] = src[3*i + 2];
155 dst[4*i + 0] = src[3*i + 2];
156 dst[4*i + 1] = src[3*i + 1];
157 dst[4*i + 2] = src[3*i + 0];
163 void rgb16tobgr32(const uint8_t *src, uint8_t *dst, int src_size)
167 const uint16_t *s = (const uint16_t *)src;
168 end = s + src_size/2;
170 register uint16_t bgr;
174 *d++ = ((bgr&0x1F)<<3) | ((bgr&0x1F)>>2);
175 *d++ = ((bgr&0x7E0)>>3) | ((bgr&0x7E0)>>9);
176 *d++ = ((bgr&0xF800)>>8) | ((bgr&0xF800)>>13);
178 *d++ = ((bgr&0xF800)>>8) | ((bgr&0xF800)>>13);
179 *d++ = ((bgr&0x7E0)>>3) | ((bgr&0x7E0)>>9);
180 *d++ = ((bgr&0x1F)<<3) | ((bgr&0x1F)>>2);
186 void rgb16to24(const uint8_t *src, uint8_t *dst, int src_size)
190 const uint16_t *s = (const uint16_t *)src;
191 end = s + src_size/2;
193 register uint16_t bgr;
195 *d++ = ((bgr&0xF800)>>8) | ((bgr&0xF800)>>13);
196 *d++ = ((bgr&0x7E0)>>3) | ((bgr&0x7E0)>>9);
197 *d++ = ((bgr&0x1F)<<3) | ((bgr&0x1F)>>2);
201 void rgb16tobgr16(const uint8_t *src, uint8_t *dst, int src_size)
204 int num_pixels = src_size >> 1;
206 for (i=0; i<num_pixels; i++) {
207 unsigned rgb = ((const uint16_t*)src)[i];
208 ((uint16_t*)dst)[i] = (rgb>>11) | (rgb&0x7E0) | (rgb<<11);
212 void rgb16tobgr15(const uint8_t *src, uint8_t *dst, int src_size)
215 int num_pixels = src_size >> 1;
217 for (i=0; i<num_pixels; i++) {
218 unsigned rgb = ((const uint16_t*)src)[i];
219 ((uint16_t*)dst)[i] = (rgb>>11) | ((rgb&0x7C0)>>1) | ((rgb&0x1F)<<10);
223 void rgb15tobgr32(const uint8_t *src, uint8_t *dst, int src_size)
227 const uint16_t *s = (const uint16_t *)src;
228 end = s + src_size/2;
230 register uint16_t bgr;
234 *d++ = ((bgr&0x1F)<<3) | ((bgr&0x1F)>>2);
235 *d++ = ((bgr&0x3E0)>>2) | ((bgr&0x3E0)>>7);
236 *d++ = ((bgr&0x7C00)>>7) | ((bgr&0x7C00)>>12);
238 *d++ = ((bgr&0x7C00)>>7) | ((bgr&0x7C00)>>12);
239 *d++ = ((bgr&0x3E0)>>2) | ((bgr&0x3E0)>>7);
240 *d++ = ((bgr&0x1F)<<3) | ((bgr&0x1F)>>2);
246 void rgb15to24(const uint8_t *src, uint8_t *dst, int src_size)
250 const uint16_t *s = (const uint16_t *)src;
251 end = s + src_size/2;
253 register uint16_t bgr;
255 *d++ = ((bgr&0x7C00)>>7) | ((bgr&0x7C00)>>12);
256 *d++ = ((bgr&0x3E0)>>2) | ((bgr&0x3E0)>>7);
257 *d++ = ((bgr&0x1F)<<3) | ((bgr&0x1F)>>2);
261 void rgb15tobgr16(const uint8_t *src, uint8_t *dst, int src_size)
264 int num_pixels = src_size >> 1;
266 for (i=0; i<num_pixels; i++) {
267 unsigned rgb = ((const uint16_t*)src)[i];
268 ((uint16_t*)dst)[i] = ((rgb&0x7C00)>>10) | ((rgb&0x3E0)<<1) | (rgb<<11);
272 void rgb15tobgr15(const uint8_t *src, uint8_t *dst, int src_size)
275 int num_pixels = src_size >> 1;
277 for (i=0; i<num_pixels; i++) {
279 unsigned rgb = ((const uint16_t*)src)[i];
281 ((uint16_t*)dst)[i] = (br>>10) | (rgb&0x3E0) | (br<<10);
285 void bgr8torgb8(const uint8_t *src, uint8_t *dst, int src_size)
288 int num_pixels = src_size;
289 for (i=0; i<num_pixels; i++) {
291 register uint8_t rgb;
296 dst[i] = ((b<<1)&0x07) | ((g&0x07)<<3) | ((r&0x03)<<6);
300 #define DEFINE_SHUFFLE_BYTES(a, b, c, d) \
301 void shuffle_bytes_##a##b##c##d(const uint8_t *src, uint8_t *dst, int src_size) \
305 for (i = 0; i < src_size; i+=4) { \
306 dst[i + 0] = src[i + a]; \
307 dst[i + 1] = src[i + b]; \
308 dst[i + 2] = src[i + c]; \
309 dst[i + 3] = src[i + d]; \
313 DEFINE_SHUFFLE_BYTES(0, 3, 2, 1)
314 DEFINE_SHUFFLE_BYTES(1, 2, 3, 0)
315 DEFINE_SHUFFLE_BYTES(3, 0, 1, 2)
316 DEFINE_SHUFFLE_BYTES(3, 2, 1, 0)