History

lavc/aarch64: h264, add chroma loop filters for 10bit

Benchmarks: A53 A72 h264_h_loop_filter_chroma422_10bpp_c: 282.7 114.2 h264_h_loop_filter_chroma422_10bpp_neon: 109.5 78.5 h264_h_loop_filter_chroma_10bpp_c: 165.0 81.5 h264_h_loop_filter_chroma_10bpp_neon: 120.0 76.7 h264_h_loop_filter_chroma_intra422_10bpp_c: 323.7 124.2 h264_h_loop_filter_chroma_intra422_10bpp_neon: 155.0 102.7 h264_h_loop_filter_chroma_intra_10bpp_c: 121.0 49.5 h264_h_loop_filter_chroma_intra_10bpp_neon: 79.7 53.7 h264_h_loop_filter_chroma_mbaff422_10bpp_c: 188.5 75.0 h264_h_loop_filter_chroma_mbaff422_10bpp_neon: 120.0 75.5 h264_h_loop_filter_chroma_mbaff_intra422_10bpp_c: 116.7 46.0 h264_h_loop_filter_chroma_mbaff_intra422_10bpp_neon: 79.7 53.7 h264_h_loop_filter_chroma_mbaff_intra_10bpp_c: 63.0 27.2 h264_h_loop_filter_chroma_mbaff_intra_10bpp_neon: 48.5 34.0 h264_v_loop_filter_chroma_10bpp_c: 258.7 135.5 h264_v_loop_filter_chroma_10bpp_neon: 71.2 51.0 h264_v_loop_filter_chroma_intra_10bpp_c: 158.0 70.7 h264_v_loop_filter_chroma_intra_10bpp_neon: 48.7 31.5

Mikhail Nitenko committed 5 years ago

Commit 43ca8871 parent 756d2e02 files · +292 −0Browse files

Unified · Split

2 files
  1. libavcodec/aarch64/h264dsp_init_aarch64.c +37 −0
  2. libavcodec/aarch64/h264dsp_neon.S +255 −0
