00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <inttypes.h>
00027
00028 #include "libavutil/bswap.h"
00029 #include "config.h"
00030 #include "rgb2rgb.h"
00031 #include "swscale.h"
00032 #include "swscale_internal.h"
00033
00034 void (*rgb32tobgr24)(const uint8_t *src, uint8_t *dst, int src_size);
00035 void (*rgb32tobgr16)(const uint8_t *src, uint8_t *dst, int src_size);
00036 void (*rgb32tobgr15)(const uint8_t *src, uint8_t *dst, int src_size);
00037 void (*rgb24tobgr32)(const uint8_t *src, uint8_t *dst, int src_size);
00038 void (*rgb24tobgr24)(const uint8_t *src, uint8_t *dst, int src_size);
00039 void (*rgb24tobgr16)(const uint8_t *src, uint8_t *dst, int src_size);
00040 void (*rgb24tobgr15)(const uint8_t *src, uint8_t *dst, int src_size);
00041 void (*rgb16tobgr24)(const uint8_t *src, uint8_t *dst, int src_size);
00042 void (*rgb15tobgr24)(const uint8_t *src, uint8_t *dst, int src_size);
00043
00044 void (*rgb32to16)(const uint8_t *src, uint8_t *dst, int src_size);
00045 void (*rgb32to15)(const uint8_t *src, uint8_t *dst, int src_size);
00046 void (*rgb24to16)(const uint8_t *src, uint8_t *dst, int src_size);
00047 void (*rgb24to15)(const uint8_t *src, uint8_t *dst, int src_size);
00048 void (*rgb16to32)(const uint8_t *src, uint8_t *dst, int src_size);
00049 void (*rgb16to15)(const uint8_t *src, uint8_t *dst, int src_size);
00050 void (*rgb15to16)(const uint8_t *src, uint8_t *dst, int src_size);
00051 void (*rgb15to32)(const uint8_t *src, uint8_t *dst, int src_size);
00052
00053 void (*shuffle_bytes_2103)(const uint8_t *src, uint8_t *dst, int src_size);
00054
00055 void (*yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc,
00056 const uint8_t *vsrc, uint8_t *dst,
00057 int width, int height,
00058 int lumStride, int chromStride, int dstStride);
00059 void (*yv12touyvy)(const uint8_t *ysrc, const uint8_t *usrc,
00060 const uint8_t *vsrc, uint8_t *dst,
00061 int width, int height,
00062 int lumStride, int chromStride, int dstStride);
00063 void (*yuv422ptoyuy2)(const uint8_t *ysrc, const uint8_t *usrc,
00064 const uint8_t *vsrc, uint8_t *dst,
00065 int width, int height,
00066 int lumStride, int chromStride, int dstStride);
00067 void (*yuv422ptouyvy)(const uint8_t *ysrc, const uint8_t *usrc,
00068 const uint8_t *vsrc, uint8_t *dst,
00069 int width, int height,
00070 int lumStride, int chromStride, int dstStride);
00071 void (*yuy2toyv12)(const uint8_t *src, uint8_t *ydst,
00072 uint8_t *udst, uint8_t *vdst,
00073 int width, int height,
00074 int lumStride, int chromStride, int srcStride);
00075 void (*rgb24toyv12)(const uint8_t *src, uint8_t *ydst,
00076 uint8_t *udst, uint8_t *vdst,
00077 int width, int height,
00078 int lumStride, int chromStride, int srcStride);
00079 void (*planar2x)(const uint8_t *src, uint8_t *dst, int width, int height,
00080 int srcStride, int dstStride);
00081 void (*interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t *dst,
00082 int width, int height, int src1Stride,
00083 int src2Stride, int dstStride);
00084 void (*vu9_to_vu12)(const uint8_t *src1, const uint8_t *src2,
00085 uint8_t *dst1, uint8_t *dst2,
00086 int width, int height,
00087 int srcStride1, int srcStride2,
00088 int dstStride1, int dstStride2);
00089 void (*yvu9_to_yuy2)(const uint8_t *src1, const uint8_t *src2,
00090 const uint8_t *src3, uint8_t *dst,
00091 int width, int height,
00092 int srcStride1, int srcStride2,
00093 int srcStride3, int dstStride);
00094 void (*uyvytoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
00095 const uint8_t *src, int width, int height,
00096 int lumStride, int chromStride, int srcStride);
00097 void (*uyvytoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
00098 const uint8_t *src, int width, int height,
00099 int lumStride, int chromStride, int srcStride);
00100 void (*yuyvtoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
00101 const uint8_t *src, int width, int height,
00102 int lumStride, int chromStride, int srcStride);
00103 void (*yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
00104 const uint8_t *src, int width, int height,
00105 int lumStride, int chromStride, int srcStride);
00106
00107 #define RGB2YUV_SHIFT 8
00108 #define BY ((int)( 0.098 * (1 << RGB2YUV_SHIFT) + 0.5))
00109 #define BV ((int)(-0.071 * (1 << RGB2YUV_SHIFT) + 0.5))
00110 #define BU ((int)( 0.439 * (1 << RGB2YUV_SHIFT) + 0.5))
00111 #define GY ((int)( 0.504 * (1 << RGB2YUV_SHIFT) + 0.5))
00112 #define GV ((int)(-0.368 * (1 << RGB2YUV_SHIFT) + 0.5))
00113 #define GU ((int)(-0.291 * (1 << RGB2YUV_SHIFT) + 0.5))
00114 #define RY ((int)( 0.257 * (1 << RGB2YUV_SHIFT) + 0.5))
00115 #define RV ((int)( 0.439 * (1 << RGB2YUV_SHIFT) + 0.5))
00116 #define RU ((int)(-0.148 * (1 << RGB2YUV_SHIFT) + 0.5))
00117
00118
00119 #include "rgb2rgb_template.c"
00120
00121
00122
00123
00124
00125
00126
00127
00128 void sws_rgb2rgb_init(void)
00129 {
00130 rgb2rgb_init_c();
00131 if (HAVE_MMX)
00132 rgb2rgb_init_x86();
00133 }
00134
00135 void rgb32to24(const uint8_t *src, uint8_t *dst, int src_size)
00136 {
00137 int i, num_pixels = src_size >> 2;
00138
00139 for (i = 0; i < num_pixels; i++) {
00140 #if HAVE_BIGENDIAN
00141
00142 dst[3 * i + 0] = src[4 * i + 1];
00143 dst[3 * i + 1] = src[4 * i + 2];
00144 dst[3 * i + 2] = src[4 * i + 3];
00145 #else
00146 dst[3 * i + 0] = src[4 * i + 2];
00147 dst[3 * i + 1] = src[4 * i + 1];
00148 dst[3 * i + 2] = src[4 * i + 0];
00149 #endif
00150 }
00151 }
00152
00153 void rgb24to32(const uint8_t *src, uint8_t *dst, int src_size)
00154 {
00155 int i;
00156
00157 for (i = 0; 3 * i < src_size; i++) {
00158 #if HAVE_BIGENDIAN
00159
00160 dst[4 * i + 0] = 255;
00161 dst[4 * i + 1] = src[3 * i + 0];
00162 dst[4 * i + 2] = src[3 * i + 1];
00163 dst[4 * i + 3] = src[3 * i + 2];
00164 #else
00165 dst[4 * i + 0] = src[3 * i + 2];
00166 dst[4 * i + 1] = src[3 * i + 1];
00167 dst[4 * i + 2] = src[3 * i + 0];
00168 dst[4 * i + 3] = 255;
00169 #endif
00170 }
00171 }
00172
00173 void rgb16tobgr32(const uint8_t *src, uint8_t *dst, int src_size)
00174 {
00175 uint8_t *d = dst;
00176 const uint16_t *s = (const uint16_t *)src;
00177 const uint16_t *end = s + src_size / 2;
00178
00179 while (s < end) {
00180 register uint16_t bgr = *s++;
00181 #if HAVE_BIGENDIAN
00182 *d++ = 255;
00183 *d++ = ((bgr&0x001F)<<3) | ((bgr&0x001F)>> 2);
00184 *d++ = ((bgr&0x07E0)>>3) | ((bgr&0x07E0)>> 9);
00185 *d++ = ((bgr&0xF800)>>8) | ((bgr&0xF800)>>13);
00186 #else
00187 *d++ = ((bgr&0xF800)>>8) | ((bgr&0xF800)>>13);
00188 *d++ = ((bgr&0x07E0)>>3) | ((bgr&0x07E0)>> 9);
00189 *d++ = ((bgr&0x001F)<<3) | ((bgr&0x001F)>> 2);
00190 *d++ = 255;
00191 #endif
00192 }
00193 }
00194
00195 void rgb12to15(const uint8_t *src, uint8_t *dst, int src_size)
00196 {
00197 uint16_t rgb, r, g, b;
00198 uint16_t *d = (uint16_t *)dst;
00199 const uint16_t *s = (const uint16_t *)src;
00200 const uint16_t *end = s + src_size / 2;
00201
00202 while (s < end) {
00203 rgb = *s++;
00204 r = rgb & 0xF00;
00205 g = rgb & 0x0F0;
00206 b = rgb & 0x00F;
00207 r = (r << 3) | ((r & 0x800) >> 1);
00208 g = (g << 2) | ((g & 0x080) >> 2);
00209 b = (b << 1) | ( b >> 3);
00210 *d++ = r | g | b;
00211 }
00212 }
00213
00214 void rgb16to24(const uint8_t *src, uint8_t *dst, int src_size)
00215 {
00216 uint8_t *d = dst;
00217 const uint16_t *s = (const uint16_t *)src;
00218 const uint16_t *end = s + src_size / 2;
00219
00220 while (s < end) {
00221 register uint16_t bgr = *s++;
00222 *d++ = ((bgr&0xF800)>>8) | ((bgr&0xF800)>>13);
00223 *d++ = ((bgr&0x07E0)>>3) | ((bgr&0x07E0)>> 9);
00224 *d++ = ((bgr&0x001F)<<3) | ((bgr&0x001F)>> 2);
00225 }
00226 }
00227
00228 void rgb16tobgr16(const uint8_t *src, uint8_t *dst, int src_size)
00229 {
00230 int i, num_pixels = src_size >> 1;
00231
00232 for (i = 0; i < num_pixels; i++) {
00233 unsigned rgb = ((const uint16_t *)src)[i];
00234 ((uint16_t *)dst)[i] = (rgb >> 11) | (rgb & 0x7E0) | (rgb << 11);
00235 }
00236 }
00237
00238 void rgb16tobgr15(const uint8_t *src, uint8_t *dst, int src_size)
00239 {
00240 int i, num_pixels = src_size >> 1;
00241
00242 for (i = 0; i < num_pixels; i++) {
00243 unsigned rgb = ((const uint16_t *)src)[i];
00244 ((uint16_t *)dst)[i] = (rgb >> 11) | ((rgb & 0x7C0) >> 1) | ((rgb & 0x1F) << 10);
00245 }
00246 }
00247
00248 void rgb15tobgr32(const uint8_t *src, uint8_t *dst, int src_size)
00249 {
00250 uint8_t *d = dst;
00251 const uint16_t *s = (const uint16_t *)src;
00252 const uint16_t *end = s + src_size / 2;
00253
00254 while (s < end) {
00255 register uint16_t bgr = *s++;
00256 #if HAVE_BIGENDIAN
00257 *d++ = 255;
00258 *d++ = ((bgr&0x001F)<<3) | ((bgr&0x001F)>> 2);
00259 *d++ = ((bgr&0x03E0)>>2) | ((bgr&0x03E0)>> 7);
00260 *d++ = ((bgr&0x7C00)>>7) | ((bgr&0x7C00)>>12);
00261 #else
00262 *d++ = ((bgr&0x7C00)>>7) | ((bgr&0x7C00)>>12);
00263 *d++ = ((bgr&0x03E0)>>2) | ((bgr&0x03E0)>> 7);
00264 *d++ = ((bgr&0x001F)<<3) | ((bgr&0x001F)>> 2);
00265 *d++ = 255;
00266 #endif
00267 }
00268 }
00269
00270 void rgb15to24(const uint8_t *src, uint8_t *dst, int src_size)
00271 {
00272 uint8_t *d = dst;
00273 const uint16_t *s = (const uint16_t *)src;
00274 const uint16_t *end = s + src_size / 2;
00275
00276 while (s < end) {
00277 register uint16_t bgr = *s++;
00278 *d++ = ((bgr&0x7C00)>>7) | ((bgr&0x7C00)>>12);
00279 *d++ = ((bgr&0x03E0)>>2) | ((bgr&0x03E0)>> 7);
00280 *d++ = ((bgr&0x001F)<<3) | ((bgr&0x001F)>> 2);
00281 }
00282 }
00283
00284 void rgb15tobgr16(const uint8_t *src, uint8_t *dst, int src_size)
00285 {
00286 int i, num_pixels = src_size >> 1;
00287
00288 for (i = 0; i < num_pixels; i++) {
00289 unsigned rgb = ((const uint16_t *)src)[i];
00290 ((uint16_t *)dst)[i] = ((rgb & 0x7C00) >> 10) | ((rgb & 0x3E0) << 1) | (rgb << 11);
00291 }
00292 }
00293
00294 void rgb15tobgr15(const uint8_t *src, uint8_t *dst, int src_size)
00295 {
00296 int i, num_pixels = src_size >> 1;
00297
00298 for (i = 0; i < num_pixels; i++) {
00299 unsigned rgb = ((const uint16_t *)src)[i];
00300 unsigned br = rgb & 0x7C1F;
00301 ((uint16_t *)dst)[i] = (br >> 10) | (rgb & 0x3E0) | (br << 10);
00302 }
00303 }
00304
00305 void rgb12tobgr12(const uint8_t *src, uint8_t *dst, int src_size)
00306 {
00307 uint16_t *d = (uint16_t *)dst;
00308 uint16_t *s = (uint16_t *)src;
00309 int i, num_pixels = src_size >> 1;
00310
00311 for (i = 0; i < num_pixels; i++) {
00312 unsigned rgb = s[i];
00313 d[i] = (rgb << 8 | rgb & 0xF0 | rgb >> 8) & 0xFFF;
00314 }
00315 }
00316
00317
00318 #define DEFINE_SHUFFLE_BYTES(a, b, c, d) \
00319 void shuffle_bytes_ ## a ## b ## c ## d(const uint8_t *src, \
00320 uint8_t *dst, int src_size) \
00321 { \
00322 int i; \
00323 \
00324 for (i = 0; i < src_size; i += 4) { \
00325 dst[i + 0] = src[i + a]; \
00326 dst[i + 1] = src[i + b]; \
00327 dst[i + 2] = src[i + c]; \
00328 dst[i + 3] = src[i + d]; \
00329 } \
00330 }
00331
00332 DEFINE_SHUFFLE_BYTES(0, 3, 2, 1)
00333 DEFINE_SHUFFLE_BYTES(1, 2, 3, 0)
00334 DEFINE_SHUFFLE_BYTES(3, 0, 1, 2)
00335 DEFINE_SHUFFLE_BYTES(3, 2, 1, 0)