Bug 1431010. P2 - add an overload of Push() to MediaQueue to support ownership transfer.
MozReview-Commit-ID: FIWJhlT7IrS
--- 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);
}