Browse Source

swscale: [loongarch] Fix checkasm-sw_yuv2rgb failure.

Reviewed-by: 陈昊 <chenhao@loongson.cn>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Shiyou Yin 7 months ago
parent
commit
4713a5cc24
2 changed files with 56 additions and 52 deletions
  1. 54 50
      libswscale/loongarch/swscale_init_loongarch.c
  2. 2 2
      libswscale/loongarch/yuv2rgb_lasx.c

+ 54 - 50
libswscale/loongarch/swscale_init_loongarch.c

@@ -112,60 +112,64 @@ av_cold SwsFunc ff_yuv2rgb_init_loongarch(SwsContext *c)
     int cpu_flags = av_get_cpu_flags();
 #if HAVE_LASX
     if (have_lasx(cpu_flags)) {
-        switch (c->dstFormat) {
-            case AV_PIX_FMT_RGB24:
-                return yuv420_rgb24_lasx;
-            case AV_PIX_FMT_BGR24:
-                return yuv420_bgr24_lasx;
-            case AV_PIX_FMT_RGBA:
-                if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
-                    break;
-                } else
-                    return yuv420_rgba32_lasx;
-            case AV_PIX_FMT_ARGB:
-                if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
-                    break;
-                } else
-                    return yuv420_argb32_lasx;
-            case AV_PIX_FMT_BGRA:
-                if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
-                    break;
-                } else
-                    return yuv420_bgra32_lasx;
-            case AV_PIX_FMT_ABGR:
-                if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
-                    break;
-                } else
-                    return yuv420_abgr32_lasx;
+        if (c->srcFormat == AV_PIX_FMT_YUV420P) {
+            switch (c->dstFormat) {
+                case AV_PIX_FMT_RGB24:
+                    return yuv420_rgb24_lasx;
+                case AV_PIX_FMT_BGR24:
+                    return yuv420_bgr24_lasx;
+                case AV_PIX_FMT_RGBA:
+                    if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
+                        break;
+                    } else
+                        return yuv420_rgba32_lasx;
+                case AV_PIX_FMT_ARGB:
+                    if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
+                        break;
+                    } else
+                        return yuv420_argb32_lasx;
+                case AV_PIX_FMT_BGRA:
+                    if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
+                        break;
+                    } else
+                        return yuv420_bgra32_lasx;
+                case AV_PIX_FMT_ABGR:
+                    if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
+                        break;
+                    } else
+                        return yuv420_abgr32_lasx;
+            }
         }
     }
 #endif // #if HAVE_LASX
     if (have_lsx(cpu_flags)) {
-        switch (c->dstFormat) {
-            case AV_PIX_FMT_RGB24:
-                return yuv420_rgb24_lsx;
-            case AV_PIX_FMT_BGR24:
-                return yuv420_bgr24_lsx;
-            case AV_PIX_FMT_RGBA:
-                if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
-                    break;
-                } else
-                    return yuv420_rgba32_lsx;
-            case AV_PIX_FMT_ARGB:
-                if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
-                    break;
-                } else
-                    return yuv420_argb32_lsx;
-            case AV_PIX_FMT_BGRA:
-                if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
-                    break;
-                } else
-                    return yuv420_bgra32_lsx;
-            case AV_PIX_FMT_ABGR:
-                if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
-                    break;
-                } else
-                    return yuv420_abgr32_lsx;
+        if (c->srcFormat == AV_PIX_FMT_YUV420P) {
+            switch (c->dstFormat) {
+                case AV_PIX_FMT_RGB24:
+                    return yuv420_rgb24_lsx;
+                case AV_PIX_FMT_BGR24:
+                    return yuv420_bgr24_lsx;
+                case AV_PIX_FMT_RGBA:
+                    if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
+                        break;
+                    } else
+                        return yuv420_rgba32_lsx;
+                case AV_PIX_FMT_ARGB:
+                    if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
+                        break;
+                    } else
+                        return yuv420_argb32_lsx;
+                case AV_PIX_FMT_BGRA:
+                    if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
+                        break;
+                    } else
+                        return yuv420_bgra32_lsx;
+                case AV_PIX_FMT_ABGR:
+                    if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat)) {
+                        break;
+                    } else
+                        return yuv420_abgr32_lsx;
+            }
         }
     }
     return NULL;

+ 2 - 2
libswscale/loongarch/yuv2rgb_lasx.c

@@ -82,8 +82,8 @@
 #define YUV2RGB_RES                                                        \
     m_y1 = __lasx_xvldrepl_d(py_1, 0);                       \
     m_y2 = __lasx_xvldrepl_d(py_2, 0);                       \
-    m_u  = __lasx_xvldrepl_d(pu, 0);                         \
-    m_v  = __lasx_xvldrepl_d(pv, 0);                         \
+    m_u  = __lasx_xvldrepl_w(pu, 0);                         \
+    m_v  = __lasx_xvldrepl_w(pv, 0);                         \
     m_y1 = __lasx_xvilvl_d(m_y2, m_y1);                      \
     m_u  = __lasx_xvilvl_b(m_u, m_u);                        \
     m_v  = __lasx_xvilvl_b(m_v, m_v);                        \