diff mbox series

[FFmpeg-devel,v2,4/4] libavcodec: Enable runtime detection for MIPS MMI & MSA

Message ID 20200602141507.11151-5-jiaxun.yang@flygoat.com
State Superseded
Headers show
Series MIPS MSA & MMI Runtime detection support
Related show

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Jiaxun Yang June 2, 2020, 2:15 p.m. UTC
Apply optimized functions according to cpuflags.
MSA is always put after MMI as it's usually faster than MMI.

Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
---
 libavcodec/mips/blockdsp_init_mips.c        | 22 +++++++++++++-----
 libavcodec/mips/cabac.h                     |  2 +-
 libavcodec/mips/h263dsp_init_mips.c         | 12 +++++++---
 libavcodec/mips/h264chroma_init_mips.c      | 22 +++++++++++++-----
 libavcodec/mips/h264dsp_init_mips.c         | 25 ++++++++++++++++-----
 libavcodec/mips/h264pred_init_mips.c        | 25 ++++++++++++++++-----
 libavcodec/mips/h264qpel_init_mips.c        | 22 +++++++++++++-----
 libavcodec/mips/hevcdsp_init_mips.c         | 24 +++++++++++++++-----
 libavcodec/mips/hevcpred_init_mips.c        | 12 +++++++---
 libavcodec/mips/hpeldsp_init_mips.c         | 22 +++++++++++++-----
 libavcodec/mips/idctdsp_init_mips.c         | 24 +++++++++++++++-----
 libavcodec/mips/me_cmp_init_mips.c          | 12 +++++++---
 libavcodec/mips/mpegvideo_init_mips.c       | 22 +++++++++++++-----
 libavcodec/mips/mpegvideoencdsp_init_mips.c | 13 ++++++++---
 libavcodec/mips/pixblockdsp_init_mips.c     | 25 ++++++++++++++++-----
 libavcodec/mips/qpeldsp_init_mips.c         | 12 +++++++---
 libavcodec/mips/vc1dsp_init_mips.c          | 22 +++++++++++++-----
 libavcodec/mips/videodsp_init.c             | 12 +++++++---
 libavcodec/mips/vp3dsp_init_mips.c          | 22 +++++++++++++-----
 libavcodec/mips/vp8dsp_init_mips.c          | 22 +++++++++++++-----
 libavcodec/mips/vp9dsp_init_mips.c          | 22 +++++++++++++-----
 libavcodec/mips/wmv2dsp_init_mips.c         | 12 +++++++---
 libavcodec/mips/xvididct_init_mips.c        | 13 ++++++++---
 23 files changed, 312 insertions(+), 109 deletions(-)
diff mbox series

Patch

diff --git a/libavcodec/mips/blockdsp_init_mips.c b/libavcodec/mips/blockdsp_init_mips.c
index 55ac1c3e99..47170c17ef 100644
--- a/libavcodec/mips/blockdsp_init_mips.c
+++ b/libavcodec/mips/blockdsp_init_mips.c
@@ -19,6 +19,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "blockdsp_mips.h"
 
 #if HAVE_MSA
@@ -30,6 +31,10 @@  static av_cold void blockdsp_init_msa(BlockDSPContext *c)
     c->fill_block_tab[0] = ff_fill_block16_msa;
     c->fill_block_tab[1] = ff_fill_block8_msa;
 }
+#else
+static av_cold void blockdsp_init_msa(BlockDSPContext *c)
+{
+}
 #endif  // #if HAVE_MSA
 
 #if HAVE_MMI
@@ -41,14 +46,19 @@  static av_cold void blockdsp_init_mmi(BlockDSPContext *c)
     c->fill_block_tab[0] = ff_fill_block16_mmi;
     c->fill_block_tab[1] = ff_fill_block8_mmi;
 }
+#else
+static av_cold void blockdsp_init_mmi(BlockDSPContext *c)
+{
+}
 #endif /* HAVE_MMI */
 
 void ff_blockdsp_init_mips(BlockDSPContext *c)
 {
-#if HAVE_MMI
-    blockdsp_init_mmi(c);
-#endif /* HAVE_MMI */
-#if HAVE_MSA
-    blockdsp_init_msa(c);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        blockdsp_init_mmi(c);
+
+    if (have_msa(cpu_flags))
+        blockdsp_init_msa(c);
 }
diff --git a/libavcodec/mips/cabac.h b/libavcodec/mips/cabac.h
index 03b5010edc..c595915eda 100644
--- a/libavcodec/mips/cabac.h
+++ b/libavcodec/mips/cabac.h
@@ -25,7 +25,7 @@ 
 #define AVCODEC_MIPS_CABAC_H
 
 #include "libavcodec/cabac.h"
