Bug 1369598 - Notify HLSDemuxer initialized after underlying GekcoHlsPlayer is ready with data. draft
authorKilik Kuo <kikuo@mozilla.com>
Thu, 08 Jun 2017 22:41:35 +0800
changeset 591030 356eada30cbd0e4062536a7b0f82295ea43d3bc2
parent 588783 8a3aa1701537ea6b8334f432cd030d260d492fa3
child 632399 f59c728906797df47ce55df2a2e168afb8baeb38
push id62928
push userbmo:kikuo@mozilla.com
push dateThu, 08 Jun 2017 14:44:03 +0000
bugs1369598
milestone55.0a1
Bug 1369598 - Notify HLSDemuxer initialized after underlying GekcoHlsPlayer is ready with data. MozReview-Commit-ID: CkdNwoVHmD3
mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoHlsPlayer.java
mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoHlsRendererBase.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
@@ -78,31 +78,40 @@ public class GeckoHlsPlayer implements E
     private RendererController mRendererController = new RendererController(true, true);
 
     // Provide statistical information of tracks.
     private class HlsMediaTracksInfo {
         private int mNumVideoTracks = 0;
         private int mNumAudioTracks = 0;
         private boolean mVideoInfoUpdated = false;
         private boolean mAudioInfoUpdated = false;
+        private boolean mVideoDataArrived = false;
+        private boolean mAudioDataArrived = false;
         HlsMediaTracksInfo(int numVideoTracks, int numAudioTracks) {
             this.mNumVideoTracks = numVideoTracks;
             this.mNumAudioTracks = numAudioTracks;
         }
         public boolean hasVideo() { return mNumVideoTracks > 0; }
         public boolean hasAudio() { return mNumAudioTracks > 0; }
         public int getNumOfVideoTracks() { return mNumVideoTracks; }
         public int getNumOfAudioTracks() { return mNumAudioTracks; }
         public void onVideoInfoUpdated() { mVideoInfoUpdated = true; }
         public void onAudioInfoUpdated() { mAudioInfoUpdated = true; }
+        public void onDataArrived(int trackType) {
+            if (trackType == C.TRACK_TYPE_VIDEO) {
+                mVideoDataArrived = true;
+            } else if (trackType == C.TRACK_TYPE_AUDIO) {
+                mAudioDataArrived = true;
+            }
+        }
         public boolean videoReady() {
-            return hasVideo() ? mVideoInfoUpdated : true;
+            return !hasVideo() || (mVideoInfoUpdated && mVideoDataArrived);
         }
         public boolean audioReady() {
-            return hasAudio() ? mAudioInfoUpdated : true;
+            return !hasAudio() || (mAudioInfoUpdated && mAudioDataArrived);
         }
     }
     private HlsMediaTracksInfo mTracksInfo = null;
 
     private boolean mIsPlayerInitDone = false;
     private boolean mIsDemuxerInitDone = false;
     private DemuxerCallbacks mDemuxerCallbacks;
     private ResourceCallbacks mResourceCallbacks;
@@ -174,27 +183,27 @@ public class GeckoHlsPlayer implements E
         }
         if (mTracksInfo.videoReady() && mTracksInfo.audioReady()) {
             mDemuxerCallbacks.onInitialized(mTracksInfo.hasAudio(), mTracksInfo.hasVideo());
             mIsDemuxerInitDone = true;
         }
     }
 
     public final class ComponentEventDispatcher {
-        public void onDataArrived() {
+        public void onDataArrived(final int trackType) {
             assertTrue(mMainHandler != null);
             assertTrue(mComponentListener != null);
             if (!mIsPlayerInitDone) {
                 return;
             }
             if (mMainHandler != null && mComponentListener != null) {
                 mMainHandler.post(new Runnable() {
                     @Override
                     public void run() {
-                        mComponentListener.onDataArrived();
+                        mComponentListener.onDataArrived(trackType);
                     }
                 });
             }
         }
 
         public void onVideoInputFormatChanged(final Format format) {
             assertTrue(mMainHandler != null);
             assertTrue(mComponentListener != null);
@@ -226,20 +235,23 @@ public class GeckoHlsPlayer implements E
                 });
             }
         }
     }
 
     public final class ComponentListener {
 
         // General purpose implementation
-        public void onDataArrived() {
+        public void onDataArrived(int trackType) {
             assertTrue(mResourceCallbacks != null);
+            assertTrue(mTracksInfo != null);
             Log.d(LOGTAG, "[CB][onDataArrived]");
+            mTracksInfo.onDataArrived(trackType);
             mResourceCallbacks.onDataArrived();
+            checkInitDone();
         }
 
         public void onVideoInputFormatChanged(Format format) {
             assertTrue(mTracksInfo != null);
             if (DEBUG) {
                 Log.d(LOGTAG, "[CB] onVideoInputFormatChanged [" + format + "]");
                 Log.d(LOGTAG, "[CB] SampleMIMEType [" +
                               format.sampleMimeType + "], ContainerMIMEType [" +
@@ -294,17 +306,17 @@ public class GeckoHlsPlayer implements E
         mDemuxerCallbacks = callback;
     }
 
     @Override
     public void onLoadingChanged(boolean isLoading) {
         if (DEBUG) { Log.d(LOGTAG, "loading [" + isLoading + "]"); }
         if (!isLoading) {
             // To update buffered position.
-            mComponentEventDispatcher.onDataArrived();
+            mComponentEventDispatcher.onDataArrived(C.TRACK_TYPE_DEFAULT);
         }
     }
 
     @Override
     public void onPlayerStateChanged(boolean playWhenReady, int state) {
         if (DEBUG) { Log.d(LOGTAG, "state [" + playWhenReady + ", " + getStateString(state) + "]"); }
         if (state == ExoPlayer.STATE_READY) {
             mPlayer.setPlayWhenReady(true);
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoHlsRendererBase.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoHlsRendererBase.java
@@ -227,17 +227,17 @@ public abstract class GeckoHlsRendererBa
 
         maybeNotifyDataArrived();
         return true;
     }
 
     private void maybeNotifyDataArrived() {
         if (mWaitingForData && isQueuedEnoughData()) {
             if (DEBUG) { Log.d(LOGTAG, "onDataArrived"); }
-            mPlayerEventDispatcher.onDataArrived();
+            mPlayerEventDispatcher.onDataArrived(getTrackType());
             mWaitingForData = false;
         }
     }
 
     private void readFormat() {
         int result = readSource(mFormatHolder, null, true);
         if (result == C.RESULT_FORMAT_READ) {
             onInputFormatChanged(mFormatHolder.format);