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.
This commit is contained in:
Ronald S. Bultje 2011-07-08 14:52:52 -07:00
parent bda168d2b0
commit 42d622fab3
9 changed files with 27 additions and 27 deletions

View file

@ -1053,7 +1053,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_px; 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++) {

View file

@ -81,7 +81,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;
YSCALEYUV2YV12X(CHR_MMX_FILTER_OFFSET, uDest, chrDstW, 0) YSCALEYUV2YV12X(CHR_MMX_FILTER_OFFSET, uDest, chrDstW, 0)
YSCALEYUV2YV12X(CHR_MMX_FILTER_OFFSET, vDest - uv_off, chrDstW + uv_off, uv_off) YSCALEYUV2YV12X(CHR_MMX_FILTER_OFFSET, vDest - uv_off, chrDstW + uv_off, uv_off)
} }
@ -164,7 +164,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;
YSCALEYUV2YV12X_ACCURATE(CHR_MMX_FILTER_OFFSET, uDest, chrDstW, 0) YSCALEYUV2YV12X_ACCURATE(CHR_MMX_FILTER_OFFSET, uDest, chrDstW, 0)
YSCALEYUV2YV12X_ACCURATE(CHR_MMX_FILTER_OFFSET, vDest - uv_off, chrDstW + uv_off, uv_off) YSCALEYUV2YV12X_ACCURATE(CHR_MMX_FILTER_OFFSET, vDest - uv_off, chrDstW + uv_off, uv_off)
} }
@ -473,7 +473,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
@ -506,7 +506,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
@ -563,7 +563,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
@ -587,7 +587,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
@ -640,7 +640,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
@ -664,7 +664,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
@ -797,7 +797,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
@ -821,7 +821,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
@ -862,7 +862,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 */
@ -883,7 +883,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 */

View file

@ -42,8 +42,8 @@ yuv422p16be 86ad3447f97969ce095afeef81fa9abf
yuv422p16le a53a9b451f4a81eeae33362c1bbd07f8 yuv422p16le a53a9b451f4a81eeae33362c1bbd07f8
yuv440p 5a064afe2b453bb52cdb3f176b1aa1cf yuv440p 5a064afe2b453bb52cdb3f176b1aa1cf
yuv444p 0a98447b78fd476aa39686da6a74fa2e yuv444p 0a98447b78fd476aa39686da6a74fa2e
yuv444p16be 95db370ae765dd3d10b7def14704ae73 yuv444p16be 12554ba5f143126dc5e886b9a8be37e9
yuv444p16le 36b969179b5ad9d312a0d1e1cd6bc402 yuv444p16le 35872903aefd0f545255a4452ccc262e
yuva420p a29884f3f3dfe1e00b961bc17bef3d47 yuva420p a29884f3f3dfe1e00b961bc17bef3d47
yuvj420p 32eec78ba51857b16ce9b813a49b7189 yuvj420p 32eec78ba51857b16ce9b813a49b7189
yuvj422p 0dfa0ed434f73be51428758c69e082cb yuvj422p 0dfa0ed434f73be51428758c69e082cb

View file

@ -42,8 +42,8 @@ yuv422p16be 86ad3447f97969ce095afeef81fa9abf
yuv422p16le a53a9b451f4a81eeae33362c1bbd07f8 yuv422p16le a53a9b451f4a81eeae33362c1bbd07f8
yuv440p 5a064afe2b453bb52cdb3f176b1aa1cf yuv440p 5a064afe2b453bb52cdb3f176b1aa1cf
yuv444p 0a98447b78fd476aa39686da6a74fa2e yuv444p 0a98447b78fd476aa39686da6a74fa2e
yuv444p16be 95db370ae765dd3d10b7def14704ae73 yuv444p16be 12554ba5f143126dc5e886b9a8be37e9
yuv444p16le 36b969179b5ad9d312a0d1e1cd6bc402 yuv444p16le 35872903aefd0f545255a4452ccc262e
yuva420p a29884f3f3dfe1e00b961bc17bef3d47 yuva420p a29884f3f3dfe1e00b961bc17bef3d47
yuvj420p 32eec78ba51857b16ce9b813a49b7189 yuvj420p 32eec78ba51857b16ce9b813a49b7189
yuvj422p 0dfa0ed434f73be51428758c69e082cb yuvj422p 0dfa0ed434f73be51428758c69e082cb

View file

@ -33,8 +33,8 @@ yuv422p16be 6647fe1c381c148f8207c988c0e22bf0
yuv422p16le e1548c9dc51202db38a9625c8954203f yuv422p16le e1548c9dc51202db38a9625c8954203f
yuv440p 2472417d980e395ad6843cbb8b633b29 yuv440p 2472417d980e395ad6843cbb8b633b29
yuv444p 1f151980486848c96bc5585ced99003e yuv444p 1f151980486848c96bc5585ced99003e
yuv444p16be ac3b159f8c858fcdf475a8c024ee79b6 yuv444p16be 02d78b564a23df2f68cf6895d3bfe6bf
yuv444p16le 9a6863bfc5faee206065c11dc994bf0c yuv444p16le cbea9591b954ea31d6a0cb25a9aed599
yuva420p 7536753dfbc7932560fb50c921369a0e yuva420p 7536753dfbc7932560fb50c921369a0e
yuvj420p 21f891093006d42d7683b0e1d773a657 yuvj420p 21f891093006d42d7683b0e1d773a657
yuvj422p 9a43d474c407590ad8f213880586b45e yuvj422p 9a43d474c407590ad8f213880586b45e

