Bug 1401147 - part1 : empty track buffer content upon detach. draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Tue, 19 Sep 2017 14:44:59 +0200
changeset 668988 bddecb9204a6348f42e27fa0b1af5ded062f9a89
parent 668025 47f7b6c64265bc7bdd22eef7ab71abc97cf3f8bf
child 668989 3663f020ffc3f34deefa393e43005fd5570b0e1a
child 668990 48e981d7b9304203466fe86a48ac0d6d44b152f1
child 668991 dc41c3d4d5017357991cfb3cf844bc86ce3adf56
child 669160 d685d7c844a432f678028559a274211d7b5a562f
push id81181
push useralwu@mozilla.com
push dateFri, 22 Sep 2017 10:01:45 +0000
bugs1401147
milestone57.0a1
Bug 1401147 - part1 : empty track buffer content upon detach. After detached the source buffer, we would reset all its resource and shutdown demuxer. MozReview-Commit-ID: 7xEJ7q00aeF
dom/media/mediasource/TrackBuffersManager.cpp
dom/media/mediasource/TrackBuffersManager.h
--- a/dom/media/mediasource/TrackBuffersManager.cpp
+++ b/dom/media/mediasource/TrackBuffersManager.cpp
@@ -206,16 +206,19 @@ TrackBuffersManager::ProcessTasks()
     case Type::Reset:
       CompleteResetParserState();
       break;
     case Type::Detach:
       mCurrentInputBuffer = nullptr;
       mTaskQueue = nullptr;
       MOZ_DIAGNOSTIC_ASSERT(mQueue.Length() == 0,
                             "Detach task must be the last");
+      mVideoTracks.Reset();
+      mAudioTracks.Reset();
+      ShutdownDemuxers();
       return;
     default:
       NS_WARNING("Invalid Task");
   }
   GetTaskQueue()->Dispatch(
     NewRunnableMethod("TrackBuffersManager::ProcessTasks",
                       this,
                       &TrackBuffersManager::ProcessTasks));
--- a/dom/media/mediasource/TrackBuffersManager.h
+++ b/dom/media/mediasource/TrackBuffersManager.h
@@ -371,18 +371,30 @@ private:
     EvictionIndex mEvictionIndex;
 
     void ResetAppendState()
     {
       mLastDecodeTimestamp.reset();
       mLastFrameDuration.reset();
       mHighestEndTimestamp.reset();
       mNeedRandomAccessPoint = true;
+      mNextInsertionIndex.reset();
+    }
 
-      mNextInsertionIndex.reset();
+    void Reset()
+    {
+      ResetAppendState();
+      mEvictionIndex.Reset();
+      for (auto& buffer : mBuffers) {
+        buffer.Clear();
+      }
+      mSizeBuffer = 0;
+      mNextGetSampleIndex.reset();
+      mBufferedRanges.Clear();
+      mSanitizedBufferedRanges.Clear();
     }
 
     void AddSizeOfResources(MediaSourceDecoder::ResourceSizes* aSizes) const;
   };
 
   void CheckSequenceDiscontinuity(const media::TimeUnit& aPresentationTime);
   void ProcessFrames(TrackBuffer& aSamples, TrackData& aTrackData);
   media::TimeInterval PresentationInterval(const TrackBuffer& aSamples) const;