-#include "libavutil/mips/mmiutils.h"
+#include "libavutil/mips/asmdefs.h"
 #include "config.h"
 
 #define get_cabac_inline get_cabac_inline_mips
diff --git a/libavcodec/mips/h263dsp_init_mips.c b/libavcodec/mips/h263dsp_init_mips.c
index 09bd93707d..b88b76368b 100644
--- a/libavcodec/mips/h263dsp_init_mips.c
+++ b/libavcodec/mips/h263dsp_init_mips.c
@@ -18,6 +18,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "h263dsp_mips.h"
 
 #if HAVE_MSA
@@ -26,11 +27,16 @@  static av_cold void h263dsp_init_msa(H263DSPContext *c)
     c->h263_h_loop_filter = ff_h263_h_loop_filter_msa;
     c->h263_v_loop_filter = ff_h263_v_loop_filter_msa;
 }
+#else
+static av_cold void h263dsp_init_msa(H263DSPContext *c)
+{
+}
 #endif  // #if HAVE_MSA
 
 av_cold void ff_h263dsp_init_mips(H263DSPContext *c)
 {
-#if HAVE_MSA
-    h263dsp_init_msa(c);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_msa(cpu_flags))
+        h263dsp_init_msa(c);
 }
diff --git a/libavcodec/mips/h264chroma_init_mips.c b/libavcodec/mips/h264chroma_init_mips.c
index ae817e47ae..84d335da59 100644
--- a/libavcodec/mips/h264chroma_init_mips.c
+++ b/libavcodec/mips/h264chroma_init_mips.c
@@ -19,6 +19,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "h264chroma_mips.h"
 
 #if HAVE_MSA
@@ -36,6 +37,10 @@  static av_cold void h264chroma_init_msa(H264ChromaContext *c, int bit_depth)
         c->avg_h264_chroma_pixels_tab[2] = ff_avg_h264_chroma_mc2_msa;
     }
 }
+#else
+static av_cold void h264chroma_init_msa(H264ChromaContext *c, int bit_depth)
+{
+}
 #endif  // #if HAVE_MSA
 
 #if HAVE_MMI
@@ -50,14 +55,19 @@  static av_cold void h264chroma_init_mmi(H264ChromaContext *c, int bit_depth)
         c->avg_h264_chroma_pixels_tab[1] = ff_avg_h264_chroma_mc4_mmi;
     }
 }
+#else
+static av_cold void h264chroma_init_mmi(H264ChromaContext *c, int bit_depth)
+{
+}
 #endif /* HAVE_MMI */
 
 av_cold void ff_h264chroma_init_mips(H264ChromaContext *c, int bit_depth)
 {
-#if HAVE_MMI
-    h264chroma_init_mmi(c, bit_depth);
-#endif /* HAVE_MMI */
-#if HAVE_MSA
-    h264chroma_init_msa(c, bit_depth);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        h264chroma_init_mmi(c, bit_depth);
+
+    if (have_msa(cpu_flags))
+        h264chroma_init_msa(c, bit_depth);
 }
diff --git a/libavcodec/mips/h264dsp_init_mips.c b/libavcodec/mips/h264dsp_init_mips.c
index dc08a25800..7b89cfc393 100644
--- a/libavcodec/mips/h264dsp_init_mips.c
+++ b/libavcodec/mips/h264dsp_init_mips.c
@@ -19,6 +19,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "h264dsp_mips.h"
 
 #if HAVE_MSA
@@ -79,6 +80,12 @@  static av_cold void h264dsp_init_msa(H264DSPContext *c,
         c->h264_luma_dc_dequant_idct = ff_h264_deq_idct_luma_dc_msa;
     }  // if (8 == bit_depth)
 }
+#else
+static av_cold void h264dsp_init_msa(H264DSPContext *c,
+                                     const int bit_depth,
+                                     const int chroma_format_idc)
+{
+}
 #endif  // #if HAVE_MSA
 
 #if HAVE_MMI
@@ -133,15 +140,21 @@  static av_cold void h264dsp_init_mmi(H264DSPContext * c, const int bit_depth,
         c->h264_h_loop_filter_luma_intra = ff_deblock_h_luma_intra_8_mmi;
     }
 }
+#else
+static av_cold void h264dsp_init_mmi(H264DSPContext * c, const int bit_depth,
+        const int chroma_format_idc)
+{
+}
 #endif /* HAVE_MMI */
 
 av_cold void ff_h264dsp_init_mips(H264DSPContext *c, const int bit_depth,
                                   const int chroma_format_idc)
 {
-#if HAVE_MMI
-    h264dsp_init_mmi(c, bit_depth, chroma_format_idc);
-#endif /* HAVE_MMI */
-#if HAVE_MSA
-    h264dsp_init_msa(c, bit_depth, chroma_format_idc);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        h264dsp_init_mmi(c, bit_depth, chroma_format_idc);
+
+    if (have_msa(cpu_flags))
+        h264dsp_init_msa(c, bit_depth, chroma_format_idc);
 }
