History

lavc/h264dsp: R-V V idct4_add8 (all depths)

These are really just wrappers for idct4_add16intra functions, which are in turn mostly wrappers for idct4_add and idct4_dc_add functions. For benchmarks refer to the later two sets.

Rémi Denis-Courmont committed 2 years ago

Commit 4edfc111 parent eb3cc502 files · +107 −14Browse files

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

Unified · Split

2 files
  1. libavcodec/riscv/h264dsp_init.c +20 −4
  2. libavcodec/riscv/h264idct_rvv.S +87 −10
libavcodec/riscv/h264dsp_init.c+20−4
@@ -54,7 +54,13 @@ void ff_h264_idct_add16intra_##depth##_rvv(uint8_t *d, const int *soffset, \ · 53 unmodified lines
5454 const uint8_t nnzc[5 * 8]); \
5555 void ff_h264_idct8_add4_##depth##_rvv(uint8_t *d, const int *soffset, \
5656 int16_t *s, int stride, \
57− const uint8_t nnzc[5 * 8]);
57+ const uint8_t nnzc[5 * 8]); \
58+void ff_h264_idct4_add8_##depth##_rvv(uint8_t **d, const int *soffset, \
59+ int16_t *s, int stride, \
60+ const uint8_t nnzc[5 * 8]); \
61+void ff_h264_idct4_add8_422_##depth##_rvv(uint8_t **d, const int *soffset, \
62+ int16_t *s, int stride, \
63+ const uint8_t nnzc[5 * 8]);
5864
5965 IDCT_DEPTH(8)
6066 IDCT_DEPTH(9)
@@ -104,6 +110,10 @@ av_cold void ff_h264dsp_init_riscv(H264DSPContext *dsp, const int bit_depth, · 43 unmodified lines
104110 dsp->h264_idct_add16intra = ff_h264_idct_add16intra_8_rvv;
105111 # if __riscv_xlen == 64
106112 dsp->h264_idct8_add4 = ff_h264_idct8_add4_8_rvv;
113+ if (chroma_format_idc <= 1)
114+ dsp->h264_idct_add8 = ff_h264_idct4_add8_8_rvv;
115+ else
116+ dsp->h264_idct_add8 = ff_h264_idct4_add8_422_8_rvv;
107117 # endif
108118 }
109119 if (flags & AV_CPU_FLAG_RVV_I64) {
@@ -123,10 +133,16 @@ av_cold void ff_h264dsp_init_riscv(H264DSPContext *dsp, const int bit_depth, · 13 unmodified lines
123133 if (zvl128b && (flags & AV_CPU_FLAG_RVB)) { \
124134 dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_##depth##_rvv; \
125135 dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_##depth##_rvv; \
136+ dsp->h264_idct_add16 = ff_h264_idct_add16_##depth##_rvv; \
137+ dsp->h264_idct_add16intra = \
138+ ff_h264_idct_add16intra_##depth##_rvv; \
126139 if (__riscv_xlen == 64) { \
127− dsp->h264_idct_add16 = ff_h264_idct_add16_##depth##_rvv; \
128− dsp->h264_idct_add16intra = \
129− ff_h264_idct_add16intra_##depth##_rvv; \
140+ if (chroma_format_idc <= 1) \
141+ dsp->h264_idct_add8 = \
142+ ff_h264_idct4_add8_##depth##_rvv; \
143+ else \
144+ dsp->h264_idct_add8 = \
145+ ff_h264_idct4_add8_422_##depth##_rvv; \
130146 } \
131147 } \
132148 if (__riscv_xlen == 64 && (flags & AV_CPU_FLAG_RVB)) \
libavcodec/riscv/h264idct_rvv.S+87−10
@@ -57,7 +57,7 @@ endfunc · 56 unmodified lines
5757 func ff_h264_idct_add_8_rvv, zve32x
5858 lpad 0
5959 csrwi vxrm, 0
60−.Lidct_add4_8_rvv:
60+.Lidct4_add_8_rvv:
6161 vsetivli zero, 4, e16, mf2, ta, ma
6262 addi t1, a1, 1 * 4 * 2
6363 vle16.v v0, (a1)
@@ -111,7 +111,7 @@ endfunc · 47 unmodified lines
111111
112112 func ff_h264_idct_add_16_rvv, zve32x
113113 csrwi vxrm, 0
114−.Lidct_add4_16_rvv:
114+.Lidct4_add_16_rvv:
115115 vsetivli zero, 4, e32, m1, ta, ma
116116 addi t1, a1, 1 * 4 * 4
117117 vle32.v v0, (a1)
@@ -543,19 +543,26 @@ endfunc · 425 unmodified lines
543543 .endr
544544
545545 const ff_h264_scan8
546− .byte 014, 015, 024, 025, 016, 017, 026, 027
547− .byte 034, 035, 044, 045, 036, 037, 046, 047
546+ .byte 014, 015, 024, 025, 016, 017, 026, 027
547+ .byte 034, 035, 044, 045, 036, 037, 046, 047
548+ .byte 064, 065, 074, 075, 066, 067, 076, 077
549+ .byte 0104, 0105, 0114, 0115, 0106, 0107, 0116, 0117
550+ .byte 0134, 0135, 0144, 0145, 0136, 0137, 0146, 0147
551+ .byte 0154, 0155, 0164, 0165, 0156, 0157, 0166, 0167
548552 endconst
549553
550−.macro idct4_adds type, depth
554+.macro idct4_add16 type, depth
551555 func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b
552556 .if \depth == 8
553557 lpad 0
554558 .endif
555559 csrwi vxrm, 0
556560 lla t0, ff_h264_scan8
557− li t1, 32 * (\depth / 8)
558561 vsetivli zero, 16, e8, m1, ta, ma
562+.ifc \type, 16intra
563+.Lidct4_add4_\depth\()_rvv:
564+.endif
565+ li t1, 32 * (\depth / 8)
559566 vle8.v v8, (t0)
560567 .if \depth == 8
561568 vlse16.v v16, (a2), t1
@@ -587,7 +594,7 @@ func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b · 25 unmodified lines
587594 mv t5, a1
588595 mv a1, a2
589596 mv a2, a3
590− li a3, 16
597+ csrr a3, vl
591598 mv a7, ra
592599 1:
593600 andi t0, a4, 1
@@ -603,7 +610,7 @@ func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b · 9 unmodified lines
603610 .else
604611 beqz t0, 2f # if (nnzc[scan8[i]])
605612 .endif
606− jal .Lidct_add4_\depth\()_rvv
613+ jal .Lidct4_add_\depth\()_rvv
607614 j 3f
608615 2:
609616 .ifnc \type, 16
@@ -621,9 +628,67 @@ func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b · 11 unmodified lines
621628 endfunc
622629 .endm
623630
631+.macro idct4_add8 type, depth
632+func ff_h264_idct4_add\type\()_\depth\()_rvv, zve32x
633+.if \depth == 8
634+ lpad 0
635+.endif
636+ csrwi vxrm, 0
637+ addi sp, sp, -32
638+ addi a2, a2, 16 * 16 * 2 * (\depth / 8) # &block[16 * 16]
639+ lla t0, ff_h264_scan8 + 16
640+ sd s0, 0(sp)
641+ sd ra, 8(sp)
642+ mv s0, sp
643+ sd a0, 16(sp)
644+ sd a4, 24(sp)
645+ ld a0, 0(a0) # dest[0]
646+ addi a1, a1, 16 * 4 # &block_offset[16]
647+ vsetivli zero, 4, e8, mf4, ta, ma
648+ jal .Lidct4_add4_\depth\()_rvv
649+
650+ ld a4, 24(sp) # nnzc
651+ ld a0, 16(sp)
652+ mv a3, a2 # stride
653+ addi a2, a1, (16 - 4) * 16 * 2 * (\depth / 8) # &block[32 * 16]
654+ addi a1, t5, (16 - 4) * 4 # &block_offset[32]
655+ ld a0, 8(a0) # dest[1]
656+ lla t0, ff_h264_scan8 + 32
657+.ifc \type, 8_422
658+ vsetivli zero, 4, e8, mf4, ta, ma
659+ jal .Lidct4_add4_\depth\()_rvv
660+
661+ ld a4, 24(sp) # nnzc
662+ ld a0, 16(sp)
663+ mv a3, a2 # stride
664+ addi a2, a1, (-12- 4) * 16 * 2 * (\depth / 8) # &block[20 * 16]
665+ addi a1, t5, (-8 - 4) * 4 # &block_offset[24]
666+ ld a0, 0(a0) # dest[0]
667+ lla t0, ff_h264_scan8 + 24
668+ vsetivli zero, 4, e8, mf4, ta, ma
669+ jal .Lidct4_add4_\depth\()_rvv
670+
671+ ld a4, 24(sp) # nnzc
672+ ld a0, 16(sp)
673+ mv a3, a2 # stride
674+ addi a2, a1, (16 - 4) * 16 * 2 * (\depth / 8) # &block[36 * 16]
675+ addi a1, t5, (16 - 4) * 4 # &block_offset[40]
676+ ld a0, 8(a0) # dest[1]
677+ lla t0, ff_h264_scan8 + 40
678+.endif
679+ ld ra, 8(sp)
680+ ld s0, 0(sp)
681+ addi sp, sp, 32
682+ vsetivli zero, 4, e8, mf4, ta, ma
683+ j .Lidct4_add4_\depth\()_rvv
684+endfunc
685+.endm
686+
624687 .irp depth, 8, 16
625−idct4_adds 16, \depth
626−idct4_adds 16intra, \depth
688+idct4_add16 16, \depth
689+idct4_add16 16intra, \depth
690+idct4_add8 8, \depth
691+idct4_add8 8_422, \depth
627692
628693 #if (__riscv_xlen == 64)
629694 func ff_h264_idct8_add4_\depth\()_rvv, zve32x, b
@@ -724,5 +789,17 @@ func ff_h264_idct8_add4_\depth\()_rvv, zve32x · 94 unmodified lines
724789 li a5, (1 << \depth) - 1
725790 j ff_h264_idct8_add4_16_rvv
726791 endfunc
792+
793+func ff_h264_idct4_add8_\depth\()_rvv, zve32x
794+ lpad 0
795+ li a5, (1 << \depth) - 1
796+ j ff_h264_idct4_add8_16_rvv
797+endfunc
798+
799+func ff_h264_idct4_add8_422_\depth\()_rvv, zve32x
800+ lpad 0
801+ li a5, (1 << \depth) - 1
802+ j ff_h264_idct4_add8_422_16_rvv
803+endfunc
727804 #endif
728805 .endr

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