[PATCH 5/5] Dymamically generate xgx42yuv conversions tables.
Stefano Sabatini
stefano.sabatini-lala
Tue May 18 23:48:04 CEST 2010
---
swscale.c | 55 ++++++++++++++++++++++++++++++++++++---------------
swscale_internal.h | 6 +++++
utils.c | 12 +++++++++++
3 files changed, 57 insertions(+), 16 deletions(-)
diff --git a/swscale.c b/swscale.c
index 6628eb1..2187da8 100644
--- a/swscale.c
+++ b/swscale.c
@@ -1143,17 +1143,40 @@ static inline void monoblack2Y(uint8_t *dst, const uint8_t *src, long width, uin
}
}
-static const uint8_t rgb4ToYUV_table[3][16] = {
- { 16, 81, 58, 124, 101, 167, 144, 210, 40, 106, 83, 149, 126, 192, 169, 234 },
- { 128, 239, 96, 208, 65, 177, 34, 146, 109, 221, 78, 190, 47, 159, 15, 127 },
- { 128, 90, 103, 65, 78, 40, 53, 15, 239, 202, 215, 177, 190, 152, 165, 127 }
-};
+static uint8_t rgb4ToYUV_table[8][3][16];
+static uint8_t bgr4ToYUV_table[8][3][16];
-static const uint8_t bgr4ToYUV_table[3][16] = {
- { 16, 40, 58, 83, 101, 126, 144, 169, 81, 106, 124, 149, 167, 192, 210, 234 },
- { 128, 109, 96, 78, 65, 47, 34, 15, 239, 221, 208, 190, 177, 159, 146, 127 },
- { 128, 239, 103, 215, 78, 190, 53, 165, 90, 202, 65, 177, 40, 152, 15, 127 }
-};
+void ff_xgx4_init_tables(void)
+{
+ int i, j, swp;
+
+ for (i = 0; i < 8; i++) {
+ int gy = ((int)(rgb2yuv_table[i][0] * 219/255 *(1<<RGB2YUV_SHIFT) + 0.5));
+ int by = ((int)(rgb2yuv_table[i][1] * 219/255 *(1<<RGB2YUV_SHIFT) + 0.5));
+ int ry = ((int)(rgb2yuv_table[i][2] * 219/255 *(1<<RGB2YUV_SHIFT) + 0.5));
+ int gu = ((int)(rgb2yuv_table[i][3] * 224/255 *(1<<RGB2YUV_SHIFT) + 0.5));
+ int bu = ((int)(rgb2yuv_table[i][4] * 224/255 *(1<<RGB2YUV_SHIFT) + 0.5));
+ int ru = ((int)(rgb2yuv_table[i][5] * 224/255 *(1<<RGB2YUV_SHIFT) + 0.5));
+ int gv = ((int)(rgb2yuv_table[i][6] * 224/255 *(1<<RGB2YUV_SHIFT) + 0.5));
+ int bv = ((int)(rgb2yuv_table[i][7] * 224/255 *(1<<RGB2YUV_SHIFT) + 0.5));
+ int rv = ((int)(rgb2yuv_table[i][8] * 224/255 *(1<<RGB2YUV_SHIFT) + 0.5));
+ for (j = 0; j < 16; j++) {
+ int r, g, b;
+ r = ( j & 1) * 255;
+ g = ((j >> 1) & 3) * 85;
+ b = ((j >> 3) & 1) * 255;
+
+ rgb4ToYUV_table[i][0][j] = ((ry*r + gy*g + by*b)>>RGB2YUV_SHIFT) + 16;
+ rgb4ToYUV_table[i][1][j] = ((rv*r + gv*g + bv*b)>>RGB2YUV_SHIFT) + 128;
+ rgb4ToYUV_table[i][2][j] = ((ru*r + gu*g + bu*b)>>RGB2YUV_SHIFT) + 128;
+
+ swp = b; b = r; r = swp;
+ bgr4ToYUV_table[i][0][j] = ((ry*r + gy*g + by*b)>>RGB2YUV_SHIFT) + 16;
+ bgr4ToYUV_table[i][1][j] = ((rv*r + gv*g + bv*b)>>RGB2YUV_SHIFT) + 128;
+ bgr4ToYUV_table[i][2][j] = ((ru*r + gu*g + bu*b)>>RGB2YUV_SHIFT) + 128;
+ }
+ }
+}
#define DEFINE_XGX4_TO_YUV(xgx4) \
static inline void xgx4##ToY(uint8_t *dst, const uint8_t *src, \
@@ -1163,9 +1186,9 @@ static inline void xgx4##ToY(uint8_t *dst, const uint8_t *src, \
\
for (i=0; i<width/2; i++) { \
d = src[i] >> 4; \
- dst[2*i] = xgx4##ToYUV_table[0][d]; \
+ dst[2*i] = xgx4##ToYUV_table[6][0][d]; \
d = src[i] & 0x0F; \
- dst[2*i+1] = xgx4##ToYUV_table[0][d]; \
+ dst[2*i+1] = xgx4##ToYUV_table[6][0][d]; \
} \
} \
static inline void xgx4##ToUV(uint8_t *dstU, uint8_t *dstV, \
@@ -1176,11 +1199,11 @@ static inline void xgx4##ToUV(uint8_t *dstU, uint8_t *dstV, \
assert(src1 == src2); \
for (i=0; i<width/2; i++) { \
d = src1[i] >> 4; \
- dstU[2*i] = xgx4##ToYUV_table[1][d]; \
- dstV[2*i] = xgx4##ToYUV_table[2][d]; \
+ dstU[2*i] = xgx4##ToYUV_table[6][1][d]; \
+ dstV[2*i] = xgx4##ToYUV_table[6][2][d]; \
d = src1[i] & 0x0F; \
- dstU[2*i+1] = xgx4##ToYUV_table[1][d]; \
- dstV[2*i+1] = xgx4##ToYUV_table[2][d]; \
+ dstU[2*i+1] = xgx4##ToYUV_table[6][1][d]; \
+ dstV[2*i+1] = xgx4##ToYUV_table[6][2][d]; \
} \
}
diff --git a/swscale_internal.h b/swscale_internal.h
index 5be17d4..cc5188c 100644
--- a/swscale_internal.h
+++ b/swscale_internal.h
@@ -317,6 +317,12 @@ typedef struct SwsContext {
} SwsContext;
//FIXME check init (where 0)
+/**
+ * Initializes libswscale.
+ */
+void swscale_init(void);
+
+void ff_xgx4_init_tables(void);
SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c);
int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4],
int fullRange, int brightness,
diff --git a/utils.c b/utils.c
index 03f82dd..997d379 100644
--- a/utils.c
+++ b/utils.c
@@ -159,6 +159,17 @@ const char *sws_format_name(enum PixelFormat format)
return "Unknown format";
}
+void swscale_init(void)
+{
+ static int initialized = 0;
+
+ if (initialized != 0)
+ return;
+ initialized = 1;
+
+ ff_xgx4_init_tables();
+}
+
static double getSplineCoeff(double a, double b, double c, double d, double dist)
{
// printf("%f %f %f %f %f\n", a,b,c,d,dist);
@@ -786,6 +797,7 @@ SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat,
__asm__ volatile("emms\n\t"::: "memory");
#endif
+ swscale_init();
#if !CONFIG_RUNTIME_CPUDETECT //ensure that the flags match the compiled variant if cpudetect is off
flags &= ~(SWS_CPU_CAPS_MMX|SWS_CPU_CAPS_MMX2|SWS_CPU_CAPS_3DNOW|SWS_CPU_CAPS_ALTIVEC|SWS_CPU_CAPS_BFIN);
flags |= ff_hardcodedcpuflags();
--
1.7.0
--cWoXeonUoKmBZSoM--
More information about the ffmpeg-devel
mailing list