Bug 1431010. P2 - add an overload of Push() to MediaQueue to support ownership transfer. draft
authorJW Wang <jwwang@mozilla.com>
Wed, 17 Jan 2018 18:04:21 +0800
changeset 721918 43ef4ffe86127352b01c806a5d0408826e436ff7
parent 721917 80676fe03822356ed1afb1ae9fdeabdddf97bc85
child 746482 65dc25c4a01f60d6cab41fd7deea7df9b3fe45dc
push id95998
push userjwwang@mozilla.com
push dateThu, 18 Jan 2018 02:56:14 +0000
bugs1431010
milestone59.0a1
Bug 1431010. P2 - add an overload of Push() to MediaQueue to support ownership transfer. MozReview-Commit-ID: FIWJhlT7IrS
dom/media/MediaDecoderStateMachine.cpp
dom/media/MediaQueue.h
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -2847,26 +2847,26 @@ bool MediaDecoderStateMachine::HaveEnoug
   return VideoQueue().GetSize() >= GetAmpleVideoFrames() * mPlaybackRate + 1;
 }
 
 void
 MediaDecoderStateMachine::PushAudio(RefPtr<AudioData> aSample)
 {
   MOZ_ASSERT(OnTaskQueue());
   MOZ_ASSERT(aSample);
-  AudioQueue().Push(aSample);
+  AudioQueue().Push(aSample.forget());
 }
 
 void
 MediaDecoderStateMachine::PushVideo(RefPtr<VideoData> aSample)
 {
   MOZ_ASSERT(OnTaskQueue());
   MOZ_ASSERT(aSample);
   aSample->mFrameID = ++mCurrentFrameID;
-  VideoQueue().Push(aSample);
+  VideoQueue().Push(aSample.forget());
 }
 
 void
 MediaDecoderStateMachine::OnAudioPopped(const RefPtr<AudioData>& aSample)
 {
   MOZ_ASSERT(OnTaskQueue());
   mPlaybackOffset = std::max(mPlaybackOffset, aSample->mOffset);
 }
--- a/dom/media/MediaQueue.h
+++ b/dom/media/MediaQueue.h
@@ -21,16 +21,24 @@ class MediaQueueDeallocator : public nsD
   virtual void operator()(void* aObject) override
   {
     RefPtr<T> releaseMe = dont_AddRef(static_cast<T*>(aObject));
   }
 };
 
 template <class T>
 class MediaQueue : private nsDeque {
+  inline void PushInternal(T* aItem) {
+    MOZ_ASSERT(aItem->GetEndTime() >= aItem->mTime);
+    RecursiveMutexAutoLock lock(mRecursiveMutex);
+    MOZ_ASSERT(!mEndOfStream);
+    nsDeque::Push(aItem);
+    mPushEvent.Notify(RefPtr<T>(aItem));
+  }
+
 public:
   MediaQueue()
     : nsDeque(new MediaQueueDeallocator<T>()),
       mRecursiveMutex("mediaqueue"),
       mEndOfStream(false)
   {}
 
   ~MediaQueue() {
@@ -38,23 +46,25 @@ public:
   }
 
   inline size_t GetSize() const {
     RecursiveMutexAutoLock lock(mRecursiveMutex);
     return nsDeque::GetSize();
   }
 
   inline void Push(T* aItem) {
-    RecursiveMutexAutoLock lock(mRecursiveMutex);
-    MOZ_ASSERT(!mEndOfStream);
     MOZ_ASSERT(aItem);
     NS_ADDREF(aItem);
-    MOZ_ASSERT(aItem->GetEndTime() >= aItem->mTime);
-    nsDeque::Push(aItem);
-    mPushEvent.Notify(RefPtr<T>(aItem));
+    PushInternal(aItem);
+  }
+
+  inline void Push(already_AddRefed<T> aItem) {
+    T* item = aItem.take();
+    MOZ_ASSERT(item);
+    PushInternal(item);
   }
 
   inline already_AddRefed<T> PopFront() {
     RecursiveMutexAutoLock lock(mRecursiveMutex);
     RefPtr<T> rv = dont_AddRef(static_cast<T*>(nsDeque::PopFront()));
     if (rv) {
       mPopEvent.Notify(rv);
     }