This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit fb9015d55c8c3433fd440d2d573703e90249abbe Author: Jun Zhao <[email protected]> AuthorDate: Sun Oct 25 08:27:39 2026 +0800 Commit: Jun Zhao <[email protected]> CommitDate: Sun Oct 25 13:03:41 2026 +0000 avcodec/ac3dec: preserve AVOptions across flush ac3_decode_flush() clears every field from frame_type to the end of AC3DecodeContext with a single memset. Several fields backing AVOptions (drc_scale, heavy_compression, target_level and consistent_noise_generation, plus the exported downmix fields) were located in that range, so avcodec_flush_buffers() silently zeroed them. For drc_scale that does not even restore the default of 1.0, effectively disabling dynamic range compression after any flush, e.g. on seek. Move all AVOption fields above the start of the flushable fields, next to downmix_layout which was already kept there, so that flush only resets actual decoding state. The exported downmix fields are written from the frame header for every frame, so preserving them across flush does not change decoding. Fixes: https://code.ffmpeg.org/FFmpeg/FFmpeg/issues/25430 Signed-off-by: Jun Zhao <[email protected]> --- libavcodec/ac3dec.h | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/libavcodec/ac3dec.h b/libavcodec/ac3dec.h index 25ce1b1c90..3c98393c6c 100644 --- a/libavcodec/ac3dec.h +++ b/libavcodec/ac3dec.h @@ -93,8 +93,26 @@ typedef struct AC3DecodeContext { AVChannelLayout downmix_layout; SHORTFLOAT *downmix_coeffs[2]; ///< stereo downmix coefficients +///@name AVOptions +/// Fields backing AVOptions. They hold user configuration (or, for the +/// exported downmix fields, values derived from the last decoded frame) and +/// must survive avcodec_flush_buffers(), so they must stay above the start +/// of the flushable fields below. +///@{ + int preferred_stereo_downmix; + float ltrt_center_mix_level; + float ltrt_surround_mix_level; + float loro_center_mix_level; + float loro_surround_mix_level; + int target_level; ///< target level in dBFS + INTFLOAT drc_scale; ///< percentage of dynamic range compression to be applied + int heavy_compression; ///< apply heavy compression + int consistent_noise_generation; ///< seed noise generation with AC-3 frame on decode +///@} + // Start of flushable fields. -// frame_type must be the flushable field, or the offset changed in ac3_decode_flush(). +// frame_type must be the first flushable field, or the offset changed in +// ac3_decode_flush(). No AVOption field may be placed at or below this line. ///@name Bit stream information ///@{ @@ -127,12 +145,6 @@ typedef struct AC3DecodeContext { int dolby_headphone_mode; ///< dolby headphone mode (dheadphonmod) ///@} - int preferred_stereo_downmix; - float ltrt_center_mix_level; - float ltrt_surround_mix_level; - float loro_center_mix_level; - float loro_surround_mix_level; - int target_level; ///< target level in dBFS float level_gain[2]; ///@name Frame syntax parameters @@ -194,8 +206,6 @@ typedef struct AC3DecodeContext { ///@name Dynamic range INTFLOAT dynamic_range[2]; ///< dynamic range - INTFLOAT drc_scale; ///< percentage of dynamic range compression to be applied - int heavy_compression; ///< apply heavy compression INTFLOAT heavy_dynamic_range[2]; ///< heavy dynamic range compression ///@} @@ -204,10 +214,6 @@ typedef struct AC3DecodeContext { int end_freq[AC3_MAX_CHANNELS]; ///< end frequency bin (endmant) ///@} -///@name Consistent noise generation - int consistent_noise_generation; ///< seed noise generation with AC-3 frame on decode -///@} - ///@name Rematrixing int num_rematrixing_bands; ///< number of rematrixing bands (nrematbnd) int rematrixing_flags[4]; ///< rematrixing flags (rematflg) -- To stop receiving notification emails like this one, please contact [email protected]. _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
