/src/mozilla-central/dom/media/mediasource/MediaSourceDemuxer.h
Line | Count | Source (jump to first uncovered line) |
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 "MediaDataDemuxer.h" |
11 | | #include "MediaResource.h" |
12 | | #include "MediaSource.h" |
13 | | #include "TrackBuffersManager.h" |
14 | | #include "mozilla/Atomics.h" |
15 | | #include "mozilla/Maybe.h" |
16 | | #include "mozilla/Monitor.h" |
17 | | #include "mozilla/TaskQueue.h" |
18 | | |
19 | | |
20 | | namespace mozilla { |
21 | | |
22 | | class AbstractThread; |
23 | | class MediaResult; |
24 | | class MediaSourceTrackDemuxer; |
25 | | |
26 | | DDLoggedTypeDeclNameAndBase(MediaSourceDemuxer, MediaDataDemuxer); |
27 | | DDLoggedTypeNameAndBase(MediaSourceTrackDemuxer, MediaTrackDemuxer); |
28 | | |
29 | | class MediaSourceDemuxer |
30 | | : public MediaDataDemuxer |
31 | | , public DecoderDoctorLifeLogger<MediaSourceDemuxer> |
32 | | { |
33 | | public: |
34 | | explicit MediaSourceDemuxer(AbstractThread* aAbstractMainThread); |
35 | | |
36 | | RefPtr<InitPromise> Init() override; |
37 | | |
38 | | uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override; |
39 | | |
40 | | already_AddRefed<MediaTrackDemuxer> |
41 | | GetTrackDemuxer(TrackInfo::TrackType aType, uint32_t aTrackNumber) override; |
42 | | |
43 | | bool IsSeekable() const override; |
44 | | |
45 | | UniquePtr<EncryptionInfo> GetCrypto() override; |
46 | | |
47 | 0 | bool ShouldComputeStartTime() const override { return false; } |
48 | | |
49 | | /* interface for TrackBuffersManager */ |
50 | | void AttachSourceBuffer(RefPtr<TrackBuffersManager>& aSourceBuffer); |
51 | | void DetachSourceBuffer(RefPtr<TrackBuffersManager>& aSourceBuffer); |
52 | 0 | TaskQueue* GetTaskQueue() { return mTaskQueue; } |
53 | | void NotifyInitDataArrived(); |
54 | | |
55 | | // Returns a string describing the state of the MediaSource internal |
56 | | // buffered data. Used for debugging purposes. |
57 | | void GetMozDebugReaderData(nsACString& aString); |
58 | | |
59 | | void AddSizeOfResources(MediaSourceDecoder::ResourceSizes* aSizes); |
60 | | |
61 | | // Gap allowed between frames. |
62 | | // Due to inaccuracies in determining buffer end |
63 | | // frames (Bug 1065207). This value is based on videos seen in the wild. |
64 | | static constexpr media::TimeUnit EOS_FUZZ = |
65 | | media::TimeUnit::FromMicroseconds(500000); |
66 | | |
67 | | private: |
68 | | ~MediaSourceDemuxer(); |
69 | | friend class MediaSourceTrackDemuxer; |
70 | | // Scan source buffers and update information. |
71 | | bool ScanSourceBuffersForContent(); |
72 | | RefPtr<TrackBuffersManager> GetManager(TrackInfo::TrackType aType); |
73 | | TrackInfo* GetTrackInfo(TrackInfo::TrackType); |
74 | | void DoAttachSourceBuffer(RefPtr<TrackBuffersManager>&& aSourceBuffer); |
75 | | void DoDetachSourceBuffer(RefPtr<TrackBuffersManager>&& aSourceBuffer); |
76 | | bool OnTaskQueue() |
77 | 0 | { |
78 | 0 | return !GetTaskQueue() || GetTaskQueue()->IsCurrentThreadIn(); |
79 | 0 | } |
80 | | |
81 | | RefPtr<TaskQueue> mTaskQueue; |
82 | | nsTArray<RefPtr<MediaSourceTrackDemuxer>> mDemuxers; |
83 | | |
84 | | nsTArray<RefPtr<TrackBuffersManager>> mSourceBuffers; |
85 | | |
86 | | MozPromiseHolder<InitPromise> mInitPromise; |
87 | | |
88 | | // Monitor to protect members below across multiple threads. |
89 | | mutable Monitor mMonitor; |
90 | | RefPtr<TrackBuffersManager> mAudioTrack; |
91 | | RefPtr<TrackBuffersManager> mVideoTrack; |
92 | | MediaInfo mInfo; |
93 | | }; |
94 | | |
95 | | class MediaSourceTrackDemuxer |
96 | | : public MediaTrackDemuxer |
97 | | , public DecoderDoctorLifeLogger<MediaSourceTrackDemuxer> |
98 | | { |
99 | | public: |
100 | | MediaSourceTrackDemuxer(MediaSourceDemuxer* aParent, |
101 | | TrackInfo::TrackType aType, |
102 | | TrackBuffersManager* aManager); |
103 | | |
104 | | UniquePtr<TrackInfo> GetInfo() const override; |
105 | | |
106 | | RefPtr<SeekPromise> Seek(const media::TimeUnit& aTime) override; |
107 | | |
108 | | RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) override; |
109 | | |
110 | | void Reset() override; |
111 | | |
112 | | nsresult GetNextRandomAccessPoint(media::TimeUnit* aTime) override; |
113 | | |
114 | | RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint( |
115 | | const media::TimeUnit& aTimeThreshold) override; |
116 | | |
117 | | media::TimeIntervals GetBuffered() override; |
118 | | |
119 | | void BreakCycles() override; |
120 | | |
121 | | bool GetSamplesMayBlock() const override |
122 | 0 | { |
123 | 0 | return false; |
124 | 0 | } |
125 | | |
126 | | bool HasManager(TrackBuffersManager* aManager) const; |
127 | | void DetachManager(); |
128 | | |
129 | | private: |
130 | | |
131 | | bool OnTaskQueue() const |
132 | 0 | { |
133 | 0 | MOZ_ASSERT(mParent); |
134 | 0 | auto taskQueue = mParent->GetTaskQueue(); |
135 | 0 | MOZ_ASSERT(taskQueue); |
136 | 0 | return taskQueue->IsCurrentThreadIn(); |
137 | 0 | } |
138 | | |
139 | | RefPtr<SeekPromise> DoSeek(const media::TimeUnit& aTime); |
140 | | RefPtr<SamplesPromise> DoGetSamples(int32_t aNumSamples); |
141 | | RefPtr<SkipAccessPointPromise> DoSkipToNextRandomAccessPoint( |
142 | | const media::TimeUnit& aTimeThreadshold); |
143 | | already_AddRefed<MediaRawData> GetSample(MediaResult& aError); |
144 | | // Return the timestamp of the next keyframe after mLastSampleIndex. |
145 | | media::TimeUnit GetNextRandomAccessPoint(); |
146 | | |
147 | | RefPtr<MediaSourceDemuxer> mParent; |
148 | | TrackInfo::TrackType mType; |
149 | | // Monitor protecting members below accessed from multiple threads. |
150 | | Monitor mMonitor; |
151 | | media::TimeUnit mNextRandomAccessPoint; |
152 | | // Would be accessed in MFR's demuxer proxy task queue and TaskQueue, and |
153 | | // only be set on the TaskQueue. It can be accessed while on TaskQueue without |
154 | | // the need for the lock. |
155 | | RefPtr<TrackBuffersManager> mManager; |
156 | | |
157 | | Maybe<RefPtr<MediaRawData>> mNextSample; |
158 | | // Set to true following a reset. Ensure that the next sample demuxed |
159 | | // is available at position 0. |
160 | | bool mReset; |
161 | | |
162 | | // Amount of pre-roll time when seeking. |
163 | | // Set to 80ms if track is Opus. |
164 | | const media::TimeUnit mPreRoll; |
165 | | }; |
166 | | |
167 | | } // namespace mozilla |
168 | | |
169 | | #endif |