From: James Almer <jamrial@gmail.com> To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH] swscale/swscale_unscaled: account for semi planar formats with data in the msb Date: Fri, 14 Mar 2025 11:52:33 -0300 Message-ID: <20250314145233.49307-1-jamrial@gmail.com> (raw) Fixes fate failures introduced by recent tests that exercise the faulty code. Signed-off-by: James Almer <jamrial@gmail.com> --- libswscale/swscale_unscaled.c | 74 ++++++++++++++++++----------------- tests/ref/pixfmt/p410-nv24 | 2 +- tests/ref/pixfmt/p410-p412be | 2 +- tests/ref/pixfmt/p410-p412le | 2 +- tests/ref/pixfmt/p410-p416be | 2 +- tests/ref/pixfmt/p410-p416le | 2 +- tests/ref/pixfmt/p412-nv24 | 2 +- tests/ref/pixfmt/p412-p410be | 2 +- tests/ref/pixfmt/p412-p410le | 2 +- tests/ref/pixfmt/p412-p416be | 2 +- tests/ref/pixfmt/p412-p416le | 2 +- 11 files changed, 48 insertions(+), 46 deletions(-) diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c index 1ab36b9568..92d5386567 100644 --- a/libswscale/swscale_unscaled.c +++ b/libswscale/swscale_unscaled.c @@ -2146,17 +2146,17 @@ static int packedCopyWrapper(SwsInternal *c, const uint8_t *const src[], if (c->opts.dither == SWS_DITHER_NONE) {\ for (i = 0; i < height; i++) {\ for (j = 0; j < length-7; j+=8) {\ - tmp = (bswap(src[j+0]) + bias)>>shift; dst[j+0] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+1]) + bias)>>shift; dst[j+1] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+2]) + bias)>>shift; dst[j+2] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+3]) + bias)>>shift; dst[j+3] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+4]) + bias)>>shift; dst[j+4] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+5]) + bias)>>shift; dst[j+5] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+6]) + bias)>>shift; dst[j+6] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+7]) + bias)>>shift; dst[j+7] = dbswap(tmp - (tmp>>dst_depth));\ + tmp = ((bswap(src[j+0]) >> src_shift) + bias)>>shift; dst[j+0] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+1]) >> src_shift) + bias)>>shift; dst[j+1] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+2]) >> src_shift) + bias)>>shift; dst[j+2] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+3]) >> src_shift) + bias)>>shift; dst[j+3] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+4]) >> src_shift) + bias)>>shift; dst[j+4] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+5]) >> src_shift) + bias)>>shift; dst[j+5] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+6]) >> src_shift) + bias)>>shift; dst[j+6] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+7]) >> src_shift) + bias)>>shift; dst[j+7] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ }\ for (; j < length; j++) {\ - tmp = (bswap(src[j]) + bias)>>shift; dst[j] = dbswap(tmp - (tmp>>dst_depth));\ + tmp = (bswap(src[j]) + bias)>>shift; dst[j] = dbswap(tmp - (tmp>>dst_depth) << dst_shift);\ }\ dst += dstStride;\ src += srcStride;\ @@ -2165,17 +2165,17 @@ static int packedCopyWrapper(SwsInternal *c, const uint8_t *const src[], for (i = 0; i < height; i++) {\ const uint8_t *dither= dithers[shift-1][i&7];\ for (j = 0; j < length-7; j+=8) {\ - tmp = (bswap(src[j+0]) + dither[0])>>shift; dst[j+0] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+1]) + dither[1])>>shift; dst[j+1] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+2]) + dither[2])>>shift; dst[j+2] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+3]) + dither[3])>>shift; dst[j+3] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+4]) + dither[4])>>shift; dst[j+4] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+5]) + dither[5])>>shift; dst[j+5] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+6]) + dither[6])>>shift; dst[j+6] = dbswap(tmp - (tmp>>dst_depth));\ - tmp = (bswap(src[j+7]) + dither[7])>>shift; dst[j+7] = dbswap(tmp - (tmp>>dst_depth));\ + tmp = ((bswap(src[j+0]) >> src_shift) + dither[0])>>shift; dst[j+0] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+1]) >> src_shift) + dither[1])>>shift; dst[j+1] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+2]) >> src_shift) + dither[2])>>shift; dst[j+2] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+3]) >> src_shift) + dither[3])>>shift; dst[j+3] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+4]) >> src_shift) + dither[4])>>shift; dst[j+4] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+5]) >> src_shift) + dither[5])>>shift; dst[j+5] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+6]) >> src_shift) + dither[6])>>shift; dst[j+6] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ + tmp = ((bswap(src[j+7]) >> src_shift) + dither[7])>>shift; dst[j+7] = dbswap((tmp - (tmp>>dst_depth)) << dst_shift);\ }\ for (; j < length; j++) {\ - tmp = (bswap(src[j]) + dither[j&7])>>shift; dst[j] = dbswap(tmp - (tmp>>dst_depth));\ + tmp = (bswap(src[j]) + dither[j&7])>>shift; dst[j] = dbswap(tmp - (tmp>>dst_depth) << dst_shift);\ }\ dst += dstStride;\ src += srcStride;\ @@ -2184,14 +2184,14 @@ static int packedCopyWrapper(SwsInternal *c, const uint8_t *const src[], for (i = 0; i < height; i++) {\ const uint8_t *dither= dithers[shift-1][i&7];\ for (j = 0; j < length-7; j+=8) {\ - tmp = bswap(src[j+0]); dst[j+0] = dbswap((tmp - (tmp>>dst_depth) + dither[0])>>shift);\ - tmp = bswap(src[j+1]); dst[j+1] = dbswap((tmp - (tmp>>dst_depth) + dither[1])>>shift);\ - tmp = bswap(src[j+2]); dst[j+2] = dbswap((tmp - (tmp>>dst_depth) + dither[2])>>shift);\ - tmp = bswap(src[j+3]); dst[j+3] = dbswap((tmp - (tmp>>dst_depth) + dither[3])>>shift);\ - tmp = bswap(src[j+4]); dst[j+4] = dbswap((tmp - (tmp>>dst_depth) + dither[4])>>shift);\ - tmp = bswap(src[j+5]); dst[j+5] = dbswap((tmp - (tmp>>dst_depth) + dither[5])>>shift);\ - tmp = bswap(src[j+6]); dst[j+6] = dbswap((tmp - (tmp>>dst_depth) + dither[6])>>shift);\ - tmp = bswap(src[j+7]); dst[j+7] = dbswap((tmp - (tmp>>dst_depth) + dither[7])>>shift);\ + tmp = bswap(src[j+0]) >> src_shift; dst[j+0] = dbswap(((tmp - (tmp>>dst_depth) + dither[0])>>shift) << dst_shift);\ + tmp = bswap(src[j+1]) >> src_shift; dst[j+1] = dbswap(((tmp - (tmp>>dst_depth) + dither[1])>>shift) << dst_shift);\ + tmp = bswap(src[j+2]) >> src_shift; dst[j+2] = dbswap(((tmp - (tmp>>dst_depth) + dither[2])>>shift) << dst_shift);\ + tmp = bswap(src[j+3]) >> src_shift; dst[j+3] = dbswap(((tmp - (tmp>>dst_depth) + dither[3])>>shift) << dst_shift);\ + tmp = bswap(src[j+4]) >> src_shift; dst[j+4] = dbswap(((tmp - (tmp>>dst_depth) + dither[4])>>shift) << dst_shift);\ + tmp = bswap(src[j+5]) >> src_shift; dst[j+5] = dbswap(((tmp - (tmp>>dst_depth) + dither[5])>>shift) << dst_shift);\ + tmp = bswap(src[j+6]) >> src_shift; dst[j+6] = dbswap(((tmp - (tmp>>dst_depth) + dither[6])>>shift) << dst_shift);\ + tmp = bswap(src[j+7]) >> src_shift; dst[j+7] = dbswap(((tmp - (tmp>>dst_depth) + dither[7])>>shift) << dst_shift);\ }\ for (; j < length; j++) {\ tmp = bswap(src[j]); dst[j] = dbswap((tmp - (tmp>>dst_depth) + dither[j&7])>>shift);\ @@ -2235,6 +2235,8 @@ static int planarCopyWrapper(SwsInternal *c, const uint8_t *const src[], ) { const int src_depth = desc_src->comp[plane].depth; const int dst_depth = desc_dst->comp[plane].depth; + const int src_shift = desc_src->comp[plane].shift; + const int dst_shift = desc_dst->comp[plane].shift; const uint16_t *srcPtr2 = (const uint16_t *) srcPtr; uint16_t *dstPtr2 = (uint16_t*)dstPtr; @@ -2250,11 +2252,11 @@ static int planarCopyWrapper(SwsInternal *c, const uint8_t *const src[], #define COPY816(w)\ if (shiftonly) {\ for (j = 0; j < length; j++)\ - w(&dstPtr2[j], srcPtr[j]<<(dst_depth-8));\ + w(&dstPtr2[j], (srcPtr[j]<<(dst_depth-8)) << dst_shift);\ } else {\ for (j = 0; j < length; j++)\ - w(&dstPtr2[j], (srcPtr[j]<<(dst_depth-8)) |\ - (srcPtr[j]>>(2*8-dst_depth)));\ + w(&dstPtr2[j], ((srcPtr[j]<<(dst_depth-8)) |\ + (srcPtr[j]>>(2*8-dst_depth))) << dst_shift);\ } if(isBE(c->opts.dst_format)){ COPY816(AV_WB16) @@ -2274,13 +2276,13 @@ static int planarCopyWrapper(SwsInternal *c, const uint8_t *const src[], #if HAVE_FAST_64BIT #define FAST_COPY_UP(shift) \ for (; j < length - 3; j += 4) { \ - uint64_t v = AV_RN64A(srcPtr2 + j); \ + uint64_t v = AV_RN64A(srcPtr2 + j) >> src_shift; \ AV_WN64A(dstPtr2 + j, v << shift); \ } #else #define FAST_COPY_UP(shift) \ for (; j < length - 1; j += 2) { \ - uint32_t v = AV_RN32A(srcPtr2 + j); \ + uint32_t v = AV_RN32A(srcPtr2 + j) >> src_shift; \ AV_WN32A(dstPtr2 + j, v << shift); \ } #endif @@ -2293,14 +2295,14 @@ static int planarCopyWrapper(SwsInternal *c, const uint8_t *const src[], #define COPY_UP(r,w) \ if(shiftonly){\ for (; j < length; j++){ \ - unsigned int v= r(&srcPtr2[j]);\ - w(&dstPtr2[j], v<<(dst_depth-src_depth));\ + unsigned int v= r(&srcPtr2[j]) >> src_shift;\ + w(&dstPtr2[j], (v << (dst_depth-src_depth)) << dst_shift);\ }\ }else{\ for (; j < length; j++){ \ - unsigned int v= r(&srcPtr2[j]);\ - w(&dstPtr2[j], (v<<(dst_depth-src_depth)) | \ - (v>>(2*src_depth-dst_depth)));\ + unsigned int v= r(&srcPtr2[j]) >> src_shift;\ + w(&dstPtr2[j], ((v<<(dst_depth-src_depth)) | \ + (v>>(2*src_depth-dst_depth))) << dst_shift);\ }\ } if(isBE(c->opts.src_format)){ diff --git a/tests/ref/pixfmt/p410-nv24 b/tests/ref/pixfmt/p410-nv24 index a13bc773ae..8996a24afb 100644 --- a/tests/ref/pixfmt/p410-nv24 +++ b/tests/ref/pixfmt/p410-nv24 @@ -1,2 +1,2 @@ -65d33af5a5828eb16b42573e9720b370 *tests/data/pixfmt/p410-nv24.yuv +bd4ba14d2828d10001aa6111adda31a8 *tests/data/pixfmt/p410-nv24.yuv 15206400 tests/data/pixfmt/p410-nv24.yuv diff --git a/tests/ref/pixfmt/p410-p412be b/tests/ref/pixfmt/p410-p412be index 3e033d71a0..bfcb2aa7e1 100644 --- a/tests/ref/pixfmt/p410-p412be +++ b/tests/ref/pixfmt/p410-p412be @@ -1,2 +1,2 @@ -1b2996e48f9f2f9c08b47a7af2d1ad3a *tests/data/pixfmt/p410-p412be.yuv +60b454bfd6f48b64cc24de3041d0a01d *tests/data/pixfmt/p410-p412be.yuv 15206400 tests/data/pixfmt/p410-p412be.yuv diff --git a/tests/ref/pixfmt/p410-p412le b/tests/ref/pixfmt/p410-p412le index a80edad6c3..42823bf4d7 100644 --- a/tests/ref/pixfmt/p410-p412le +++ b/tests/ref/pixfmt/p410-p412le @@ -1,2 +1,2 @@ -1b2996e48f9f2f9c08b47a7af2d1ad3a *tests/data/pixfmt/p410-p412le.yuv +60b454bfd6f48b64cc24de3041d0a01d *tests/data/pixfmt/p410-p412le.yuv 15206400 tests/data/pixfmt/p410-p412le.yuv diff --git a/tests/ref/pixfmt/p410-p416be b/tests/ref/pixfmt/p410-p416be index 0c944745fd..67d224753c 100644 --- a/tests/ref/pixfmt/p410-p416be +++ b/tests/ref/pixfmt/p410-p416be @@ -1,2 +1,2 @@ -0a3bffd9200664676aa69684570a0053 *tests/data/pixfmt/p410-p416be.yuv +60b454bfd6f48b64cc24de3041d0a01d *tests/data/pixfmt/p410-p416be.yuv 15206400 tests/data/pixfmt/p410-p416be.yuv diff --git a/tests/ref/pixfmt/p410-p416le b/tests/ref/pixfmt/p410-p416le index 8eaa12cccd..f7be585a49 100644 --- a/tests/ref/pixfmt/p410-p416le +++ b/tests/ref/pixfmt/p410-p416le @@ -1,2 +1,2 @@ -cffbc4dedbfc209aec8bb4921c19fbf2 *tests/data/pixfmt/p410-p416le.yuv +60b454bfd6f48b64cc24de3041d0a01d *tests/data/pixfmt/p410-p416le.yuv 15206400 tests/data/pixfmt/p410-p416le.yuv diff --git a/tests/ref/pixfmt/p412-nv24 b/tests/ref/pixfmt/p412-nv24 index 074f07eb36..f7cf14c2e0 100644 --- a/tests/ref/pixfmt/p412-nv24 +++ b/tests/ref/pixfmt/p412-nv24 @@ -1,2 +1,2 @@ -5400f2bfef1b3dc0fcea1fd8ef91e2c8 *tests/data/pixfmt/p412-nv24.yuv +bd4ba14d2828d10001aa6111adda31a8 *tests/data/pixfmt/p412-nv24.yuv 15206400 tests/data/pixfmt/p412-nv24.yuv diff --git a/tests/ref/pixfmt/p412-p410be b/tests/ref/pixfmt/p412-p410be index 245d2f4c43..72df60c699 100644 --- a/tests/ref/pixfmt/p412-p410be +++ b/tests/ref/pixfmt/p412-p410be @@ -1,2 +1,2 @@ -1e268eb904e8d173d1585474d12e6f10 *tests/data/pixfmt/p412-p410be.yuv +51e761c143c3fce8e9921d8cceb0a433 *tests/data/pixfmt/p412-p410be.yuv 15206400 tests/data/pixfmt/p412-p410be.yuv diff --git a/tests/ref/pixfmt/p412-p410le b/tests/ref/pixfmt/p412-p410le index 04aa4eda77..4bd47bcf21 100644 --- a/tests/ref/pixfmt/p412-p410le +++ b/tests/ref/pixfmt/p412-p410le @@ -1,2 +1,2 @@ -1e268eb904e8d173d1585474d12e6f10 *tests/data/pixfmt/p412-p410le.yuv +51e761c143c3fce8e9921d8cceb0a433 *tests/data/pixfmt/p412-p410le.yuv 15206400 tests/data/pixfmt/p412-p410le.yuv diff --git a/tests/ref/pixfmt/p412-p416be b/tests/ref/pixfmt/p412-p416be index ec2b35b705..1fe9935d2f 100644 --- a/tests/ref/pixfmt/p412-p416be +++ b/tests/ref/pixfmt/p412-p416be @@ -1,2 +1,2 @@ -598b43d980ff2a5e24ee4003befcb875 *tests/data/pixfmt/p412-p416be.yuv +9b5fc804354cf299fcc4c3f7bd2781ad *tests/data/pixfmt/p412-p416be.yuv 15206400 tests/data/pixfmt/p412-p416be.yuv diff --git a/tests/ref/pixfmt/p412-p416le b/tests/ref/pixfmt/p412-p416le index 60b159fac0..07fdcfcc26 100644 --- a/tests/ref/pixfmt/p412-p416le +++ b/tests/ref/pixfmt/p412-p416le @@ -1,2 +1,2 @@ -598b43d980ff2a5e24ee4003befcb875 *tests/data/pixfmt/p412-p416le.yuv +9b5fc804354cf299fcc4c3f7bd2781ad *tests/data/pixfmt/p412-p416le.yuv 15206400 tests/data/pixfmt/p412-p416le.yuv -- 2.48.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next reply other threads:[~2025-03-14 14:53 UTC|newest] Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top 2025-03-14 14:52 James Almer [this message] 2025-03-15 19:31 ` James Almer
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20250314145233.49307-1-jamrial@gmail.com \ --to=jamrial@gmail.com \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git