Bug 1454630 - P1. Simplify retrieval of current TrackInfo. r?bryce draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Sat, 26 May 2018 21:21:45 +0200
changeset 800368 232cc8ccc04486b2a8b9f0bbdb12b6719ac430e7
parent 799732 005f72e96205c7fc7e0673b2a7c35f58d20c8ff3
child 800369 0dcfafbcf5cebb310f47a60e9cadaff8194deb6c
child 800554 3921cd4b0d05484247b19341b5eeb13e7a073e7f
push id111328
push userbmo:jyavenard@mozilla.com
push dateSun, 27 May 2018 16:43:13 +0000
reviewersbryce
bugs1454630
milestone62.0a1
Bug 1454630 - P1. Simplify retrieval of current TrackInfo. r?bryce Adding some documentation to clarify on the difference between mInfo and mOriginalInfo MozReview-Commit-ID: DWBsoi16QKf
dom/media/MediaFormatReader.cpp
dom/media/MediaFormatReader.h
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -814,35 +814,32 @@ MediaFormatReader::DecoderFactory::DoCre
   // initialized to a fatal error by default.
   MediaResult result = MediaResult(
     NS_ERROR_DOM_MEDIA_FATAL_ERR,
     nsPrintfCString("error creating %s decoder", TrackTypeToStr(aData.mTrack)));
 
   switch (aData.mTrack) {
     case TrackInfo::kAudioTrack: {
       aData.mDecoder = mOwner->mPlatform->CreateDecoder({
-        ownerData.mInfo
-        ? *ownerData.mInfo->GetAsAudioInfo()
-        : *ownerData.mOriginalInfo->GetAsAudioInfo(),
+        *ownerData.GetCurrentInfo()->GetAsAudioInfo(),
         ownerData.mTaskQueue,
         mOwner->mCrashHelper,
         CreateDecoderParams::UseNullDecoder(ownerData.mIsNullDecode),
         &result,
         TrackInfo::kAudioTrack,
         &mOwner->OnTrackWaitingForKeyProducer()
       });
       break;
     }
 
     case TrackType::kVideoTrack: {
       // Decoders use the layers backend to decide if they can use hardware decoding,
       // so specify LAYERS_NONE if we want to forcibly disable it.
       aData.mDecoder = mOwner->mPlatform->CreateDecoder(
-        { ownerData.mInfo ? *ownerData.mInfo->GetAsVideoInfo()
-                          : *ownerData.mOriginalInfo->GetAsVideoInfo(),
+        { *ownerData.GetCurrentInfo()->GetAsVideoInfo(),
           ownerData.mTaskQueue,
           mOwner->mKnowsCompositor,
           mOwner->GetImageContainer(),
           mOwner->mCrashHelper,
           CreateDecoderParams::UseNullDecoder(ownerData.mIsNullDecode),
           &result,
           TrackType::kVideoTrack,
           &mOwner->OnTrackWaitingForKeyProducer(),
@@ -3512,39 +3509,43 @@ void
 MediaFormatReader::GetMozDebugReaderData(nsACString& aString)
 {
   nsCString result;
   nsAutoCString audioDecoderName("unavailable");
   nsAutoCString videoDecoderName = audioDecoderName;
   nsAutoCString audioType("none");
   nsAutoCString videoType("none");
 
-  if (HasAudio()) {
+  AudioInfo audioInfo = mAudio.GetCurrentInfo()
+                          ? *mAudio.GetCurrentInfo()->GetAsAudioInfo()
+                          : AudioInfo();
+  if (HasAudio())
+  {
     MutexAutoLock lock(mAudio.mMutex);
     audioDecoderName = mAudio.mDecoder
                        ? mAudio.mDecoder->GetDescriptionName()
                        : mAudio.mDescription;
-    audioType = mAudio.mInfo ? mAudio.mInfo->mMimeType : mInfo.mAudio.mMimeType;
+    audioType = audioInfo.mMimeType;
   }
+  VideoInfo videoInfo = mVideo.GetCurrentInfo()
+                          ? *mVideo.GetCurrentInfo()->GetAsVideoInfo()
+                          : VideoInfo();
   if (HasVideo()) {
     MutexAutoLock mon(mVideo.mMutex);
     videoDecoderName = mVideo.mDecoder
                        ? mVideo.mDecoder->GetDescriptionName()
                        : mVideo.mDescription;
-    videoType = mVideo.mInfo ? mVideo.mInfo->mMimeType : mInfo.mVideo.mMimeType;
+    videoType = videoInfo.mMimeType;
   }
 
   result +=
     nsPrintfCString("Audio Decoder(%s, %u channels @ %0.1fkHz): %s\n",
                     audioType.get(),
-                    mAudio.mInfo ? mAudio.mInfo->GetAsAudioInfo()->mChannels
-                                 : mInfo.mAudio.mChannels,
-                    (mAudio.mInfo ? mAudio.mInfo->GetAsAudioInfo()->mRate
-                                  : mInfo.mAudio.mRate) /
-                      1000.0f,
+                    audioInfo.mChannels,
+                    audioInfo.mRate / 1000.0f,
                     audioDecoderName.get());
   result += nsPrintfCString("Audio Frames Decoded: %" PRIu64 "\n",
                             mAudio.mNumSamplesOutputTotal);
   if (HasAudio()) {
     result += nsPrintfCString(
       "Audio State: ni=%d no=%d wp=%d demuxr=%d demuxq=%u decoder=%d tt=%.1f "
       "tths=%d in=%" PRIu64 " out=%" PRIu64
       " qs=%u pending=%u wfd=%d eos=%d ds=%d wfk=%d sid=%u\n",
@@ -3563,22 +3564,16 @@ MediaFormatReader::GetMozDebugReaderData
       unsigned(mAudio.mOutput.Length()),
       mAudio.mWaitingForData,
       mAudio.mDemuxEOS,
       int32_t(mAudio.mDrainState),
       mAudio.mWaitingForKey,
       mAudio.mLastStreamSourceID);
   }
 
-  VideoInfo videoInfo = mVideo.mInfo
-                        ? *mVideo.mInfo->GetAsVideoInfo()
-                        : mVideo.mOriginalInfo
-                          ? *mVideo.mOriginalInfo->GetAsVideoInfo()
-                          : VideoInfo();
-
   result += nsPrintfCString(
     "Video Decoder(%s, %dx%d @ %0.2f): %s\n",
     videoType.get(),
     videoInfo.mDisplay.width < 0 ? 0 : videoInfo.mDisplay.width,
     videoInfo.mDisplay.height < 0 ? 0 : videoInfo.mDisplay.height,
     mVideo.mMeanRate.Mean(),
     videoDecoderName.get());
 
--- a/dom/media/MediaFormatReader.h
+++ b/dom/media/MediaFormatReader.h
@@ -571,16 +571,28 @@ private:
       }
     }
 
     bool HasInternalSeekPending() const
     {
       return mTimeThreshold && !mTimeThreshold.ref().mHasSeeked;
     }
 
+    // Return the current TrackInfo in the stream. If the stream content never
+    // changed since AsyncReadMetadata was called then the TrackInfo used is
+    // mOriginalInfo, other it will be mInfo. The later case is only ever true
+    // with MSE or the WebMDemuxer.
+    const TrackInfo* GetCurrentInfo() const
+    {
+      if (mInfo) {
+        return *mInfo;
+      }
+      return mOriginalInfo.get();
+    }
+
     // Used by the MDSM for logging purposes.
     Atomic<size_t> mSizeOfQueue;
     // Used by the MDSM to determine if video decoding is hardware accelerated.
     // This value is updated after a frame is successfully decoded.
     Atomic<bool> mIsHardwareAccelerated;
     // Sample format monitoring.
     uint32_t mLastStreamSourceID;
     Maybe<uint32_t> mNextStreamSourceID;