Browse code

Y400A (gray alpha) input support in libswscale

Originally committed as revision 32394 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale

Baptiste Coudurier authored on 2010/09/28 07:24:03
Showing 4 changed files
... ...
@@ -82,6 +82,7 @@ untested special converters
82 82
            (x)==PIX_FMT_PAL8        \
83 83
         || (x)==PIX_FMT_YUYV422     \
84 84
         || (x)==PIX_FMT_UYVY422     \
85
+        || (x)==PIX_FMT_Y400A       \
85 86
         || isAnyRGB(x)              \
86 87
     )
87 88
 
... ...
@@ -1435,6 +1436,34 @@ static int uyvyToYuv422Wrapper(SwsContext *c, const uint8_t* src[], int srcStrid
1435 1435
     return srcSliceH;
1436 1436
 }
1437 1437
 
1438
+static void gray8aToPacked32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
1439
+{
1440
+    long i;
1441
+    for (i=0; i<num_pixels; i++)
1442
+        ((uint32_t *) dst)[i] = ((const uint32_t *)palette)[src[i<<1]] | (src[(i<<1)+1] << 24);
1443
+}
1444
+
1445
+static void gray8aToPacked32_1(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
1446
+{
1447
+    long i;
1448
+
1449
+    for (i=0; i<num_pixels; i++)
1450
+        ((uint32_t *) dst)[i] = ((const uint32_t *)palette)[src[i<<1]] | src[(i<<1)+1];
1451
+}
1452
+
1453
+static void gray8aToPacked24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
1454
+{
1455
+    long i;
1456
+
1457
+    for (i=0; i<num_pixels; i++) {
1458
+        //FIXME slow?
1459
+        dst[0]= palette[src[i<<1]*4+0];
1460
+        dst[1]= palette[src[i<<1]*4+1];
1461
+        dst[2]= palette[src[i<<1]*4+2];
1462
+        dst+= 3;
1463
+    }
1464
+}
1465
+
1438 1466
 static int palToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1439 1467
                            int srcSliceH, uint8_t* dst[], int dstStride[])
1440 1468
 {
... ...
@@ -1446,7 +1475,16 @@ static int palToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[],
1446 1446
     uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY;
1447 1447
     const uint8_t *srcPtr= src[0];
1448 1448
 
1449
-    if (usePal(srcFormat)) {
1449
+    if (srcFormat == PIX_FMT_Y400A) {
1450
+        switch (dstFormat) {
1451
+        case PIX_FMT_RGB32  : conv = gray8aToPacked32; break;
1452
+        case PIX_FMT_BGR32  : conv = gray8aToPacked32; break;
1453
+        case PIX_FMT_BGR32_1: conv = gray8aToPacked32_1; break;
1454
+        case PIX_FMT_RGB32_1: conv = gray8aToPacked32_1; break;
1455
+        case PIX_FMT_RGB24  : conv = gray8aToPacked24; break;
1456
+        case PIX_FMT_BGR24  : conv = gray8aToPacked24; break;
1457
+        }
1458
+    } else if (usePal(srcFormat)) {
1450 1459
         switch (dstFormat) {
1451 1460
         case PIX_FMT_RGB32  : conv = sws_convertPalette8ToPacked32; break;
1452 1461
         case PIX_FMT_BGR32  : conv = sws_convertPalette8ToPacked32; break;
... ...
@@ -1903,7 +1941,7 @@ int sws_scale(SwsContext *c, const uint8_t* const src[], const int srcStride[],
1903 1903
                 r= (i>>3    )*255;
1904 1904
                 g= ((i>>1)&3)*85;
1905 1905
                 b= (i&1     )*255;
1906
-            } else if(c->srcFormat == PIX_FMT_GRAY8) {
1906
+            } else if(c->srcFormat == PIX_FMT_GRAY8 || PIX_FMT_Y400A) {
1907 1907
                 r = g = b = i;
1908 1908
             } else {
1909 1909
                 assert(c->srcFormat == PIX_FMT_BGR4_BYTE);
... ...
@@ -378,6 +378,7 @@ const char *sws_format_name(enum PixelFormat format);
378 378
     )
379 379
 #define isGray(x)       (           \
380 380
            (x)==PIX_FMT_GRAY8       \
381
+        || (x)==PIX_FMT_Y400A      \
381 382
         || (x)==PIX_FMT_GRAY16BE    \
382 383
         || (x)==PIX_FMT_GRAY16LE    \
383 384
     )
... ...
@@ -440,9 +441,10 @@ const char *sws_format_name(enum PixelFormat format);
440 440
         || (x)==PIX_FMT_BGR32_1     \
441 441
         || (x)==PIX_FMT_RGB32       \
442 442
         || (x)==PIX_FMT_RGB32_1     \
443
+        || (x)==PIX_FMT_Y400A       \
443 444
         || (x)==PIX_FMT_YUVA420P    \
444 445
     )
445
-#define usePal(x) (av_pix_fmt_descriptors[x].flags & PIX_FMT_PAL)
446
+#define usePal(x) ((av_pix_fmt_descriptors[x].flags & PIX_FMT_PAL) || (x) == PIX_FMT_Y400A)
446 447
 
447 448
 extern const uint64_t ff_dither4[2];
448 449
 extern const uint64_t ff_dither8[2];
... ...
@@ -3001,6 +3001,7 @@ static void RENAME(sws_init_swScale)(SwsContext *c)
3001 3001
     case PIX_FMT_YUV420P16BE:
3002 3002
     case PIX_FMT_YUV422P16BE:
3003 3003
     case PIX_FMT_YUV444P16BE:
3004
+    case PIX_FMT_Y400A    :
3004 3005
     case PIX_FMT_GRAY16BE : c->lumToYV12 = RENAME(yuy2ToY); break;
3005 3006
     case PIX_FMT_UYVY422  :
3006 3007
     case PIX_FMT_YUV420P16LE:
... ...
@@ -3033,10 +3034,14 @@ static void RENAME(sws_init_swScale)(SwsContext *c)
3033 3033
         case PIX_FMT_RGB32_1:
3034 3034
         case PIX_FMT_BGR32  :
3035 3035
         case PIX_FMT_BGR32_1: c->alpToYV12 = abgrToA; break;
3036
+        case PIX_FMT_Y400A  : c->alpToYV12 = RENAME(yuy2ToY); break;
3036 3037
         }
3037 3038
     }
3038 3039
 
3039 3040
     switch (srcFormat) {
3041
+    case PIX_FMT_Y400A  :
3042
+        c->alpSrcOffset = 1;
3043
+        break;
3040 3044
     case PIX_FMT_RGB32  :
3041 3045
     case PIX_FMT_BGR32  :
3042 3046
         c->alpSrcOffset = 3;
... ...
@@ -81,6 +81,7 @@ const char *swscale_license(void)
81 81
         || (x)==PIX_FMT_RGB565      \
82 82
         || (x)==PIX_FMT_RGB555      \
83 83
         || (x)==PIX_FMT_GRAY8       \
84
+        || (x)==PIX_FMT_Y400A       \
84 85
         || (x)==PIX_FMT_YUV410P     \
85 86
         || (x)==PIX_FMT_YUV440P     \
86 87
         || (x)==PIX_FMT_NV12        \