Re: [FFmpeg-devel] [PATCH] avcodec/mips: preload data in hevc sao edge 90 degree filter msa functions
On Thu, Sep 21, 2017 at 12:01:45PM +, Manojkumar Bhosale wrote: > LGTM applied [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB I am the wisest man alive, for I know one thing, and that is that I know nothing. -- Socrates signature.asc Description: Digital signature ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] avcodec/mips: preload data in hevc sao edge 90 degree filter msa functions
LGTM -Original Message- From: ffmpeg-devel [mailto:ffmpeg-devel-boun...@ffmpeg.org] On Behalf Of kaustubh.ra...@imgtec.com Sent: Thursday, September 21, 2017 12:18 PM To: ffmpeg-devel@ffmpeg.org Cc: Kaustubh Raste Subject: [FFmpeg-devel] [PATCH] avcodec/mips: preload data in hevc sao edge 90 degree filter msa functions From: Kaustubh Raste <kaustubh.ra...@imgtec.com> Signed-off-by: Kaustubh Raste <kaustubh.ra...@imgtec.com> --- libavcodec/mips/hevc_lpf_sao_msa.c | 181 1 file changed, 122 insertions(+), 59 deletions(-) diff --git a/libavcodec/mips/hevc_lpf_sao_msa.c b/libavcodec/mips/hevc_lpf_sao_msa.c index 3472d32..39c647e 100644 --- a/libavcodec/mips/hevc_lpf_sao_msa.c +++ b/libavcodec/mips/hevc_lpf_sao_msa.c @@ -1568,23 +1568,25 @@ static void hevc_sao_edge_filter_90degree_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 }; +v16i8 edge_idx = { 1, 2, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; v16u8 const1 = (v16u8) __msa_ldi_b(1); v16i8 dst0; -v16i8 zero = { 0 }; +v16i8 sao_offset = LD_SB(sao_offset_val); v16u8 cmp_minus10, diff_minus10, cmp_minus11, diff_minus11; v16u8 src_minus10, src_minus11, src10, src11; v16i8 src_zero0, src_zero1; -v8i16 sao_offset, src00, src01, offset_mask0, offset_mask1; +v16i8 offset; +v8i16 offset_mask0, offset_mask1; -sao_offset = LD_SH(sao_offset_val); +sao_offset = __msa_pckev_b(sao_offset, sao_offset); +/* load in advance */ LD_UB2(src - src_stride, src_stride, src_minus10, src_minus11); +LD_UB2(src + src_stride, src_stride, src10, src11); -for (h_cnt = (height >> 1); h_cnt--;) { -LD_UB2(src + src_stride, src_stride, src10, src11); +for (height -= 2; height; height -= 2) { +src += (src_stride << 1); src_minus10 = (v16u8) __msa_ilvr_b((v16i8) src10, (v16i8) src_minus10); src_zero0 = __msa_ilvr_b((v16i8) src_minus11, (v16i8) src_minus11); @@ -1604,19 +1606,22 @@ static void hevc_sao_edge_filter_90degree_4width_msa(uint8_t *dst, offset_mask0 = (v8i16) (__msa_hadd_u_h(diff_minus10, diff_minus10) + 2); offset_mask1 = (v8i16) (__msa_hadd_u_h(diff_minus11, 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); -dst0 = __msa_pckev_b((v16i8) offset_mask1, (v16i8) offset_mask0); +offset = __msa_pckev_b((v16i8) offset_mask1, (v16i8) offset_mask0); +dst0 = __msa_pckev_b((v16i8) src_zero1, (v16i8) src_zero0); + +VSHF_B2_SB(edge_idx, edge_idx, sao_offset, sao_offset, offset, offset, + offset, offset); + +dst0 = (v16i8) __msa_xori_b((v16u8) dst0, 128); +dst0 = __msa_adds_s_b(dst0, offset); +dst0 = (v16i8) __msa_xori_b((v16u8) dst0, 128); src_minus10 = src10; src_minus11 = src11; +/* load in advance */ +LD_UB2(src + src_stride, src_stride, src10, src11); + dst_val0 = __msa_copy_u_w((v4i32) dst0, 0); dst_val1 = __msa_copy_u_w((v4i32) dst0, 2); SW(dst_val0, dst); @@ -1624,8 +1629,41 @@ static void hevc_sao_edge_filter_90degree_4width_msa(uint8_t *dst, SW(dst_val1, dst); dst += dst_stride; -src += (src_stride << 1); } + +src_minus10 = (v16u8) __msa_ilvr_b((v16i8) src10, (v16i8) src_minus10); +src_zero0 = __msa_ilvr_b((v16i8) src_minus11, (v16i8) src_minus11); +src_minus11 = (v16u8) __msa_ilvr_b((v16i8) src11, (v16i8) src_minus11); +src_zero1 = __msa_ilvr_b((v16i8) src10, (v16i8) src10); + +cmp_minus10 = ((v16u8) src_zero0 == src_minus10); +diff_minus10 = __msa_nor_v(cmp_minus10, cmp_minus10); +cmp_minus10 = (src_minus10 < (v16u8) src_zero0); +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); + +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 = __msa_pckev_b((v16i8) offset_mask1, (v16i8) offset_mask
[FFmpeg-devel] [PATCH] avcodec/mips: preload data in hevc sao edge 90 degree filter msa functions
From: Kaustubh RasteSigned-off-by: Kaustubh Raste --- libavcodec/mips/hevc_lpf_sao_msa.c | 181 1 file changed, 122 insertions(+), 59 deletions(-) diff --git a/libavcodec/mips/hevc_lpf_sao_msa.c b/libavcodec/mips/hevc_lpf_sao_msa.c index 3472d32..39c647e 100644 --- a/libavcodec/mips/hevc_lpf_sao_msa.c +++ b/libavcodec/mips/hevc_lpf_sao_msa.c @@ -1568,23 +1568,25 @@ static void hevc_sao_edge_filter_90degree_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 }; +v16i8 edge_idx = { 1, 2, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; v16u8 const1 = (v16u8) __msa_ldi_b(1); v16i8 dst0; -v16i8 zero = { 0 }; +v16i8 sao_offset = LD_SB(sao_offset_val); v16u8 cmp_minus10, diff_minus10, cmp_minus11, diff_minus11; v16u8 src_minus10, src_minus11, src10, src11; v16i8 src_zero0, src_zero1; -v8i16 sao_offset, src00, src01, offset_mask0, offset_mask1; +v16i8 offset; +v8i16 offset_mask0, offset_mask1; -sao_offset = LD_SH(sao_offset_val); +sao_offset = __msa_pckev_b(sao_offset, sao_offset); +/* load in advance */ LD_UB2(src - src_stride, src_stride, src_minus10, src_minus11); +LD_UB2(src + src_stride, src_stride, src10, src11); -for (h_cnt = (height >> 1); h_cnt--;) { -LD_UB2(src + src_stride, src_stride, src10, src11); +for (height -= 2; height; height -= 2) { +src += (src_stride << 1); src_minus10 = (v16u8) __msa_ilvr_b((v16i8) src10, (v16i8) src_minus10); src_zero0 = __msa_ilvr_b((v16i8) src_minus11, (v16i8) src_minus11); @@ -1604,19 +1606,22 @@ static void hevc_sao_edge_filter_90degree_4width_msa(uint8_t *dst, offset_mask0 = (v8i16) (__msa_hadd_u_h(diff_minus10, diff_minus10) + 2); offset_mask1 = (v8i16) (__msa_hadd_u_h(diff_minus11, 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); -dst0 = __msa_pckev_b((v16i8) offset_mask1, (v16i8) offset_mask0); +offset = __msa_pckev_b((v16i8) offset_mask1, (v16i8) offset_mask0); +dst0 = __msa_pckev_b((v16i8) src_zero1, (v16i8) src_zero0); + +VSHF_B2_SB(edge_idx, edge_idx, sao_offset, sao_offset, offset, offset, + offset, offset); + +dst0 = (v16i8) __msa_xori_b((v16u8) dst0, 128); +dst0 = __msa_adds_s_b(dst0, offset); +dst0 = (v16i8) __msa_xori_b((v16u8) dst0, 128); src_minus10 = src10; src_minus11 = src11; +/* load in advance */ +LD_UB2(src + src_stride, src_stride, src10, src11); + dst_val0 = __msa_copy_u_w((v4i32) dst0, 0); dst_val1 = __msa_copy_u_w((v4i32) dst0, 2); SW(dst_val0, dst); @@ -1624,8 +1629,41 @@ static void hevc_sao_edge_filter_90degree_4width_msa(uint8_t *dst, SW(dst_val1, dst); dst += dst_stride; -src += (src_stride << 1); } + +src_minus10 = (v16u8) __msa_ilvr_b((v16i8) src10, (v16i8) src_minus10); +src_zero0 = __msa_ilvr_b((v16i8) src_minus11, (v16i8) src_minus11); +src_minus11 = (v16u8) __msa_ilvr_b((v16i8) src11, (v16i8) src_minus11); +src_zero1 = __msa_ilvr_b((v16i8) src10, (v16i8) src10); + +cmp_minus10 = ((v16u8) src_zero0 == src_minus10); +diff_minus10 = __msa_nor_v(cmp_minus10, cmp_minus10); +cmp_minus10 = (src_minus10 < (v16u8) src_zero0); +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); + +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 = __msa_pckev_b((v16i8) offset_mask1, (v16i8) offset_mask0); +dst0 = __msa_pckev_b((v16i8) src_zero1, (v16i8) src_zero0); + +VSHF_B2_SB(edge_idx, edge_idx, sao_offset, sao_offset, offset, + offset, offset, offset); + +dst0 = (v16i8) __msa_xori_b((v16u8) dst0, 128); +dst0 = __msa_adds_s_b(dst0, offset); +dst0 = (v16i8) __msa_xori_b((v16u8) dst0, 128); + +dst_val0 = __msa_copy_u_w((v4i32) dst0,