History

lavc/h264dsp: R-V V intra loop filter

As with the inter loop filter, performance metrics seem to be biased in favour of the C implementation because checkasm inputs almost always fall in the no-op case. h264_h_loop_filter_chroma_intra_8bpp_c: 82.8 ( 1.00x) h264_h_loop_filter_chroma_intra_8bpp_rvv_i32: 72.6 ( 1.14x) h264_h_loop_filter_chroma_mbaff_intra_8bpp_c: 41.1 ( 1.00x) h264_h_loop_filter_chroma_mbaff_intra_8bpp_rvv_i32: 72.6 ( 0.57x) h264_h_loop_filter_luma_intra_8bpp_c: 166.1 ( 1.00x) h264_h_loop_filter_luma_intra_8bpp_rvv_i32: 395.4 ( 0.42x) h264_h_loop_filter_luma_mbaff_intra_8bpp_c: 93.3 ( 1.00x) h264_h_loop_filter_luma_mbaff_intra_8bpp_rvv_i32: 395.4 ( 0.24x) h264_v_loop_filter_chroma_intra_8bpp_c: 134.8 ( 1.00x) h264_v_loop_filter_chroma_intra_8bpp_rvv_i32: 51.6 ( 2.61x) h264_v_loop_filter_luma_intra_8bpp_c: 468.1 ( 1.00x) h264_v_loop_filter_luma_intra_8bpp_rvv_i32: 134.8 ( 3.47x)

Rémi Denis-Courmont committed 1 year ago

Commit bd226fd1 parent 16d49452 files · +189 −0Browse files

Showing the changes to libavcodec (2 of 2 files). Show all

Unified · Split

2 files
  1. libavcodec/riscv/h264dsp_init.c +26 −0
  2. libavcodec/riscv/h264dsp_rvv.S +163 −0
