aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2011-06-29 09:39:43 -0700
committerRonald S. Bultje <rsbultje@gmail.com>2011-06-29 09:45:52 -0700
commitef1ee362b36893cd1cc1e9c7de378e9cb239b0e8 (patch)
tree22cef8fbcaf058673d151ca32ad157c2445d6d95
parentf68069868bd17a46f2dd80f87b712845f2fcfa56 (diff)
downloadffmpeg-ef1ee362b36893cd1cc1e9c7de378e9cb239b0e8.tar.gz
swscale: implement >8bit scaling support.
This means that precision is retained when scaling between sample formats with >8 bits per component (48bit RGB, 16bit grayscale, 9/10/16bit YUV).
-rw-r--r--libswscale/ppc/swscale_altivec.c4
-rw-r--r--libswscale/swscale.c694
-rw-r--r--libswscale/swscale_internal.h10
-rw-r--r--libswscale/utils.c9
-rw-r--r--libswscale/x86/swscale_template.c73
-rw-r--r--tests/ref/lavfi/pixdesc16
-rw-r--r--tests/ref/lavfi/pixfmts_copy16
-rw-r--r--tests/ref/lavfi/pixfmts_crop16
-rw-r--r--tests/ref/lavfi/pixfmts_hflip16
-rw-r--r--tests/ref/lavfi/pixfmts_null16
-rw-r--r--tests/ref/lavfi/pixfmts_scale32
-rw-r--r--tests/ref/lavfi/pixfmts_vflip16
12 files changed, 545 insertions, 373 deletions
diff --git a/libswscale/ppc/swscale_altivec.c b/libswscale/ppc/swscale_altivec.c
index 396b00ccc6..6fb3de0ee7 100644
--- a/libswscale/ppc/swscale_altivec.c
+++ b/libswscale/ppc/swscale_altivec.c
@@ -406,7 +406,9 @@ void ff_sws_init_swScale_altivec(SwsContext *c)
if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
return;
- c->hScale = hScale_altivec_real;
+ if (c->scalingBpp == 8) {
+ c->hScale = hScale_altivec_real;
+ }
if (!is16BPS(dstFormat) && !is9_OR_10BPS(dstFormat) &&
dstFormat != PIX_FMT_NV12 && dstFormat != PIX_FMT_NV21 &&
!c->alpPixBuf) {
diff --git a/libswscale/swscale.c b/libswscale/swscale.c
index 64ba97e7d4..987afff2d2 100644
--- a/libswscale/swscale.c
+++ b/libswscale/swscale.c
@@ -195,18 +195,18 @@ DECLARE_ALIGNED(8, const uint8_t, dither_8x8_220)[8][8]={
#endif
static av_always_inline void
-yuv2yuvX16_c_template(const int16_t *lumFilter, const int16_t **lumSrc,
+yuv2yuvX16_c_template(const int16_t *lumFilter, const int32_t **lumSrc,
int lumFilterSize, const int16_t *chrFilter,
- const int16_t **chrUSrc, const int16_t **chrVSrc,
- int chrFilterSize, const int16_t **alpSrc,
+ const int32_t **chrUSrc, const int32_t **chrVSrc,
+ int chrFilterSize, const int32_t **alpSrc,
uint16_t *dest[4], int dstW, int chrDstW,
int big_endian, int output_bits)
{
//FIXME Optimize (just quickly written not optimized..)
int i;
- int shift = 11 + 16 - output_bits;
uint16_t *yDest = dest[0], *uDest = dest[1], *vDest = dest[2],
*aDest = CONFIG_SWSCALE_ALPHA ? dest[3] : NULL;
+ int shift = 15 + 16 - output_bits;
#define output_pixel(pos, val) \
if (big_endian) { \
@@ -223,7 +223,7 @@ yuv2yuvX16_c_template(const int16_t *lumFilter, const int16_t **lumSrc,
} \
}
for (i = 0; i < dstW; i++) {
- int val = 1 << (26-output_bits);
+ int val = 1 << (30-output_bits);
int j;
for (j = 0; j < lumFilterSize; j++)
@@ -234,8 +234,8 @@ yuv2yuvX16_c_template(const int16_t *lumFilter, const int16_t **lumSrc,
if (uDest) {
for (i = 0; i < chrDstW; i++) {
- int u = 1 << (26-output_bits);
- int v = 1 << (26-output_bits);
+ int u = 1 << (30-output_bits);
+ int v = 1 << (30-output_bits);
int j;
for (j = 0; j < chrFilterSize; j++) {
@@ -250,7 +250,7 @@ yuv2yuvX16_c_template(const int16_t *lumFilter, const int16_t **lumSrc,
if (CONFIG_SWSCALE_ALPHA && aDest) {
for (i = 0; i < dstW; i++) {
- int val = 1 << (26-output_bits);
+ int val = 1 << (30-output_bits);
int j;
for (j = 0; j < lumFilterSize; j++)
@@ -264,12 +264,16 @@ yuv2yuvX16_c_template(const int16_t *lumFilter, const int16_t **lumSrc,
#define yuv2NBPS(bits, BE_LE, is_be) \
static void yuv2yuvX ## bits ## BE_LE ## _c(SwsContext *c, const int16_t *lumFilter, \
- const int16_t **lumSrc, int lumFilterSize, \
- const int16_t *chrFilter, const int16_t **chrUSrc, \
- const int16_t **chrVSrc, \
- int chrFilterSize, const int16_t **alpSrc, \
+ const int16_t **_lumSrc, int lumFilterSize, \
+ const int16_t *chrFilter, const int16_t **_chrUSrc, \
+ const int16_t **_chrVSrc, \
+ int chrFilterSize, const int16_t **_alpSrc, \
uint8_t *_dest[4], int dstW, int chrDstW) \
{ \
+ const int32_t **lumSrc = (const int32_t **) _lumSrc, \
+ **chrUSrc = (const int32_t **) _chrUSrc, \
+ **chrVSrc = (const int32_t **) _chrVSrc, \
+ **alpSrc = (const int32_t **) _alpSrc; \
yuv2yuvX16_c_template(lumFilter, lumSrc, lumFilterSize, \
chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
alpSrc, (uint16_t **) _dest, \
@@ -418,109 +422,121 @@ static void yuv2nv12X_c(SwsContext *c, const int16_t *lumFilter,
static av_always_inline void
yuv2gray16_X_c_template(SwsContext *c, const int16_t *lumFilter,
- const int16_t **lumSrc, int lumFilterSize,
- const int16_t *chrFilter, const int16_t **chrUSrc,
- const int16_t **chrVSrc, int chrFilterSize,
- const int16_t **alpSrc, uint8_t *dest, int dstW,
+ const int32_t **lumSrc, int lumFilterSize,
+ const int16_t *chrFilter, const int32_t **chrUSrc,
+ const int32_t **chrVSrc, int chrFilterSize,
+ const int32_t **alpSrc, uint16_t *dest, int dstW,
int y, enum PixelFormat target)
{
int i;
for (i = 0; i < (dstW >> 1); i++) {
int j;
- int Y1 = 1 << 18;
- int Y2 = 1 << 18;
- const int i2 = 2 * i;
+ int Y1 = 1 << 14;
+ int Y2 = 1 << 14;
for (j = 0; j < lumFilterSize; j++) {
- Y1 += lumSrc[j][i2] * lumFilter[j];
- Y2 += lumSrc[j][i2+1] * lumFilter[j];
+ Y1 += lumSrc[j][i * 2] * lumFilter[j];
+ Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
}
- Y1 >>= 11;
- Y2 >>= 11;
+ Y1 >>= 15;
+ Y2 >>= 15;
if ((Y1 | Y2) & 0x10000) {
Y1 = av_clip_uint16(Y1);
Y2 = av_clip_uint16(Y2);
}
- output_pixel(&dest[2 * i2 + 0], Y1);
- output_pixel(&dest[2 * i2 + 2], Y2);
+ output_pixel(&dest[i * 2 + 0], Y1);
+ output_pixel(&dest[i * 2 + 1], Y2);
}
}
static av_always_inline void
-yuv2gray16_2_c_template(SwsContext *c, const int16_t *buf[2],
- const int16_t *ubuf[2], const int16_t *vbuf[2],
- const int16_t *abuf[2], uint8_t *dest, int dstW,
+yuv2gray16_2_c_template(SwsContext *c, const int32_t *buf[2],
+ const int32_t *ubuf[2], const int32_t *vbuf[2],
+ const int32_t *abuf[2], uint16_t *dest, int dstW,
int yalpha, int uvalpha, int y,
enum PixelFormat target)
{
int yalpha1 = 4095 - yalpha;
int i;
- const int16_t *buf0 = buf[0], *buf1 = buf[1];
+ const int32_t *buf0 = buf[0], *buf1 = buf[1];
for (i = 0; i < (dstW >> 1); i++) {
- const int i2 = 2 * i;
- int Y1 = (buf0[i2 ] * yalpha1 + buf1[i2 ] * yalpha) >> 11;
- int Y2 = (buf0[i2+1] * yalpha1 + buf1[i2+1] * yalpha) >> 11;
+ int Y1 = (buf0[i * 2 ] * yalpha1 + buf1[i * 2 ] * yalpha) >> 15;
+ int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 15;
- output_pixel(&dest[2 * i2 + 0], Y1);
- output_pixel(&dest[2 * i2 + 2], Y2);
+ output_pixel(&dest[i * 2 + 0], Y1);
+ output_pixel(&dest[i * 2 + 1], Y2);
}
}
static av_always_inline void
-yuv2gray16_1_c_template(SwsContext *c, const int16_t *buf0,
- const int16_t *ubuf[2], const int16_t *vbuf[2],
- const int16_t *abuf0, uint8_t *dest, int dstW,
+yuv2gray16_1_c_template(SwsContext *c, const int32_t *buf0,
+ const int32_t *ubuf[2], const int32_t *vbuf[2],
+ const int32_t *abuf0, uint16_t *dest, int dstW,
int uvalpha, int y, enum PixelFormat target)
{
int i;
for (i = 0; i < (dstW >> 1); i++) {
- const int i2 = 2 * i;
- int Y1 = buf0[i2 ] << 1;
- int Y2 = buf0[i2+1] << 1;
+ int Y1 = buf0[i * 2 ] << 1;
+ int Y2 = buf0[i * 2 + 1] << 1;
- output_pixel(&dest[2 * i2 + 0], Y1);
- output_pixel(&dest[2 * i2 + 2], Y2);
+ output_pixel(&dest[i * 2 + 0], Y1);
+ output_pixel(&dest[i * 2 + 1], Y2);
}
}
#undef output_pixel
-#define YUV2PACKEDWRAPPER(name, base, ext, fmt) \
+#define YUV2PACKED16WRAPPER(name, base, ext, fmt) \
static void name ## ext ## _X_c(SwsContext *c, const int16_t *lumFilter, \
- const int16_t **lumSrc, int lumFilterSize, \
- const int16_t *chrFilter, const int16_t **chrUSrc, \
- const int16_t **chrVSrc, int chrFilterSize, \
- const int16_t **alpSrc, uint8_t *dest, int dstW, \
+ const int16_t **_lumSrc, int lumFilterSize, \
+ const int16_t *chrFilter, const int16_t **_chrUSrc, \
+ const int16_t **_chrVSrc, int chrFilterSize, \
+ const int16_t **_alpSrc, uint8_t *_dest, int dstW, \
int y) \
{ \
+ const int32_t **lumSrc = (const int32_t **) _lumSrc, \
+ **chrUSrc = (const int32_t **) _chrUSrc, \
+ **chrVSrc = (const int32_t **) _chrVSrc, \
+ **alpSrc = (const int32_t **) _alpSrc; \
+ uint16_t *dest = (uint16_t *) _dest; \
name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
alpSrc, dest, dstW, y, fmt); \
} \
\
-static void name ## ext ## _2_c(SwsContext *c, const int16_t *buf[2], \
- const int16_t *ubuf[2], const int16_t *vbuf[2], \
- const int16_t *abuf[2], uint8_t *dest, int dstW, \
+static void name ## ext ## _2_c(SwsContext *c, const int16_t *_buf[2], \
+ const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
+ const int16_t *_abuf[2], uint8_t *_dest, int dstW, \
int yalpha, int uvalpha, int y) \
{ \
+ const int32_t **buf = (const int32_t **) _buf, \
+ **ubuf = (const int32_t **) _ubuf, \
+ **vbuf = (const int32_t **) _vbuf, \
+ **abuf = (const int32_t **) _abuf; \
+ uint16_t *dest = (uint16_t *) _dest; \
name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
dest, dstW, yalpha, uvalpha, y, fmt); \
} \
\
-static void name ## ext ## _1_c(SwsContext *c, const int16_t *buf0, \
- const int16_t *ubuf[2], const int16_t *vbuf[2], \
- const int16_t *abuf0, uint8_t *dest, int dstW, \
+static void name ## ext ## _1_c(SwsContext *c, const int16_t *_buf0, \
+ const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
+ const int16_t *_abuf0, uint8_t *_dest, int dstW, \
int uvalpha, int y) \
{ \
+ const int32_t *buf0 = (const int32_t *) _buf0, \
+ **ubuf = (const int32_t **) _ubuf, \
+ **vbuf = (const int32_t **) _vbuf, \
+ *abuf0 = (const int32_t *) _abuf0; \
+ uint16_t *dest = (uint16_t *) _dest; \
name ## base ## _1_c_template(c, buf0, ubuf, vbuf, abuf0, dest, \
dstW, uvalpha, y, fmt); \
}
-YUV2PACKEDWRAPPER(yuv2gray16,, LE, PIX_FMT_GRAY16LE);
-YUV2PACKEDWRAPPER(yuv2gray16,, BE, PIX_FMT_GRAY16BE);
+YUV2PACKED16WRAPPER(yuv2gray16,, LE, PIX_FMT_GRAY16LE);
+YUV2PACKED16WRAPPER(yuv2gray16,, BE, PIX_FMT_GRAY16BE);
#define output_pixel(pos, acc) \
if (target == PIX_FMT_MONOBLACK) { \
@@ -616,6 +632,38 @@ yuv2mono_1_c_template(SwsContext *c, const int16_t *buf0,
#undef output_pixel
+#define YUV2PACKEDWRAPPER(name, base, ext, fmt) \
+static void name ## ext ## _X_c(SwsContext *c, const int16_t *lumFilter, \
+ const int16_t **lumSrc, int lumFilterSize, \
+ const int16_t *chrFilter, const int16_t **chrUSrc, \
+ const int16_t **chrVSrc, int chrFilterSize, \
+ const int16_t **alpSrc, uint8_t *dest, int dstW, \
+ int y) \
+{ \
+ name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
+ chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
+ alpSrc, dest, dstW, y, fmt); \
+} \
+ \
+static void name ## ext ## _2_c(SwsContext *c, const int16_t *buf[2], \
+ const int16_t *ubuf[2], const int16_t *vbuf[2], \
+ const int16_t *abuf[2], uint8_t *dest, int dstW, \
+ int yalpha, int uvalpha, int y) \
+{ \
+ name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
+ dest, dstW, yalpha, uvalpha, y, fmt); \
+} \
+ \
+static void name ## ext ## _1_c(SwsContext *c, const int16_t *buf0, \
+ const int16_t *ubuf[2], const int16_t *vbuf[2], \
+ const int16_t *abuf0, uint8_t *dest, int dstW, \
+ int uvalpha, int y) \
+{ \
+ name ## base ## _1_c_template(c, buf0, ubuf, vbuf, \
+ abuf0, dest, dstW, uvalpha, \
+ y, fmt); \
+}
+
YUV2PACKEDWRAPPER(yuv2mono,, white, PIX_FMT_MONOWHITE);
YUV2PACKEDWRAPPER(yuv2mono,, black, PIX_FMT_MONOBLACK);
@@ -731,26 +779,32 @@ yuv2422_1_c_template(SwsContext *c, const int16_t *buf0,
YUV2PACKEDWRAPPER(yuv2, 422, yuyv422, PIX_FMT_YUYV422);
YUV2PACKEDWRAPPER(yuv2, 422, uyvy422, PIX_FMT_UYVY422);
-#define r_b ((target == PIX_FMT_RGB48LE || target == PIX_FMT_RGB48BE) ? r : b)
-#define b_r ((target == PIX_FMT_RGB48LE || target == PIX_FMT_RGB48BE) ? b : r)
+#define R_B ((target == PIX_FMT_RGB48LE || target == PIX_FMT_RGB48BE) ? R : B)
+#define B_R ((target == PIX_FMT_RGB48LE || target == PIX_FMT_RGB48BE) ? B : R)
+#define output_pixel(pos, val) \
+ if (isBE(target)) { \
+ AV_WB16(pos, val); \
+ } else { \
+ AV_WL16(pos, val); \
+ }
static av_always_inline void
yuv2rgb48_X_c_template(SwsContext *c, const int16_t *lumFilter,
- const int16_t **lumSrc, int lumFilterSize,
- const int16_t *chrFilter, const int16_t **chrUSrc,
- const int16_t **chrVSrc, int chrFilterSize,
- const int16_t **alpSrc, uint8_t *dest, int dstW,
+ const int32_t **lumSrc, int lumFilterSize,
+ const int16_t *chrFilter, const int32_t **chrUSrc,
+ const int32_t **chrVSrc, int chrFilterSize,
+ const int32_t **alpSrc, uint16_t *dest, int dstW,
int y, enum PixelFormat target)
{
int i;
for (i = 0; i < (dstW >> 1); i++) {
int j;
- int Y1 = 1 << 18;
- int Y2 = 1 << 18;
- int U = 1 << 18;
- int V = 1 << 18;
- const uint8_t *r, *g, *b;
+ int Y1 = 0;
+ int Y2 = 0;
+ int U = -128 << 23; // 19
+ int V = -128 << 23;
+ int R, G, B;
for (j = 0; j < lumFilterSize; j++) {
Y1 += lumSrc[j][i * 2] * lumFilter[j];
@@ -760,40 +814,45 @@ yuv2rgb48_X_c_template(SwsContext *c, const int16_t *lumFilter,
U += chrUSrc[j][i] * chrFilter[j];
V += chrVSrc[j][i] * chrFilter[j];
}
- Y1 >>= 19;
- Y2 >>= 19;
- U >>= 19;
- V >>= 19;
- if ((Y1 | Y2 | U | V) & 0x100) {
- Y1 = av_clip_uint8(Y1);
- Y2 = av_clip_uint8(Y2);
- U = av_clip_uint8(U);
- V = av_clip_uint8(V);
- }
- /* FIXME fix tables so that clipping is not needed and then use _NOCLIP*/
- r = (const uint8_t *) c->table_rV[V];
- g = (const uint8_t *)(c->table_gU[U] + c->table_gV[V]);
- b = (const uint8_t *) c->table_bU[U];
+ // 8bit: 12+15=27; 16-bit: 12+19=31
+ Y1 >>= 14; // 10
+ Y2 >>= 14;
+ U >>= 14;
+ V >>= 14;
+
+ // 8bit: 27 -> 17bit, 16bit: 31 - 14 = 17bit
+ Y1 -= c->yuv2rgb_y_offset;
+ Y2 -= c->yuv2rgb_y_offset;
+ Y1 *= c->yuv2rgb_y_coeff;
+ Y2 *= c->yuv2rgb_y_coeff;
+ Y1 += 1 << 13; // 21
+ Y2 += 1 << 13;
+ // 8bit: 17 + 13bit = 30bit, 16bit: 17 + 13bit = 30bit
+
+ R = V * c->yuv2rgb_v2r_coeff;
+ G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
+ B = U * c->yuv2rgb_u2b_coeff;
- dest[ 0] = dest[ 1] = r_b[Y1];
- dest[ 2] = dest[ 3] = g[Y1];
- dest[ 4] = dest[ 5] = b_r[Y1];
- dest[ 6] = dest[ 7] = r_b[Y2];
- dest[ 8] = dest[ 9] = g[Y2];
- dest[10] = dest[11] = b_r[Y2];
- dest += 12;
+ // 8bit: 30 - 22 = 8bit, 16bit: 30bit - 14 = 16bit
+ output_pixel(&dest[0], av_clip_uintp2(R_B + Y1, 30) >> 14);
+ output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14);
+ output_pixel(&dest[2], av_clip_uintp2(B_R + Y1, 30) >> 14);
+ output_pixel(&dest[3], av_clip_uintp2(R_B + Y2, 30) >> 14);
+ output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14);
+ output_pixel(&dest[5], av_clip_uintp2(B_R + Y2, 30) >> 14);
+ dest += 6;
}
}
static av_always_inline void
-yuv2rgb48_2_c_template(SwsContext *c, const int16_t *buf[2],
- const int16_t *ubuf[2], const int16_t *vbuf[2],
- const int16_t *abuf[2], uint8_t *dest, int dstW,
+yuv2rgb48_2_c_template(SwsContext *c, const int32_t *buf[2],
+ const int32_t *ubuf[2], const int32_t *vbuf[2],
+ const int32_t *abuf[2], uint16_t *dest, int dstW,
int yalpha, int uvalpha, int y,
enum PixelFormat target)
{
- const int16_t *buf0 = buf[0], *buf1 = buf[1],
+ const int32_t *buf0 = buf[0], *buf1 = buf[1],
*ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
*vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
int yalpha1 = 4095 - yalpha;
@@ -801,80 +860,108 @@ yuv2rgb48_2_c_template(SwsContext *c, const int16_t *buf[2],
int i;
for (i = 0; i < (dstW >> 1); i++) {
- int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19;
- int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19;
- int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
- int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
- const uint8_t *r = (const uint8_t *) c->table_rV[V],
- *g = (const uint8_t *)(c->table_gU[U] + c->table_gV[V]),
- *b = (const uint8_t *) c->table_bU[U];
+ int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 14;
+ int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 14;
+ int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha + (-128 << 23)) >> 14;
+ int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha + (-128 << 23)) >> 14;
+ int R, G, B;
- dest[ 0] = dest[ 1] = r_b[Y1];
- dest[ 2] = dest[ 3] = g[Y1];
- dest[ 4] = dest[ 5] = b_r[Y1];
- dest[ 6] = dest[ 7] = r_b[Y2];
- dest[ 8] = dest[ 9] = g[Y2];
- dest[10] = dest[11] = b_r[Y2];
- dest += 12;
+ Y1 -= c->yuv2rgb_y_offset;
+ Y2 -= c->yuv2rgb_y_offset;
+ Y1 *= c->yuv2rgb_y_coeff;
+ Y2 *= c->yuv2rgb_y_coeff;
+ Y1 += 1 << 13;
+ Y2 += 1 << 13;
+
+ R = V * c->yuv2rgb_v2r_coeff;
+ G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
+ B = U * c->yuv2rgb_u2b_coeff;
+
+ output_pixel(&dest[0], av_clip_uintp2(R_B + Y1, 30) >> 14);
+ output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14);
+ output_pixel(&dest[2], av_clip_uintp2(B_R + Y1, 30) >> 14);
+ output_pixel(&dest[3], av_clip_uintp2(R_B + Y2, 30) >> 14);
+ output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14);
+ output_pixel(&dest[5], av_clip_uintp2(B_R + Y2, 30) >> 14);
+ dest += 6;
}
}
static av_always_inline void
-yuv2rgb48_1_c_template(SwsContext *c, const int16_t *buf0,
- const int16_t *ubuf[2], const int16_t *vbuf[2],
- const int16_t *abuf0, uint8_t *dest, int dstW,
+yuv2rgb48_1_c_template(SwsContext *c, const int32_t *buf0,
+ const int32_t *ubuf[2], const int32_t *vbuf[2],
+ const int32_t *abuf0, uint16_t *dest, int dstW,
int uvalpha, int y, enum PixelFormat target)
{
- const int16_t *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
+ const int32_t *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
*vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
int i;
if (uvalpha < 2048) {
for (i = 0; i < (dstW >> 1); i++) {
- int Y1 = buf0[i * 2] >> 7;
- int Y2 = buf0[i * 2 + 1] >> 7;
- int U = ubuf1[i] >> 7;
- int V = vbuf1[i] >> 7;
- const uint8_t *r = (const uint8_t *) c->table_rV[V],
- *g = (const uint8_t *)(c->table_gU[U] + c->table_gV[V]),
- *b = (const uint8_t *) c->table_bU[U];
-
- dest[ 0] = dest[ 1] = r_b[Y1];
- dest[ 2] = dest[ 3] = g[Y1];
- dest[ 4] = dest[ 5] = b_r[Y1];
- dest[ 6] = dest[ 7] = r_b[Y2];
- dest[ 8] = dest[ 9] = g[Y2];
- dest[10] = dest[11] = b_r[Y2];
- dest += 12;
+ int Y1 = (buf0[i * 2] ) >> 2;
+ int Y2 = (buf0[i * 2 + 1]) >> 2;
+ int U = (ubuf0[i] + (-128 << 11)) >> 2;
+ int V = (vbuf0[i] + (-128 << 11)) >> 2;
+ int R, G, B;
+
+ Y1 -= c->yuv2rgb_y_offset;
+ Y2 -= c->yuv2rgb_y_offset;
+ Y1 *= c->yuv2rgb_y_coeff;
+ Y2 *= c->yuv2rgb_y_coeff;
+ Y1 += 1 << 13;
+ Y2 += 1 << 13;
+
+ R = V * c->yuv2rgb_v2r_coeff;
+ G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
+ B = U * c->yuv2rgb_u2b_coeff;
+
+ output_pixel(&dest[0], av_clip_uintp2(R_B + Y1, 30) >> 14);
+ output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14);
+ output_pixel(&dest[2], av_clip_uintp2(B_R + Y1, 30) >> 14);
+ output_pixel(&dest[3], av_clip_uintp2(R_B + Y2, 30) >> 14);
+ output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14);
+ output_pixel(&dest[5], av_clip_uintp2(B_R + Y2, 30) >> 14);
+ dest += 6;
}
} else {
for (i = 0; i < (dstW >> 1); i++) {
- int Y1 = buf0[i * 2] >> 7;
- int Y2 = buf0[i * 2 + 1] >> 7;
- int U = (ubuf0[i] + ubuf1[i]) >> 8;
- int V = (vbuf0[i] + vbuf1[i]) >> 8;
- const uint8_t *r = (const uint8_t *) c->table_rV[V],
- *g = (const uint8_t *)(c->table_gU[U] + c->table_gV[V]),
- *b = (const uint8_t *) c->table_bU[U];
-
- dest[ 0] = dest[ 1] = r_b[Y1];
- dest[ 2] = dest[ 3] = g[Y1];
- dest[ 4] = dest[ 5] = b_r[Y1];
- dest[ 6] = dest[ 7] = r_b[Y2];
- dest[ 8] = dest[ 9] = g[Y2];
- dest[10] = dest[11] = b_r[Y2];
- dest += 12;
+ int Y1 = (buf0[i * 2] ) >> 2;
+ int Y2 = (buf0[i * 2 + 1]) >> 2;
+ int U = (ubuf0[i] + ubuf1[i] + (-128 << 11)) >> 3;
+ int V = (vbuf0[i] + vbuf1[i] + (-128 << 11)) >> 3;
+ int R, G, B;
+
+ Y1 -= c->yuv2rgb_y_offset;
+ Y2 -= c->yuv2rgb_y_offset;
+ Y1 *= c->yuv2rgb_y_coeff;
+ Y2 *= c->yuv2rgb_y_coeff;
+ Y1 += 1 << 13;
+ Y2 += 1 << 13;
+
+ R = V * c->yuv2rgb_v2r_coeff;
+ G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
+ B = U * c->yuv2rgb_u2b_coeff;
+
+ output_pixel(&dest[0], av_clip_uintp2(R_B + Y1, 30) >> 14);
+ output_pixel(&dest[1], av_clip_uintp2( G + Y1, 30) >> 14);
+ output_pixel(&dest[2], av_clip_uintp2(B_R + Y1, 30) >> 14);
+ output_pixel(&dest[3], av_clip_uintp2(R_B + Y2, 30) >> 14);
+ output_pixel(&dest[4], av_clip_uintp2( G + Y2, 30) >> 14);
+ output_pixel(&dest[5], av_clip_uintp2(B_R + Y2, 30) >> 14);
+ dest += 6;
}
}
}
+#undef output_pixel
#undef r_b
#undef b_r
-YUV2PACKEDWRAPPER(yuv2, rgb48, rgb48be, PIX_FMT_RGB48BE);
-//YUV2PACKEDWRAPPER(yuv2, rgb48, rgb48le, PIX_FMT_RGB48LE);
-YUV2PACKEDWRAPPER(yuv2, rgb48, bgr48be, PIX_FMT_BGR48BE);
-//YUV2PACKEDWRAPPER(yuv2, rgb48, bgr48le, PIX_FMT_BGR48LE);
+YUV2PACKED16WRAPPER(yuv2, rgb48, rgb48be, PIX_FMT_RGB48BE);
+YUV2PACKED16WRAPPER(yuv2, rgb48, rgb48le, PIX_FMT_RGB48LE);
+YUV2PACKED16WRAPPER(yuv2, rgb48, bgr48be, PIX_FMT_BGR48BE);
+YUV2PACKED16WRAPPER(yuv2, rgb48, bgr48le, PIX_FMT_BGR48LE);
static av_always_inline void
yuv2rgb_write(uint8_t *_dest, int i, int Y1, int Y2,
@@ -1025,7 +1112,7 @@ yuv2rgb_X_c_template(SwsContext *c, const int16_t *lumFilter,
U = av_clip_uint8(U);
V = av_clip_uint8(V);
}
- if (hasAlpha) {\
+ if (hasAlpha) {
A1 = 1 << 18;
A2 = 1 << 18;
for (j = 0; j < lumFilterSize; j++) {
@@ -1318,50 +1405,50 @@ static av_always_inline void fillPlane(uint8_t* plane, int stride,
#define b ((origin == PIX_FMT_BGR48BE || origin == PIX_FMT_BGR48LE) ? r_b : b_r)
static av_always_inline void
-rgb48ToY_c_template(uint8_t *dst, const uint8_t *src, int width,
+rgb48ToY_c_template(uint16_t *dst, const uint16_t *src, int width,
enum PixelFormat origin)
{
int i;
for (i = 0; i < width; i++) {
- int r_b = input_pixel(&src[i*6+0]) >> 8;
- int g = input_pixel(&src[i*6+2]) >> 8;
- int b_r = input_pixel(&src[i*6+4]) >> 8;
+ unsigned int r_b = input_pixel(&src[i*3+0]);
+ unsigned int g = input_pixel(&src[i*3+1]);
+ unsigned int b_r = input_pixel(&src[i*3+2]);
- dst[i] = (RY*r + GY*g + BY*b + (33<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
+ dst[i] = (RY*r + GY*g + BY*b + (0x2001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
}
}
static av_always_inline void
-rgb48ToUV_c_template(uint8_t *dstU, uint8_t *dstV,
- const uint8_t *src1, const uint8_t *src2,
+rgb48ToUV_c_template(uint16_t *dstU, uint16_t *dstV,
+ const uint16_t *src1, const uint16_t *src2,
int width, enum PixelFormat origin)
{
int i;
assert(src1==src2);
for (i = 0; i < width; i++) {
- int r_b = input_pixel(&src1[i*6+0]) >> 8;
- int g = input_pixel(&src1[i*6+2]) >> 8;
- int b_r = input_pixel(&src1[i*6+4]) >> 8;
+ int r_b = input_pixel(&src1[i*3+0]);
+ int g = input_pixel(&src1[i*3+1]);
+ int b_r = input_pixel(&src1[i*3+2]);
- dstU[i] = (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
- dstV[i] = (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
+ dstU[i] = (RU*r + GU*g + BU*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
+ dstV[i] = (RV*r + GV*g + BV*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
}
}
static av_always_inline void
-rgb48ToUV_half_c_template(uint8_t *dstU, uint8_t *dstV,
- const uint8_t *src1, const uint8_t *src2,
+rgb48ToUV_half_c_template(uint16_t *dstU, uint16_t *dstV,
+ const uint16_t *src1, const uint16_t *src2,
int width, enum PixelFormat origin)
{
int i;
assert(src1==src2);
for (i = 0; i < width; i++) {
- int r_b = (input_pixel(&src1[12*i + 0]) >> 8) + (input_pixel(&src1[12*i + 6]) >> 8);
- int g = (input_pixel(&src1[12*i + 2]) >> 8) + (input_pixel(&src1[12*i + 8]) >> 8);
- int b_r = (input_pixel(&src1[12*i + 4]) >> 8) + (input_pixel(&src1[12*i + 10]) >> 8);
+ int r_b = (input_pixel(&src1[6 * i + 0]) + input_pixel(&src1[6 * i + 3]) + 1) >> 1;
+ int g = (input_pixel(&src1[6 * i + 1]) + input_pixel(&src1[6 * i + 4]) + 1) >> 1;
+ int b_r = (input_pixel(&src1[6 * i + 2]) + input_pixel(&src1[6 * i + 5]) + 1) >> 1;
- dstU[i]= (RU*r + GU*g + BU*b + (257<<RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT+1);
- dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT+1);
+ dstU[i]= (RU*r + GU*g + BU*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
+ dstV[i]= (RV*r + GV*g + BV*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
}
}
@@ -1370,23 +1457,31 @@ rgb48ToUV_half_c_template(uint8_t *dstU, uint8_t *dstV,
#undef input_pixel
#define rgb48funcs(pattern, BE_LE, origin) \
-static void pattern ## 48 ## BE_LE ## ToY_c(uint8_t *dst, const uint8_t *src, \
+static void pattern ## 48 ## BE_LE ## ToY_c(uint8_t *_dst, const uint8_t *_src, \
int width, uint32_t *unused) \
{ \
+ const uint16_t *src = (const uint16_t *) _src; \
+ uint16_t *dst = (uint16_t *) _dst; \
rgb48ToY_c_template(dst, src, width, origin); \
} \
\
-static void pattern ## 48 ## BE_LE ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \
- const uint8_t *src1, const uint8_t *src2, \
+static void pattern ## 48 ## BE_LE ## ToUV_c(uint8_t *_dstU, uint8_t *_dstV, \
+ const uint8_t *_src1, const uint8_t *_src2, \
int width, uint32_t *unused) \
{ \
+ const uint16_t *src1 = (const uint16_t *) _src1, \
+ *src2 = (const uint16_t *) _src2; \
+ uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
rgb48ToUV_c_template(dstU, dstV, src1, src2, width, origin); \
} \
\
-static void pattern ## 48 ## BE_LE ## ToUV_half_c(uint8_t *dstU, uint8_t *dstV, \
- const uint8_t *src1, const uint8_t *src2, \
+static void pattern ## 48 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, \
+ const uint8_t *_src1, const uint8_t *_src2, \
int width, uint32_t *unused) \
{ \
+ const uint16_t *src1 = (const uint16_t *) _src1, \
+ *src2 = (const uint16_t *) _src2; \
+ uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
rgb48ToUV_half_c_template(dstU, dstV, src1, src2, width, origin); \
}
@@ -1601,13 +1696,26 @@ static void yuy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
assert(src1 == src2);
}
-static void LEToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
- const uint8_t *src2, int width, uint32_t *unused)
+static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, int width, uint32_t *unused)
{
int i;
+ const uint16_t *src = (const uint16_t *) _src;
+ uint16_t *dst = (uint16_t *) _dst;
for (i=0; i<width; i++) {
- dstU[i]= src1[2*i + 1];
- dstV[i]= src2[2*i + 1];
+ dst[i] = av_bswap16(src[i]);
+ }
+}
+
+static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *_src1,
+ const uint8_t *_src2, int width, uint32_t *unused)
+{
+ int i;
+ const uint16_t *src1 = (const uint16_t *) _src1,
+ *src2 = (const uint16_t *) _src2;
+ uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV;
+ for (i=0; i<width; i++) {
+ dstU[i] = av_bswap16(src1[i]);
+ dstV[i] = av_bswap16(src2[i]);
}
}
@@ -1632,16 +1740,6 @@ static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
assert(src1 == src2);
}
-static void BEToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
- const uint8_t *src2, int width, uint32_t *unused)
-{
- int i;
- for (i=0; i<width; i++) {
- dstU[i]= src1[2*i];
- dstV[i]= src2[2*i];
- }
-}
-
static av_always_inline void nvXXtoUV_c(uint8_t *dst1, uint8_t *dst2,
const uint8_t *src, int width)
{
@@ -1670,43 +1768,49 @@ static void nv21ToUV_c(uint8_t *dstU, uint8_t *dstV,
// FIXME Maybe dither instead.
static av_always_inline void
-yuv9_OR_10ToUV_c_template(uint8_t *dstU, uint8_t *dstV,
- const uint8_t *_srcU, const uint8_t *_srcV,
+yuv9_OR_10ToUV_c_template(uint16_t *dstU, uint16_t *dstV,
+ const uint16_t *srcU, const uint16_t *srcV,
int width, enum PixelFormat origin, int depth)
{
int i;
- const uint16_t *srcU = (const uint16_t *) _srcU;
- const uint16_t *srcV = (const uint16_t *) _srcV;
for (i = 0; i < width; i++) {
- dstU[i] = input_pixel(&srcU[i]) >> (depth - 8);
- dstV[i] = input_pixel(&srcV[i]) >> (depth - 8);
+ int upx = input_pixel(&srcU[i]);
+ int vpx = input_pixel(&srcV[i]);
+ dstU[i] = (upx << (16 - depth)) | (upx >> (2 * depth - 16));
+ dstV[i] = (vpx << (16 - depth)) | (vpx >> (2 * depth - 16));
}
}
static av_always_inline void
-yuv9_or_10ToY_c_template(uint8_t *dstY, const uint8_t *_srcY,
+yuv9_or_10ToY_c_template(uint16_t *dstY, const uint16_t *srcY,
int width, enum PixelFormat origin, int depth)
{
int i;
- const uint16_t *srcY = (const uint16_t*)_srcY;
- for (i = 0; i < width; i++)
- dstY[i] = input_pixel(&srcY[i]) >> (depth - 8);
+ for (i = 0; i < width; i++) {
+ int px = input_pixel(&srcY[i]);
+ dstY[i] = (px << (16 - depth)) | (px >> (2 * depth - 16));
+ }
}
#undef input_pixel
#define YUV_NBPS(depth, BE_LE, origin) \
-static void BE_LE ## depth ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \
- const uint8_t *srcU, const uint8_t *srcV, \
+static void BE_LE ## depth ## ToUV_c(uint8_t *_dstU, uint8_t *_dstV, \
+ const uint8_t *_srcU, const uint8_t *_srcV, \
int width, uint32_t *unused) \
{ \
+ uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
+ const uint16_t *srcU = (const uint16_t *) _srcU, \
+ *srcV = (const uint16_t *) _srcV; \
yuv9_OR_10ToUV_c_template(dstU, dstV, srcU, srcV, width, origin, depth); \
} \
-static void BE_LE ## depth ## ToY_c(uint8_t *dstY, const uint8_t *srcY, \
+static void BE_LE ## depth ## ToY_c(uint8_t *_dstY, const uint8_t *_srcY, \
int width, uint32_t *unused) \
{ \
+ uint16_t *dstY = (uint16_t *) _dstY; \
+ const uint16_t *srcY = (const uint16_t *) _srcY; \
yuv9_or_10ToY_c_template(dstY, srcY, width, origin, depth); \
}
@@ -1801,6 +1905,27 @@ static void rgb24ToUV_half_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
}
}
+static void hScale16_c(int16_t *_dst, int dstW, const uint8_t *_src,
+ const int16_t *filter,
+ const int16_t *filterPos, int filterSize)
+{
+ int i;
+ int32_t *dst = (int32_t *) _dst;
+ const uint16_t *src = (const uint16_t *) _src;
+
+ for (i = 0; i < dstW; i++) {
+ int j;
+ int srcPos = filterPos[i];
+ unsigned int val = 0;
+
+ for (j = 0; j < filterSize; j++) {
+ val += src[srcPos + j] * filter[filterSize * i + j];
+ }
+ // filter=14 bit, input=16 bit, output=30 bit, >> 11 makes 19 bit
+ dst[i] = FFMIN(val >> 11, (1 << 19) - 1);
+ }
+}
+
// bilinear / bicubic scaling
static void hScale_c(int16_t *dst, int dstW, const uint8_t *src,
const int16_t *filter, const int16_t *filterPos,
@@ -1851,6 +1976,41 @@ static void lumRangeFromJpeg_c(int16_t *dst, int width)
dst[i] = (dst[i]*14071 + 33561947)>>14;
}
+static void chrRangeToJpeg16_c(int16_t *_dstU, int16_t *_dstV, int width)
+{
+ int i;
+ int32_t *dstU = (int32_t *) _dstU;
+ int32_t *dstV = (int32_t *) _dstV;
+ for (i = 0; i < width; i++) {
+ dstU[i] = (FFMIN(dstU[i],30775)*4663 - 9289992)>>12; //-264
+ dstV[i] = (FFMIN(dstV[i],30775)*4663 - 9289992)>>12; //-264
+ }
+}
+static void chrRangeFromJpeg16_c(int16_t *_dstU, int16_t *_dstV, int width)
+{
+ int i;
+ int32_t *dstU = (int32_t *) _dstU;
+ int32_t *dstV = (int32_t *) _dstV;
+ for (i = 0; i < width; i++) {
+ dstU[i] = (dstU[i]*1799 + 4081085)>>11; //1469
+ dstV[i] = (dstV[i]*1799 + 4081085)>>11; //1469
+ }
+}
+static void lumRangeToJpeg16_c(int16_t *_dst, int width)
+{
+ int i;
+ int32_t *dst = (int32_t *) _dst;
+ for (i = 0; i < width; i++)
+ dst[i] = (FFMIN(dst[i],30189)*19077 - 39057361)>>14;
+}
+static void lumRangeFromJpeg16_c(int16_t *_dst, int width)
+{
+ int i;
+ int32_t *dst = (int32_t *) _dst;
+ for (i = 0; i < width; i++)
+ dst[i] = (dst[i]*14071 + 33561947)>>14;
+}
+
static void hyscale_fast_c(SwsContext *c, int16_t *dst, int dstWidth,
const uint8_t *src, int srcW, int xInc)
{
@@ -1864,8 +2024,25 @@ static void hyscale_fast_c(SwsContext *c, int16_t *dst, int dstWidth,
}
}
+static void scale8To16Rv_c(uint16_t *_dst, const uint8_t *src, int len)
+{
+ int i;
+ uint8_t *dst = (uint8_t *) _dst;
+ for (i = len - 1; i >= 0; i--) {
+ dst[i * 2] = dst[i * 2 + 1] = src[i];
+ }
+}
+
+static void scale19To15Fw_c(int16_t *dst, const int32_t *src, int len)
+{
+ int i;
+ for (i = 0; i < len; i++) {
+ dst[i] = src[i] >> 4;
+ }
+}
+
// *** horizontal scale Y line to temp buffer
-static av_always_inline void hyscale(SwsContext *c, uint16_t *dst, int dstWidth,
+static av_always_inline void hyscale(SwsContext *c, int16_t *dst, int dstWidth,
const uint8_t *src, int srcW, int xInc,
const int16_t *hLumFilter,
const int16_t *hLumFilterPos, int hLumFilterSize,
@@ -1880,6 +2057,11 @@ static av_always_inline void hyscale(SwsContext *c, uint16_t *dst, int dstWidth,
src= formatConvBuffer;
}
+ if (av_pix_fmt_descriptors[c->srcFormat].comp[0].depth_minus1 < 8 && c->scalingBpp == 16) {
+ c->scale8To16Rv((uint16_t *) formatConvBuffer, src, srcW);
+ src = formatConvBuffer;
+ }
+
if (!c->hyscale_fast) {
c->hScale(dst, dstWidth, src, hLumFilter, hLumFilterPos, hLumFilterSize);
} else { // fast bilinear upscale / crap downscale
@@ -1888,6 +2070,10 @@ static av_always_inline void hyscale(SwsContext *c, uint16_t *dst, int dstWidth,
if (convertRange)
convertRange(dst, dstWidth);
+
+ if (av_pix_fmt_descriptors[c->dstFormat].comp[0].depth_minus1 < 8 && c->scalingBpp == 16) {
+ c->scale19To15Fw(dst, (int32_t *) dst, dstWidth);
+ }
}
static void hcscale_fast_c(SwsContext *c, int16_t *dst1, int16_t *dst2,
@@ -1905,19 +2091,27 @@ static void hcscale_fast_c(SwsContext *c, int16_t *dst1, int16_t *dst2,
}
}
-static av_always_inline void hcscale(SwsContext *c, uint16_t *dst1, uint16_t *dst2, int dstWidth,
+static av_always_inline void hcscale(SwsContext *c, int16_t *dst1, int16_t *dst2, int dstWidth,
const uint8_t *src1, const uint8_t *src2,
int srcW, int xInc, const int16_t *hChrFilter,
const int16_t *hChrFilterPos, int hChrFilterSize,
uint8_t *formatConvBuffer, uint32_t *pal)
{
if (c->chrToYV12) {
- uint8_t *buf2 = formatConvBuffer + FFALIGN(srcW, 16);
+ uint8_t *buf2 = formatConvBuffer + FFALIGN(srcW * c->scalingBpp >> 3, 16);
c->chrToYV12(formatConvBuffer, buf2, src1, src2, srcW, pal);
src1= formatConvBuffer;
src2= buf2;
}
+ if (av_pix_fmt_descriptors[c->srcFormat].comp[0].depth_minus1 < 8 && c->scalingBpp == 16) {
+ uint8_t *buf2 = (formatConvBuffer + FFALIGN(srcW * 2, 16));
+ c->scale8To16Rv((uint16_t *) formatConvBuffer, src1, srcW);
+ c->scale8To16Rv((uint16_t *) buf2, src2, srcW);
+ src1 = formatConvBuffer;
+ src2 = buf2;
+ }
+
if (!c->hcscale_fast) {
c->hScale(dst1, dstWidth, src1, hChrFilter, hChrFilterPos, hChrFilterSize);
c->hScale(dst2, dstWidth, src2, hChrFilter, hChrFilterPos, hChrFilterSize);
@@ -1927,6 +2121,11 @@ static av_always_inline void hcscale(SwsContext *c, uint16_t *dst1, uint16_t *ds
if (c->chrConvertRange)
c->chrConvertRange(dst1, dst2, dstWidth);
+
+ if (av_pix_fmt_descriptors[c->dstFormat].comp[0].depth_minus1 < 8 && c->scalingBpp == 16) {
+ c->scale19To15Fw(dst1, (int32_t *) dst1, dstWidth);
+ c->scale19To15Fw(dst2, (int32_t *) dst2, dstWidth);
+ }
}
static av_always_inline void
@@ -2049,20 +2248,20 @@ find_c_packed_planar_out_funcs(SwsContext *c,
*yuv2packedX = yuv2uyvy422_X_c;
break;
case PIX_FMT_RGB48LE:
- //*yuv2packed1 = yuv2rgb48le_1_c;
- //*yuv2packed2 = yuv2rgb48le_2_c;
- //*yuv2packedX = yuv2rgb48le_X_c;
- //break;
+ *yuv2packed1 = yuv2rgb48le_1_c;
+ *yuv2packed2 = yuv2rgb48le_2_c;
+ *yuv2packedX = yuv2rgb48le_X_c;
+ break;
case PIX_FMT_RGB48BE:
*yuv2packed1 = yuv2rgb48be_1_c;
*yuv2packed2 = yuv2rgb48be_2_c;
*yuv2packedX = yuv2rgb48be_X_c;
break;
case PIX_FMT_BGR48LE:
- //*yuv2packed1 = yuv2bgr48le_1_c;
- //*yuv2packed2 = yuv2bgr48le_2_c;
- //*yuv2packedX = yuv2bgr48le_X_c;
- //break;
+ *yuv2packed1 = yuv2bgr48le_1_c;
+ *yuv2packed2 = yuv2bgr48le_2_c;
+ *yuv2packedX = yuv2bgr48le_X_c;
+ break;
case PIX_FMT_BGR48BE:
*yuv2packed1 = yuv2bgr48be_1_c;
*yuv2packed2 = yuv2bgr48be_2_c;
@@ -2435,13 +2634,6 @@ static av_cold void sws_init_swScale_c(SwsContext *c)
&c->yuv2packed1, &c->yuv2packed2,
&c->yuv2packedX);
- c->hScale = hScale_c;
-
- if (c->flags & SWS_FAST_BILINEAR) {
- c->hyscale_fast = hyscale_fast_c;
- c->hcscale_fast = hcscale_fast_c;
- }
-
c->chrToYV12 = NULL;
switch(srcFormat) {
case PIX_FMT_YUYV422 : c->chrToYV12 = yuy2ToUV_c; break;
@@ -2453,22 +2645,25 @@ static av_cold void sws_init_swScale_c(SwsContext *c)
case PIX_FMT_PAL8 :
case PIX_FMT_BGR4_BYTE:
case PIX_FMT_RGB4_BYTE: c->chrToYV12 = palToUV_c; break;
- case PIX_FMT_YUV444P9BE:
- case PIX_FMT_YUV420P9BE: c->chrToYV12 = BE9ToUV_c; break;
case PIX_FMT_YUV444P9LE:
- case PIX_FMT_YUV420P9LE: c->chrToYV12 = LE9ToUV_c; break;
- case PIX_FMT_YUV444P10BE:
- case PIX_FMT_YUV422P10BE:
- case PIX_FMT_YUV420P10BE: c->chrToYV12 = BE10ToUV_c; break;
+ case PIX_FMT_YUV420P9LE: c->chrToYV12 = LE9ToUV_c; break;
case PIX_FMT_YUV422P10LE:
case PIX_FMT_YUV444P10LE:
case PIX_FMT_YUV420P10LE: c->chrToYV12 = LE10ToUV_c; break;
- case PIX_FMT_YUV420P16BE:
- case PIX_FMT_YUV422P16BE:
- case PIX_FMT_YUV444P16BE: c->chrToYV12 = BEToUV_c; break;
+ case PIX_FMT_YUV444P9BE:
+ case PIX_FMT_YUV420P9BE: c->chrToYV12 = BE9ToUV_c; break;
+ case PIX_FMT_YUV444P10BE:
+ case PIX_FMT_YUV422P10BE:
+ case PIX_FMT_YUV420P10BE: c->chrToYV12 = BE10ToUV_c; break;
+#if HAVE_BIGENDIAN
case PIX_FMT_YUV420P16LE:
case PIX_FMT_YUV422P16LE:
- case PIX_FMT_YUV444P16LE: c->chrToYV12 = LEToUV_c; break;
+ case PIX_FMT_YUV444P16LE: c->chrToYV12 = bswap16UV_c; break;
+#else
+ case PIX_FMT_YUV420P16BE:
+ case PIX_FMT_YUV422P16BE:
+ case PIX_FMT_YUV444P16BE: c->chrToYV12 = bswap16UV_c; break;
+#endif
}
if (c->chrSrcHSubSample) {
switch(srcFormat) {
@@ -2517,27 +2712,30 @@ static av_cold void sws_init_swScale_c(SwsContext *c)
c->lumToYV12 = NULL;
c->alpToYV12 = NULL;
switch (srcFormat) {
- case PIX_FMT_YUV444P9BE:
- case PIX_FMT_YUV420P9BE: c->lumToYV12 = BE9ToY_c; break;
case PIX_FMT_YUV444P9LE:
- case PIX_FMT_YUV420P9LE: c->lumToYV12 = LE9ToY_c; break;
- case PIX_FMT_YUV444P10BE:
- case PIX_FMT_YUV422P10BE:
- case PIX_FMT_YUV420P10BE: c->lumToYV12 = BE10ToY_c; break;
+ case PIX_FMT_YUV420P9LE: c->lumToYV12 = LE9ToY_c; break;
case PIX_FMT_YUV444P10LE:
case PIX_FMT_YUV422P10LE:
case PIX_FMT_YUV420P10LE: c->lumToYV12 = LE10ToY_c; break;
- case PIX_FMT_YUYV422 :
- case PIX_FMT_YUV420P16BE:
- case PIX_FMT_YUV422P16BE:
- case PIX_FMT_YUV444P16BE:
- case PIX_FMT_Y400A :
- case PIX_FMT_GRAY16BE : c->lumToYV12 = yuy2ToY_c; break;
- case PIX_FMT_UYVY422 :
+ case PIX_FMT_YUV444P9BE:
+ case PIX_FMT_YUV420P9BE: c->lumToYV12 = BE9ToY_c; break;
+ case PIX_FMT_YUV444P10BE:
+ case PIX_FMT_YUV422P10BE:
+ case PIX_FMT_YUV420P10BE: c->lumToYV12 = BE10ToY_c; break;
+#if HAVE_BIGENDIAN
case PIX_FMT_YUV420P16LE:
case PIX_FMT_YUV422P16LE:
case PIX_FMT_YUV444P16LE:
- case PIX_FMT_GRAY16LE : c->lumToYV12 = uyvyToY_c; break;
+ case PIX_FMT_GRAY16LE: c->lumToYV12 = bswap16Y_c; break;
+#else
+ case PIX_FMT_YUV420P16BE:
+ case PIX_FMT_YUV422P16BE:
+ case PIX_FMT_YUV444P16BE:
+ case PIX_FMT_GRAY16BE: c->lumToYV12 = bswap16Y_c; break;
+#endif
+ case PIX_FMT_YUYV422 :
+ case PIX_FMT_Y400A : c->lumToYV12 = yuy2ToY_c; break;
+ case PIX_FMT_UYVY422 : c->lumToYV12 = uyvyToY_c; break;
case PIX_FMT_BGR24 : c->lumToYV12 = bgr24ToY_c; break;
case PIX_FMT_BGR565LE : c->lumToYV12 = bgr16leToY_c; break;
case PIX_FMT_BGR565BE : c->lumToYV12 = bgr16beToY_c; break;
@@ -2574,6 +2772,13 @@ static av_cold void sws_init_swScale_c(SwsContext *c)
}
}
+ if (c->scalingBpp == 8) {
+ c->hScale = hScale_c;
+ if (c->flags & SWS_FAST_BILINEAR) {
+ c->hyscale_fast = hyscale_fast_c;
+ c->hcscale_fast = hcscale_fast_c;
+ }
+
if (c->srcRange != c->dstRange && !isAnyRGB(c->dstFormat)) {
if (c->srcRange) {
c->lumConvertRange = lumRangeFromJpeg_c;
@@ -2583,6 +2788,21 @@ static av_cold void sws_init_swScale_c(SwsContext *c)
c->chrConvertRange = chrRangeToJpeg_c;
}
}
+ } else {
+ c->hScale = hScale16_c;
+ c->scale19To15Fw = scale19To15Fw_c;
+ c->scale8To16Rv = scale8To16Rv_c;
+
+ if (c->srcRange != c->dstRange && !isAnyRGB(c->dstFormat)) {
+ if (c->srcRange) {
+ c->lumConvertRange = lumRangeFromJpeg16_c;
+ c->chrConvertRange = chrRangeFromJpeg16_c;
+ } else {
+ c->lumConvertRange = lumRangeToJpeg16_c;
+ c->chrConvertRange = chrRangeToJpeg16_c;
+ }
+ }
+ }
if (!(isGray(srcFormat) || isGray(c->dstFormat) ||
srcFormat == PIX_FMT_MONOBLACK || srcFormat == PIX_FMT_MONOWHITE))
diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
index c1eed8ac96..cfb19d9c13 100644
--- a/libswscale/swscale_internal.h
+++ b/libswscale/swscale_internal.h
@@ -205,6 +205,7 @@ typedef struct SwsContext {
enum PixelFormat srcFormat; ///< Source pixel format.
int dstFormatBpp; ///< Number of bits per pixel of the destination pixel format.
int srcFormatBpp; ///< Number of bits per pixel of the source pixel format.
+ int scalingBpp;
int chrSrcHSubSample; ///< Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in source image.
int chrSrcVSubSample; ///< Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in source image.
int chrDstHSubSample; ///< Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in destination image.
@@ -446,6 +447,15 @@ typedef struct SwsContext {
void (*lumConvertRange)(int16_t *dst, int width); ///< Color range conversion function for luma plane if needed.
void (*chrConvertRange)(int16_t *dst1, int16_t *dst2, int width); ///< Color range conversion function for chroma planes if needed.
+ /**
+ * dst[..] = (src[..] << 8) | src[..];
+ */
+ void (*scale8To16Rv)(uint16_t *dst, const uint8_t *src, int len);
+ /**
+ * dst[..] = src[..] >> 4;
+ */
+ void (*scale19To15Fw)(int16_t *dst, const int32_t *src, int len);
+
int needs_hcscale; ///< Set if there are chroma planes to be converted.
} SwsContext;
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 69714183d0..b7ccac94ba 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -877,8 +877,13 @@ int sws_init_context(SwsContext *c, SwsFilter *srcFilter, SwsFilter *dstFilter)
}
}
- FF_ALLOC_OR_GOTO(c, c->formatConvBuffer, FFALIGN(srcW, 16) * 2, fail);
- if (HAVE_MMX2 && cpu_flags & AV_CPU_FLAG_MMX2) {
+ // FIXME it's even nicer if bpp isn't 16, but max({src,dst}formatbpp)
+ c->scalingBpp = FFMAX(av_pix_fmt_descriptors[srcFormat].comp[0].depth_minus1,
+ av_pix_fmt_descriptors[dstFormat].comp[0].depth_minus1) >= 8 ? 16 : 8;
+ if (c->scalingBpp == 16)
+ dst_stride <<= 1;
+ FF_ALLOC_OR_GOTO(c, c->formatConvBuffer, FFALIGN(srcW, 16) * 2 * c->scalingBpp >> 3, fail);
+ if (HAVE_MMX2 && cpu_flags & AV_CPU_FLAG_MMX2 && c->scalingBpp == 8) {
c->canMMX2BeUsed= (dstW >=srcW && (dstW&31)==0 && (srcW&15)==0) ? 1 : 0;
if (!c->canMMX2BeUsed && dstW >=srcW && (srcW&15)==0 && (flags&SWS_FAST_BILINEAR)) {
if (flags&SWS_PRINT_INFO)
diff --git a/libswscale/x86/swscale_template.c b/libswscale/x86/swscale_template.c
index de0e4abfe0..54c7edc25e 100644
--- a/libswscale/x86/swscale_template.c
+++ b/libswscale/x86/swscale_template.c
@@ -1625,32 +1625,6 @@ static void RENAME(yuy2ToUV)(uint8_t *dstU, uint8_t *dstV,
assert(src1 == src2);
}
-static void RENAME(LEToUV)(uint8_t *dstU, uint8_t *dstV,
- const uint8_t *src1, const uint8_t *src2,
- int width, uint32_t *unused)
-{
- __asm__ volatile(
- "mov %0, %%"REG_a" \n\t"
- "1: \n\t"
- "movq (%1, %%"REG_a",2), %%mm0 \n\t"
- "movq 8(%1, %%"REG_a",2), %%mm1 \n\t"
- "movq (%2, %%"REG_a",2), %%mm2 \n\t"
- "movq 8(%2, %%"REG_a",2), %%mm3 \n\t"
- "psrlw $8, %%mm0 \n\t"
- "psrlw $8, %%mm1 \n\t"
- "psrlw $8, %%mm2 \n\t"
- "psrlw $8, %%mm3 \n\t"
- "packuswb %%mm1, %%mm0 \n\t"
- "packuswb %%mm3, %%mm2 \n\t"
- "movq %%mm0, (%3, %%"REG_a") \n\t"
- "movq %%mm2, (%4, %%"REG_a") \n\t"
- "add $8, %%"REG_a" \n\t"
- " js 1b \n\t"
- : : "g" ((x86_reg)-width), "r" (src1+width*2), "r" (src2+width*2), "r" (dstU+width), "r" (dstV+width)
- : "%"REG_a
- );
-}
-
/* This is almost identical to the previous, end exists only because
* yuy2ToY/UV)(dst, src+1, ...) would have 100% unaligned accesses. */
static void RENAME(uyvyToY)(uint8_t *dst, const uint8_t *src,
@@ -1700,33 +1674,6 @@ static void RENAME(uyvyToUV)(uint8_t *dstU, uint8_t *dstV,
assert(src1 == src2);
}
-static void RENAME(BEToUV)(uint8_t *dstU, uint8_t *dstV,
- const uint8_t *src1, const uint8_t *src2,
- int width, uint32_t *unused)
-{
- __asm__ volatile(
- "movq "MANGLE(bm01010101)", %%mm4 \n\t"
- "mov %0, %%"REG_a" \n\t"
- "1: \n\t"
- "movq (%1, %%"REG_a",2), %%mm0 \n\t"
- "movq 8(%1, %%"REG_a",2), %%mm1 \n\t"
- "movq (%2, %%"REG_a",2), %%mm2 \n\t"
- "movq 8(%2, %%"REG_a",2), %%mm3 \n\t"
- "pand %%mm4, %%mm0 \n\t"
- "pand %%mm4, %%mm1 \n\t"
- "pand %%mm4, %%mm2 \n\t"
- "pand %%mm4, %%mm3 \n\t"
- "packuswb %%mm1, %%mm0 \n\t"
- "packuswb %%mm3, %%mm2 \n\t"
- "movq %%mm0, (%3, %%"REG_a") \n\t"
- "movq %%mm2, (%4, %%"REG_a") \n\t"
- "add $8, %%"REG_a" \n\t"
- " js 1b \n\t"
- : : "g" ((x86_reg)-width), "r" (src1+width*2), "r" (src2+width*2), "r" (dstU+width), "r" (dstV+width)
- : "%"REG_a
- );
-}
-
static av_always_inline void RENAME(nvXXtoUV)(uint8_t *dst1, uint8_t *dst2,
const uint8_t *src, int width)
{
@@ -2268,6 +2215,7 @@ static av_cold void RENAME(sws_init_swScale)(SwsContext *c)
}
}
+ if (c->scalingBpp == 8) {
#if !COMPILE_TEMPLATE_MMX2
c->hScale = RENAME(hScale );
#endif /* !COMPILE_TEMPLATE_MMX2 */
@@ -2285,6 +2233,7 @@ static av_cold void RENAME(sws_init_swScale)(SwsContext *c)
#if COMPILE_TEMPLATE_MMX2
}
#endif /* COMPILE_TEMPLATE_MMX2 */
+ }
#if !COMPILE_TEMPLATE_MMX2
switch(srcFormat) {
@@ -2292,12 +2241,6 @@ static av_cold void RENAME(sws_init_swScale)(SwsContext *c)
case PIX_FMT_UYVY422 : c->chrToYV12 = RENAME(uyvyToUV); break;
case PIX_FMT_NV12 : c->chrToYV12 = RENAME(nv12ToUV); break;
case PIX_FMT_NV21 : c->chrToYV12 = RENAME(nv21ToUV); break;
- case PIX_FMT_YUV420P16BE:
- case PIX_FMT_YUV422P16BE:
- case PIX_FMT_YUV444P16BE: c->chrToYV12 = RENAME(BEToUV); break;
- case PIX_FMT_YUV420P16LE:
- case PIX_FMT_YUV422P16LE:
- case PIX_FMT_YUV444P16LE: c->chrToYV12 = RENAME(LEToUV); break;
default: break;
}
#endif /* !COMPILE_TEMPLATE_MMX2 */
@@ -2312,16 +2255,8 @@ static av_cold void RENAME(sws_init_swScale)(SwsContext *c)
switch (srcFormat) {
#if !COMPILE_TEMPLATE_MMX2
case PIX_FMT_YUYV422 :
- case PIX_FMT_YUV420P16BE:
- case PIX_FMT_YUV422P16BE:
- case PIX_FMT_YUV444P16BE:
- case PIX_FMT_Y400A :
- case PIX_FMT_GRAY16BE : c->lumToYV12 = RENAME(yuy2ToY); break;
- case PIX_FMT_UYVY422 :
- case PIX_FMT_YUV420P16LE:
- case PIX_FMT_YUV422P16LE:
- case PIX_FMT_YUV444P16LE:
- case PIX_FMT_GRAY16LE : c->lumToYV12 = RENAME(uyvyToY); break;
+ case PIX_FMT_Y400A : c->lumToYV12 = RENAME(yuy2ToY); break;
+ case PIX_FMT_UYVY422 : c->lumToYV12 = RENAME(uyvyToY); break;
#endif /* !COMPILE_TEMPLATE_MMX2 */
case PIX_FMT_BGR24 : c->lumToYV12 = RENAME(bgr24ToY); break;
case PIX_FMT_RGB24 : c->lumToYV12 = RENAME(rgb24ToY); break;
diff --git a/tests/ref/lavfi/pixdesc b/tests/ref/lavfi/pixdesc
index de13e94cff..8695b1dea2 100644
--- a/tests/ref/lavfi/pixdesc
+++ b/tests/ref/lavfi/pixdesc
@@ -1,8 +1,8 @@
abgr 037bf9df6a765520ad6d490066bf4b89
argb c442a8261c2265a07212ef0f72e35f5a
bgr24 0d0cb38ab3fa0b2ec0865c14f78b217b
-bgr48be 4ba0ff7fc9e011ea264610ad1585bb1f
-bgr48le d022bfdd6a07d5dcc693799322a386b4
+bgr48be 74dedaaacae8fd1ef46e05f78cf29d62
+bgr48le 0eb7d30801eac6058814bddd330b3c76
bgr4_byte 50d23cc82d9dcef2fd12adb81fb9b806
bgr555be 49f01b1f1f0c84fd9e776dd34cc3c280
bgr555le 378d6ac4223651a1adcbf94a3d0d807b
@@ -18,8 +18,8 @@ monow 9251497f3b0634f1165d12d5a289d943
nv12 e0af357888584d36eec5aa0f673793ef
nv21 9a3297f3b34baa038b1f37cb202b512f
rgb24 b41eba9651e1b5fe386289b506188105
-rgb48be 460b6de89b156290a12d3941db8bd731
-rgb48le cd93cb34d15996987367dabda3a10128
+rgb48be e3bc84c9af376fb6d0f0293cc7b713a6
+rgb48le f51c0e71638a822458329abb2f4052c7
rgb4_byte c93ba89b74c504e7f5ae9d9ab1546c73
rgb555be 912a62c5e53bfcbac2a0340e10973cf2
rgb555le a937a0fc764fb57dc1b3af87cba0273c
@@ -38,12 +38,12 @@ yuv420p16le 2d59c4f1d0314a5a957a7cfc4b6fabcc
yuv420p9be ce880fa07830e5297c22acf6e20555ce
yuv420p9le 16543fda8f87d94a6cf857d2e8d4461a
yuv422p c9bba4529821d796a6ab09f6a5fd355a
-yuv422p16be 5499502e1c29534a158a1fe60e889f60
-yuv422p16le e3d61fde6978591596bc36b914386623
+yuv422p16be 86ad3447f97969ce095afeef81fa9abf
+yuv422p16le a53a9b451f4a81eeae33362c1bbd07f8
yuv440p 5a064afe2b453bb52cdb3f176b1aa1cf
yuv444p 0a98447b78fd476aa39686da6a74fa2e
-yuv444p16be ea602a24b8e6969679265078bd8607b6
-yuv444p16le 1262a0dc57ee147967fc896d04206313
+yuv444p16be 95db370ae765dd3d10b7def14704ae73
+yuv444p16le 36b969179b5ad9d312a0d1e1cd6bc402
yuva420p a29884f3f3dfe1e00b961bc17bef3d47
yuvj420p 32eec78ba51857b16ce9b813a49b7189
yuvj422p 0dfa0ed434f73be51428758c69e082cb
diff --git a/tests/ref/lavfi/pixfmts_copy b/tests/ref/lavfi/pixfmts_copy
index de13e94cff..8695b1dea2 100644
--- a/tests/ref/lavfi/pixfmts_copy
+++ b/tests/ref/lavfi/pixfmts_copy
@@ -1,8 +1,8 @@
abgr 037bf9df6a765520ad6d490066bf4b89
argb c442a8261c2265a07212ef0f72e35f5a
bgr24 0d0cb38ab3fa0b2ec0865c14f78b217b
-bgr48be 4ba0ff7fc9e011ea264610ad1585bb1f
-bgr48le d022bfdd6a07d5dcc693799322a386b4
+bgr48be 74dedaaacae8fd1ef46e05f78cf29d62
+bgr48le 0eb7d30801eac6058814bddd330b3c76
bgr4_byte 50d23cc82d9dcef2fd12adb81fb9b806
bgr555be 49f01b1f1f0c84fd9e776dd34cc3c280
bgr555le 378d6ac4223651a1adcbf94a3d0d807b
@@ -18,8 +18,8 @@ monow 9251497f3b0634f1165d12d5a289d943
nv12 e0af357888584d36eec5aa0f673793ef
nv21 9a3297f3b34baa038b1f37cb202b512f
rgb24 b41eba9651e1b5fe386289b506188105
-rgb48be 460b6de89b156290a12d3941db8bd731
-rgb48le cd93cb34d15996987367dabda3a10128
+rgb48be e3bc84c9af376fb6d0f0293cc7b713a6
+rgb48le f51c0e71638a822458329abb2f4052c7
rgb4_byte c93ba89b74c504e7f5ae9d9ab1546c73
rgb555be 912a62c5e53bfcbac2a0340e10973cf2
rgb555le a937a0fc764fb57dc1b3af87cba0273c
@@ -38,12 +38,12 @@ yuv420p16le 2d59c4f1d0314a5a957a7cfc4b6fabcc
yuv420p9be ce880fa07830e5297c22acf6e20555ce
yuv420p9le 16543fda8f87d94a6cf857d2e8d4461a
yuv422p c9bba4529821d796a6ab09f6a5fd355a
-yuv422p16be 5499502e1c29534a158a1fe60e889f60
-yuv422p16le e3d61fde6978591596bc36b914386623
+yuv422p16be 86ad3447f97969ce095afeef81fa9abf
+yuv422p16le a53a9b451f4a81eeae33362c1bbd07f8
yuv440p 5a064afe2b453bb52cdb3f176b1aa1cf
yuv444p 0a98447b78fd476aa39686da6a74fa2e
-yuv444p16be ea602a24b8e6969679265078bd8607b6
-yuv444p16le 1262a0dc57ee147967fc896d04206313
+yuv444p16be 95db370ae765dd3d10b7def14704ae73
+yuv444p16le 36b969179b5ad9d312a0d1e1cd6bc402
yuva420p a29884f3f3dfe1e00b961bc17bef3d47
yuvj420p 32eec78ba51857b16ce9b813a49b7189
yuvj422p 0dfa0ed434f73be51428758c69e082cb
diff --git a/tests/ref/lavfi/pixfmts_crop b/tests/ref/lavfi/pixfmts_crop
index af42cd3c4a..c7b59527fb 100644
--- a/tests/ref/lavfi/pixfmts_crop
+++ b/tests/ref/lavfi/pixfmts_crop
@@ -1,8 +1,8 @@
abgr cd761690872843d1b7ab0c695393c751
argb 2ec6ef18769bcd651c2e8904d5a3ee67
bgr24 3450fd00cf1493d1ded75544d82ba3ec
-bgr48be 90cb5d373a1123432d63c6a10c101afa
-bgr48le 9371f54ceda9010f1199e86f4930ac3f
+bgr48be a9a7d177cef0914d3f1d266f00dff676
+bgr48le b475d1b529ed80c728ddbacd22d35281
bgr4_byte 2f6ac3cdd4676ab4e2982bdf0664945b
bgr555be d3a7c273604723adeb7e5f5dd1c4272b
bgr555le d22442fc13b464f9ba455b08df4e981f
@@ -14,8 +14,8 @@ gray 8c4850e66562a587a292dc728a65ea4a
gray16be daa5a6b98fb4a280c57c57bff1a2ab5a
gray16le 84f5ea7259073edcb893113b42213c8e
rgb24 3b90ed64b687d3dc186c6ef521dc71a8
-rgb48be a808128041a1962deaa8620c7448feba
-rgb48le ce92d02cc322608d5be377cb1940677b
+rgb48be b8f9fd6aaa24d75275ee2f8b8a7b9e55
+rgb48le 3e52e831a040f086c3ae983241172cce
rgb4_byte 6958029f73c6cdfed4f71020d816f027
rgb555be 41a7d1836837bc90f2cae19a9c9df3b3
rgb555le eeb78f8ce6186fba55c941469e60ba67
@@ -29,12 +29,12 @@ yuv420p bfea0188ddd4889787c403caae119cc7
yuv420p16be 8365eff38b8c329aeb95fc605fa229bb
yuv420p16le 5e8dd38d973d5854abe1ad4efad20cc1
yuv422p f2f930a91fe00d4252c4720b5ecd8961
-yuv422p16be 167e4338811a7d272925a4c6417d60da
-yuv422p16le 3359395d5875d581fa1e975013d30114
+yuv422p16be 6647fe1c381c148f8207c988c0e22bf0
+yuv422p16le e1548c9dc51202db38a9625c8954203f
yuv440p 2472417d980e395ad6843cbb8b633b29
yuv444p 1f151980486848c96bc5585ced99003e
-yuv444p16be d69280c2856865d2ea94bd5292aac1c6
-yuv444p16le 33f43e030bedf9723be4f63c3e9fc80e
+yuv444p16be ac3b159f8c858fcdf475a8c024ee79b6
+yuv444p16le 9a6863bfc5faee206065c11dc994bf0c
yuva420p 7536753dfbc7932560fb50c921369a0e
yuvj420p 21f891093006d42d7683b0e1d773a657
yuvj422p 9a43d474c407590ad8f213880586b45e
diff --git a/tests/ref/lavfi/pixfmts_hflip b/tests/ref/lavfi/pixfmts_hflip
index 3a3dbf0014..7f4342f35c 100644
--- a/tests/ref/lavfi/pixfmts_hflip
+++ b/tests/ref/lavfi/pixfmts_hflip
@@ -1,8 +1,8 @@
abgr 49468c6c9ceee5d52b08b1270a909323
argb 50ba9f16c6475530602f2983278b82d0
bgr24 cc53d2011d097972db0d22756c3699e3
-bgr48be 11641cf0f4516a9aed98f7872720f801
-bgr48le b5440734eed128554dd9f83b34ba582f
+bgr48be 90374bc92471f1bd4931d71ef8b73f50
+bgr48le 696f628d0dd32121e60a0d61ac47d6e6
bgr4_byte aac987e7d1a6a96477cfc0b48a4285de
bgr555be bc07265898440116772200390d70c092
bgr555le ccee08679bac84a1f960c6c9070c5538
@@ -14,8 +14,8 @@ gray 03efcb4ab52a24c0af0e03cfd26c9377
gray16be 9bcbca979601ddc4869f846f08f3d1dd
gray16le c1b8965adcc7f847ee343149ff507073
rgb24 754f1722fc738590cc407ac65749bfe8
-rgb48be 10743e1577dc3198dbbc7c0b3b8f429e
-rgb48le dd945a44f39119221407bf7a04f1bc49
+rgb48be 2397b9d3c296ac15f8a2325a703f81c7
+rgb48le 527043c72546d8b4bb1ce2dea4b294c3
rgb4_byte c8a3f995fcf3e0919239ea2c413ddc29
rgb555be 045ce8607d3910586f4d97481dda8632
rgb555le 8778ee0cf58ce9ad1d99a1eca9f95e87
@@ -29,12 +29,12 @@ yuv420p 2d5c80f9ba2ddd85b2aeda3564cc7d64
yuv420p16be 758b0c1e2113b15e7afde48da4e4d024
yuv420p16le 480ccd951dcb806bc875d307e02e50a0
yuv422p 6e728f4eb9eae287c224f396d84be6ea
-yuv422p16be a05d43cd62b790087bd37083174557de
-yuv422p16le 6954abebcbc62d81068d58d0c62bdd5b
+yuv422p16be 9dbe0af0eb877987611cf04bfa577202
+yuv422p16le 2d8f37231110177cc5e1b61c8cb4b163
yuv440p a99e2b57ed601f39852715c9d675d0d3
yuv444p 947e47f7bb5fdccc659d19b7df2b6fc3
-yuv444p16be e5ef45bc3d2f5b0b2542d5151340c382
-yuv444p16le 70793e3d66d0c23a0cdedabe9c24c2a7
+yuv444p16be debc96a7ec4fec0a412f9d8995bc48a2
+yuv444p16le 5b5e1348a631fc2206bb7ff851a52687
yuva420p d83ec0c01498189f179ec574918185f1
yuvj420p df3aaaec3bb157c3bde5f0365af30f4f
yuvj422p d113871528d510a192797af59df9c05c
diff --git a/tests/ref/lavfi/pixfmts_null b/tests/ref/lavfi/pixfmts_null
index de13e94cff..8695b1dea2 100644
--- a/tests/ref/lavfi/pixfmts_null
+++ b/tests/ref/lavfi/pixfmts_null
@@ -1,8 +1,8 @@
abgr 037bf9df6a765520ad6d490066bf4b89
argb c442a8261c2265a07212ef0f72e35f5a
bgr24 0d0cb38ab3fa0b2ec0865c14f78b217b
-bgr48be 4ba0ff7fc9e011ea264610ad1585bb1f
-bgr48le d022bfdd6a07d5dcc693799322a386b4
+bgr48be 74dedaaacae8fd1ef46e05f78cf29d62
+bgr48le 0eb7d30801eac6058814bddd330b3c76
bgr4_byte 50d23cc82d9dcef2fd12adb81fb9b806
bgr555be 49f01b1f1f0c84fd9e776dd34cc3c280
bgr555le 378d6ac4223651a1adcbf94a3d0d807b
@@ -18,8 +18,8 @@ monow 9251497f3b0634f1165d12d5a289d943
nv12 e0af357888584d36eec5aa0f673793ef
nv21 9a3297f3b34baa038b1f37cb202b512f
rgb24 b41eba9651e1b5fe386289b506188105
-rgb48be 460b6de89b156290a12d3941db8bd731
-rgb48le cd93cb34d15996987367dabda3a10128
+rgb48be e3bc84c9af376fb6d0f0293cc7b713a6
+rgb48le f51c0e71638a822458329abb2f4052c7
rgb4_byte c93ba89b74c504e7f5ae9d9ab1546c73
rgb555be 912a62c5e53bfcbac2a0340e10973cf2
rgb555le a937a0fc764fb57dc1b3af87cba0273c
@@ -38,12 +38,12 @@ yuv420p16le 2d59c4f1d0314a5a957a7cfc4b6fabcc
yuv420p9be ce880fa07830e5297c22acf6e20555ce
yuv420p9le 16543fda8f87d94a6cf857d2e8d4461a
yuv422p c9bba4529821d796a6ab09f6a5fd355a
-yuv422p16be 5499502e1c29534a158a1fe60e889f60
-yuv422p16le e3d61fde6978591596bc36b914386623
+yuv422p16be 86ad3447f97969ce095afeef81fa9abf
+yuv422p16le a53a9b451f4a81eeae33362c1bbd07f8
yuv440p 5a064afe2b453bb52cdb3f176b1aa1cf
yuv444p 0a98447b78fd476aa39686da6a74fa2e
-yuv444p16be ea602a24b8e6969679265078bd8607b6
-yuv444p16le 1262a0dc57ee147967fc896d04206313
+yuv444p16be 95db370ae765dd3d10b7def14704ae73
+yuv444p16le 36b969179b5ad9d312a0d1e1cd6bc402
yuva420p a29884f3f3dfe1e00b961bc17bef3d47
yuvj420p 32eec78ba51857b16ce9b813a49b7189
yuvj422p 0dfa0ed434f73be51428758c69e082cb
diff --git a/tests/ref/lavfi/pixfmts_scale b/tests/ref/lavfi/pixfmts_scale
index 670efe15bb..de41952a21 100644
--- a/tests/ref/lavfi/pixfmts_scale
+++ b/tests/ref/lavfi/pixfmts_scale
@@ -1,8 +1,8 @@
abgr d894cb97f6c80eb21bdbe8a4eea62d86
argb 54346f2b2eef10919e0f247241df3b24
bgr24 570f8d6b51a838aed022ef67535f6bdc
-bgr48be fcc0f2dbf45d325f84f816c74cbeeebe
-bgr48le 3f9c2b23eed3b8d196d1c14b38ce50f5
+bgr48be 07f7a0cc34feb3646434d47c0cec8cee
+bgr48le 9abd2c3a66088e6c9078232064eba61e
bgr4_byte ee1d35a7baf8e9016891929a2f565c0b
bgr555be de8901c1358834fddea060fcb3a67beb
bgr555le 36b745067197f9ca8c1731cac51329c9
@@ -11,15 +11,15 @@ bgr565le 3a514a298c6161a071ddf9963c06509d
bgr8 7f007fa6c153a16e808a9c51605a4016
bgra a5e7040f9a80cccd65e5acf2ca09ace5
gray d7786a7d9d99ac74230cc045cab5632c
-gray16be af39ce3a497f6734b157c8b94544f537
-gray16le 7ac1b788bcc472010df7a97e762485e0
+gray16be bba98532da29a31599df2feec3b08e3e
+gray16le 30267f127d5734c4767f3944f1729a33
monob 88c4c050758e64d120f50c7eff694381
monow d31772ebaa877fc2a78565937f7f9673
nv12 4676d59db43d657dc12841f6bc3ab452
nv21 69c699510ff1fb777b118ebee1002f14
rgb24 514692e28e8ff6860e415ce4fcf6eb8c
-rgb48be 1894cd30dabcd3180518e4d5f09f25e7
-rgb48le 1354e6e27ce3c1d4d4989ee56030c94b
+rgb48be f18841c19fc6d9c817a3095f557b9bc5
+rgb48le 819e7b8acd8965ba57ba46198a5cc9bf
rgb4_byte d81ffd3add95842a618eec81024f0b5c
rgb555be 4607309f9f217d51cbb53d13b84b4537
rgb555le a350ef1dc2c9688ed49e7ba018843795
@@ -31,19 +31,19 @@ uyvy422 314bd486277111a95d9369b944fa0400
yuv410p 7df8f6d69b56a8dcb6c7ee908e5018b5
yuv411p 1143e7c5cc28fe0922b051b17733bc4c
yuv420p fdad2d8df8985e3d17e73c71f713cb14
-yuv420p10be 6d335e75b553da590135cf8bb999610c
-yuv420p10le d510ddbabefd03ef39ec943fcb51b709
-yuv420p16be 29a0265764530070f5cd3251cc01f66a
-yuv420p16le 6f3a265b084a78baec229238d9f7945f
-yuv420p9be ec4983b7a949c0472110a7a2c58e278a
-yuv420p9le c136dce5913a722eee44ab72cff664b2
+yuv420p10be 8b5ad855229840a8fa87786cab83f856
+yuv420p10le 5264e87921d47b17411578d9c92672b1
+yuv420p16be f6ef3ba90f238b467c7e72ade927083d
+yuv420p16le faf6aab3b1c16e8afbe160686dd360e0
+yuv420p9be c14bf746d161face61e1f39b491bf7ef
+yuv420p9le 59457f9a51768bf1d4342238d50a9be3
yuv422p 918e37701ee7377d16a8a6c119c56a40
-yuv422p16be ef3e865fc1d0c68977c735323c50af6e
-yuv422p16le 428a9b96214c09cb5a983ce36d6961ff
+yuv422p16be 837945d3a771366a5a72a4ed095a4f53
+yuv422p16le b8292ae9b52eb7afc3d8b93e8fd895b4
yuv440p 461503fdb9b90451020aa3b25ddf041c
yuv444p 81b2eba962d12e8d64f003ac56f6faf2
-yuv444p16be 99a3738c70c8fbdc5a0e4ad4bf50648d
-yuv444p16le 385d0cc5240d62da0871915be5d86f0a
+yuv444p16be cc7460f76477aa4b4c33442f67c06a89
+yuv444p16le 9a5ed60d68c0a4a5155f9d376174cdf7
yuva420p 8673a9131fb47de69788863f93a50eb7
yuvj420p 30427bd6caf5bda93a173dbebe759e09
yuvj422p fc8288f64fd149573f73cf8da05d8e6d
diff --git a/tests/ref/lavfi/pixfmts_vflip b/tests/ref/lavfi/pixfmts_vflip
index 0383ad9c08..89502d1745 100644
--- a/tests/ref/lavfi/pixfmts_vflip
+++ b/tests/ref/lavfi/pixfmts_vflip
@@ -1,8 +1,8 @@
abgr 25e72e9dbd01ab00727c976d577f7be5
argb 19869bf1a5ac0b6af4d8bbe2c104533c
bgr24 89108a4ba00201f79b75b9305c42352d
-bgr48be ed82382da09b64a8e04728fcf76e6814
-bgr48le 0f1f135608c2ff24d26d03e939fc2112
+bgr48be 908b4edb525fd154a95a3744c4ab5420
+bgr48le 796c2072d6fa13a091f5c5b175417ed5
bgr4_byte 407fcf564ed764c38e1d748f700ab921
bgr555be f739d2519f7e9d494359bf67a3821537
bgr555le bd7b3ec4d684dfad075d89a606cb8b74
@@ -18,8 +18,8 @@ monow ff9869d067ecb94eb9d90c9750c31fea
nv12 046f00f598ce14d9854a3534a5c99114
nv21 01ea369dd2d0d3ed7451dc5c8d61497f
rgb24 eaefabc168d0b14576bab45bc1e56e1e
-rgb48be 4e0c384163ebab06a08e74637beb02bc
-rgb48le a77bfeefcd96750cf0e1917a2e2bf1e7
+rgb48be 8e347deca2902e7dc1ece261322577d8
+rgb48le 2034e485f946e4064b5fb9be09865e55
rgb4_byte 8c6ff02df0b06dd2d574836c3741b2a2
rgb555be 40dc33cfb5cf56aac1c5a290ac486c36
rgb555le 4f8eaad29a17e0f8e9d8ab743e76b999
@@ -38,12 +38,12 @@ yuv420p16le 0f609e588e5a258644ef85170d70e030
yuv420p9be be40ec975fb2873891643cbbbddbc3b0
yuv420p9le 7e606310d3f5ff12badf911e8f333471
yuv422p d7f5cb44d9b0210d66d6a8762640ab34
-yuv422p16be 9bd8f8c961822b586fa4cf992be54acc
-yuv422p16le 9c4a1239605c7952b736ac3130163f14
+yuv422p16be 8cdfbddf2dd4c44c3efef4ee00170eba
+yuv422p16le a2f421f6a1af950544081c1797de01ae
yuv440p 876385e96165acf51271b20e5d85a416
yuv444p 9c3c667d1613b72d15bc6d851c5eb8f7
-yuv444p16be 0f4afa4a4aacf4bb6b87641abde71ea9
-yuv444p16le 8f31557bc52adfe00ae8b40a9b8c23f8
+yuv444p16be b092690d22f0b26360fbf5cfd739be17
+yuv444p16le 18768b4ddca92d06f9713fef467276a9
yuva420p c705d1cf061d8c6580ac690b55f92276
yuvj420p 41fd02b204da0ab62452cd14b595e2e4
yuvj422p 7f6ca9bc1812cde02036d7d29a7cce43