From 1cd2b803c6f676ef8cb1f80a09715d9ba0cf10d3 Mon Sep 17 00:00:00 2001 From: Bobby Holley Date: Wed, 5 Nov 2014 10:08:59 +0100 Subject: [PATCH] Bug 1091008 - Implement a sensible GetBuffered override for MediaSourceReader using the existing GetBuffered on MediaSource. r=cajbir --- dom/media/mediasource/MediaSource.cpp | 1 + dom/media/mediasource/MediaSourceDecoder.h | 5 +++++ dom/media/mediasource/MediaSourceReader.cpp | 7 +++++++ dom/media/mediasource/MediaSourceReader.h | 2 ++ dom/media/mediasource/TrackBuffer.cpp | 1 - dom/media/mediasource/TrackBuffer.h | 2 +- 6 files changed, 16 insertions(+), 2 deletions(-) diff --git a/dom/media/mediasource/MediaSource.cpp b/dom/media/mediasource/MediaSource.cpp index 547b42846ed9..68967e35f9f6 100644 --- a/dom/media/mediasource/MediaSource.cpp +++ b/dom/media/mediasource/MediaSource.cpp @@ -353,6 +353,7 @@ MediaSource::Detach() void MediaSource::GetBuffered(TimeRanges* aBuffered) { + ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); MOZ_ASSERT(aBuffered->Length() == 0); if (mActiveSourceBuffers->IsEmpty()) { return; diff --git a/dom/media/mediasource/MediaSourceDecoder.h b/dom/media/mediasource/MediaSourceDecoder.h index 22fabfec900f..54feeb84b058 100644 --- a/dom/media/mediasource/MediaSourceDecoder.h +++ b/dom/media/mediasource/MediaSourceDecoder.h @@ -74,6 +74,11 @@ private: // mMediaSource. dom::MediaSource* mMediaSource; nsRefPtr mReader; + + // XXXbholley - This is to allow the reader to invoke GetBuffered on + // mMediaSource. It goes away in a subsequent patch when that function gets + // hoisted into MediaSourceReader. + friend class MediaSourceReader; }; } // namespace mozilla diff --git a/dom/media/mediasource/MediaSourceReader.cpp b/dom/media/mediasource/MediaSourceReader.cpp index 3ed3e4bf47e5..8846ff724309 100644 --- a/dom/media/mediasource/MediaSourceReader.cpp +++ b/dom/media/mediasource/MediaSourceReader.cpp @@ -446,6 +446,13 @@ MediaSourceReader::Seek(int64_t aTime, int64_t aStartTime, int64_t aEndTime, return NS_OK; } +nsresult +MediaSourceReader::GetBuffered(dom::TimeRanges* aBuffered) +{ + static_cast(mDecoder)->mMediaSource->GetBuffered(aBuffered); + return NS_OK; +} + nsresult MediaSourceReader::ReadMetadata(MediaInfo* aInfo, MetadataTags** aTags) { diff --git a/dom/media/mediasource/MediaSourceReader.h b/dom/media/mediasource/MediaSourceReader.h index 0544145deff4..9b21d68e11fb 100644 --- a/dom/media/mediasource/MediaSourceReader.h +++ b/dom/media/mediasource/MediaSourceReader.h @@ -77,6 +77,8 @@ public: nsresult Seek(int64_t aTime, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime) MOZ_OVERRIDE; + nsresult GetBuffered(dom::TimeRanges* aBuffered) MOZ_OVERRIDE; + already_AddRefed CreateSubDecoder(const nsACString& aType); void AddTrackBuffer(TrackBuffer* aTrackBuffer); diff --git a/dom/media/mediasource/TrackBuffer.cpp b/dom/media/mediasource/TrackBuffer.cpp index f8e2a40fa425..185007ea4467 100644 --- a/dom/media/mediasource/TrackBuffer.cpp +++ b/dom/media/mediasource/TrackBuffer.cpp @@ -191,7 +191,6 @@ double TrackBuffer::Buffered(dom::TimeRanges* aRanges) { ReentrantMonitorAutoEnter mon(mParentDecoder->GetReentrantMonitor()); - MOZ_ASSERT(NS_IsMainThread()); double highestEndTime = 0; diff --git a/dom/media/mediasource/TrackBuffer.h b/dom/media/mediasource/TrackBuffer.h index 3510afaa5ff8..3d6cded3856e 100644 --- a/dom/media/mediasource/TrackBuffer.h +++ b/dom/media/mediasource/TrackBuffer.h @@ -43,7 +43,7 @@ public: // Returns the highest end time of all of the buffered ranges in the // decoders managed by this TrackBuffer, and returns the union of the - // decoders buffered ranges in aRanges. + // decoders buffered ranges in aRanges. This may be called on any thread. double Buffered(dom::TimeRanges* aRanges); // Mark the current decoder's resource as ended, clear mCurrentDecoder and