[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