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
Showing the changes to libavcodec (2 of 2 files). Show all
Unified · Split
| @@ -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 | ||
| 86 | void ff_h264_v_loop_filter_luma_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha, | ||
| 87 | int beta, int8_t *tc0); | ||
| 88 | void ff_h264_h_loop_filter_luma_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha, | ||
| 89 | int beta, int8_t *tc0); | ||
| 90 | void ff_h264_v_loop_filter_luma_intra_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha, | ||
| 91 | int beta); | ||
| 92 | void ff_h264_h_loop_filter_luma_intra_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha, | ||
| 93 | int beta); | ||
| 94 | void ff_h264_v_loop_filter_chroma_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha, | ||
| 95 | int beta, int8_t *tc0); | ||
| 96 | void ff_h264_h_loop_filter_chroma_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha, | ||
| 97 | int beta, int8_t *tc0); | ||
| 98 | void ff_h264_h_loop_filter_chroma422_neon_10(uint8_t *pix, ptrdiff_t stride, int alpha, | ||
| 99 | int beta, int8_t *tc0); | ||
| 100 | void ff_h264_v_loop_filter_chroma_intra_neon_10(uint8_t *pix, ptrdiff_t stride, | ||
| 101 | int alpha, int beta); | ||
| 102 | void ff_h264_h_loop_filter_chroma_intra_neon_10(uint8_t *pix, ptrdiff_t stride, | ||
| 103 | int alpha, int beta); | ||
| 104 | void ff_h264_h_loop_filter_chroma422_intra_neon_10(uint8_t *pix, ptrdiff_t stride, | ||
| 105 | int alpha, int beta); | ||
| 106 | void ff_h264_h_loop_filter_chroma_mbaff_intra_neon_10(uint8_t *pix, ptrdiff_t stride, | ||
| 107 | int alpha, int beta); | ||
| 108 | |||
| 86 | av_cold void ff_h264dsp_init_aarch64(H264DSPContext *c, const int bit_depth, | 109 | av_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 | } |
| @@ -819,3 +819,258 @@ endfunc · 818 unmodified lines | |||
| 819 | weight_func 16 | 819 | weight_func 16 |
| 820 | weight_func 8 | 820 | weight_func 8 |
| 821 | weight_func 4 | 821 | 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 | ||
| 834 | 1: | ||
| 835 | ret | ||
| 836 | 2: | ||
| 837 | .endm | ||
| 838 | |||
| 839 | .macro h264_loop_filter_start_intra_10 | ||
| 840 | orr w4, w2, w3 | ||
| 841 | cbnz w4, 1f | ||
| 842 | ret | ||
| 843 | 1: | ||
| 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 | |||
| 896 | function 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 | ||
| 911 | 9: | ||
| 912 | ret | ||
| 913 | endfunc | ||
| 914 | |||
| 915 | function 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 | ||
| 919 | h_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 | ||
| 945 | 9: | ||
| 946 | ret | ||
| 947 | endfunc | ||
| 948 | |||
| 949 | function 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 | ||
| 960 | endfunc | ||
| 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 | |||
| 990 | function 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 | |||
| 1005 | 9: | ||
| 1006 | ret | ||
| 1007 | endfunc | ||
| 1008 | |||
| 1009 | function 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 | |||
| 1029 | 9: | ||
| 1030 | ret | ||
| 1031 | endfunc | ||
| 1032 | |||
| 1033 | function 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 | ||
| 1037 | h_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 | |||
| 1061 | 9: | ||
| 1062 | ret | ||
| 1063 | endfunc | ||
| 1064 | |||
| 1065 | function 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 | ||
| 1076 | endfunc | ||