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
54 const uint8_t nnzc[5 * 8]); \54 const uint8_t nnzc[5 * 8]); \
55void ff_h264_idct8_add4_##depth##_rvv(uint8_t *d, const int *soffset, \55void ff_h264_idct8_add4_##depth##_rvv(uint8_t *d, const int *soffset, \
56 int16_t *s, int stride, \56 int16_t *s, int stride, \
57 const uint8_t nnzc[5 * 8]);57 const uint8_t nnzc[5 * 8]); \
58void 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]); \
61void 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]);
58 64
59IDCT_DEPTH(8)65IDCT_DEPTH(8)
60IDCT_DEPTH(9)66IDCT_DEPTH(9)
@@ -104,6 +110,10 @@ av_cold void ff_h264dsp_init_riscv(H264DSPContext *dsp, const int bit_depth, · 43 unmodified lines
104 dsp->h264_idct_add16intra = ff_h264_idct_add16intra_8_rvv;110 dsp->h264_idct_add16intra = ff_h264_idct_add16intra_8_rvv;
105# if __riscv_xlen == 64111# if __riscv_xlen == 64
106 dsp->h264_idct8_add4 = ff_h264_idct8_add4_8_rvv;112 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;
107# endif117# endif
108 }118 }
109 if (flags & AV_CPU_FLAG_RVV_I64) {119 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
123 if (zvl128b && (flags & AV_CPU_FLAG_RVB)) { \133 if (zvl128b && (flags & AV_CPU_FLAG_RVB)) { \
124 dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_##depth##_rvv; \134 dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_##depth##_rvv; \
125 dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_##depth##_rvv; \135 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; \
126 if (__riscv_xlen == 64) { \139 if (__riscv_xlen == 64) { \
127 dsp->h264_idct_add16 = ff_h264_idct_add16_##depth##_rvv; \140 if (chroma_format_idc <= 1) \
128 dsp->h264_idct_add16intra = \141 dsp->h264_idct_add8 = \
129 ff_h264_idct_add16intra_##depth##_rvv; \142 ff_h264_idct4_add8_##depth##_rvv; \
143 else \
144 dsp->h264_idct_add8 = \
145 ff_h264_idct4_add8_422_##depth##_rvv; \
130 } \146 } \
131 } \147 } \
132 if (__riscv_xlen == 64 && (flags & AV_CPU_FLAG_RVB)) \148 if (__riscv_xlen == 64 && (flags & AV_CPU_FLAG_RVB)) \
libavcodec/riscv/h264idct_rvv.S+87−10
@@ -57,7 +57,7 @@ endfunc · 56 unmodified lines
57func ff_h264_idct_add_8_rvv, zve32x57func ff_h264_idct_add_8_rvv, zve32x
58 lpad 058 lpad 0
59 csrwi vxrm, 059 csrwi vxrm, 0
60.Lidct_add4_8_rvv:60.Lidct4_add_8_rvv:
61 vsetivli zero, 4, e16, mf2, ta, ma61 vsetivli zero, 4, e16, mf2, ta, ma
62 addi t1, a1, 1 * 4 * 262 addi t1, a1, 1 * 4 * 2
63 vle16.v v0, (a1)63 vle16.v v0, (a1)
@@ -111,7 +111,7 @@ endfunc · 47 unmodified lines
111 111
112func ff_h264_idct_add_16_rvv, zve32x112func ff_h264_idct_add_16_rvv, zve32x
113 csrwi vxrm, 0113 csrwi vxrm, 0
114.Lidct_add4_16_rvv:114.Lidct4_add_16_rvv:
115 vsetivli zero, 4, e32, m1, ta, ma115 vsetivli zero, 4, e32, m1, ta, ma
116 addi t1, a1, 1 * 4 * 4116 addi t1, a1, 1 * 4 * 4
117 vle32.v v0, (a1)117 vle32.v v0, (a1)
@@ -543,19 +543,26 @@ endfunc · 425 unmodified lines
543.endr543.endr
544 544
545const ff_h264_scan8545const ff_h264_scan8
546 .byte 014, 015, 024, 025, 016, 017, 026, 027546 .byte 014, 015, 024, 025, 016, 017, 026, 027
547 .byte 034, 035, 044, 045, 036, 037, 046, 047547 .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
548endconst552endconst
549 553
550.macro idct4_adds type, depth554.macro idct4_add16 type, depth
551func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b555func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b
552.if \depth == 8556.if \depth == 8
553 lpad 0557 lpad 0
554.endif558.endif
555 csrwi vxrm, 0559 csrwi vxrm, 0
556 lla t0, ff_h264_scan8560 lla t0, ff_h264_scan8
557 li t1, 32 * (\depth / 8)
558 vsetivli zero, 16, e8, m1, ta, ma561 vsetivli zero, 16, e8, m1, ta, ma
562.ifc \type, 16intra
563.Lidct4_add4_\depth\()_rvv:
564.endif
565 li t1, 32 * (\depth / 8)
559 vle8.v v8, (t0)566 vle8.v v8, (t0)
560.if \depth == 8567.if \depth == 8
561 vlse16.v v16, (a2), t1568 vlse16.v v16, (a2), t1
@@ -587,7 +594,7 @@ func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b · 25 unmodified lines
587 mv t5, a1594 mv t5, a1
588 mv a1, a2595 mv a1, a2
589 mv a2, a3596 mv a2, a3
590 li a3, 16597 csrr a3, vl
591 mv a7, ra598 mv a7, ra
5921:5991:
593 andi t0, a4, 1600 andi t0, a4, 1
@@ -603,7 +610,7 @@ func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b · 9 unmodified lines
603.else610.else
604 beqz t0, 2f # if (nnzc[scan8[i]])611 beqz t0, 2f # if (nnzc[scan8[i]])
605.endif612.endif
606 jal .Lidct_add4_\depth\()_rvv613 jal .Lidct4_add_\depth\()_rvv
607 j 3f614 j 3f
6082:6152:
609.ifnc \type, 16616.ifnc \type, 16
@@ -621,9 +628,67 @@ func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b · 11 unmodified lines
621endfunc628endfunc
622.endm629.endm
623 630
631.macro idct4_add8 type, depth
632func 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
684endfunc
685.endm
686
624.irp depth, 8, 16687.irp depth, 8, 16
625idct4_adds 16, \depth688idct4_add16 16, \depth
626idct4_adds 16intra, \depth689idct4_add16 16intra, \depth
690idct4_add8 8, \depth
691idct4_add8 8_422, \depth
627 692
628#if (__riscv_xlen == 64)693#if (__riscv_xlen == 64)
629func ff_h264_idct8_add4_\depth\()_rvv, zve32x, b694func ff_h264_idct8_add4_\depth\()_rvv, zve32x, b
@@ -724,5 +789,17 @@ func ff_h264_idct8_add4_\depth\()_rvv, zve32x · 94 unmodified lines
724 li a5, (1 << \depth) - 1789 li a5, (1 << \depth) - 1
725 j ff_h264_idct8_add4_16_rvv790 j ff_h264_idct8_add4_16_rvv
726endfunc791endfunc
792
793func ff_h264_idct4_add8_\depth\()_rvv, zve32x
794 lpad 0
795 li a5, (1 << \depth) - 1
796 j ff_h264_idct4_add8_16_rvv
797endfunc
798
799func 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
803endfunc
727#endif804#endif
728.endr805.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