Bug 1401147 - Empty track buffer content upon detach. r?alwu draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Tue, 19 Sep 2017 14:44:59 +0200
changeset 666927 ad6b2f69783c299663072f97d3ed52263639e129
parent 666826 1f21f337e375e9de3498db318e20c109d8c67712
child 732239 165806721a79fc73bbb4277aaabb5e2d16444735
push id80552
push userbmo:jyavenard@mozilla.com
push dateTue, 19 Sep 2017 12:45:41 +0000
reviewersalwu
bugs1401147
milestone57.0a1
Bug 1401147 - Empty track buffer content upon detach. r?alwu MozReview-Commit-ID: 1HpK8C4RLR6
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;