Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
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 : #include "SourceBufferList.h"
8 :
9 : #include "AsyncEventRunner.h"
10 : #include "mozilla/ErrorResult.h"
11 : #include "mozilla/dom/SourceBufferListBinding.h"
12 : #include "mozilla/mozalloc.h"
13 : #include "nsCOMPtr.h"
14 : #include "nsIRunnable.h"
15 : #include "nsString.h"
16 : #include "nsThreadUtils.h"
17 : #include "mozilla/Logging.h"
18 :
19 : extern mozilla::LogModule* GetMediaSourceLog();
20 : extern mozilla::LogModule* GetMediaSourceAPILog();
21 :
22 : #define MSE_API(arg, ...) MOZ_LOG(GetMediaSourceAPILog(), mozilla::LogLevel::Debug, ("SourceBufferList(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
23 : #define MSE_DEBUG(arg, ...) MOZ_LOG(GetMediaSourceLog(), mozilla::LogLevel::Debug, ("SourceBufferList(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
24 :
25 : struct JSContext;
26 : class JSObject;
27 :
28 : namespace mozilla {
29 :
30 : namespace dom {
31 :
32 0 : SourceBufferList::~SourceBufferList()
33 : {
34 0 : }
35 :
36 : SourceBuffer*
37 0 : SourceBufferList::IndexedGetter(uint32_t aIndex, bool& aFound)
38 : {
39 0 : MOZ_ASSERT(NS_IsMainThread());
40 0 : aFound = aIndex < mSourceBuffers.Length();
41 :
42 0 : if (!aFound) {
43 0 : return nullptr;
44 : }
45 0 : return mSourceBuffers[aIndex];
46 : }
47 :
48 : uint32_t
49 0 : SourceBufferList::Length()
50 : {
51 0 : MOZ_ASSERT(NS_IsMainThread());
52 0 : return mSourceBuffers.Length();
53 : }
54 :
55 : void
56 0 : SourceBufferList::Append(SourceBuffer* aSourceBuffer)
57 : {
58 0 : MOZ_ASSERT(NS_IsMainThread());
59 0 : mSourceBuffers.AppendElement(aSourceBuffer);
60 0 : QueueAsyncSimpleEvent("addsourcebuffer");
61 0 : }
62 :
63 : void
64 0 : SourceBufferList::AppendSimple(SourceBuffer* aSourceBuffer)
65 : {
66 0 : MOZ_ASSERT(NS_IsMainThread());
67 0 : mSourceBuffers.AppendElement(aSourceBuffer);
68 0 : }
69 :
70 : void
71 0 : SourceBufferList::Remove(SourceBuffer* aSourceBuffer)
72 : {
73 0 : MOZ_ASSERT(NS_IsMainThread());
74 0 : MOZ_ALWAYS_TRUE(mSourceBuffers.RemoveElement(aSourceBuffer));
75 0 : aSourceBuffer->Detach();
76 0 : QueueAsyncSimpleEvent("removesourcebuffer");
77 0 : }
78 :
79 : bool
80 0 : SourceBufferList::Contains(SourceBuffer* aSourceBuffer)
81 : {
82 0 : MOZ_ASSERT(NS_IsMainThread());
83 0 : return mSourceBuffers.Contains(aSourceBuffer);
84 : }
85 :
86 : void
87 0 : SourceBufferList::Clear()
88 : {
89 0 : MOZ_ASSERT(NS_IsMainThread());
90 0 : for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) {
91 0 : mSourceBuffers[i]->Detach();
92 : }
93 0 : mSourceBuffers.Clear();
94 0 : QueueAsyncSimpleEvent("removesourcebuffer");
95 0 : }
96 :
97 : void
98 0 : SourceBufferList::ClearSimple()
99 : {
100 0 : MOZ_ASSERT(NS_IsMainThread());
101 0 : mSourceBuffers.Clear();
102 0 : }
103 :
104 : bool
105 0 : SourceBufferList::IsEmpty()
106 : {
107 0 : MOZ_ASSERT(NS_IsMainThread());
108 0 : return mSourceBuffers.IsEmpty();
109 : }
110 :
111 : bool
112 0 : SourceBufferList::AnyUpdating()
113 : {
114 0 : MOZ_ASSERT(NS_IsMainThread());
115 0 : for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) {
116 0 : if (mSourceBuffers[i]->Updating()) {
117 0 : return true;
118 : }
119 : }
120 0 : return false;
121 : }
122 :
123 : void
124 0 : SourceBufferList::RangeRemoval(double aStart, double aEnd)
125 : {
126 0 : MOZ_ASSERT(NS_IsMainThread());
127 0 : MSE_DEBUG("RangeRemoval(aStart=%f, aEnd=%f)", aStart, aEnd);
128 0 : for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) {
129 0 : mSourceBuffers[i]->RangeRemoval(aStart, aEnd);
130 : }
131 0 : }
132 :
133 : void
134 0 : SourceBufferList::Ended()
135 : {
136 0 : MOZ_ASSERT(NS_IsMainThread());
137 0 : for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) {
138 0 : mSourceBuffers[i]->Ended();
139 : }
140 0 : }
141 :
142 : double
143 0 : SourceBufferList::GetHighestBufferedEndTime()
144 : {
145 0 : MOZ_ASSERT(NS_IsMainThread());
146 0 : double highestEndTime = 0;
147 0 : for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) {
148 0 : highestEndTime = std::max(highestEndTime, mSourceBuffers[i]->GetBufferedEnd());
149 : }
150 0 : return highestEndTime;
151 : }
152 :
153 : void
154 0 : SourceBufferList::DispatchSimpleEvent(const char* aName)
155 : {
156 0 : MOZ_ASSERT(NS_IsMainThread());
157 0 : MSE_API("Dispatch event '%s'", aName);
158 0 : DispatchTrustedEvent(NS_ConvertUTF8toUTF16(aName));
159 0 : }
160 :
161 : void
162 0 : SourceBufferList::QueueAsyncSimpleEvent(const char* aName)
163 : {
164 0 : MSE_DEBUG("Queue event '%s'", aName);
165 0 : nsCOMPtr<nsIRunnable> event = new AsyncEventRunner<SourceBufferList>(this, aName);
166 0 : mAbstractMainThread->Dispatch(event.forget());
167 0 : }
168 :
169 0 : SourceBufferList::SourceBufferList(MediaSource* aMediaSource)
170 : : DOMEventTargetHelper(aMediaSource->GetParentObject())
171 : , mMediaSource(aMediaSource)
172 0 : , mAbstractMainThread(mMediaSource->AbstractMainThread())
173 : {
174 0 : MOZ_ASSERT(aMediaSource);
175 0 : }
176 :
177 : MediaSource*
178 0 : SourceBufferList::GetParentObject() const
179 : {
180 0 : return mMediaSource;
181 : }
182 :
183 : double
184 0 : SourceBufferList::HighestStartTime()
185 : {
186 0 : MOZ_ASSERT(NS_IsMainThread());
187 0 : double highestStartTime = 0;
188 0 : for (auto& sourceBuffer : mSourceBuffers) {
189 0 : highestStartTime =
190 0 : std::max(sourceBuffer->HighestStartTime(), highestStartTime);
191 : }
192 0 : return highestStartTime;
193 : }
194 :
195 : double
196 0 : SourceBufferList::HighestEndTime()
197 : {
198 0 : MOZ_ASSERT(NS_IsMainThread());
199 0 : double highestEndTime = 0;
200 0 : for (auto& sourceBuffer : mSourceBuffers) {
201 0 : highestEndTime =
202 0 : std::max(sourceBuffer->HighestEndTime(), highestEndTime);
203 : }
204 0 : return highestEndTime;
205 : }
206 :
207 : JSObject*
208 0 : SourceBufferList::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
209 : {
210 0 : return SourceBufferListBinding::Wrap(aCx, this, aGivenProto);
211 : }
212 :
213 0 : NS_IMPL_CYCLE_COLLECTION_INHERITED(SourceBufferList, DOMEventTargetHelper,
214 : mMediaSource, mSourceBuffers)
215 :
216 0 : NS_IMPL_ADDREF_INHERITED(SourceBufferList, DOMEventTargetHelper)
217 0 : NS_IMPL_RELEASE_INHERITED(SourceBufferList, DOMEventTargetHelper)
218 :
219 0 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(SourceBufferList)
220 0 : NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
221 :
222 : #undef MSE_API
223 : #undef MSE_DEBUG
224 : } // namespace dom
225 :
226 : } // namespace mozilla
|