diff --git a/libavcodec/mips/h264pred_init_mips.c b/libavcodec/mips/h264pred_init_mips.c
index e537ad8bd4..633d157b50 100644
--- a/libavcodec/mips/h264pred_init_mips.c
+++ b/libavcodec/mips/h264pred_init_mips.c
@@ -19,6 +19,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "config.h"
 #include "h264dsp_mips.h"
 #include "h264pred_mips.h"
@@ -91,6 +92,12 @@  static av_cold void h264_pred_init_msa(H264PredContext *h, int codec_id,
         h->pred16x16[DC_128_PRED8x8] = ff_h264_intra_pred_dc_128_16x16_msa;
     }
 }
+#else
+static av_cold void h264_pred_init_msa(H264PredContext *h, int codec_id,
+                                       const int bit_depth,
+                                       const int chroma_format_idc)
+{
+}
 #endif  // #if HAVE_MSA
 
 #if HAVE_MMI
@@ -137,16 +144,22 @@  static av_cold void h264_pred_init_mmi(H264PredContext *h, int codec_id,
         }
     }
 }
+#else
+static av_cold void h264_pred_init_mmi(H264PredContext *h, int codec_id,
+        const int bit_depth, const int chroma_format_idc)
+{
+}
 #endif /* HAVE_MMI */
 
 av_cold void ff_h264_pred_init_mips(H264PredContext *h, int codec_id,
                                     int bit_depth,
                                     const int chroma_format_idc)
 {
-#if HAVE_MMI
-    h264_pred_init_mmi(h, codec_id, bit_depth, chroma_format_idc);
-#endif /* HAVE_MMI */
-#if HAVE_MSA
-    h264_pred_init_msa(h, codec_id, bit_depth, chroma_format_idc);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        h264_pred_init_mmi(h, codec_id, bit_depth, chroma_format_idc);
+
+    if (have_msa(cpu_flags))
+        h264_pred_init_msa(h, codec_id, bit_depth, chroma_format_idc);
 }
diff --git a/libavcodec/mips/h264qpel_init_mips.c b/libavcodec/mips/h264qpel_init_mips.c
index 33bae3093a..c1d584b14b 100644
--- a/libavcodec/mips/h264qpel_init_mips.c
+++ b/libavcodec/mips/h264qpel_init_mips.c
@@ -19,6 +19,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "h264dsp_mips.h"
 
 #if HAVE_MSA
@@ -127,6 +128,10 @@  static av_cold void h264qpel_init_msa(H264QpelContext *c, int bit_depth)
         c->avg_h264_qpel_pixels_tab[2][15] = ff_avg_h264_qpel4_mc33_msa;
     }
 }
+#else
+static av_cold void h264qpel_init_msa(H264QpelContext *c, int bit_depth)
+{
+}
 #endif  // #if HAVE_MSA
 
 #if HAVE_MMI
@@ -236,14 +241,19 @@  static av_cold void h264qpel_init_mmi(H264QpelContext *c, int bit_depth)
         c->avg_h264_qpel_pixels_tab[2][15] = ff_avg_h264_qpel4_mc33_mmi;
     }
 }
+#else
+static av_cold void h264qpel_init_mmi(H264QpelContext *c, int bit_depth)
+{
+}
 #endif /* HAVE_MMI */
 
 av_cold void ff_h264qpel_init_mips(H264QpelContext *c, int bit_depth)
 {
-#if HAVE_MMI
-    h264qpel_init_mmi(c, bit_depth);
-#endif /* HAVE_MMI */
-#if HAVE_MSA
-    h264qpel_init_msa(c, bit_depth);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        h264qpel_init_mmi(c, bit_depth);
+
+    if (have_msa(cpu_flags))
+        h264qpel_init_msa(c, bit_depth);
 }
diff --git a/libavcodec/mips/hevcdsp_init_mips.c b/libavcodec/mips/hevcdsp_init_mips.c
index 88337f462e..246d71b74e 100644
--- a/libavcodec/mips/hevcdsp_init_mips.c
+++ b/libavcodec/mips/hevcdsp_init_mips.c
@@ -18,6 +18,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "libavcodec/mips/hevcdsp_mips.h"
 
 #if HAVE_MMI
@@ -90,6 +91,11 @@  static av_cold void hevc_dsp_init_mmi(HEVCDSPContext *c,
         c->put_hevc_qpel_uni[9][1][1] = ff_hevc_put_hevc_qpel_uni_hv64_8_mmi;
     }
 }
+#else
+static av_cold void hevc_dsp_init_mmi(HEVCDSPContext *c,
+                                      const int bit_depth)
+{
+}
 #endif // #if HAVE_MMI
 
 #if HAVE_MSA
