From 9c5368f80dff7a8b11b4eaa63c4968c5735a30d9 Mon Sep 17 00:00:00 2001 From: Gerald Squelart Date: Wed, 23 Sep 2015 00:47:00 +0200 Subject: [PATCH] Bug 1200326 - p5 - Moved fallible code from MP4TrackDemuxer constructor to caller - r=jya In MP4TrackDemuxer constructor, getting the track info and indices could potentially fail, triggering crashing assertions. The fallible work is now done before calling the constructor, and if it fails a nullptr is returned, which is correctly handled in MediaFormatReader. Also reordered some MP4TrackDemuxer members for more natural construction. --- dom/media/fmp4/MP4Demuxer.cpp | 81 +++++++++++++++++++++++++++-------- dom/media/fmp4/MP4Demuxer.h | 46 -------------------- 2 files changed, 63 insertions(+), 64 deletions(-) diff --git a/dom/media/fmp4/MP4Demuxer.cpp b/dom/media/fmp4/MP4Demuxer.cpp index 5272f308695f..62db035aabf0 100644 --- a/dom/media/fmp4/MP4Demuxer.cpp +++ b/dom/media/fmp4/MP4Demuxer.cpp @@ -9,11 +9,11 @@ #include #include "MP4Demuxer.h" -#include "mp4_demuxer/Index.h" #include "mp4_demuxer/MoofParser.h" #include "mp4_demuxer/MP4Metadata.h" #include "mp4_demuxer/ResourceStream.h" #include "mp4_demuxer/BufferStream.h" +#include "mp4_demuxer/Index.h" // Used for telemetry #include "mozilla/Telemetry.h" @@ -30,6 +30,51 @@ PRLogModuleInfo* GetDemuxerLog() { namespace mozilla { +class MP4TrackDemuxer : public MediaTrackDemuxer +{ +public: + MP4TrackDemuxer(MP4Demuxer* aParent, + UniquePtr&& aInfo, + const nsTArray& indices); + + virtual UniquePtr GetInfo() const override; + + virtual nsRefPtr Seek(media::TimeUnit aTime) override; + + virtual nsRefPtr GetSamples(int32_t aNumSamples = 1) override; + + virtual void Reset() override; + + virtual nsresult GetNextRandomAccessPoint(media::TimeUnit* aTime) override; + + nsRefPtr SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold) override; + + virtual media::TimeIntervals GetBuffered() override; + + virtual void BreakCycles() override; + +private: + friend class MP4Demuxer; + void NotifyDataArrived(); + void UpdateSamples(nsTArray>& aSamples); + void EnsureUpToDateIndex(); + void SetNextKeyFrameTime(); + nsRefPtr mParent; + nsRefPtr mStream; + UniquePtr mInfo; + // We do not actually need a monitor, however MoofParser (in mIndex) will + // assert if a monitor isn't held. + Monitor mMonitor; + nsRefPtr mIndex; + UniquePtr mIterator; + Maybe mNextKeyframeTime; + // Queued samples extracted by the demuxer, but not yet returned. + nsRefPtr mQueuedSample; + bool mNeedReIndex; + bool mNeedSPSForTelemetry; +}; + + // Returns true if no SPS was found and search for it should continue. bool AccumulateSPSTelemetry(const MediaByteBuffer* aExtradata) @@ -120,8 +165,15 @@ MP4Demuxer::GetTrackDemuxer(TrackInfo::TrackType aType, uint32_t aTrackNumber) if (mMetadata->GetNumberTracks(aType) <= aTrackNumber) { return nullptr; } - nsRefPtr e = - new MP4TrackDemuxer(this, aType, aTrackNumber); + UniquePtr info = mMetadata->GetTrackInfo(aType, aTrackNumber); + if (!info) { + return nullptr; + } + FallibleTArray indices; + if (!mMetadata->ReadTrackIndex(indices, info->mTrackId)) { + return nullptr; + } + nsRefPtr e = new MP4TrackDemuxer(this, Move(info), indices); mDemuxers.AppendElement(e); return e.forget(); @@ -174,27 +226,20 @@ MP4Demuxer::GetCrypto() } MP4TrackDemuxer::MP4TrackDemuxer(MP4Demuxer* aParent, - TrackInfo::TrackType aType, - uint32_t aTrackNumber) + UniquePtr&& aInfo, + const nsTArray& indices) : mParent(aParent) , mStream(new mp4_demuxer::ResourceStream(mParent->mResource)) - , mNeedReIndex(true) + , mInfo(Move(aInfo)) , mMonitor("MP4TrackDemuxer") -{ - mInfo = mParent->mMetadata->GetTrackInfo(aType, aTrackNumber); - - MOZ_ASSERT(mInfo); - - FallibleTArray indices; - if (!mParent->mMetadata->ReadTrackIndex(indices, mInfo->mTrackId)) { - MOZ_ASSERT(false); - } - mIndex = new mp4_demuxer::Index(indices, + , mIndex(new mp4_demuxer::Index(indices, mStream, mInfo->mTrackId, mInfo->IsAudio(), - &mMonitor); - mIterator = MakeUnique(mIndex); + &mMonitor)) + , mIterator(MakeUnique(mIndex)) + , mNeedReIndex(true) +{ EnsureUpToDateIndex(); // Force update of index // Collect telemetry from h264 AVCC SPS. diff --git a/dom/media/fmp4/MP4Demuxer.h b/dom/media/fmp4/MP4Demuxer.h index 8b8e2e48a35a..295e078adfe4 100644 --- a/dom/media/fmp4/MP4Demuxer.h +++ b/dom/media/fmp4/MP4Demuxer.h @@ -13,7 +13,6 @@ #include "MediaResource.h" namespace mp4_demuxer { -class Index; class MP4Metadata; class ResourceStream; class SampleIterator; @@ -54,51 +53,6 @@ private: nsTArray> mDemuxers; }; -class MP4TrackDemuxer : public MediaTrackDemuxer -{ -public: - MP4TrackDemuxer(MP4Demuxer* aParent, - TrackInfo::TrackType aType, - uint32_t aTrackNumber); - - virtual UniquePtr GetInfo() const override; - - virtual nsRefPtr Seek(media::TimeUnit aTime) override; - - virtual nsRefPtr GetSamples(int32_t aNumSamples = 1) override; - - virtual void Reset() override; - - virtual nsresult GetNextRandomAccessPoint(media::TimeUnit* aTime) override; - - nsRefPtr SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold) override; - - virtual media::TimeIntervals GetBuffered() override; - - virtual void BreakCycles() override; - -private: - friend class MP4Demuxer; - void NotifyDataArrived(); - void UpdateSamples(nsTArray>& aSamples); - void EnsureUpToDateIndex(); - void SetNextKeyFrameTime(); - nsRefPtr mParent; - nsRefPtr mIndex; - UniquePtr mIterator; - UniquePtr mInfo; - nsRefPtr mStream; - Maybe mNextKeyframeTime; - // Queued samples extracted by the demuxer, but not yet returned. - nsRefPtr mQueuedSample; - bool mNeedReIndex; - bool mNeedSPSForTelemetry; - - // We do not actually need a monitor, however MoofParser will assert - // if a monitor isn't held. - Monitor mMonitor; -}; - } // namespace mozilla #endif