Bug 1305353. Part 1 - publish output time to DecodedStream using MediaEventProducer. r=pehrsons

MozReview-Commit-ID: 5f37RfBhDA

--HG--
extra : rebase_source : 890a5b52fffac35302db1a8f17b4ff68b31e5ba4
extra : source : 07a11ac6970391aafc96f39370ab83370316f65a
This commit is contained in:
JW Wang 2016-09-26 15:08:12 +08:00
parent 6b3b767bd2
commit b903738272
2 changed files with 30 additions and 0 deletions

View File

@ -47,6 +47,7 @@ public:
if (mStream) {
mLastOutputTime = mStream->StreamTimeToMicroseconds(
mStream->GraphTimeToStreamTime(aCurrentTime));
mOnOutput.Notify(mLastOutputTime);
}
}
@ -78,7 +79,14 @@ public:
mStream = nullptr;
}
MediaEventSource<int64_t>& OnOutput()
{
return mOnOutput;
}
private:
MediaEventProducer<int64_t> mOnOutput;
Mutex mMutex;
// Members below are protected by mMutex.
RefPtr<MediaStream> mStream;
@ -123,6 +131,7 @@ public:
~DecodedStreamData();
int64_t GetPosition() const;
void SetPlaying(bool aPlaying);
MediaEventSource<int64_t>& OnOutput();
/* The following group of fields are protected by the decoder's monitor
* and can be read or written on any thread.
@ -198,6 +207,12 @@ DecodedStreamData::GetPosition() const
return mListener->GetLastOutputTime();
}
MediaEventSource<int64_t>&
DecodedStreamData::OnOutput()
{
return mListener->OnOutput();
}
void
DecodedStreamData::SetPlaying(bool aPlaying)
{
@ -266,6 +281,7 @@ DecodedStream::Start(int64_t aStartTime, const MediaInfo& aInfo)
MOZ_ASSERT(mStartTime.isNothing(), "playback already started.");
mStartTime.emplace(aStartTime);
mLastOutputTime = 0;
mInfo = aInfo;
mPlaying = true;
ConnectListener();
@ -314,6 +330,8 @@ DecodedStream::Start(int64_t aStartTime, const MediaInfo& aInfo)
mData = static_cast<R*>(r.get())->ReleaseData();
if (mData) {
mOutputListener = mData->OnOutput().Connect(
mOwnerThread, this, &DecodedStream::NotifyOutput);
mData->SetPlaying(mPlaying);
SendData();
}
@ -357,6 +375,8 @@ DecodedStream::DestroyData(UniquePtr<DecodedStreamData> aData)
return;
}
mOutputListener.Disconnect();
DecodedStreamData* data = aData.release();
nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([=] () {
delete data;
@ -694,6 +714,13 @@ DecodedStream::GetPosition(TimeStamp* aTimeStamp) const
return mStartTime.ref() + (mData ? mData->GetPosition() : 0);
}
void
DecodedStream::NotifyOutput(int64_t aTime)
{
AssertOwnerThread();
mLastOutputTime = aTime;
}
void
DecodedStream::ConnectListener()
{

View File

@ -72,6 +72,7 @@ private:
void SendAudio(double aVolume, bool aIsSameOrigin, const PrincipalHandle& aPrincipalHandle);
void SendVideo(bool aIsSameOrigin, const PrincipalHandle& aPrincipalHandle);
void SendData();
void NotifyOutput(int64_t aTime);
void AssertOwnerThread() const {
MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
@ -101,6 +102,7 @@ private:
PlaybackParams mParams;
Maybe<int64_t> mStartTime;
int64_t mLastOutputTime = 0; // microseconds
MediaInfo mInfo;
MediaQueue<MediaData>& mAudioQueue;
@ -110,6 +112,7 @@ private:
MediaEventListener mVideoPushListener;
MediaEventListener mAudioFinishListener;
MediaEventListener mVideoFinishListener;
MediaEventListener mOutputListener;
};
} // namespace mozilla