mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-26 03:35:33 +00:00
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:
parent
6b3b767bd2
commit
b903738272
@ -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()
|
||||
{
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user