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
40 int alpha, int beta, int8_t *tc0);40 int alpha, int beta, int8_t *tc0);
41void ff_h264_h_loop_filter_luma_mbaff_8_rvv(uint8_t *pix, ptrdiff_t stride,41void ff_h264_h_loop_filter_luma_mbaff_8_rvv(uint8_t *pix, ptrdiff_t stride,
42 int alpha, int beta, int8_t *tc0);42 int alpha, int beta, int8_t *tc0);
43void ff_h264_v_loop_filter_luma_intra_8_rvv(uint8_t *pix, ptrdiff_t stride,
44 int alpha, int beta);
45void ff_h264_h_loop_filter_luma_intra_8_rvv(uint8_t *pix, ptrdiff_t stride,
46 int alpha, int beta);
47void ff_h264_h_loop_filter_luma_mbaff_intra_8_rvv(uint8_t *pix, ptrdiff_t s,
48 int a, int b);
43void ff_h264_v_loop_filter_chroma_8_rvv(uint8_t *pix, ptrdiff_t stride,49void ff_h264_v_loop_filter_chroma_8_rvv(uint8_t *pix, ptrdiff_t stride,
44 int alpha, int beta, int8_t *tc0);50 int alpha, int beta, int8_t *tc0);
45void ff_h264_h_loop_filter_chroma_8_rvv(uint8_t *pix, ptrdiff_t stride,51void 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
47void ff_h264_h_loop_filter_chroma_mbaff_8_rvv(uint8_t *pix, ptrdiff_t stride,53void ff_h264_h_loop_filter_chroma_mbaff_8_rvv(uint8_t *pix, ptrdiff_t stride,
48 int alpha, int beta,54 int alpha, int beta,
49 int8_t *tc0);55 int8_t *tc0);
56void ff_h264_v_loop_filter_chroma_intra_8_rvv(uint8_t *pix, ptrdiff_t stride,
57 int alpha, int beta);
58void ff_h264_h_loop_filter_chroma_intra_8_rvv(uint8_t *pix, ptrdiff_t stride,
59 int alpha, int beta);
60void ff_h264_h_loop_filter_chroma_mbaff_intra_8_rvv(uint8_t *pix,
61 ptrdiff_t stride,
62 int alpha, int beta);
50 63
51#define IDCT_DEPTH(depth) \64#define IDCT_DEPTH(depth) \
52void ff_h264_idct_add_##depth##_rvv(uint8_t *d, int16_t *s, int stride); \65void 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
125 dsp->h264_h_loop_filter_luma = ff_h264_h_loop_filter_luma_8_rvv;138 dsp->h264_h_loop_filter_luma = ff_h264_h_loop_filter_luma_8_rvv;
126 dsp->h264_h_loop_filter_luma_mbaff =139 dsp->h264_h_loop_filter_luma_mbaff =
127 ff_h264_h_loop_filter_luma_mbaff_8_rvv;140 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;
128 dsp->h264_v_loop_filter_chroma =147 dsp->h264_v_loop_filter_chroma =
129 ff_h264_v_loop_filter_chroma_8_rvv;148 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
130 if (chroma_format_idc <= 1) {152 if (chroma_format_idc <= 1) {
131 dsp->h264_h_loop_filter_chroma =153 dsp->h264_h_loop_filter_chroma =
132 ff_h264_h_loop_filter_chroma_8_rvv;154 ff_h264_h_loop_filter_chroma_8_rvv;
133 dsp->h264_h_loop_filter_chroma_mbaff =155 dsp->h264_h_loop_filter_chroma_mbaff =
134 ff_h264_h_loop_filter_chroma_mbaff_8_rvv;156 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;
135 }161 }
136 162
137 dsp->h264_idct_add = ff_h264_idct_add_8_rvv;163 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
308 vse8.v v11, (a0)308 vse8.v v11, (a0)
309 ret309 ret
310endfunc310endfunc
311
312 .variant_cc ff_h264_loop_filter_\type\()_intra_8_rvv
313func 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
393endfunc
394
395func 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
429endfunc
311.endm430.endm
312 431
313loop_filter luma, 4, m1, m2432loop_filter luma, 4, m1, m2
@@ -373,3 +492,47 @@ func ff_h264_h_loop_filter_chroma_mbaff_8_rvv, zve32x · 59 unmodified lines
373 vssseg2e8.v v10, (a0), a1492 vssseg2e8.v v10, (a0), a1
374 ret493 ret
375endfunc494endfunc
495
496func 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
505endfunc
506
507func 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
516endfunc
517
518func 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
527endfunc
528
529func 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
538endfunc

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