From 4bb3fa5e4f4ac7a95ac89faf7991c291567af625 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 8 Feb 2002 04:18:01 +0000 Subject: [PATCH] unscaled BGR15->BGR16 a few bugfixes of the other unscaled converters Originally committed as revision 4582 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc --- postproc/swscale.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/postproc/swscale.c b/postproc/swscale.c index 12cfa46ffd..8152aeace3 100644 --- a/postproc/swscale.c +++ b/postproc/swscale.c @@ -27,12 +27,14 @@ YUY2/BGR15/BGR16/BGR24/BGR32/RGB24/RGB32 -> same format BGR24 -> BGR32 & RGB24 -> RGB32 BGR32 -> BGR24 & RGB32 -> RGB24 + BGR15 -> BGR16 */ /* tested special converters YV12/I420 -> BGR16 YV12 -> YV12 + BGR15 -> BGR16 untested special converters YV12/I420/IYUV -> BGR15/BGR24/BGR32 (its the yuv2rgb stuff, so it should be ok) @@ -1153,7 +1155,7 @@ static void bgr24to32Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int int srcSliceH, uint8_t* dst[], int dstStride[]){ if(dstStride[0]*3==srcStride[0]*4) - rgb24to32(src[0], dst[0] + dstStride[0]*srcSliceY, srcSliceH*dstStride[0]>>2); + rgb24to32(src[0], dst[0] + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]); else { int i; @@ -1162,7 +1164,7 @@ static void bgr24to32Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int for(i=0; isrcW); + rgb24to32(srcPtr, dstPtr, c->srcW*3); srcPtr+= srcStride[0]; dstPtr+= dstStride[0]; } @@ -1173,7 +1175,7 @@ static void bgr32to24Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int int srcSliceH, uint8_t* dst[], int dstStride[]){ if(dstStride[0]*4==srcStride[0]*3) - rgb32to24(src[0], dst[0] + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]>>2); + rgb32to24(src[0], dst[0] + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]); else { int i; @@ -1182,7 +1184,27 @@ static void bgr32to24Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int for(i=0; isrcW); + rgb32to24(srcPtr, dstPtr, c->srcW<<2); + srcPtr+= srcStride[0]; + dstPtr+= dstStride[0]; + } + } +} + +static void bgr15to16Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dst[], int dstStride[]){ + + if(dstStride[0]==srcStride[0]) + rgb15to16(src[0], 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; isrcW<<1); srcPtr+= srcStride[0]; dstPtr+= dstStride[0]; } @@ -1400,6 +1422,17 @@ SwsContext *getSwsContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, vo_format_name(srcFormat), vo_format_name(dstFormat)); return c; } + + /* bgr15to16 */ + if(srcFormat==IMGFMT_BGR15 && dstFormat==IMGFMT_BGR16) + { + c->swScale= bgr15to16Wrapper; + + if(flags&SWS_PRINT_INFO) + printf("SwScaler: using unscaled %s -> %s special converter\n", + vo_format_name(srcFormat), vo_format_name(dstFormat)); + return c; + } } if(cpuCaps.hasMMX2)