@@ -516,14 +522,20 @@  static av_cold void hevc_dsp_init_msa(HEVCDSPContext *c,
         c->transform_4x4_luma = ff_hevc_idct_luma_4x4_msa;
     }
 }
+#else
+static av_cold void hevc_dsp_init_msa(HEVCDSPContext *c,
+                                      const int bit_depth)
+{
+}
 #endif  // #if HAVE_MSA
 
 void ff_hevc_dsp_init_mips(HEVCDSPContext *c, const int bit_depth)
 {
-#if HAVE_MMI
-    hevc_dsp_init_mmi(c, bit_depth);
-#endif  // #if HAVE_MMI
-#if HAVE_MSA
-    hevc_dsp_init_msa(c, bit_depth);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        hevc_dsp_init_mmi(c, bit_depth);
+
+    if (have_msa(cpu_flags))
+        hevc_dsp_init_msa(c, bit_depth);
 }
diff --git a/libavcodec/mips/hevcpred_init_mips.c b/libavcodec/mips/hevcpred_init_mips.c
index e987698d66..f829561ddf 100644
--- a/libavcodec/mips/hevcpred_init_mips.c
+++ b/libavcodec/mips/hevcpred_init_mips.c
@@ -18,6 +18,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "config.h"
 #include "libavutil/attributes.h"
 #include "libavcodec/mips/hevcpred_mips.h"
@@ -39,11 +40,16 @@  static av_cold void hevc_pred_init_msa(HEVCPredContext *c, const int bit_depth)
         c->pred_angular[3] = ff_pred_intra_pred_angular_3_msa;
     }
 }
+#else
+static av_cold void hevc_pred_init_msa(HEVCPredContext *c, const int bit_depth)
+{
+}
 #endif  // #if HAVE_MSA
 
 void ff_hevc_pred_init_mips(HEVCPredContext *c, const int bit_depth)
 {
-#if HAVE_MSA
-    hevc_pred_init_msa(c, bit_depth);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_msa(cpu_flags))
+        hevc_pred_init_msa(c, bit_depth);
 }
diff --git a/libavcodec/mips/hpeldsp_init_mips.c b/libavcodec/mips/hpeldsp_init_mips.c
index d6f7a9793d..9e12bde547 100644
--- a/libavcodec/mips/hpeldsp_init_mips.c
+++ b/libavcodec/mips/hpeldsp_init_mips.c
@@ -19,6 +19,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "../hpeldsp.h"
 #include "libavcodec/mips/hpeldsp_mips.h"
 
@@ -64,6 +65,10 @@  static void ff_hpeldsp_init_msa(HpelDSPContext *c, int flags)
     c->avg_pixels_tab[2][2] = ff_avg_pixels4_y2_msa;
     c->avg_pixels_tab[2][3] = ff_avg_pixels4_xy2_msa;
 }
+#else
+static void ff_hpeldsp_init_msa(HpelDSPContext *c, int flags)
+{
+}
 #endif  // #if HAVE_MSA
 
 #if HAVE_MMI
@@ -109,14 +114,19 @@  static void ff_hpeldsp_init_mmi(HpelDSPContext *c, int flags)
     c->avg_pixels_tab[2][2] = ff_avg_pixels4_y2_8_mmi;
     c->avg_pixels_tab[2][3] = ff_avg_pixels4_xy2_8_mmi;
 }
+#else
+static void ff_hpeldsp_init_mmi(HpelDSPContext *c, int flags)
+{
+}
 #endif  // #if HAVE_MMI
 
 void ff_hpeldsp_init_mips(HpelDSPContext *c, int flags)
 {
-#if HAVE_MMI
-    ff_hpeldsp_init_mmi(c, flags);
-#endif  // #if HAVE_MMI
-#if HAVE_MSA
-    ff_hpeldsp_init_msa(c, flags);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        ff_hpeldsp_init_mmi(c, flags);
+
+    if (have_msa(cpu_flags))
+        ff_hpeldsp_init_msa(c, flags);
 }
diff --git a/libavcodec/mips/idctdsp_init_mips.c b/libavcodec/mips/idctdsp_init_mips.c
index 85b76ca478..a1a5ad5449 100644
--- a/libavcodec/mips/idctdsp_init_mips.c
+++ b/libavcodec/mips/idctdsp_init_mips.c
@@ -19,6 +19,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "idctdsp_mips.h"
 #include "xvididct_mips.h"
 
@@ -40,6 +41,11 @@  static av_cold void idctdsp_init_msa(IDCTDSPContext *c, AVCodecContext *avctx,
     c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_msa;
     c->add_pixels_clamped = ff_add_pixels_clamped_msa;
 }
