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 | 83 | int16_t *block, int stride, |
| 84 | 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 | 109 | av_cold void ff_h264dsp_init_aarch64(H264DSPContext *c, const int bit_depth, |
| 87 | 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 | 148 | c->h264_idct8_add = ff_h264_idct8_add_neon; |
| 126 | 149 | c->h264_idct8_dc_add = ff_h264_idct8_dc_add_neon; |
| 127 | 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 | 819 | weight_func 16 |
| 820 | 820 | weight_func 8 |
| 821 | 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 | |