changeset 27490:651ebfa4b7db

Support PIX_FMT_RGB32_1 and PIX_FMT_BGR32_1. Fixes issue248.
author michael
date Thu, 04 Sep 2008 21:59:15 +0000
parents 1ef12885a1e4
children bb75465dc12a
files libswscale/swscale.c libswscale/swscale_internal.h libswscale/swscale_template.c libswscale/yuv2rgb.c
diffstat 4 files changed, 53 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/libswscale/swscale.c	Thu Sep 04 20:46:36 2008 +0000
+++ b/libswscale/swscale.c	Thu Sep 04 21:59:15 2008 +0000
@@ -22,7 +22,7 @@
  */
 
 /*
-  supported Input formats: YV12, I420/IYUV, YUY2, UYVY, BGR32, BGR24, BGR16, BGR15, RGB32, RGB24, Y8/Y800, YVU9/IF09, PAL8
+  supported Input formats: YV12, I420/IYUV, YUY2, UYVY, BGR32, BGR32_1, BGR24, BGR16, BGR15, RGB32, RGB32_1, RGB24, Y8/Y800, YVU9/IF09, PAL8
   supported output formats: YV12, I420/IYUV, YUY2, UYVY, {BGR,RGB}{1,4,8,15,16,24,32}, Y8/Y800, YVU9/IF09
   {BGR,RGB}{1,4,8,15,16} support dithering
 
@@ -104,10 +104,12 @@
         || (x)==PIX_FMT_YUYV422     \
         || (x)==PIX_FMT_UYVY422     \
         || (x)==PIX_FMT_RGB32       \
+        || (x)==PIX_FMT_RGB32_1     \
         || (x)==PIX_FMT_BGR24       \
         || (x)==PIX_FMT_BGR565      \
         || (x)==PIX_FMT_BGR555      \
         || (x)==PIX_FMT_BGR32       \
+        || (x)==PIX_FMT_BGR32_1     \
         || (x)==PIX_FMT_RGB24       \
         || (x)==PIX_FMT_RGB565      \
         || (x)==PIX_FMT_RGB555      \
@@ -498,6 +500,8 @@
     {\
     case PIX_FMT_RGB32:\
     case PIX_FMT_BGR32:\
+    case PIX_FMT_RGB32_1:\
+    case PIX_FMT_BGR32_1:\
         func(uint32_t)\
             ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1];\
             ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2];\
@@ -680,6 +684,8 @@
     {
     case PIX_FMT_BGR32:
     case PIX_FMT_RGB32:
+    case PIX_FMT_BGR32_1:
+    case PIX_FMT_RGB32_1:
         YSCALE_YUV_2_RGBX_C(uint32_t)
             ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1];
             ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2];
@@ -1573,7 +1579,7 @@
     return srcSliceH;
 }
 
-/* {RGB,BGR}{15,16,24,32} -> {RGB,BGR}{15,16,24,32} */
+/* {RGB,BGR}{15,16,24,32,32_1} -> {RGB,BGR}{15,16,24,32} */
 static int rgb2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
                           int srcSliceH, uint8_t* dst[], int dstStride[]){
     const int srcFormat= c->srcFormat;
@@ -1632,12 +1638,15 @@
 
     if(conv)
     {
+        uint8_t *srcPtr= src[0];
+        if(srcFormat == PIX_FMT_RGB32_1 || srcFormat == PIX_FMT_BGR32_1)
+            srcPtr += ALT32_CORR;
+
         if (dstStride[0]*srcBpp == srcStride[0]*dstBpp && srcStride[0] > 0)
-            conv(src[0], dst[0] + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]);
+            conv(srcPtr, dst[0] + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]);
         else
         {
             int i;
-            uint8_t *srcPtr= src[0];
             uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY;
 
             for (i=0; i<srcSliceH; i++)
@@ -2150,6 +2159,8 @@
            && srcFormat != PIX_FMT_BGR4_BYTE && dstFormat != PIX_FMT_BGR4_BYTE
            && srcFormat != PIX_FMT_RGB4_BYTE && dstFormat != PIX_FMT_RGB4_BYTE
            && srcFormat != PIX_FMT_MONOBLACK && dstFormat != PIX_FMT_MONOBLACK
+                                             && dstFormat != PIX_FMT_RGB32_1
+                                             && dstFormat != PIX_FMT_BGR32_1
            && !needsDither)
              c->swScale= rgb2rgbWrapper;
 
--- a/libswscale/swscale_internal.h	Thu Sep 04 20:46:36 2008 +0000
+++ b/libswscale/swscale_internal.h	Thu Sep 04 21:59:15 2008 +0000
@@ -34,6 +34,12 @@
 #define VOFW 2048
 #define VOF  (VOFW*2)
 
+#ifdef WORDS_BIGENDIAN
+#define ALT32_CORR (-1)
+#else
+#define ALT32_CORR   1
+#endif
+
 typedef int (*SwsFunc)(struct SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY,
              int srcSliceH, uint8_t* dst[], int dstStride[]);
 
@@ -222,6 +228,7 @@
     )
 #define isRGB(x)        (           \
            (x)==PIX_FMT_RGB32       \
+        || (x)==PIX_FMT_RGB32_1     \
         || (x)==PIX_FMT_RGB24       \
         || (x)==PIX_FMT_RGB565      \
         || (x)==PIX_FMT_RGB555      \
@@ -232,6 +239,7 @@
     )
 #define isBGR(x)        (           \
            (x)==PIX_FMT_BGR32       \