+#else
+static av_cold void idctdsp_init_msa(IDCTDSPContext *c, AVCodecContext *avctx,
+                                     unsigned high_bit_depth)
+{
+}
 #endif  // #if HAVE_MSA
 
 #if HAVE_MMI
@@ -60,15 +66,21 @@  static av_cold void idctdsp_init_mmi(IDCTDSPContext *c, AVCodecContext *avctx,
     c->add_pixels_clamped = ff_add_pixels_clamped_mmi;
     c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_mmi;
 }
+#else
+static av_cold void idctdsp_init_mmi(IDCTDSPContext *c, AVCodecContext *avctx,
+        unsigned high_bit_depth)
+{
+}
 #endif /* HAVE_MMI */
 
 av_cold void ff_idctdsp_init_mips(IDCTDSPContext *c, AVCodecContext *avctx,
                           unsigned high_bit_depth)
 {
-#if HAVE_MMI
-    idctdsp_init_mmi(c, avctx, high_bit_depth);
-#endif /* HAVE_MMI */
-#if HAVE_MSA
-    idctdsp_init_msa(c, avctx, high_bit_depth);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        idctdsp_init_mmi(c, avctx, high_bit_depth);
+
+    if (have_msa(cpu_flags))
+        idctdsp_init_msa(c, avctx, high_bit_depth);
 }
diff --git a/libavcodec/mips/me_cmp_init_mips.c b/libavcodec/mips/me_cmp_init_mips.c
index 219a0dc00c..3b5c01ecd4 100644
--- a/libavcodec/mips/me_cmp_init_mips.c
+++ b/libavcodec/mips/me_cmp_init_mips.c
@@ -18,6 +18,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "me_cmp_mips.h"
 
 #if HAVE_MSA
@@ -46,11 +47,16 @@  static av_cold void me_cmp_msa(MECmpContext *c, AVCodecContext *avctx)
     c->sse[2] = ff_sse4_msa;
 #endif
 }
+#else
+static av_cold void me_cmp_msa(MECmpContext *c, AVCodecContext *avctx)
+{
+}
 #endif  // #if HAVE_MSA
 
 av_cold void ff_me_cmp_init_mips(MECmpContext *c, AVCodecContext *avctx)
 {
-#if HAVE_MSA
-    me_cmp_msa(c, avctx);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_msa(cpu_flags))
+        me_cmp_msa(c, avctx);
 }
diff --git a/libavcodec/mips/mpegvideo_init_mips.c b/libavcodec/mips/mpegvideo_init_mips.c
index be77308140..cc6d4b1785 100644
--- a/libavcodec/mips/mpegvideo_init_mips.c
+++ b/libavcodec/mips/mpegvideo_init_mips.c
@@ -18,6 +18,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "h263dsp_mips.h"
 #include "mpegvideo_mips.h"
 
@@ -29,6 +30,10 @@  static av_cold void dct_unquantize_init_msa(MpegEncContext *s)
     if (!s->q_scale_type)
         s->dct_unquantize_mpeg2_inter = ff_dct_unquantize_mpeg2_inter_msa;
 }
+#else
+static av_cold void dct_unquantize_init_msa(MpegEncContext *s)
+{
+}
 #endif  // #if HAVE_MSA
 
 #if HAVE_MMI
@@ -45,14 +50,19 @@  static av_cold void dct_unquantize_init_mmi(MpegEncContext *s)
 
     s->denoise_dct= ff_denoise_dct_mmi;
 }
+#else
+static av_cold void dct_unquantize_init_mmi(MpegEncContext *s)
+{
+}
 #endif /* HAVE_MMI */
 
 av_cold void ff_mpv_common_init_mips(MpegEncContext *s)
 {
-#if HAVE_MMI
-    dct_unquantize_init_mmi(s);
-#endif /* HAVE_MMI */
-#if HAVE_MSA
-    dct_unquantize_init_msa(s);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        dct_unquantize_init_mmi(s);
+
+    if (have_msa(cpu_flags))
+        dct_unquantize_init_msa(s);
 }
diff --git a/libavcodec/mips/mpegvideoencdsp_init_mips.c b/libavcodec/mips/mpegvideoencdsp_init_mips.c
index 9bfe94e4cd..543f429aa4 100644
--- a/libavcodec/mips/mpegvideoencdsp_init_mips.c
+++ b/libavcodec/mips/mpegvideoencdsp_init_mips.c
@@ -18,6 +18,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "libavcodec/bit_depth_template.c"
 #include "h263dsp_mips.h"
 
@@ -29,12 +30,18 @@  static av_cold void mpegvideoencdsp_init_msa(MpegvideoEncDSPContext *c,
     c->pix_sum = ff_pix_sum_msa;
 #endif
 }
