swscale: fix gbrap16 alpha channel issues

Fixes filter-pixfmts-scale test failing on big-endian systems due to
alpSrc not being cast to (const int32_t**).

Also fixes distortions in the output alpha channel values by copying the
alpha channel code from the rgba64 case found elsewhere in output.c.

Fixes ticket 6555.

Signed-off-by: James Cowgill <James.Cowgill@imgtec.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
James Cowgill 2017-08-03 16:21:54 +01:00 committed by Michael Niedermayer
parent 2cc56741b1
commit 013ec23cbe
2 changed files with 10 additions and 10 deletions

View File

@ -2026,24 +2026,24 @@ yuv2gbrp16_full_X_c(SwsContext *c, const int16_t *lumFilter,
const int16_t **lumSrcx, int lumFilterSize, const int16_t **lumSrcx, int lumFilterSize,
const int16_t *chrFilter, const int16_t **chrUSrcx, const int16_t *chrFilter, const int16_t **chrUSrcx,
const int16_t **chrVSrcx, int chrFilterSize, const int16_t **chrVSrcx, int chrFilterSize,
const int16_t **alpSrc, uint8_t **dest, const int16_t **alpSrcx, uint8_t **dest,
int dstW, int y) int dstW, int y)
{ {
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->dstFormat); const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->dstFormat);
int i; int i;
int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrc; int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrcx;
uint16_t **dest16 = (uint16_t**)dest; uint16_t **dest16 = (uint16_t**)dest;
const int32_t **lumSrc = (const int32_t**)lumSrcx; const int32_t **lumSrc = (const int32_t**)lumSrcx;
const int32_t **chrUSrc = (const int32_t**)chrUSrcx; const int32_t **chrUSrc = (const int32_t**)chrUSrcx;
const int32_t **chrVSrc = (const int32_t**)chrVSrcx; const int32_t **chrVSrc = (const int32_t**)chrVSrcx;
int A = 0; // init to silence warning const int32_t **alpSrc = (const int32_t**)alpSrcx;
for (i = 0; i < dstW; i++) { for (i = 0; i < dstW; i++) {
int j; int j;
int Y = -0x40000000; int Y = -0x40000000;
int U = -(128 << 23); int U = -(128 << 23);
int V = -(128 << 23); int V = -(128 << 23);
int R, G, B; int R, G, B, A;
for (j = 0; j < lumFilterSize; j++) for (j = 0; j < lumFilterSize; j++)
Y += lumSrc[j][i] * (unsigned)lumFilter[j]; Y += lumSrc[j][i] * (unsigned)lumFilter[j];
@ -2059,13 +2059,13 @@ yuv2gbrp16_full_X_c(SwsContext *c, const int16_t *lumFilter,
V >>= 14; V >>= 14;
if (hasAlpha) { if (hasAlpha) {
A = 1 << 18; A = -0x40000000;
for (j = 0; j < lumFilterSize; j++) for (j = 0; j < lumFilterSize; j++)
A += alpSrc[j][i] * lumFilter[j]; A += alpSrc[j][i] * lumFilter[j];
if (A & 0xF8000000) A >>= 1;
A = av_clip_uintp2(A, 27); A += 0x20002000;
} }
Y -= c->yuv2rgb_y_offset; Y -= c->yuv2rgb_y_offset;
@ -2083,7 +2083,7 @@ yuv2gbrp16_full_X_c(SwsContext *c, const int16_t *lumFilter,
dest16[1][i] = B >> 14; dest16[1][i] = B >> 14;
dest16[2][i] = R >> 14; dest16[2][i] = R >> 14;
if (hasAlpha) if (hasAlpha)
dest16[3][i] = A >> 11; dest16[3][i] = av_clip_uintp2(A, 30) >> 14;
} }
if ((!isBE(c->dstFormat)) != (!HAVE_BIGENDIAN)) { if ((!isBE(c->dstFormat)) != (!HAVE_BIGENDIAN)) {
for (i = 0; i < dstW; i++) { for (i = 0; i < dstW; i++) {

View File

@ -23,8 +23,8 @@ gbrap10be 6d89abb9248006c3e9017545e9474654
gbrap10le cf974e23f485a10740f5de74a5c8c3df gbrap10le cf974e23f485a10740f5de74a5c8c3df
gbrap12be 1d9b57766ba9c2192403f43967cb9af0 gbrap12be 1d9b57766ba9c2192403f43967cb9af0
gbrap12le bb1ba1c157717db3dd612a76d38a018e gbrap12le bb1ba1c157717db3dd612a76d38a018e
gbrap16be 81542b96575d1fe3b239d23899f5ece3 gbrap16be c72b935a6e57a8e1c37bff08c2db55b1
gbrap16le 6feb8b9da131917abe867e0eaaf07b90 gbrap16le 13eb0e62b1ac9c1c86c81521eaefab5f
gbrp dc3387f925f972c61aae7eb23cdc19f0 gbrp dc3387f925f972c61aae7eb23cdc19f0
gbrp10be 0277d4c3a8498d75e2783fb81379e481 gbrp10be 0277d4c3a8498d75e2783fb81379e481
gbrp10le f3d70f8ab845c3c9b8f7452e4a6e285a gbrp10le f3d70f8ab845c3c9b8f7452e4a6e285a