Mercurial > mplayer.hg
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: