diff options
Diffstat (limited to 'libswscale/swscale_unscaled.c')
-rw-r--r-- | libswscale/swscale_unscaled.c | 42 |
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)) |