comparison postproc/rgb2rgb.c @ 6492:e7635c03910f

sync with mplayer xp - partial yvu9 support (copy only) - rgb 15/16 -> 24/32 converters - int->unsigned changes
author arpi
date Sat, 22 Jun 2002 08:49:45 +0000
parents c5cf988c6d6f
children f98313dcd428
comparison
equal deleted inserted replaced
6491:920796b6c7b1 6492:e7635c03910f
18 #endif 18 #endif
19 19
20 #define FAST_BGR2YV12 // use 7 bit coeffs instead of 15bit 20 #define FAST_BGR2YV12 // use 7 bit coeffs instead of 15bit
21 21
22 #ifdef CAN_COMPILE_X86_ASM 22 #ifdef CAN_COMPILE_X86_ASM
23 static const uint64_t mmx_null __attribute__((aligned(8))) = 0x0000000000000000ULL;
24 static const uint64_t mmx_one __attribute__((aligned(8))) = 0xFFFFFFFFFFFFFFFFULL;
23 static const uint64_t mask32b __attribute__((aligned(8))) = 0x000000FF000000FFULL; 25 static const uint64_t mask32b __attribute__((aligned(8))) = 0x000000FF000000FFULL;
24 static const uint64_t mask32g __attribute__((aligned(8))) = 0x0000FF000000FF00ULL; 26 static const uint64_t mask32g __attribute__((aligned(8))) = 0x0000FF000000FF00ULL;
25 static const uint64_t mask32r __attribute__((aligned(8))) = 0x00FF000000FF0000ULL; 27 static const uint64_t mask32r __attribute__((aligned(8))) = 0x00FF000000FF0000ULL;
26 static const uint64_t mask32 __attribute__((aligned(8))) = 0x00FFFFFF00FFFFFFULL; 28 static const uint64_t mask32 __attribute__((aligned(8))) = 0x00FFFFFF00FFFFFFULL;
27 static const uint64_t mask24b __attribute__((aligned(8))) = 0x00FF0000FF0000FFULL; 29 static const uint64_t mask24b __attribute__((aligned(8))) = 0x00FF0000FF0000FFULL;
33 static const uint64_t mask24hhh __attribute__((aligned(8))) = 0xffffffff00000000ULL; 35 static const uint64_t mask24hhh __attribute__((aligned(8))) = 0xffffffff00000000ULL;
34 static const uint64_t mask24hhhh __attribute__((aligned(8))) = 0xffffffffffff0000ULL; 36 static const uint64_t mask24hhhh __attribute__((aligned(8))) = 0xffffffffffff0000ULL;
35 static const uint64_t mask15b __attribute__((aligned(8))) = 0x001F001F001F001FULL; /* 00000000 00011111 xxB */ 37 static const uint64_t mask15b __attribute__((aligned(8))) = 0x001F001F001F001FULL; /* 00000000 00011111 xxB */
36 static const uint64_t mask15rg __attribute__((aligned(8))) = 0x7FE07FE07FE07FE0ULL; /* 01111111 11100000 RGx */ 38 static const uint64_t mask15rg __attribute__((aligned(8))) = 0x7FE07FE07FE07FE0ULL; /* 01111111 11100000 RGx */
37 static const uint64_t mask15s __attribute__((aligned(8))) = 0xFFE0FFE0FFE0FFE0ULL; 39 static const uint64_t mask15s __attribute__((aligned(8))) = 0xFFE0FFE0FFE0FFE0ULL;
40 static const uint64_t mask15g __attribute__((aligned(8))) = 0x03E003E003E003E0ULL;
41 static const uint64_t mask15r __attribute__((aligned(8))) = 0x7C007C007C007C00ULL;
42 #define mask16b mask15b
43 static const uint64_t mask16g __attribute__((aligned(8))) = 0x07E007E007E007E0ULL;
44 static const uint64_t mask16r __attribute__((aligned(8))) = 0xF800F800F800F800ULL;
38 static const uint64_t red_16mask __attribute__((aligned(8))) = 0x0000f8000000f800ULL; 45 static const uint64_t red_16mask __attribute__((aligned(8))) = 0x0000f8000000f800ULL;
39 static const uint64_t green_16mask __attribute__((aligned(8)))= 0x000007e0000007e0ULL; 46 static const uint64_t green_16mask __attribute__((aligned(8)))= 0x000007e0000007e0ULL;
40 static const uint64_t blue_16mask __attribute__((aligned(8))) = 0x0000001f0000001fULL; 47 static const uint64_t blue_16mask __attribute__((aligned(8))) = 0x0000001f0000001fULL;
41 static const uint64_t red_15mask __attribute__((aligned(8))) = 0x00007c000000f800ULL; 48 static const uint64_t red_15mask __attribute__((aligned(8))) = 0x00007c000000f800ULL;
42 static const uint64_t green_15mask __attribute__((aligned(8)))= 0x000003e0000007e0ULL; 49 static const uint64_t green_15mask __attribute__((aligned(8)))= 0x000003e0000007e0ULL;
135 else if(gCpuCaps.has3DNow) 142 else if(gCpuCaps.has3DNow)
136 rgb24to32_3DNow(src, dst, src_size); 143 rgb24to32_3DNow(src, dst, src_size);
137 else if(gCpuCaps.hasMMX) 144 else if(gCpuCaps.hasMMX)
138 rgb24to32_MMX(src, dst, src_size); 145 rgb24to32_MMX(src, dst, src_size);
139 else 146 else
147 #endif
140 rgb24to32_C(src, dst, src_size); 148 rgb24to32_C(src, dst, src_size);
141 #else 149 }
142 rgb24to32_C(src, dst, src_size); 150
143 #endif 151 void rgb15to24(const uint8_t *src,uint8_t *dst,unsigned src_size)
152 {
153 #ifdef CAN_COMPILE_X86_ASM
154 // ordered per speed fasterst first
155 if(gCpuCaps.hasMMX2)
156 rgb15to24_MMX2(src, dst, src_size);
157 else if(gCpuCaps.has3DNow)
158 rgb15to24_3DNow(src, dst, src_size);
159 else if(gCpuCaps.hasMMX)
160 rgb15to24_MMX(src, dst, src_size);
161 else
162 #endif
163 rgb15to24_C(src, dst, src_size);
164 }
165
166 void rgb16to24(const uint8_t *src,uint8_t *dst,unsigned src_size)
167 {
168 #ifdef CAN_COMPILE_X86_ASM
169 // ordered per speed fasterst first
170 if(gCpuCaps.hasMMX2)
171 rgb16to24_MMX2(src, dst, src_size);
172 else if(gCpuCaps.has3DNow)
173 rgb16to24_3DNow(src, dst, src_size);
174 else if(gCpuCaps.hasMMX)
175 rgb16to24_MMX(src, dst, src_size);
176 else
177 #endif
178 rgb16to24_C(src, dst, src_size);
179 }
180
181 void rgb15to32(const uint8_t *src,uint8_t *dst,unsigned src_size)
182 {
183 #ifdef CAN_COMPILE_X86_ASM
184 // ordered per speed fasterst first
185 if(gCpuCaps.hasMMX2)
186 rgb15to32_MMX2(src, dst, src_size);
187 else if(gCpuCaps.has3DNow)
188 rgb15to32_3DNow(src, dst, src_size);
189 else if(gCpuCaps.hasMMX)
190 rgb15to32_MMX(src, dst, src_size);
191 else
192 #endif
193 rgb15to32_C(src, dst, src_size);
194 }
195
196 void rgb16to32(const uint8_t *src,uint8_t *dst,unsigned src_size)
197 {
198 #ifdef CAN_COMPILE_X86_ASM
199 // ordered per speed fasterst first
200 if(gCpuCaps.hasMMX2)
201 rgb16to32_MMX2(src, dst, src_size);
202 else if(gCpuCaps.has3DNow)
203 rgb16to32_3DNow(src, dst, src_size);
204 else if(gCpuCaps.hasMMX)
205 rgb16to32_MMX(src, dst, src_size);
206 else
207 #endif
208 rgb16to32_C(src, dst, src_size);
144 } 209 }
145 210
146 void rgb32to24(const uint8_t *src,uint8_t *dst,unsigned src_size) 211 void rgb32to24(const uint8_t *src,uint8_t *dst,unsigned src_size)
147 { 212 {
148 #ifdef CAN_COMPILE_X86_ASM 213 #ifdef CAN_COMPILE_X86_ASM
152 else if(gCpuCaps.has3DNow) 217 else if(gCpuCaps.has3DNow)
153 rgb32to24_3DNow(src, dst, src_size); 218 rgb32to24_3DNow(src, dst, src_size);
154 else if(gCpuCaps.hasMMX) 219 else if(gCpuCaps.hasMMX)
155 rgb32to24_MMX(src, dst, src_size); 220 rgb32to24_MMX(src, dst, src_size);
156 else 221 else
222 #endif
157 rgb32to24_C(src, dst, src_size); 223 rgb32to24_C(src, dst, src_size);
158 #else
159 rgb32to24_C(src, dst, src_size);
160 #endif
161 } 224 }
162 225
163 /* 226 /*
164 Original by Strepto/Astral 227 Original by Strepto/Astral
165 ported to gcc & bugfixed : A'rpi 228 ported to gcc & bugfixed : A'rpi
175 else if(gCpuCaps.has3DNow) 238 else if(gCpuCaps.has3DNow)
176 rgb15to16_3DNow(src, dst, src_size); 239 rgb15to16_3DNow(src, dst, src_size);
177 else if(gCpuCaps.hasMMX) 240 else if(gCpuCaps.hasMMX)
178 rgb15to16_MMX(src, dst, src_size); 241 rgb15to16_MMX(src, dst, src_size);
179 else 242 else
243 #endif
180 rgb15to16_C(src, dst, src_size); 244 rgb15to16_C(src, dst, src_size);
181 #else
182 rgb15to16_C(src, dst, src_size);
183 #endif
184 } 245 }
185 246
186 /** 247 /**
187 * Pallete is assumed to contain bgr32 248 * Pallete is assumed to contain bgr32
188 */ 249 */
240 else if(gCpuCaps.has3DNow) 301 else if(gCpuCaps.has3DNow)
241 rgb32to16_3DNow(src, dst, src_size); 302 rgb32to16_3DNow(src, dst, src_size);
242 else if(gCpuCaps.hasMMX) 303 else if(gCpuCaps.hasMMX)
243 rgb32to16_MMX(src, dst, src_size); 304 rgb32to16_MMX(src, dst, src_size);
244 else 305 else
306 #endif
245 rgb32to16_C(src, dst, src_size); 307 rgb32to16_C(src, dst, src_size);
246 #else
247 rgb32to16_C(src, dst, src_size);
248 #endif
249 } 308 }
250 309
251 void rgb32to15(const uint8_t *src, uint8_t *dst, unsigned src_size) 310 void rgb32to15(const uint8_t *src, uint8_t *dst, unsigned src_size)
252 { 311 {
253 #ifdef CAN_COMPILE_X86_ASM 312 #ifdef CAN_COMPILE_X86_ASM
257 else if(gCpuCaps.has3DNow) 316 else if(gCpuCaps.has3DNow)
258 rgb32to15_3DNow(src, dst, src_size); 317 rgb32to15_3DNow(src, dst, src_size);
259 else if(gCpuCaps.hasMMX) 318 else if(gCpuCaps.hasMMX)
260 rgb32to15_MMX(src, dst, src_size); 319 rgb32to15_MMX(src, dst, src_size);
261 else 320 else
321 #endif
262 rgb32to15_C(src, dst, src_size); 322 rgb32to15_C(src, dst, src_size);
263 #else
264 rgb32to15_C(src, dst, src_size);
265 #endif
266 } 323 }
267 324
268 void rgb24to16(const uint8_t *src, uint8_t *dst, unsigned src_size) 325 void rgb24to16(const uint8_t *src, uint8_t *dst, unsigned src_size)
269 { 326 {
270 #ifdef CAN_COMPILE_X86_ASM 327 #ifdef CAN_COMPILE_X86_ASM
274 else if(gCpuCaps.has3DNow) 331 else if(gCpuCaps.has3DNow)
275 rgb24to16_3DNow(src, dst, src_size); 332 rgb24to16_3DNow(src, dst, src_size);
276 else if(gCpuCaps.hasMMX) 333 else if(gCpuCaps.hasMMX)
277 rgb24to16_MMX(src, dst, src_size); 334 rgb24to16_MMX(src, dst, src_size);
278 else 335 else
336 #endif
279 rgb24to16_C(src, dst, src_size); 337 rgb24to16_C(src, dst, src_size);
280 #else
281 rgb24to16_C(src, dst, src_size);
282 #endif
283 } 338 }
284 339
285 void rgb24to15(const uint8_t *src, uint8_t *dst, unsigned src_size) 340 void rgb24to15(const uint8_t *src, uint8_t *dst, unsigned src_size)
286 { 341 {
287 #ifdef CAN_COMPILE_X86_ASM 342 #ifdef CAN_COMPILE_X86_ASM
291 else if(gCpuCaps.has3DNow) 346 else if(gCpuCaps.has3DNow)
292 rgb24to15_3DNow(src, dst, src_size); 347 rgb24to15_3DNow(src, dst, src_size);
293 else if(gCpuCaps.hasMMX) 348 else if(gCpuCaps.hasMMX)
294 rgb24to15_MMX(src, dst, src_size); 349 rgb24to15_MMX(src, dst, src_size);
295 else 350 else
351 #endif
296 rgb24to15_C(src, dst, src_size); 352 rgb24to15_C(src, dst, src_size);
297 #else
298 rgb24to15_C(src, dst, src_size);
299 #endif
300 } 353 }
301 354
302 /** 355 /**
303 * Palette is assumed to contain bgr16, see rgb32to16 to convert the palette 356 * Palette is assumed to contain bgr16, see rgb32to16 to convert the palette
304 */ 357 */
328 else if(gCpuCaps.has3DNow) 381 else if(gCpuCaps.has3DNow)
329 rgb32tobgr32_3DNow(src, dst, src_size); 382 rgb32tobgr32_3DNow(src, dst, src_size);
330 else if(gCpuCaps.hasMMX) 383 else if(gCpuCaps.hasMMX)
331 rgb32tobgr32_MMX(src, dst, src_size); 384 rgb32tobgr32_MMX(src, dst, src_size);
332 else 385 else
386 #endif
333 rgb32tobgr32_C(src, dst, src_size); 387 rgb32tobgr32_C(src, dst, src_size);
334 #else
335 rgb32tobgr32_C(src, dst, src_size);
336 #endif
337 } 388 }
338 389
339 void rgb24tobgr24(const uint8_t *src, uint8_t *dst, unsigned int src_size) 390 void rgb24tobgr24(const uint8_t *src, uint8_t *dst, unsigned int src_size)
340 { 391 {
341 #ifdef CAN_COMPILE_X86_ASM 392 #ifdef CAN_COMPILE_X86_ASM
345 else if(gCpuCaps.has3DNow) 396 else if(gCpuCaps.has3DNow)
346 rgb24tobgr24_3DNow(src, dst, src_size); 397 rgb24tobgr24_3DNow(src, dst, src_size);
347 else if(gCpuCaps.hasMMX) 398 else if(gCpuCaps.hasMMX)
348 rgb24tobgr24_MMX(src, dst, src_size); 399 rgb24tobgr24_MMX(src, dst, src_size);
349 else 400 else
401 #endif
350 rgb24tobgr24_C(src, dst, src_size); 402 rgb24tobgr24_C(src, dst, src_size);
351 #else
352 rgb24tobgr24_C(src, dst, src_size);
353 #endif
354 } 403 }
355 404
356 /** 405 /**
357 * 406 *
358 * height should be a multiple of 2 and width should be a multiple of 16 (if this is a 407 * height should be a multiple of 2 and width should be a multiple of 16 (if this is a
369 else if(gCpuCaps.has3DNow) 418 else if(gCpuCaps.has3DNow)
370 yv12toyuy2_3DNow(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride); 419 yv12toyuy2_3DNow(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride);
371 else if(gCpuCaps.hasMMX) 420 else if(gCpuCaps.hasMMX)
372 yv12toyuy2_MMX(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride); 421 yv12toyuy2_MMX(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride);
373 else 422 else
423 #endif
374 yv12toyuy2_C(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride); 424 yv12toyuy2_C(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride);
375 #else
376 yv12toyuy2_C(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride);
377 #endif
378 } 425 }
379 426
380 /** 427 /**
381 * 428 *
382 * width should be a multiple of 16 429 * width should be a multiple of 16
392 else if(gCpuCaps.has3DNow) 439 else if(gCpuCaps.has3DNow)
393 yuv422ptoyuy2_3DNow(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride); 440 yuv422ptoyuy2_3DNow(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride);
394 else if(gCpuCaps.hasMMX) 441 else if(gCpuCaps.hasMMX)
395 yuv422ptoyuy2_MMX(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride); 442 yuv422ptoyuy2_MMX(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride);
396 else 443 else
444 #endif
397 yuv422ptoyuy2_C(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride); 445 yuv422ptoyuy2_C(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride);
398 #else
399 yuv422ptoyuy2_C(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride);
400 #endif
401 } 446 }
402 447
403 /** 448 /**
404 * 449 *
405 * height should be a multiple of 2 and width should be a multiple of 16 (if this is a 450 * height should be a multiple of 2 and width should be a multiple of 16 (if this is a
416 else if(gCpuCaps.has3DNow) 461 else if(gCpuCaps.has3DNow)
417 yuy2toyv12_3DNow(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride); 462 yuy2toyv12_3DNow(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride);
418 else if(gCpuCaps.hasMMX) 463 else if(gCpuCaps.hasMMX)
419 yuy2toyv12_MMX(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride); 464 yuy2toyv12_MMX(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride);
420 else 465 else
466 #endif
421 yuy2toyv12_C(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride); 467 yuy2toyv12_C(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride);
422 #else
423 yuy2toyv12_C(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride);
424 #endif
425 } 468 }
426 469
427 /** 470 /**
428 * 471 *
429 * height should be a multiple of 2 and width should be a multiple of 16 (if this is a 472 * height should be a multiple of 2 and width should be a multiple of 16 (if this is a
486 else if(gCpuCaps.has3DNow) 529 else if(gCpuCaps.has3DNow)
487 rgb24toyv12_3DNow(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride); 530 rgb24toyv12_3DNow(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride);
488 else if(gCpuCaps.hasMMX) 531 else if(gCpuCaps.hasMMX)
489 rgb24toyv12_MMX(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride); 532 rgb24toyv12_MMX(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride);
490 else 533 else
534 #endif
491 rgb24toyv12_C(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride); 535 rgb24toyv12_C(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride);
492 #else
493 rgb24toyv12_C(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride);
494 #endif
495 } 536 }
496 537
497 void interleaveBytes(uint8_t *src1, uint8_t *src2, uint8_t *dst, 538 void interleaveBytes(uint8_t *src1, uint8_t *src2, uint8_t *dst,
498 int width, int height, int src1Stride, int src2Stride, int dstStride) 539 unsigned width, unsigned height, unsigned src1Stride,
540 unsigned src2Stride, unsigned dstStride)
499 { 541 {
500 #ifdef CAN_COMPILE_X86_ASM 542 #ifdef CAN_COMPILE_X86_ASM
501 // ordered per speed fasterst first 543 // ordered per speed fasterst first
502 if(gCpuCaps.hasMMX2) 544 if(gCpuCaps.hasMMX2)
503 interleaveBytes_MMX2(src1, src2, dst, width, height, src1Stride, src2Stride, dstStride); 545 interleaveBytes_MMX2(src1, src2, dst, width, height, src1Stride, src2Stride, dstStride);
504 else if(gCpuCaps.has3DNow) 546 else if(gCpuCaps.has3DNow)
505 interleaveBytes_3DNow(src1, src2, dst, width, height, src1Stride, src2Stride, dstStride); 547 interleaveBytes_3DNow(src1, src2, dst, width, height, src1Stride, src2Stride, dstStride);
506 else if(gCpuCaps.hasMMX) 548 else if(gCpuCaps.hasMMX)
507 interleaveBytes_MMX(src1, src2, dst, width, height, src1Stride, src2Stride, dstStride); 549 interleaveBytes_MMX(src1, src2, dst, width, height, src1Stride, src2Stride, dstStride);
508 else 550 else
551 #endif
509 interleaveBytes_C(src1, src2, dst, width, height, src1Stride, src2Stride, dstStride); 552 interleaveBytes_C(src1, src2, dst, width, height, src1Stride, src2Stride, dstStride);
510 #else 553 }
511 interleaveBytes_C(src1, src2, dst, width, height, src1Stride, src2Stride, dstStride);
512 #endif
513 }