Skip to content

[Android] IndexOutOfBoundsException in AdtsContainer.kt:90 (MediaCodec buffer offset error) #583

@yaroslav13

Description

@yaroslav13

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]

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions