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)
Unified · Split
| @@ -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); |
| 41 | void ff_h264_h_loop_filter_luma_mbaff_8_rvv(uint8_t *pix, ptrdiff_t stride, | 41 | void 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); |
| 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); | ||
| 43 | void ff_h264_v_loop_filter_chroma_8_rvv(uint8_t *pix, ptrdiff_t stride, | 49 | void 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); |
| 45 | void ff_h264_h_loop_filter_chroma_8_rvv(uint8_t *pix, ptrdiff_t stride, | 51 | 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 | |||
| 47 | void ff_h264_h_loop_filter_chroma_mbaff_8_rvv(uint8_t *pix, ptrdiff_t stride, | 53 | void 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); |
| 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); | ||
| 50 | 63 | ||
| 51 | #define IDCT_DEPTH(depth) \ | 64 | #define IDCT_DEPTH(depth) \ |
| 52 | void ff_h264_idct_add_##depth##_rvv(uint8_t *d, int16_t *s, int stride); \ | 65 | 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 | |||
| 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; |
| @@ -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 | ret | 309 | ret |
| 310 | endfunc | 310 | 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 | ||
| 311 | .endm | 430 | .endm |
| 312 | 431 | ||
| 313 | loop_filter luma, 4, m1, m2 | 432 | loop_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), a1 | 492 | vssseg2e8.v v10, (a0), a1 |
| 374 | ret | 493 | ret |
| 375 | endfunc | 494 | 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 | ||