Bug 1424168 - Reduce the Exoplayer buffer size to avoid OOM.
MozReview-Commit-ID: J1pi3S9Hxa7
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoHlsPlayer.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoHlsPlayer.java
@@ -6,16 +6,17 @@ package org.mozilla.gecko.media;
import android.content.Context;
import android.net.Uri;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
import com.google.android.exoplayer2.C;
+import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.source.MediaSource;
@@ -23,16 +24,17 @@ import com.google.android.exoplayer2.sou
import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.source.hls.HlsMediaSource;
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
import com.google.android.exoplayer2.upstream.DataSource;
+import com.google.android.exoplayer2.upstream.DefaultAllocator;
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.google.android.exoplayer2.upstream.DefaultHttpDataSource;
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;
import com.google.android.exoplayer2.upstream.HttpDataSource;
import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util;
@@ -555,18 +557,29 @@ public class GeckoHlsPlayer implements B
// Prepare customized renderer
mRenderers = new GeckoHlsRendererBase[2];
mVRenderer = new GeckoHlsVideoRenderer(mComponentEventDispatcher);
mARenderer = new GeckoHlsAudioRenderer(mComponentEventDispatcher);
mRenderers[0] = mVRenderer;
mRenderers[1] = mARenderer;
+ // Use default values for constructing DefaultLoadControl except maxBufferMs.
+ // See Bug 1424168.
+ int maxBufferMs = Math.max(DefaultLoadControl.DEFAULT_MIN_BUFFER_MS,
+ DefaultLoadControl.DEFAULT_MAX_BUFFER_MS / 2);
+ DefaultLoadControl dlc =
+ new DefaultLoadControl(
+ new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE),
+ DefaultLoadControl.DEFAULT_MIN_BUFFER_MS,
+ maxBufferMs, /*this value can eliminate the memory usage immensely by experiment*/
+ DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
+ DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
// Create ExoPlayer instance with specific components.
- mPlayer = ExoPlayerFactory.newInstance(mRenderers, mTrackSelector);
+ mPlayer = ExoPlayerFactory.newInstance(mRenderers, mTrackSelector, dlc);
mPlayer.addListener(this);
Uri uri = Uri.parse(url);
mMediaDataSourceFactory = buildDataSourceFactory(ctx, BANDWIDTH_METER);
mMediaSource = new HlsMediaSource(uri, mMediaDataSourceFactory, mMainHandler, null);
if (DEBUG) {
Log.d(LOGTAG, "Uri is " + uri +
", ContentType is " + Util.inferContentType(uri.getLastPathSegment()));