+        || (x)==PIX_FMT_BGR32_1     \
         || (x)==PIX_FMT_BGR24       \
         || (x)==PIX_FMT_BGR565      \
         || (x)==PIX_FMT_BGR555      \
--- a/libswscale/swscale_template.c	Thu Sep 04 20:46:36 2008 +0000
+++ b/libswscale/swscale_template.c	Thu Sep 04 21:59:15 2008 +0000
@@ -2522,6 +2522,11 @@
         RENAME(bgr32ToY)(formatConvBuffer, src, srcW);
         src= formatConvBuffer;
     }
+    else if (srcFormat==PIX_FMT_RGB32_1)
+    {
+        RENAME(bgr32ToY)(formatConvBuffer, src+ALT32_CORR, srcW);
+        src= formatConvBuffer;
+    }
     else if (srcFormat==PIX_FMT_BGR24)
     {
         RENAME(bgr24ToY)(formatConvBuffer, src, srcW);
@@ -2542,6 +2547,11 @@
         RENAME(rgb32ToY)(formatConvBuffer, src, srcW);
         src= formatConvBuffer;
     }
+    else if (srcFormat==PIX_FMT_BGR32_1)
+    {
+        RENAME(rgb32ToY)(formatConvBuffer, src+ALT32_CORR, srcW);
+        src= formatConvBuffer;
+    }
     else if (srcFormat==PIX_FMT_RGB24)
     {
         RENAME(rgb24ToY)(formatConvBuffer, src, srcW);
@@ -2727,6 +2737,12 @@
         src1= formatConvBuffer;
         src2= formatConvBuffer+VOFW;
     }
+    else if (srcFormat==PIX_FMT_RGB32_1)
+    {
+        RENAME(bgr32ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1+ALT32_CORR, src2+ALT32_CORR, srcW);
+        src1= formatConvBuffer;
+        src2= formatConvBuffer+VOFW;
+    }
     else if (srcFormat==PIX_FMT_BGR24)
     {
         RENAME(bgr24ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
@@ -2751,6 +2767,12 @@
         src1= formatConvBuffer;
         src2= formatConvBuffer+VOFW;
     }
+    else if (srcFormat==PIX_FMT_BGR32_1)
+    {
+        RENAME(rgb32ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1+ALT32_CORR, src2+ALT32_CORR, srcW);
+        src1= formatConvBuffer;
+        src2= formatConvBuffer+VOFW;
+    }
     else if (srcFormat==PIX_FMT_RGB24)
     {
         RENAME(rgb24ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
--- a/libswscale/yuv2rgb.c	Thu Sep 04 20:46:36 2008 +0000
+++ b/libswscale/yuv2rgb.c	Thu Sep 04 21:59:15 2008 +0000
@@ -644,6 +644,8 @@
     av_log(c, AV_LOG_WARNING, "No accelerated colorspace conversion found.\n");
 
     switch(c->dstFormat){
+    case PIX_FMT_BGR32_1:
+    case PIX_FMT_RGB32_1:
     case PIX_FMT_BGR32:
     case PIX_FMT_RGB32: return yuv2rgb_c_32;
     case PIX_FMT_RGB24: return yuv2rgb_c_24_rgb;
@@ -676,6 +678,7 @@
 int yuv2rgb_c_init_tables (SwsContext *c, const int inv_table[4], int fullRange, int brightness, int contrast, int saturation)
 {
     const int isRgb =      c->dstFormat==PIX_FMT_RGB32
+                        || c->dstFormat==PIX_FMT_RGB32_1
                         || c->dstFormat==PIX_FMT_BGR24
                         || c->dstFormat==PIX_FMT_RGB565
                         || c->dstFormat==PIX_FMT_RGB555
@@ -684,7 +687,7 @@
                         || c->dstFormat==PIX_FMT_RGB4_BYTE
                         || c->dstFormat==PIX_FMT_MONOBLACK;
     const int bpp = fmt_depth(c->dstFormat);
-    int i;
+    int i, base;
     uint8_t table_Y[1024];
     uint32_t *table_32 = 0;
     uint16_t *table_16 = 0;
@@ -733,6 +736,7 @@
     switch (bpp) {
     case 32:
         table_start= table_32 = av_malloc ((197 + 2*682 + 256 + 132) * sizeof (uint32_t));
+        base= (c->dstFormat == PIX_FMT_RGB32_1 || c->dstFormat == PIX_FMT_BGR32_1) ? 8 : 0;
 
         entry_size = sizeof (uint32_t);
         table_r = table_32 + 197;
@@ -740,11 +744,11 @@
         table_g = table_32 + 197 + 2*682;
 
         for (i = -197; i < 256+197; i++)
-            ((uint32_t *)table_r)[i] = table_Y[i+384] << (isRgb ? 16 : 0);
+            ((uint32_t *)table_r)[i] = table_Y[i+384] << ((isRgb ? 16 : 0) + base);
         for (i = -132; i < 256+132; i++)
-            ((uint32_t *)table_g)[i] = table_Y[i+384] << 8;
+            ((uint32_t *)table_g)[i] = table_Y[i+384] << (8                + base);
         for (i = -232; i < 256+232; i++)
-            ((uint32_t *)table_b)[i] = table_Y[i+384] << (isRgb ? 0 : 16);
+            ((uint32_t *)table_b)[i] = table_Y[i+384] << ((isRgb ? 0 : 16) + base);
         break;
 
     case 24: