Fix WMF AAC chunk boundary overshoot on Windows#44
Open
EliStoreplay wants to merge 1 commit into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
When decoding AAC audio in chunks on Windows, the decoded PCM at the chunk's boundary's either overshoot the end time or start before the initial chunk position. To my understanding, this is because the Windows Media Foundation (WMF) doesn't honour the AAC edit list, which usually accounts for the 1024 sample encoder delay prepended to every AAC stream.
Because of this, the timestamps are frame-count based rather than presentation-time based. This means the timestamp boundary check consistently includes one extra AAC frame (1024 samples, about 23ms) past the requested end. Essentially, this causes audible "stutters" when decoding chunks of audio.
Here's an example of the WMF bug in other cases.
Changes
Compute the number of PCM bytes that correspond to the
startMs, endMswindow using the sample rate, channel count and bit depth. Then, use this to skip any leading bytes that WMF returned beforestartMs, and crop output to never exceed the expected byte count.Tests
flutter test- All tests passflutter analyze- No issues found