22
22
* License along with Libav; if not, write to the Free Software
23
23
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25
26
#include <inttypes.h>
28
#include "libavutil/attributes.h"
29
#include "libavutil/bswap.h"
26
30
#include "config.h"
27
#include "libavutil/bswap.h"
28
31
#include "rgb2rgb.h"
29
32
#include "swscale.h"
30
33
#include "swscale_internal.h"
35
void (*rgb32tobgr24)(const uint8_t *src, uint8_t *dst, int src_size);
36
void (*rgb32tobgr16)(const uint8_t *src, uint8_t *dst, int src_size);
37
void (*rgb32tobgr15)(const uint8_t *src, uint8_t *dst, int src_size);
32
38
void (*rgb24tobgr32)(const uint8_t *src, uint8_t *dst, int src_size);
39
void (*rgb24tobgr24)(const uint8_t *src, uint8_t *dst, int src_size);
33
40
void (*rgb24tobgr16)(const uint8_t *src, uint8_t *dst, int src_size);
34
41
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);
42
void (*rgb16tobgr24)(const uint8_t *src, uint8_t *dst, int src_size);
43
void (*rgb15tobgr24)(const uint8_t *src, uint8_t *dst, int src_size);
36
45
void (*rgb32to16)(const uint8_t *src, uint8_t *dst, int src_size);
37
46
void (*rgb32to15)(const uint8_t *src, uint8_t *dst, int src_size);
47
void (*rgb24to16)(const uint8_t *src, uint8_t *dst, int src_size);
48
void (*rgb24to15)(const uint8_t *src, uint8_t *dst, int src_size);
49
void (*rgb16to32)(const uint8_t *src, uint8_t *dst, int src_size);
50
void (*rgb16to15)(const uint8_t *src, uint8_t *dst, int src_size);
38
51
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
52
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
54
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,
56
void (*yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc,
57
const uint8_t *vsrc, uint8_t *dst,
58
int width, int height,
59
int lumStride, int chromStride, int dstStride);
60
void (*yv12touyvy)(const uint8_t *ysrc, const uint8_t *usrc,
61
const uint8_t *vsrc, uint8_t *dst,
62
int width, int height,
63
int lumStride, int chromStride, int dstStride);
64
void (*yuv422ptoyuy2)(const uint8_t *ysrc, const uint8_t *usrc,
65
const uint8_t *vsrc, uint8_t *dst,
66
int width, int height,
67
int lumStride, int chromStride, int dstStride);
68
void (*yuv422ptouyvy)(const uint8_t *ysrc, const uint8_t *usrc,
69
const uint8_t *vsrc, uint8_t *dst,
70
int width, int height,
71
int lumStride, int chromStride, int dstStride);
72
void (*yuy2toyv12)(const uint8_t *src, uint8_t *ydst,
73
uint8_t *udst, uint8_t *vdst,
64
74
int width, int height,
65
75
int lumStride, int chromStride, int srcStride);
66
void (*rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
76
void (*rgb24toyv12)(const uint8_t *src, uint8_t *ydst,
77
uint8_t *udst, uint8_t *vdst,
67
78
int width, int height,
68
79
int lumStride, int chromStride, int srcStride);
69
80
void (*planar2x)(const uint8_t *src, uint8_t *dst, int width, int height,
76
87
int width, int height,
77
88
int srcStride1, int srcStride2,
78
89
int dstStride1, int dstStride2);
79
void (*yvu9_to_yuy2)(const uint8_t *src1, const uint8_t *src2, const uint8_t *src3,
90
void (*yvu9_to_yuy2)(const uint8_t *src1, const uint8_t *src2,
91
const uint8_t *src3, uint8_t *dst,
81
92
int width, int height,
82
93
int srcStride1, int srcStride2,
83
94
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
void (*uyvytoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
96
const uint8_t *src, int width, int height,
97
int lumStride, int chromStride, int srcStride);
98
void (*uyvytoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
99
const uint8_t *src, int width, int height,
100
int lumStride, int chromStride, int srcStride);
101
void (*yuyvtoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
102
const uint8_t *src, int width, int height,
103
int lumStride, int chromStride, int srcStride);
104
void (*yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
105
const uint8_t *src, int width, int height,
95
106
int lumStride, int chromStride, int srcStride);
97
108
#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
#define BY ((int)( 0.098 * (1 << RGB2YUV_SHIFT) + 0.5))
110
#define BV ((int)(-0.071 * (1 << RGB2YUV_SHIFT) + 0.5))
111
#define BU ((int)( 0.439 * (1 << RGB2YUV_SHIFT) + 0.5))
112
#define GY ((int)( 0.504 * (1 << RGB2YUV_SHIFT) + 0.5))
113
#define GV ((int)(-0.368 * (1 << RGB2YUV_SHIFT) + 0.5))
114
#define GU ((int)(-0.291 * (1 << RGB2YUV_SHIFT) + 0.5))
115
#define RY ((int)( 0.257 * (1 << RGB2YUV_SHIFT) + 0.5))
116
#define RV ((int)( 0.439 * (1 << RGB2YUV_SHIFT) + 0.5))
117
#define RU ((int)(-0.148 * (1 << RGB2YUV_SHIFT) + 0.5))
108
119
//plain C versions
109
120
#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
123
* RGB15->RGB16 original by Strepto/Astral
124
* ported to gcc & bugfixed : A'rpi
125
* MMXEXT, 3DNOW optimization by Nick Kurshev
126
* 32-bit C version, and and&add trick by Michael Niedermayer
119
void sws_rgb2rgb_init(void)
129
av_cold void sws_rgb2rgb_init(void)
121
131
rgb2rgb_init_c();
144
154
void rgb24to32(const uint8_t *src, uint8_t *dst, int src_size)
147
for (i=0; 3*i<src_size; i++) {
158
for (i = 0; 3 * i < src_size; i++) {
148
159
#if HAVE_BIGENDIAN
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];
160
/* RGB24 (= R, G, B) -> BGR32 (= A, R, G, B) */
161
dst[4 * i + 0] = 255;
162
dst[4 * i + 1] = src[3 * i + 0];
163
dst[4 * i + 2] = src[3 * i + 1];
164
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];
166
dst[4 * i + 0] = src[3 * i + 2];
167
dst[4 * i + 1] = src[3 * i + 1];
168
dst[4 * i + 2] = src[3 * i + 0];
169
dst[4 * i + 3] = 255;
163
174
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;
177
const uint16_t *s = (const uint16_t *)src;
178
const uint16_t *end = s + src_size / 2;
169
180
while (s < end) {
170
register uint16_t bgr;
181
register uint16_t bgr = *s++;
172
182
#if HAVE_BIGENDIAN
174
*d++ = (bgr&0x1F)<<3;
175
*d++ = (bgr&0x7E0)>>3;
176
*d++ = (bgr&0xF800)>>8;
184
*d++ = (bgr & 0x1F) << 3;
185
*d++ = (bgr & 0x7E0) >> 3;
186
*d++ = (bgr & 0xF800) >> 8;
178
*d++ = (bgr&0xF800)>>8;
179
*d++ = (bgr&0x7E0)>>3;
180
*d++ = (bgr&0x1F)<<3;
188
*d++ = (bgr & 0xF800) >> 8;
189
*d++ = (bgr & 0x7E0) >> 3;
190
*d++ = (bgr & 0x1F) << 3;
186
196
void rgb12to15(const uint8_t *src, uint8_t *dst, int src_size)
189
uint16_t *d = (uint16_t *)dst;
190
const uint16_t *s = (const uint16_t *)src;
191
198
uint16_t rgb, r, g, b;
192
end = s + src_size / 2;
199
uint16_t *d = (uint16_t *)dst;
200
const uint16_t *s = (const uint16_t *)src;
201
const uint16_t *end = s + src_size / 2;
193
203
while (s < end) {
198
r = (r << 3) | ((r & 0x800) >> 1);
199
g = (g << 2) | ((g & 0x080) >> 2);
200
b = (b << 1) | ( b >> 3);
208
r = (r << 3) | ((r & 0x800) >> 1);
209
g = (g << 2) | ((g & 0x080) >> 2);
210
b = (b << 1) | ( b >> 3);
201
211
*d++ = r | g | b;
205
215
void rgb16to24(const uint8_t *src, uint8_t *dst, int src_size)
209
const uint16_t *s = (const uint16_t *)src;
210
end = s + src_size/2;
218
const uint16_t *s = (const uint16_t *)src;
219
const uint16_t *end = s + src_size / 2;
211
221
while (s < end) {
212
register uint16_t bgr;
214
*d++ = (bgr&0xF800)>>8;
215
*d++ = (bgr&0x7E0)>>3;
216
*d++ = (bgr&0x1F)<<3;
222
register uint16_t bgr = *s++;
223
*d++ = (bgr & 0xF800) >> 8;
224
*d++ = (bgr & 0x7E0) >> 3;
225
*d++ = (bgr & 0x1F) << 3;
220
229
void rgb16tobgr16(const uint8_t *src, uint8_t *dst, int src_size)
223
int num_pixels = src_size >> 1;
231
int i, num_pixels = src_size >> 1;
225
for (i=0; i<num_pixels; i++) {
226
unsigned rgb = ((const uint16_t*)src)[i];
227
((uint16_t*)dst)[i] = (rgb>>11) | (rgb&0x7E0) | (rgb<<11);
233
for (i = 0; i < num_pixels; i++) {
234
unsigned rgb = ((const uint16_t *)src)[i];
235
((uint16_t *)dst)[i] = (rgb >> 11) | (rgb & 0x7E0) | (rgb << 11);
231
239
void rgb16tobgr15(const uint8_t *src, uint8_t *dst, int src_size)
234
int num_pixels = src_size >> 1;
241
int i, num_pixels = src_size >> 1;
236
for (i=0; i<num_pixels; i++) {
237
unsigned rgb = ((const uint16_t*)src)[i];
238
((uint16_t*)dst)[i] = (rgb>>11) | ((rgb&0x7C0)>>1) | ((rgb&0x1F)<<10);
243
for (i = 0; i < num_pixels; i++) {
244
unsigned rgb = ((const uint16_t *)src)[i];
245
((uint16_t *)dst)[i] = (rgb >> 11) | ((rgb & 0x7C0) >> 1) | ((rgb & 0x1F) << 10);
242
249
void rgb15tobgr32(const uint8_t *src, uint8_t *dst, int src_size)
246
const uint16_t *s = (const uint16_t *)src;
247
end = s + src_size/2;
252
const uint16_t *s = (const uint16_t *)src;
253
const uint16_t *end = s + src_size / 2;
248
255
while (s < end) {
249
register uint16_t bgr;
256
register uint16_t bgr = *s++;
251
257
#if HAVE_BIGENDIAN
253
*d++ = (bgr&0x1F)<<3;
254
*d++ = (bgr&0x3E0)>>2;
255
*d++ = (bgr&0x7C00)>>7;
259
*d++ = (bgr & 0x1F) << 3;
260
*d++ = (bgr & 0x3E0) >> 2;
261
*d++ = (bgr & 0x7C00) >> 7;
257
*d++ = (bgr&0x7C00)>>7;
258
*d++ = (bgr&0x3E0)>>2;
259
*d++ = (bgr&0x1F)<<3;
263
*d++ = (bgr & 0x7C00) >> 7;
264
*d++ = (bgr & 0x3E0) >> 2;
265
*d++ = (bgr & 0x1F) << 3;
265
271
void rgb15to24(const uint8_t *src, uint8_t *dst, int src_size)
269
const uint16_t *s = (const uint16_t *)src;
270
end = s + src_size/2;
274
const uint16_t *s = (const uint16_t *)src;
275
const uint16_t *end = s + src_size / 2;
271
277
while (s < end) {
272
register uint16_t bgr;
274
*d++ = (bgr&0x7C00)>>7;
275
*d++ = (bgr&0x3E0)>>2;
276
*d++ = (bgr&0x1F)<<3;
278
register uint16_t bgr = *s++;
279
*d++ = (bgr & 0x7C00) >> 7;
280
*d++ = (bgr & 0x3E0) >> 2;
281
*d++ = (bgr & 0x1F) << 3;
280
285
void rgb15tobgr16(const uint8_t *src, uint8_t *dst, int src_size)
283
int num_pixels = src_size >> 1;
287
int i, num_pixels = src_size >> 1;
285
for (i=0; i<num_pixels; i++) {
286
unsigned rgb = ((const uint16_t*)src)[i];
287
((uint16_t*)dst)[i] = ((rgb&0x7C00)>>10) | ((rgb&0x3E0)<<1) | (rgb<<11);
289
for (i = 0; i < num_pixels; i++) {
290
unsigned rgb = ((const uint16_t *)src)[i];
291
((uint16_t *)dst)[i] = ((rgb & 0x7C00) >> 10) | ((rgb & 0x3E0) << 1) | (rgb << 11);
291
295
void rgb15tobgr15(const uint8_t *src, uint8_t *dst, int src_size)
294
int num_pixels = src_size >> 1;
297
int i, num_pixels = src_size >> 1;
296
for (i=0; i<num_pixels; i++) {
298
unsigned rgb = ((const uint16_t*)src)[i];
300
((uint16_t*)dst)[i] = (br>>10) | (rgb&0x3E0) | (br<<10);
299
for (i = 0; i < num_pixels; i++) {
300
unsigned rgb = ((const uint16_t *)src)[i];
301
unsigned br = rgb & 0x7C1F;
302
((uint16_t *)dst)[i] = (br >> 10) | (rgb & 0x3E0) | (br << 10);
304
306
void rgb12tobgr12(const uint8_t *src, uint8_t *dst, int src_size)
306
uint16_t *d = (uint16_t*)dst;
307
uint16_t *s = (uint16_t*)src;
309
int num_pixels = src_size >> 1;
308
uint16_t *d = (uint16_t *)dst;
309
uint16_t *s = (uint16_t *)src;
310
int i, num_pixels = src_size >> 1;
311
312
for (i = 0; i < num_pixels; i++) {
312
313
unsigned rgb = s[i];
313
d[i] = (rgb << 8 | rgb & 0xF0 | rgb >> 8) & 0xFFF;
314
d[i] = (rgb << 8 | rgb & 0xF0 | rgb >> 8) & 0xFFF;
317
318
void bgr8torgb8(const uint8_t *src, uint8_t *dst, int src_size)
320
int num_pixels = src_size;
321
for (i=0; i<num_pixels; i++) {
323
register uint8_t rgb;
328
dst[i] = ((b<<1)&0x07) | ((g&0x07)<<3) | ((r&0x03)<<6);
320
int i, num_pixels = src_size;
322
for (i = 0; i < num_pixels; i++) {
323
register uint8_t rgb = src[i];
324
unsigned r = (rgb & 0x07);
325
unsigned g = (rgb & 0x38) >> 3;
326
unsigned b = (rgb & 0xC0) >> 6;
327
dst[i] = ((b << 1) & 0x07) | ((g & 0x07) << 3) | ((r & 0x03) << 6);
332
331
#define DEFINE_SHUFFLE_BYTES(a, b, c, d) \
333
void shuffle_bytes_##a##b##c##d(const uint8_t *src, uint8_t *dst, int src_size) \
332
void shuffle_bytes_ ## a ## b ## c ## d(const uint8_t *src, \
333
uint8_t *dst, int src_size) \
337
for (i = 0; i < src_size; i+=4) { \
337
for (i = 0; i < src_size; i += 4) { \
338
338
dst[i + 0] = src[i + a]; \
339
339
dst[i + 1] = src[i + b]; \
340
340
dst[i + 2] = src[i + c]; \