libavcodec/aarch64/h264dsp_init_aarch64.c+37−0
@@ -83,6 +83,29 @@ void ff_h264_idct8_add4_neon(uint8_t *dst, const int *block_offset, · 82 unmodified lines
83 int16_t *block, int stride,83 int16_t *block, int stride,
84 const uint8_t nnzc[5 * 8]);84 const uint8_t nnzc[5 * 8]);
85 85
86void ff_h264_v_loop_filter_luma_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha,
87 int beta, int8_t *tc0);
88void ff_h264_h_loop_filter_luma_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha,
89 int beta, int8_t *tc0);
90void ff_h264_v_loop_filter_luma_intra_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha,
91 int beta);
92void ff_h264_h_loop_filter_luma_intra_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha,
93 int beta);
94void ff_h264_v_loop_filter_chroma_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha,
95 int beta, int8_t *tc0);
96void ff_h264_h_loop_filter_chroma_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha,
97 int beta, int8_t *tc0);
98void ff_h264_h_loop_filter_chroma422_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha,
99 int beta, int8_t *tc0);
100void ff_h264_v_loop_filter_chroma_intra_neon_10(uint8_t *pix, ptrdiff_t stride,
101 int alpha, int beta);
102void ff_h264_h_loop_filter_chroma_intra_neon_10(uint8_t *pix, ptrdiff_t stride,
103 int alpha, int beta);
104void ff_h264_h_loop_filter_chroma422_intra_neon_10(uint8_t *pix, ptrdiff_t stride,
105 int alpha, int beta);
106void ff_h264_h_loop_filter_chroma_mbaff_intra_neon_10(uint8_t *pix, ptrdiff_t stride,
107 int alpha, int beta);
108
86av_cold void ff_h264dsp_init_aarch64(H264DSPContext *c, const int bit_depth,109av_cold void ff_h264dsp_init_aarch64(H264DSPContext *c, const int bit_depth,
87 const int chroma_format_idc)110 const int chroma_format_idc)
88{111{
@@ -125,5 +148,19 @@ av_cold void ff_h264dsp_init_aarch64(H264DSPContext *c, const int bit_depth, · 36 unmodified lines
125 c->h264_idct8_add = ff_h264_idct8_add_neon;148 c->h264_idct8_add = ff_h264_idct8_add_neon;
126 c->h264_idct8_dc_add = ff_h264_idct8_dc_add_neon;149 c->h264_idct8_dc_add = ff_h264_idct8_dc_add_neon;
127 c->h264_idct8_add4 = ff_h264_idct8_add4_neon;150 c->h264_idct8_add4 = ff_h264_idct8_add4_neon;
151 } else if (have_neon(cpu_flags) && bit_depth == 10) {
152 c->h264_v_loop_filter_chroma = ff_h264_v_loop_filter_chroma_neon_10;
153 c->h264_v_loop_filter_chroma_intra = ff_h264_v_loop_filter_chroma_intra_neon_10;
154
155 if (chroma_format_idc <= 1) {
156 c->h264_h_loop_filter_chroma = ff_h264_h_loop_filter_chroma_neon_10;
157 c->h264_h_loop_filter_chroma_intra = ff_h264_h_loop_filter_chroma_intra_neon_10;
158 c->h264_h_loop_filter_chroma_mbaff_intra = ff_h264_h_loop_filter_chroma_mbaff_intra_neon_10;
159 } else {
160 c->h264_h_loop_filter_chroma = ff_h264_h_loop_filter_chroma422_neon_10;
161 c->h264_h_loop_filter_chroma_mbaff = ff_h264_h_loop_filter_chroma_neon_10;
162 c->h264_h_loop_filter_chroma_intra = ff_h264_h_loop_filter_chroma422_intra_neon_10;
163 c->h264_h_loop_filter_chroma_mbaff_intra = ff_h264_h_loop_filter_chroma_intra_neon_10;
164 }
128 }165 }
129}166}
libavcodec/aarch64/h264dsp_neon.S+255−0
@@ -819,3 +819,258 @@ endfunc · 818 unmodified lines
819 weight_func 16819 weight_func 16
820 weight_func 8820 weight_func 8
821 weight_func 4821 weight_func 4
822
823.macro h264_loop_filter_start_10
824 cmp w2, #0
825 ldr w6, [x4]
826 ccmp w3, #0, #0, ne
827 lsl w2, w2, #2
828 mov v24.S[0], w6
829 lsl w3, w3, #2
830 and w8, w6, w6, lsl #16
831 b.eq 1f
832 ands w8, w8, w8, lsl #8
833 b.ge 2f
8341:
835 ret
8362:
837.endm
838
839.macro h264_loop_filter_start_intra_10
840 orr w4, w2, w3
841 cbnz w4, 1f
842 ret
8431:
844 lsl w2, w2, #2
845 lsl w3, w3, #2
846 dup v30.8h, w2 // alpha
847 dup v31.8h, w3 // beta
848.endm
849
850.macro h264_loop_filter_chroma_10
851 dup v22.8h, w2 // alpha
852 dup v23.8h, w3 // beta
853 uxtl v24.8h, v24.8b // tc0
854
855 uabd v26.8h, v16.8h, v0.8h // abs(p0 - q0)
856 uabd v28.8h, v18.8h, v16.8h // abs(p1 - p0)
857 uabd v30.8h, v2.8h, v0.8h // abs(q1 - q0)
858 cmhi v26.8h, v22.8h, v26.8h // < alpha
859 cmhi v28.8h, v23.8h, v28.8h // < beta
860 cmhi v30.8h, v23.8h, v30.8h // < beta
861
862 and v26.16b, v26.16b, v28.16b
863 mov v4.16b, v0.16b
864 sub v4.8h, v4.8h, v16.8h
865 and v26.16b, v26.16b, v30.16b
866 shl v4.8h, v4.8h, #2
867 mov x8, v26.d[0]
868 mov x9, v26.d[1]
869 sli v24.8h, v24.8h, #8
870 uxtl v24.8h, v24.8b
871 add v4.8h, v4.8h, v18.8h
872 adds x8, x8, x9
873 shl v24.8h, v24.8h, #2
874
875 b.eq 9f
876
877 movi v31.8h, #3 // (tc0 - 1) << (BIT_DEPTH - 8)) + 1
878 uqsub v24.8h, v24.8h, v31.8h
879 sub v4.8h, v4.8h, v2.8h
880 srshr v4.8h, v4.8h, #3
881 smin v4.8h, v4.8h, v24.8h
882 neg v25.8h, v24.8h
883 smax v4.8h, v4.8h, v25.8h
884 and v4.16b, v4.16b, v26.16b
885 add v16.8h, v16.8h, v4.8h
886 sub v0.8h, v0.8h, v4.8h
887
888 mvni v4.8h, #0xFC, lsl #8 // 1023 for clipping
889 movi v5.8h, #0
890 smin v0.8h, v0.8h, v4.8h
891 smin v16.8h, v16.8h, v4.8h
892 smax v0.8h, v0.8h, v5.8h
893 smax v16.8h, v16.8h, v5.8h
894.endm
895
896function ff_h264_v_loop_filter_chroma_neon_10, export=1
897 h264_loop_filter_start_10
898
899 mov x10, x0
900 sub x0, x0, x1, lsl #1
901 ld1 {v18.8h}, [x0 ], x1
902 ld1 {v0.8h}, [x10], x1
903 ld1 {v16.8h}, [x0 ], x1
904 ld1 {v2.8h}, [x10]
905
906 h264_loop_filter_chroma_10
907
908 sub x0, x10, x1, lsl #1
909 st1 {v16.8h}, [x0], x1
910 st1 {v0.8h}, [x0], x1
9119:
912 ret
913endfunc
914
915function ff_h264_h_loop_filter_chroma_neon_10, export=1
916 h264_loop_filter_start_10
917
918 sub x0, x0, #4 // access the 2nd left pixel
919h_loop_filter_chroma420_10:
920 add x10, x0, x1, lsl #2
921 ld1 {v18.d}[0], [x0 ], x1
922 ld1 {v18.d}[1], [x10], x1
923 ld1 {v16.d}[0], [x0 ], x1
924 ld1 {v16.d}[1], [x10], x1
925 ld1 {v0.d}[0], [x0 ], x1
926 ld1 {v0.d}[1], [x10], x1
927 ld1 {v2.d}[0], [x0 ], x1
928 ld1 {v2.d}[1], [x10], x1
929
930 transpose_4x8H v18, v16, v0, v2, v28, v29, v30, v31
931
932 h264_loop_filter_chroma_10
933
934 transpose_4x8H v18, v16, v0, v2, v28, v29, v30, v31
935
936 sub x0, x10, x1, lsl #3
937 st1 {v18.d}[0], [x0], x1
938 st1 {v16.d}[0], [x0], x1
939 st1 {v0.d}[0], [x0], x1
940 st1 {v2.d}[0], [x0], x1
941 st1 {v18.d}[1], [x0], x1
942 st1 {v16.d}[1], [x0], x1
943 st1 {v0.d}[1], [x0], x1
944 st1 {v2.d}[1], [x0], x1
9459:
946 ret
947endfunc
948
949function ff_h264_h_loop_filter_chroma422_neon_10, export=1
950 h264_loop_filter_start_10
951 add x5, x0, x1
952 sub x0, x0, #4
953 add x1, x1, x1
954 mov x7, x30
955 bl h_loop_filter_chroma420_10
956 mov x30, x7
957 sub x0, x5, #4
958 mov v24.s[0], w6
959 b h_loop_filter_chroma420_10
960endfunc
961
962.macro h264_loop_filter_chroma_intra_10
963 uabd v26.8h, v16.8h, v17.8h // abs(p0 - q0)
964 uabd v27.8h, v18.8h, v16.8h // abs(p1 - p0)
965 uabd v28.8h, v19.8h, v17.8h // abs(q1 - q0)
966 cmhi v26.8h, v30.8h, v26.8h // < alpha
967 cmhi v27.8h, v31.8h, v27.8h // < beta
968 cmhi v28.8h, v31.8h, v28.8h // < beta
969 and v26.16b, v26.16b, v27.16b
970 and v26.16b, v26.16b, v28.16b
971 mov x2, v26.d[0]
972 mov x3, v26.d[1]
973
974 shl v4.8h, v18.8h, #1
975 shl v6.8h, v19.8h, #1
976
977 adds x2, x2, x3
978 b.eq 9f
979
980 add v20.8h, v16.8h, v19.8h
981 add v22.8h, v17.8h, v18.8h
982 add v20.8h, v20.8h, v4.8h
983 add v22.8h, v22.8h, v6.8h
984 urshr v24.8h, v20.8h, #2
985 urshr v25.8h, v22.8h, #2
986 bit v16.16b, v24.16b, v26.16b
987 bit v17.16b, v25.16b, v26.16b
988.endm
989
990function ff_h264_v_loop_filter_chroma_intra_neon_10, export=1
991 h264_loop_filter_start_intra_10
992 mov x9, x0
993 sub x0, x0, x1, lsl #1
994 ld1 {v18.8h}, [x0], x1
995 ld1 {v17.8h}, [x9], x1
996 ld1 {v16.8h}, [x0], x1
997 ld1 {v19.8h}, [x9]
998
999 h264_loop_filter_chroma_intra_10
1000
1001 sub x0, x9, x1, lsl #1
1002 st1 {v16.8h}, [x0], x1
1003 st1 {v17.8h}, [x0], x1
1004
10059:
1006 ret
1007endfunc
1008
1009function ff_h264_h_loop_filter_chroma_mbaff_intra_neon_10, export=1
1010 h264_loop_filter_start_intra_10
1011
1012 sub x4, x0, #4
1013 sub x0, x0, #2
1014 add x9, x4, x1, lsl #1
1015 ld1 {v18.8h}, [x4], x1
1016 ld1 {v17.8h}, [x9], x1
1017 ld1 {v16.8h}, [x4], x1
1018 ld1 {v19.8h}, [x9], x1
1019
1020 transpose_4x8H v18, v16, v17, v19, v26, v27, v28, v29
1021
1022 h264_loop_filter_chroma_intra_10
1023
1024 st2 {v16.h,v17.h}[0], [x0], x1
1025 st2 {v16.h,v17.h}[1], [x0], x1
1026 st2 {v16.h,v17.h}[2], [x0], x1
1027 st2 {v16.h,v17.h}[3], [x0], x1
1028
10299:
1030 ret
1031endfunc
1032
1033function ff_h264_h_loop_filter_chroma_intra_neon_10, export=1
1034 h264_loop_filter_start_intra_10
1035 sub x4, x0, #4
1036 sub x0, x0, #2
1037h_loop_filter_chroma420_intra_10:
1038 add x9, x4, x1, lsl #2
1039 ld1 {v18.4h}, [x4], x1
1040 ld1 {v18.d}[1], [x9], x1
1041 ld1 {v16.4h}, [x4], x1
1042 ld1 {v16.d}[1], [x9], x1
1043 ld1 {v17.4h}, [x4], x1
1044 ld1 {v17.d}[1], [x9], x1
1045 ld1 {v19.4h}, [x4], x1
1046 ld1 {v19.d}[1], [x9], x1
1047
1048 transpose_4x8H v18, v16, v17, v19, v26, v27, v28, v29
1049
1050 h264_loop_filter_chroma_intra_10
1051
1052 st2 {v16.h,v17.h}[0], [x0], x1
1053 st2 {v16.h,v17.h}[1], [x0], x1
1054 st2 {v16.h,v17.h}[2], [x0], x1
1055 st2 {v16.h,v17.h}[3], [x0], x1
1056 st2 {v16.h,v17.h}[4], [x0], x1
1057 st2 {v16.h,v17.h}[5], [x0], x1
1058 st2 {v16.h,v17.h}[6], [x0], x1
1059 st2 {v16.h,v17.h}[7], [x0], x1
1060
10619:
1062 ret
1063endfunc
1064
1065function ff_h264_h_loop_filter_chroma422_intra_neon_10, export=1
1066 h264_loop_filter_start_intra_10
1067 sub x4, x0, #4
1068 add x5, x0, x1, lsl #3
1069 sub x0, x0, #2
1070 mov x7, x30
1071 bl h_loop_filter_chroma420_intra_10
1072 mov x4, x9
1073 sub x0, x5, #2
1074 mov x30, x7
1075 b h_loop_filter_chroma420_intra_10
1076endfunc

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t