From 22cc98ef7b73daa046b31533deae5dcb6ee91370 Mon Sep 17 00:00:00 2001 From: JW Wang Date: Thu, 28 May 2015 14:16:01 +0800 Subject: [PATCH] Bug 1163467. Part 1 - refactor DecodedStream::RecreateData(). r=roc. --- dom/media/DecodedStream.cpp | 12 +++++++++--- dom/media/DecodedStream.h | 3 ++- dom/media/MediaDecoder.cpp | 8 +------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/dom/media/DecodedStream.cpp b/dom/media/DecodedStream.cpp index 72be03706679..d48839864780 100644 --- a/dom/media/DecodedStream.cpp +++ b/dom/media/DecodedStream.cpp @@ -221,13 +221,19 @@ DecodedStream::DestroyData() } void -DecodedStream::RecreateData(int64_t aInitialTime, SourceMediaStream* aStream) +DecodedStream::RecreateData(int64_t aInitialTime, MediaStreamGraph* aGraph) { MOZ_ASSERT(NS_IsMainThread()); GetReentrantMonitor().AssertCurrentThreadIn(); - MOZ_ASSERT(!mData); + MOZ_ASSERT((aGraph && !mData && OutputStreams().IsEmpty()) || // first time + (!aGraph && mData)); // 2nd time and later - mData.reset(new DecodedStreamData(aInitialTime, aStream)); + if (!aGraph) { + aGraph = mData->mStream->Graph(); + } + auto source = aGraph->CreateSourceStream(nullptr); + DestroyData(); + mData.reset(new DecodedStreamData(aInitialTime, source)); // Note that the delay between removing ports in DestroyDecodedStream // and adding new ones won't cause a glitch since all graph operations diff --git a/dom/media/DecodedStream.h b/dom/media/DecodedStream.h index f26bc3dd8060..997104931990 100644 --- a/dom/media/DecodedStream.h +++ b/dom/media/DecodedStream.h @@ -21,6 +21,7 @@ class DecodedStream; class DecodedStreamGraphListener; class OutputStreamListener; class ReentrantMonitor; +class MediaStreamGraph; namespace layers { class Image; @@ -94,7 +95,7 @@ public: explicit DecodedStream(ReentrantMonitor& aMonitor); DecodedStreamData* GetData(); void DestroyData(); - void RecreateData(int64_t aInitialTime, SourceMediaStream* aStream); + void RecreateData(int64_t aInitialTime, MediaStreamGraph* aGraph); nsTArray& OutputStreams(); ReentrantMonitor& GetReentrantMonitor(); void Connect(ProcessedMediaStream* aStream, bool aFinishWhenEnded); diff --git a/dom/media/MediaDecoder.cpp b/dom/media/MediaDecoder.cpp index 5835b1fb9ad1..1cd2aabd3a28 100644 --- a/dom/media/MediaDecoder.cpp +++ b/dom/media/MediaDecoder.cpp @@ -332,13 +332,7 @@ void MediaDecoder::RecreateDecodedStream(int64_t aStartTimeUSecs, ReentrantMonitorAutoEnter mon(GetReentrantMonitor()); DECODER_LOG("RecreateDecodedStream aStartTimeUSecs=%lld!", aStartTimeUSecs); - if (!aGraph) { - aGraph = GetDecodedStream()->mStream->Graph(); - } - - mDecodedStream.DestroyData(); - mDecodedStream.RecreateData(aStartTimeUSecs, aGraph->CreateSourceStream(nullptr)); - + mDecodedStream.RecreateData(aStartTimeUSecs, aGraph); UpdateStreamBlockingForStateMachinePlaying(); GetDecodedStream()->mHaveBlockedForPlayState = mPlayState != PLAY_STATE_PLAYING;