Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim:set ts=2 sw=2 sts=2 et cindent: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #if !defined(MediaSourceDemuxer_h_)
8 : #define MediaSourceDemuxer_h_
9 :
10 : #include "mozilla/Atomics.h"
11 : #include "mozilla/Maybe.h"
12 : #include "mozilla/Monitor.h"
13 : #include "AutoTaskQueue.h"
14 :
15 : #include "MediaDataDemuxer.h"
16 : #include "MediaDecoderReader.h"
17 : #include "MediaResource.h"
18 : #include "MediaSource.h"
19 : #include "TrackBuffersManager.h"
20 :
21 : namespace mozilla {
22 :
23 : class AbstractThread;
24 : class MediaResult;
25 : class MediaSourceTrackDemuxer;
26 :
27 : class MediaSourceDemuxer : public MediaDataDemuxer
28 : {
29 : public:
30 : explicit MediaSourceDemuxer(AbstractThread* aAbstractMainThread);
31 :
32 : RefPtr<InitPromise> Init() override;
33 :
34 : bool HasTrackType(TrackInfo::TrackType aType) const override;
35 :
36 : uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override;
37 :
38 : already_AddRefed<MediaTrackDemuxer>
39 : GetTrackDemuxer(TrackInfo::TrackType aType, uint32_t aTrackNumber) override;
40 :
41 : bool IsSeekable() const override;
42 :
43 : UniquePtr<EncryptionInfo> GetCrypto() override;
44 :
45 0 : bool ShouldComputeStartTime() const override { return false; }
46 :
47 : /* interface for TrackBuffersManager */
48 : void AttachSourceBuffer(TrackBuffersManager* aSourceBuffer);
49 : void DetachSourceBuffer(TrackBuffersManager* aSourceBuffer);
50 0 : AutoTaskQueue* GetTaskQueue() { return mTaskQueue; }
51 : void NotifyInitDataArrived();
52 :
53 : // Returns a string describing the state of the MediaSource internal
54 : // buffered data. Used for debugging purposes.
55 : void GetMozDebugReaderData(nsACString& aString);
56 :
57 : void AddSizeOfResources(MediaSourceDecoder::ResourceSizes* aSizes);
58 :
59 : // Gap allowed between frames.
60 : // Due to inaccuracies in determining buffer end
61 : // frames (Bug 1065207). This value is based on videos seen in the wild.
62 : static constexpr media::TimeUnit EOS_FUZZ =
63 : media::TimeUnit::FromMicroseconds(500000);
64 :
65 : private:
66 : ~MediaSourceDemuxer();
67 : friend class MediaSourceTrackDemuxer;
68 : // Scan source buffers and update information.
69 : bool ScanSourceBuffersForContent();
70 : TrackBuffersManager* GetManager(TrackInfo::TrackType aType);
71 : TrackInfo* GetTrackInfo(TrackInfo::TrackType);
72 : void DoAttachSourceBuffer(TrackBuffersManager* aSourceBuffer);
73 : void DoDetachSourceBuffer(TrackBuffersManager* aSourceBuffer);
74 0 : bool OnTaskQueue()
75 : {
76 0 : return !GetTaskQueue() || GetTaskQueue()->IsCurrentThreadIn();
77 : }
78 :
79 : RefPtr<AutoTaskQueue> mTaskQueue;
80 : nsTArray<RefPtr<MediaSourceTrackDemuxer>> mDemuxers;
81 :
82 : nsTArray<RefPtr<TrackBuffersManager>> mSourceBuffers;
83 :
84 : MozPromiseHolder<InitPromise> mInitPromise;
85 :
86 : // Monitor to protect members below across multiple threads.
87 : mutable Monitor mMonitor;
88 : RefPtr<TrackBuffersManager> mAudioTrack;
89 : RefPtr<TrackBuffersManager> mVideoTrack;
90 : MediaInfo mInfo;
91 : };
92 :
93 0 : class MediaSourceTrackDemuxer : public MediaTrackDemuxer
94 : {
95 : public:
96 : MediaSourceTrackDemuxer(MediaSourceDemuxer* aParent,
97 : TrackInfo::TrackType aType,
98 : TrackBuffersManager* aManager);
99 :
100 : UniquePtr<TrackInfo> GetInfo() const override;
101 :
102 : RefPtr<SeekPromise> Seek(const media::TimeUnit& aTime) override;
103 :
104 : RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) override;
105 :
106 : void Reset() override;
107 :
108 : nsresult GetNextRandomAccessPoint(media::TimeUnit* aTime) override;
109 :
110 : RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint(
111 : const media::TimeUnit& aTimeThreshold) override;
112 :
113 : media::TimeIntervals GetBuffered() override;
114 :
115 : void BreakCycles() override;
116 :
117 0 : bool GetSamplesMayBlock() const override
118 : {
119 0 : return false;
120 : }
121 :
122 : private:
123 : RefPtr<SeekPromise> DoSeek(const media::TimeUnit& aTime);
124 : RefPtr<SamplesPromise> DoGetSamples(int32_t aNumSamples);
125 : RefPtr<SkipAccessPointPromise> DoSkipToNextRandomAccessPoint(
126 : const media::TimeUnit& aTimeThreadshold);
127 : already_AddRefed<MediaRawData> GetSample(MediaResult& aError);
128 : // Return the timestamp of the next keyframe after mLastSampleIndex.
129 : media::TimeUnit GetNextRandomAccessPoint();
130 :
131 : RefPtr<MediaSourceDemuxer> mParent;
132 : RefPtr<TrackBuffersManager> mManager;
133 : TrackInfo::TrackType mType;
134 : // Monitor protecting members below accessed from multiple threads.
135 : Monitor mMonitor;
136 : media::TimeUnit mNextRandomAccessPoint;
137 : Maybe<RefPtr<MediaRawData>> mNextSample;
138 : // Set to true following a reset. Ensure that the next sample demuxed
139 : // is available at position 0.
140 : bool mReset;
141 :
142 : // Amount of pre-roll time when seeking.
143 : // Set to 80ms if track is Opus.
144 : const media::TimeUnit mPreRoll;
145 : };
146 :
147 : } // namespace mozilla
148 :
149 : #endif
|