Bug 1343437 - MFR::NotifyError reports non-fatal MediaResult as warning - r?jya draft
authorGerald Squelart <gsquelart@mozilla.com>
Mon, 06 Mar 2017 15:22:43 +1100
changeset 493839 e26ebbbcc0eeac8d48c65744f19bee9d305a60c8
parent 493838 c993a1bef2f97c2f1a51c626bffeb1f3c1e5093a
child 493840 2d217c65842544cfe800c89649fece709ac02458
push id47862
push usergsquelart@mozilla.com
push dateMon, 06 Mar 2017 06:34:07 +0000
reviewersjya
bugs1343437
milestone54.0a1
Bug 1343437 - MFR::NotifyError reports non-fatal MediaResult as warning - r?jya MozReview-Commit-ID: F16oZ2HwyeW
dom/media/MediaFormatReader.cpp
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -1734,18 +1734,35 @@ MediaFormatReader::NotifyNewOutput(
 }
 
 void
 MediaFormatReader::NotifyError(TrackType aTrack, const MediaResult& aError)
 {
   MOZ_ASSERT(OnTaskQueue());
   NS_WARNING(aError.Description().get());
   LOGV("%s Decoding error", TrackTypeToStr(aTrack));
-  auto& decoder = GetDecoderData(aTrack);
-  decoder.mError = decoder.HasFatalError() ? decoder.mError : Some(aError);
+  auto& decoderData = GetDecoderData(aTrack);
+  // If the decoder data already contained a fatal error, don't overwrite it...
+  if (!decoderData.HasFatalError()) {
+    // ... but if there was no fatal error yet, store this latest error.
+    decoderData.mError = Some(aError);
+    if (aError != NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER
+        && !decoderData.HasFatalError()) {
+      // After storing the new error, if it is still not fatal (or just a
+      // request for a new decoder), report it as warning.
+      // (A fatal error will be handled later on.)
+      RefPtr<AbstractMediaDecoder> decoder = mDecoder;
+      mDecoder->AbstractMainThread()->Dispatch(NS_NewRunnableFunction(
+        [decoder, aError] () {
+          if (decoder->GetOwner()) {
+            decoder->GetOwner()->DecodeWarning(aError);
+          }
+        }));
+    }
+  }
   ScheduleUpdate(aTrack);
 }
 
 void
 MediaFormatReader::NotifyWaitingForData(TrackType aTrack)
 {
   MOZ_ASSERT(OnTaskQueue());
   auto& decoder = GetDecoderData(aTrack);