diff --git a/libavcodec/mips/hevc_lpf_sao_msa.c b/libavcodec/mips/hevc_lpf_sao_msa.c
index 1d77432..3472d32 100644
--- a/libavcodec/mips/hevc_lpf_sao_msa.c
+++ b/libavcodec/mips/hevc_lpf_sao_msa.c
@@ -1265,54 +1265,51 @@ static void hevc_sao_edge_filter_0degree_4width_msa(uint8_t *dst,
                                                     int16_t *sao_offset_val,
                                                     int32_t height)  {
-    int32_t h_cnt;
     uint32_t dst_val0, dst_val1;
-    v8i16 edge_idx = { 1, 2, 0, 3, 4, 0, 0, 0 };
+    v16u8 cmp_minus10, diff_minus10, diff_minus11, src_minus10, src_minus11;
+    v16i8 edge_idx = { 1, 2, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+    v16i8 sao_offset = LD_SB(sao_offset_val);
+    v16i8 src_plus10, offset, src0, dst0;
     v16u8 const1 = (v16u8) __msa_ldi_b(1);
-    v16u8 cmp_minus10, diff_minus10, cmp_minus11, diff_minus11;
-    v16u8 src_minus10, src_minus11;
     v16i8 zero = { 0 };
-    v16i8 src_zero0, src_zero1, src_plus10, src_plus11, dst0;
-    v8i16 offset_mask0, offset_mask1;
-    v8i16 sao_offset, src00, src01;
 
-    sao_offset = LD_SH(sao_offset_val);
+    sao_offset = __msa_pckev_b(sao_offset, sao_offset);
     src -= 1;
 
-    for (h_cnt = (height >> 1); h_cnt--;) {
-        LD_UB2(src, src_stride, src_minus10, src_minus11);
+    /* load in advance */
+    LD_UB2(src, src_stride, src_minus10, src_minus11);
+
+    for (height -= 2; height; height -= 2) {
         src += (2 * src_stride);
 
-        SLDI_B2_0_SB(src_minus10, src_minus11, src_zero0, src_zero1, 1);
-        SLDI_B2_0_SB(src_minus10, src_minus11, src_plus10, src_plus11, 2);
-        ILVR_B2_UB(src_plus10, src_minus10, src_plus11, src_minus11,
-                   src_minus10, src_minus11);
-        ILVR_B2_SB(src_zero0, src_zero0, src_zero1, src_zero1, src_zero0,
-                   src_zero1);
+        src_minus10 = (v16u8) __msa_pckev_d((v2i64) src_minus11,
+                                            (v2i64) src_minus10);
 
-        cmp_minus10 = ((v16u8) src_zero0 == src_minus10);
+        src0 = (v16i8) __msa_sldi_b(zero, (v16i8) src_minus10, 1);
+        src_plus10 = (v16i8) __msa_sldi_b(zero, (v16i8) src_minus10, 
+ 2);
+
+        cmp_minus10 = ((v16u8) src0 == src_minus10);
         diff_minus10 = __msa_nor_v(cmp_minus10, cmp_minus10);
-        cmp_minus10 = (src_minus10 < (v16u8) src_zero0);
+        cmp_minus10 = (src_minus10 < (v16u8) src0);
         diff_minus10 = __msa_bmnz_v(diff_minus10, const1, cmp_minus10);
 
-        cmp_minus11 = ((v16u8) src_zero1 == src_minus11);
-        diff_minus11 = __msa_nor_v(cmp_minus11, cmp_minus11);
-        cmp_minus11 = (src_minus11 < (v16u8) src_zero1);
-        diff_minus11 = __msa_bmnz_v(diff_minus11, const1, cmp_minus11);
+        cmp_minus10 = ((v16u8) src0 == (v16u8) src_plus10);
+        diff_minus11 = __msa_nor_v(cmp_minus10, cmp_minus10);
+        cmp_minus10 = ((v16u8) src_plus10 < (v16u8) src0);
+        diff_minus11 = __msa_bmnz_v(diff_minus11, const1, cmp_minus10);
 
-        offset_mask0 = (v8i16) (__msa_hadd_u_h(diff_minus10, diff_minus10) + 2);
-        offset_mask1 = (v8i16) (__msa_hadd_u_h(diff_minus11, diff_minus11) + 2);
+        offset = (v16i8) diff_minus10 + (v16i8) diff_minus11 + 2;
 
-        VSHF_H2_SH(edge_idx, edge_idx, sao_offset, sao_offset, offset_mask0,
-                   offset_mask0, offset_mask0, offset_mask0);
-        VSHF_H2_SH(edge_idx, edge_idx, sao_offset, sao_offset, offset_mask1,
-                   offset_mask1, offset_mask1, offset_mask1);
-        ILVEV_B2_SH(src_zero0, zero, src_zero1, zero, src00, src01);
-        ADD2(offset_mask0, src00, offset_mask1, src01, offset_mask0,
-             offset_mask1);
-        CLIP_SH2_0_255(offset_mask0, offset_mask1);
+        /* load in advance */
+        LD_UB2(src, src_stride, src_minus10, src_minus11);
+
+        VSHF_B2_SB(edge_idx, edge_idx, sao_offset, sao_offset, offset, offset,
+                   offset, offset);
+
+        src0 = (v16i8) __msa_xori_b((v16u8) src0, 128);
+        dst0 = __msa_adds_s_b(src0, offset);
+        dst0 = (v16i8) __msa_xori_b((v16u8) dst0, 128);
 
-        dst0 = __msa_pckev_b((v16i8) offset_mask1, (v16i8) offset_mask0);
         dst_val0 = __msa_copy_u_w((v4i32) dst0, 0);
         dst_val1 = __msa_copy_u_w((v4i32) dst0, 2);
         SW(dst_val0, dst);
@@ -1320,6 +1317,37 @@ static void hevc_sao_edge_filter_0degree_4width_msa(uint8_t *dst,
