diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-04-04 01:14:45 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-04-04 01:14:45 +0200 |
commit | 41a097aada4d45bddb492bb47d64e67423001775 (patch) | |
tree | 462100064dc3808b56bfcd96804cac15e5a974c9 | |
parent | ae3ee72e02ecbbde53391a25175c7eed66fc9ffd (diff) | |
parent | b991b300f2d60f7726cdc2b15fd12591b89dc972 (diff) | |
download | ffmpeg-41a097aada4d45bddb492bb47d64e67423001775.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
Unscaled Planar RGB -> RGB support in swscale.
Conflicts:
libswscale/swscale_unscaled.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libswscale/swscale_internal.h | 8 | ||||
-rw-r--r-- | libswscale/swscale_unscaled.c | 84 |
2 files changed, 58 insertions, 34 deletions
diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h index e73806ecc2..fb2776c093 100644 --- a/libswscale/swscale_internal.h +++ b/libswscale/swscale_internal.h @@ -681,6 +681,14 @@ const char *sws_format_name(enum PixelFormat format); (av_pix_fmt_descriptors[x].nb_components >= 2 && \ (av_pix_fmt_descriptors[x].flags & PIX_FMT_PLANAR)) +#define isPackedRGB(x) \ + ((av_pix_fmt_descriptors[x].flags & \ + (PIX_FMT_PLANAR | PIX_FMT_RGB)) == PIX_FMT_RGB) + +#define isPlanarRGB(x) \ + ((av_pix_fmt_descriptors[x].flags & \ + (PIX_FMT_PLANAR | PIX_FMT_RGB)) == (PIX_FMT_PLANAR | PIX_FMT_RGB)) + #define usePal(x) ((av_pix_fmt_descriptors[x].flags & PIX_FMT_PAL) || \ (av_pix_fmt_descriptors[x].flags & PIX_FMT_PSEUDOPAL) || \ (x) == PIX_FMT_Y400A) diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c index dd7b04c1eb..754edaf0e8 100644 --- a/libswscale/swscale_unscaled.c +++ b/libswscale/swscale_unscaled.c @@ -412,7 +412,9 @@ static int palToRgbWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], return srcSliceH; } -static void gbr24ptopacked24(const uint8_t* src[], int srcStride[], uint8_t* dst, int dstStride, int srcSliceH, int width) +static void gbr24ptopacked24(const uint8_t *src[], int srcStride[], + uint8_t *dst, int dstStride, int srcSliceH, + int width) { int x, h, i; for (h = 0; h < srcSliceH; h++) { @@ -428,7 +430,9 @@ static void gbr24ptopacked24(const uint8_t* src[], int srcStride[], uint8_t* dst } } -static void gbr24ptopacked32(const uint8_t* src[], int srcStride[], uint8_t* dst, int dstStride, int srcSliceH, int alpha_first, int width) +static void gbr24ptopacked32(const uint8_t *src[], int srcStride[], + uint8_t *dst, int dstStride, int srcSliceH, + int alpha_first, int width) { int x, h, i; for (h = 0; h < srcSliceH; h++) { @@ -455,44 +459,56 @@ static void gbr24ptopacked32(const uint8_t* src[], int srcStride[], uint8_t* dst } } -static int planarRgbToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY, - int srcSliceH, uint8_t* dst[], int dstStride[]) +static int planarRgbToRgbWrapper(SwsContext *c, const uint8_t *src[], + int srcStride[], int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) { int alpha_first = 0; - if (c->srcFormat != PIX_FMT_GBR24P) { + if (c->srcFormat != PIX_FMT_GBRP) { av_log(c, AV_LOG_ERROR, "unsupported planar RGB conversion %s -> %s\n", - av_get_pix_fmt_name(c->srcFormat), av_get_pix_fmt_name(c->dstFormat)); + av_get_pix_fmt_name(c->srcFormat), + av_get_pix_fmt_name(c->dstFormat)); return srcSliceH; } switch (c->dstFormat) { - case PIX_FMT_BGR24: - gbr24ptopacked24((const uint8_t* []) {src[1], src[0], src[2]}, (int []) {srcStride[1], srcStride[0], srcStride[2]}, - dst[0] + srcSliceY * dstStride[0], dstStride[0], srcSliceH, c->srcW); - break; - - case PIX_FMT_RGB24: - gbr24ptopacked24((const uint8_t* []) {src[2], src[0], src[1]}, (int []) {srcStride[2], srcStride[0], srcStride[1]}, - dst[0] + srcSliceY * dstStride[0], dstStride[0], srcSliceH, c->srcW); - break; - - case PIX_FMT_ARGB: - alpha_first = 1; - case PIX_FMT_RGBA: - gbr24ptopacked32((const uint8_t* []) {src[2], src[0], src[1]}, (int []) {srcStride[2], srcStride[0], srcStride[1]}, - dst[0] + srcSliceY * dstStride[0], dstStride[0], srcSliceH, alpha_first, c->srcW); - break; - - case PIX_FMT_ABGR: - alpha_first = 1; - case PIX_FMT_BGRA: - gbr24ptopacked32((const uint8_t* []) {src[1], src[0], src[2]}, (int []) {srcStride[1], srcStride[0], srcStride[2]}, - dst[0] + srcSliceY * dstStride[0], dstStride[0], srcSliceH, alpha_first, c->srcW); - break; - - default: - av_log(c, AV_LOG_ERROR, "unsupported planar RGB conversion %s -> %s\n", - av_get_pix_fmt_name(c->srcFormat), av_get_pix_fmt_name(c->dstFormat)); + case PIX_FMT_BGR24: + gbr24ptopacked24((const uint8_t *[]) { src[1], src[0], src[2] }, + (int []) { srcStride[1], srcStride[0], srcStride[2] }, + dst[0] + srcSliceY * dstStride[0], dstStride[0], + srcSliceH, c->srcW); + break; + + case PIX_FMT_RGB24: + gbr24ptopacked24((const uint8_t *[]) { src[2], src[0], src[1] }, + (int []) { srcStride[2], srcStride[0], srcStride[1] }, + dst[0] + srcSliceY * dstStride[0], dstStride[0], + srcSliceH, c->srcW); + break; + + case PIX_FMT_ARGB: + alpha_first = 1; + case PIX_FMT_RGBA: + gbr24ptopacked32((const uint8_t *[]) { src[2], src[0], src[1] }, + (int []) { srcStride[2], srcStride[0], srcStride[1] }, + dst[0] + srcSliceY * dstStride[0], dstStride[0], + srcSliceH, alpha_first, c->srcW); + break; + + case PIX_FMT_ABGR: + alpha_first = 1; + case PIX_FMT_BGRA: + gbr24ptopacked32((const uint8_t *[]) { src[1], src[0], src[2] }, + (int []) { srcStride[1], srcStride[0], srcStride[2] }, + dst[0] + srcSliceY * dstStride[0], dstStride[0], + srcSliceH, alpha_first, c->srcW); + break; + + default: + av_log(c, AV_LOG_ERROR, + "unsupported planar RGB conversion %s -> %s\n", + av_get_pix_fmt_name(c->srcFormat), + av_get_pix_fmt_name(c->dstFormat)); } return srcSliceH; @@ -897,7 +913,7 @@ void ff_get_unscaled_swscale(SwsContext *c) f == PIX_FMT_BGR24) if (isAnyRGB(srcFormat) && isPlanar(srcFormat) && isByteRGB(dstFormat)) - c->swScale= planarRgbToRgbWrapper; + c->swScale = planarRgbToRgbWrapper; /* bswap 16 bits per pixel/component packed formats */ if (IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, PIX_FMT_BGR444) || |