Bug 1380234. P2 - send compositor updates to the reader directly without using MediaEventSource.
MozReview-Commit-ID: EJO2PK525gS
--- a/dom/media/MediaDecoder.cpp
+++ b/dom/media/MediaDecoder.cpp
@@ -1070,17 +1070,24 @@ MediaDecoder::GetCompositor()
return knows.forget();
}
void
MediaDecoder::NotifyCompositor()
{
RefPtr<KnowsCompositor> knowsCompositor = GetCompositor();
if (knowsCompositor) {
- mCompositorUpdatedEvent.Notify(knowsCompositor);
+ nsCOMPtr<nsIRunnable> r =
+ NewRunnableMethod<already_AddRefed<KnowsCompositor>&&>(
+ "MediaDecoderReader::UpdateCompositor",
+ mReader,
+ &MediaDecoderReader::UpdateCompositor,
+ knowsCompositor.forget());
+ mReader->OwnerThread()->Dispatch(r.forget(),
+ AbstractThread::DontAssertDispatchSuccess);
}
}
void
MediaDecoder::SetElementVisibility(bool aIsDocumentVisible,
Visibility aElementVisibility,
bool aIsElementInTree)
{
--- a/dom/media/MediaDecoderReader.h
+++ b/dom/media/MediaDecoderReader.h
@@ -130,16 +130,18 @@ public:
virtual bool OnTaskQueue() const
{
return OwnerThread()->IsCurrentThreadIn();
}
void UpdateDuration(const media::TimeUnit& aDuration);
+ virtual void UpdateCompositor(already_AddRefed<layers::KnowsCompositor>) {}
+
// Resets all state related to decoding, emptying all buffers etc.
// Cancels all pending Request*Data() request callbacks, rejects any
// outstanding seek promises, and flushes the decode pipeline. The
// decoder must not call any of the callbacks for outstanding
// Request*Data() calls after this is called. Calls to Request*Data()
// made after this should be processed as usual.
//
// Normally this call preceedes a Seek() call, or shutdown.
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -1110,22 +1110,16 @@ MediaFormatReader::MediaFormatReader(Med
, mTrackDemuxersMayBlock(false)
, mSeekScheduled(false)
, mVideoFrameContainer(aInit.mVideoFrameContainer)
, mDecoderFactory(new DecoderFactory(this))
, mShutdownPromisePool(new ShutdownPromisePool())
{
MOZ_ASSERT(aDemuxer);
MOZ_COUNT_CTOR(MediaFormatReader);
-
- AbstractMediaDecoder* decoder = aInit.mDecoder;
- if (decoder && decoder->CompositorUpdatedEvent()) {
- mCompositorUpdatedListener = decoder->CompositorUpdatedEvent()->Connect(
- mTaskQueue, this, &MediaFormatReader::NotifyCompositorUpdated);
- }
mOnTrackWaitingForKeyListener = OnTrackWaitingForKey().Connect(
mTaskQueue, this, &MediaFormatReader::NotifyWaitingForKey);
}
MediaFormatReader::~MediaFormatReader()
{
MOZ_COUNT_DTOR(MediaFormatReader);
}
@@ -3113,16 +3107,24 @@ MediaFormatReader::GetMozDebugReaderData
void
MediaFormatReader::SetVideoNullDecode(bool aIsNullDecode)
{
MOZ_ASSERT(OnTaskQueue());
return SetNullDecode(TrackType::kVideoTrack, aIsNullDecode);
}
void
+MediaFormatReader::UpdateCompositor(
+ already_AddRefed<layers::KnowsCompositor> aCompositor)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ mKnowsCompositor = aCompositor;
+}
+
+void
MediaFormatReader::SetNullDecode(TrackType aTrack, bool aIsNullDecode)
{
MOZ_ASSERT(OnTaskQueue());
auto& decoder = GetDecoderData(aTrack);
if (decoder.mIsNullDecode == aIsNullDecode) {
return;
}
--- a/dom/media/MediaFormatReader.h
+++ b/dom/media/MediaFormatReader.h
@@ -74,16 +74,18 @@ public:
void SetCDMProxy(CDMProxy* aProxy) override;
// Returns a string describing the state of the decoder data.
// Used for debugging purposes.
void GetMozDebugReaderData(nsACString& aString);
void SetVideoNullDecode(bool aIsNullDecode) override;
+ void UpdateCompositor(already_AddRefed<layers::KnowsCompositor>) override;
+
private:
nsresult InitInternal() override;
bool HasVideo() const { return mVideo.mTrackDemuxer; }
bool HasAudio() const { return mAudio.mTrackDemuxer; }
bool IsWaitingOnCDMResource();
@@ -515,21 +517,16 @@ private:
void ScheduleSeek();
void AttemptSeek();
void OnSeekFailed(TrackType aTrack, const MediaResult& aError);
void DoVideoSeek();
void OnVideoSeekCompleted(media::TimeUnit aTime);
void OnVideoSeekFailed(const MediaResult& aError);
bool mSeekScheduled;
- void NotifyCompositorUpdated(RefPtr<layers::KnowsCompositor> aKnowsCompositor)
- {
- mKnowsCompositor = aKnowsCompositor.forget();
- }
-
void DoAudioSeek();
void OnAudioSeekCompleted(media::TimeUnit aTime);
void OnAudioSeekFailed(const MediaResult& aError);
// The SeekTarget that was last given to Seek()
SeekTarget mOriginalSeekTarget;
// Temporary seek information while we wait for the data
Maybe<media::TimeUnit> mFallbackSeekTime;
Maybe<media::TimeUnit> mPendingSeekTime;