From df0743e01e9fb88b9eb67815bacc2fe89e313eff Mon Sep 17 00:00:00 2001 From: Baptiste Coudurier Date: Mon, 27 Sep 2010 22:24:03 +0000 Subject: [PATCH] Y400A (gray alpha) input support in libswscale Originally committed as revision 32394 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale --- libswscale/swscale.c | 42 +++++++++++++++++++++++++++++++++-- libswscale/swscale_internal.h | 4 +++- libswscale/swscale_template.c | 5 +++++ libswscale/utils.c | 1 + 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/libswscale/swscale.c b/libswscale/swscale.c index fbfc006a98..aa400f6094 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -82,6 +82,7 @@ untested special converters (x)==PIX_FMT_PAL8 \ || (x)==PIX_FMT_YUYV422 \ || (x)==PIX_FMT_UYVY422 \ + || (x)==PIX_FMT_Y400A \ || isAnyRGB(x) \ ) @@ -1435,6 +1436,34 @@ static int uyvyToYuv422Wrapper(SwsContext *c, const uint8_t* src[], int srcStrid return srcSliceH; } +static void gray8aToPacked32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) +{ + long i; + for (i=0; i>3 )*255; g= ((i>>1)&3)*85; b= (i&1 )*255; - } else if(c->srcFormat == PIX_FMT_GRAY8) { + } else if(c->srcFormat == PIX_FMT_GRAY8 || PIX_FMT_Y400A) { r = g = b = i; } else { assert(c->srcFormat == PIX_FMT_BGR4_BYTE); diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h index d5df2988f3..19dff8f37b 100644 --- a/libswscale/swscale_internal.h +++ b/libswscale/swscale_internal.h @@ -378,6 +378,7 @@ const char *sws_format_name(enum PixelFormat format); ) #define isGray(x) ( \ (x)==PIX_FMT_GRAY8 \ + || (x)==PIX_FMT_Y400A \ || (x)==PIX_FMT_GRAY16BE \ || (x)==PIX_FMT_GRAY16LE \ ) @@ -440,9 +441,10 @@ const char *sws_format_name(enum PixelFormat format); || (x)==PIX_FMT_BGR32_1 \ || (x)==PIX_FMT_RGB32 \ || (x)==PIX_FMT_RGB32_1 \ + || (x)==PIX_FMT_Y400A \ || (x)==PIX_FMT_YUVA420P \ ) -#define usePal(x) (av_pix_fmt_descriptors[x].flags & PIX_FMT_PAL) +#define usePal(x) ((av_pix_fmt_descriptors[x].flags & PIX_FMT_PAL) || (x) == PIX_FMT_Y400A) extern const uint64_t ff_dither4[2]; extern const uint64_t ff_dither8[2]; diff --git a/libswscale/swscale_template.c b/libswscale/swscale_template.c index 42c4a8ba5f..34868ac5cc 100644 --- a/libswscale/swscale_template.c +++ b/libswscale/swscale_template.c @@ -3001,6 +3001,7 @@ static void RENAME(sws_init_swScale)(SwsContext *c) case PIX_FMT_YUV420P16BE: case PIX_FMT_YUV422P16BE: case PIX_FMT_YUV444P16BE: + case PIX_FMT_Y400A : case PIX_FMT_GRAY16BE : c->lumToYV12 = RENAME(yuy2ToY); break; case PIX_FMT_UYVY422 : case PIX_FMT_YUV420P16LE: @@ -3033,10 +3034,14 @@ static void RENAME(sws_init_swScale)(SwsContext *c) case PIX_FMT_RGB32_1: case PIX_FMT_BGR32 : case PIX_FMT_BGR32_1: c->alpToYV12 = abgrToA; break; + case PIX_FMT_Y400A : c->alpToYV12 = RENAME(yuy2ToY); break; } } switch (srcFormat) { + case PIX_FMT_Y400A : + c->alpSrcOffset = 1; + break; case PIX_FMT_RGB32 : case PIX_FMT_BGR32 : c->alpSrcOffset = 3; diff --git a/libswscale/utils.c b/libswscale/utils.c index b52a7937b0..c817a4d997 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -81,6 +81,7 @@ const char *swscale_license(void) || (x)==PIX_FMT_RGB565 \ || (x)==PIX_FMT_RGB555 \ || (x)==PIX_FMT_GRAY8 \ + || (x)==PIX_FMT_Y400A \ || (x)==PIX_FMT_YUV410P \ || (x)==PIX_FMT_YUV440P \ || (x)==PIX_FMT_NV12 \