comparison libswscale/swscale_template.c @ 27535:d92059f10deb

Add bgr/rgb15/16/32->UV-half to the macro so there is less code duplication at the source level.
author michael
date Wed, 10 Sep 2008 13:55:51 +0000
parents 275add6845cc
children dded40ae9728
comparison
equal deleted inserted replaced
27534:275add6845cc 27535:d92059f10deb
1868 static inline void RENAME(name)(uint8_t *dstU, uint8_t *dstV, uint8_t *src, uint8_t *dummy, long width)\ 1868 static inline void RENAME(name)(uint8_t *dstU, uint8_t *dstV, uint8_t *src, uint8_t *dummy, long width)\
1869 {\ 1869 {\
1870 int i;\ 1870 int i;\
1871 for (i=0; i<width; i++)\ 1871 for (i=0; i<width; i++)\
1872 {\ 1872 {\
1873 int b= (((type*)src)[i]>>shb)&maskb;\ 1873 int b= (((type*)src)[i]&maskb)>>shb;\
1874 int g= (((type*)src)[i]>>shg)&maskg;\ 1874 int g= (((type*)src)[i]&maskg)>>shg;\
1875 int r= (((type*)src)[i]>>shr)&maskr;\ 1875 int r= (((type*)src)[i]&maskr)>>shr;\
1876 \ 1876 \
1877 dstU[i]= ((RU)*r + (GU)*g + (BU)*b + (257<<((S)-1)))>>(S);\ 1877 dstU[i]= ((RU)*r + (GU)*g + (BU)*b + (257<<((S)-1)))>>(S);\
1878 dstV[i]= ((RV)*r + (GV)*g + (BV)*b + (257<<((S)-1)))>>(S);\ 1878 dstV[i]= ((RV)*r + (GV)*g + (BV)*b + (257<<((S)-1)))>>(S);\
1879 }\ 1879 }\
1880 }\
1881 static inline void RENAME(name ## _half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src, uint8_t *dummy, long width)\
1882 {\
1883 int i;\
1884 for (i=0; i<width; i++)\
1885 {\
1886 int pix0= ((type*)src)[2*i+0];\
1887 int pix1= ((type*)src)[2*i+1];\
1888 int g= (pix0&maskg)+(pix1&maskg);\
1889 int b= ((pix0+pix1-g)&(maskb|(2*maskb)))>>shb;\
1890 int r= ((pix0+pix1-g)&(maskr|(2*maskr)))>>shr;\
1891 \
1892 g>>=shg;\
1893 \
1894 dstU[i]= (((RU)>>1)*r + ((GU)>>1)*g + ((BU)>>1)*b + (257<<((S)-1)))>>(S);\
1895 dstV[i]= (((RV)>>1)*r + ((GV)>>1)*g + ((BV)>>1)*b + (257<<((S)-1)))>>(S);\
1896 /* dstU[i]= ((RU)*r + (GU)*g + (BU)*b + (257<<(S)))>>((S)+1);\
1897 dstV[i]= ((RV)*r + (GV)*g + (BV)*b + (257<<(S)))>>((S)+1);*/\
1898 }\
1880 } 1899 }
1881 1900
1882 BGR2UV(uint32_t, bgr32ToUV,16, 0, 0, 0x00FF, 0xFF00, 0x00FF, RU<< 8, GU , BU<< 8, RV<< 8, GV , BV<< 8, RGB2YUV_SHIFT+8) 1901 BGR2UV(uint32_t, bgr32ToUV,16, 0, 0, 0xFF0000, 0xFF00, 0x00FF, RU<< 8, GU , BU<< 8, RV<< 8, GV , BV<< 8, RGB2YUV_SHIFT+8)
1883 BGR2UV(uint32_t, rgb32ToUV, 0, 0,16, 0x00FF, 0xFF00, 0x00FF, RU<< 8, GU , BU<< 8, RV<< 8, GV , BV<< 8, RGB2YUV_SHIFT+8) 1902 BGR2UV(uint32_t, rgb32ToUV, 0, 0,16, 0x00FF, 0xFF00, 0xFF0000, RU<< 8, GU , BU<< 8, RV<< 8, GV , BV<< 8, RGB2YUV_SHIFT+8)
1884 BGR2UV(uint16_t, bgr16ToUV, 0, 0, 0, 0x001F, 0x07E0, 0xF800, RU<<11, GU<<5, BU , RV<<11, GV<<5, BV , RGB2YUV_SHIFT+8) 1903 BGR2UV(uint16_t, bgr16ToUV, 0, 0, 0, 0x001F, 0x07E0, 0xF800, RU<<11, GU<<5, BU , RV<<11, GV<<5, BV , RGB2YUV_SHIFT+8)
1885 BGR2UV(uint16_t, bgr15ToUV, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, RU<<10, GU<<5, BU , RV<<10, GV<<5, BV , RGB2YUV_SHIFT+7) 1904 BGR2UV(uint16_t, bgr15ToUV, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, RU<<10, GU<<5, BU , RV<<10, GV<<5, BV , RGB2YUV_SHIFT+7)
1886 BGR2UV(uint16_t, rgb16ToUV, 0, 0, 0, 0xF800, 0x07E0, 0x001F, RU , GU<<5, BU<<11, RV , GV<<5, BV<<11, RGB2YUV_SHIFT+8) 1905 BGR2UV(uint16_t, rgb16ToUV, 0, 0, 0, 0xF800, 0x07E0, 0x001F, RU , GU<<5, BU<<11, RV , GV<<5, BV<<11, RGB2YUV_SHIFT+8)
1887 BGR2UV(uint16_t, rgb15ToUV, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, RU , GU<<5, BU<<10, RV , GV<<5, BV<<10, RGB2YUV_SHIFT+7) 1906 BGR2UV(uint16_t, rgb15ToUV, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, RU , GU<<5, BU<<10, RV , GV<<5, BV<<10, RGB2YUV_SHIFT+7)
1888
1889 static inline void RENAME(bgr32ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
1890 {
1891 int i;
1892 assert(src1 == src2);
1893 for (i=0; i<width; i++)
1894 {
1895 const int a= ((uint32_t*)src1)[2*i+0];
1896 const int e= ((uint32_t*)src1)[2*i+1];
1897 const int l= (a&0xFF00FF) + (e&0xFF00FF);
1898 const int h= (a&0x00FF00) + (e&0x00FF00);
1899 const int b= l&0x3FF;
1900 const int g= h>>8;
1901 const int r= l>>16;
1902
1903 dstU[i]= (RU*r + GU*g + BU*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1);
1904 dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1);
1905 }
1906 }
1907 1907
1908 #ifdef HAVE_MMX 1908 #ifdef HAVE_MMX
1909 static inline void bgr24ToY_mmx(uint8_t *dst, uint8_t *src, long width, int srcFormat) 1909 static inline void bgr24ToY_mmx(uint8_t *dst, uint8_t *src, long width, int srcFormat)
1910 { 1910 {
1911 1911
2065 dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1); 2065 dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1);
2066 } 2066 }
2067 assert(src1 == src2); 2067 assert(src1 == src2);
2068 } 2068 }
2069 2069
2070 static inline void RENAME(rgb16ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
2071 {
2072 int i;
2073 assert(src1==src2);
2074 for (i=0; i<width; i++)
2075 {
2076 int d0= ((uint32_t*)src1)[i];
2077
2078 int dl= (d0&0x07E0F81F);
2079 int dh= ((d0>>5)&0x07C0F83F);
2080
2081 int dh2= (dh>>11) + (dh<<21);
2082 int d= dh2 + dl;
2083
2084 int b= d&0x7F;
2085 int r= (d>>11)&0x7F;
2086 int g= d>>21;
2087 dstU[i]= (2*RU*r + GU*g + 2*BU*b + (257<<(RGB2YUV_SHIFT-2)))>>(RGB2YUV_SHIFT+1-2);
2088 dstV[i]= (2*RV*r + GV*g + 2*BV*b + (257<<(RGB2YUV_SHIFT-2)))>>(RGB2YUV_SHIFT+1-2);
2089 }
2090 }
2091
2092 static inline void RENAME(rgb15ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
2093 {
2094 int i;
2095 assert(src1==src2);
2096 for (i=0; i<width; i++)
2097 {
2098 int d0= ((uint32_t*)src1)[i];
2099
2100 int dl= (d0&0x03E07C1F);
2101 int dh= ((d0>>5)&0x03E0F81F);
2102
2103 int dh2= (dh>>11) + (dh<<21);
2104 int d= dh2 + dl;
2105
2106 int b= d&0x7F;
2107 int r= (d>>10)&0x7F;
2108 int g= d>>21;
2109 dstU[i]= (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-3)))>>(RGB2YUV_SHIFT+1-3);
2110 dstV[i]= (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-3)))>>(RGB2YUV_SHIFT+1-3);
2111 }
2112 }
2113
2114 static inline void RENAME(rgb32ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
2115 {
2116 int i;
2117 assert(src1==src2);
2118 for (i=0; i<width; i++)
2119 {
2120 const int a= ((uint32_t*)src1)[2*i+0];
2121 const int e= ((uint32_t*)src1)[2*i+1];
2122 const int l= (a&0xFF00FF) + (e&0xFF00FF);
2123 const int h= (a&0x00FF00) + (e&0x00FF00);
2124 const int r= l&0x3FF;
2125 const int g= h>>8;
2126 const int b= l>>16;
2127
2128 dstU[i]= (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT)))>>(RGB2YUV_SHIFT+1);
2129 dstV[i]= (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT)))>>(RGB2YUV_SHIFT+1);
2130 }
2131 }
2132
2133 static inline void RENAME(rgb24ToY)(uint8_t *dst, uint8_t *src, long width) 2070 static inline void RENAME(rgb24ToY)(uint8_t *dst, uint8_t *src, long width)
2134 { 2071 {
2135 #ifdef HAVE_MMX 2072 #ifdef HAVE_MMX
2136 bgr24ToY_mmx(dst, src, width, PIX_FMT_RGB24); 2073 bgr24ToY_mmx(dst, src, width, PIX_FMT_RGB24);
2137 #else 2074 #else
2179 dstU[i]= (RU*r + GU*g + BU*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1); 2116 dstU[i]= (RU*r + GU*g + BU*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1);
2180 dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1); 2117 dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1);
2181 } 2118 }
2182 } 2119 }
2183 2120
2184 static inline void RENAME(bgr16ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
2185 {
2186 int i;
2187 assert(src1 == src2);
2188 for (i=0; i<width; i++)
2189 {
2190 int d0= ((uint32_t*)src1)[i];
2191
2192 int dl= (d0&0x07E0F81F);
2193 int d= dl + (((d0>>16) + (d0<<16))&0x07E0F81F);
2194
2195 int r= d&0x3F;
2196 int b= (d>>11)&0x3F;
2197 int g= d>>21;
2198 dstU[i]= (2*RU*r + GU*g + 2*BU*b + (257<<(RGB2YUV_SHIFT-2)))>>(RGB2YUV_SHIFT+1-2);
2199 dstV[i]= (2*RV*r + GV*g + 2*BV*b + (257<<(RGB2YUV_SHIFT-2)))>>(RGB2YUV_SHIFT+1-2);
2200 }
2201 }
2202
2203 static inline void RENAME(bgr15ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
2204 {
2205 int i;
2206 assert(src1 == src2);
2207 for (i=0; i<width; i++)
2208 {
2209 int d0= ((uint32_t*)src1)[i];
2210
2211 int dl= (d0&0x03E07C1F);
2212 int d= dl + (((d0>>16) + (d0<<16))&0x03E07C1F);
2213
2214 int r= d&0x3F;
2215 int b= (d>>10)&0x3F;
2216 int g= d>>21;
2217 dstU[i]= (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-3)))>>(RGB2YUV_SHIFT+1-3);
2218 dstV[i]= (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-3)))>>(RGB2YUV_SHIFT+1-3);
2219 }
2220 }
2221 2121
2222 static inline void RENAME(palToY)(uint8_t *dst, uint8_t *src, long width, uint32_t *pal) 2122 static inline void RENAME(palToY)(uint8_t *dst, uint8_t *src, long width, uint32_t *pal)
2223 { 2123 {
2224 int i; 2124 int i;
2225 for (i=0; i<width; i++) 2125 for (i=0; i<width; i++)