From 319f10d372a7925bc1a5af36df07e7f8a8ce86e0 Mon Sep 17 00:00:00 2001 From: trav90 Date: Thu, 4 May 2017 02:23:56 -0500 Subject: [PATCH] Make RangeRemoval use promises --- dom/media/mediasource/SourceBuffer.cpp | 52 +++---------------- dom/media/mediasource/SourceBuffer.h | 3 -- .../mediasource/SourceBufferContentManager.h | 3 +- dom/media/mediasource/TrackBuffer.cpp | 8 +-- dom/media/mediasource/TrackBuffer.h | 2 +- 5 files changed, 14 insertions(+), 54 deletions(-) diff --git a/dom/media/mediasource/SourceBuffer.cpp b/dom/media/mediasource/SourceBuffer.cpp index 95a572cffe..4478067aaa 100644 --- a/dom/media/mediasource/SourceBuffer.cpp +++ b/dom/media/mediasource/SourceBuffer.cpp @@ -64,34 +64,6 @@ private: uint32_t mUpdateID; }; -class RangeRemovalRunnable : public nsRunnable { -public: - RangeRemovalRunnable(SourceBuffer* aSourceBuffer, - double aStart, - double aEnd) - : mSourceBuffer(aSourceBuffer) - , mStart(aStart) - , mEnd(aEnd) - { } - - NS_IMETHOD Run() override final { - - if (!mSourceBuffer->mUpdating) { - // abort was called in between. - return NS_OK; - } - mSourceBuffer->DoRangeRemoval(mStart, mEnd); - mSourceBuffer->StopUpdating(); - - return NS_OK; - } - -private: - nsRefPtr mSourceBuffer; - double mStart; - double mEnd; -}; - void SourceBuffer::SetMode(SourceBufferAppendMode aMode, ErrorResult& aRv) { @@ -251,29 +223,19 @@ SourceBuffer::Remove(double aStart, double aEnd, ErrorResult& aRv) mMediaSource->SetReadyState(MediaSourceReadyState::Open); } - StartUpdating(); - nsRefPtr task = new RangeRemovalRunnable(this, aStart, aEnd); - NS_DispatchToMainThread(task); + RangeRemoval(aStart, aEnd); } void SourceBuffer::RangeRemoval(double aStart, double aEnd) { StartUpdating(); - DoRangeRemoval(aStart, aEnd); - nsRefPtr task = - NS_NewRunnableMethod(this, &SourceBuffer::StopUpdating); - NS_DispatchToMainThread(task); -} - -void -SourceBuffer::DoRangeRemoval(double aStart, double aEnd) -{ - MSE_DEBUG("DoRangeRemoval(%f, %f)", aStart, aEnd); - if (mContentManager && !IsInfinite(aStart)) { - mContentManager->RangeRemoval(TimeUnit::FromSeconds(aStart), - TimeUnit::FromSeconds(aEnd)); - } + nsRefPtr self = this; + mContentManager->RangeRemoval(TimeUnit::FromSeconds(aStart), + TimeUnit::FromSeconds(aEnd)) + ->Then(AbstractThread::MainThread(), __func__, + [self] (bool) { self->StopUpdating(); }, + []() { MOZ_ASSERT(false); }); } void diff --git a/dom/media/mediasource/SourceBuffer.h b/dom/media/mediasource/SourceBuffer.h index 4026a7fee8..7c2ad79047 100644 --- a/dom/media/mediasource/SourceBuffer.h +++ b/dom/media/mediasource/SourceBuffer.h @@ -117,8 +117,6 @@ public: // Runs the range removal algorithm as defined by the MSE spec. void RangeRemoval(double aStart, double aEnd); - // Actually remove data between aStart and aEnd - void DoRangeRemoval(double aStart, double aEnd); bool IsActive() const { @@ -134,7 +132,6 @@ private: friend class AsyncEventRunner; friend class BufferAppendRunnable; - friend class RangeRemovalRunnable; void DispatchSimpleEvent(const char* aName); void QueueAsyncSimpleEvent(const char* aName); diff --git a/dom/media/mediasource/SourceBufferContentManager.h b/dom/media/mediasource/SourceBufferContentManager.h index e363ce63a7..3001590839 100644 --- a/dom/media/mediasource/SourceBufferContentManager.h +++ b/dom/media/mediasource/SourceBufferContentManager.h @@ -24,6 +24,7 @@ public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SourceBufferContentManager); typedef MediaPromise AppendPromise; + typedef AppendPromise RangeRemovalPromise; static already_AddRefed CreateManager(MediaSourceDecoder* aParentDecoder, const nsACString& aType); @@ -48,7 +49,7 @@ public: // Runs MSE range removal algorithm. // http://w3c.github.io/media-source/#sourcebuffer-coded-frame-removal - virtual bool RangeRemoval(TimeUnit aStart, TimeUnit aEnd) = 0; + virtual nsRefPtr RangeRemoval(TimeUnit aStart, TimeUnit aEnd) = 0; enum class EvictDataResult : int8_t { diff --git a/dom/media/mediasource/TrackBuffer.cpp b/dom/media/mediasource/TrackBuffer.cpp index 0ea6fb62f0..91b28b41ab 100644 --- a/dom/media/mediasource/TrackBuffer.cpp +++ b/dom/media/mediasource/TrackBuffer.cpp @@ -1068,7 +1068,7 @@ TrackBuffer::RemoveDecoder(SourceBufferDecoder* aDecoder) aDecoder->GetReader()->GetTaskQueue()->Dispatch(task); } -bool +nsRefPtr TrackBuffer::RangeRemoval(TimeUnit aStart, TimeUnit aEnd) { MOZ_ASSERT(NS_IsMainThread()); @@ -1080,14 +1080,14 @@ TrackBuffer::RangeRemoval(TimeUnit aStart, TimeUnit aEnd) if (!buffered.Length() || aStart > bufferedEnd || aEnd < bufferedStart) { // Nothing to remove. - return false; + return RangeRemovalPromise::CreateAndResolve(false, __func__); } if (aStart > bufferedStart && aEnd < bufferedEnd) { // TODO. We only handle trimming and removal from the start. NS_WARNING("RangeRemoval unsupported arguments. " "Can only handle trimming (trim left or trim right"); - return false; + return RangeRemovalPromise::CreateAndResolve(false, __func__); } nsTArray decoders; @@ -1130,7 +1130,7 @@ TrackBuffer::RangeRemoval(TimeUnit aStart, TimeUnit aEnd) RemoveEmptyDecoders(decoders); NotifyTimeRangesChanged(); - return true; + return RangeRemovalPromise::CreateAndResolve(true, __func__); } void diff --git a/dom/media/mediasource/TrackBuffer.h b/dom/media/mediasource/TrackBuffer.h index 136f4f7df0..8526bbec9c 100644 --- a/dom/media/mediasource/TrackBuffer.h +++ b/dom/media/mediasource/TrackBuffer.h @@ -48,7 +48,7 @@ public: // of the buffer through to aTime. void EvictBefore(TimeUnit aTime) override; - bool RangeRemoval(TimeUnit aStart, TimeUnit aEnd) override; + nsRefPtr RangeRemoval(TimeUnit aStart, TimeUnit aEnd) override; void AbortAppendData() override;