[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