You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavc/pixblockdsp: RISC-V I get_pixels
Benchmarks on SiFive U74-MC (courtesy of Shanghai StarFive Tech): get_pixels_c: 180.0 get_pixels_rvi: 136.7
This commit is contained in:
		
				
					committed by
					
						 Lynne
						Lynne
					
				
			
			
				
	
			
			
			
						parent
						
							04d092e7d5
						
					
				
				
					commit
					1edac8eb46
				
			| @@ -109,6 +109,8 @@ av_cold void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx) | ||||
|     ff_pixblockdsp_init_arm(c, avctx, high_bit_depth); | ||||
| #elif ARCH_PPC | ||||
|     ff_pixblockdsp_init_ppc(c, avctx, high_bit_depth); | ||||
| #elif ARCH_RISCV | ||||
|     ff_pixblockdsp_init_riscv(c, avctx, high_bit_depth); | ||||
| #elif ARCH_X86 | ||||
|     ff_pixblockdsp_init_x86(c, avctx, high_bit_depth); | ||||
| #elif ARCH_MIPS | ||||
|   | ||||
| @@ -52,6 +52,8 @@ void ff_pixblockdsp_init_arm(PixblockDSPContext *c, AVCodecContext *avctx, | ||||
|                              unsigned high_bit_depth); | ||||
| void ff_pixblockdsp_init_ppc(PixblockDSPContext *c, AVCodecContext *avctx, | ||||
|                              unsigned high_bit_depth); | ||||
| void ff_pixblockdsp_init_riscv(PixblockDSPContext *c, AVCodecContext *avctx, | ||||
|                                unsigned high_bit_depth); | ||||
| void ff_pixblockdsp_init_x86(PixblockDSPContext *c, AVCodecContext *avctx, | ||||
|                              unsigned high_bit_depth); | ||||
| void ff_pixblockdsp_init_mips(PixblockDSPContext *c, AVCodecContext *avctx, | ||||
|   | ||||
| @@ -1,2 +1,4 @@ | ||||
| OBJS-$(CONFIG_AUDIODSP) += riscv/audiodsp_init.o \ | ||||
|                            riscv/audiodsp_rvf.o | ||||
| OBJS-$(CONFIG_PIXBLOCKDSP) += riscv/pixblockdsp_init.o \ | ||||
|                               riscv/pixblockdsp_rvi.o | ||||
|   | ||||
							
								
								
									
										45
									
								
								libavcodec/riscv/pixblockdsp_init.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								libavcodec/riscv/pixblockdsp_init.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| /* | ||||
|  * Copyright © 2022 Rémi Denis-Courmont. | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * FFmpeg is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with FFmpeg; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| #include "libavutil/attributes.h" | ||||
| #include "libavutil/cpu.h" | ||||
| #include "libavcodec/avcodec.h" | ||||
| #include "libavcodec/pixblockdsp.h" | ||||
|  | ||||
| void ff_get_pixels_8_rvi(int16_t *block, const uint8_t *pixels, | ||||
|                          ptrdiff_t stride); | ||||
| void ff_get_pixels_16_rvi(int16_t *block, const uint8_t *pixels, | ||||
|                           ptrdiff_t stride); | ||||
|  | ||||
| av_cold void ff_pixblockdsp_init_riscv(PixblockDSPContext *c, | ||||
|                                        AVCodecContext *avctx, | ||||
|                                        unsigned high_bit_depth) | ||||
| { | ||||
|     int cpu_flags = av_get_cpu_flags(); | ||||
|  | ||||
|     if (cpu_flags & AV_CPU_FLAG_RVI) { | ||||
|         if (high_bit_depth) | ||||
|             c->get_pixels = ff_get_pixels_16_rvi; | ||||
|         else | ||||
|             c->get_pixels = ff_get_pixels_8_rvi; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										59
									
								
								libavcodec/riscv/pixblockdsp_rvi.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								libavcodec/riscv/pixblockdsp_rvi.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| /* | ||||
|  * Copyright © 2022 Rémi Denis-Courmont. | ||||
|  * | ||||
|  * This file is part of FFmpeg. | ||||
|  * | ||||
|  * FFmpeg is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2.1 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * FFmpeg is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with FFmpeg; if not, write to the Free Software | ||||
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
| #include "../libavutil/riscv/asm.S" | ||||
|  | ||||
| func ff_get_pixels_8_rvi | ||||
| .irp row, 0, 1, 2, 3, 4, 5, 6, 7 | ||||
|         ld      t0,    (a1) | ||||
|         add     a1, a1, a2 | ||||
|         sd      zero, ((\row * 16) + 0)(a0) | ||||
|         addi    t6, t6, -1 | ||||
|         sd      zero, ((\row * 16) + 8)(a0) | ||||
|         srli    t1, t0, 8 | ||||
|         sb      t0, ((\row * 16) + 0)(a0) | ||||
|         srli    t2, t0, 16 | ||||
|         sb      t1, ((\row * 16) + 2)(a0) | ||||
|         srli    t3, t0, 24 | ||||
|         sb      t2, ((\row * 16) + 4)(a0) | ||||
|         srli    t4, t0, 32 | ||||
|         sb      t3, ((\row * 16) + 6)(a0) | ||||
|         srli    t1, t0, 40 | ||||
|         sb      t4, ((\row * 16) + 8)(a0) | ||||
|         srli    t2, t0, 48 | ||||
|         sb      t1, ((\row * 16) + 10)(a0) | ||||
|         srli    t3, t0, 56 | ||||
|         sb      t2, ((\row * 16) + 12)(a0) | ||||
|         sb      t3, ((\row * 16) + 14)(a0) | ||||
| .endr | ||||
|         ret | ||||
| endfunc | ||||
|  | ||||
| func ff_get_pixels_16_rvi | ||||
| .irp row, 0, 1, 2, 3, 4, 5, 6, 7 | ||||
|         ld      t0, 0(a1) | ||||
|         ld      t1, 8(a1) | ||||
|         add     a1, a1, a2 | ||||
|         sd      t0, ((\row * 16) + 0)(a0) | ||||
|         sd      t1, ((\row * 16) + 8)(a0) | ||||
| .endr | ||||
|         ret | ||||
| endfunc | ||||
		Reference in New Issue
	
	Block a user