sws: fix 16/32 bug from merge
This commit is contained in:
parent
948ccdadf4
commit
ae05dd8731
@ -299,9 +299,10 @@ yuv2yuvX16_c_template(const int16_t *lumFilter, const int32_t **lumSrc,
|
|||||||
{
|
{
|
||||||
//FIXME Optimize (just quickly written not optimized..)
|
//FIXME Optimize (just quickly written not optimized..)
|
||||||
int i;
|
int i;
|
||||||
|
int dword= output_bits == 16;
|
||||||
uint16_t *yDest = dest[0], *uDest = dest[1], *vDest = dest[2],
|
uint16_t *yDest = dest[0], *uDest = dest[1], *vDest = dest[2],
|
||||||
*aDest = CONFIG_SWSCALE_ALPHA ? dest[3] : NULL;
|
*aDest = CONFIG_SWSCALE_ALPHA ? dest[3] : NULL;
|
||||||
int shift = 15 + 16 - output_bits;
|
int shift = 11 + 4*dword + 16 - output_bits;
|
||||||
|
|
||||||
#define output_pixel(pos, val) \
|
#define output_pixel(pos, val) \
|
||||||
if (big_endian) { \
|
if (big_endian) { \
|
||||||
@ -318,24 +319,24 @@ yuv2yuvX16_c_template(const int16_t *lumFilter, const int32_t **lumSrc,
|
|||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
for (i = 0; i < dstW; i++) {
|
for (i = 0; i < dstW; i++) {
|
||||||
int val = 1 << (30-output_bits);
|
int val = 1 << (26-output_bits + 4*dword);
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
for (j = 0; j < lumFilterSize; j++)
|
for (j = 0; j < lumFilterSize; j++)
|
||||||
val += lumSrc[j][i] * lumFilter[j];
|
val += (dword ? lumSrc[j][i] : ((int16_t**)lumSrc)[j][i]) * lumFilter[j];
|
||||||
|
|
||||||
output_pixel(&yDest[i], val);
|
output_pixel(&yDest[i], val);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uDest) {
|
if (uDest) {
|
||||||
for (i = 0; i < chrDstW; i++) {
|
for (i = 0; i < chrDstW; i++) {
|
||||||
int u = 1 << (30-output_bits);
|
int u = 1 << (26-output_bits + 4*dword);
|
||||||
int v = 1 << (30-output_bits);
|
int v = 1 << (26-output_bits + 4*dword);
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
for (j = 0; j < chrFilterSize; j++) {
|
for (j = 0; j < chrFilterSize; j++) {
|
||||||
u += chrUSrc[j][i] * chrFilter[j];
|
u += (dword ? chrUSrc[j][i] : ((int16_t**)chrUSrc)[j][i]) * chrFilter[j];
|
||||||
v += chrVSrc[j][i] * chrFilter[j];
|
v += (dword ? chrVSrc[j][i] : ((int16_t**)chrVSrc)[j][i]) * chrFilter[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
output_pixel(&uDest[i], u);
|
output_pixel(&uDest[i], u);
|
||||||
@ -345,11 +346,11 @@ yuv2yuvX16_c_template(const int16_t *lumFilter, const int32_t **lumSrc,
|
|||||||
|
|
||||||
if (CONFIG_SWSCALE_ALPHA && aDest) {
|
if (CONFIG_SWSCALE_ALPHA && aDest) {
|
||||||
for (i = 0; i < dstW; i++) {
|
for (i = 0; i < dstW; i++) {
|
||||||
int val = 1 << (30-output_bits);
|
int val = 1 << (26-output_bits + 4*dword);
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
for (j = 0; j < lumFilterSize; j++)
|
for (j = 0; j < lumFilterSize; j++)
|
||||||
val += alpSrc[j][i] * lumFilter[j];
|
val += (dword ? alpSrc[j][i] : ((int16_t**)alpSrc)[j][i]) * lumFilter[j];
|
||||||
|
|
||||||
output_pixel(&aDest[i], val);
|
output_pixel(&aDest[i], val);
|
||||||
}
|
}
|
||||||
@ -2170,7 +2171,7 @@ static av_always_inline void hyscale(SwsContext *c, int16_t *dst, int dstWidth,
|
|||||||
if (convertRange)
|
if (convertRange)
|
||||||
convertRange(dst, dstWidth);
|
convertRange(dst, dstWidth);
|
||||||
|
|
||||||
if (av_pix_fmt_descriptors[c->dstFormat].comp[0].depth_minus1 < 8 && c->scalingBpp == 16) {
|
if (av_pix_fmt_descriptors[c->dstFormat].comp[0].depth_minus1 < 15 && c->scalingBpp == 16) {
|
||||||
c->scale19To15Fw(dst, (int32_t *) dst, dstWidth);
|
c->scale19To15Fw(dst, (int32_t *) dst, dstWidth);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2229,7 +2230,7 @@ static av_always_inline void hcscale(SwsContext *c, int16_t *dst1, int16_t *dst2
|
|||||||
if (c->chrConvertRange)
|
if (c->chrConvertRange)
|
||||||
c->chrConvertRange(dst1, dst2, dstWidth);
|
c->chrConvertRange(dst1, dst2, dstWidth);
|
||||||
|
|
||||||
if (av_pix_fmt_descriptors[c->dstFormat].comp[0].depth_minus1 < 8 && c->scalingBpp == 16) {
|
if (av_pix_fmt_descriptors[c->dstFormat].comp[0].depth_minus1 < 15 && c->scalingBpp == 16) {
|
||||||
c->scale19To15Fw(dst1, (int32_t *) dst1, dstWidth);
|
c->scale19To15Fw(dst1, (int32_t *) dst1, dstWidth);
|
||||||
c->scale19To15Fw(dst2, (int32_t *) dst2, dstWidth);
|
c->scale19To15Fw(dst2, (int32_t *) dst2, dstWidth);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user