diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java index 8164adda1569..879c8d9c574b 100644 --- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java +++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java @@ -31,6 +31,8 @@ import android.media.MediaFormat; import android.os.Build; import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; import android.view.Surface; import androidx.annotation.Nullable; import dev.cobalt.util.Log; @@ -93,6 +95,9 @@ class MediaCodecBridge { // which would cause GC cycles long enough to impact playback. private final MediaCodec.BufferInfo info = new MediaCodec.BufferInfo(); + private final Handler mHandler; + private final HandlerThread mHandlerThread; + // Type of bitrate adjustment for video encoder. public enum BitrateAdjustmentTypes { // No adjustment - video encoder has no known bitrate problem. @@ -461,6 +466,9 @@ private MediaCodecBridge( mLastPresentationTimeUs = 0; mFlushed = true; mBitrateAdjustmentType = bitrateAdjustmentType; + mHandlerThread = new HandlerThread("DecodeHandler"); + mHandlerThread.start(); + mHandler = new Handler(mHandlerThread.getLooper()); mCallback = new MediaCodec.Callback() { @Override @@ -525,7 +533,7 @@ public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) { } } }; - mMediaCodec.setCallback(mCallback); + mMediaCodec.setCallback(mCallback, mHandler); // TODO: support OnFrameRenderedListener for non tunnel mode if (tunnelModeAudioSessionId != -1) { @@ -806,6 +814,7 @@ public void release() { Log.e(TAG, "Cannot release media codec", e); } mMediaCodec = null; + mHandlerThread.quitSafely(); } @SuppressWarnings("unused")