The NBPS VSX path assumes LSB-aligned samples. MSB formats store data in
the high bits and require different shifting/masking, so using the NBPS
path corrupts output.

Gate the VSX NBPS implementation for MSB formats to fall back to the
existing scalar path.

Signed-off-by: jfiusdq <[email protected]>
---
 libswscale/ppc/swscale_vsx.c | 54 +++++++++++++++++++-----------------
 1 file changed, 28 insertions(+), 26 deletions(-)

diff --git a/libswscale/ppc/swscale_vsx.c b/libswscale/ppc/swscale_vsx.c
index 727a273958..d5b262108f 100644
--- a/libswscale/ppc/swscale_vsx.c
+++ b/libswscale/ppc/swscale_vsx.c
@@ -2049,36 +2049,38 @@ av_cold void ff_sws_init_swscale_vsx(SwsInternal *c)
 #endif
 
     if (!(c->opts.flags & (SWS_BITEXACT | SWS_FULL_CHR_H_INT)) && 
!c->needAlpha) {
-        switch (c->dstBpc) {
-        case 8:
-            c->yuv2plane1 = yuv2plane1_8_vsx;
-            break;
+        if (!isDataInHighBits(dstFormat)) {
+            switch (c->dstBpc) {
+            case 8:
+                c->yuv2plane1 = yuv2plane1_8_vsx;
+                break;
 #if !HAVE_BIGENDIAN
-        case 9:
-            c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_9BE_vsx  : 
yuv2plane1_9LE_vsx;
-            c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_9BE_vsx  : 
yuv2planeX_9LE_vsx;
-            break;
-        case 10:
-            c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_10BE_vsx  : 
yuv2plane1_10LE_vsx;
-            c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_10BE_vsx  : 
yuv2planeX_10LE_vsx;
-            break;
-        case 12:
-            c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_12BE_vsx  : 
yuv2plane1_12LE_vsx;
-            c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_12BE_vsx  : 
yuv2planeX_12LE_vsx;
-            break;
-        case 14:
-            c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_14BE_vsx  : 
yuv2plane1_14LE_vsx;
-            c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_14BE_vsx  : 
yuv2planeX_14LE_vsx;
-            break;
-        case 16:
-            c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_16BE_vsx  : 
yuv2plane1_16LE_vsx;
+            case 9:
+                c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_9BE_vsx  : 
yuv2plane1_9LE_vsx;
+                c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_9BE_vsx  : 
yuv2planeX_9LE_vsx;
+                break;
+            case 10:
+                c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_10BE_vsx  : 
yuv2plane1_10LE_vsx;
+                c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_10BE_vsx  : 
yuv2planeX_10LE_vsx;
+                break;
+            case 12:
+                c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_12BE_vsx  : 
yuv2plane1_12LE_vsx;
+                c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_12BE_vsx  : 
yuv2planeX_12LE_vsx;
+                break;
+            case 14:
+                c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_14BE_vsx  : 
yuv2plane1_14LE_vsx;
+                c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_14BE_vsx  : 
yuv2planeX_14LE_vsx;
+                break;
+            case 16:
+                c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_16BE_vsx  : 
yuv2plane1_16LE_vsx;
 #if HAVE_POWER8
-            if (cpu_flags & AV_CPU_FLAG_POWER8) {
-                c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_16BE_vsx  : 
yuv2planeX_16LE_vsx;
-            }
+                if (cpu_flags & AV_CPU_FLAG_POWER8) {
+                    c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_16BE_vsx  : 
yuv2planeX_16LE_vsx;
+                }
 #endif /* HAVE_POWER8 */
-            break;
+                break;
 #endif /* !HAVE_BIGENDIAN */
+            }
         }
     }
 
-- 
2.47.3


_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to