Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-04-04 03:14:45 +0400
committerMichael Niedermayer <michaelni@gmx.at>2012-04-04 03:14:45 +0400
commit41a097aada4d45bddb492bb47d64e67423001775 (patch)
tree462100064dc3808b56bfcd96804cac15e5a974c9 /libswscale
parentae3ee72e02ecbbde53391a25175c7eed66fc9ffd (diff)
parentb991b300f2d60f7726cdc2b15fd12591b89dc972 (diff)
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>
Diffstat (limited to 'libswscale')
-rw-r--r--libswscale/swscale_internal.h8
-rw-r--r--libswscale/swscale_unscaled.c84
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) ||