# HG changeset patch # User kostya # Date 1161666153 0 # Node ID 208c6a5b8665d82e027361ade8563473f77e25cc # Parent a9b4fa12f33fcebca0e8bcc28ec8fc986bf230b1 16-bit grayscale support diff -r a9b4fa12f33f -r 208c6a5b8665 libswscale/swscale.c --- 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; isrcW; + 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; isrcW; + 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; iswScale= 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", diff -r a9b4fa12f33f -r 208c6a5b8665 libswscale/swscale_internal.h --- 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: diff -r a9b4fa12f33f -r 208c6a5b8665 libswscale/swscale_template.c --- 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;