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)
Showing the changes to libavcodec (2 of 2 files). Show all
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 | 40 | int alpha, int beta, int8_t *tc0); |
| 41 | 41 | void ff_h264_h_loop_filter_luma_mbaff_8_rvv(uint8_t *pix, ptrdiff_t stride, |
| 42 | 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 | 49 | void ff_h264_v_loop_filter_chroma_8_rvv(uint8_t *pix, ptrdiff_t stride, |
| 44 | 50 | int alpha, int beta, int8_t *tc0); |
| 45 | 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 | 53 | void ff_h264_h_loop_filter_chroma_mbaff_8_rvv(uint8_t *pix, ptrdiff_t stride, |
| 48 | 54 | int alpha, int beta, |
| 49 | 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 | 64 | #define IDCT_DEPTH(depth) \ |
| 52 | 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 | 138 | dsp->h264_h_loop_filter_luma = ff_h264_h_loop_filter_luma_8_rvv; |
| 126 | 139 | dsp->h264_h_loop_filter_luma_mbaff = |
| 127 | 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 | 147 | dsp->h264_v_loop_filter_chroma = |
| 129 | 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 | 152 | if (chroma_format_idc <= 1) { |
| 131 | 153 | dsp->h264_h_loop_filter_chroma = |
| 132 | 154 | ff_h264_h_loop_filter_chroma_8_rvv; |
| 133 | 155 | dsp->h264_h_loop_filter_chroma_mbaff = |
| 134 | 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 | 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 | 308 | vse8.v v11, (a0) |
| 309 | 309 | ret |
| 310 | 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 | 430 | .endm |
| 312 | 431 | |
| 313 | 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 | 492 | vssseg2e8.v v10, (a0), a1 |
| 374 | 493 | ret |
| 375 | 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 | |