-
Notifications
You must be signed in to change notification settings - Fork 288
Description
Description
A crash occurs during audio recording on Android when the MediaCodec returns a buffer with a non-zero offset. The AdtsContainer attempts to read the full info.size from the buffer starting at info.offset, but the buffer's capacity does not accommodate the combined length, leading to an IndexOutOfBoundsException.
Error Logs
D/MediaCodecEncoder(14652): Output format set: {max-bitrate=64000, sample-rate=44100, mime=audio/mp4a-latm, channel-count=1, bitrate=64000, csd-0=java.nio.HeapByteBuffer[pos=0 lim=2 cap=2]}
E/AudioRecorder(14652): off=25, len=185 out of bounds (size=185)
E/AudioRecorder(14652): java.lang.IndexOutOfBoundsException: off=25, len=185 out of bounds (size=185)
E/AudioRecorder(14652): at java.nio.Buffer.checkBounds(Buffer.java:587)
E/AudioRecorder(14652): at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:233)
E/AudioRecorder(14652): at com.llfbandit.record.record.container.AdtsContainer.writeStream(AdtsContainer.kt:90)
E/AudioRecorder(14652): at com.llfbandit.record.record.encoder.MediaCodecEncoder.processOutputBuffer(MediaCodecEncoder.kt:169)
E/AudioRecorder(14652): at com.llfbandit.record.record.encoder.MediaCodecEncoder.access$processOutputBuffer(MediaCodecEncoder.kt:17)
E/AudioRecorder(14652): at com.llfbandit.record.record.encoder.MediaCodecEncoder$AudioRecorderCodecCallback.onOutputBufferAvailable(MediaCodecEncoder.kt:227)
E/AudioRecorder(14652): at android.media.MediaCodec$EventHandler.handleCallback(MediaCodec.java:1750)
E/AudioRecorder(14652): at android.media.MediaCodec$EventHandler.handleMessage(MediaCodec.java:1697)
E/AudioRecorder(14652): at android.os.Handler.dispatchMessage(Handler.java:107)
E/AudioRecorder(14652): at android.os.Looper.loop(Looper.java:214)
E/AudioRecorder(14652): at android.os.HandlerThread.run(HandlerThread.java:67)
The Root Cause
The crash happens here: Buffer Size: 341 Offset: 25 Requested Length: 341 Calculation: 25 + 341 = 366, which exceeds the 341-byte capacity. In AdtsContainer.kt, the code is likely calling buffer.get(array, offset, length) without resetting the buffer position or correctly calculating the remaining capacity. When MediaCodec provides a partial buffer, this logic fails.
Steps to Reproduce
Initialize record plugin on Android.
Set sampleRate to 24000
Start recording to an AAC format
Call startStream()
The crash occurs immediately upon the first few packets being processed by the encoder.
Environment
Plugin Version: [6.2.0]
Flutter Version: [3.38.6]
Device: [custom]
Android OS: [Android 10]