History

lavc/h264dsp: R-V V high-depth idct_add{,intra}16, idct8_add4

As with 8-bit, this tends to be faster, but results are all over the place due to the variable distribution of non-zero coefficients.

Rémi Denis-Courmont committed 2 years ago

Commit 483fd731 parent 90672972 files · +161 −92Browse files

Unified · Split

2 files
  1. libavcodec/riscv/h264dsp_init.c +45 −61
  2. libavcodec/riscv/h264idct_rvv.S +116 −31
libavcodec/riscv/h264dsp_init.c+45−61
@@ -41,26 +41,27 @@ void ff_h264_h_loop_filter_luma_8_rvv(uint8_t *pix, ptrdiff_t stride, · 40 unmodified lines
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);
4343
44−void ff_h264_idct_add_8_rvv(uint8_t *dst, int16_t *block, int stride);
45−void ff_h264_idct8_add_8_rvv(uint8_t *dst, int16_t *block, int stride);
46−void ff_h264_idct_add16_8_rvv(uint8_t *dst, const int *blockoffset,
47− int16_t *block, int stride,
48− const uint8_t nnzc[5 * 8]);
49−void ff_h264_idct_add16intra_8_rvv(uint8_t *dst, const int *blockoffset,
50− int16_t *block, int stride,
51− const uint8_t nnzc[5 * 8]);
52−void ff_h264_idct8_add4_8_rvv(uint8_t *dst, const int *blockoffset,
53− int16_t *block, int stride,
54− const uint8_t nnzc[5 * 8]);
55−
56−void ff_h264_idct_add_9_rvv(uint8_t *dst, int16_t *block, int stride);
57−void ff_h264_idct8_add_9_rvv(uint8_t *dst, int16_t *block, int stride);
58−void ff_h264_idct_add_10_rvv(uint8_t *dst, int16_t *block, int stride);
59−void ff_h264_idct8_add_10_rvv(uint8_t *dst, int16_t *block, int stride);
60−void ff_h264_idct_add_12_rvv(uint8_t *dst, int16_t *block, int stride);
61−void ff_h264_idct8_add_12_rvv(uint8_t *dst, int16_t *block, int stride);
62−void ff_h264_idct_add_14_rvv(uint8_t *dst, int16_t *block, int stride);
63−void ff_h264_idct8_add_14_rvv(uint8_t *dst, int16_t *block, int stride);
44+#define IDCT_DEPTH(depth) \
45+void ff_h264_idct_add_##depth##_rvv(uint8_t *d, int16_t *s, int stride); \
46+void ff_h264_idct8_add_##depth##_rvv(uint8_t *d, int16_t *s, int stride); \
47+void ff_h264_idct4_dc_add_##depth##_rvv(uint8_t *, int16_t *, int); \
48+void ff_h264_idct8_dc_add_##depth##_rvv(uint8_t *, int16_t *, int); \
49+void ff_h264_idct_add16_##depth##_rvv(uint8_t *d, const int *soffset, \
50+ int16_t *s, int stride, \
51+ const uint8_t nnzc[5 * 8]); \
52+void ff_h264_idct_add16intra_##depth##_rvv(uint8_t *d, const int *soffset, \
53+ int16_t *s, int stride, \
54+ const uint8_t nnzc[5 * 8]); \
55+void ff_h264_idct8_add4_##depth##_rvv(uint8_t *d, const int *soffset, \
56+ int16_t *s, int stride, \
57+ const uint8_t nnzc[5 * 8]);
58+
59+IDCT_DEPTH(8)
60+IDCT_DEPTH(9)
61+IDCT_DEPTH(10)
62+IDCT_DEPTH(12)
63+IDCT_DEPTH(14)
64+#undef IDCT_DEPTH
6465
6566 void ff_h264_add_pixels8_8_rvv(uint8_t *dst, int16_t *block, int stride);
6667 void ff_h264_add_pixels4_8_rvv(uint8_t *dst, int16_t *block, int stride);
@@ -69,16 +70,6 @@ void ff_h264_add_pixels4_16_rvv(uint8_t *dst, int16_t *block, int stride); · 2 unmodified lines
6970
7071 extern int ff_startcode_find_candidate_rvb(const uint8_t *, int);
7172 extern int ff_startcode_find_candidate_rvv(const uint8_t *, int);
72−void ff_h264_idct4_dc_add_8_rvv(uint8_t *, int16_t *, int);
73−void ff_h264_idct8_dc_add_8_rvv(uint8_t *, int16_t *, int);
74−void ff_h264_idct4_dc_add_9_rvv(uint8_t *, int16_t *, int);
75−void ff_h264_idct8_dc_add_9_rvv(uint8_t *, int16_t *, int);
76−void ff_h264_idct4_dc_add_10_rvv(uint8_t *, int16_t *, int);
77−void ff_h264_idct8_dc_add_10_rvv(uint8_t *, int16_t *, int);
78−void ff_h264_idct4_dc_add_12_rvv(uint8_t *, int16_t *, int);
79−void ff_h264_idct8_dc_add_12_rvv(uint8_t *, int16_t *, int);
80−void ff_h264_idct4_dc_add_14_rvv(uint8_t *, int16_t *, int);
81−void ff_h264_idct8_dc_add_14_rvv(uint8_t *, int16_t *, int);
8273
8374 av_cold void ff_h264dsp_init_riscv(H264DSPContext *dsp, const int bit_depth,
8475 const int chroma_format_idc)
@@ -120,38 +111,31 @@ av_cold void ff_h264dsp_init_riscv(H264DSPContext *dsp, const int bit_depth, · 35 unmodified lines
120111 }
121112 dsp->h264_add_pixels4_clear = ff_h264_add_pixels4_8_rvv;
122113 }
123− if (bit_depth == 9) {
124− if (zvl128b) {
125− dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_9_rvv;
126− dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_9_rvv;
127− dsp->h264_idct_add = ff_h264_idct_add_9_rvv;
128− }
129− dsp->h264_idct8_add = ff_h264_idct8_add_9_rvv;
130− }
131− if (bit_depth == 10) {
132− if (zvl128b) {
133− dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_10_rvv;
134− dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_10_rvv;
135− dsp->h264_idct_add = ff_h264_idct_add_10_rvv;
136− }
137− dsp->h264_idct8_add = ff_h264_idct8_add_10_rvv;
138− }
139− if (bit_depth == 12) {
140− if (zvl128b) {
141− dsp->h264_idct_add = ff_h264_idct_add_12_rvv;
142− dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_12_rvv;
143− dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_12_rvv;
144− }
145− dsp->h264_idct8_add = ff_h264_idct8_add_12_rvv;
146− }
147− if (bit_depth == 14) {
148− if (zvl128b) {
149− dsp->h264_idct_add = ff_h264_idct_add_14_rvv;
150− dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_14_rvv;
151− dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_14_rvv;
152− }
153− dsp->h264_idct8_add = ff_h264_idct8_add_14_rvv;
114+
115+#define IDCT_DEPTH(depth) \
116+ if (bit_depth == depth) { \
117+ if (zvl128b) \
118+ dsp->h264_idct_add = ff_h264_idct_add_##depth##_rvv; \
119+ if (flags & AV_CPU_FLAG_RVB_ADDR) \
120+ dsp->h264_idct8_add = ff_h264_idct8_add_##depth##_rvv; \
121+ if (zvl128b && (flags & AV_CPU_FLAG_RVB_ADDR)) { \
122+ dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_##depth##_rvv; \
123+ dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_##depth##_rvv; \
124+ } \
125+ if (__riscv_xlen == 64 && zvl128b) { \
126+ dsp->h264_idct_add16 = ff_h264_idct_add16_##depth##_rvv; \
127+ dsp->h264_idct_add16intra = \
128+ ff_h264_idct_add16intra_##depth##_rvv; \
129+ } \
130+ if (__riscv_xlen == 64 && (flags & AV_CPU_FLAG_RVB_ADDR)) \
131+ dsp->h264_idct8_add4 = ff_h264_idct8_add4_##depth##_rvv; \
154132 }
133+
134+ IDCT_DEPTH(9)
135+ IDCT_DEPTH(10)
136+ IDCT_DEPTH(12)
137+ IDCT_DEPTH(14)
138+
155139 if (bit_depth > 8 && zvl128b) {
156140 dsp->h264_add_pixels8_clear = ff_h264_add_pixels8_16_rvv;
157141 if (flags & AV_CPU_FLAG_RVV_I64)
libavcodec/riscv/h264idct_rvv.S+116−31
@@ -107,6 +107,7 @@ endfunc · 106 unmodified lines
107107
108108 func ff_h264_idct_add_16_rvv, zve32x
109109 csrwi vxrm, 0
110+.Lidct_add4_16_rvv:
110111 vsetivli zero, 4, e32, m1, ta, ma
111112 addi t1, a1, 1 * 4 * 4
112113 vle32.v v0, (a1)
@@ -147,7 +148,7 @@ func ff_h264_idct_add_16_rvv, zve32x · 34 unmodified lines
147148 vmax.vx v\n, v\n, zero
148149 .endr
149150 .irp n,0,1,2,3
150− vmin.vx v\n, v\n, a3
151+ vmin.vx v\n, v\n, a5
151152 .endr
152153 vsetvli zero, zero, e16, mf2, ta, ma
153154 vncvt.x.x.w v4, v0
@@ -295,9 +296,10 @@ func ff_h264_idct8_add_8_rvv, zve32x · 141 unmodified lines
295296 endfunc
296297
297298 func ff_h264_idct8_add_16_rvv, zve32x
298− li a4, 8
299299 csrwi vxrm, 0
300− vsetivli a5, 8, e32, m1, ta, ma
300+.Lidct8_add_16_rvv:
301+ li a4, 8
302+ vsetivli a3, 8, e32, m1, ta, ma
301303 1:
302304 addi t1, a1, 1 * 8 * 4
303305 vle32.v v0, (a1)
@@ -313,11 +315,11 @@ func ff_h264_idct8_add_16_rvv, zve32x · 9 unmodified lines
313315 vle32.v v5, (t5)
314316 addi a7, a1, 7 * 8 * 4
315317 vle32.v v6, (t6)
316− sub a4, a4, a5
318+ sub a4, a4, a3
317319 vle32.v v7, (a7)
318320 jal t0, ff_h264_idct8_rvv
319321 vse32.v v0, (a1)
320− sh2add a1, a5, a1
322+ sh2add a1, a3, a1
321323 vse32.v v1, (t1)
322324 vse32.v v2, (t2)
323325 vse32.v v3, (t3)
@@ -329,7 +331,7 @@ func ff_h264_idct8_add_16_rvv, zve32x · 5 unmodified lines
329331
330332 addi a1, a1, -8 * 4
331333 li a4, 8
332− slli a6, a5, 3 + 2
334+ slli a6, a3, 3 + 2
333335 2:
334336 vsetvli zero, zero, e32, m1, ta, ma
335337 vlseg8e32.v v0, (a1)
@@ -348,7 +350,7 @@ func ff_h264_idct8_add_16_rvv, zve32x · 12 unmodified lines
348350 vle16.v v21, (t5)
349351 add a7, t6, a2
350352 vle16.v v22, (t6)
351− sub a4, a4, a5
353+ sub a4, a4, a3
352354 vle16.v v23, (a7)
353355 .irp n,0,1,2,3,4,5,6,7
354356 vssra.vi v\n, v\n, 6
@@ -368,7 +370,7 @@ func ff_h264_idct8_add_16_rvv, zve32x · 13 unmodified lines
368370 vmax.vx v\n, v\n, zero
369371 .endr
370372 .irp n,0,1,2,3,4,5,6,7
371− vmin.vx v\n, v\n, a3
373+ vmin.vx v\n, v\n, a5
372374 .endr
373375 vsetvli zero, zero, e16, mf2, ta, ma
374376 vncvt.x.x.w v16, v0
@@ -380,7 +382,7 @@ func ff_h264_idct8_add_16_rvv, zve32x · 5 unmodified lines
380382 vncvt.x.x.w v22, v6
381383 vncvt.x.x.w v23, v7
382384 vse16.v v16, (a0)
383− sh1add a0, a5, a0
385+ sh1add a0, a3, a0
384386 vse16.v v17, (t1)
385387 vse16.v v18, (t2)
386388 vse16.v v19, (t3)
@@ -400,12 +402,12 @@ endfunc · 13 unmodified lines
400402
401403 .irp depth, 9, 10, 12, 14
402404 func ff_h264_idct_add_\depth\()_rvv, zve32x
403− li a3, (1 << \depth) - 1
405+ li a5, (1 << \depth) - 1
404406 j ff_h264_idct_add_16_rvv
405407 endfunc
406408
407409 func ff_h264_idct8_add_\depth\()_rvv, zve32x
408− li a3, (1 << \depth) - 1
410+ li a5, (1 << \depth) - 1
409411 j ff_h264_idct8_add_16_rvv
410412 endfunc
411413 .endr
@@ -416,13 +418,13 @@ const ff_h264_scan8 · 4 unmodified lines
416418 endconst
417419
418420 #if (__riscv_xlen == 64)
419−.irp depth, 8
421+.irp depth, 8, 16
420422 func ff_h264_idct_add16_\depth\()_rvv, zve32x
421423 csrwi vxrm, 0
422− addi sp, sp, -80
424+ addi sp, sp, -96
423425 lla t0, ff_h264_scan8
424426 sd s0, (sp)
425− li t1, 32 << (\depth > 8)
427+ li t1, 32 * (\depth / 8)
426428 mv s0, sp
427429 sd ra, 8(sp)
428430 sd s1, 16(sp)
@@ -432,9 +434,19 @@ func ff_h264_idct_add16_\depth\()_rvv, zve32x · 3 unmodified lines
432434 sd s5, 48(sp)
433435 sd s6, 56(sp)
434436 sd s7, 64(sp)
437+.if \depth > 8
438+ sd s8, 72(sp)
439+ sd s9, 80(sp)
440+ mv s8, a5
441+ mv s9, a6
442+.endif
435443 vsetivli zero, 16, e8, m1, ta, ma
436444 vle8.v v8, (t0)
445+.if \depth == 8
437446 vlse16.v v16, (a2), t1
447+.else
448+ vlse32.v v16, (a2), t1
449+.endif
438450 vluxei8.v v12, (a4), v8
439451 .if \depth == 8
440452 vsetvli zero, zero, e16, m2, ta, ma
@@ -464,17 +476,28 @@ func ff_h264_idct_add16_\depth\()_rvv, zve32x · 23 unmodified lines
464476 mv a1, s6
465477 mv a2, s7
466478 add a0, s4, t2
467− beqz t1, 2f # if (nnz == 1 && block[i * 16])
468− call ff_h264_idct_dc_add_\depth\()_c
479+.if \depth > 8
480+ mv a5, s8
481+.endif
482+ bnez t1, 2f # if (nnz == 1 && block[i * 16])
483+ jal .Lidct_add4_\depth\()_rvv
469484 j 3f
470485 2:
471− call .Lidct_add4_\depth\()_rvv
486+.if \depth == 8
487+ call ff_h264_idct_dc_add_\depth\()_c
488+.else
489+ jalr s9
490+.endif
472491 3:
473492 srli s3, s3, 1
474493 addi s5, s5, 4
475− addi s6, s6, 16 * 2 << (\depth > 8)
494+ addi s6, s6, 16 * 2 * (\depth / 8)
476495 bnez s1, 1b
477496
497+.if \depth > 8
498+ ld s9, 80(sp)
499+ ld s8, 72(sp)
500+.endif
478501 ld s7, 64(sp)
479502 ld s6, 56(sp)
480503 ld s5, 48(sp)
@@ -484,16 +507,16 @@ func ff_h264_idct_add16_\depth\()_rvv, zve32x · 3 unmodified lines
484507 ld s1, 16(sp)
485508 ld ra, 8(sp)
486509 ld s0, 0(sp)
487− addi sp, sp, 80
510+ addi sp, sp, 96
488511 ret
489512 endfunc
490513
491514 func ff_h264_idct_add16intra_\depth\()_rvv, zve32x
492515 csrwi vxrm, 0
493− addi sp, sp, -80
516+ addi sp, sp, -96
494517 lla t0, ff_h264_scan8
495518 sd s0, (sp)
496− li t1, 32 << (\depth > 8)
519+ li t1, 32 * (\depth / 8)
497520 mv s0, sp
498521 sd ra, 8(sp)
499522 sd s1, 16(sp)
@@ -503,9 +526,19 @@ func ff_h264_idct_add16intra_\depth\()_rvv, zve32x · 3 unmodified lines
503526 sd s5, 48(sp)
504527 sd s6, 56(sp)
505528 sd s7, 64(sp)
529+.if \depth > 8
530+ sd s8, 72(sp)
531+ sd s9, 80(sp)
532+ mv s8, a5
533+ mv s9, a6
534+.endif
506535 vsetivli zero, 16, e8, m1, ta, ma
507536 vle8.v v8, (t0)
537+.if \depth == 8
508538 vlse16.v v16, (a2), t1
539+.else
540+ vlse32.v v16, (a2), t1
541+.endif
509542 vluxei8.v v12, (a4), v8
510543 .if \depth == 8
511544 vsetvli zero, zero, e16, m2, ta, ma
@@ -532,18 +565,29 @@ func ff_h264_idct_add16intra_\depth\()_rvv, zve32x · 20 unmodified lines
532565 mv a1, s6
533566 mv a2, s7
534567 add a0, s4, t2
568+.if \depth > 8
569+ mv a5, s8
570+.endif
535571 beqz t0, 2f # if (nnzc[scan8[i]])
536− call .Lidct_add4_\depth\()_rvv
572+ jal .Lidct_add4_\depth\()_rvv
537573 j 3f
538574 2:
539575 beqz t1, 3f # if (block[i * 16])
576+.if \depth == 8
540577 call ff_h264_idct_dc_add_\depth\()_c
578+.else
579+ jalr s9
580+.endif
541581 3:
542582 srli s3, s3, 1
543583 addi s5, s5, 4
544− addi s6, s6, 16 * 2 << (\depth > 8)
584+ addi s6, s6, 16 * 2 * (\depth / 8)
545585 bnez s1, 1b
546586
587+.if \depth > 8
588+ ld s9, 80(sp)
589+ ld s8, 72(sp)
590+.endif
547591 ld s7, 64(sp)
548592 ld s6, 56(sp)
549593 ld s5, 48(sp)
@@ -553,16 +597,16 @@ func ff_h264_idct_add16intra_\depth\()_rvv, zve32x · 3 unmodified lines
553597 ld s1, 16(sp)
554598 ld ra, 8(sp)
555599 ld s0, 0(sp)
556− addi sp, sp, 80
600+ addi sp, sp, 96
557601 ret
558602 endfunc
559603
560604 func ff_h264_idct8_add4_\depth\()_rvv, zve32x
561605 csrwi vxrm, 0
562− addi sp, sp, -80
606+ addi sp, sp, -96
563607 lla t0, ff_h264_scan8
564608 sd s0, (sp)
565− li t1, 4 * 32 << (\depth > 8)
609+ li t1, 4 * 32 * (\depth / 8)
566610 mv s0, sp
567611 li t2, 4
568612 sd ra, 8(sp)
@@ -573,9 +617,19 @@ func ff_h264_idct8_add4_\depth\()_rvv, zve32x · 4 unmodified lines
573617 sd s5, 48(sp)
574618 sd s6, 56(sp)
575619 sd s7, 64(sp)
620+.if \depth > 8
621+ sd s8, 72(sp)
622+ sd s9, 80(sp)
623+ mv s8, a5
624+ mv s9, a6
625+.endif
576626 vsetivli zero, 4, e8, mf4, ta, ma
577627 vlse8.v v8, (t0), t2
628+.if \depth == 8
578629 vlse16.v v16, (a2), t1
630+.else
631+ vlse32.v v16, (a2), t1
632+.endif
579633 vluxei8.v v12, (a4), v8
580634 .if \depth == 8
581635 vsetvli zero, zero, e16, mf2, ta, ma
@@ -604,17 +658,28 @@ func ff_h264_idct8_add4_\depth\()_rvv, zve32x · 22 unmodified lines
604658 mv a1, s6
605659 mv a2, s7
606660 add a0, s4, t2
607− beqz t1, 2f # if (nnz == 1 && block[i * 16])
608− call ff_h264_idct8_dc_add_\depth\()_c
661+.if \depth > 8
662+ mv a5, s8
663+.endif
664+ bnez t1, 2f # if (nnz == 1 && block[i * 16])
665+ jal .Lidct8_add_\depth\()_rvv
609666 j 3f
610667 2:
611− call .Lidct8_add_\depth\()_rvv
668+.if \depth == 8
669+ call ff_h264_idct8_dc_add_\depth\()_c
670+.else
671+ jalr s9
672+.endif
612673 3:
613674 srli s3, s3, 1
614675 addi s5, s5, 4 * 4
615− addi s6, s6, 4 * 16 * 2 << (\depth > 8)
676+ addi s6, s6, 4 * 16 * 2 * (\depth / 8)
616677 bnez s1, 1b
617678
679+.if \depth > 8
680+ ld s9, 80(sp)
681+ ld s8, 72(sp)
682+.endif
618683 ld s7, 64(sp)
619684 ld s6, 56(sp)
620685 ld s5, 48(sp)
@@ -624,8 +689,28 @@ func ff_h264_idct8_add4_\depth\()_rvv, zve32x · 3 unmodified lines
624689 ld s1, 16(sp)
625690 ld ra, 8(sp)
626691 ld s0, 0(sp)
627− addi sp, sp, 80
692+ addi sp, sp, 96
628693 ret
629694 endfunc
630695 .endr
696+
697+.irp depth, 9, 10, 12, 14
698+func ff_h264_idct_add16_\depth\()_rvv, zve32x
699+ li a5, (1 << \depth) - 1
700+ lla a6, ff_h264_idct_dc_add_\depth\()_c
701+ j ff_h264_idct_add16_16_rvv
702+endfunc
703+
704+func ff_h264_idct_add16intra_\depth\()_rvv, zve32x
705+ li a5, (1 << \depth) - 1
706+ lla a6, ff_h264_idct_dc_add_\depth\()_c
707+ j ff_h264_idct_add16intra_16_rvv
708+endfunc
709+
710+func ff_h264_idct8_add4_\depth\()_rvv, zve32x
711+ li a5, (1 << \depth) - 1
712+ lla a6, ff_h264_idct8_dc_add_\depth\()_c
713+ j ff_h264_idct8_add4_16_rvv
714+endfunc
715+.endr
631716 #endif

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