comparison libswscale/swscale.c @ 32308:ecb8e52d4add

Y400A (gray alpha) input support in libswscale
author bcoudurier
date Mon, 27 Sep 2010 22:24:03 +0000
parents 6a1d3ea9a0c0
children f0247fec1cd7
comparison
equal deleted inserted replaced
32307:7ba2369d71f7 32308:ecb8e52d4add
80 80
81 #define isPacked(x) ( \ 81 #define isPacked(x) ( \
82 (x)==PIX_FMT_PAL8 \ 82 (x)==PIX_FMT_PAL8 \
83 || (x)==PIX_FMT_YUYV422 \ 83 || (x)==PIX_FMT_YUYV422 \
84 || (x)==PIX_FMT_UYVY422 \ 84 || (x)==PIX_FMT_UYVY422 \
85 || (x)==PIX_FMT_Y400A \
85 || isAnyRGB(x) \ 86 || isAnyRGB(x) \
86 ) 87 )
87 88
88 #define RGB2YUV_SHIFT 15 89 #define RGB2YUV_SHIFT 15
89 #define BY ( (int)(0.114*219/255*(1<<RGB2YUV_SHIFT)+0.5)) 90 #define BY ( (int)(0.114*219/255*(1<<RGB2YUV_SHIFT)+0.5))
1433 uyvytoyuv422(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dstStride[1], srcStride[0]); 1434 uyvytoyuv422(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dstStride[1], srcStride[0]);
1434 1435
1435 return srcSliceH; 1436 return srcSliceH;
1436 } 1437 }
1437 1438
1439 static void gray8aToPacked32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
1440 {
1441 long i;
1442 for (i=0; i<num_pixels; i++)
1443 ((uint32_t *) dst)[i] = ((const uint32_t *)palette)[src[i<<1]] | (src[(i<<1)+1] << 24);
1444 }
1445
1446 static void gray8aToPacked32_1(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
1447 {
1448 long i;
1449
1450 for (i=0; i<num_pixels; i++)
1451 ((uint32_t *) dst)[i] = ((const uint32_t *)palette)[src[i<<1]] | src[(i<<1)+1];
1452 }
1453
1454 static void gray8aToPacked24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette)
1455 {
1456 long i;
1457
1458 for (i=0; i<num_pixels; i++) {
1459 //FIXME slow?
1460 dst[0]= palette[src[i<<1]*4+0];
1461 dst[1]= palette[src[i<<1]*4+1];
1462 dst[2]= palette[src[i<<1]*4+2];
1463 dst+= 3;
1464 }
1465 }
1466
1438 static int palToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY, 1467 static int palToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1439 int srcSliceH, uint8_t* dst[], int dstStride[]) 1468 int srcSliceH, uint8_t* dst[], int dstStride[])
1440 { 1469 {
1441 const enum PixelFormat srcFormat= c->srcFormat; 1470 const enum PixelFormat srcFormat= c->srcFormat;
1442 const enum PixelFormat dstFormat= c->dstFormat; 1471 const enum PixelFormat dstFormat= c->dstFormat;
1444 const uint8_t *palette)=NULL; 1473 const uint8_t *palette)=NULL;
1445 int i; 1474 int i;
1446 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; 1475 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY;
1447 const uint8_t *srcPtr= src[0]; 1476 const uint8_t *srcPtr= src[0];
1448 1477
1449 if (usePal(srcFormat)) { 1478 if (srcFormat == PIX_FMT_Y400A) {
1479 switch (dstFormat) {
1480 case PIX_FMT_RGB32 : conv = gray8aToPacked32; break;
1481 case PIX_FMT_BGR32 : conv = gray8aToPacked32; break;
1482 case PIX_FMT_BGR32_1: conv = gray8aToPacked32_1; break;
1483 case PIX_FMT_RGB32_1: conv = gray8aToPacked32_1; break;
1484 case PIX_FMT_RGB24 : conv = gray8aToPacked24; break;
1485 case PIX_FMT_BGR24 : conv = gray8aToPacked24; break;
1486 }
1487 } else if (usePal(srcFormat)) {
1450 switch (dstFormat) { 1488 switch (dstFormat) {
1451 case PIX_FMT_RGB32 : conv = sws_convertPalette8ToPacked32; break; 1489 case PIX_FMT_RGB32 : conv = sws_convertPalette8ToPacked32; break;
1452 case PIX_FMT_BGR32 : conv = sws_convertPalette8ToPacked32; break; 1490 case PIX_FMT_BGR32 : conv = sws_convertPalette8ToPacked32; break;
1453 case PIX_FMT_BGR32_1: conv = sws_convertPalette8ToPacked32; break; 1491 case PIX_FMT_BGR32_1: conv = sws_convertPalette8ToPacked32; break;
1454 case PIX_FMT_RGB32_1: conv = sws_convertPalette8ToPacked32; break; 1492 case PIX_FMT_RGB32_1: conv = sws_convertPalette8ToPacked32; break;
1901 r= (i&7 )*36; 1939 r= (i&7 )*36;
1902 } else if(c->srcFormat == PIX_FMT_RGB4_BYTE) { 1940 } else if(c->srcFormat == PIX_FMT_RGB4_BYTE) {
1903 r= (i>>3 )*255; 1941 r= (i>>3 )*255;
1904 g= ((i>>1)&3)*85; 1942 g= ((i>>1)&3)*85;
1905 b= (i&1 )*255; 1943 b= (i&1 )*255;
1906 } else if(c->srcFormat == PIX_FMT_GRAY8) { 1944 } else if(c->srcFormat == PIX_FMT_GRAY8 || PIX_FMT_Y400A) {
1907 r = g = b = i; 1945 r = g = b = i;
1908 } else { 1946 } else {
1909 assert(c->srcFormat == PIX_FMT_BGR4_BYTE); 1947 assert(c->srcFormat == PIX_FMT_BGR4_BYTE);
1910 b= (i>>3 )*255; 1948 b= (i>>3 )*255;
1911 g= ((i>>1)&3)*85; 1949 g= ((i>>1)&3)*85;