aboutsummaryrefslogtreecommitdiffstats
path: root/libswscale/swscale_unscaled.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-10-30 17:41:17 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-10-30 17:47:36 +0100
commita201639a01284003a055f195f4e850a0cf3fc2d5 (patch)
tree959d66dc788f6d76941e646bbb49dea93209b231 /libswscale/swscale_unscaled.c
parent788afee86e283535f37fdcb649b2f180ad305f75 (diff)
parent7658295ba353b8bedb3af904f46cfb1ba0cea86a (diff)
downloadffmpeg-a201639a01284003a055f195f4e850a0cf3fc2d5.tar.gz
Merge remote-tracking branch 'qatar/master'
* qatar/master: pixfmt: support more yuva formats swscale: support gray to 9bit and 10bit formats configure: rewrite print_config() function using awk FATE: fix (AD)PCM test dependencies broken in e519990 Use ptrdiff_t instead of int for intra pred "stride" function parameter. x86: use PRED4x4/8x8/8x8L/16x16 macros to declare intrapred prototypes. Conflicts: libavcodec/h264pred.c libavcodec/h264pred_template.c libavutil/pixfmt.h libswscale/swscale_unscaled.c tests/ref/lavfi/pixdesc tests/ref/lavfi/pixfmts_copy tests/ref/lavfi/pixfmts_null tests/ref/lavfi/pixfmts_scale tests/ref/lavfi/pixfmts_vflip Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libswscale/swscale_unscaled.c')
-rw-r--r--libswscale/swscale_unscaled.c42
1 files changed, 39 insertions, 3 deletions
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 0fe974f054..08cc2ed146 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -140,11 +140,11 @@ static void fillPlane(uint8_t *plane, int stride, int width, int height, int y,
}
static void fillPlane16(uint8_t *plane, int stride, int width, int height, int y,
- int alpha, int bits)
+ int alpha, int bits, const int big_endian)
{
int i, j;
uint8_t *ptr = plane + stride * y;
- int v = alpha ? -1 : (1<<bits);
+ int v = alpha ? 0xFFFF>>(15-bits) : (1<<bits);
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
AV_WN16(ptr+2*j, v);
@@ -153,6 +153,27 @@ static void fillPlane16(uint8_t *plane, int stride, int width, int height, int y
}
}
+static void fill_plane9or10(uint8_t *plane, int stride, int width,
+ int height, int y, uint8_t val,
+ const int dst_depth, const int big_endian)
+{
+ int i, j;
+ uint16_t *dst = (uint16_t *) (plane + stride * y);
+#define FILL8TO9_OR_10(wfunc) \
+ for (i = 0; i < height; i++) { \
+ for (j = 0; j < width; j++) { \
+ wfunc(&dst[j], (val << (dst_depth - 8)) | \
+ (val >> (16 - dst_depth))); \
+ } \
+ dst += stride / 2; \
+ }
+ if (big_endian) {
+ FILL8TO9_OR_10(AV_WB16);
+ } else {
+ FILL8TO9_OR_10(AV_WL16);
+ }
+}
+
static void copyPlane(const uint8_t *src, int srcStride,
int srcSliceY, int srcSliceH, int width,
uint8_t *dst, int dstStride)
@@ -780,13 +801,28 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t *src[],
// ignore palette for GRAY8
if (plane == 1 && !dst[2]) continue;
if (!src[plane] || (plane == 1 && !src[2])) {
+#if 1
if (is16BPS(c->dstFormat) || isNBPS(c->dstFormat)) {
fillPlane16(dst[plane], dstStride[plane], length, height, y,
- plane == 3, desc_dst->comp[plane].depth_minus1);
+ plane == 3, desc_dst->comp[plane].depth_minus1,
+ isBE(c->dstFormat));
} else {
fillPlane(dst[plane], dstStride[plane], length, height, y,
(plane == 3) ? 255 : 128);
}
+#else
+ int val = (plane == 3) ? 255 : 128;
+ if (is16BPS(c->dstFormat))
+ length *= 2;
+ if (is9_OR_10BPS(c->dstFormat)) {
+ fill_plane9or10(dst[plane], dstStride[plane],
+ length, height, y, val,
+ desc_dst->comp[plane].depth_minus1 + 1,
+ isBE(c->dstFormat));
+ } else
+ fillPlane(dst[plane], dstStride[plane], length, height, y,
+ val);
+#endif
} else {
if(isNBPS(c->srcFormat) || isNBPS(c->dstFormat)
|| (is16BPS(c->srcFormat) != is16BPS(c->dstFormat))