+#else
+static av_cold void mpegvideoencdsp_init_msa(MpegvideoEncDSPContext *c,
+                                             AVCodecContext *avctx)
+{
+}
 #endif  // #if HAVE_MSA
 
 av_cold void ff_mpegvideoencdsp_init_mips(MpegvideoEncDSPContext *c,
                                           AVCodecContext *avctx)
 {
-#if HAVE_MSA
-    mpegvideoencdsp_init_msa(c, avctx);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_msa(cpu_flags))
+        mpegvideoencdsp_init_msa(c, avctx);
 }
diff --git a/libavcodec/mips/pixblockdsp_init_mips.c b/libavcodec/mips/pixblockdsp_init_mips.c
index fd0238d79b..cf4f986ba7 100644
--- a/libavcodec/mips/pixblockdsp_init_mips.c
+++ b/libavcodec/mips/pixblockdsp_init_mips.c
@@ -19,6 +19,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "pixblockdsp_mips.h"
 
 #if HAVE_MSA
@@ -43,6 +44,12 @@  static av_cold void pixblockdsp_init_msa(PixblockDSPContext *c,
         break;
     }
 }
+#else
+static av_cold void pixblockdsp_init_msa(PixblockDSPContext *c,
+                                         AVCodecContext *avctx,
+                                         unsigned high_bit_depth)
+{
+}
 #endif  // #if HAVE_MSA
 
 #if HAVE_MMI
@@ -55,15 +62,21 @@  static av_cold void pixblockdsp_init_mmi(PixblockDSPContext *c,
         c->get_pixels = ff_get_pixels_8_mmi;
     }
 }
+#else
+static av_cold void pixblockdsp_init_mmi(PixblockDSPContext *c,
+        AVCodecContext *avctx, unsigned high_bit_depth)
+{
+}
 #endif /* HAVE_MMI */
 
 void ff_pixblockdsp_init_mips(PixblockDSPContext *c, AVCodecContext *avctx,
                               unsigned high_bit_depth)
 {
-#if HAVE_MMI
-    pixblockdsp_init_mmi(c, avctx, high_bit_depth);
-#endif /* HAVE_MMI */
-#if HAVE_MSA
-    pixblockdsp_init_msa(c, avctx, high_bit_depth);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        pixblockdsp_init_mmi(c, avctx, high_bit_depth);
+
+    if (have_msa(cpu_flags))
+        pixblockdsp_init_msa(c, avctx, high_bit_depth);
 }
diff --git a/libavcodec/mips/qpeldsp_init_mips.c b/libavcodec/mips/qpeldsp_init_mips.c
index 140e8f89c9..2d136f5d6f 100644
--- a/libavcodec/mips/qpeldsp_init_mips.c
+++ b/libavcodec/mips/qpeldsp_init_mips.c
@@ -18,6 +18,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "qpeldsp_mips.h"
 
 #if HAVE_MSA
@@ -157,11 +158,16 @@  static av_cold void qpeldsp_init_msa(QpelDSPContext *c)
     c->avg_qpel_pixels_tab[1][14] = ff_hv_mc_qpel_avg_dst_aver_v_src1_8x8_msa;
     c->avg_qpel_pixels_tab[1][15] = ff_hv_mc_qpel_avg_dst_aver_hv_src11_8x8_msa;
 }
+#else
+static av_cold void qpeldsp_init_msa(QpelDSPContext *c)
+{
+}
 #endif  // #if HAVE_MSA
 
 void ff_qpeldsp_init_mips(QpelDSPContext *c)
 {
-#if HAVE_MSA
-    qpeldsp_init_msa(c);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_msa(cpu_flags))
+        qpeldsp_init_msa(c);
 }
diff --git a/libavcodec/mips/vc1dsp_init_mips.c b/libavcodec/mips/vc1dsp_init_mips.c
index c0007ff650..09840c6b83 100644
--- a/libavcodec/mips/vc1dsp_init_mips.c
+++ b/libavcodec/mips/vc1dsp_init_mips.c
@@ -18,6 +18,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "libavutil/attributes.h"
 #include "libavcodec/vc1dsp.h"
 #include "vc1dsp_mips.h"
@@ -98,6 +99,10 @@  static av_cold void vc1dsp_init_mmi(VC1DSPContext *dsp)
     dsp->put_no_rnd_vc1_chroma_pixels_tab[1] = ff_put_no_rnd_vc1_chroma_mc4_mmi;
     dsp->avg_no_rnd_vc1_chroma_pixels_tab[1] = ff_avg_no_rnd_vc1_chroma_mc4_mmi;
 }
+#else
+static av_cold void vc1dsp_init_mmi(VC1DSPContext *dsp)
+{
+}
 #endif /* HAVE_MMI */
 
 #if HAVE_MSA
@@ -117,14 +122,19 @@  static av_cold void vc1dsp_init_msa(VC1DSPContext *dsp)
     FN_ASSIGN(put_, 3, 2, _msa);
     FN_ASSIGN(put_, 3, 3, _msa);
 }
