Mercurial > mplayer.hg
changeset 20411:208c6a5b8665
16-bit grayscale support
author | kostya |
---|---|
date | Tue, 24 Oct 2006 05:02:33 +0000 |
parents | a9b4fa12f33f |
children | 9d3701257b4e |
files | libswscale/swscale.c libswscale/swscale_internal.h libswscale/swscale_template.c |
diffstat | 3 files changed, 94 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/libswscale/swscale.c Mon Oct 23 22:19:23 2006 +0000 +++ b/libswscale/swscale.c Tue Oct 24 05:02:33 2006 +0000 @@ -111,11 +111,13 @@ || (x)==PIX_FMT_RGB32|| (x)==PIX_FMT_BGR24|| (x)==PIX_FMT_BGR565|| (x)==PIX_FMT_BGR555\ || (x)==PIX_FMT_BGR32|| (x)==PIX_FMT_RGB24\ || (x)==PIX_FMT_GRAY8 || (x)==PIX_FMT_YUV410P\ + || (x)==PIX_FMT_GRAY16BE || (x)==PIX_FMT_GRAY16LE\ || (x)==PIX_FMT_YUV444P || (x)==PIX_FMT_YUV422P || (x)==PIX_FMT_YUV411P) #define isSupportedOut(x) ((x)==PIX_FMT_YUV420P || (x)==PIX_FMT_YUYV422 || (x)==PIX_FMT_UYVY422\ || (x)==PIX_FMT_YUV444P || (x)==PIX_FMT_YUV422P || (x)==PIX_FMT_YUV411P\ || isRGB(x) || isBGR(x)\ || (x)==PIX_FMT_NV12 || (x)==PIX_FMT_NV21\ + || (x)==PIX_FMT_GRAY16BE || (x)==PIX_FMT_GRAY16LE\ || (x)==PIX_FMT_GRAY8 || (x)==PIX_FMT_YUV410P) #define isPacked(x) ((x)==PIX_FMT_YUYV422 || (x)==PIX_FMT_UYVY422 ||isRGB(x) || isBGR(x)) @@ -231,6 +233,10 @@ return "rgb565"; case PIX_FMT_RGB555: return "rgb555"; + case PIX_FMT_GRAY16BE: + return "gray16be"; + case PIX_FMT_GRAY16LE: + return "gray16le"; case PIX_FMT_GRAY8: return "gray8"; case PIX_FMT_MONOWHITE: @@ -1726,6 +1732,72 @@ return srcSliceH; } +static int gray16togray(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dst[], int dstStride[]){ + + int length= c->srcW; + int y= srcSliceY; + int height= srcSliceH; + int i, j; + uint8_t *srcPtr= src[0]; + uint8_t *dstPtr= dst[0] + dstStride[0]*y; + + if(!isGray(c->dstFormat)){ + int height= -((-srcSliceH)>>c->chrDstVSubSample); + memset(dst[1], 128, dstStride[1]*height); + memset(dst[2], 128, dstStride[2]*height); + } + if(c->srcFormat == PIX_FMT_GRAY16LE) srcPtr++; + for(i=0; i<height; i++) + { + for(j=0; j<length; j++) dstPtr[j] = srcPtr[j<<1]; + srcPtr+= srcStride[0]; + dstPtr+= dstStride[0]; + } + return srcSliceH; +} + +static int graytogray16(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dst[], int dstStride[]){ + + int length= c->srcW; + int y= srcSliceY; + int height= srcSliceH; + int i, j; + uint8_t *srcPtr= src[0]; + uint8_t *dstPtr= dst[0] + dstStride[0]*y; + for(i=0; i<height; i++) + { + for(j=0; j<length; j++) + { + dstPtr[j<<1] = srcPtr[j]; + dstPtr[(j<<1)+1] = srcPtr[j]; + } + srcPtr+= srcStride[0]; + dstPtr+= dstStride[0]; + } + return srcSliceH; +} + +static int gray16swap(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dst[], int dstStride[]){ + + int length= c->srcW; + int y= srcSliceY; + int height= srcSliceH; + int i, j; + uint16_t *srcPtr= src[0]; + uint16_t *dstPtr= dst[0] + dstStride[0]*y/2; + for(i=0; i<height; i++) + { + for(j=0; j<length; j++) dstPtr[j] = bswap_16(srcPtr[j]); + srcPtr+= srcStride[0]/2; + dstPtr+= dstStride[0]/2; + } + return srcSliceH; +} + + static void getSubSampleFactors(int *h, int *v, int format){ switch(format){ case PIX_FMT_UYVY422: @@ -1734,6 +1806,8 @@ *v=0; break; case PIX_FMT_YUV420P: + case PIX_FMT_GRAY16BE: + case PIX_FMT_GRAY16LE: case PIX_FMT_GRAY8: //FIXME remove after different subsamplings are fully implemented case PIX_FMT_NV12: case PIX_FMT_NV21: @@ -2045,6 +2119,20 @@ c->swScale= simpleCopy; } + /* gray16{le,be} conversions */ + if(isGray16(srcFormat) && (isPlanarYUV(dstFormat) || (dstFormat == PIX_FMT_GRAY8))) + { + c->swScale= gray16togray; + } + if((isPlanarYUV(srcFormat) || (srcFormat == PIX_FMT_GRAY8)) && isGray16(dstFormat)) + { + c->swScale= graytogray16; + } + if(srcFormat != dstFormat && isGray16(srcFormat) && isGray16(dstFormat)) + { + c->swScale= gray16swap; + } + if(c->swScale){ if(flags&SWS_PRINT_INFO) MSG_INFO("SwScaler: using unscaled %s -> %s special converter\n",
--- a/libswscale/swscale_internal.h Mon Oct 23 22:19:23 2006 +0000 +++ b/libswscale/swscale_internal.h Tue Oct 24 05:02:33 2006 +0000 @@ -181,7 +181,8 @@ || (x)==PIX_FMT_YUV444P || (x)==PIX_FMT_NV12 \ || (x)==PIX_FMT_NV21) #define isYUV(x) ((x)==PIX_FMT_UYVY422 || (x)==PIX_FMT_YUYV422 || isPlanarYUV(x)) -#define isGray(x) ((x)==PIX_FMT_GRAY8) +#define isGray(x) ((x)==PIX_FMT_GRAY8 || (x)==PIX_FMT_GRAY16BE || (x)==PIX_FMT_GRAY16LE) +#define isGray16(x) ((x)==PIX_FMT_GRAY16BE || (x)==PIX_FMT_GRAY16LE) #define isRGB(x) ((x)==PIX_FMT_BGR32 || (x)==PIX_FMT_RGB24 \ || (x)==PIX_FMT_RGB565 || (x)==PIX_FMT_RGB555 \ || (x)==PIX_FMT_RGB8 || (x)==PIX_FMT_RGB4 \ @@ -204,6 +205,8 @@ return 24; case PIX_FMT_BGR565: case PIX_FMT_RGB565: + case PIX_FMT_GRAY16BE: + case PIX_FMT_GRAY16LE: return 16; case PIX_FMT_BGR555: case PIX_FMT_RGB555:
--- a/libswscale/swscale_template.c Mon Oct 23 22:19:23 2006 +0000 +++ b/libswscale/swscale_template.c Tue Oct 24 05:02:33 2006 +0000 @@ -2437,12 +2437,12 @@ int srcFormat, uint8_t *formatConvBuffer, int16_t *mmx2Filter, int32_t *mmx2FilterPos) { - if(srcFormat==PIX_FMT_YUYV422) + if(srcFormat==PIX_FMT_YUYV422 || srcFormat==PIX_FMT_GRAY16BE) { RENAME(yuy2ToY)(formatConvBuffer, src, srcW); src= formatConvBuffer; } - else if(srcFormat==PIX_FMT_UYVY422) + else if(srcFormat==PIX_FMT_UYVY422 || srcFormat==PIX_FMT_GRAY16LE) { RENAME(uyvyToY)(formatConvBuffer, src, srcW); src= formatConvBuffer;