diff --git a/dom/media/mediasource/MediaSourceDecoder.cpp b/dom/media/mediasource/MediaSourceDecoder.cpp index 09f8520a731..db788873dd2 100644 --- a/dom/media/mediasource/MediaSourceDecoder.cpp +++ b/dom/media/mediasource/MediaSourceDecoder.cpp @@ -290,6 +290,12 @@ MediaSourceDecoder::PrepareReaderInitialization() mReader->PrepareInitialization(); } +void +MediaSourceDecoder::GetMozDebugReaderData(nsAString& aString) +{ + mReader->GetMozDebugReaderData(aString); +} + #ifdef MOZ_EME nsresult MediaSourceDecoder::SetCDMProxy(CDMProxy* aProxy) diff --git a/dom/media/mediasource/MediaSourceDecoder.h b/dom/media/mediasource/MediaSourceDecoder.h index 6ac68a54c67..2800e7de7ed 100644 --- a/dom/media/mediasource/MediaSourceDecoder.h +++ b/dom/media/mediasource/MediaSourceDecoder.h @@ -79,6 +79,10 @@ public: // reader in this decoders MediaSourceReader. bool IsActiveReader(MediaDecoderReader* aReader); + // Returns a string describing the state of the MediaSource internal + // buffered data. Used for debugging purposes. + void GetMozDebugReaderData(nsAString& aString); + private: void DoSetMediaSourceDuration(double aDuration); void ScheduleDurationChange(double aOldDuration, diff --git a/dom/media/mediasource/MediaSourceReader.cpp b/dom/media/mediasource/MediaSourceReader.cpp index 9b6cff6e8fe..a31dc384a85 100644 --- a/dom/media/mediasource/MediaSourceReader.cpp +++ b/dom/media/mediasource/MediaSourceReader.cpp @@ -13,6 +13,7 @@ #include "MediaSourceUtils.h" #include "SourceBufferDecoder.h" #include "TrackBuffer.h" +#include "nsPrintfCString.h" #ifdef MOZ_FMP4 #include "SharedDecoderManager.h" @@ -968,6 +969,40 @@ MediaSourceReader::SetMediaSourceDuration(double aDuration) mMediaSourceDuration = aDuration; } +void +MediaSourceReader::GetMozDebugReaderData(nsAString& aString) +{ + ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); + nsAutoCString result; + result += nsPrintfCString("Dumping data for reader %p:\n", this); + if (mAudioTrack) { + result += nsPrintfCString("\tDumping Audio Track Decoders: - mLastAudioTime: %f\n", double(mLastAudioTime) / USECS_PER_S); + for (int32_t i = mAudioTrack->Decoders().Length() - 1; i >= 0; --i) { + nsRefPtr newReader = mAudioTrack->Decoders()[i]->GetReader(); + + nsRefPtr ranges = new dom::TimeRanges(); + mAudioTrack->Decoders()[i]->GetBuffered(ranges); + result += nsPrintfCString("\t\tReader %d: %p ranges=%s active=%s\n", + i, newReader.get(), DumpTimeRanges(ranges).get(), + newReader.get() == mAudioReader.get() ? "true" : "false"); + } + } + + if (mVideoTrack) { + result += nsPrintfCString("\tDumping Video Track Decoders - mLastVideoTime: %f\n", double(mLastVideoTime) / USECS_PER_S); + for (int32_t i = mVideoTrack->Decoders().Length() - 1; i >= 0; --i) { + nsRefPtr newReader = mVideoTrack->Decoders()[i]->GetReader(); + + nsRefPtr ranges = new dom::TimeRanges(); + mVideoTrack->Decoders()[i]->GetBuffered(ranges); + result += nsPrintfCString("\t\tReader %d: %p ranges=%s active=%s\n", + i, newReader.get(), DumpTimeRanges(ranges).get(), + newReader.get() == mVideoReader.get() ? "true" : "false"); + } + } + aString += NS_ConvertUTF8toUTF16(result); +} + #ifdef MOZ_EME nsresult MediaSourceReader::SetCDMProxy(CDMProxy* aProxy) diff --git a/dom/media/mediasource/MediaSourceReader.h b/dom/media/mediasource/MediaSourceReader.h index 8d547af9194..c699554be38 100644 --- a/dom/media/mediasource/MediaSourceReader.h +++ b/dom/media/mediasource/MediaSourceReader.h @@ -146,6 +146,10 @@ public: // Returns true if aReader is a currently active audio or video bool IsActiveReader(MediaDecoderReader* aReader); + // Returns a string describing the state of the MediaSource internal + // buffered data. Used for debugging purposes. + void GetMozDebugReaderData(nsAString& aString); + private: // Switch the current audio/video reader to the reader that // contains aTarget (or up to aError after target). Both