From 5f8de423f190bbb79a62f804151bc24824fa32d8 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Fri, 2 Feb 2018 04:16:08 -0500 Subject: Add m-esr52 at 52.6.0 --- dom/media/mediasource/MediaSourceDemuxer.h | 145 +++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 dom/media/mediasource/MediaSourceDemuxer.h (limited to 'dom/media/mediasource/MediaSourceDemuxer.h') diff --git a/dom/media/mediasource/MediaSourceDemuxer.h b/dom/media/mediasource/MediaSourceDemuxer.h new file mode 100644 index 000000000..02c91e3bc --- /dev/null +++ b/dom/media/mediasource/MediaSourceDemuxer.h @@ -0,0 +1,145 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et cindent: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#if !defined(MediaSourceDemuxer_h_) +#define MediaSourceDemuxer_h_ + +#include "mozilla/Atomics.h" +#include "mozilla/Maybe.h" +#include "mozilla/Monitor.h" +#include "AutoTaskQueue.h" + +#include "MediaDataDemuxer.h" +#include "MediaDecoderReader.h" +#include "MediaResource.h" +#include "MediaSource.h" +#include "TrackBuffersManager.h" + +namespace mozilla { + +class MediaResult; +class MediaSourceTrackDemuxer; + +class MediaSourceDemuxer : public MediaDataDemuxer +{ +public: + explicit MediaSourceDemuxer(); + + RefPtr Init() override; + + bool HasTrackType(TrackInfo::TrackType aType) const override; + + uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override; + + already_AddRefed GetTrackDemuxer(TrackInfo::TrackType aType, + uint32_t aTrackNumber) override; + + bool IsSeekable() const override; + + UniquePtr GetCrypto() override; + + bool ShouldComputeStartTime() const override { return false; } + + void NotifyDataArrived() override; + + /* interface for TrackBuffersManager */ + void AttachSourceBuffer(TrackBuffersManager* aSourceBuffer); + void DetachSourceBuffer(TrackBuffersManager* aSourceBuffer); + AutoTaskQueue* GetTaskQueue() { return mTaskQueue; } + + // Returns a string describing the state of the MediaSource internal + // buffered data. Used for debugging purposes. + void GetMozDebugReaderData(nsAString& aString); + + void AddSizeOfResources(MediaSourceDecoder::ResourceSizes* aSizes); + + // Gap allowed between frames. + static const media::TimeUnit EOS_FUZZ; + +private: + ~MediaSourceDemuxer(); + friend class MediaSourceTrackDemuxer; + // Scan source buffers and update information. + bool ScanSourceBuffersForContent(); + RefPtr AttemptInit(); + TrackBuffersManager* GetManager(TrackInfo::TrackType aType); + TrackInfo* GetTrackInfo(TrackInfo::TrackType); + void DoAttachSourceBuffer(TrackBuffersManager* aSourceBuffer); + void DoDetachSourceBuffer(TrackBuffersManager* aSourceBuffer); + bool OnTaskQueue() + { + return !GetTaskQueue() || GetTaskQueue()->IsCurrentThreadIn(); + } + + RefPtr mTaskQueue; + nsTArray> mDemuxers; + + nsTArray> mSourceBuffers; + + MozPromiseHolder mInitPromise; + + // Monitor to protect members below across multiple threads. + mutable Monitor mMonitor; + RefPtr mAudioTrack; + RefPtr mVideoTrack; + MediaInfo mInfo; +}; + +class MediaSourceTrackDemuxer : public MediaTrackDemuxer +{ +public: + MediaSourceTrackDemuxer(MediaSourceDemuxer* aParent, + TrackInfo::TrackType aType, + TrackBuffersManager* aManager); + + UniquePtr GetInfo() const override; + + RefPtr Seek(media::TimeUnit aTime) override; + + RefPtr GetSamples(int32_t aNumSamples = 1) override; + + void Reset() override; + + nsresult GetNextRandomAccessPoint(media::TimeUnit* aTime) override; + + RefPtr SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold) override; + + media::TimeIntervals GetBuffered() override; + + void BreakCycles() override; + + bool GetSamplesMayBlock() const override + { + return false; + } + +private: + RefPtr DoSeek(media::TimeUnit aTime); + RefPtr DoGetSamples(int32_t aNumSamples); + RefPtr DoSkipToNextRandomAccessPoint(media::TimeUnit aTimeThreadshold); + already_AddRefed GetSample(MediaResult& aError); + // Return the timestamp of the next keyframe after mLastSampleIndex. + media::TimeUnit GetNextRandomAccessPoint(); + + RefPtr mParent; + RefPtr mManager; + TrackInfo::TrackType mType; + // Monitor protecting members below accessed from multiple threads. + Monitor mMonitor; + media::TimeUnit mNextRandomAccessPoint; + Maybe> mNextSample; + // Set to true following a reset. Ensure that the next sample demuxed + // is available at position 0. + bool mReset; + + // Amount of pre-roll time when seeking. + // Set to 80ms if track is Opus. + const media::TimeUnit mPreRoll; +}; + +} // namespace mozilla + +#endif -- cgit v1.2.3