Bug 1380234. P2 - send compositor updates to the reader directly without using MediaEventSource. draft
authorJW Wang <jwwang@mozilla.com>
Wed, 12 Jul 2017 16:28:19 +0800
changeset 608708 9eb248ad193ebebfd9a9da5d62a0d384be7b7483
parent 608707 f040d592211f19987fbde9bcf692cfc59426d78b
child 608709 567f3b3075503c572f35f6053208687c384c5219
push id68379
push userjwwang@mozilla.com
push dateFri, 14 Jul 2017 02:37:00 +0000
bugs1380234
milestone56.0a1
Bug 1380234. P2 - send compositor updates to the reader directly without using MediaEventSource. MozReview-Commit-ID: EJO2PK525gS
dom/media/MediaDecoder.cpp
dom/media/MediaDecoderReader.h
dom/media/MediaFormatReader.cpp
dom/media/MediaFormatReader.h
--- 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;