Commit ac9ac45a authored by Ronald S. Bultje's avatar Ronald S. Bultje Committed by Michael Niedermayer

swscale: fix 16-bit scaling when output is 8-bits.

We would use the second half of the U plane buffer, rather than the
V plane buffer, to output the V plane pixels.
parent 08b57574
...@@ -1052,7 +1052,7 @@ int sws_init_context(SwsContext *c, SwsFilter *srcFilter, SwsFilter *dstFilter) ...@@ -1052,7 +1052,7 @@ int sws_init_context(SwsContext *c, SwsFilter *srcFilter, SwsFilter *dstFilter)
for (i=0; i<c->vChrBufSize; i++) { for (i=0; i<c->vChrBufSize; i++) {
FF_ALLOC_OR_GOTO(c, c->chrUPixBuf[i+c->vChrBufSize], dst_stride*2+1, fail); FF_ALLOC_OR_GOTO(c, c->chrUPixBuf[i+c->vChrBufSize], dst_stride*2+1, fail);
c->chrUPixBuf[i] = c->chrUPixBuf[i+c->vChrBufSize]; c->chrUPixBuf[i] = c->chrUPixBuf[i+c->vChrBufSize];
c->chrVPixBuf[i] = c->chrVPixBuf[i+c->vChrBufSize] = c->chrUPixBuf[i] + (dst_stride>>1); c->chrVPixBuf[i] = c->chrVPixBuf[i+c->vChrBufSize] = c->chrUPixBuf[i] + (dst_stride >> 1);
} }
if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf)
for (i=0; i<c->vLumBufSize; i++) { for (i=0; i<c->vLumBufSize; i++) {
......
...@@ -83,7 +83,7 @@ static void RENAME(yuv2yuvX)(SwsContext *c, const int16_t *lumFilter, ...@@ -83,7 +83,7 @@ static void RENAME(yuv2yuvX)(SwsContext *c, const int16_t *lumFilter,
*aDest = CONFIG_SWSCALE_ALPHA ? dest[3] : NULL; *aDest = CONFIG_SWSCALE_ALPHA ? dest[3] : NULL;
if (uDest) { if (uDest) {
x86_reg uv_off = c->uv_off; x86_reg uv_off = c->uv_offx2 >> 1;
for(i=0; i<8; i++) c->dither16[i] = chrDither[i]>>4; for(i=0; i<8; i++) c->dither16[i] = chrDither[i]>>4;
YSCALEYUV2YV12X(CHR_MMX_FILTER_OFFSET, uDest, chrDstW, 0) YSCALEYUV2YV12X(CHR_MMX_FILTER_OFFSET, uDest, chrDstW, 0)
for(i=0; i<8; i++) c->dither16[i] = chrDither[(i+3)&7]>>4; for(i=0; i<8; i++) c->dither16[i] = chrDither[(i+3)&7]>>4;
...@@ -170,7 +170,7 @@ static void RENAME(yuv2yuvX_ar)(SwsContext *c, const int16_t *lumFilter, ...@@ -170,7 +170,7 @@ static void RENAME(yuv2yuvX_ar)(SwsContext *c, const int16_t *lumFilter,
*aDest = CONFIG_SWSCALE_ALPHA ? dest[3] : NULL; *aDest = CONFIG_SWSCALE_ALPHA ? dest[3] : NULL;
if (uDest) { if (uDest) {
x86_reg uv_off = c->uv_off; x86_reg uv_off = c->uv_offx2 >> 1;
for(i=0; i<8; i++) c->dither32[i] = chrDither[i]<<12; for(i=0; i<8; i++) c->dither32[i] = chrDither[i]<<12;
YSCALEYUV2YV12X_ACCURATE(CHR_MMX_FILTER_OFFSET, uDest, chrDstW, 0) YSCALEYUV2YV12X_ACCURATE(CHR_MMX_FILTER_OFFSET, uDest, chrDstW, 0)
for(i=0; i<8; i++) c->dither32[i] = chrDither[(i+3)&7]<<12; for(i=0; i<8; i++) c->dither32[i] = chrDither[(i+3)&7]<<12;
...@@ -485,7 +485,7 @@ static void RENAME(yuv2rgb32_X_ar)(SwsContext *c, const int16_t *lumFilter, ...@@ -485,7 +485,7 @@ static void RENAME(yuv2rgb32_X_ar)(SwsContext *c, const int16_t *lumFilter,
{ {
x86_reg dummy=0; x86_reg dummy=0;
x86_reg dstW_reg = dstW; x86_reg dstW_reg = dstW;
x86_reg uv_off = c->uv_off << 1; x86_reg uv_off = c->uv_offx2;
if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) { if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {
YSCALEYUV2PACKEDX_ACCURATE YSCALEYUV2PACKEDX_ACCURATE
...@@ -518,7 +518,7 @@ static void RENAME(yuv2rgb32_X)(SwsContext *c, const int16_t *lumFilter, ...@@ -518,7 +518,7 @@ static void RENAME(yuv2rgb32_X)(SwsContext *c, const int16_t *lumFilter,
{ {
x86_reg dummy=0; x86_reg dummy=0;
x86_reg dstW_reg = dstW; x86_reg dstW_reg = dstW;
x86_reg uv_off = c->uv_off << 1; x86_reg uv_off = c->uv_offx2;
if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) { if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {
YSCALEYUV2PACKEDX YSCALEYUV2PACKEDX
...@@ -575,7 +575,7 @@ static void RENAME(yuv2rgb565_X_ar)(SwsContext *c, const int16_t *lumFilter, ...@@ -575,7 +575,7 @@ static void RENAME(yuv2rgb565_X_ar)(SwsContext *c, const int16_t *lumFilter,
{ {
x86_reg dummy=0; x86_reg dummy=0;
x86_reg dstW_reg = dstW; x86_reg dstW_reg = dstW;
x86_reg uv_off = c->uv_off << 1; x86_reg uv_off = c->uv_offx2;
YSCALEYUV2PACKEDX_ACCURATE YSCALEYUV2PACKEDX_ACCURATE
YSCALEYUV2RGBX YSCALEYUV2RGBX
...@@ -599,7 +599,7 @@ static void RENAME(yuv2rgb565_X)(SwsContext *c, const int16_t *lumFilter, ...@@ -599,7 +599,7 @@ static void RENAME(yuv2rgb565_X)(SwsContext *c, const int16_t *lumFilter,
{ {
x86_reg dummy=0; x86_reg dummy=0;
x86_reg dstW_reg = dstW; x86_reg dstW_reg = dstW;
x86_reg uv_off = c->uv_off << 1; x86_reg uv_off = c->uv_offx2;
YSCALEYUV2PACKEDX YSCALEYUV2PACKEDX
YSCALEYUV2RGBX YSCALEYUV2RGBX
...@@ -652,7 +652,7 @@ static void RENAME(yuv2rgb555_X_ar)(SwsContext *c, const int16_t *lumFilter, ...@@ -652,7 +652,7 @@ static void RENAME(yuv2rgb555_X_ar)(SwsContext *c, const int16_t *lumFilter,
{ {
x86_reg dummy=0; x86_reg dummy=0;
x86_reg dstW_reg = dstW; x86_reg dstW_reg = dstW;
x86_reg uv_off = c->uv_off << 1; x86_reg uv_off = c->uv_offx2;
YSCALEYUV2PACKEDX_ACCURATE YSCALEYUV2PACKEDX_ACCURATE
YSCALEYUV2RGBX YSCALEYUV2RGBX
...@@ -676,7 +676,7 @@ static void RENAME(yuv2rgb555_X)(SwsContext *c, const int16_t *lumFilter, ...@@ -676,7 +676,7 @@ static void RENAME(yuv2rgb555_X)(SwsContext *c, const int16_t *lumFilter,
{ {
x86_reg dummy=0; x86_reg dummy=0;
x86_reg dstW_reg = dstW; x86_reg dstW_reg = dstW;
x86_reg uv_off = c->uv_off << 1; x86_reg uv_off = c->uv_offx2;
YSCALEYUV2PACKEDX YSCALEYUV2PACKEDX
YSCALEYUV2RGBX YSCALEYUV2RGBX
...@@ -809,7 +809,7 @@ static void RENAME(yuv2bgr24_X_ar)(SwsContext *c, const int16_t *lumFilter, ...@@ -809,7 +809,7 @@ static void RENAME(yuv2bgr24_X_ar)(SwsContext *c, const int16_t *lumFilter,
{ {
x86_reg dummy=0; x86_reg dummy=0;
x86_reg dstW_reg = dstW; x86_reg dstW_reg = dstW;
x86_reg uv_off = c->uv_off << 1; x86_reg uv_off = c->uv_offx2;
YSCALEYUV2PACKEDX_ACCURATE YSCALEYUV2PACKEDX_ACCURATE
YSCALEYUV2RGBX YSCALEYUV2RGBX
...@@ -833,7 +833,7 @@ static void RENAME(yuv2bgr24_X)(SwsContext *c, const int16_t *lumFilter, ...@@ -833,7 +833,7 @@ static void RENAME(yuv2bgr24_X)(SwsContext *c, const int16_t *lumFilter,
{ {
x86_reg dummy=0; x86_reg dummy=0;
x86_reg dstW_reg = dstW; x86_reg dstW_reg = dstW;
x86_reg uv_off = c->uv_off << 1; x86_reg uv_off = c->uv_offx2;
YSCALEYUV2PACKEDX YSCALEYUV2PACKEDX
YSCALEYUV2RGBX YSCALEYUV2RGBX
...@@ -874,7 +874,7 @@ static void RENAME(yuv2yuyv422_X_ar)(SwsContext *c, const int16_t *lumFilter, ...@@ -874,7 +874,7 @@ static void RENAME(yuv2yuyv422_X_ar)(SwsContext *c, const int16_t *lumFilter,
{ {
x86_reg dummy=0; x86_reg dummy=0;
x86_reg dstW_reg = dstW; x86_reg dstW_reg = dstW;
x86_reg uv_off = c->uv_off << 1; x86_reg uv_off = c->uv_offx2;
YSCALEYUV2PACKEDX_ACCURATE YSCALEYUV2PACKEDX_ACCURATE
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */ /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
...@@ -895,7 +895,7 @@ static void RENAME(yuv2yuyv422_X)(SwsContext *c, const int16_t *lumFilter, ...@@ -895,7 +895,7 @@ static void RENAME(yuv2yuyv422_X)(SwsContext *c, const int16_t *lumFilter,
{ {
x86_reg dummy=0; x86_reg dummy=0;
x86_reg dstW_reg = dstW; x86_reg dstW_reg = dstW;
x86_reg uv_off = c->uv_off << 1; x86_reg uv_off = c->uv_offx2;
YSCALEYUV2PACKEDX YSCALEYUV2PACKEDX
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */ /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment