This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 2e0a770b8e63911cdbca40dcbd3ba279f99d23f5 Author: Lynne <[email protected]> AuthorDate: Wed Sep 23 20:28:01 2026 +0900 Commit: James Almer <[email protected]> CommitDate: Fri Sep 25 02:13:39 2026 +0000 avcodec/opus/enc_psy: don't make the last frame silent at EOF 816d74e0bb made frames without psy analysis at EOF silent. The frame that follows the last input frame to flush its MDCT overlap is always such a frame, so the last CELT_OVERLAP samples of the stream were lost whenever it was needed, i.e. when the length of the stream is a multiple of frame_size or less than CELT_OVERLAP samples short of one. It was also coded as a one byte packet, which the MPEG-TS muxer rejects. Encode it like any other frame instead. Its psy analysis data is zeroed, which leaves it with the default frame parameters. Fixes: #24196 --- libavcodec/opus/enc_psy.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/libavcodec/opus/enc_psy.c b/libavcodec/opus/enc_psy.c index 7b44978f19..6dda22e7da 100644 --- a/libavcodec/opus/enc_psy.c +++ b/libavcodec/opus/enc_psy.c @@ -300,15 +300,6 @@ void ff_opus_psy_celt_frame_init(OpusPsyContext *s, CeltFrame *f, int index) for (i = 0; i < steps_per_frame; i++) silence &= s->steps[index * steps_per_frame + i]->silence; - /* If we reach EOF with fewer collected psy steps than this packet wants - * to encode, the slots beyond buffered_steps were zeroed by the previous - * postencode_update and contain no valid analysis data. Encoding garbage - * with the full rate budget can overrun the range coder buffer (rng_bytes - * exceeds the per-frame size passed to ff_opus_rc_enc_end), so force a - * silent packet instead. */ - if (s->eof && step_offset >= s->buffered_steps) - silence = 1; - f->silence = silence; if (f->silence) { /* Explicitly signal silence in a 2 byte frame, like libopus does. @@ -556,7 +547,9 @@ void ff_opus_psy_postencode_update(OpusPsyContext *s, CeltFrame *f) s->avg_is_band /= (s->p.frames + 1); s->steps_to_process = 0; - s->buffered_steps -= steps_out; + /* At EOF, one more frame than there are psy steps is encoded to flush + * the last frame's MDCT overlap */ + s->buffered_steps = FFMAX(s->buffered_steps - steps_out, 0); s->total_packets_out += s->p.frames; s->inflection_points_count = 0; } -- 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]
