changeset 27532:1ecce17e826f

Make SWS_FULL_CHR_H_INP work.
author michael
date Wed, 10 Sep 2008 02:28:38 +0000
parents 905724de832e
children 152db2b1a8dd
files libswscale/swscale.c libswscale/swscale_template.c
diffstat 2 files changed, 165 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/libswscale/swscale.c	Wed Sep 10 00:02:31 2008 +0000
+++ b/libswscale/swscale.c	Wed Sep 10 02:28:38 2008 +0000
@@ -2216,7 +2216,7 @@
       && srcFormat!=PIX_FMT_RGB8      && srcFormat!=PIX_FMT_BGR8
       && srcFormat!=PIX_FMT_RGB4      && srcFormat!=PIX_FMT_BGR4
       && srcFormat!=PIX_FMT_RGB4_BYTE && srcFormat!=PIX_FMT_BGR4_BYTE
-      && srcFormat!=PIX_FMT_BGR24     && srcFormat!=PIX_FMT_RGB24)
+      && ((dstW>>c->chrDstHSubSample) <= (srcW>>1) || (flags&(SWS_FAST_BILINEAR|SWS_POINT))))
         c->chrSrcHSubSample=1;
 
     if (param){
--- a/libswscale/swscale_template.c	Wed Sep 10 00:02:31 2008 +0000
+++ b/libswscale/swscale_template.c	Wed Sep 10 02:28:38 2008 +0000
@@ -1862,6 +1862,21 @@
     assert(src1 == src2);
     for (i=0; i<width; i++)
     {
+        int b=  ((uint32_t*)src1)[i]&0xFF;
+        int g= (((uint32_t*)src1)[i]>>8)&0xFF;
+        int r= (((uint32_t*)src1)[i]>>16)&0xFF;
+
+        dstU[i]= (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT;
+        dstV[i]= (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT;
+    }
+}
+
+static inline void RENAME(bgr32ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
+{
+    int i;
+    assert(src1 == src2);
+    for (i=0; i<width; i++)
+    {
         const int a= ((uint32_t*)src1)[2*i+0];
         const int e= ((uint32_t*)src1)[2*i+1];
         const int l= (a&0xFF00FF) + (e&0xFF00FF);
@@ -2022,6 +2037,21 @@
     assert(src1 == src2);
 }
 
+static inline void RENAME(bgr24ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
+{
+    int i;
+    for (i=0; i<width; i++)
+    {
+        int b= src1[6*i + 0] + src1[6*i + 3];
+        int g= src1[6*i + 1] + src1[6*i + 4];
+        int r= src1[6*i + 2] + src1[6*i + 5];
+
+        dstU[i]= (RU*r + GU*g + BU*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1);
+        dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1);
+    }
+    assert(src1 == src2);
+}
+
 static inline void RENAME(rgb16ToY)(uint8_t *dst, uint8_t *src, long width)
 {
     int i;
@@ -2042,6 +2072,22 @@
     assert(src1==src2);
     for (i=0; i<width; i++)
     {
+        int d= ((uint16_t*)src1)[i];
+        int b= d&0x1F;
+        int g= (d>>5)&0x3F;
+        int r= (d>>11)&0x1F;
+
+        dstU[i]= (2*RU*r + GU*g + 2*BU*b + (257<<(RGB2YUV_SHIFT-3)))>>(RGB2YUV_SHIFT-2);
+        dstV[i]= (2*RV*r + GV*g + 2*BV*b + (257<<(RGB2YUV_SHIFT-3)))>>(RGB2YUV_SHIFT-2);
+    }
+}
+
+static inline void RENAME(rgb16ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
+{
+    int i;
+    assert(src1==src2);
+    for (i=0; i<width; i++)
+    {
         int d0= ((uint32_t*)src1)[i];
 
         int dl= (d0&0x07E0F81F);
@@ -2078,6 +2124,22 @@
     assert(src1==src2);
     for (i=0; i<width; i++)
     {
+        int d= ((uint16_t*)src1)[i];
+        int b= d&0x1F;
+        int g= (d>>5)&0x1F;
+        int r= (d>>10)&0x1F;
+
+        dstU[i]= (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-4)))>>(RGB2YUV_SHIFT-3);
+        dstV[i]= (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-4)))>>(RGB2YUV_SHIFT-3);
+    }
+}
+
+static inline void RENAME(rgb15ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
+{
+    int i;
+    assert(src1==src2);
+    for (i=0; i<width; i++)
+    {
         int d0= ((uint32_t*)src1)[i];
 
         int dl= (d0&0x03E07C1F);
@@ -2114,6 +2176,21 @@
     assert(src1==src2);
     for (i=0; i<width; i++)
     {
+        int r=  ((uint32_t*)src1)[i]&0xFF;
+        int g= (((uint32_t*)src1)[i]>>8)&0xFF;
+        int b= (((uint32_t*)src1)[i]>>16)&0xFF;
+
+        dstU[i]= (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT;
+        dstV[i]= (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT;
+    }
+}
+
+static inline void RENAME(rgb32ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
+{
+    int i;
+    assert(src1==src2);
+    for (i=0; i<width; i++)
+    {
         const int a= ((uint32_t*)src1)[2*i+0];
         const int e= ((uint32_t*)src1)[2*i+1];
         const int l= (a&0xFF00FF) + (e&0xFF00FF);
@@ -2163,6 +2240,21 @@
 #endif
 }
 
+static inline void RENAME(rgb24ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
+{
+    int i;
+    assert(src1==src2);
+    for (i=0; i<width; i++)
+    {
+        int r= src1[6*i + 0] + src1[6*i + 0];
+        int g= src1[6*i + 1] + src1[6*i + 1];
+        int b= src1[6*i + 2] + src1[6*i + 2];
+
+        dstU[i]= (RU*r + GU*g + BU*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1);
+        dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1);
+    }
+}
+
 static inline void RENAME(bgr16ToY)(uint8_t *dst, uint8_t *src, long width)
 {
     int i;
@@ -2183,6 +2275,22 @@
     assert(src1 == src2);
     for (i=0; i<width; i++)
     {
+        int d= ((uint16_t*)src1)[i];
+        int r= d&0x1F;
+        int g= (d>>5)&0x3F;
+        int b= (d>>11)&0x1F;
+
+        dstU[i]= (2*RU*r + GU*g + 2*BU*b + (257<<(RGB2YUV_SHIFT-3)))>>(RGB2YUV_SHIFT-2);
+        dstV[i]= (2*RV*r + GV*g + 2*BV*b + (257<<(RGB2YUV_SHIFT-3)))>>(RGB2YUV_SHIFT-2);
+    }
+}
+
+static inline void RENAME(bgr16ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
+{
+    int i;
+    assert(src1 == src2);
+    for (i=0; i<width; i++)
+    {
         int d0= ((uint32_t*)src1)[i];
 
         int dl= (d0&0x07E0F81F);
@@ -2216,6 +2324,22 @@
     assert(src1 == src2);
     for (i=0; i<width; i++)
     {
+        int d= ((uint16_t*)src1)[i];
+        int r= d&0x1F;
+        int g= (d>>5)&0x1F;
+        int b= (d>>10)&0x1F;
+
+        dstU[i]= (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-4)))>>(RGB2YUV_SHIFT-3);
+        dstV[i]= (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-4)))>>(RGB2YUV_SHIFT-3);
+    }
+}
+
+static inline void RENAME(bgr15ToUV_half)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, long width)
+{
+    int i;
+    assert(src1 == src2);
+    for (i=0; i<width; i++)
+    {
         int d0= ((uint32_t*)src1)[i];
 
         int dl= (d0&0x03E07C1F);
@@ -2682,61 +2806,91 @@
     }
     else if (srcFormat==PIX_FMT_RGB32)
     {
-        RENAME(bgr32ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        if(c->chrSrcHSubSample)
+            RENAME(bgr32ToUV_half)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        else
+            RENAME(bgr32ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
         src1= formatConvBuffer;
         src2= formatConvBuffer+VOFW;
     }
     else if (srcFormat==PIX_FMT_RGB32_1)
     {
-        RENAME(bgr32ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1+ALT32_CORR, src2+ALT32_CORR, srcW);
+        if(c->chrSrcHSubSample)
+            RENAME(bgr32ToUV_half)(formatConvBuffer, formatConvBuffer+VOFW, src1+ALT32_CORR, src2+ALT32_CORR, srcW);
+        else
+            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);
+        if(c->chrSrcHSubSample)
+            RENAME(bgr24ToUV_half)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        else
+            RENAME(bgr24ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
         src1= formatConvBuffer;
         src2= formatConvBuffer+VOFW;
     }
     else if (srcFormat==PIX_FMT_BGR565)
     {
-        RENAME(bgr16ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        if(c->chrSrcHSubSample)
+            RENAME(bgr16ToUV_half)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        else
+            RENAME(bgr16ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
         src1= formatConvBuffer;
         src2= formatConvBuffer+VOFW;
     }
     else if (srcFormat==PIX_FMT_BGR555)
     {
-        RENAME(bgr15ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        if(c->chrSrcHSubSample)
+            RENAME(bgr15ToUV_half)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        else
+            RENAME(bgr15ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
         src1= formatConvBuffer;
         src2= formatConvBuffer+VOFW;
     }
     else if (srcFormat==PIX_FMT_BGR32)
     {
-        RENAME(rgb32ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        if(c->chrSrcHSubSample)
+            RENAME(rgb32ToUV_half)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        else
+            RENAME(rgb32ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
         src1= formatConvBuffer;
         src2= formatConvBuffer+VOFW;
     }
     else if (srcFormat==PIX_FMT_BGR32_1)
     {
-        RENAME(rgb32ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1+ALT32_CORR, src2+ALT32_CORR, srcW);
+        if(c->chrSrcHSubSample)
+            RENAME(rgb32ToUV_half)(formatConvBuffer, formatConvBuffer+VOFW, src1+ALT32_CORR, src2+ALT32_CORR, srcW);
+        else
+            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);
+        if(c->chrSrcHSubSample)
+            RENAME(rgb24ToUV_half)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        else
+            RENAME(rgb24ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
         src1= formatConvBuffer;
         src2= formatConvBuffer+VOFW;
     }
     else if (srcFormat==PIX_FMT_RGB565)
     {
-        RENAME(rgb16ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        if(c->chrSrcHSubSample)
+            RENAME(rgb16ToUV_half)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        else
+            RENAME(rgb16ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
         src1= formatConvBuffer;
         src2= formatConvBuffer+VOFW;
     }
     else if (srcFormat==PIX_FMT_RGB555)
     {
-        RENAME(rgb15ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        if(c->chrSrcHSubSample)
+            RENAME(rgb15ToUV_half)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
+        else
+            RENAME(rgb15ToUV)(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW);
         src1= formatConvBuffer;
         src2= formatConvBuffer+VOFW;
     }