[FFmpeg-cvslog] r29145 - in trunk/libswscale: swscale.c swscale_internal.h swscale_template.c
Ramiro Polla
ramiro
Sat Apr 11 17:39:02 CEST 2009
wrote:
> 2009/4/5 ramiro <subversion at mplayerhq.hu>:
>> Author: ramiro
>> Date: Sun Apr 5 00:45:02 2009
>> New Revision: 29145
>>
>> Log:
>> swscale: Use function pointers for swScale functions.
>>
>> Modified:
>> trunk/libswscale/swscale.c
>> trunk/libswscale/swscale_internal.h
>> trunk/libswscale/swscale_template.c
>
> [...]
>
>> Modified: trunk/libswscale/swscale_template.c
>> ==============================================================================
>> --- trunk/libswscale/swscale_template.c Sun Apr 5 00:43:24 2009 (r29144)
>> +++ trunk/libswscale/swscale_template.c Sun Apr 5 00:45:02 2009 (r29145)
>
> [...]
>
>> @@ -2273,91 +2273,16 @@ static inline void RENAME(hyscale)(SwsCo
>> int canMMX2BeUsed = c->canMMX2BeUsed;
>> void *funnyYCode = c->funnyYCode;
>>
>> - if (srcFormat==PIX_FMT_YUYV422 || srcFormat==PIX_FMT_GRAY16BE)
>> - {
>> - RENAME(yuy2ToY)(formatConvBuffer, src, srcW, pal);
>> - src= formatConvBuffer;
>> - }
>> - else if (srcFormat==PIX_FMT_UYVY422 || srcFormat==PIX_FMT_GRAY16LE)
>> - {
>> - RENAME(uyvyToY)(formatConvBuffer, src, srcW, pal);
>> - src= formatConvBuffer;
>> - }
>> - else if (srcFormat==PIX_FMT_RGB32)
>> - {
>> - if (isAlpha)
>> - RENAME(abgrToA)(formatConvBuffer, src+3, srcW, pal);
>> - else
>> - RENAME(bgr32ToY)(formatConvBuffer, src, srcW, pal);
>> - src= formatConvBuffer;
>> - }
>> - else if (srcFormat==PIX_FMT_RGB32_1)
>> - {
>> - if (isAlpha)
>> - RENAME(abgrToA)(formatConvBuffer, src, srcW, pal);
>> - else
>> - RENAME(bgr32ToY)(formatConvBuffer, src+ALT32_CORR, srcW, pal);
>> - src= formatConvBuffer;
>> - }
>> - else if (srcFormat==PIX_FMT_BGR24)
>> - {
>> - RENAME(bgr24ToY)(formatConvBuffer, src, srcW, pal);
>> - src= formatConvBuffer;
>> - }
>> - else if (srcFormat==PIX_FMT_BGR565)
>> - {
>> - RENAME(bgr16ToY)(formatConvBuffer, src, srcW, pal);
>> - src= formatConvBuffer;
>> - }
>> - else if (srcFormat==PIX_FMT_BGR555)
>> - {
>> - RENAME(bgr15ToY)(formatConvBuffer, src, srcW, pal);
>> - src= formatConvBuffer;
>> - }
>> - else if (srcFormat==PIX_FMT_BGR32)
>> - {
>> - if (isAlpha)
>> - RENAME(abgrToA)(formatConvBuffer, src+3, srcW, pal);
>> - else
>> - RENAME(rgb32ToY)(formatConvBuffer, src, srcW, pal);
>> - src= formatConvBuffer;
>> - }
>> - else if (srcFormat==PIX_FMT_BGR32_1)
>> - {
>> - if (isAlpha)
>> - RENAME(abgrToA)(formatConvBuffer, src, srcW, pal);
>> - else
>> - RENAME(rgb32ToY)(formatConvBuffer, src+ALT32_CORR, srcW, pal);
>> - src= formatConvBuffer;
>> - }
>> - else if (srcFormat==PIX_FMT_RGB24)
>> - {
>> - RENAME(rgb24ToY)(formatConvBuffer, src, srcW, pal);
>> - src= formatConvBuffer;
>> - }
>> - else if (srcFormat==PIX_FMT_RGB565)
>> - {
>> - RENAME(rgb16ToY)(formatConvBuffer, src, srcW, pal);
>> - src= formatConvBuffer;
>> - }
>> - else if (srcFormat==PIX_FMT_RGB555)
>> - {
>> - RENAME(rgb15ToY)(formatConvBuffer, src, srcW, pal);
>> - src= formatConvBuffer;
>> - }
>> - else if (srcFormat==PIX_FMT_RGB8 || srcFormat==PIX_FMT_BGR8 || srcFormat==PIX_FMT_PAL8 || srcFormat==PIX_FMT_BGR4_BYTE || srcFormat==PIX_FMT_RGB4_BYTE)
>> - {
>> - RENAME(palToY)(formatConvBuffer, src, srcW, pal);
>> - src= formatConvBuffer;
>> - }
>> - else if (srcFormat==PIX_FMT_MONOBLACK)
>> - {
>> - RENAME(monoblack2Y)(formatConvBuffer, src, srcW, pal);
>> - src= formatConvBuffer;
>> + if (isAlpha) {
>> + if (srcFormat == PIX_FMT_RGB32 || srcFormat == PIX_FMT_BGR32 )
>> + src += 3;
>> + } else {
>> + if (srcFormat == PIX_FMT_RGB32_1 || srcFormat == PIX_FMT_BGR32_1)
>> + src += ALT32_CORR;
>> }
>> - else if (srcFormat==PIX_FMT_MONOWHITE)
>> - {
>> - RENAME(monowhite2Y)(formatConvBuffer, src, srcW, pal);
>> +
>> + if (c->hyscale_internal) {
>> + c->hyscale_internal(formatConvBuffer, src, srcW, pal);
>> src= formatConvBuffer;
>> }
>>
>
> [...]
>
>> @@ -3232,3 +3058,94 @@ static int RENAME(swScale)(SwsContext *c
>>
>> return dstY - lastDstY;
>> }
>> +
>> +static void RENAME(sws_init_swScale)(SwsContext *c)
>> +{
>> + enum PixelFormat srcFormat = c->srcFormat;
>> +
>> + c->yuv2nv12X = RENAME(yuv2nv12X );
>> + c->yuv2yuv1 = RENAME(yuv2yuv1 );
>> + c->yuv2yuvX = RENAME(yuv2yuvX );
>> + c->yuv2packed1 = RENAME(yuv2packed1 );
>> + c->yuv2packed2 = RENAME(yuv2packed2 );
>> + c->yuv2packedX = RENAME(yuv2packedX );
>> +
>> + c->hScale = RENAME(hScale );
>> +
>> + c->hyscale_fast = RENAME(hyscale_fast);
>> + c->hcscale_fast = RENAME(hcscale_fast);
>> +
>> + c->hcscale_internal = NULL;
>> + switch(srcFormat) {
>> + case PIX_FMT_YUYV422 : c->hcscale_internal = RENAME(yuy2ToUV); break;
>> + case PIX_FMT_UYVY422 : c->hcscale_internal = RENAME(uyvyToUV); break;
>> + case PIX_FMT_RGB8 :
>> + case PIX_FMT_BGR8 :
>> + case PIX_FMT_PAL8 :
>> + case PIX_FMT_BGR4_BYTE:
>> + case PIX_FMT_RGB4_BYTE: c->hcscale_internal = RENAME(palToUV); break;
>> + }
>> + if (c->chrSrcHSubSample) {
>> + switch(srcFormat) {
>> + case PIX_FMT_RGB32 :
>> + case PIX_FMT_RGB32_1: c->hcscale_internal = RENAME(bgr32ToUV_half); break;
>> + case PIX_FMT_BGR24 : c->hcscale_internal = RENAME(bgr24ToUV_half); break;
>> + case PIX_FMT_BGR565 : c->hcscale_internal = RENAME(bgr16ToUV_half); break;
>> + case PIX_FMT_BGR555 : c->hcscale_internal = RENAME(bgr15ToUV_half); break;
>> + case PIX_FMT_BGR32 :
>> + case PIX_FMT_BGR32_1: c->hcscale_internal = RENAME(rgb32ToUV_half); break;
>> + case PIX_FMT_RGB24 : c->hcscale_internal = RENAME(rgb24ToUV_half); break;
>> + case PIX_FMT_RGB565 : c->hcscale_internal = RENAME(rgb16ToUV_half); break;
>> + case PIX_FMT_RGB555 : c->hcscale_internal = RENAME(rgb15ToUV_half); break;
>> + }
>> + } else {
>> + switch(srcFormat) {
>> + case PIX_FMT_RGB32 :
>> + case PIX_FMT_RGB32_1: c->hcscale_internal = RENAME(bgr32ToUV); break;
>> + case PIX_FMT_BGR24 : c->hcscale_internal = RENAME(bgr24ToUV); break;
>> + case PIX_FMT_BGR565 : c->hcscale_internal = RENAME(bgr16ToUV); break;
>> + case PIX_FMT_BGR555 : c->hcscale_internal = RENAME(bgr15ToUV); break;
>> + case PIX_FMT_BGR32 :
>> + case PIX_FMT_BGR32_1: c->hcscale_internal = RENAME(rgb32ToUV); break;
>> + case PIX_FMT_RGB24 : c->hcscale_internal = RENAME(rgb24ToUV); break;
>> + case PIX_FMT_RGB565 : c->hcscale_internal = RENAME(rgb16ToUV); break;
>> + case PIX_FMT_RGB555 : c->hcscale_internal = RENAME(rgb15ToUV); break;
>> + }
>> + }
>> +
>> + c->hyscale_internal = NULL;
>> + switch (srcFormat) {
>> + case PIX_FMT_YUYV422 :
>> + case PIX_FMT_GRAY16BE : c->hyscale_internal = RENAME(yuy2ToY); break;
>> + case PIX_FMT_UYVY422 :
>> + case PIX_FMT_GRAY16LE : c->hyscale_internal = RENAME(uyvyToY); break;
>> + case PIX_FMT_BGR24 : c->hyscale_internal = RENAME(bgr24ToY); break;
>> + case PIX_FMT_BGR565 : c->hyscale_internal = RENAME(bgr16ToY); break;
>> + case PIX_FMT_BGR555 : c->hyscale_internal = RENAME(bgr15ToY); break;
>> + case PIX_FMT_RGB24 : c->hyscale_internal = RENAME(rgb24ToY); break;
>> + case PIX_FMT_RGB565 : c->hyscale_internal = RENAME(rgb16ToY); break;
>> + case PIX_FMT_RGB555 : c->hyscale_internal = RENAME(rgb15ToY); break;
>> + case PIX_FMT_RGB8 :
>> + case PIX_FMT_BGR8 :
>> + case PIX_FMT_PAL8 :
>> + case PIX_FMT_BGR4_BYTE:
>> + case PIX_FMT_RGB4_BYTE: c->hyscale_internal = RENAME(palToY); break;
>> + case PIX_FMT_MONOBLACK: c->hyscale_internal = RENAME(monoblack2Y); break;
>> + case PIX_FMT_MONOWHITE: c->hyscale_internal = RENAME(monowhite2Y); break;
>> + }
>> + if (c->alpPixBuf) {
>> + switch (srcFormat) {
>> + case PIX_FMT_RGB32 :
>> + case PIX_FMT_RGB32_1:
>> + case PIX_FMT_BGR32 :
>> + case PIX_FMT_BGR32_1: c->hyscale_internal = RENAME(abgrToA); break;
>> + }
>> + } else {
>> + switch (srcFormat) {
>> + case PIX_FMT_RGB32 :
>> + case PIX_FMT_RGB32_1: c->hyscale_internal = RENAME(bgr32ToY); break;
>> + case PIX_FMT_BGR32 :
>> + case PIX_FMT_BGR32_1: c->hyscale_internal = RENAME(rgb32ToY); break;
>> + }
>> + }
>> +}
>
> This breaks RGB32 (et al.) scaling by using abgrToA for both luma and
> alpha channels (isAlpha=0 and isAlpha=1 in hyscale)
>
> Attached patch fixes it
Sorry for breaking and thanks for the patch. I suppose this is not
covered by make test, right? Would it be possible to add a test in the
regressions, or at least tell us how to test it properly?
[...]
> Index: ffmpeg/libswscale/swscale_template.c
> ===================================================================
> --- ffmpeg.orig/libswscale/swscale_template.c 2009-04-11 10:20:05.451743306 +0200
> +++ ffmpeg/libswscale/swscale_template.c 2009-04-11 10:20:41.923778160 +0200
> @@ -2276,15 +2276,18 @@ static inline void RENAME(hyscale)(SwsCo
> if (isAlpha) {
> if (srcFormat == PIX_FMT_RGB32 || srcFormat == PIX_FMT_BGR32 )
> src += 3;
> + if (c->hascale_internal) {
> + c->hascale_internal(formatConvBuffer, src, srcW, pal);
> + src= formatConvBuffer;
> + }
> } else {
> if (srcFormat == PIX_FMT_RGB32_1 || srcFormat == PIX_FMT_BGR32_1)
> src += ALT32_CORR;
> - }
> -
> if (c->hyscale_internal) {
> c->hyscale_internal(formatConvBuffer, src, srcW, pal);
> src= formatConvBuffer;
> }
> + }
Is there no clean way to avoid duplicating if(c->foo){c->foo();src=bar} ?
[...]
Ramiro Polla
More information about the ffmpeg-cvslog
mailing list