View file

@ -33,8 +33,8 @@ yuv422p16be 9dbe0af0eb877987611cf04bfa577202
yuv422p16le 2d8f37231110177cc5e1b61c8cb4b163 yuv422p16le 2d8f37231110177cc5e1b61c8cb4b163
yuv440p a99e2b57ed601f39852715c9d675d0d3 yuv440p a99e2b57ed601f39852715c9d675d0d3
yuv444p 947e47f7bb5fdccc659d19b7df2b6fc3 yuv444p 947e47f7bb5fdccc659d19b7df2b6fc3
yuv444p16be debc96a7ec4fec0a412f9d8995bc48a2 yuv444p16be cdc7bfb08b8286d05d6a639d1bfc0d26
yuv444p16le 5b5e1348a631fc2206bb7ff851a52687 yuv444p16le 969caecaaca795477874420540d21e8b
yuva420p d83ec0c01498189f179ec574918185f1 yuva420p d83ec0c01498189f179ec574918185f1
yuvj420p df3aaaec3bb157c3bde5f0365af30f4f yuvj420p df3aaaec3bb157c3bde5f0365af30f4f
yuvj422p d113871528d510a192797af59df9c05c yuvj422p d113871528d510a192797af59df9c05c

View file

@ -42,8 +42,8 @@ yuv422p16be 86ad3447f97969ce095afeef81fa9abf
yuv422p16le a53a9b451f4a81eeae33362c1bbd07f8 yuv422p16le a53a9b451f4a81eeae33362c1bbd07f8
yuv440p 5a064afe2b453bb52cdb3f176b1aa1cf yuv440p 5a064afe2b453bb52cdb3f176b1aa1cf
yuv444p 0a98447b78fd476aa39686da6a74fa2e yuv444p 0a98447b78fd476aa39686da6a74fa2e
yuv444p16be 95db370ae765dd3d10b7def14704ae73 yuv444p16be 12554ba5f143126dc5e886b9a8be37e9
yuv444p16le 36b969179b5ad9d312a0d1e1cd6bc402 yuv444p16le 35872903aefd0f545255a4452ccc262e
yuva420p a29884f3f3dfe1e00b961bc17bef3d47 yuva420p a29884f3f3dfe1e00b961bc17bef3d47
yuvj420p 32eec78ba51857b16ce9b813a49b7189 yuvj420p 32eec78ba51857b16ce9b813a49b7189
yuvj422p 0dfa0ed434f73be51428758c69e082cb yuvj422p 0dfa0ed434f73be51428758c69e082cb

View file

@ -42,8 +42,8 @@ yuv422p16be 837945d3a771366a5a72a4ed095a4f53
yuv422p16le b8292ae9b52eb7afc3d8b93e8fd895b4 yuv422p16le b8292ae9b52eb7afc3d8b93e8fd895b4
yuv440p 461503fdb9b90451020aa3b25ddf041c yuv440p 461503fdb9b90451020aa3b25ddf041c
yuv444p 81b2eba962d12e8d64f003ac56f6faf2 yuv444p 81b2eba962d12e8d64f003ac56f6faf2
yuv444p16be cc7460f76477aa4b4c33442f67c06a89 yuv444p16be fe2c4a3708c4f44a2d91f3c413f33caf
yuv444p16le 9a5ed60d68c0a4a5155f9d376174cdf7 yuv444p16le 1b4fce808e546cd75ef01cdb91da26b5
yuva420p 8673a9131fb47de69788863f93a50eb7 yuva420p 8673a9131fb47de69788863f93a50eb7
yuvj420p 30427bd6caf5bda93a173dbebe759e09 yuvj420p 30427bd6caf5bda93a173dbebe759e09
yuvj422p fc8288f64fd149573f73cf8da05d8e6d yuvj422p fc8288f64fd149573f73cf8da05d8e6d

View file

@ -42,8 +42,8 @@ yuv422p16be 8cdfbddf2dd4c44c3efef4ee00170eba
yuv422p16le a2f421f6a1af950544081c1797de01ae yuv422p16le a2f421f6a1af950544081c1797de01ae
yuv440p 876385e96165acf51271b20e5d85a416 yuv440p 876385e96165acf51271b20e5d85a416
yuv444p 9c3c667d1613b72d15bc6d851c5eb8f7 yuv444p 9c3c667d1613b72d15bc6d851c5eb8f7
yuv444p16be b092690d22f0b26360fbf5cfd739be17 yuv444p16be c73d2f57f90060d4126241aba04876d3
yuv444p16le 18768b4ddca92d06f9713fef467276a9 yuv444p16le c9ab60ec1ae3ff50da524e83e3553add
yuva420p c705d1cf061d8c6580ac690b55f92276 yuva420p c705d1cf061d8c6580ac690b55f92276
yuvj420p 41fd02b204da0ab62452cd14b595e2e4 yuvj420p 41fd02b204da0ab62452cd14b595e2e4
yuvj422p 7f6ca9bc1812cde02036d7d29a7cce43 yuvj422p 7f6ca9bc1812cde02036d7d29a7cce43