Mercurial > mplayer.hg
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++) |