Bug 1393399 P5 - report the recovery time telemetry; draft
authorKaku Kuo <kaku@mozilla.com>
Thu, 31 Aug 2017 18:02:06 +0800
changeset 657862 b01e1d9be5b7f80ea285359bdc13937ec5756e03
parent 657861 1a47f98d9f88f399cb1624655dabc6d01a11cfbc
child 729545 3cb833ab7b3b324675b6c7d8a4dc51449776bade
push id77648
push userbmo:kaku@mozilla.com
push dateSat, 02 Sep 2017 06:37:18 +0000
bugs1393399
milestone57.0a1
Bug 1393399 P5 - report the recovery time telemetry; MozReview-Commit-ID: 3Z0Esl1F6fV
dom/media/MediaFormatReader.cpp
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -1801,16 +1801,31 @@ 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);
+
+  // The GPU process had crashed and we receive a
+  // NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER because we were doing HW decoding.
+  // Now, save the related data and we will report the recovery time when a new
+  // decoder is ready.
+  if (aTrack == TrackType::kVideoTrack &&
+      aError == NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER &&
+      !aError.GPUCrashTimeStamp().IsNull()) {
+
+    GPUProcessCrashTelemetryLogger::RecordGPUCrashData(mMediaDecoderOwnerID,
+                                                       &decoder,
+                                                       aError.GPUCrashTimeStamp(),
+                                                       TimeStamp::Now());
+  }
+
   ScheduleUpdate(aTrack);
 }
 
 void
 MediaFormatReader::NotifyWaitingForData(TrackType aTrack)
 {
   MOZ_ASSERT(OnTaskQueue());
   auto& decoder = GetDecoderData(aTrack);
@@ -1994,16 +2009,23 @@ MediaFormatReader::DecodeDemuxedSamples(
   RefPtr<MediaFormatReader> self = this;
   decoder.mFlushed = false;
   decoder.mDecoder->Decode(aSample)
     ->Then(mTaskQueue, __func__,
            [self, this, aTrack, &decoder]
            (const MediaDataDecoder::DecodedData& aResults) {
              decoder.mDecodeRequest.Complete();
              NotifyNewOutput(aTrack, aResults);
+
+             // When we recovered from a GPU crash and get the first decoded
+             // frame, report the recovery time telemetry.
+             if (aTrack == TrackType::kVideoTrack) {
+               GPUProcessCrashTelemetryLogger::ReportTelemetry(
+                 mMediaDecoderOwnerID, &decoder);
+             }
            },
            [self, this, aTrack, &decoder](const MediaResult& aError) {
              decoder.mDecodeRequest.Complete();
              NotifyError(aTrack, aError);
            })
     ->Track(decoder.mDecodeRequest);
 }