+#else
+static av_cold void vc1dsp_init_msa(VC1DSPContext *dsp)
+{
+}
 #endif /* HAVE_MSA */
 
 av_cold void ff_vc1dsp_init_mips(VC1DSPContext *dsp)
 {
-#if HAVE_MMI
-    vc1dsp_init_mmi(dsp);
-#endif /* HAVE_MMI */
-#if HAVE_MSA
-    vc1dsp_init_msa(dsp);
-#endif /* HAVE_MSA */
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        vc1dsp_init_mmi(dsp);
+
+    if (have_msa(cpu_flags))
+        vc1dsp_init_msa(dsp);
 }
diff --git a/libavcodec/mips/videodsp_init.c b/libavcodec/mips/videodsp_init.c
index 817040420b..9d64d88a48 100644
--- a/libavcodec/mips/videodsp_init.c
+++ b/libavcodec/mips/videodsp_init.c
@@ -18,6 +18,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "config.h"
 #include "libavutil/attributes.h"
 #include "libavutil/mips/asmdefs.h"
@@ -41,11 +42,16 @@  static void prefetch_mips(uint8_t *mem, ptrdiff_t stride, int h)
         : [stride] "r" (stride)
     );
 }
+#else
+static void prefetch_mips(uint8_t *mem, ptrdiff_t stride, int h)
+{
+}
 #endif  // #if HAVE_MSA
 
 av_cold void ff_videodsp_init_mips(VideoDSPContext *ctx, int bpc)
 {
-#if HAVE_MSA
-    ctx->prefetch = prefetch_mips;
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_msa(cpu_flags))
+        ctx->prefetch = prefetch_mips;
 }
diff --git a/libavcodec/mips/vp3dsp_init_mips.c b/libavcodec/mips/vp3dsp_init_mips.c
index e183db35b6..fcbd7e8332 100644
--- a/libavcodec/mips/vp3dsp_init_mips.c
+++ b/libavcodec/mips/vp3dsp_init_mips.c
@@ -19,6 +19,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "config.h"
 #include "libavutil/attributes.h"
 #include "libavcodec/avcodec.h"
@@ -36,6 +37,10 @@  static av_cold void vp3dsp_init_msa(VP3DSPContext *c, int flags)
     c->v_loop_filter = ff_vp3_v_loop_filter_msa;
     c->h_loop_filter = ff_vp3_h_loop_filter_msa;
 }
+#else
+static av_cold void vp3dsp_init_msa(VP3DSPContext *c, int flags)
+{
+}
 #endif /* HAVE_MSA */
 
 #if HAVE_MMI
@@ -47,14 +52,19 @@  static av_cold void vp3dsp_init_mmi(VP3DSPContext *c, int flags)
     c->idct_put      = ff_vp3_idct_put_mmi;
     c->idct_dc_add   = ff_vp3_idct_dc_add_mmi;
 }
+#else
+static av_cold void vp3dsp_init_mmi(VP3DSPContext *c, int flags)
+{
+}
 #endif /* HAVE_MMI */
 
 av_cold void ff_vp3dsp_init_mips(VP3DSPContext *c, int flags)
 {
-#if HAVE_MMI
-    vp3dsp_init_mmi(c, flags);
-#endif /* HAVE_MMI */
-#if HAVE_MSA
-    vp3dsp_init_msa(c, flags);
-#endif /* HAVE_MSA */
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        vp3dsp_init_mmi(c, flags);
+
+    if (have_msa(cpu_flags))
+        vp3dsp_init_msa(c, flags);
 }
diff --git a/libavcodec/mips/vp8dsp_init_mips.c b/libavcodec/mips/vp8dsp_init_mips.c
index 7fd8fb0d32..73f172b64f 100644
--- a/libavcodec/mips/vp8dsp_init_mips.c
+++ b/libavcodec/mips/vp8dsp_init_mips.c
@@ -24,6 +24,7 @@ 
  * VP8 compatible video decoder
  */
 
+#include "libavutil/mips/cpu.h"
 #include "config.h"
 #include "libavutil/attributes.h"
 #include "libavcodec/vp8dsp.h"
@@ -104,6 +105,10 @@  static av_cold void vp8dsp_init_msa(VP8DSPContext *dsp)
     dsp->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_msa;
     dsp->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_msa;
 }
+#else
+static av_cold void vp8dsp_init_msa(VP8DSPContext *dsp)
+{
+}
 #endif  // #if HAVE_MSA
 
 #if HAVE_MMI
@@ -189,14 +194,19 @@  static av_cold void vp8dsp_init_mmi(VP8DSPContext *dsp)
     dsp->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_mmi;
     dsp->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_mmi;
 }
