mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2026-10-28 18:15:24 +08:00
AAC decoding overlaps each frame with the previous one, so the first frame decoded after a seek is only reliable once the frame before it has been decoded. Opus declares its pre-roll in AVCodecParameters.seek_preroll, AAC did not. Have the decoder export its pre-roll, as it knows the frame length: 1024 or 960 samples, half of it for LD and ELD, and 1024 or 768 for USAC. ELD needs three frames, as its low delay filterbank uses a window four frames long. SBR keeps the state of the frame before, in its filterbanks, its high-frequency generator and its gain smoothing, and codes its envelopes and noise floors relative to the frame before, so it needs one more frame, of twice as many output samples when it doubles the sample rate. Without it, the first 256 samples decoded after a seek into HE-AAC differ from continuous decoding by -36.6 dB with one frame of pre-roll, and not at all with two. Implicit SBR is only known once found in a frame, so the pre-roll is raised then, as it is for USAC, whose frame length depends on its SBR ratio. Demuxers get it through the stream probing, whatever the container. A larger pre-roll declared by the container is kept, and the documentation of AVCodecContext.seek_preroll now says a decoder may raise it. The output of an AAC-LC stream decoded after a seek has an error of -9.5 dB in the first 1024 samples, against -85 dB elsewhere, which one frame of pre-roll removes. The pre-roll tests now show the declared value, for AAC in every container, 4096 samples for HE-AAC, explicit or implicit, 2048 for SBR that does not double the sample rate, and 1536 for ELD.