libavcodec/riscv/h264dsp_init.c+26−0
@@ -40,6 +40,12 @@ void ff_h264_h_loop_filter_luma_8_rvv(uint8_t *pix, ptrdiff_t stride, · 39 unmodified lines
4040 int alpha, int beta, int8_t *tc0);
4141 void ff_h264_h_loop_filter_luma_mbaff_8_rvv(uint8_t *pix, ptrdiff_t stride,
4242 int alpha, int beta, int8_t *tc0);
43+void ff_h264_v_loop_filter_luma_intra_8_rvv(uint8_t *pix, ptrdiff_t stride,
44+ int alpha, int beta);
45+void ff_h264_h_loop_filter_luma_intra_8_rvv(uint8_t *pix, ptrdiff_t stride,
46+ int alpha, int beta);
47+void ff_h264_h_loop_filter_luma_mbaff_intra_8_rvv(uint8_t *pix, ptrdiff_t s,
48+ int a, int b);
4349 void ff_h264_v_loop_filter_chroma_8_rvv(uint8_t *pix, ptrdiff_t stride,
4450 int alpha, int beta, int8_t *tc0);
4551 void ff_h264_h_loop_filter_chroma_8_rvv(uint8_t *pix, ptrdiff_t stride,
@@ -47,6 +53,13 @@ void ff_h264_h_loop_filter_chroma_8_rvv(uint8_t *pix, ptrdiff_t stride, · 1 unmodified line
4753 void ff_h264_h_loop_filter_chroma_mbaff_8_rvv(uint8_t *pix, ptrdiff_t stride,
4854 int alpha, int beta,
4955 int8_t *tc0);
56+void ff_h264_v_loop_filter_chroma_intra_8_rvv(uint8_t *pix, ptrdiff_t stride,
57+ int alpha, int beta);
58+void ff_h264_h_loop_filter_chroma_intra_8_rvv(uint8_t *pix, ptrdiff_t stride,
59+ int alpha, int beta);
60+void ff_h264_h_loop_filter_chroma_mbaff_intra_8_rvv(uint8_t *pix,
61+ ptrdiff_t stride,
62+ int alpha, int beta);
5063
5164 #define IDCT_DEPTH(depth) \
5265 void ff_h264_idct_add_##depth##_rvv(uint8_t *d, int16_t *s, int stride); \
@@ -125,13 +138,26 @@ av_cold void ff_h264dsp_init_riscv(H264DSPContext *dsp, const int bit_depth, · 72 unmodified lines
125138 dsp->h264_h_loop_filter_luma = ff_h264_h_loop_filter_luma_8_rvv;
126139 dsp->h264_h_loop_filter_luma_mbaff =
127140 ff_h264_h_loop_filter_luma_mbaff_8_rvv;
141+ dsp->h264_v_loop_filter_luma_intra =
142+ ff_h264_v_loop_filter_luma_intra_8_rvv;
143+ dsp->h264_h_loop_filter_luma_intra =
144+ ff_h264_h_loop_filter_luma_intra_8_rvv;
145+ dsp->h264_h_loop_filter_luma_mbaff_intra =
146+ ff_h264_h_loop_filter_luma_mbaff_intra_8_rvv;
128147 dsp->h264_v_loop_filter_chroma =
129148 ff_h264_v_loop_filter_chroma_8_rvv;
149+ dsp->h264_v_loop_filter_chroma_intra =
150+ ff_h264_v_loop_filter_chroma_intra_8_rvv;
151+
130152 if (chroma_format_idc <= 1) {
131153 dsp->h264_h_loop_filter_chroma =
132154 ff_h264_h_loop_filter_chroma_8_rvv;
133155 dsp->h264_h_loop_filter_chroma_mbaff =
134156 ff_h264_h_loop_filter_chroma_mbaff_8_rvv;
157+ dsp->h264_h_loop_filter_chroma_intra =
158+ ff_h264_h_loop_filter_chroma_intra_8_rvv;
159+ dsp->h264_h_loop_filter_chroma_mbaff_intra =
160+ ff_h264_h_loop_filter_chroma_mbaff_intra_8_rvv;
135161 }
136162
137163 dsp->h264_idct_add = ff_h264_idct_add_8_rvv;
libavcodec/riscv/h264dsp_rvv.S+163−0
@@ -308,6 +308,125 @@ func ff_h264_v_loop_filter_\type\()_8_rvv, zve32x · 307 unmodified lines
308308 vse8.v v11, (a0)
309309 ret
310310 endfunc
311+
312+ .variant_cc ff_h264_loop_filter_\type\()_intra_8_rvv
313+func ff_h264_loop_filter_\type\()_intra_8_rvv, zve32x
314+ # p3: v8, p2: v9, p1: v10, p0: v11, q0: v12, q1: v13, q2: v14, q3: v15
315+ # alpha: a2, beta: a3
316+ csrwi vxrm, 0
317+ srai a4, a2, 2
318+ vwsubu.vv v16, v11, v12
319+ addi a4, a4, 2
320+ vwsubu.vv v18, v12, v11
321+ vwsubu.vv v20, v10, v11
322+ vwsubu.vv v22, v11, v10
323+ vwsubu.vv v24, v13, v12
324+ vwsubu.vv v26, v12, v13
325+ vwsubu.vv v28, v11, v9
326+ vwsubu.vv v30, v9, v11
327+ vwsubu.vv v4, v14, v12
328+ vwsubu.vv v6, v12, v14
329+ vsetvli zero, zero, e16, \e16mul, ta, ma
330+ vmax.vv v16, v16, v18 # abs(p0 - q0)
331+ vmax.vv v20, v20, v22 # abs(p1 - p0)
332+ vmslt.vx v18, v16, a2
333+ vmax.vv v24, v24, v26 # abs(q1 - q0)
334+ vmslt.vx v22, v20, a3
335+.ifc \type, luma
336+ vmax.vv v28, v28, v30 # abs(p2 - p0)
337+.endif
338+ vmand.mm v18, v18, v22
339+ vmslt.vx v23, v24, a3
340+.ifc \type, luma
341+ vmax.vv v4, v4, v6 # abs(q2 - q0)
342+ vmand.mm v1, v18, v23 # abs(...) < A && abs(..) < B && abs(..) < B
343+ vmslt.vx v3, v16, a4 # abs(p0 - q0) < (alpha / 4) + 2
344+ vmslt.vx v6, v28, a3 # abs(p2 - p0) < beta
345+ vmslt.vx v7, v4, a3 # abs(q2 - q0) < beta
346+ vmand.mm v2, v3, v6
347+ vmand.mm v3, v3, v7
348+.else
349+ vmand.mm v0, v18, v23
350+.endif
351+ vsetvli zero, zero, e8, \e8mul, ta, mu
352+ vwaddu.vv v22, v11, v13
353+ vwaddu.vv v30, v10, v12
354+ vwaddu.wv v22, v22, v10
355+ vwaddu.wv v30, v30, v13
356+ vwaddu.wv v22, v22, v10 # 2p1 + p0 + q1
357+ vwaddu.wv v30, v30, v13 # p1 + q0 + 2q1
358+.ifc \type, luma
359+ vwaddu.vv v16, v10, v11
360+ vwaddu.vv v20, v8, v9
361+ vwaddu.wv v16, v16, v12 # p1 + p0 + q0
362+ vwaddu.vv v24, v11, v12
363+ vwaddu.vv v28, v14, v15
364+ vwaddu.wv v24, v24, v13 # p0 + q0 + q1
365+ vwaddu.wv v18, v16, v9 # p2 + p1 + p0 + q0
366+ vwaddu.wv v16, v16, v13 # p1 + p0 + q0 + q1
367+ vwaddu.wv v26, v24, v14 # p0 + q0 + q1 + q2
368+ vwaddu.wv v24, v24, v10 # p1 + p0 + q0 + q1
369+ vsetvli zero, zero, e16, \e16mul, ta, ma
370+ vsll.vi v20, v20, 1 # 2p3 +2p2
371+ vadd.vv v16, v16, v18 # p2 +2p1 +2p0 +2q0 + q1
372+ vadd.vv v20, v18, v20 # 2p3 +3p3 + p1 + p0 + q0
373+ vsll.vi v28, v28, 1 # 2q2 +2q3
374+ vadd.vv v24, v24, v26 # p1 +2p0 +2q0 +2q1 + q2
375+ vadd.vv v28, v26, v28 # p0 + q0 + q1 +3q2 +2q3
376+ vsetvli zero, zero, e8, \e8mul, ta, mu
377+ vmand.mm v0, v1, v2
378+ vnclipu.wi v11, v16, 3, v0.t # p0'
379+ vnclipu.wi v10, v18, 2, v0.t # p1'
380+ vnclipu.wi v9, v20, 3, v0.t # p2'
381+ vmandn.mm v0, v1, v2
382+.endif
383+ vnclipu.wi v11, v22, 2, v0.t # p0'
384+.ifc \type, luma
385+ vmand.mm v0, v1, v3
386+ vnclipu.wi v12, v24, 3, v0.t # q0'
387+ vnclipu.wi v13, v26, 2, v0.t # q1'
388+ vnclipu.wi v14, v28, 3, v0.t # q2'
389+ vmandn.mm v0, v1, v3
390+.endif
391+ vnclipu.wi v12, v30, 2, v0.t # q0'
392+ jr t0
393+endfunc
394+
395+func ff_h264_v_loop_filter_\type\()_intra_8_rvv, zve32x
396+ lpad 0
397+ sub t3, a0, a1
398+ vsetivli zero, 4 * \inners, e8, \e8mul, ta, ma
399+ vle8.v v12, (a0)
400+ sub t2, t3, a1
401+ vle8.v v11, (t3)
402+ add t4, a0, a1
403+ vle8.v v10, (t2)
404+.ifc \type, luma
405+ sub t1, t2, a1
406+.endif
407+ vle8.v v13, (t4)
408+.ifc \type, luma
409+ sub t0, t1, a1
410+ vle8.v v9, (t1)
411+ add t5, t4, a1
412+ vle8.v v8, (t0)
413+ add t6, t5, a1
414+ vle8.v v14, (t5)
415+ vle8.v v15, (t6)
416+.endif
417+ jal t0, ff_h264_loop_filter_\type\()_intra_8_rvv
418+.ifc \type, luma
419+ vse8.v v9, (t1)
420+ vse8.v v10, (t2)
421+.endif
422+ vse8.v v11, (t3)
423+ vse8.v v12, (a0)
424+.ifc \type, luma
425+ vse8.v v13, (t4)
426+ vse8.v v14, (t5)
427+.endif
428+ ret
429+endfunc
311430 .endm
312431
313432 loop_filter luma, 4, m1, m2
@@ -373,3 +492,47 @@ func ff_h264_h_loop_filter_chroma_mbaff_8_rvv, zve32x · 59 unmodified lines
373492 vssseg2e8.v v10, (a0), a1
374493 ret
375494 endfunc
495+
496+func ff_h264_h_loop_filter_luma_intra_8_rvv, zve32x
497+ lpad 0
498+ addi a0, a0, -4
499+ vsetivli zero, 16, e8, m1, ta, ma
500+ vlsseg8e8.v v8, (a0), a1
501+ addi a0, a0, 1
502+ jal t0, ff_h264_loop_filter_luma_intra_8_rvv
503+ vssseg6e8.v v9, (a0), a1
504+ ret
505+endfunc
506+
507+func ff_h264_h_loop_filter_luma_mbaff_intra_8_rvv, zve32x
508+ lpad 0
509+ addi a0, a0, -4
510+ vsetivli zero, 8, e8, m1, ta, ma
511+ vlsseg8e8.v v8, (a0), a1
512+ addi a0, a0, 1
513+ jal t0, ff_h264_loop_filter_luma_intra_8_rvv
514+ vssseg6e8.v v9, (a0), a1
515+ ret
516+endfunc
517+
518+func ff_h264_h_loop_filter_chroma_intra_8_rvv, zve32x
519+ lpad 0
520+ addi a0, a0, -2
521+ vsetivli zero, 8, e8, mf2, ta, ma
522+ vlsseg4e8.v v10, (a0), a1
523+ addi a0, a0, 1
524+ jal t0, ff_h264_loop_filter_chroma_intra_8_rvv
525+ vssseg2e8.v v11, (a0), a1
526+ ret
527+endfunc
528+
529+func ff_h264_h_loop_filter_chroma_mbaff_intra_8_rvv, zve32x
530+ lpad 0
531+ addi a0, a0, -2
532+ vsetivli zero, 4, e8, mf2, ta, ma
533+ vlsseg4e8.v v10, (a0), a1
534+ addi a0, a0, 1
535+ jal t0, ff_h264_loop_filter_chroma_intra_8_rvv
536+ vssseg2e8.v v11, (a0), a1
537+ ret
538+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