Fix broken palette8to*.
authorVitor Sessak <vitor1001@gmail.com>
Thu, 23 Oct 2008 19:13:11 +0000 (19:13 +0000)
committerVitor Sessak <vitor1001@gmail.com>
Thu, 23 Oct 2008 19:13:11 +0000 (19:13 +0000)
Originally committed as revision 27817 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale

libswscale/rgb2rgb.c
libswscale/rgb2rgb.h
libswscale/swscale.c

index 13388ac..b551412 100644 (file)
@@ -213,84 +213,23 @@ void sws_rgb2rgb_init(int flags){
 }
 
 /**
- * Palette is assumed to contain BGR32.
+ * Convert the palette to the same packet 32-bit format as the palette
  */
-void palette8torgb32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
+void palette8topacked32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
 {
     long i;
 
-/*
-    for (i=0; i<num_pixels; i++)
-        ((unsigned *)dst)[i] = ((unsigned *)palette)[src[i]];
-*/
-
-    for (i=0; i<num_pixels; i++)
-    {
-        #ifdef WORDS_BIGENDIAN
-            dst[3]= palette[src[i]*4+2];
-            dst[2]= palette[src[i]*4+1];
-            dst[1]= palette[src[i]*4+0];
-        #else
-        //FIXME slow?
-            dst[0]= palette[src[i]*4+2];
-            dst[1]= palette[src[i]*4+1];
-            dst[2]= palette[src[i]*4+0];
-            //dst[3]= 0; /* do we need this cleansing? */
-        #endif
-        dst+= 4;
-    }
-}
-
-void palette8tobgr32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
-{
-    long i;
     for (i=0; i<num_pixels; i++)
-    {
-        #ifdef WORDS_BIGENDIAN
-            dst[3]= palette[src[i]*4+0];
-            dst[2]= palette[src[i]*4+1];
-            dst[1]= palette[src[i]*4+2];
-        #else
-            //FIXME slow?
-            dst[0]= palette[src[i]*4+0];
-            dst[1]= palette[src[i]*4+1];
-            dst[2]= palette[src[i]*4+2];
-            //dst[3]= 0; /* do we need this cleansing? */
-        #endif
-
-        dst+= 4;
-    }
+        ((uint32_t *) dst)[i] = ((const uint32_t *) palette)[src[i]];
 }
 
 /**
- * Palette is assumed to contain BGR32.
+ * Palette format: ABCD -> dst format: ABC
  */
-void palette8torgb24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
+void palette8topacked24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
 {
     long i;
-/*
-    Writes 1 byte too much and might cause alignment issues on some architectures?
-    for (i=0; i<num_pixels; i++)
-        ((unsigned *)(&dst[i*3])) = ((unsigned *)palette)[src[i]];
-*/
-    for (i=0; i<num_pixels; i++)
-    {
-        //FIXME slow?
-        dst[0]= palette[src[i]*4+2];
-        dst[1]= palette[src[i]*4+1];
-        dst[2]= palette[src[i]*4+0];
-        dst+= 3;
-    }
-}
 
-void palette8tobgr24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
-{
-    long i;
-/*
-    Writes 1 byte too much and might cause alignment issues on some architectures?
-    for (i=0; i<num_pixels; i++)
-        ((unsigned *)(&dst[i*3])) = ((unsigned *)palette)[src[i]];
-*/
     for (i=0; i<num_pixels; i++)
     {
         //FIXME slow?
index 11c0d8e..5cc6a2d 100644 (file)
@@ -61,10 +61,8 @@ extern void rgb15tobgr15(const uint8_t *src, uint8_t *dst, long src_size);
 extern void bgr8torgb8  (const uint8_t *src, uint8_t *dst, long src_size);
 
 
-extern void palette8torgb32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette);
-extern void palette8tobgr32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette);
-extern void palette8torgb24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette);
-extern void palette8tobgr24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette);
+extern void palette8topacked32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette);
+extern void palette8topacked24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette);
 extern void palette8torgb16(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette);
 extern void palette8tobgr16(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette);
 extern void palette8torgb15(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette);
index 8b899c4..1ad488c 100644 (file)
@@ -1729,10 +1729,12 @@ static int pal2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int sr
                sws_format_name(srcFormat), sws_format_name(dstFormat));
 
     switch(dstFormat){
-    case PIX_FMT_RGB32: conv = palette8torgb32; break;
-    case PIX_FMT_BGR32: conv = palette8tobgr32; break;
-    case PIX_FMT_RGB24: conv = palette8torgb24; break;
-    case PIX_FMT_BGR24: conv = palette8tobgr24; break;
+    case PIX_FMT_RGB32  : conv = palette8topacked32; break;
+    case PIX_FMT_BGR32  : conv = palette8topacked32; break;
+    case PIX_FMT_BGR32_1: conv = palette8topacked32; break;
+    case PIX_FMT_RGB32_1: conv = palette8topacked32; break;
+    case PIX_FMT_RGB24  : conv = palette8topacked24; break;
+    case PIX_FMT_BGR24  : conv = palette8topacked24; break;
     default: av_log(c, AV_LOG_ERROR, "internal error %s -> %s converter\n",
                     sws_format_name(srcFormat), sws_format_name(dstFormat)); break;
     }
@@ -2343,8 +2345,10 @@ SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, int d
 
         if ((usePal(srcFormat) && (
                  dstFormat == PIX_FMT_RGB32 ||
+                 dstFormat == PIX_FMT_RGB32_1 ||
                  dstFormat == PIX_FMT_RGB24 ||
                  dstFormat == PIX_FMT_BGR32 ||
+                 dstFormat == PIX_FMT_BGR32_1 ||
                  dstFormat == PIX_FMT_BGR24)))
              c->swScale= pal2rgbWrapper;
 
@@ -2739,7 +2743,34 @@ int sws_scale(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
             u= av_clip_uint8((RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT);
             v= av_clip_uint8((RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT);
             c->pal_yuv[i]= y + (u<<8) + (v<<16);
-            c->pal_rgb[i]= b + (g<<8) + (r<<16);
+
+
+            switch(c->dstFormat) {
+            case PIX_FMT_BGR32:
+#ifndef WORDS_BIGENDIAN
+            case PIX_FMT_RGB24:
+#endif
+                c->pal_rgb[i]=  r + (g<<8) + (b<<16);
+                break;
+            case PIX_FMT_BGR32_1:
+#ifdef  WORDS_BIGENDIAN
+            case PIX_FMT_BGR24:
+#endif
+                c->pal_rgb[i]= (r + (g<<8) + (b<<16)) << 8;
+                break;
+            case PIX_FMT_RGB32_1:
+#ifdef  WORDS_BIGENDIAN
+            case PIX_FMT_RGB24:
+#endif
+                c->pal_rgb[i]= (b + (g<<8) + (r<<16)) << 8;
+                break;
+            case PIX_FMT_RGB32:
+#ifndef WORDS_BIGENDIAN
+            case PIX_FMT_BGR24:
+#endif
+            default:
+                c->pal_rgb[i]=  b + (g<<8) + (r<<16);
+            }
         }
     }