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
8383 int16_t *block, int stride,
8484 const uint8_t nnzc[5 * 8]);
8585
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+
86109 av_cold void ff_h264dsp_init_aarch64(H264DSPContext *c, const int bit_depth,
87110 const int chroma_format_idc)
88111 {
@@ -125,5 +148,19 @@ av_cold void ff_h264dsp_init_aarch64(H264DSPContext *c, const int bit_depth, · 36 unmodified lines
125148 c->h264_idct8_add = ff_h264_idct8_add_neon;
126149 c->h264_idct8_dc_add = ff_h264_idct8_dc_add_neon;
127150 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+ }
128165 }
129166 }
libavcodec/aarch64/h264dsp_neon.S+255−0
@@ -819,3 +819,258 @@ endfunc · 818 unmodified lines
819819 weight_func 16
820820 weight_func 8
821821 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

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