On Thu, Jun 09, 2011 at 03:25:41PM -0400, Ronald S. Bultje wrote:
> This is part of the Great Evil Plan to simplify swscale.
> ---
>  libswscale/swscale.c |  174 
> +++++++++++++++++++++++++++++++++-----------------
>  1 files changed, 114 insertions(+), 60 deletions(-)
> 
> diff --git a/libswscale/swscale.c b/libswscale/swscale.c
> index 3659b42..7f54e2e 100644
> --- a/libswscale/swscale.c
> +++ b/libswscale/swscale.c
> @@ -528,6 +528,104 @@ static void name ## ext ## _1_c(SwsContext *c, const 
> uint16_t *buf0, \
>  YUV2PACKEDWRAPPER(yuv2gray16, LE, PIX_FMT_GRAY16LE);
>  YUV2PACKEDWRAPPER(yuv2gray16, BE, PIX_FMT_GRAY16BE);
>  
> +static av_always_inline void
> +yuv2mono_X_c_template(SwsContext *c, const int16_t *lumFilter,
> +                      const int16_t **lumSrc, int lumFilterSize,
> +                      const int16_t *chrFilter, const int16_t **chrUSrc,
> +                      const int16_t **chrVSrc, int chrFilterSize,
> +                      const int16_t **alpSrc, uint8_t *dest, int dstW,
> +                      int y, enum PixelFormat target)
> +{
> +    const uint8_t * const d128=dither_8x8_220[y&7];
> +    uint8_t *g = c->table_gU[128] + c->table_gV[128];
> +    int i;
> +    int acc = 0;
> +
> +#define output_pixel(pos, acc) \
> +    if (target == PIX_FMT_MONOBLACK) { \
> +        pos = acc; \
> +    } else { \
> +        pos = ~acc; \
> +    }
> +    for (i = 0; i < dstW - 1; i += 2) {
> +        int j;
> +        int Y1 = 1 << 18;
> +        int Y2 = 1 << 18;
> +
> +        for (j = 0; j < lumFilterSize; j++) {
> +            Y1 += lumSrc[j][i]   * lumFilter[j];
> +            Y2 += lumSrc[j][i+1] * lumFilter[j];
> +        }
> +        Y1 >>= 19;
> +        Y2 >>= 19;
> +        if ((Y1 | Y2) & 0x100) {
> +            Y1 = av_clip_uint8(Y1);
> +            Y2 = av_clip_uint8(Y2);
> +        }
> +        acc += acc + g[Y1 + d128[(i + 0) & 7]];
> +        acc += acc + g[Y2 + d128[(i + 1) & 7]];
> +        if ((i & 7) == 6) {
> +            output_pixel(*dest++, acc);
> +        }
> +    }
> +}
> +
> +static av_always_inline void
> +yuv2mono_2_c_template(SwsContext *c, const uint16_t *buf0,
> +                      const uint16_t *buf1, const uint16_t *ubuf0,
> +                      const uint16_t *ubuf1, const uint16_t *vbuf0,
> +                      const uint16_t *vbuf1, const uint16_t *abuf0,
> +                      const uint16_t *abuf1, uint8_t *dest, int dstW,
> +                      int yalpha, int uvalpha, int y,
> +                      enum PixelFormat target)
> +{
> +    const uint8_t * const d128 = dither_8x8_220[y & 7];
> +    uint8_t *g = c->table_gU[128] + c->table_gV[128];
> +    int  yalpha1 = 4095 - yalpha;
> +    int i;
> +
> +    for (i = 0; i < dstW - 7; i += 8) {
> +        int acc =    g[((buf0[i    ] * yalpha1 + buf1[i    ] * yalpha) >> 
> 19) + d128[0]];
> +        acc += acc + g[((buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 
> 19) + d128[1]];
> +        acc += acc + g[((buf0[i + 2] * yalpha1 + buf1[i + 2] * yalpha) >> 
> 19) + d128[2]];
> +        acc += acc + g[((buf0[i + 3] * yalpha1 + buf1[i + 3] * yalpha) >> 
> 19) + d128[3]];
> +        acc += acc + g[((buf0[i + 4] * yalpha1 + buf1[i + 4] * yalpha) >> 
> 19) + d128[4]];
> +        acc += acc + g[((buf0[i + 5] * yalpha1 + buf1[i + 5] * yalpha) >> 
> 19) + d128[5]];
> +        acc += acc + g[((buf0[i + 6] * yalpha1 + buf1[i + 6] * yalpha) >> 
> 19) + d128[6]];
> +        acc += acc + g[((buf0[i + 7] * yalpha1 + buf1[i + 7] * yalpha) >> 
> 19) + d128[7]];
> +        output_pixel(*dest++, acc);
> +    }
> +}
> +
> +static av_always_inline void
> +yuv2mono_1_c_template(SwsContext *c, const uint16_t *buf0,
> +                      const uint16_t *ubuf0, const uint16_t *ubuf1,
> +                      const uint16_t *vbuf0, const uint16_t *vbuf1,
> +                      const uint16_t *abuf0, uint8_t *dest, int dstW,
> +                      int uvalpha, enum PixelFormat dstFormat,
> +                      int flags, int y, enum PixelFormat target)
> +{
> +    const uint8_t * const d128 = dither_8x8_220[y & 7];
> +    uint8_t *g = c->table_gU[128] + c->table_gV[128];
> +    int i;
> +
> +    for (i = 0; i < dstW - 7; i += 8) {
> +        int acc =    g[(buf0[i    ] >> 7) + d128[0]];
> +        acc += acc + g[(buf0[i + 1] >> 7) + d128[1]];
> +        acc += acc + g[(buf0[i + 2] >> 7) + d128[2]];
> +        acc += acc + g[(buf0[i + 3] >> 7) + d128[3]];
> +        acc += acc + g[(buf0[i + 4] >> 7) + d128[4]];
> +        acc += acc + g[(buf0[i + 5] >> 7) + d128[5]];
> +        acc += acc + g[(buf0[i + 6] >> 7) + d128[6]];
> +        acc += acc + g[(buf0[i + 7] >> 7) + d128[7]];
> +        output_pixel(*dest++, acc);
> +    }
> +#undef output_pixel
> +}
> +
> +YUV2PACKEDWRAPPER(yuv2mono, white, PIX_FMT_MONOWHITE);
> +YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK);
> +
>  #define YSCALE_YUV_2_PACKEDX_C(type,alpha) \
>      for (i=0; i<(dstW>>1); i++) {\
>          int j;\
> @@ -677,51 +775,7 @@ YUV2PACKEDWRAPPER(yuv2gray16, BE, PIX_FMT_GRAY16BE);
>      g = (type *)(c->table_gU[U] + c->table_gV[V]);\
>      b = (type *)c->table_bU[U];
>  
> -#define YSCALE_YUV_2_MONO2_C \
> -    const uint8_t * const d128=dither_8x8_220[y&7];\
> -    uint8_t *g= c->table_gU[128] + c->table_gV[128];\
> -    for (i=0; i<dstW-7; i+=8) {\
> -        int acc;\
> -        acc =       g[((buf0[i  ]*yalpha1+buf1[i  ]*yalpha)>>19) + d128[0]];\
> -        acc+= acc + g[((buf0[i+1]*yalpha1+buf1[i+1]*yalpha)>>19) + d128[1]];\
> -        acc+= acc + g[((buf0[i+2]*yalpha1+buf1[i+2]*yalpha)>>19) + d128[2]];\
> -        acc+= acc + g[((buf0[i+3]*yalpha1+buf1[i+3]*yalpha)>>19) + d128[3]];\
> -        acc+= acc + g[((buf0[i+4]*yalpha1+buf1[i+4]*yalpha)>>19) + d128[4]];\
> -        acc+= acc + g[((buf0[i+5]*yalpha1+buf1[i+5]*yalpha)>>19) + d128[5]];\
> -        acc+= acc + g[((buf0[i+6]*yalpha1+buf1[i+6]*yalpha)>>19) + d128[6]];\
> -        acc+= acc + g[((buf0[i+7]*yalpha1+buf1[i+7]*yalpha)>>19) + d128[7]];\
> -        ((uint8_t*)dest)[0]= c->dstFormat == PIX_FMT_MONOBLACK ? acc : ~acc;\
> -        dest++;\
> -    }
> -
> -#define YSCALE_YUV_2_MONOX_C \
> -    const uint8_t * const d128=dither_8x8_220[y&7];\
> -    uint8_t *g= c->table_gU[128] + c->table_gV[128];\
> -    int acc=0;\
> -    for (i=0; i<dstW-1; i+=2) {\
> -        int j;\
> -        int Y1=1<<18;\
> -        int Y2=1<<18;\
> -\
> -        for (j=0; j<lumFilterSize; j++) {\
> -            Y1 += lumSrc[j][i] * lumFilter[j];\
> -            Y2 += lumSrc[j][i+1] * lumFilter[j];\
> -        }\
> -        Y1>>=19;\
> -        Y2>>=19;\
> -        if ((Y1|Y2)&0x100) {\
> -            Y1 = av_clip_uint8(Y1); \
> -            Y2 = av_clip_uint8(Y2); \
> -        }\
> -        acc+= acc + g[Y1+d128[(i+0)&7]];\
> -        acc+= acc + g[Y2+d128[(i+1)&7]];\
> -        if ((i&7)==6) {\
> -            ((uint8_t*)dest)[0]= c->dstFormat == PIX_FMT_MONOBLACK ? acc : 
> ~acc;\
> -            dest++;\
> -        }\
> -    }
> -
> -#define YSCALE_YUV_2_ANYRGB_C(func, func2, func_monoblack)\
> +#define YSCALE_YUV_2_ANYRGB_C(func, func2)\
>      switch(c->dstFormat) {\
>      case PIX_FMT_RGB48BE:\
>      case PIX_FMT_RGB48LE:\
> @@ -897,12 +951,6 @@ YUV2PACKEDWRAPPER(yuv2gray16, BE, PIX_FMT_GRAY16BE);
>              }\
>          }\
>          break;\
> -    case PIX_FMT_MONOBLACK:\
> -    case PIX_FMT_MONOWHITE:\
> -        {\
> -            func_monoblack\
> -        }\
> -        break;\
>      case PIX_FMT_YUYV422:\
>          func2\
>              ((uint8_t*)dest)[2*i2+0]= Y1;\
> @@ -928,7 +976,7 @@ static void yuv2packedX_c(SwsContext *c, const int16_t 
> *lumFilter,
>                            const int16_t **alpSrc, uint8_t *dest, int dstW, 
> int y)
>  {
>      int i;
> -    YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGBX_C, 
> YSCALE_YUV_2_PACKEDX_C(void,0), YSCALE_YUV_2_MONOX_C)
> +    YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGBX_C, 
> YSCALE_YUV_2_PACKEDX_C(void,0))
>  }
>  
>  static void yuv2rgbX_c_full(SwsContext *c, const int16_t *lumFilter,
> @@ -1031,7 +1079,7 @@ static void yuv2packed2_c(SwsContext *c, const uint16_t 
> *buf0,
>      int uvalpha1=4095-uvalpha;
>      int i;
>  
> -    YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB2_C, 
> YSCALE_YUV_2_PACKED2_C(void,0), YSCALE_YUV_2_MONO2_C)
> +    YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB2_C, 
> YSCALE_YUV_2_PACKED2_C(void,0))
>  }
>  
>  /**
> @@ -1044,16 +1092,12 @@ static void yuv2packed1_c(SwsContext *c, const 
> uint16_t *buf0,
>                            int uvalpha, enum PixelFormat dstFormat,
>                            int flags, int y)
>  {
> -    const int yalpha1=0;
>      int i;
>  
> -    const uint16_t *buf1= buf0; //FIXME needed for RGB1/BGR1
> -    const int yalpha= 4096; //FIXME ...
> -
>      if (uvalpha < 2048) {
> -        YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1_C, 
> YSCALE_YUV_2_PACKED1_C(void,0), YSCALE_YUV_2_MONO2_C)
> +        YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1_C, 
> YSCALE_YUV_2_PACKED1_C(void,0))
>      } else {
> -        YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1B_C, 
> YSCALE_YUV_2_PACKED1B_C(void,0), YSCALE_YUV_2_MONO2_C)
> +        YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1B_C, 
> YSCALE_YUV_2_PACKED1B_C(void,0))
>      }
>  }
>  
> @@ -1717,7 +1761,17 @@ find_c_packed_planar_out_funcs(SwsContext *c,
>              *yuv2packed2 = yuv2gray16LE_2_c;
>              *yuv2packedX = yuv2gray16LE_X_c;
>              break;
> -        default:
> +        case PIX_FMT_MONOWHITE:
> +            *yuv2packed1 = yuv2monowhite_1_c;
> +            *yuv2packed2 = yuv2monowhite_2_c;
> +            *yuv2packedX = yuv2monowhite_X_c;
> +            break;
> +        case PIX_FMT_MONOBLACK:
> +            *yuv2packed1 = yuv2monoblack_1_c;
> +            *yuv2packed2 = yuv2monoblack_2_c;
> +            *yuv2packedX = yuv2monoblack_X_c;
> +            break;
> +            default:
>              *yuv2packed1 = yuv2packed1_c;
>              *yuv2packed2 = yuv2packed2_c;
>              *yuv2packedX = yuv2packedX_c;

please restore indentation before default: label, otherwise OK
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to