Bug 1424168 - Reduce the Exoplayer buffer size to avoid OOM. draft
authorJames Cheng <jacheng@mozilla.com>
Fri, 08 Dec 2017 16:46:42 +0800
changeset 710998 5c9b5679bddd378d95bf6b976fa3fe956e5d1508
parent 708706 4b94da21a9e6171f9911ffad171af23c26e6227b
child 743719 a01de8f035238a58c293dd87a4b5db864a1c9fe1
push id92970
push userbmo:jacheng@mozilla.com
push dateTue, 12 Dec 2017 23:51:09 +0000
bugs1424168
milestone59.0a1
Bug 1424168 - Reduce the Exoplayer buffer size to avoid OOM. MozReview-Commit-ID: J1pi3S9Hxa7
mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoHlsPlayer.java
--- 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()));