The res variable (pixel residual count for widths not divisible by 16) is computed once before the row loop, but DEALYUV2RGBLINERES and DEALYUV2RGBLINERES32 destructively subtract 8 from it inside the loop body. When srcSliceH > 2, subsequent row pairs get an incorrect residual count, producing wrong output for the tail pixels.
Fix by recomputing res from the constant c->opts.dst_w at the top of each row-pair iteration. Signed-off-by: David Christle <[email protected]> --- libswscale/loongarch/yuv2rgb_lasx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libswscale/loongarch/yuv2rgb_lasx.c b/libswscale/loongarch/yuv2rgb_lasx.c index 9032887ff8..d08cf10d4b 100644 --- a/libswscale/loongarch/yuv2rgb_lasx.c +++ b/libswscale/loongarch/yuv2rgb_lasx.c @@ -185,6 +185,7 @@ const uint8_t *py_2 = py_1 + srcStride[0]; \ const uint8_t *pu = src[1] + (y >> vshift) * srcStride[1]; \ const uint8_t *pv = src[2] + (y >> vshift) * srcStride[2]; \ + res = c->opts.dst_w & 15; \ for(x = 0; x < h_size; x++) { \ #define YUV2RGBFUNC32(func_name, dst_type, alpha) \ @@ -213,6 +214,7 @@ const uint8_t *py_2 = py_1 + srcStride[0]; \ const uint8_t *pu = src[1] + (y >> vshift) * srcStride[1]; \ const uint8_t *pv = src[2] + (y >> vshift) * srcStride[2]; \ + res = c->opts.dst_w & 15; \ for(x = 0; x < h_size; x++) { \ #define DEALYUV2RGBLINE \ -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