+#else
+static av_cold void vp8dsp_init_mmi(VP8DSPContext *dsp)
+{
+}
 #endif /* HAVE_MMI */
 
 av_cold void ff_vp8dsp_init_mips(VP8DSPContext *dsp)
 {
-#if HAVE_MMI
-    vp8dsp_init_mmi(dsp);
-#endif /* HAVE_MMI */
-#if HAVE_MSA
-    vp8dsp_init_msa(dsp);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        vp8dsp_init_mmi(dsp);
+
+    if (have_msa(cpu_flags))
+        vp8dsp_init_msa(dsp);
 }
diff --git a/libavcodec/mips/vp9dsp_init_mips.c b/libavcodec/mips/vp9dsp_init_mips.c
index 5990fa6952..ddbbd9f838 100644
--- a/libavcodec/mips/vp9dsp_init_mips.c
+++ b/libavcodec/mips/vp9dsp_init_mips.c
@@ -18,6 +18,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "config.h"
 #include "libavutil/common.h"
 #include "libavcodec/vp9dsp.h"
@@ -166,6 +167,10 @@  static av_cold void vp9dsp_init_msa(VP9DSPContext *dsp, int bpp)
     vp9dsp_mc_init_msa(dsp, bpp);
     vp9dsp_loopfilter_init_msa(dsp, bpp);
 }
+#else
+static av_cold void vp9dsp_init_msa(VP9DSPContext *dsp, int bpp)
+{
+}
 #endif  // #if HAVE_MSA
 
 #if HAVE_MMI
@@ -205,14 +210,19 @@  static av_cold void vp9dsp_init_mmi(VP9DSPContext *dsp, int bpp)
         vp9dsp_mc_init_mmi(dsp);
     }
 }
+#else
+static av_cold void vp9dsp_init_mmi(VP9DSPContext *dsp, int bpp)
+{
+}
 #endif  // #if HAVE_MMI
 
 av_cold void ff_vp9dsp_init_mips(VP9DSPContext *dsp, int bpp)
 {
-#if HAVE_MMI
-    vp9dsp_init_mmi(dsp, bpp);
-#endif  // #if HAVE_MMI
-#if HAVE_MSA
-    vp9dsp_init_msa(dsp, bpp);
-#endif  // #if HAVE_MSA
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        vp9dsp_init_mmi(dsp, bpp);
+
+    if (have_msa(cpu_flags))
+        vp9dsp_init_msa(dsp, bpp);
 }
diff --git a/libavcodec/mips/wmv2dsp_init_mips.c b/libavcodec/mips/wmv2dsp_init_mips.c
index 51dd2078d9..9dc3aeb29a 100644
--- a/libavcodec/mips/wmv2dsp_init_mips.c
+++ b/libavcodec/mips/wmv2dsp_init_mips.c
@@ -18,6 +18,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "config.h"
 #include "libavutil/attributes.h"
 #include "wmv2dsp_mips.h"
@@ -28,11 +29,16 @@  static av_cold void wmv2dsp_init_mmi(WMV2DSPContext *c)
     c->idct_add  = ff_wmv2_idct_add_mmi;
     c->idct_put  = ff_wmv2_idct_put_mmi;
 }
+#else
+static av_cold void wmv2dsp_init_mmi(WMV2DSPContext *c)
+{
+}
 #endif /* HAVE_MMI */
 
 av_cold void ff_wmv2dsp_init_mips(WMV2DSPContext *c)
 {
-#if HAVE_MMI
-    wmv2dsp_init_mmi(c);
-#endif /* HAVE_MMI */
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        wmv2dsp_init_mmi(c);
 }
diff --git a/libavcodec/mips/xvididct_init_mips.c b/libavcodec/mips/xvididct_init_mips.c
index c1d82cc30c..9193cbb401 100644
--- a/libavcodec/mips/xvididct_init_mips.c
+++ b/libavcodec/mips/xvididct_init_mips.c
@@ -18,6 +18,7 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/mips/cpu.h"
 #include "xvididct_mips.h"
 
 #if HAVE_MMI
@@ -34,12 +35,18 @@  static av_cold void xvid_idct_init_mmi(IDCTDSPContext *c, AVCodecContext *avctx,
         }
     }
 }
+#else
+static av_cold void xvid_idct_init_mmi(IDCTDSPContext *c, AVCodecContext *avctx,
+        unsigned high_bit_depth)
+{
+}
 #endif /* HAVE_MMI */
 
 av_cold void ff_xvid_idct_init_mips(IDCTDSPContext *c, AVCodecContext *avctx,
         unsigned high_bit_depth)
 {
-#if HAVE_MMI
-    xvid_idct_init_mmi(c, avctx, high_bit_depth);
-#endif /* HAVE_MMI */
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_mmi(cpu_flags))
+        xvid_idct_init_mmi(c, avctx, high_bit_depth);
 }