PR #22744 opened by mkver URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22744 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22744.patch
>From ba18c721f0c46e346a955f5dcb1005c357565dc2 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Fri, 3 Apr 2026 16:31:10 +0200 Subject: [PATCH 1/5] avcodec/rv34: Use VLC symbol table to avoid LUTs Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/rv34.c | 97 +++++++++++++++++++++++++++-------------------- 1 file changed, 56 insertions(+), 41 deletions(-) diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c index f78b91e7df..90456010da 100644 --- a/libavcodec/rv34.c +++ b/libavcodec/rv34.c @@ -92,10 +92,9 @@ static VLCElem table_data[117592]; * @param num VLC table number (for static initialization) */ static av_cold void rv34_gen_vlc_ext(const uint8_t *bits, int size, VLC *vlc, - const uint8_t *syms, int *offset) + const uint8_t *syms, int mod_three_bits_offset, int *offset) { int counts[17] = {0}, codes[17]; - uint16_t cw[MAX_VLC_SIZE]; int maxbits; av_assert1(size > 0); @@ -111,23 +110,43 @@ static av_cold void rv34_gen_vlc_ext(const uint8_t *bits, int size, VLC *vlc, if (counts[i]) maxbits = i; } - for (int i = 0; i < size; i++) - cw[i] = codes[bits[i]]++; + + uint16_t symbols[MAX_VLC_SIZE]; + uint16_t cw[MAX_VLC_SIZE]; + const void *symp = syms; + int symbol_size; + + if (mod_three_bits_offset > 0) { + symp = symbols; + symbol_size = 2; + + for (int i = 0, mask = (1 << mod_three_bits_offset) - 1; i < size; ++i) { + cw[i] = codes[bits[i]]++; + symbols[i] = (modulo_three_table[i >> mod_three_bits_offset] << mod_three_bits_offset) | (i & mask); + } + } else { + if (!mod_three_bits_offset) + symp = modulo_three_table; + + symbol_size = !!symp; + for (int i = 0; i < size; ++i) + cw[i] = codes[bits[i]]++; + } vlc->table = &table_data[*offset]; vlc->table_allocated = FF_ARRAY_ELEMS(table_data) - *offset; ff_vlc_init_sparse(vlc, FFMIN(maxbits, 9), size, bits, 1, 1, cw, 2, 2, - syms, !!syms, !!syms, VLC_INIT_STATIC_OVERLONG); + symp, symbol_size, symbol_size, VLC_INIT_STATIC_OVERLONG); *offset += vlc->table_size; } static av_cold void rv34_gen_vlc(const uint8_t *bits, int size, const VLCElem **vlcp, - int *offset) + int mod_three_bits_offset, int *offset) { VLC vlc = { 0 }; - rv34_gen_vlc_ext(bits, size, &vlc, NULL, offset); + rv34_gen_vlc_ext(bits, size, &vlc, NULL, mod_three_bits_offset, offset); *vlcp = vlc.table; } @@ -141,41 +160,41 @@ static av_cold void rv34_init_tables(void) for(i = 0; i < NUM_INTRA_TABLES; i++){ for(j = 0; j < 2; j++){ rv34_gen_vlc(rv34_table_intra_cbppat [i][j], CBPPAT_VLC_SIZE, - &intra_vlcs[i].cbppattern[j], &offset); + &intra_vlcs[i].cbppattern[j], 4, &offset); rv34_gen_vlc(rv34_table_intra_secondpat[i][j], OTHERBLK_VLC_SIZE, - &intra_vlcs[i].second_pattern[j], &offset); + &intra_vlcs[i].second_pattern[j], 0, &offset); rv34_gen_vlc(rv34_table_intra_thirdpat [i][j], OTHERBLK_VLC_SIZE, - &intra_vlcs[i].third_pattern[j], &offset); + &intra_vlcs[i].third_pattern[j], 0, &offset); for(k = 0; k < 4; k++){ rv34_gen_vlc_ext(rv34_table_intra_cbp[i][j+k*2], CBP_VLC_SIZE, - &intra_vlcs[i].cbp[j][k], rv34_cbp_code, &offset); + &intra_vlcs[i].cbp[j][k], rv34_cbp_code, -1, &offset); } } for(j = 0; j < 4; j++){ rv34_gen_vlc(rv34_table_intra_firstpat[i][j], FIRSTBLK_VLC_SIZE, - &intra_vlcs[i].first_pattern[j], &offset); + &intra_vlcs[i].first_pattern[j], 3, &offset); } rv34_gen_vlc(rv34_intra_coeff[i], COEFF_VLC_SIZE, - &intra_vlcs[i].coefficient, &offset); + &intra_vlcs[i].coefficient, -1, &offset); } for(i = 0; i < NUM_INTER_TABLES; i++){ rv34_gen_vlc(rv34_inter_cbppat[i], CBPPAT_VLC_SIZE, - &inter_vlcs[i].cbppattern[0], &offset); + &inter_vlcs[i].cbppattern[0], 4, &offset); for(j = 0; j < 4; j++){ rv34_gen_vlc_ext(rv34_inter_cbp[i][j], CBP_VLC_SIZE, - &inter_vlcs[i].cbp[0][j], rv34_cbp_code, &offset); + &inter_vlcs[i].cbp[0][j], rv34_cbp_code, -1, &offset); } for(j = 0; j < 2; j++){ rv34_gen_vlc(rv34_table_inter_firstpat [i][j], FIRSTBLK_VLC_SIZE, - &inter_vlcs[i].first_pattern[j], &offset); + &inter_vlcs[i].first_pattern[j], 3, &offset); rv34_gen_vlc(rv34_table_inter_secondpat[i][j], OTHERBLK_VLC_SIZE, - &inter_vlcs[i].second_pattern[j], &offset); + &inter_vlcs[i].second_pattern[j], 0, &offset); rv34_gen_vlc(rv34_table_inter_thirdpat [i][j], OTHERBLK_VLC_SIZE, - &inter_vlcs[i].third_pattern[j], &offset); + &inter_vlcs[i].third_pattern[j], 0, &offset); } rv34_gen_vlc(rv34_inter_coeff[i], COEFF_VLC_SIZE, - &inter_vlcs[i].coefficient, &offset); + &inter_vlcs[i].coefficient, -1, &offset); } } @@ -210,7 +229,7 @@ static int rv34_decode_cbp(GetBitContext *gb, const RV34VLC *vlc, int table) } for(i = 0; i < 4; i++){ - t = (modulo_three_table[code] >> (6 - 2*i)) & 3; + t = (code >> (6 - 2*i)) & 3; if(t == 1) cbp |= cbp_masks[get_bits1(gb)] << i; if(t == 2) @@ -243,11 +262,9 @@ static inline void decode_coeff(int16_t *dst, int coef, int esc, GetBitContext * /** * Decode 2x2 subblock of coefficients. */ -static inline void decode_subblock(int16_t *dst, int code, const int is_block2, +static inline void decode_subblock(int16_t *dst, int flags, const int is_block2, GetBitContext *gb, const VLCElem *vlc, int q) { - int flags = modulo_three_table[code]; - decode_coeff( dst+0*4+0, (flags >> 6) , 3, gb, vlc, q); if(is_block2){ decode_coeff(dst+1*4+0, (flags >> 4) & 3, 2, gb, vlc, q); @@ -262,19 +279,17 @@ static inline void decode_subblock(int16_t *dst, int code, const int is_block2, /** * Decode a single coefficient. */ -static inline void decode_subblock1(int16_t *dst, int code, GetBitContext *gb, +static inline void decode_subblock1(int16_t *dst, int flags, GetBitContext *gb, const VLCElem *vlc, int q) { - int coeff = modulo_three_table[code] >> 6; + int coeff = flags >> 6; decode_coeff(dst, coeff, 3, gb, vlc, q); } -static inline void decode_subblock3(int16_t *dst, int code, GetBitContext *gb, +static inline void decode_subblock3(int16_t *dst, int flags, GetBitContext *gb, const VLCElem *vlc, int q_dc, int q_ac1, int q_ac2) { - int flags = modulo_three_table[code]; - decode_coeff(dst+0*4+0, (flags >> 6) , 3, gb, vlc, q_dc); decode_coeff(dst+0*4+1, (flags >> 4) & 3, 2, gb, vlc, q_ac1); decode_coeff(dst+1*4+0, (flags >> 2) & 3, 2, gb, vlc, q_ac1); @@ -295,34 +310,34 @@ static inline void decode_subblock3(int16_t *dst, int code, GetBitContext *gb, static int rv34_decode_block(int16_t *dst, GetBitContext *gb, const RV34VLC *rvlc, int fc, int sc, int q_dc, int q_ac1, int q_ac2) { - int code, pattern, has_ac = 1; + int has_ac = 1; - code = get_vlc2(gb, rvlc->first_pattern[fc], 9, 2); + int flags = get_vlc2(gb, rvlc->first_pattern[fc], 9, 2); - pattern = code & 0x7; + int pattern = flags & 0x7; - code >>= 3; + flags >>= 3; - if (modulo_three_table[code] & 0x3F) { - decode_subblock3(dst, code, gb, rvlc->coefficient, q_dc, q_ac1, q_ac2); + if (flags & 0x3F) { + decode_subblock3(dst, flags, gb, rvlc->coefficient, q_dc, q_ac1, q_ac2); } else { - decode_subblock1(dst, code, gb, rvlc->coefficient, q_dc); + decode_subblock1(dst, flags, gb, rvlc->coefficient, q_dc); if (!pattern) return 0; has_ac = 0; } if(pattern & 4){ - code = get_vlc2(gb, rvlc->second_pattern[sc], 9, 2); - decode_subblock(dst + 4*0+2, code, 0, gb, rvlc->coefficient, q_ac2); + flags = get_vlc2(gb, rvlc->second_pattern[sc], 9, 2); + decode_subblock(dst + 4*0+2, flags, 0, gb, rvlc->coefficient, q_ac2); } if(pattern & 2){ // Looks like coefficients 1 and 2 are swapped for this block - code = get_vlc2(gb, rvlc->second_pattern[sc], 9, 2); - decode_subblock(dst + 4*2+0, code, 1, gb, rvlc->coefficient, q_ac2); + flags = get_vlc2(gb, rvlc->second_pattern[sc], 9, 2); + decode_subblock(dst + 4*2+0, flags, 1, gb, rvlc->coefficient, q_ac2); } if(pattern & 1){ - code = get_vlc2(gb, rvlc->third_pattern[sc], 9, 2); - decode_subblock(dst + 4*2+2, code, 0, gb, rvlc->coefficient, q_ac2); + flags = get_vlc2(gb, rvlc->third_pattern[sc], 9, 2); + decode_subblock(dst + 4*2+2, flags, 0, gb, rvlc->coefficient, q_ac2); } return has_ac | pattern; } -- 2.52.0 >From d5146cedbba48ffb7d013c90f50455fa8a0e770b Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Fri, 3 Apr 2026 16:34:07 +0200 Subject: [PATCH 2/5] avcodec/rv34: Remove pointless has_ac variable Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/rv34.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c index 90456010da..1f189377c9 100644 --- a/libavcodec/rv34.c +++ b/libavcodec/rv34.c @@ -310,8 +310,6 @@ static inline void decode_subblock3(int16_t *dst, int flags, GetBitContext *gb, static int rv34_decode_block(int16_t *dst, GetBitContext *gb, const RV34VLC *rvlc, int fc, int sc, int q_dc, int q_ac1, int q_ac2) { - int has_ac = 1; - int flags = get_vlc2(gb, rvlc->first_pattern[fc], 9, 2); int pattern = flags & 0x7; @@ -324,7 +322,6 @@ static int rv34_decode_block(int16_t *dst, GetBitContext *gb, const RV34VLC *rvl decode_subblock1(dst, flags, gb, rvlc->coefficient, q_dc); if (!pattern) return 0; - has_ac = 0; } if(pattern & 4){ @@ -339,7 +336,7 @@ static int rv34_decode_block(int16_t *dst, GetBitContext *gb, const RV34VLC *rvl flags = get_vlc2(gb, rvlc->third_pattern[sc], 9, 2); decode_subblock(dst + 4*2+2, flags, 0, gb, rvlc->coefficient, q_ac2); } - return has_ac | pattern; + return 1; } /** -- 2.52.0 >From e71e0f1af9eb7d89efff7e5feb2f15eb3d4c6799 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Fri, 3 Apr 2026 17:32:11 +0200 Subject: [PATCH 3/5] tests/checkasm/rv34dsp: Add test for rv34_idct_add Signed-off-by: Andreas Rheinhardt <[email protected]> --- tests/checkasm/rv34dsp.c | 52 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/tests/checkasm/rv34dsp.c b/tests/checkasm/rv34dsp.c index efb4ce913b..dc4cc2f31a 100644 --- a/tests/checkasm/rv34dsp.c +++ b/tests/checkasm/rv34dsp.c @@ -18,9 +18,15 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "libavutil/mem.h" +#include <stddef.h> +#include <stdint.h> +#include <string.h> + +#include "libavutil/intreadwrite.h" +#include "libavutil/macros.h" #include "libavutil/mem_internal.h" +#include "libavcodec/mathops.h" #include "libavcodec/rv34dsp.h" #include "checkasm.h" @@ -77,6 +83,49 @@ static void test_rv34_idct_dc_add(RV34DSPContext *s) { report("rv34_idct_dc_add"); } +static void test_rv34_idct_add(const RV34DSPContext *const s) +{ + enum { + MAX_STRIDE = 256, ///< arbitrary, should be divisible by four + }; + declare_func_emms(AV_CPU_FLAG_MMXEXT, void, uint8_t *dst, ptrdiff_t stride, int16_t *block); + + if (check_func(s->rv34_idct_add, "rv34_idct_add")) { + DECLARE_ALIGNED_16(int16_t, block_ref)[4*4]; + DECLARE_ALIGNED_16(int16_t, block_new)[4*4]; + + DECLARE_ALIGNED_4(uint8_t, dst_ref)[4*MAX_STRIDE + 4]; + DECLARE_ALIGNED_4(uint8_t, dst_new)[4*MAX_STRIDE + 4]; + + ptrdiff_t stride = FFALIGN(1 + rnd() % MAX_STRIDE, 4); + uint8_t *dst_refp = dst_ref, *dst_newp = dst_new; + + if (rnd() & 1) { // negate stride + dst_refp += 3 * stride; + dst_newp += 3 * stride; + stride = -stride; + } + + for (size_t i = 0; i < FF_ARRAY_ELEMS(block_ref); ++i) + block_ref[i] = sign_extend(rnd(), 10); + for (size_t i = 0; i < sizeof(dst_ref); i += 4) + AV_WN32A(dst_ref + i, rnd()); + memcpy(block_new, block_ref, sizeof(block_new)); + memcpy(dst_new, dst_ref, sizeof(dst_new)); + + call_ref(dst_refp, stride, block_ref); + call_new(dst_newp, stride, block_new); + + if (memcmp(dst_ref, dst_new, sizeof(dst_new)) || + memcmp(block_ref, block_new, sizeof(block_new))) + fail(); + + bench_new(dst_new, stride, block_new); + } + + report("rv34_idct_add"); +} + void checkasm_check_rv34dsp(void) { RV34DSPContext s = { 0 }; @@ -84,4 +133,5 @@ void checkasm_check_rv34dsp(void) test_rv34_inv_transform_dc(&s); test_rv34_idct_dc_add(&s); + test_rv34_idct_add(&s); } -- 2.52.0 >From 762c6a4b9f4a86558dd946b54608dfbf7b09f9bf Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Sun, 5 Apr 2026 14:49:26 +0200 Subject: [PATCH 4/5] avcodec/x86/rv34dsp: Port ff_rv34_idct_add_mmxext to SSSE3 With this commit, the RV30 and RV40 decoders no longer clobber the fpu state for normal decoding (only error resilience can still do so). rv34_idct_add_c: 58.1 ( 1.00x) rv34_idct_add_mmxext: 16.5 ( 3.52x) rv34_idct_add_ssse3: 12.2 ( 4.76x) Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/x86/rv34dsp.asm | 140 +++++++++++++++++----------------- libavcodec/x86/rv34dsp_init.c | 10 +-- tests/checkasm/rv34dsp.c | 2 +- 3 files changed, 74 insertions(+), 78 deletions(-) diff --git a/libavcodec/x86/rv34dsp.asm b/libavcodec/x86/rv34dsp.asm index 52d2497007..39d0b2587c 100644 --- a/libavcodec/x86/rv34dsp.asm +++ b/libavcodec/x86/rv34dsp.asm @@ -1,5 +1,5 @@ ;****************************************************************************** -;* MMX/SSE2-optimized functions for the RV30 and RV40 decoders +;* ASM-optimized functions for the RV30 and RV40 decoders ;* Copyright (C) 2012 Christophe Gisquet <[email protected]> ;* ;* This file is part of FFmpeg. @@ -22,14 +22,14 @@ %include "libavutil/x86/x86util.asm" SECTION_RODATA -pw_row_coeffs: times 4 dw 13 - times 4 dw 17 - times 4 dw 7 -pd_512: times 2 dd 0x200 -pw_col_coeffs: dw 13, 13, 13, -13 - dw 17, 7, 7, -17 - dw 13, -13, 13, 13 - dw -7, 17, -17, -7 +; 0 1 2 3 (words) -> 1 3 2 0 1 3 2 0 (words) +shuffle: times 2 db 2, 3, 6, 7, 4, 5, 0, 1 + +pw_13: times 8 dw 13 +pw_17: times 8 dw 17 +pw_7: times 8 dw 7 +pw_col_coeffs: dw -17, -7, -13, 13, 7, -17, 13, 13 +pd_512: times 4 dd 0x200 SECTION .text @@ -54,73 +54,69 @@ cglobal rv34_idct_dc_noround, 1, 2, 1 mova [r0+16], m0 RET -; Load coeffs and perform row transform -; Output: coeffs in mm[0467], rounder in mm5 -%macro ROW_TRANSFORM 1 - pxor mm7, mm7 - mova mm0, [%1+ 0*8] - mova mm1, [%1+ 1*8] - mova mm2, [%1+ 2*8] - mova mm3, [%1+ 3*8] - mova [%1+ 0*8], mm7 - mova [%1+ 1*8], mm7 - mova [%1+ 2*8], mm7 - mova [%1+ 3*8], mm7 - mova mm4, mm0 - mova mm6, [pw_row_coeffs+ 0] - paddsw mm0, mm2 ; b0 + b2 - psubsw mm4, mm2 ; b0 - b2 - pmullw mm0, mm6 ; *13 = z0 - pmullw mm4, mm6 ; *13 = z1 - mova mm5, mm1 - pmullw mm1, [pw_row_coeffs+ 8] ; b1*17 - pmullw mm5, [pw_row_coeffs+16] ; b1* 7 - mova mm7, mm3 - pmullw mm3, [pw_row_coeffs+ 8] ; b3*17 - pmullw mm7, [pw_row_coeffs+16] ; b3* 7 - paddsw mm1, mm7 ; z3 = b1*17 + b3* 7 - psubsw mm5, mm3 ; z2 = b1* 7 - b3*17 - mova mm7, mm0 - mova mm6, mm4 - paddsw mm0, mm1 ; z0 + z3 - psubsw mm7, mm1 ; z0 - z3 - paddsw mm4, mm5 ; z1 + z2 - psubsw mm6, mm5 ; z1 - z2 - mova mm5, [pd_512] ; 0x200 -%endmacro - -; ff_rv34_idct_add_mmxext(uint8_t *dst, ptrdiff_t stride, int16_t *block); -%macro COL_TRANSFORM 4 - pshufw mm3, %2, 0xDD ; col. 1,3,1,3 - pshufw %2, %2, 0x88 ; col. 0,2,0,2 - pmaddwd %2, %3 ; 13*c0+13*c2 | 13*c0-13*c2 = z0 | z1 - pmaddwd mm3, %4 ; 17*c1+ 7*c3 | 7*c1-17*c3 = z3 | z2 - paddd %2, mm5 - pshufw mm1, %2, 01001110b ; z1 | z0 - pshufw mm2, mm3, 01001110b ; z2 | z3 - paddd %2, mm3 ; z0+z3 | z1+z2 - psubd mm1, mm2 ; z1-z2 | z0-z3 - movd mm3, %1 +%macro COL_TRANSFORM 3 + ; -17*c1-7*c3 | 13*c0-13*c2 | 7*c1-17*c3 | 13*c1+13*c2 = -z3 | z1 | z2 | z0 + pmaddwd %2, m7 + movd m3, %1 + pshufd %3, %2, q0123 ; z0 | z2 | z1 | -z3 + psignd %2, m7 ; z3 | z1 |-z2 | z0 + paddd %3, m5 + paddd %2, %3 ; z0+z3 | z1+z2 | z1-z2 | z0-z3 (+round) +%ifidn %3,m1 + pxor m1, m1 +%endif psrad %2, 10 - pxor mm2, mm2 - psrad mm1, 10 - punpcklbw mm3, mm2 - packssdw %2, mm1 - paddw %2, mm3 + punpcklbw m3, m1 + packssdw %2, %2 + paddw %2, m3 packuswb %2, %2 movd %1, %2 %endmacro -INIT_MMX mmxext -cglobal rv34_idct_add, 3, 3, 0, dst, s, b - ROW_TRANSFORM bq - COL_TRANSFORM [dstq], mm0, [pw_col_coeffs+ 0], [pw_col_coeffs+ 8] - mova mm0, [pw_col_coeffs+ 0] - COL_TRANSFORM [dstq+sq], mm4, mm0, [pw_col_coeffs+ 8] - mova mm4, [pw_col_coeffs+ 8] - lea dstq, [dstq + 2*sq] - COL_TRANSFORM [dstq], mm6, mm0, mm4 - COL_TRANSFORM [dstq+sq], mm7, mm0, mm4 - ret + +INIT_XMM ssse3 +; ff_rv34_idct_add_ssse3(uint8_t *dst, ptrdiff_t stride, int16_t *block) +cglobal rv34_idct_add, 3, 3, 8, dst, stride, block + ; row transform + movq m0, [blockq + 0*8] + movq m1, [blockq + 1*8] + movq m2, [blockq + 2*8] + movq m3, [blockq + 3*8] + pxor m7, m7 + mova m6, [shuffle] + mova [blockq + 0], m7 + mova [blockq + 16], m7 + mova m4, m0 + mova m5, [pw_13] + paddsw m0, m2 ; b0 + b2 + pshufb m1, m6 + psubsw m4, m2 ; b0 - b2 + pmullw m0, m5 ; *13 = z0 + pshufb m3, m6 + pmullw m4, m5 ; *13 = z1 + mova m5, m1 + pmullw m1, [pw_17] ; b1*17 + pmullw m5, [pw_7] ; b1* 7 + pshufb m0, m6 + mova m2, m3 + pmullw m3, [pw_17] ; b3*17 + pmullw m2, [pw_7] ; b3* 7 + pshufb m4, m6 + mova m7, [pw_col_coeffs] + paddsw m1, m2 ; z3 = b1*17 + b3* 7 + psubsw m5, m3 ; z2 = b1* 7 - b3*17 + mova m2, m0 + mova m6, m4 + paddsw m0, m1 ; z0 + z3 + paddsw m4, m5 ; z1 + z2 + psubsw m2, m1 ; z0 - z3 + psubsw m6, m5 ; z1 - z2 + mova m5, [pd_512] ; 0x200 + COL_TRANSFORM [dstq], m0, m1 + COL_TRANSFORM [dstq+strideq], m4, m0 + lea dstq, [dstq + 2*strideq] + COL_TRANSFORM [dstq], m6, m0 + COL_TRANSFORM [dstq+strideq], m2, m0 + RET ; ff_rv34_idct_dc_add_sse4(uint8_t *dst, int stride, int dc); %macro RV34_IDCT_DC_ADD 0 diff --git a/libavcodec/x86/rv34dsp_init.c b/libavcodec/x86/rv34dsp_init.c index c4dcae929a..0a12b49356 100644 --- a/libavcodec/x86/rv34dsp_init.c +++ b/libavcodec/x86/rv34dsp_init.c @@ -1,5 +1,5 @@ /* - * RV30/40 MMX/SSE2 optimizations + * RV30/40 ASM optimizations * Copyright (C) 2012 Christophe Gisquet <[email protected]> * * This file is part of FFmpeg. @@ -27,19 +27,19 @@ void ff_rv34_idct_dc_noround_sse2(int16_t *block); void ff_rv34_idct_dc_add_sse2(uint8_t *dst, ptrdiff_t stride, int dc); void ff_rv34_idct_dc_add_sse4(uint8_t *dst, ptrdiff_t stride, int dc); -void ff_rv34_idct_add_mmxext(uint8_t *dst, ptrdiff_t stride, int16_t *block); +void ff_rv34_idct_add_ssse3(uint8_t *dst, ptrdiff_t stride, int16_t *block); av_cold void ff_rv34dsp_init_x86(RV34DSPContext* c) { int cpu_flags = av_get_cpu_flags(); - if (EXTERNAL_MMXEXT(cpu_flags)) { - c->rv34_idct_add = ff_rv34_idct_add_mmxext; - } if (EXTERNAL_SSE2(cpu_flags)) { c->rv34_inv_transform_dc = ff_rv34_idct_dc_noround_sse2; c->rv34_idct_dc_add = ff_rv34_idct_dc_add_sse2; } + if (EXTERNAL_SSSE3(cpu_flags)) { + c->rv34_idct_add = ff_rv34_idct_add_ssse3; + } if (EXTERNAL_SSE4(cpu_flags)) c->rv34_idct_dc_add = ff_rv34_idct_dc_add_sse4; } diff --git a/tests/checkasm/rv34dsp.c b/tests/checkasm/rv34dsp.c index dc4cc2f31a..7b6dd531d4 100644 --- a/tests/checkasm/rv34dsp.c +++ b/tests/checkasm/rv34dsp.c @@ -88,7 +88,7 @@ static void test_rv34_idct_add(const RV34DSPContext *const s) enum { MAX_STRIDE = 256, ///< arbitrary, should be divisible by four }; - declare_func_emms(AV_CPU_FLAG_MMXEXT, void, uint8_t *dst, ptrdiff_t stride, int16_t *block); + declare_func(void, uint8_t *dst, ptrdiff_t stride, int16_t *block); if (check_func(s->rv34_idct_add, "rv34_idct_add")) { DECLARE_ALIGNED_16(int16_t, block_ref)[4*4]; -- 2.52.0 >From e2a9b55955204879d8794b16f89b3f1fe141f073 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <[email protected]> Date: Tue, 7 Apr 2026 22:34:33 +0200 Subject: [PATCH 5/5] avcodec/x86/rv40dsp: Fix wrong comment Forgotten in d25b3497f2cd341e54911c8356eeccd66d38092a and 9abf906800155a3828e869f1820605872c2de6b4. Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/x86/rv40dsp.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/x86/rv40dsp.asm b/libavcodec/x86/rv40dsp.asm index dc520dbeb4..07c119636a 100644 --- a/libavcodec/x86/rv40dsp.asm +++ b/libavcodec/x86/rv40dsp.asm @@ -1,5 +1,5 @@ ;****************************************************************************** -;* MMX/SSE2-optimized functions for the RV40 decoder +;* ASM-optimized functions for the RV40 decoder ;* Copyright (c) 2010 Ronald S. Bultje <[email protected]> ;* Copyright (c) 2010 Fiona Glaser <[email protected]> ;* Copyright (C) 2012 Christophe Gisquet <[email protected]> -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
