From cca81e7eb0e9e88fe652334038cc17a4cb92f78b Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sat, 8 Oct 2011 23:07:05 +0200 Subject: [PATCH] sws: gbr24p input support Signed-off-by: Michael Niedermayer --- libswscale/swscale.c | 46 +++++++++++++++++++++++++++++++++++ libswscale/swscale_internal.h | 10 +++++++- libswscale/swscale_unscaled.c | 2 +- libswscale/utils.c | 1 + 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/libswscale/swscale.c b/libswscale/swscale.c index b81503f6a8..31346a3521 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -1769,6 +1769,49 @@ rgb16_32_wrapper(PIX_FMT_BGR555BE, bgr15be, 0, 0, 0, 0, 0x001F, 0x03E0, 0x7 rgb16_32_wrapper(PIX_FMT_RGB565BE, rgb16be, 0, 0, 0, 0, 0xF800, 0x07E0, 0x001F, 0, 5, 11, RGB2YUV_SHIFT+8); rgb16_32_wrapper(PIX_FMT_RGB555BE, rgb15be, 0, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, 0, 5, 10, RGB2YUV_SHIFT+7); +static void gbr24pToY_c(uint16_t *dst, const uint8_t *gsrc, const uint8_t *bsrc, const uint8_t *rsrc, + int width, uint32_t *unused) +{ + int i; + for (i = 0; i < width; i++) { + unsigned int g = gsrc[i]; + unsigned int b = bsrc[i]; + unsigned int r = rsrc[i]; + + dst[i] = (RY*r + GY*g + BY*b + (0x801<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6); + } +} + +static void gbr24pToUV_c(uint16_t *dstU, uint16_t *dstV, + const uint8_t *gsrc, const uint8_t *bsrc, const uint8_t *rsrc, + int width, enum PixelFormat origin) +{ + int i; + for (i = 0; i < width; i++) { + unsigned int g = gsrc[i]; + unsigned int b = bsrc[i]; + unsigned int r = rsrc[i]; + + dstU[i] = (RU*r + GU*g + BU*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6); + dstV[i] = (RV*r + GV*g + BV*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6); + } +} + +static void gbr24pToUV_half_c(uint16_t *dstU, uint16_t *dstV, + const uint8_t *gsrc, const uint8_t *bsrc, const uint8_t *rsrc, + int width, enum PixelFormat origin) +{ + int i; + for (i = 0; i < width; i++) { + unsigned int g = gsrc[2*i] + gsrc[2*i+1]; + unsigned int b = bsrc[2*i] + bsrc[2*i+1]; + unsigned int r = rsrc[2*i] + rsrc[2*i+1]; + + dstU[i] = (RU*r + GU*g + BU*b + (0x4001<<(RGB2YUV_SHIFT-6))) >> (RGB2YUV_SHIFT-6+1); + dstV[i] = (RV*r + GV*g + BV*b + (0x4001<<(RGB2YUV_SHIFT-6))) >> (RGB2YUV_SHIFT-6+1); + } +} + static void abgrToA_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused) { int i; @@ -2838,6 +2881,7 @@ static av_cold void sws_init_swScale_c(SwsContext *c) case PIX_FMT_RGB565BE: c->chrToYV12 = rgb16beToUV_half_c; break; case PIX_FMT_RGB555LE: c->chrToYV12 = rgb15leToUV_half_c; break; case PIX_FMT_RGB555BE: c->chrToYV12 = rgb15beToUV_half_c; break; + case PIX_FMT_GBR24P : c->chrToYV12 = gbr24pToUV_half_c; break; } } else { switch(srcFormat) { @@ -2859,6 +2903,7 @@ static av_cold void sws_init_swScale_c(SwsContext *c) case PIX_FMT_RGB565BE: c->chrToYV12 = rgb16beToUV_c; break; case PIX_FMT_RGB555LE: c->chrToYV12 = rgb15leToUV_c; break; case PIX_FMT_RGB555BE: c->chrToYV12 = rgb15beToUV_c; break; + case PIX_FMT_GBR24P : c->chrToYV12 = gbr24pToUV_c; break; } } @@ -2914,6 +2959,7 @@ static av_cold void sws_init_swScale_c(SwsContext *c) case PIX_FMT_RGB48LE: c->lumToYV12 = rgb48LEToY_c; break; case PIX_FMT_BGR48BE: c->lumToYV12 = bgr48BEToY_c; break; case PIX_FMT_BGR48LE: c->lumToYV12 = bgr48LEToY_c; break; + case PIX_FMT_GBR24P : c->lumToYV12 = gbr24pToY_c ; break; } if (c->alpPixBuf) { switch (srcFormat) { diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h index 1c9e62a79f..0e62b38bcc 100644 --- a/libswscale/swscale_internal.h +++ b/libswscale/swscale_internal.h @@ -592,6 +592,12 @@ const char *sws_format_name(enum PixelFormat format); || (x)==PIX_FMT_YUV422P16BE \ || (x)==PIX_FMT_YUV444P16BE \ ) + +#define isPlanar(x) ( \ + isPlanarYUV(x) \ + || (x)==PIX_FMT_GBR24P \ + ) + #define isYUV(x) ( \ (x)==PIX_FMT_UYVY422 \ || (x)==PIX_FMT_YUYV422 \ @@ -668,6 +674,7 @@ const char *sws_format_name(enum PixelFormat format); #define isAnyRGB(x) ( \ isRGBinInt(x) \ || isBGRinInt(x) \ + || (x)==PIX_FMT_GBR24P \ ) #define isALPHA(x) ( \ (x)==PIX_FMT_BGRA64BE \ @@ -687,7 +694,8 @@ const char *sws_format_name(enum PixelFormat format); || (x)==PIX_FMT_YUYV422 \ || (x)==PIX_FMT_UYVY422 \ || (x)==PIX_FMT_Y400A \ - || isAnyRGB(x) \ + || isRGBinInt(x) \ + || isBGRinInt(x) \ ) #define usePal(x) ((av_pix_fmt_descriptors[x].flags & PIX_FMT_PAL) || (x) == PIX_FMT_GRAY8A) diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c index f414547b57..e8a92c22e2 100644 --- a/libswscale/swscale_unscaled.c +++ b/libswscale/swscale_unscaled.c @@ -672,7 +672,7 @@ static void reset_ptr(const uint8_t* src[], int format) { if(!isALPHA(format)) src[3]=NULL; - if(!isPlanarYUV(format)) { + if(!isPlanar(format)) { src[3]=src[2]=NULL; if (!usePal(format)) diff --git a/libswscale/utils.c b/libswscale/utils.c index 6fec4b787e..6c2a8de120 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -142,6 +142,7 @@ const static FormatEntry format_entries[PIX_FMT_NB] = { [PIX_FMT_YUV444P9LE] = { 1 , 1 }, [PIX_FMT_YUV444P10BE] = { 1 , 1 }, [PIX_FMT_YUV444P10LE] = { 1 , 1 }, + [PIX_FMT_GBR24P] = { 1 , 0 }, }; int sws_isSupportedInput(enum PixelFormat pix_fmt)