Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/media/mediasource/SourceBufferList.cpp
Line
Count
Source (jump to first uncovered line)
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
0
#define MSE_API(arg, ...) MOZ_LOG(GetMediaSourceAPILog(), mozilla::LogLevel::Debug, ("SourceBufferList(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
23
0
#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
SourceBufferList::~SourceBufferList()
33
0
{
34
0
}
35
36
SourceBuffer*
37
SourceBufferList::IndexedGetter(uint32_t aIndex, bool& aFound)
38
0
{
39
0
  MOZ_ASSERT(NS_IsMainThread());
40
0
  aFound = aIndex < mSourceBuffers.Length();
41
0
42
0
  if (!aFound) {
43
0
    return nullptr;
44
0
  }
45
0
  return mSourceBuffers[aIndex];
46
0
}
47
48
uint32_t
49
SourceBufferList::Length()
50
0
{
51
0
  MOZ_ASSERT(NS_IsMainThread());
52
0
  return mSourceBuffers.Length();
53
0
}
54
55
void
56
SourceBufferList::Append(SourceBuffer* aSourceBuffer)
57
0
{
58
0
  MOZ_ASSERT(NS_IsMainThread());
59
0
  mSourceBuffers.AppendElement(aSourceBuffer);
60
0
  QueueAsyncSimpleEvent("addsourcebuffer");
61
0
}
62
63
void
64
SourceBufferList::AppendSimple(SourceBuffer* aSourceBuffer)
65
0
{
66
0
  MOZ_ASSERT(NS_IsMainThread());
67
0
  mSourceBuffers.AppendElement(aSourceBuffer);
68
0
}
69
70
void
71
SourceBufferList::Remove(SourceBuffer* aSourceBuffer)
72
0
{
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
SourceBufferList::Contains(SourceBuffer* aSourceBuffer)
81
0
{
82
0
  MOZ_ASSERT(NS_IsMainThread());
83
0
  return mSourceBuffers.Contains(aSourceBuffer);
84
0
}
85
86
void
87
SourceBufferList::Clear()
88
0
{
89
0
  MOZ_ASSERT(NS_IsMainThread());
90
0
  for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) {
91
0
    mSourceBuffers[i]->Detach();
92
0
  }
93
0
  mSourceBuffers.Clear();
94
0
  QueueAsyncSimpleEvent("removesourcebuffer");
95
0
}
96
97
void
98
SourceBufferList::ClearSimple()
99
0
{
100
0
  MOZ_ASSERT(NS_IsMainThread());
101
0
  mSourceBuffers.Clear();
102
0
}
103
104
bool
105
SourceBufferList::IsEmpty()
106
0
{
107
0
  MOZ_ASSERT(NS_IsMainThread());
108
0
  return mSourceBuffers.IsEmpty();
109
0
}
110
111
bool
112
SourceBufferList::AnyUpdating()
113
0
{
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
0
    }
119
0
  }
120
0
  return false;
121
0
}
122
123
void
124
SourceBufferList::RangeRemoval(double aStart, double aEnd)
125
0
{
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
0
  }
131
0
}
132
133
void
134
SourceBufferList::Ended()
135
0
{
136
0
  MOZ_ASSERT(NS_IsMainThread());
137
0
  for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) {
138
0
    mSourceBuffers[i]->Ended();
139
0
  }
140
0
}
141
142
double
143
SourceBufferList::GetHighestBufferedEndTime()
144
0
{
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
0
  }
150
0
  return highestEndTime;
151
0
}
152
153
void
154
SourceBufferList::DispatchSimpleEvent(const char* aName)
155
0
{
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
SourceBufferList::QueueAsyncSimpleEvent(const char* aName)
163
0
{
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
SourceBufferList::SourceBufferList(MediaSource* aMediaSource)
170
  : DOMEventTargetHelper(aMediaSource->GetParentObject())
171
  , mMediaSource(aMediaSource)
172
  , mAbstractMainThread(mMediaSource->AbstractMainThread())
173
0
{
174
0
  MOZ_ASSERT(aMediaSource);
175
0
}
176
177
MediaSource*
178
SourceBufferList::GetParentObject() const
179
0
{
180
0
  return mMediaSource;
181
0
}
182
183
double
184
SourceBufferList::HighestStartTime()
185
0
{
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
0
  }
192
0
  return highestStartTime;
193
0
}
194
195
double
196
SourceBufferList::HighestEndTime()
197
0
{
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
0
  }
204
0
  return highestEndTime;
205
0
}
206
207
JSObject*
208
SourceBufferList::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
209
0
{
210
0
  return SourceBufferList_Binding::Wrap(aCx, this, aGivenProto);
211
0
}
212
213
NS_IMPL_CYCLE_COLLECTION_INHERITED(SourceBufferList, DOMEventTargetHelper,
214
                                   mMediaSource, mSourceBuffers)
215
216
NS_IMPL_ADDREF_INHERITED(SourceBufferList, DOMEventTargetHelper)
217
NS_IMPL_RELEASE_INHERITED(SourceBufferList, DOMEventTargetHelper)
218
219
0
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(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