Patches attached, two of which fix regressions. I will apply these two tonight unless there are objections.
- Andreas
From a167afe702eec2bceb76dbc13ada7398a75a5f81 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@outlook.com> Date: Tue, 25 Mar 2025 02:20:51 +0100 Subject: [PATCH 01/11] avcodec/mpeg4videodec: Actually check av_buffer_replace() Forgotten in 4f2becc2dc4668f837b5ba96c11c3426bc120ac0. Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- libavcodec/mpeg4videodec.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c index 7d5af9b877..cb32f0e300 100644 --- a/libavcodec/mpeg4videodec.c +++ b/libavcodec/mpeg4videodec.c @@ -3795,12 +3795,10 @@ static int mpeg4_update_thread_context(AVCodecContext *dst, memcpy(s->sprite_shift, s1->sprite_shift, sizeof(s1->sprite_shift)); memcpy(s->sprite_traj, s1->sprite_traj, sizeof(s1->sprite_traj)); - ret = av_buffer_replace(&s->bitstream_buffer, s1->bitstream_buffer); - if (!init && s1->xvid_build >= 0) ff_xvid_idct_init(&s->m.idsp, dst); - return 0; + return av_buffer_replace(&s->bitstream_buffer, s1->bitstream_buffer); } static int mpeg4_update_thread_context_for_user(AVCodecContext *dst, -- 2.45.2
From f039f3651a86f133c406f3d393d892f8daa31918 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@outlook.com> Date: Tue, 25 Mar 2025 03:07:55 +0100 Subject: [PATCH 02/11] avcodec/x86/mpegvideoenc_template: Remove remnants of MMX Forgotten in 7284ab789d5fe271b9d6a1666ab5ea6be8724cca. Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- libavcodec/x86/mpegvideoenc.c | 10 -- libavcodec/x86/mpegvideoenc_template.c | 135 ++++++++++--------------- 2 files changed, 53 insertions(+), 92 deletions(-) diff --git a/libavcodec/x86/mpegvideoenc.c b/libavcodec/x86/mpegvideoenc.c index f3c8756d76..d81a8ef14d 100644 --- a/libavcodec/x86/mpegvideoenc.c +++ b/libavcodec/x86/mpegvideoenc.c @@ -43,26 +43,16 @@ DECLARE_ALIGNED(16, static const uint16_t, inv_zigzag_direct16)[64] = { #if HAVE_6REGS #if HAVE_SSE2_INLINE -#undef COMPILE_TEMPLATE_SSE2 -#undef COMPILE_TEMPLATE_SSSE3 -#define COMPILE_TEMPLATE_SSE2 1 #define COMPILE_TEMPLATE_SSSE3 0 -#undef RENAME -#undef RENAME_FDCT #define RENAME(a) a ## _sse2 -#define RENAME_FDCT(a) a ## _sse2 #include "mpegvideoenc_template.c" #endif /* HAVE_SSE2_INLINE */ #if HAVE_SSSE3_INLINE -#undef COMPILE_TEMPLATE_SSE2 #undef COMPILE_TEMPLATE_SSSE3 -#define COMPILE_TEMPLATE_SSE2 1 #define COMPILE_TEMPLATE_SSSE3 1 #undef RENAME -#undef RENAME_FDCT #define RENAME(a) a ## _ssse3 -#define RENAME_FDCT(a) a ## _sse2 #include "mpegvideoenc_template.c" #endif /* HAVE_SSSE3_INLINE */ diff --git a/libavcodec/x86/mpegvideoenc_template.c b/libavcodec/x86/mpegvideoenc_template.c index c5418a1b04..85e9159f91 100644 --- a/libavcodec/x86/mpegvideoenc_template.c +++ b/libavcodec/x86/mpegvideoenc_template.c @@ -29,49 +29,22 @@ #include "libavcodec/mpegvideoenc.h" #include "fdct.h" -#undef MMREG_WIDTH -#undef MM -#undef MOVQ #undef SPREADW #undef PMAXW #undef PMAX #undef SAVE_SIGN #undef RESTORE_SIGN -#if COMPILE_TEMPLATE_SSE2 -#define MMREG_WIDTH "16" -#define MM "%%xmm" -#define MOVQ "movdqa" #define SPREADW(a) \ "pshuflw $0, "a", "a" \n\t"\ "punpcklwd "a", "a" \n\t" -#define PMAXW(a,b) "pmaxsw "a", "b" \n\t" #define PMAX(a,b) \ "movhlps "a", "b" \n\t"\ - PMAXW(b, a)\ + "pmaxsw "b", "a" \n\t"\ "pshuflw $0x0E, "a", "b" \n\t"\ - PMAXW(b, a)\ + "pmaxsw "b", "a" \n\t"\ "pshuflw $0x01, "a", "b" \n\t"\ - PMAXW(b, a) -#else -#define MMREG_WIDTH "8" -#define MM "%%mm" -#define MOVQ "movq" -#define SPREADW(a) \ - "punpcklwd "a", "a" \n\t"\ - "punpcklwd "a", "a" \n\t" -#define PMAXW(a,b) \ - "psubusw "a", "b" \n\t"\ - "paddw "a", "b" \n\t" -#define PMAX(a,b) \ - "movq "a", "b" \n\t"\ - "psrlq $32, "a" \n\t"\ - PMAXW(b, a)\ - "movq "a", "b" \n\t"\ - "psrlq $16, "a" \n\t"\ - PMAXW(b, a) - -#endif + "pmaxsw "b", "a" \n\t" #if COMPILE_TEMPLATE_SSSE3 #define SAVE_SIGN(a,b) \ @@ -100,7 +73,7 @@ static int RENAME(dct_quantize)(MPVEncContext *const s, LOCAL_ALIGNED_16(int16_t, temp_block, [64]); //s->fdct (block); - RENAME_FDCT(ff_fdct)(block); // cannot be anything else ... + ff_fdct_sse2(block); // cannot be anything else ... if(s->dct_error_sum) s->denoise_dct(s, block); @@ -138,32 +111,32 @@ static int RENAME(dct_quantize)(MPVEncContext *const s, if ((s->c.out_format == FMT_H263 || s->c.out_format == FMT_H261) && !s->c.mpeg_quant) { __asm__ volatile( - "movd %%"FF_REG_a", "MM"3 \n\t" // last_non_zero_p1 - SPREADW(MM"3") - "pxor "MM"7, "MM"7 \n\t" // 0 - "pxor "MM"4, "MM"4 \n\t" // 0 - MOVQ" (%2), "MM"5 \n\t" // qmat[0] - "pxor "MM"6, "MM"6 \n\t" - "psubw (%3), "MM"6 \n\t" // -bias[0] + "movd %%"FF_REG_a", %%xmm3 \n\t" // last_non_zero_p1 + SPREADW("%%xmm3") + "pxor %%xmm7, %%xmm7 \n\t" // 0 + "pxor %%xmm4, %%xmm4 \n\t" // 0 + "movdqa (%2), %%xmm5 \n\t" // qmat[0] + "pxor %%xmm6, %%xmm6 \n\t" + "psubw (%3), %%xmm6 \n\t" // -bias[0] "mov $-128, %%"FF_REG_a" \n\t" ".p2align 4 \n\t" "1: \n\t" - MOVQ" (%1, %%"FF_REG_a"), "MM"0 \n\t" // block[i] - SAVE_SIGN(MM"1", MM"0") // ABS(block[i]) - "psubusw "MM"6, "MM"0 \n\t" // ABS(block[i]) + bias[0] - "pmulhw "MM"5, "MM"0 \n\t" // (ABS(block[i])*qmat[0] - bias[0]*qmat[0])>>16 - "por "MM"0, "MM"4 \n\t" - RESTORE_SIGN(MM"1", MM"0") // out=((ABS(block[i])*qmat[0] - bias[0]*qmat[0])>>16)*sign(block[i]) - MOVQ" "MM"0, (%5, %%"FF_REG_a") \n\t" - "pcmpeqw "MM"7, "MM"0 \n\t" // out==0 ? 0xFF : 0x00 - MOVQ" (%4, %%"FF_REG_a"), "MM"1 \n\t" - MOVQ" "MM"7, (%1, %%"FF_REG_a") \n\t" // 0 - "pandn "MM"1, "MM"0 \n\t" - PMAXW(MM"0", MM"3") - "add $"MMREG_WIDTH", %%"FF_REG_a" \n\t" + "movdqa (%1, %%"FF_REG_a"), %%xmm0 \n\t" // block[i] + SAVE_SIGN("%%xmm1", "%%xmm0") // ABS(block[i]) + "psubusw %%xmm6, %%xmm0 \n\t" // ABS(block[i]) + bias[0] + "pmulhw %%xmm5, %%xmm0 \n\t" // (ABS(block[i])*qmat[0] - bias[0]*qmat[0])>>16 + "por %%xmm0, %%xmm4 \n\t" + RESTORE_SIGN("%%xmm1", "%%xmm0") // out=((ABS(block[i])*qmat[0] - bias[0]*qmat[0])>>16)*sign(block[i]) + "movdqa %%xmm0, (%5, %%"FF_REG_a") \n\t" + "pcmpeqw %%xmm7, %%xmm0 \n\t" // out==0 ? 0xFF : 0x00 + "movdqa (%4, %%"FF_REG_a"), %%xmm1 \n\t" + "movdqa %%xmm7, (%1, %%"FF_REG_a") \n\t" // 0 + "pandn %%xmm1, %%xmm0 \n\t" + "pmaxsw %%xmm0, %%xmm3 \n\t" + "add $16, %%"FF_REG_a" \n\t" " js 1b \n\t" - PMAX(MM"3", MM"0") - "movd "MM"3, %%"FF_REG_a" \n\t" + PMAX("%%xmm3", "%%xmm0") + "movd %%xmm3, %%"FF_REG_a" \n\t" "movzbl %%al, %%eax \n\t" // last_non_zero_p1 : "+a" (last_non_zero_p1) : "r" (block+64), "r" (qmat), "r" (bias), @@ -173,31 +146,31 @@ static int RENAME(dct_quantize)(MPVEncContext *const s, ); }else{ // FMT_H263 __asm__ volatile( - "movd %%"FF_REG_a", "MM"3 \n\t" // last_non_zero_p1 - SPREADW(MM"3") - "pxor "MM"7, "MM"7 \n\t" // 0 - "pxor "MM"4, "MM"4 \n\t" // 0 + "movd %%"FF_REG_a", %%xmm3 \n\t" // last_non_zero_p1 + SPREADW("%%xmm3") + "pxor %%xmm7, %%xmm7 \n\t" // 0 + "pxor %%xmm4, %%xmm4 \n\t" // 0 "mov $-128, %%"FF_REG_a" \n\t" ".p2align 4 \n\t" "1: \n\t" - MOVQ" (%1, %%"FF_REG_a"), "MM"0 \n\t" // block[i] - SAVE_SIGN(MM"1", MM"0") // ABS(block[i]) - MOVQ" (%3, %%"FF_REG_a"), "MM"6 \n\t" // bias[0] - "paddusw "MM"6, "MM"0 \n\t" // ABS(block[i]) + bias[0] - MOVQ" (%2, %%"FF_REG_a"), "MM"5 \n\t" // qmat[i] - "pmulhw "MM"5, "MM"0 \n\t" // (ABS(block[i])*qmat[0] + bias[0]*qmat[0])>>16 - "por "MM"0, "MM"4 \n\t" - RESTORE_SIGN(MM"1", MM"0") // out=((ABS(block[i])*qmat[0] - bias[0]*qmat[0])>>16)*sign(block[i]) - MOVQ" "MM"0, (%5, %%"FF_REG_a") \n\t" - "pcmpeqw "MM"7, "MM"0 \n\t" // out==0 ? 0xFF : 0x00 - MOVQ" (%4, %%"FF_REG_a"), "MM"1 \n\t" - MOVQ" "MM"7, (%1, %%"FF_REG_a") \n\t" // 0 - "pandn "MM"1, "MM"0 \n\t" - PMAXW(MM"0", MM"3") - "add $"MMREG_WIDTH", %%"FF_REG_a" \n\t" + "movdqa (%1, %%"FF_REG_a"), %%xmm0 \n\t" // block[i] + SAVE_SIGN("%%xmm1", "%%xmm0") // ABS(block[i]) + "movdqa (%3, %%"FF_REG_a"), %%xmm6 \n\t" // bias[0] + "paddusw %%xmm6, %%xmm0 \n\t" // ABS(block[i]) + bias[0] + "movdqa (%2, %%"FF_REG_a"), %%xmm5 \n\t" // qmat[i] + "pmulhw %%xmm5, %%xmm0 \n\t" // (ABS(block[i])*qmat[0] + bias[0]*qmat[0])>>16 + "por %%xmm0, %%xmm4 \n\t" + RESTORE_SIGN("%%xmm1", "%%xmm0") // out=((ABS(block[i])*qmat[0] - bias[0]*qmat[0])>>16)*sign(block[i]) + "movdqa %%xmm0, (%5, %%"FF_REG_a") \n\t" + "pcmpeqw %%xmm7, %%xmm0 \n\t" // out==0 ? 0xFF : 0x00 + "movdqa (%4, %%"FF_REG_a"), %%xmm1 \n\t" + "movdqa %%xmm7, (%1, %%"FF_REG_a") \n\t" // 0 + "pandn %%xmm1, %%xmm0 \n\t" + "pmaxsw %%xmm0, %%xmm3 \n\t" + "add $16, %%"FF_REG_a" \n\t" " js 1b \n\t" - PMAX(MM"3", MM"0") - "movd "MM"3, %%"FF_REG_a" \n\t" + PMAX("%%xmm3", "%%xmm0") + "movd %%xmm3, %%"FF_REG_a" \n\t" "movzbl %%al, %%eax \n\t" // last_non_zero_p1 : "+a" (last_non_zero_p1) : "r" (block+64), "r" (qmat+64), "r" (bias+64), @@ -207,14 +180,12 @@ static int RENAME(dct_quantize)(MPVEncContext *const s, ); } __asm__ volatile( - "movd %1, "MM"1 \n\t" // max_qcoeff - SPREADW(MM"1") - "psubusw "MM"1, "MM"4 \n\t" - "packuswb "MM"4, "MM"4 \n\t" -#if COMPILE_TEMPLATE_SSE2 - "packsswb "MM"4, "MM"4 \n\t" -#endif - "movd "MM"4, %0 \n\t" // *overflow + "movd %1, %%xmm1 \n\t" // max_qcoeff + SPREADW("%%xmm1") + "psubusw %%xmm1, %%xmm4 \n\t" + "packuswb %%xmm4, %%xmm4 \n\t" + "packsswb %%xmm4, %%xmm4 \n\t" + "movd %%xmm4, %0 \n\t" // *overflow : "=g" (*overflow) : "g" (s->max_qcoeff) ); -- 2.45.2
From 9901b63fc2ad7b09e9c9cd5a4776f07026ab08a2 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@outlook.com> Date: Tue, 25 Mar 2025 16:03:38 +0100 Subject: [PATCH 03/11] avcodec/mpegvideo_enc: Pass data_partitioning directly This avoids having to store it in the backup MPVEncContext. Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- libavcodec/mpegvideo_enc.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index ea3bc4ee55..16086bf067 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -2659,7 +2659,8 @@ static inline void copy_context_before_encode(MPVEncContext *const d, } static inline void copy_context_after_encode(MPVEncContext *const d, - const MPVEncContext *const s) + const MPVEncContext *const s, + int data_partitioning) { int i; @@ -2683,7 +2684,7 @@ static inline void copy_context_after_encode(MPVEncContext *const d, d->c.mv_type = s->c.mv_type; d->c.mv_dir = s->c.mv_dir; d->pb= s->pb; - if (s->c.data_partitioning) { + if (data_partitioning) { d->pb2= s->pb2; d->tex_pb= s->tex_pb; } @@ -2743,7 +2744,7 @@ static void encode_mb_hq(MPVEncContext *const s, MPVEncContext *const backup, MP *dmin= score; *next_block^=1; - copy_context_after_encode(best, s); + copy_context_after_encode(best, s, s->c.data_partitioning); } } @@ -3164,8 +3165,6 @@ static int encode_thread(AVCodecContext *c, void *arg){ copy_context_before_encode(&backup_s, s); backup_s.pb= s->pb; - best_s.c.data_partitioning = s->c.data_partitioning; - best_s.c.partitioned_frame = s->c.partitioned_frame; if (s->c.data_partitioning) { backup_s.pb2= s->pb2; backup_s.tex_pb= s->tex_pb; @@ -3389,7 +3388,7 @@ static int encode_thread(AVCodecContext *c, void *arg){ } } - copy_context_after_encode(s, &best_s); + copy_context_after_encode(s, &best_s, s->c.data_partitioning); pb_bits_count= put_bits_count(&s->pb); flush_put_bits(&s->pb); -- 2.45.2
From 3c0df27067d0e0758fc72bbe31c5cab7eb2c8ed2 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@outlook.com> Date: Tue, 25 Mar 2025 18:00:25 +0100 Subject: [PATCH 04/11] avcodec/mpegvideo_enc: Don't use unnecessarily much stack encode_thread() puts two MPVEncContexts (2*6516B here) on the stack and zeroes one of them in order to temporarily store the variables that get changed during encoding a macroblock (when there is more than one candidate type for a macroblock). This is wasteful and therefore this commit adds a small (328B here) structure to store exactly the fields that actually need to be backed up. Then one can extend MPVEncContext without fearing too use up to much stack. Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- libavcodec/mpegvideo_enc.c | 158 +++++++++++++++++++++---------------- 1 file changed, 89 insertions(+), 69 deletions(-) diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 16086bf067..fb3ad2e25c 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -2631,80 +2631,100 @@ static void encode_mb(MPVEncContext *const s, int motion_x, int motion_y) encode_mb_internal(s, motion_x, motion_y, 16, 16, 12, 0, 0, CHROMA_444); } -static inline void copy_context_before_encode(MPVEncContext *const d, - const MPVEncContext *const s) -{ - int i; - - memcpy(d->c.last_mv, s->c.last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop? - - /* MPEG-1 */ - d->c.mb_skip_run = s->c.mb_skip_run; - for(i=0; i<3; i++) - d->c.last_dc[i] = s->c.last_dc[i]; - - /* statistics */ - d->mv_bits= s->mv_bits; - d->i_tex_bits= s->i_tex_bits; - d->p_tex_bits= s->p_tex_bits; - d->i_count= s->i_count; - d->misc_bits= s->misc_bits; - d->last_bits= 0; - - d->c.mb_skipped = 0; - d->c.qscale = s->c.qscale; - d->dquant= s->dquant; - - d->esc3_level_length= s->esc3_level_length; +typedef struct MBBackup { + struct { + int mv[2][4][2]; + int last_mv[2][2][2]; + int mv_type, mv_dir; + int last_dc[3]; + int mb_intra, mb_skipped, mb_skip_run; + int qscale; + int block_last_index[8]; + int interlaced_dct; + int16_t (*block)[64]; + } c; + int mv_bits, i_tex_bits, p_tex_bits, i_count, misc_bits, last_bits; + int dquant; + int esc3_level_length; + PutBitContext pb, pb2, tex_pb; +} MBBackup; + +#define COPY_CONTEXT(BEFORE, AFTER, DST_TYPE, SRC_TYPE) \ +static inline void BEFORE ##_context_before_encode(DST_TYPE *const d, \ + const SRC_TYPE *const s) \ +{ \ + /* FIXME is memcpy faster than a loop? */ \ + memcpy(d->c.last_mv, s->c.last_mv, 2*2*2*sizeof(int)); \ + \ + /* MPEG-1 */ \ + d->c.mb_skip_run = s->c.mb_skip_run; \ + for (int i = 0; i < 3; i++) \ + d->c.last_dc[i] = s->c.last_dc[i]; \ + \ + /* statistics */ \ + d->mv_bits = s->mv_bits; \ + d->i_tex_bits = s->i_tex_bits; \ + d->p_tex_bits = s->p_tex_bits; \ + d->i_count = s->i_count; \ + d->misc_bits = s->misc_bits; \ + d->last_bits = 0; \ + \ + d->c.mb_skipped = 0; \ + d->c.qscale = s->c.qscale; \ + d->dquant = s->dquant; \ + \ + d->esc3_level_length = s->esc3_level_length; \ +} \ + \ +static inline void AFTER ## _context_after_encode(DST_TYPE *const d, \ + const SRC_TYPE *const s, \ + int data_partitioning) \ +{ \ + /* FIXME is memcpy faster than a loop? */ \ + memcpy(d->c.mv, s->c.mv, 2*4*2*sizeof(int)); \ + memcpy(d->c.last_mv, s->c.last_mv, 2*2*2*sizeof(int)); \ + \ + /* MPEG-1 */ \ + d->c.mb_skip_run = s->c.mb_skip_run; \ + for (int i = 0; i < 3; i++) \ + d->c.last_dc[i] = s->c.last_dc[i]; \ + \ + /* statistics */ \ + d->mv_bits = s->mv_bits; \ + d->i_tex_bits = s->i_tex_bits; \ + d->p_tex_bits = s->p_tex_bits; \ + d->i_count = s->i_count; \ + d->misc_bits = s->misc_bits; \ + \ + d->c.mb_intra = s->c.mb_intra; \ + d->c.mb_skipped = s->c.mb_skipped; \ + d->c.mv_type = s->c.mv_type; \ + d->c.mv_dir = s->c.mv_dir; \ + d->pb = s->pb; \ + if (data_partitioning) { \ + d->pb2 = s->pb2; \ + d->tex_pb = s->tex_pb; \ + } \ + d->c.block = s->c.block; \ + for (int i = 0; i < 8; i++) \ + d->c.block_last_index[i] = s->c.block_last_index[i]; \ + d->c.interlaced_dct = s->c.interlaced_dct; \ + d->c.qscale = s->c.qscale; \ + \ + d->esc3_level_length = s->esc3_level_length; \ } -static inline void copy_context_after_encode(MPVEncContext *const d, - const MPVEncContext *const s, - int data_partitioning) -{ - int i; - - memcpy(d->c.mv, s->c.mv, 2*4*2*sizeof(int)); - memcpy(d->c.last_mv, s->c.last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster than a loop? - - /* MPEG-1 */ - d->c.mb_skip_run = s->c.mb_skip_run; - for(i=0; i<3; i++) - d->c.last_dc[i] = s->c.last_dc[i]; - - /* statistics */ - d->mv_bits= s->mv_bits; - d->i_tex_bits= s->i_tex_bits; - d->p_tex_bits= s->p_tex_bits; - d->i_count= s->i_count; - d->misc_bits= s->misc_bits; - - d->c.mb_intra = s->c.mb_intra; - d->c.mb_skipped = s->c.mb_skipped; - d->c.mv_type = s->c.mv_type; - d->c.mv_dir = s->c.mv_dir; - d->pb= s->pb; - if (data_partitioning) { - d->pb2= s->pb2; - d->tex_pb= s->tex_pb; - } - d->c.block = s->c.block; - for(i=0; i<8; i++) - d->c.block_last_index[i] = s->c.block_last_index[i]; - d->c.interlaced_dct = s->c.interlaced_dct; - d->c.qscale = s->c.qscale; - - d->esc3_level_length= s->esc3_level_length; -} +COPY_CONTEXT(backup, save, MBBackup, MPVEncContext) +COPY_CONTEXT(reset, store, MPVEncContext, MBBackup) -static void encode_mb_hq(MPVEncContext *const s, MPVEncContext *const backup, MPVEncContext *const best, +static void encode_mb_hq(MPVEncContext *const s, MBBackup *const backup, MBBackup *const best, PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2], int *dmin, int *next_block, int motion_x, int motion_y) { int score; uint8_t *dest_backup[3]; - copy_context_before_encode(s, backup); + reset_context_before_encode(s, backup); s->c.block = s->c.blocks[*next_block]; s->pb = pb[*next_block]; @@ -2744,7 +2764,7 @@ static void encode_mb_hq(MPVEncContext *const s, MPVEncContext *const backup, MP *dmin= score; *next_block^=1; - copy_context_after_encode(best, s, s->c.data_partitioning); + save_context_after_encode(best, s, s->c.data_partitioning); } } @@ -2962,7 +2982,7 @@ static int encode_thread(AVCodecContext *c, void *arg){ MPVEncContext *const s = *(void**)arg; int chr_h = 16 >> s->c.chroma_y_shift; int i; - MPVEncContext best_s = { 0 }, backup_s; + MBBackup best_s = { 0 }, backup_s; uint8_t bit_buf[2][MAX_MB_BYTES]; uint8_t bit_buf2[2][MAX_MB_BYTES]; uint8_t bit_buf_tex[2][MAX_MB_BYTES]; @@ -3163,7 +3183,7 @@ static int encode_thread(AVCodecContext *c, void *arg){ int next_block=0; int pb_bits_count, pb2_bits_count, tex_pb_bits_count; - copy_context_before_encode(&backup_s, s); + backup_context_before_encode(&backup_s, s); backup_s.pb= s->pb; if (s->c.data_partitioning) { backup_s.pb2= s->pb2; @@ -3388,7 +3408,7 @@ static int encode_thread(AVCodecContext *c, void *arg){ } } - copy_context_after_encode(s, &best_s, s->c.data_partitioning); + store_context_after_encode(s, &best_s, s->c.data_partitioning); pb_bits_count= put_bits_count(&s->pb); flush_put_bits(&s->pb); -- 2.45.2
From 3b229dc34e11826e18f42c228b77596ff30c8776 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@outlook.com> Date: Wed, 26 Mar 2025 08:38:58 +0100 Subject: [PATCH 05/11] avcodec/mpegvideo_enc: Set b-frame chain length properly Fixes a regression caused by my desire to use loop-scope for iterators in 72bf3d3c12ae562fd408603483bc59058757b1a1. Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- libavcodec/mpegvideo_enc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index fb3ad2e25c..febe50930b 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -1726,8 +1726,9 @@ static int set_bframe_chain_length(MPVMainEncContext *const m) s->c.linesize) + 1; } } - for (int i = 0; i < m->max_b_frames + 1; i++) { - if (!m->input_picture[i] || + for (int i = 0;; i++) { + if (i >= m->max_b_frames + 1 || + !m->input_picture[i] || m->input_picture[i]->b_frame_score - 1 > s->c.mb_num / m->b_sensitivity) { b_frames = FFMAX(0, i - 1); -- 2.45.2
From 483932d3eac7a4ab9f2fb9cca214ace1c44e01cf Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@outlook.com> Date: Wed, 26 Mar 2025 09:05:38 +0100 Subject: [PATCH 06/11] fate/vcodec: Test non-default b_strategy With this modification the test would have caught the regression introduced in 72bf3d3c12ae562fd408603483bc59058757b1a1. Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- tests/fate/vcodec.mak | 3 ++- tests/ref/vsynth/vsynth1-mpeg4-adap | 8 ++++---- tests/ref/vsynth/vsynth3-mpeg4-adap | 8 ++++---- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/fate/vcodec.mak b/tests/fate/vcodec.mak index 8a9083d4ed..f433feac69 100644 --- a/tests/fate/vcodec.mak +++ b/tests/fate/vcodec.mak @@ -306,7 +306,8 @@ fate-vsynth%-mpeg4: FMT = mp4 fate-vsynth%-mpeg4-adap: ENCOPTS = -b 550k -bf 2 -flags +mv4 \ -trellis 1 -cmp 1 -subcmp 2 \ -mbd rd -scplx_mask 0.3 \ - -mpv_flags +mv0 + -mpv_flags +mv0 \ + -b_strategy 1 -b_sensitivity 5 fate-vsynth%-mpeg4-adv: ENCOPTS = -qscale 9 -flags +mv4+aic \ -data_partitioning 1 -trellis 1 \ diff --git a/tests/ref/vsynth/vsynth1-mpeg4-adap b/tests/ref/vsynth/vsynth1-mpeg4-adap index d3ad12e921..8fd0384f31 100644 --- a/tests/ref/vsynth/vsynth1-mpeg4-adap +++ b/tests/ref/vsynth/vsynth1-mpeg4-adap @@ -1,4 +1,4 @@ -3b4fe7ad106cb112364d062b20ad80a8 *tests/data/fate/vsynth1-mpeg4-adap.avi -325594 tests/data/fate/vsynth1-mpeg4-adap.avi -96c5a7759413ab24afaa926abb3c5fe0 *tests/data/fate/vsynth1-mpeg4-adap.out.rawvideo -stddev: 14.11 PSNR: 25.13 MAXDIFF: 184 bytes: 7603200/ 7603200 +3a889f498a36c3bce59924887e73990f *tests/data/fate/vsynth1-mpeg4-adap.avi +264468 tests/data/fate/vsynth1-mpeg4-adap.avi +8333845e5dfdb913d08570b7edf8682f *tests/data/fate/vsynth1-mpeg4-adap.out.rawvideo +stddev: 13.94 PSNR: 25.24 MAXDIFF: 165 bytes: 7603200/ 7603200 diff --git a/tests/ref/vsynth/vsynth3-mpeg4-adap b/tests/ref/vsynth/vsynth3-mpeg4-adap index 70a25831d9..d85d648729 100644 --- a/tests/ref/vsynth/vsynth3-mpeg4-adap +++ b/tests/ref/vsynth/vsynth3-mpeg4-adap @@ -1,4 +1,4 @@ -10512ee1a666ed95643557e1cf699363 *tests/data/fate/vsynth3-mpeg4-adap.avi -41100 tests/data/fate/vsynth3-mpeg4-adap.avi -9ba2c3cab3f08d2a345b849d0b30e3e1 *tests/data/fate/vsynth3-mpeg4-adap.out.rawvideo -stddev: 5.79 PSNR: 32.88 MAXDIFF: 49 bytes: 86700/ 86700 +974af2dfb1f81c8030d813617f989b9d *tests/data/fate/vsynth3-mpeg4-adap.avi +42096 tests/data/fate/vsynth3-mpeg4-adap.avi +96839ddca31edf7c9d392c358262a6d4 *tests/data/fate/vsynth3-mpeg4-adap.out.rawvideo +stddev: 4.94 PSNR: 34.25 MAXDIFF: 49 bytes: 86700/ 86700 -- 2.45.2
From c0215651a2b84f8f5faf56ebab4b86643b571402 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@outlook.com> Date: Tue, 25 Mar 2025 03:23:13 +0100 Subject: [PATCH 07/11] avcodec/motion_est: Put map, me_map into MotionEstContext They have a fixed size and given that nowadays MotionEstContext is no longer in any decoder's private context, it is not wasteful to just put it into there. Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- libavcodec/motion_est.h | 5 +++-- libavcodec/mpegvideo_enc.c | 15 ++------------- libavcodec/snowenc.c | 5 +---- libavcodec/svq1enc.c | 5 +---- 4 files changed, 7 insertions(+), 23 deletions(-) diff --git a/libavcodec/motion_est.h b/libavcodec/motion_est.h index fe3d61fafb..89a2f41b75 100644 --- a/libavcodec/motion_est.h +++ b/libavcodec/motion_est.h @@ -55,8 +55,6 @@ typedef struct MotionEstContext { uint8_t *scratchpad; /**< data area for the ME algo, so that * the ME does not need to malloc/free. */ uint8_t *temp; - uint32_t *map; ///< map to avoid duplicate evaluations - uint32_t *score_map; ///< map to store the scores unsigned map_generation; int pre_penalty_factor; int penalty_factor; /**< an estimate of the bits required to @@ -104,6 +102,9 @@ typedef struct MotionEstContext { int *mx_ptr, int *my_ptr, int dmin, int src_index, int ref_index, int size, int h); + + uint32_t map[ME_MAP_SIZE]; ///< map to avoid duplicate evaluations + uint32_t score_map[ME_MAP_SIZE];///< map to store the scores } MotionEstContext; /** diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index febe50930b..3d67df8d73 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -451,13 +451,12 @@ static av_cold int init_buffers(MPVMainEncContext *const m, AVCodecContext *avct #else ALIGN = 128, #endif - ME_MAP_ALLOC_SIZE = FFALIGN(2 * ME_MAP_SIZE * sizeof(*s->me.map), ALIGN), DCT_ERROR_SIZE = FFALIGN(2 * sizeof(*s->dct_error_sum), ALIGN), }; - static_assert(FFMAX(ME_MAP_ALLOC_SIZE, DCT_ERROR_SIZE) * MAX_THREADS + ALIGN - 1 <= SIZE_MAX, + static_assert(DCT_ERROR_SIZE * MAX_THREADS + ALIGN - 1 <= SIZE_MAX, "Need checks for potential overflow."); unsigned nb_slices = s->c.slice_context_count, mv_table_size, mb_array_size; - char *dct_error = NULL, *me_map; + char *dct_error = NULL; int has_b_frames = !!m->max_b_frames, nb_mv_tables = 1 + 5 * has_b_frames; int16_t (*mv_table)[2]; @@ -470,11 +469,6 @@ static av_cold int init_buffers(MPVMainEncContext *const m, AVCodecContext *avct m->dct_error_sum_base = dct_error; dct_error += FFALIGN((uintptr_t)dct_error, ALIGN) - (uintptr_t)dct_error; } - me_map = av_mallocz(ALIGN - 1 + nb_slices * ME_MAP_ALLOC_SIZE); - if (!me_map) - return AVERROR(ENOMEM); - m->me_map_base = me_map; - me_map += FFALIGN((uintptr_t)me_map, ALIGN) - (uintptr_t)me_map; /* Allocate MB type table */ mb_array_size = s->c.mb_stride * s->c.mb_height; @@ -514,10 +508,6 @@ static av_cold int init_buffers(MPVMainEncContext *const m, AVCodecContext *avct s2->mb_mean = (uint8_t*)(s2->mb_var + mb_array_size); s2->lambda_table = s->lambda_table; - s2->me.map = (uint32_t*)me_map; - s2->me.score_map = s2->me.map + ME_MAP_SIZE; - me_map += ME_MAP_ALLOC_SIZE; - s2->p_mv_table = tmp_mv_table; if (has_b_frames) { s2->b_forw_mv_table = tmp_mv_table += mv_table_size; @@ -1132,7 +1122,6 @@ av_cold int ff_mpv_encode_end(AVCodecContext *avctx) av_freep(&m->mv_table_base); av_freep(&s->p_field_select_table[0]); av_freep(&m->dct_error_sum_base); - av_freep(&m->me_map_base); av_freep(&s->mb_type); av_freep(&s->lambda_table); diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c index a15960e4a3..7818c79fa6 100644 --- a/libavcodec/snowenc.c +++ b/libavcodec/snowenc.c @@ -235,10 +235,8 @@ static av_cold int encode_init(AVCodecContext *avctx) mpv->me.temp = mpv->me.scratchpad = av_calloc(avctx->width + 64, 2*16*2*sizeof(uint8_t)); mpv->c.sc.obmc_scratchpad = av_mallocz(MB_SIZE*MB_SIZE*12*sizeof(uint32_t)); - mpv->me.map = av_mallocz(2 * ME_MAP_SIZE * sizeof(*mpv->me.map)); - if (!mpv->me.scratchpad || !mpv->me.map || !mpv->c.sc.obmc_scratchpad) + if (!mpv->me.scratchpad || !mpv->c.sc.obmc_scratchpad) return AVERROR(ENOMEM); - mpv->me.score_map = mpv->me.map + ME_MAP_SIZE; mpv->me.mv_penalty = ff_h263_get_mv_penalty(); @@ -2093,7 +2091,6 @@ static av_cold int encode_end(AVCodecContext *avctx) enc->m.s.me.temp = NULL; av_freep(&enc->m.s.me.scratchpad); - av_freep(&enc->m.s.me.map); av_freep(&enc->m.s.c.sc.obmc_scratchpad); av_freep(&avctx->stats_out); diff --git a/libavcodec/svq1enc.c b/libavcodec/svq1enc.c index 9d8b0d496f..0a92c5607c 100644 --- a/libavcodec/svq1enc.c +++ b/libavcodec/svq1enc.c @@ -540,7 +540,6 @@ static av_cold int svq1_encode_end(AVCodecContext *avctx) avctx->frame_num)); av_freep(&s->m.me.scratchpad); - av_freep(&s->m.me.map); av_freep(&s->mb_type); av_freep(&s->dummy); av_freep(&s->scratchbuf); @@ -620,13 +619,11 @@ static av_cold int svq1_encode_init(AVCodecContext *avctx) s->y_block_height * sizeof(int16_t)); s->dummy = av_mallocz((s->y_block_width + 1) * s->y_block_height * sizeof(int32_t)); - s->m.me.map = av_mallocz(2 * ME_MAP_SIZE * sizeof(*s->m.me.map)); s->m.new_pic = av_frame_alloc(); - if (!s->m.me.scratchpad || !s->m.me.map || + if (!s->m.me.scratchpad || !s->mb_type || !s->dummy || !s->m.new_pic) return AVERROR(ENOMEM); - s->m.me.score_map = s->m.me.map + ME_MAP_SIZE; ff_svq1enc_init(&s->svq1encdsp); -- 2.45.2
From 1c444bb0559b412dbd9ccc54ae56a96b51e0f14c Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@outlook.com> Date: Tue, 25 Mar 2025 03:35:09 +0100 Subject: [PATCH 08/11] avcodec/snowenc: Don't allocate obmc_scratchpad separately Put it into SnowEncContext instead. Also use the proper type (it is only used as IDWTELEM aka short). (The allocation code allocated it in units of uint32_t, yet it was never used in this way. I made the array so big that the size (in bytes) does not change.) Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- libavcodec/snowenc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c index 7818c79fa6..8e7712fe5f 100644 --- a/libavcodec/snowenc.c +++ b/libavcodec/snowenc.c @@ -68,6 +68,8 @@ typedef struct SnowEncContext { unsigned me_cache_generation; uint64_t encoding_error[SNOW_MAX_PLANES]; + + IDWTELEM obmc_scratchpad[MB_SIZE * MB_SIZE * 12 * 2]; } SnowEncContext; static void init_ref(MotionEstContext *c, const uint8_t *const src[3], @@ -234,8 +236,7 @@ static av_cold int encode_init(AVCodecContext *avctx) mpv->me.temp = mpv->me.scratchpad = av_calloc(avctx->width + 64, 2*16*2*sizeof(uint8_t)); - mpv->c.sc.obmc_scratchpad = av_mallocz(MB_SIZE*MB_SIZE*12*sizeof(uint32_t)); - if (!mpv->me.scratchpad || !mpv->c.sc.obmc_scratchpad) + if (!mpv->me.scratchpad) return AVERROR(ENOMEM); mpv->me.mv_penalty = ff_h263_get_mv_penalty(); @@ -670,7 +671,7 @@ static int get_dc(SnowEncContext *enc, int mb_x, int mb_y, int plane_index) const int obmc_stride= plane_index ? (2*block_size)>>s->chroma_h_shift : 2*block_size; const int ref_stride= s->current_picture->linesize[plane_index]; const uint8_t *src = s->input_picture->data[plane_index]; - IDWTELEM *dst = (IDWTELEM*)enc->m.s.c.sc.obmc_scratchpad + plane_index * block_size * block_size * 4; //FIXME change to unsigned + IDWTELEM *dst = enc->obmc_scratchpad + plane_index * block_size * block_size * 4; //FIXME change to unsigned const int b_stride = s->b_width << s->block_max_depth; const int w= p->width; const int h= p->height; @@ -768,7 +769,7 @@ static int get_block_rd(SnowEncContext *enc, int mb_x, int mb_y, const int ref_stride= s->current_picture->linesize[plane_index]; uint8_t *dst= s->current_picture->data[plane_index]; const uint8_t *src = s->input_picture->data[plane_index]; - IDWTELEM *pred = (IDWTELEM*)enc->m.s.c.sc.obmc_scratchpad + plane_index * block_size * block_size * 4; + IDWTELEM *pred = enc->obmc_scratchpad + plane_index * block_size * block_size * 4; uint8_t *cur = s->scratchbuf; uint8_t *tmp = s->emu_edge_buffer; const int b_stride = s->b_width << s->block_max_depth; @@ -2091,7 +2092,6 @@ static av_cold int encode_end(AVCodecContext *avctx) enc->m.s.me.temp = NULL; av_freep(&enc->m.s.me.scratchpad); - av_freep(&enc->m.s.c.sc.obmc_scratchpad); av_freep(&avctx->stats_out); -- 2.45.2
From ffead361c6bcdf574f45dfeff8a06b51b35b74e9 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@outlook.com> Date: Tue, 25 Mar 2025 04:22:27 +0100 Subject: [PATCH 09/11] avcodec/mpegvideo: Don't set [bf]_code for non-MPEG-4 decoders It is only used by encoders and the MPEG-4 decoder. Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- libavcodec/flvdec.c | 2 -- libavcodec/intelh263dec.c | 1 - libavcodec/ituh263dec.c | 1 - libavcodec/mpeg4videodec.c | 8 ++++---- libavcodec/mpegvideo.c | 3 --- libavcodec/mpegvideo_enc.c | 3 +++ libavcodec/rv10.c | 2 -- 7 files changed, 7 insertions(+), 13 deletions(-) diff --git a/libavcodec/flvdec.c b/libavcodec/flvdec.c index f4bfd99417..627538ef83 100644 --- a/libavcodec/flvdec.c +++ b/libavcodec/flvdec.c @@ -97,8 +97,6 @@ int ff_flv_decode_picture_header(MpegEncContext *s) if (skip_1stop_8data_bits(&s->gb) < 0) return AVERROR_INVALIDDATA; - s->f_code = 1; - if (s->ehc_mode) s->avctx->sample_aspect_ratio= (AVRational){1,2}; diff --git a/libavcodec/intelh263dec.c b/libavcodec/intelh263dec.c index 4efae7938c..374dfdc0de 100644 --- a/libavcodec/intelh263dec.c +++ b/libavcodec/intelh263dec.c @@ -118,7 +118,6 @@ int ff_intel_h263_decode_picture_header(MpegEncContext *s) /* PEI */ if (skip_1stop_8data_bits(&s->gb) < 0) return AVERROR_INVALIDDATA; - s->f_code = 1; ff_h263_show_pict_info(s); diff --git a/libavcodec/ituh263dec.c b/libavcodec/ituh263dec.c index d451a35da8..6c9c2583e3 100644 --- a/libavcodec/ituh263dec.c +++ b/libavcodec/ituh263dec.c @@ -1353,7 +1353,6 @@ int ff_h263_decode_picture_header(MpegEncContext *s) return -1; } } - s->f_code = 1; if (s->pict_type == AV_PICTURE_TYPE_B) s->low_delay = 0; diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c index cb32f0e300..e21f1d24a2 100644 --- a/libavcodec/mpeg4videodec.c +++ b/libavcodec/mpeg4videodec.c @@ -3329,6 +3329,8 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb, } } + s->f_code = 1; + s->b_code = 1; if (ctx->shape != BIN_ONLY_SHAPE) { s->chroma_qscale = s->qscale = get_bits(gb, ctx->quant_precision); if (s->qscale == 0) { @@ -3345,8 +3347,7 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb, s->f_code = 1; return AVERROR_INVALIDDATA; // makes no sense to continue, as there is nothing left from the image then } - } else - s->f_code = 1; + } if (s->pict_type == AV_PICTURE_TYPE_B) { s->b_code = get_bits(gb, 3); @@ -3356,8 +3357,7 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb, s->b_code=1; return AVERROR_INVALIDDATA; // makes no sense to continue, as the MV decoding will break very quickly } - } else - s->b_code = 1; + } if (s->avctx->debug & FF_DEBUG_PICT_INFO) { av_log(s->avctx, AV_LOG_DEBUG, diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 794b2d0f66..d09eb1211d 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -236,9 +236,6 @@ av_cold void ff_mpv_common_defaults(MpegEncContext *s) s->picture_number = 0; - s->f_code = 1; - s->b_code = 1; - s->slice_context_count = 1; } diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 3d67df8d73..02255fdaed 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -285,6 +285,9 @@ static av_cold void mpv_encode_defaults(MPVMainEncContext *const m) ff_mpv_common_defaults(&s->c); + s->c.f_code = 1; + s->c.b_code = 1; + if (!m->fcode_tab) { m->fcode_tab = default_fcode_tab + MAX_MV; ff_thread_once(&init_static_once, mpv_encode_init_static); diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c index 753c6c6cb3..d8df7e8612 100644 --- a/libavcodec/rv10.c +++ b/libavcodec/rv10.c @@ -150,7 +150,6 @@ static int rv10_decode_picture_header(MpegEncContext *s) mb_count = s->mb_width * s->mb_height; } skip_bits(&s->gb, 3); /* ignored */ - s->f_code = 1; return mb_count; } @@ -284,7 +283,6 @@ static int rv20_decode_picture_header(RVDecContext *rv, int whole_size) // binary decoder reads 3+2 bits here but they don't seem to be used skip_bits(&s->gb, 5); - s->f_code = 1; s->h263_aic = s->pict_type == AV_PICTURE_TYPE_I; s->modified_quant = 1; if (!s->avctx->lowres) -- 2.45.2
From a968f6580f49ec6dd33bc6d7aadf08f51dbec703 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@outlook.com> Date: Tue, 25 Mar 2025 05:27:11 +0100 Subject: [PATCH 10/11] avcodec/rv10: Remove pointless casts Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- libavcodec/rv10.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c index d8df7e8612..4df545aec0 100644 --- a/libavcodec/rv10.c +++ b/libavcodec/rv10.c @@ -206,8 +206,8 @@ static int rv20_decode_picture_header(RVDecContext *rv, int whole_size) return AVERROR_INVALIDDATA; } - new_w = 4 * ((uint8_t *) s->avctx->extradata)[6 + 2 * f]; - new_h = 4 * ((uint8_t *) s->avctx->extradata)[7 + 2 * f]; + new_w = 4 * s->avctx->extradata[6 + 2 * f]; + new_h = 4 * s->avctx->extradata[7 + 2 * f]; } else { new_w = rv->orig_width; new_h = rv->orig_height; @@ -368,8 +368,8 @@ static av_cold int rv10_decode_init(AVCodecContext *avctx) rv->orig_width = avctx->coded_width; rv->orig_height = avctx->coded_height; - s->h263_long_vectors = ((uint8_t *) avctx->extradata)[3] & 1; - rv->sub_id = AV_RB32((uint8_t *) avctx->extradata + 4); + s->h263_long_vectors = avctx->extradata[3] & 1; + rv->sub_id = AV_RB32A(avctx->extradata + 4); major_ver = RV_GET_MAJOR_VER(rv->sub_id); minor_ver = RV_GET_MINOR_VER(rv->sub_id); -- 2.45.2
From 82f5465a9890751a9272d68f4299d3cdbb344493 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinha...@outlook.com> Date: Tue, 25 Mar 2025 05:30:13 +0100 Subject: [PATCH 11/11] avcodec/rv10: Make logmessage endian-independent Also fix a potential effective-type violation. Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com> --- libavcodec/rv10.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c index 4df545aec0..482af8e52a 100644 --- a/libavcodec/rv10.c +++ b/libavcodec/rv10.c @@ -394,7 +394,7 @@ static av_cold int rv10_decode_init(AVCodecContext *avctx) if (avctx->debug & FF_DEBUG_PICT_INFO) { av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%"PRIX32"\n", rv->sub_id, - ((uint32_t *) avctx->extradata)[0]); + AV_RL32A(avctx->extradata)); } /* init static VLCs */ -- 2.45.2
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".