Bug 1379056 - GeckoHlsPlayer should handle the case when obtain a negative duration from ExoPlayer. draft
authorKilik Kuo <kikuo@mozilla.com>
Fri, 07 Jul 2017 13:00:06 +0800
changeset 605154 b9e8d80f7c07642f52dae3640bfedfbe169964e0
parent 605153 8bb607b93ed50353e3899a324a0bbbc1d0558e5b
child 606952 32868aad1e22598bd495ae6e92db8facaa3712c6
push id67317
push userbmo:kikuo@mozilla.com
push dateFri, 07 Jul 2017 05:00:50 +0000
bugs1379056
milestone56.0a1
Bug 1379056 - GeckoHlsPlayer should handle the case when obtain a negative duration from ExoPlayer. We might get a negative duration from ExoPlayer if it's unknown at that time, Setting it to 0 to align the default duration value in VideoInfo/AudioInfo. MozReview-Commit-ID: qASyfKJPzY
mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/BaseHlsPlayer.java
mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoHlsPlayer.java
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/BaseHlsPlayer.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/BaseHlsPlayer.java
@@ -69,18 +69,16 @@ public interface BaseHlsPlayer {
 
     // =======================================================================
     // API for GeckoHLSDemuxerWrapper
     // =======================================================================
     public void addDemuxerWrapperCallbackListener(DemuxerCallbacks callback);
 
     public ConcurrentLinkedQueue<GeckoHLSSample> getSamples(TrackType trackType, int number);
 
-    public long getDuration();
-
     public long getBufferedPosition();
 
     public int getNumberOfTracks(TrackType trackType);
 
     public GeckoVideoInfo getVideoInfo(int index);
 
     public GeckoAudioInfo getAudioInfo(int index);
 
--- 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
@@ -255,16 +255,27 @@ public class GeckoHlsPlayer implements B
             AppConstants.USER_AGENT_FENNEC_MOBILE,
             bandwidthMeter /* listener */,
             DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS,
             DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS,
             true /* allowCrossProtocolRedirects */
         );
     }
 
+    private long getDuration() {
+        assertTrue(mPlayer != null);
+        if (isLiveStream()) {
+            return 0L;
+        }
+        // Value returned by getDuration() is in milliseconds.
+        long duration = Math.max(0L, mPlayer.getDuration() * 1000L);
+        if (DEBUG) { Log.d(LOGTAG, "getDuration : " + duration  + "(Us)"); }
+        return duration;
+    }
+
     // To make sure that each player has a unique id, GeckoHlsPlayer should be
     // created only from synchronized APIs in GeckoPlayerFactory.
     public GeckoHlsPlayer() {
         mPlayerId = sPlayerId.incrementAndGet();
         if (DEBUG) { Log.d(LOGTAG, " construct player with id(" + mPlayerId + ")"); }
     }
 
     // Should be only called by GeckoPlayerFactory and GeckoHLSResourceWrapper.
@@ -562,28 +573,16 @@ public class GeckoHlsPlayer implements B
             return mARenderer != null ? mARenderer.getQueuedSamples(number) :
                                         new ConcurrentLinkedQueue<GeckoHLSSample>();
         } else {
             return new ConcurrentLinkedQueue<GeckoHLSSample>();
         }
     }
 
     @Override
-    public long getDuration() {
-        assertTrue(mPlayer != null);
-        if (isLiveStream()) {
-            return 0L;
-        }
-        // Value returned by getDuration() is in milliseconds.
-        long duration = mPlayer.getDuration() * 1000;
-        if (DEBUG) { Log.d(LOGTAG, "getDuration : " + duration  + "(Us)"); }
-        return duration;
-    }
-
-    @Override
     public long getBufferedPosition() {
         assertTrue(mPlayer != null);
         // Value returned by getBufferedPosition() is in milliseconds.
         long bufferedPos = Math.max(0L, mPlayer.getBufferedPosition() * 1000L);
         if (DEBUG) { Log.d(LOGTAG, "getBufferedPosition : " + bufferedPos + "(Us)"); }
         return bufferedPos;
     }