/* * * rgb2rgb.c, Software RGB to RGB convertor * pluralize by Software PAL8 to RGB convertor * Software YUV to YUV convertor * Software YUV to RGB convertor * Written by Nick Kurshev. * palette & yuv & runtime cpu stuff by Michael (michaelni@gmx.at) (under GPL) */ #include #include "../config.h" #include "rgb2rgb.h" #include "../cpudetect.h" #include "../mangle.h" #ifdef ARCH_X86 #define CAN_COMPILE_X86_ASM #endif #define FAST_BGR2YV12 // use 7 bit coeffs instead of 15bit #ifdef CAN_COMPILE_X86_ASM static const uint64_t mask32b __attribute__((aligned(8))) = 0x000000FF000000FFULL; static const uint64_t mask32g __attribute__((aligned(8))) = 0x0000FF000000FF00ULL; static const uint64_t mask32r __attribute__((aligned(8))) = 0x00FF000000FF0000ULL; static const uint64_t mask32 __attribute__((aligned(8))) = 0x00FFFFFF00FFFFFFULL; static const uint64_t mask24b __attribute__((aligned(8))) = 0x00FF0000FF0000FFULL; static const uint64_t mask24g __attribute__((aligned(8))) = 0xFF0000FF0000FF00ULL; static const uint64_t mask24r __attribute__((aligned(8))) = 0x0000FF0000FF0000ULL; static const uint64_t mask24l __attribute__((aligned(8))) = 0x0000000000FFFFFFULL; static const uint64_t mask24h __attribute__((aligned(8))) = 0x0000FFFFFF000000ULL; static const uint64_t mask24hh __attribute__((aligned(8))) = 0xffff000000000000ULL; static const uint64_t mask24hhh __attribute__((aligned(8))) = 0xffffffff00000000ULL; static const uint64_t mask24hhhh __attribute__((aligned(8))) = 0xffffffffffff0000ULL; static const uint64_t mask15b __attribute__((aligned(8))) = 0x001F001F001F001FULL; /* 00000000 00011111 xxB */ static const uint64_t mask15rg __attribute__((aligned(8))) = 0x7FE07FE07FE07FE0ULL; /* 01111111 11100000 RGx */ static const uint64_t mask15s __attribute__((aligned(8))) = 0xFFE0FFE0FFE0FFE0ULL; static const uint64_t red_16mask __attribute__((aligned(8))) = 0x0000f8000000f800ULL; static const uint64_t green_16mask __attribute__((aligned(8)))= 0x000007e0000007e0ULL; static const uint64_t blue_16mask __attribute__((aligned(8))) = 0x0000001f0000001fULL; static const uint64_t red_15mask __attribute__((aligned(8))) = 0x00007c000000f800ULL; static const uint64_t green_15mask __attribute__((aligned(8)))= 0x000003e0000007e0ULL; static const uint64_t blue_15mask __attribute__((aligned(8))) = 0x0000001f0000001fULL; #ifdef FAST_BGR2YV12 static const uint64_t bgr2YCoeff __attribute__((aligned(8))) = 0x000000210041000DULL; static const uint64_t bgr2UCoeff __attribute__((aligned(8))) = 0x0000FFEEFFDC0038ULL; static const uint64_t bgr2VCoeff __attribute__((aligned(8))) = 0x00000038FFD2FFF8ULL; #else static const uint64_t bgr2YCoeff __attribute__((aligned(8))) = 0x000020E540830C8BULL; static const uint64_t bgr2UCoeff __attribute__((aligned(8))) = 0x0000ED0FDAC23831ULL; static const uint64_t bgr2VCoeff __attribute__((aligned(8))) = 0x00003831D0E6F6EAULL; #endif static const uint64_t bgr2YOffset __attribute__((aligned(8))) = 0x1010101010101010ULL; static const uint64_t bgr2UVOffset __attribute__((aligned(8)))= 0x8080808080808080ULL; static const uint64_t w1111 __attribute__((aligned(8))) = 0x0001000100010001ULL; #if 0 static volatile uint64_t __attribute__((aligned(8))) b5Dither; static volatile uint64_t __attribute__((aligned(8))) g5Dither; static volatile uint64_t __attribute__((aligned(8))) g6Dither; static volatile uint64_t __attribute__((aligned(8))) r5Dither; static uint64_t __attribute__((aligned(8))) dither4[2]={ 0x0103010301030103LL, 0x0200020002000200LL,}; static uint64_t __attribute__((aligned(8))) dither8[2]={ 0x0602060206020602LL, 0x0004000400040004LL,}; #endif #endif #define RGB2YUV_SHIFT 8 #define BY ((int)( 0.098*(1<