PR #21058 opened by Rémi Denis-Courmont (Courmisch) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21058 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21058.patch
From b4e5ae52354bfdb5f09e61a35c41beee0eb16314 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Fri, 14 Nov 2025 11:24:45 +0100 Subject: [PATCH 1/2] avcodec/mpegvideo_unquantize: Constify MPVContext pointee Also use MPVContext instead of MpegEncContext. Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/arm/mpegvideo_arm.c | 4 ++-- libavcodec/arm/mpegvideo_armv5te.c | 8 ++++---- libavcodec/mips/h263dsp_mips.h | 6 +++--- libavcodec/mips/mpegvideo_mips.h | 20 ++++++++++---------- libavcodec/mips/mpegvideo_mmi.c | 20 ++++++++++---------- libavcodec/mips/mpegvideo_msa.c | 6 +++--- libavcodec/mpeg4videodec.h | 6 +++--- libavcodec/mpegvideo.h | 12 ++++++------ libavcodec/mpegvideo_unquantize.c | 28 ++++++++++++++-------------- libavcodec/mpegvideo_unquantize.h | 26 +++++++++++++------------- libavcodec/neon/mpegvideo.c | 4 ++-- libavcodec/ppc/mpegvideo_altivec.c | 4 ++-- libavcodec/x86/mpegvideo.c | 24 ++++++++++++------------ 13 files changed, 84 insertions(+), 84 deletions(-) diff --git a/libavcodec/arm/mpegvideo_arm.c b/libavcodec/arm/mpegvideo_arm.c index 5c96c9df2c..cb109cd832 100644 --- a/libavcodec/arm/mpegvideo_arm.c +++ b/libavcodec/arm/mpegvideo_arm.c @@ -41,9 +41,9 @@ CHECK_OFFSET(MpegEncContext, inter_scantable.raster_end, CHECK_OFFSET(MpegEncContext, h263_aic, H263_AIC); #endif -void ff_dct_unquantize_h263_inter_neon(MpegEncContext *s, int16_t *block, +void ff_dct_unquantize_h263_inter_neon(const MPVContext *s, int16_t *block, int n, int qscale); -void ff_dct_unquantize_h263_intra_neon(MpegEncContext *s, int16_t *block, +void ff_dct_unquantize_h263_intra_neon(const MPVContext *s, int16_t *block, int n, int qscale); av_cold void ff_mpv_unquantize_init_arm(MPVUnquantDSPContext *s, int bitexact) diff --git a/libavcodec/arm/mpegvideo_armv5te.c b/libavcodec/arm/mpegvideo_armv5te.c index 2737f68643..3a6d015767 100644 --- a/libavcodec/arm/mpegvideo_armv5te.c +++ b/libavcodec/arm/mpegvideo_armv5te.c @@ -50,8 +50,8 @@ static inline void dct_unquantize_h263_helper_c(int16_t *block, int qmul, int qa } #endif -static void dct_unquantize_h263_intra_armv5te(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_h263_intra_armv5te(const MPVContext *s, + int16_t *block, int n, int qscale) { int level, qmul, qadd; int nCoeffs; @@ -79,8 +79,8 @@ static void dct_unquantize_h263_intra_armv5te(MpegEncContext *s, block[0] = level; } -static void dct_unquantize_h263_inter_armv5te(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_h263_inter_armv5te(const MPVContext *s, + int16_t *block, int n, int qscale) { int qmul, qadd; int nCoeffs; diff --git a/libavcodec/mips/h263dsp_mips.h b/libavcodec/mips/h263dsp_mips.h index d4de2233a7..5ea9fcbb88 100644 --- a/libavcodec/mips/h263dsp_mips.h +++ b/libavcodec/mips/h263dsp_mips.h @@ -25,11 +25,11 @@ void ff_h263_h_loop_filter_msa(uint8_t *src, int stride, int q_scale); void ff_h263_v_loop_filter_msa(uint8_t *src, int stride, int q_scale); -void ff_dct_unquantize_mpeg2_inter_msa(MpegEncContext *s, int16_t *block, +void ff_dct_unquantize_mpeg2_inter_msa(const MPVContext *s, int16_t *block, int32_t index, int32_t q_scale); -void ff_dct_unquantize_h263_inter_msa(MpegEncContext *s, int16_t *block, +void ff_dct_unquantize_h263_inter_msa(const MPVContext *s, int16_t *block, int32_t index, int32_t q_scale); -void ff_dct_unquantize_h263_intra_msa(MpegEncContext *s, int16_t *block, +void ff_dct_unquantize_h263_intra_msa(const MPVContext *s, int16_t *block, int32_t index, int32_t q_scale); int ff_pix_sum_msa(const uint8_t *pix, ptrdiff_t line_size); diff --git a/libavcodec/mips/mpegvideo_mips.h b/libavcodec/mips/mpegvideo_mips.h index 2a9ea4006e..2544279ac5 100644 --- a/libavcodec/mips/mpegvideo_mips.h +++ b/libavcodec/mips/mpegvideo_mips.h @@ -23,16 +23,16 @@ #include "libavcodec/mpegvideo.h" -void ff_dct_unquantize_h263_intra_mmi(MpegEncContext *s, int16_t *block, - int n, int qscale); -void ff_dct_unquantize_h263_inter_mmi(MpegEncContext *s, int16_t *block, - int n, int qscale); -void ff_dct_unquantize_mpeg1_intra_mmi(MpegEncContext *s, int16_t *block, - int n, int qscale); -void ff_dct_unquantize_mpeg1_inter_mmi(MpegEncContext *s, int16_t *block, - int n, int qscale); -void ff_dct_unquantize_mpeg2_intra_mmi(MpegEncContext *s, int16_t *block, - int n, int qscale); +void ff_dct_unquantize_h263_intra_mmi(const MPVContext *s, int16_t *block, + int n, int qscale); +void ff_dct_unquantize_h263_inter_mmi(const MPVContext *s, int16_t *block, + int n, int qscale); +void ff_dct_unquantize_mpeg1_intra_mmi(const MPVContext *s, int16_t *block, + int n, int qscale); +void ff_dct_unquantize_mpeg1_inter_mmi(const MPVContext *s, int16_t *block, + int n, int qscale); +void ff_dct_unquantize_mpeg2_intra_mmi(const MPVContext *s, int16_t *block, + int n, int qscale); void ff_denoise_dct_mmi(int16_t block[64], int sum[64], const uint16_t offset[64]); #endif /* AVCODEC_MIPS_MPEGVIDEO_MIPS_H */ diff --git a/libavcodec/mips/mpegvideo_mmi.c b/libavcodec/mips/mpegvideo_mmi.c index 87d4aafd8c..90bd90c147 100644 --- a/libavcodec/mips/mpegvideo_mmi.c +++ b/libavcodec/mips/mpegvideo_mmi.c @@ -25,8 +25,8 @@ #include "mpegvideo_mips.h" #include "libavutil/mips/mmiutils.h" -void ff_dct_unquantize_h263_intra_mmi(MpegEncContext *s, int16_t *block, - int n, int qscale) +void ff_dct_unquantize_h263_intra_mmi(const MPVContext *s, int16_t *block, + int n, int qscale) { int64_t level, nCoeffs; double ftmp[6]; @@ -101,8 +101,8 @@ void ff_dct_unquantize_h263_intra_mmi(MpegEncContext *s, int16_t *block, block[0] = level; } -void ff_dct_unquantize_h263_inter_mmi(MpegEncContext *s, int16_t *block, - int n, int qscale) +void ff_dct_unquantize_h263_inter_mmi(const MPVContext *s, int16_t *block, + int n, int qscale) { int64_t nCoeffs; double ftmp[6]; @@ -160,8 +160,8 @@ void ff_dct_unquantize_h263_inter_mmi(MpegEncContext *s, int16_t *block, ); } -void ff_dct_unquantize_mpeg1_intra_mmi(MpegEncContext *s, int16_t *block, - int n, int qscale) +void ff_dct_unquantize_mpeg1_intra_mmi(const MPVContext *s, int16_t *block, + int n, int qscale) { int64_t nCoeffs; const uint16_t *quant_matrix; @@ -254,8 +254,8 @@ void ff_dct_unquantize_mpeg1_intra_mmi(MpegEncContext *s, int16_t *block, block[0] = block0; } -void ff_dct_unquantize_mpeg1_inter_mmi(MpegEncContext *s, int16_t *block, - int n, int qscale) +void ff_dct_unquantize_mpeg1_inter_mmi(const MPVContext *s, int16_t *block, + int n, int qscale) { int64_t nCoeffs; const uint16_t *quant_matrix; @@ -342,8 +342,8 @@ void ff_dct_unquantize_mpeg1_inter_mmi(MpegEncContext *s, int16_t *block, ); } -void ff_dct_unquantize_mpeg2_intra_mmi(MpegEncContext *s, int16_t *block, - int n, int qscale) +void ff_dct_unquantize_mpeg2_intra_mmi(const MPVContext *s, int16_t *block, + int n, int qscale) { uint64_t nCoeffs; const uint16_t *quant_matrix; diff --git a/libavcodec/mips/mpegvideo_msa.c b/libavcodec/mips/mpegvideo_msa.c index cd4adc0f77..a870a2cd79 100644 --- a/libavcodec/mips/mpegvideo_msa.c +++ b/libavcodec/mips/mpegvideo_msa.c @@ -194,7 +194,7 @@ static int32_t mpeg2_dct_unquantize_inter_msa(int16_t *block, return sum_res; } -void ff_dct_unquantize_h263_intra_msa(MpegEncContext *s, +void ff_dct_unquantize_h263_intra_msa(const MPVContext *s, int16_t *block, int32_t index, int32_t qscale) { @@ -219,7 +219,7 @@ void ff_dct_unquantize_h263_intra_msa(MpegEncContext *s, h263_dct_unquantize_msa(block, qmul, qadd, nCoeffs, 1); } -void ff_dct_unquantize_h263_inter_msa(MpegEncContext *s, +void ff_dct_unquantize_h263_inter_msa(const MPVContext *s, int16_t *block, int32_t index, int32_t qscale) { @@ -236,7 +236,7 @@ void ff_dct_unquantize_h263_inter_msa(MpegEncContext *s, h263_dct_unquantize_msa(block, qmul, qadd, nCoeffs, 0); } -void ff_dct_unquantize_mpeg2_inter_msa(MpegEncContext *s, +void ff_dct_unquantize_mpeg2_inter_msa(const MPVContext *s, int16_t *block, int32_t index, int32_t qscale) { diff --git a/libavcodec/mpeg4videodec.h b/libavcodec/mpeg4videodec.h index aafde454ea..2eafa1ef8b 100644 --- a/libavcodec/mpeg4videodec.h +++ b/libavcodec/mpeg4videodec.h @@ -93,11 +93,11 @@ typedef struct Mpeg4DecContext { Mpeg4VideoDSPContext mdsp; - void (*dct_unquantize_mpeg2_inter)(MpegEncContext *s, + void (*dct_unquantize_mpeg2_inter)(const MPVContext *s, int16_t *block, int n, int qscale); - void (*dct_unquantize_mpeg2_intra)(MpegEncContext *s, + void (*dct_unquantize_mpeg2_intra)(const MPVContext *s, int16_t *block, int n, int qscale); - void (*dct_unquantize_h263_intra)(MpegEncContext *s, + void (*dct_unquantize_h263_intra)(const MPVContext *s, int16_t *block, int n, int qscale); union { diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index cb4b99acd3..e21ce5164d 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -57,6 +57,8 @@ enum OutputFormat { FMT_SPEEDHQ, }; +typedef struct MpegEncContext MPVContext; + /** * MpegEncContext. */ @@ -271,10 +273,10 @@ typedef struct MpegEncContext { int interlaced_dct; int first_field; ///< is 1 for the first field of a field picture 0 otherwise - void (*dct_unquantize_intra)(struct MpegEncContext *s, // unquantizer to use (MPEG-4 can use both) - int16_t *block/*align 16*/, int n, int qscale); - void (*dct_unquantize_inter)(struct MpegEncContext *s, // unquantizer to use (MPEG-4 can use both) - int16_t *block/*align 16*/, int n, int qscale); + void (*dct_unquantize_intra)(const MPVContext *s, // unquantizer to use (MPEG-4 can use both) + int16_t *block/*align 16*/, int n, int qscale); + void (*dct_unquantize_inter)(const MPVContext *s, // unquantizer to use (MPEG-4 can use both) + int16_t *block/*align 16*/, int n, int qscale); /* flag to indicate a reinitialization is required, e.g. after * a frame size change */ @@ -286,8 +288,6 @@ typedef struct MpegEncContext { ERContext er; } MpegEncContext; -typedef MpegEncContext MPVContext; - /** * Set the given MpegEncContext to common defaults (same for encoding * and decoding). The changed fields will not depend upon the prior diff --git a/libavcodec/mpegvideo_unquantize.c b/libavcodec/mpegvideo_unquantize.c index 213e37a514..06c29d0753 100644 --- a/libavcodec/mpegvideo_unquantize.c +++ b/libavcodec/mpegvideo_unquantize.c @@ -33,8 +33,8 @@ #include "mpegvideodata.h" #include "mpegvideo_unquantize.h" -static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_mpeg1_intra_c(const MPVContext *s, + int16_t *block, int n, int qscale) { int i, level, nCoeffs; const uint16_t *quant_matrix; @@ -62,8 +62,8 @@ static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s, } } -static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_mpeg1_inter_c(const MPVContext *s, + int16_t *block, int n, int qscale) { int i, level, nCoeffs; const uint16_t *quant_matrix; @@ -91,8 +91,8 @@ static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s, } } -static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_mpeg2_intra_c(const MPVContext *s, + int16_t *block, int n, int qscale) { int i, level, nCoeffs; const uint16_t *quant_matrix; @@ -120,8 +120,8 @@ static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s, } } -static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_mpeg2_intra_bitexact(const MPVContext *s, + int16_t *block, int n, int qscale) { int i, level, nCoeffs; const uint16_t *quant_matrix; @@ -153,8 +153,8 @@ static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s, block[63]^=sum&1; } -static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_mpeg2_inter_c(const MPVContext *s, + int16_t *block, int n, int qscale) { int i, level, nCoeffs; const uint16_t *quant_matrix; @@ -186,8 +186,8 @@ static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s, block[63]^=sum&1; } -static void dct_unquantize_h263_intra_c(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_h263_intra_c(const MPVContext *s, + int16_t *block, int n, int qscale) { int i, level, qmul, qadd; int nCoeffs; @@ -220,8 +220,8 @@ static void dct_unquantize_h263_intra_c(MpegEncContext *s, } } -static void dct_unquantize_h263_inter_c(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_h263_inter_c(const MPVContext *s, + int16_t *block, int n, int qscale) { int i, level, qmul, qadd; int nCoeffs; diff --git a/libavcodec/mpegvideo_unquantize.h b/libavcodec/mpegvideo_unquantize.h index 3e6d8aedf7..1a43f467c6 100644 --- a/libavcodec/mpegvideo_unquantize.h +++ b/libavcodec/mpegvideo_unquantize.h @@ -29,21 +29,21 @@ #include "config.h" -typedef struct MpegEncContext MpegEncContext; +typedef struct MpegEncContext MPVContext; typedef struct MPVUnquantDSPContext { - void (*dct_unquantize_mpeg1_intra)(struct MpegEncContext *s, - int16_t *block/*align 16*/, int n, int qscale); - void (*dct_unquantize_mpeg1_inter)(struct MpegEncContext *s, - int16_t *block/*align 16*/, int n, int qscale); - void (*dct_unquantize_mpeg2_intra)(struct MpegEncContext *s, - int16_t *block/*align 16*/, int n, int qscale); - void (*dct_unquantize_mpeg2_inter)(struct MpegEncContext *s, - int16_t *block/*align 16*/, int n, int qscale); - void (*dct_unquantize_h263_intra)(struct MpegEncContext *s, - int16_t *block/*align 16*/, int n, int qscale); - void (*dct_unquantize_h263_inter)(struct MpegEncContext *s, - int16_t *block/*align 16*/, int n, int qscale); + void (*dct_unquantize_mpeg1_intra)(const MPVContext *s, + int16_t *block/*align 16*/, int n, int qscale); + void (*dct_unquantize_mpeg1_inter)(const MPVContext *s, + int16_t *block/*align 16*/, int n, int qscale); + void (*dct_unquantize_mpeg2_intra)(const MPVContext *s, + int16_t *block/*align 16*/, int n, int qscale); + void (*dct_unquantize_mpeg2_inter)(const MPVContext *s, + int16_t *block/*align 16*/, int n, int qscale); + void (*dct_unquantize_h263_intra)(const MPVContext *s, + int16_t *block/*align 16*/, int n, int qscale); + void (*dct_unquantize_h263_inter)(const MPVContext *s, + int16_t *block/*align 16*/, int n, int qscale); } MPVUnquantDSPContext; #if !ARCH_MIPS diff --git a/libavcodec/neon/mpegvideo.c b/libavcodec/neon/mpegvideo.c index a0276ad808..fdc57d3876 100644 --- a/libavcodec/neon/mpegvideo.c +++ b/libavcodec/neon/mpegvideo.c @@ -84,7 +84,7 @@ static void inline ff_dct_unquantize_h263_neon(int qscale, int qadd, int nCoeffs vst1_s16(block, d0s16); } -static void dct_unquantize_h263_inter_neon(MpegEncContext *s, int16_t *block, +static void dct_unquantize_h263_inter_neon(const MPVContext *s, int16_t *block, int n, int qscale) { int nCoeffs = s->inter_scantable.raster_end[s->block_last_index[n]]; @@ -93,7 +93,7 @@ static void dct_unquantize_h263_inter_neon(MpegEncContext *s, int16_t *block, ff_dct_unquantize_h263_neon(qscale, qadd, nCoeffs + 1, block); } -static void dct_unquantize_h263_intra_neon(MpegEncContext *s, int16_t *block, +static void dct_unquantize_h263_intra_neon(const MPVContext *s, int16_t *block, int n, int qscale) { int qadd; diff --git a/libavcodec/ppc/mpegvideo_altivec.c b/libavcodec/ppc/mpegvideo_altivec.c index 26e98acfb8..ad3a783a87 100644 --- a/libavcodec/ppc/mpegvideo_altivec.c +++ b/libavcodec/ppc/mpegvideo_altivec.c @@ -40,8 +40,8 @@ /* AltiVec version of dct_unquantize_h263 this code assumes `block' is 16 bytes-aligned */ -static void dct_unquantize_h263_altivec(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_h263_altivec(const MPVContext *s, + int16_t *block, int n, int qscale) { int i, qmul, qadd; int nCoeffs; diff --git a/libavcodec/x86/mpegvideo.c b/libavcodec/x86/mpegvideo.c index 8632acd412..4c3299362e 100644 --- a/libavcodec/x86/mpegvideo.c +++ b/libavcodec/x86/mpegvideo.c @@ -30,8 +30,8 @@ #if HAVE_MMX_INLINE -static void dct_unquantize_h263_intra_mmx(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_h263_intra_mmx(const MPVContext *s, + int16_t *block, int n, int qscale) { x86_reg level, qmul, qadd, nCoeffs; @@ -105,8 +105,8 @@ __asm__ volatile( } -static void dct_unquantize_h263_inter_mmx(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_h263_inter_mmx(const MPVContext *s, + int16_t *block, int n, int qscale) { x86_reg qmul, qadd, nCoeffs; @@ -166,8 +166,8 @@ __asm__ volatile( ); } -static void dct_unquantize_mpeg1_intra_mmx(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_mpeg1_intra_mmx(const MPVContext *s, + int16_t *block, int n, int qscale) { x86_reg nCoeffs; const uint16_t *quant_matrix; @@ -235,8 +235,8 @@ __asm__ volatile( block[0]= block0; } -static void dct_unquantize_mpeg1_inter_mmx(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_mpeg1_inter_mmx(const MPVContext *s, + int16_t *block, int n, int qscale) { x86_reg nCoeffs; const uint16_t *quant_matrix; @@ -301,8 +301,8 @@ __asm__ volatile( ); } -static void dct_unquantize_mpeg2_intra_mmx(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_mpeg2_intra_mmx(const MPVContext *s, + int16_t *block, int n, int qscale) { x86_reg nCoeffs; const uint16_t *quant_matrix; @@ -369,8 +369,8 @@ __asm__ volatile( //Note, we do not do mismatch control for intra as errors cannot accumulate } -static void dct_unquantize_mpeg2_inter_mmx(MpegEncContext *s, - int16_t *block, int n, int qscale) +static void dct_unquantize_mpeg2_inter_mmx(const MPVContext *s, + int16_t *block, int n, int qscale) { x86_reg nCoeffs; const uint16_t *quant_matrix; -- 2.49.1 From 428baa1fbe1c5541ccb25a9b4897703b1830191c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <[email protected]> Date: Sat, 8 Jun 2024 23:08:21 +0300 Subject: [PATCH 2/2] lavc/mpv_unquantize: R-V V H.263 DCT unquantize SpacemiT X60: dct_unquantize_h263_inter_c: 417.8 ( 1.00x) dct_unquantize_h263_inter_rvv_i32: 66.0 ( 6.33x) dct_unquantize_h263_intra_c: 140.2 ( 1.00x) dct_unquantize_h263_intra_rvv_i32: 67.7 ( 2.07x) Note that the C benchmarks are not stable, depending heavily on the number of coefficients picked by the RNG. The R-V V benchmarks are however very stable and generally better than C's. --- libavcodec/mpegvideo_unquantize.c | 2 + libavcodec/mpegvideo_unquantize.h | 1 + libavcodec/riscv/Makefile | 2 + libavcodec/riscv/mpegvideo_init.c | 62 +++++++++++++++++++++++++++++++ libavcodec/riscv/mpegvideo_rvv.S | 51 +++++++++++++++++++++++++ 5 files changed, 118 insertions(+) create mode 100644 libavcodec/riscv/mpegvideo_init.c create mode 100644 libavcodec/riscv/mpegvideo_rvv.S diff --git a/libavcodec/mpegvideo_unquantize.c b/libavcodec/mpegvideo_unquantize.c index 06c29d0753..58b530c22d 100644 --- a/libavcodec/mpegvideo_unquantize.c +++ b/libavcodec/mpegvideo_unquantize.c @@ -266,6 +266,8 @@ av_cold void ff_mpv_unquantize_init(MPVUnquantDSPContext *s, ff_mpv_unquantize_init_arm(s, bitexact); #elif ARCH_PPC ff_mpv_unquantize_init_ppc(s, bitexact); +#elif ARCH_RISCV + ff_mpv_unquantize_init_riscv(s, bitexact); #elif ARCH_X86 ff_mpv_unquantize_init_x86(s, bitexact); #elif ARCH_MIPS diff --git a/libavcodec/mpegvideo_unquantize.h b/libavcodec/mpegvideo_unquantize.h index 1a43f467c6..50319d7ad3 100644 --- a/libavcodec/mpegvideo_unquantize.h +++ b/libavcodec/mpegvideo_unquantize.h @@ -55,6 +55,7 @@ void ff_mpv_unquantize_init(MPVUnquantDSPContext *s, void ff_mpv_unquantize_init_arm (MPVUnquantDSPContext *s, int bitexact); void ff_mpv_unquantize_init_neon(MPVUnquantDSPContext *s, int bitexact); void ff_mpv_unquantize_init_ppc (MPVUnquantDSPContext *s, int bitexact); +void ff_mpv_unquantize_init_riscv(MPVUnquantDSPContext *s, int bitexact); void ff_mpv_unquantize_init_x86 (MPVUnquantDSPContext *s, int bitexact); void ff_mpv_unquantize_init_mips(MPVUnquantDSPContext *s, int bitexact, int q_scale_type); diff --git a/libavcodec/riscv/Makefile b/libavcodec/riscv/Makefile index 736f873fe8..8c1f2f5f6e 100644 --- a/libavcodec/riscv/Makefile +++ b/libavcodec/riscv/Makefile @@ -51,6 +51,8 @@ OBJS-$(CONFIG_LPC) += riscv/lpc_init.o RVV-OBJS-$(CONFIG_LPC) += riscv/lpc_rvv.o OBJS-$(CONFIG_ME_CMP) += riscv/me_cmp_init.o RVV-OBJS-$(CONFIG_ME_CMP) += riscv/me_cmp_rvv.o +OBJS-$(CONFIG_MPEGVIDEO) += riscv/mpegvideo_init.o +RVV-OBJS-$(CONFIG_MPEGVIDEO) += riscv/mpegvideo_rvv.o OBJS-$(CONFIG_MPEGVIDEOENCDSP) += riscv/mpegvideoencdsp_init.o RVV-OBJS-$(CONFIG_MPEGVIDEOENCDSP) += riscv/mpegvideoencdsp_rvv.o OBJS-$(CONFIG_OPUS_DECODER) += riscv/opusdsp_init.o diff --git a/libavcodec/riscv/mpegvideo_init.c b/libavcodec/riscv/mpegvideo_init.c new file mode 100644 index 0000000000..418b91f437 --- /dev/null +++ b/libavcodec/riscv/mpegvideo_init.c @@ -0,0 +1,62 @@ +/* + * 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/attributes.h" +#include "libavutil/cpu.h" +#include "libavcodec/mpegvideo.h" +#include "libavcodec/mpegvideo_unquantize.h" + +void ff_h263_dct_unquantize_intra_rvv(const MPVContext *s, int16_t *block, + ptrdiff_t len, int qscale, int aic); +void ff_h263_dct_unquantize_inter_rvv(const MPVContext *s, int16_t *block, + ptrdiff_t len, int qscale); + +static void dct_unquantize_h263_intra_rvv(const MPVContext *s, + int16_t *block, int n, int qscale) +{ + if (!s->h263_aic) + block[0] *= (n < 4) ? s->y_dc_scale : s->c_dc_scale; + + n = s->ac_pred ? 63 + : s->intra_scantable.raster_end[s->block_last_index[n]]; + ff_h263_dct_unquantize_intra_rvv(s, block, n, qscale, s->h263_aic); +} + +static void dct_unquantize_h263_inter_rvv(const MPVContext *s, + int16_t *block, int n, int qscale) +{ + n = s->inter_scantable.raster_end[s->block_last_index[n]]; + ff_h263_dct_unquantize_inter_rvv(s, block, n, qscale); +} + +av_cold +void ff_mpv_unquantize_init_riscv(MPVUnquantDSPContext *c, int bitexact) +{ +#if HAVE_RVV + int flags = av_get_cpu_flags(); + + if ((flags & AV_CPU_FLAG_RVV_I32) && (flags & AV_CPU_FLAG_RVB)) { + c->dct_unquantize_h263_intra = dct_unquantize_h263_intra_rvv; + c->dct_unquantize_h263_inter = dct_unquantize_h263_inter_rvv; + } +#endif +} diff --git a/libavcodec/riscv/mpegvideo_rvv.S b/libavcodec/riscv/mpegvideo_rvv.S new file mode 100644 index 0000000000..1a148f75da --- /dev/null +++ b/libavcodec/riscv/mpegvideo_rvv.S @@ -0,0 +1,51 @@ +/* + * Copyright © 2024 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 "libavutil/riscv/asm.S" + +func ff_h263_dct_unquantize_intra_rvv + addi a1, a1, 2 + beqz a4, 1f + slli a3, a3, 1 + mv a4, zero + j 2f +endfunc + +func ff_h263_dct_unquantize_inter_rvv, zve32x, zba + addi a2, a2, 1 +1: + addi a4, a3, -1 + slli a3, a3, 1 + ori a4, a4, 1 +2: + vsetvli t0, a2, e16, m8, ta, mu + vle16.v v8, (a1) + sub a2, a2, t0 + vmv.v.x v16, a4 + vmslt.vi v0, v8, 0 + vneg.v v16, v16, v0.t + vmsne.vi v0, v8, 0 + vmadd.vx v8, a3, v16, v0.t + vse16.v v8, (a1) + sh1add a1, t0, a1 + bnez a2, 2b + + ret +endfunc -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
