Bug 1393399 P5 - report the recovery time telemetry;
MozReview-Commit-ID: 3Z0Esl1F6fV
--- 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);
}