From 5c4906180c7c929aeea1b1209bf97bd6c3a5df93 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Wed, 15 Jul 2015 19:02:12 +1000 Subject: [PATCH] Bug 1184002: Add about:media plugin support with new MSE. r=cpearce --- dom/media/mediasource/MediaSourceDecoder.cpp | 1 + dom/media/mediasource/MediaSourceDemuxer.cpp | 36 +++++++++++++++++++ dom/media/mediasource/MediaSourceDemuxer.h | 4 +++ dom/media/mediasource/TrackBuffersManager.cpp | 9 +++++ dom/media/mediasource/TrackBuffersManager.h | 3 ++ 5 files changed, 53 insertions(+) diff --git a/dom/media/mediasource/MediaSourceDecoder.cpp b/dom/media/mediasource/MediaSourceDecoder.cpp index 5e87d3415e83..a8a813753694 100644 --- a/dom/media/mediasource/MediaSourceDecoder.cpp +++ b/dom/media/mediasource/MediaSourceDecoder.cpp @@ -293,6 +293,7 @@ void MediaSourceDecoder::GetMozDebugReaderData(nsAString& aString) { if (mIsUsingFormatReader) { + mDemuxer->GetMozDebugReaderData(aString); return; } GetReader()->GetMozDebugReaderData(aString); diff --git a/dom/media/mediasource/MediaSourceDemuxer.cpp b/dom/media/mediasource/MediaSourceDemuxer.cpp index 47a632d7885d..9f7fd9905643 100644 --- a/dom/media/mediasource/MediaSourceDemuxer.cpp +++ b/dom/media/mediasource/MediaSourceDemuxer.cpp @@ -10,6 +10,7 @@ #include "MediaSourceDemuxer.h" #include "SourceBufferList.h" +#include "nsPrintfCString.h" namespace mozilla { @@ -224,6 +225,41 @@ MediaSourceDemuxer::~MediaSourceDemuxer() mTaskQueue = nullptr; } +void +MediaSourceDemuxer::GetMozDebugReaderData(nsAString& aString) +{ + MonitorAutoLock mon(mMonitor); + nsAutoCString result; + result += nsPrintfCString("Dumping data for demuxer %p:\n", this); + if (mAudioTrack) { + result += nsPrintfCString("\tDumping Audio Track Buffer(%s): - mLastAudioTime: %f\n" + "\t\tNumSamples:%u Size:%u NextGetSampleIndex:%u NextInsertionIndex:%d\n", + mAudioTrack->mAudioTracks.mInfo->mMimeType.get(), + mAudioTrack->mAudioTracks.mNextSampleTime.ToSeconds(), + mAudioTrack->mAudioTracks.mBuffers[0].Length(), + mAudioTrack->mAudioTracks.mSizeBuffer, + mAudioTrack->mAudioTracks.mNextGetSampleIndex.valueOr(-1), + mAudioTrack->mAudioTracks.mNextInsertionIndex.valueOr(-1)); + + result += nsPrintfCString("\t\tBuffered: ranges=%s\n", + DumpTimeRanges(mAudioTrack->SafeBuffered(TrackInfo::kAudioTrack)).get()); + } + if (mVideoTrack) { + result += nsPrintfCString("\tDumping Video Track Buffer(%s) - mLastVideoTime: %f\n" + "\t\tNumSamples:%u Size:%u NextGetSampleIndex:%u NextInsertionIndex:%d\n", + mVideoTrack->mVideoTracks.mInfo->mMimeType.get(), + mVideoTrack->mVideoTracks.mNextSampleTime.ToSeconds(), + mVideoTrack->mVideoTracks.mBuffers[0].Length(), + mVideoTrack->mVideoTracks.mSizeBuffer, + mVideoTrack->mVideoTracks.mNextGetSampleIndex.valueOr(-1), + mVideoTrack->mVideoTracks.mNextInsertionIndex.valueOr(-1)); + + result += nsPrintfCString("\t\tBuffered: ranges=%s\n", + DumpTimeRanges(mVideoTrack->SafeBuffered(TrackInfo::kVideoTrack)).get()); + } + aString += NS_ConvertUTF8toUTF16(result); +} + MediaSourceTrackDemuxer::MediaSourceTrackDemuxer(MediaSourceDemuxer* aParent, TrackInfo::TrackType aType, TrackBuffersManager* aManager) diff --git a/dom/media/mediasource/MediaSourceDemuxer.h b/dom/media/mediasource/MediaSourceDemuxer.h index 9c9a8c12597b..61f0651f49ba 100644 --- a/dom/media/mediasource/MediaSourceDemuxer.h +++ b/dom/media/mediasource/MediaSourceDemuxer.h @@ -55,6 +55,10 @@ public: MediaTaskQueue* GetTaskQueue() { return mTaskQueue; } void NotifyTimeRangesChanged(); + // Returns a string describing the state of the MediaSource internal + // buffered data. Used for debugging purposes. + void GetMozDebugReaderData(nsAString& aString); + private: ~MediaSourceDemuxer(); friend class MediaSourceTrackDemuxer; diff --git a/dom/media/mediasource/TrackBuffersManager.cpp b/dom/media/mediasource/TrackBuffersManager.cpp index 87bf244af692..abf0e5802afd 100644 --- a/dom/media/mediasource/TrackBuffersManager.cpp +++ b/dom/media/mediasource/TrackBuffersManager.cpp @@ -1713,6 +1713,15 @@ TrackBuffersManager::Buffered(TrackInfo::TrackType aTrack) return GetTracksData(aTrack).mBufferedRanges; } +TimeIntervals +TrackBuffersManager::SafeBuffered(TrackInfo::TrackType aTrack) const +{ + MonitorAutoLock mon(mMonitor); + return aTrack == TrackInfo::kVideoTrack + ? mVideoBufferedRanges + : mAudioBufferedRanges; +} + const TrackBuffersManager::TrackBuffer& TrackBuffersManager::GetTrackBuffer(TrackInfo::TrackType aTrack) { diff --git a/dom/media/mediasource/TrackBuffersManager.h b/dom/media/mediasource/TrackBuffersManager.h index 876f7ad1edf9..22f0feba69bb 100644 --- a/dom/media/mediasource/TrackBuffersManager.h +++ b/dom/media/mediasource/TrackBuffersManager.h @@ -77,6 +77,7 @@ public: MediaInfo GetMetadata(); const TrackBuffer& GetTrackBuffer(TrackInfo::TrackType aTrack); const TimeIntervals& Buffered(TrackInfo::TrackType); + TimeIntervals SafeBuffered(TrackInfo::TrackType) const; bool IsEnded() const { return mEnded; @@ -95,6 +96,8 @@ public: #endif private: + // for MediaSourceDemuxer::GetMozDebugReaderData + friend class MediaSourceDemuxer; virtual ~TrackBuffersManager(); // All following functions run on the taskqueue. nsRefPtr InitSegmentParserLoop();