Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(127)

Side by Side Diff: third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp

Issue 2002073002: media: Replace wtf/Assertions.h macros in favor of base/logging.h macros (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 #include "platform/Logging.h" 52 #include "platform/Logging.h"
53 #include "platform/TraceEvent.h" 53 #include "platform/TraceEvent.h"
54 #include "public/platform/WebSourceBuffer.h" 54 #include "public/platform/WebSourceBuffer.h"
55 #include "wtf/MathExtras.h" 55 #include "wtf/MathExtras.h"
56 56
57 #include <limits> 57 #include <limits>
58 #include <sstream> 58 #include <sstream>
59 59
60 using blink::WebSourceBuffer; 60 using blink::WebSourceBuffer;
61 61
62 #define SOURCE_BUFFER_LOG_LEVEL 3
63
62 namespace blink { 64 namespace blink {
63 65
64 namespace { 66 namespace {
65 67
66 static bool throwExceptionIfRemovedOrUpdating(bool isRemoved, bool isUpdating, E xceptionState& exceptionState) 68 static bool throwExceptionIfRemovedOrUpdating(bool isRemoved, bool isUpdating, E xceptionState& exceptionState)
67 { 69 {
68 if (isRemoved) { 70 if (isRemoved) {
69 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError, "This SourceBuffer has been removed from the parent media source."); 71 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError, "This SourceBuffer has been removed from the parent media source.");
70 return true; 72 return true;
71 } 73 }
72 if (isUpdating) { 74 if (isUpdating) {
73 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError, "This SourceBuffer is still processing an 'appendBuffer', 'appendStream', or 're move' operation."); 75 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError, "This SourceBuffer is still processing an 'appendBuffer', 'appendStream', or 're move' operation.");
74 return true; 76 return true;
75 } 77 }
76 78
77 return false; 79 return false;
78 } 80 }
79 81
80 #if !LOG_DISABLED
81 WTF::String webTimeRangesToString(const WebTimeRanges& ranges) 82 WTF::String webTimeRangesToString(const WebTimeRanges& ranges)
82 { 83 {
83 StringBuilder stringBuilder; 84 StringBuilder stringBuilder;
84 stringBuilder.append("{"); 85 stringBuilder.append("{");
85 for (auto& r : ranges) { 86 for (auto& r : ranges) {
86 stringBuilder.append(" ["); 87 stringBuilder.append(" [");
87 stringBuilder.appendNumber(r.start); 88 stringBuilder.appendNumber(r.start);
88 stringBuilder.append(";"); 89 stringBuilder.append(";");
89 stringBuilder.appendNumber(r.end); 90 stringBuilder.appendNumber(r.end);
90 stringBuilder.append("]"); 91 stringBuilder.append("]");
91 } 92 }
92 stringBuilder.append(" }"); 93 stringBuilder.append(" }");
93 return stringBuilder.toString(); 94 return stringBuilder.toString();
94 } 95 }
95 #endif
96 96
97 } // namespace 97 } // namespace
98 98
99 SourceBuffer* SourceBuffer::create(PassOwnPtr<WebSourceBuffer> webSourceBuffer, MediaSource* source, GenericEventQueue* asyncEventQueue) 99 SourceBuffer* SourceBuffer::create(PassOwnPtr<WebSourceBuffer> webSourceBuffer, MediaSource* source, GenericEventQueue* asyncEventQueue)
100 { 100 {
101 SourceBuffer* sourceBuffer = new SourceBuffer(std::move(webSourceBuffer), so urce, asyncEventQueue); 101 SourceBuffer* sourceBuffer = new SourceBuffer(std::move(webSourceBuffer), so urce, asyncEventQueue);
102 sourceBuffer->suspendIfNeeded(); 102 sourceBuffer->suspendIfNeeded();
103 return sourceBuffer; 103 return sourceBuffer;
104 } 104 }
105 105
(...skipping 12 matching lines...) Expand all
118 , m_firstInitializationSegmentReceived(false) 118 , m_firstInitializationSegmentReceived(false)
119 , m_pendingAppendDataOffset(0) 119 , m_pendingAppendDataOffset(0)
120 , m_appendBufferAsyncPartRunner(AsyncMethodRunner<SourceBuffer>::create(this , &SourceBuffer::appendBufferAsyncPart)) 120 , m_appendBufferAsyncPartRunner(AsyncMethodRunner<SourceBuffer>::create(this , &SourceBuffer::appendBufferAsyncPart))
121 , m_pendingRemoveStart(-1) 121 , m_pendingRemoveStart(-1)
122 , m_pendingRemoveEnd(-1) 122 , m_pendingRemoveEnd(-1)
123 , m_removeAsyncPartRunner(AsyncMethodRunner<SourceBuffer>::create(this, &Sou rceBuffer::removeAsyncPart)) 123 , m_removeAsyncPartRunner(AsyncMethodRunner<SourceBuffer>::create(this, &Sou rceBuffer::removeAsyncPart))
124 , m_streamMaxSizeValid(false) 124 , m_streamMaxSizeValid(false)
125 , m_streamMaxSize(0) 125 , m_streamMaxSize(0)
126 , m_appendStreamAsyncPartRunner(AsyncMethodRunner<SourceBuffer>::create(this , &SourceBuffer::appendStreamAsyncPart)) 126 , m_appendStreamAsyncPartRunner(AsyncMethodRunner<SourceBuffer>::create(this , &SourceBuffer::appendStreamAsyncPart))
127 { 127 {
128 ASSERT(m_webSourceBuffer); 128 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ")";
129 ASSERT(m_source); 129
130 ASSERT(m_source->mediaElement()); 130 DCHECK(m_webSourceBuffer);
131 DCHECK(m_source);
132 DCHECK(m_source->mediaElement());
131 ThreadState::current()->registerPreFinalizer(this); 133 ThreadState::current()->registerPreFinalizer(this);
132 m_audioTracks = AudioTrackList::create(*m_source->mediaElement()); 134 m_audioTracks = AudioTrackList::create(*m_source->mediaElement());
133 m_videoTracks = VideoTrackList::create(*m_source->mediaElement()); 135 m_videoTracks = VideoTrackList::create(*m_source->mediaElement());
134 m_webSourceBuffer->setClient(this); 136 m_webSourceBuffer->setClient(this);
135 } 137 }
136 138
137 SourceBuffer::~SourceBuffer() 139 SourceBuffer::~SourceBuffer()
138 { 140 {
139 WTF_LOG(Media, "SourceBuffer(%p)::~SourceBuffer", this); 141 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ")";
140 } 142 }
141 143
142 void SourceBuffer::dispose() 144 void SourceBuffer::dispose()
143 { 145 {
144 // Promptly clears a raw reference from content/ to an on-heap object 146 // Promptly clears a raw reference from content/ to an on-heap object
145 // so that content/ doesn't access it in a lazy sweeping phase. 147 // so that content/ doesn't access it in a lazy sweeping phase.
146 m_webSourceBuffer.clear(); 148 m_webSourceBuffer.clear();
147 } 149 }
148 150
149 const AtomicString& SourceBuffer::segmentsKeyword() 151 const AtomicString& SourceBuffer::segmentsKeyword()
150 { 152 {
151 DEFINE_STATIC_LOCAL(const AtomicString, segments, ("segments")); 153 DEFINE_STATIC_LOCAL(const AtomicString, segments, ("segments"));
152 return segments; 154 return segments;
153 } 155 }
154 156
155 const AtomicString& SourceBuffer::sequenceKeyword() 157 const AtomicString& SourceBuffer::sequenceKeyword()
156 { 158 {
157 DEFINE_STATIC_LOCAL(const AtomicString, sequence, ("sequence")); 159 DEFINE_STATIC_LOCAL(const AtomicString, sequence, ("sequence"));
158 return sequence; 160 return sequence;
159 } 161 }
160 162
161 void SourceBuffer::setMode(const AtomicString& newMode, ExceptionState& exceptio nState) 163 void SourceBuffer::setMode(const AtomicString& newMode, ExceptionState& exceptio nState)
162 { 164 {
163 WTF_LOG(Media, "SourceBuffer::setMode %p newMode=%s", this, newMode.utf8().d ata()); 165 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") newMode= " << newMode;
164 // Section 3.1 On setting mode attribute steps. 166 // Section 3.1 On setting mode attribute steps.
165 // 1. Let new mode equal the new value being assigned to this attribute. 167 // 1. Let new mode equal the new value being assigned to this attribute.
166 // 2. If this object has been removed from the sourceBuffers attribute of th e parent media source, then throw 168 // 2. If this object has been removed from the sourceBuffers attribute of th e parent media source, then throw
167 // an INVALID_STATE_ERR exception and abort these steps. 169 // an INVALID_STATE_ERR exception and abort these steps.
168 // 3. If the updating attribute equals true, then throw an INVALID_STATE_ERR exception and abort these steps. 170 // 3. If the updating attribute equals true, then throw an INVALID_STATE_ERR exception and abort these steps.
169 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat e)) 171 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat e))
170 return; 172 return;
171 173
172 // 4. If the readyState attribute of the parent media source is in the "ende d" state then run the following steps: 174 // 4. If the readyState attribute of the parent media source is in the "ende d" state then run the following steps:
173 // 4.1 Set the readyState attribute of the parent media source to "open" 175 // 4.1 Set the readyState attribute of the parent media source to "open"
(...skipping 28 matching lines...) Expand all
202 return TimeRanges::create(m_webSourceBuffer->buffered()); 204 return TimeRanges::create(m_webSourceBuffer->buffered());
203 } 205 }
204 206
205 double SourceBuffer::timestampOffset() const 207 double SourceBuffer::timestampOffset() const
206 { 208 {
207 return m_timestampOffset; 209 return m_timestampOffset;
208 } 210 }
209 211
210 void SourceBuffer::setTimestampOffset(double offset, ExceptionState& exceptionSt ate) 212 void SourceBuffer::setTimestampOffset(double offset, ExceptionState& exceptionSt ate)
211 { 213 {
212 WTF_LOG(Media, "SourceBuffer::setTimestampOffset %p offset=%f", this, offset ); 214 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") offset=" << offset;
213 // Section 3.1 timestampOffset attribute setter steps. 215 // Section 3.1 timestampOffset attribute setter steps.
214 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source. html#widl-SourceBuffer-timestampOffset 216 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source. html#widl-SourceBuffer-timestampOffset
215 // 1. Let new timestamp offset equal the new value being assigned to this at tribute. 217 // 1. Let new timestamp offset equal the new value being assigned to this at tribute.
216 // 2. If this object has been removed from the sourceBuffers attribute of th e parent media source, then throw an 218 // 2. If this object has been removed from the sourceBuffers attribute of th e parent media source, then throw an
217 // InvalidStateError exception and abort these steps. 219 // InvalidStateError exception and abort these steps.
218 // 3. If the updating attribute equals true, then throw an InvalidStateError exception and abort these steps. 220 // 3. If the updating attribute equals true, then throw an InvalidStateError exception and abort these steps.
219 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat e)) 221 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat e))
220 return; 222 return;
221 223
222 // 4. If the readyState attribute of the parent media source is in the "ende d" state then run the following steps: 224 // 4. If the readyState attribute of the parent media source is in the "ende d" state then run the following steps:
223 // 4.1 Set the readyState attribute of the parent media source to "open" 225 // 4.1 Set the readyState attribute of the parent media source to "open"
224 // 4.2 Queue a task to fire a simple event named sourceopen at the parent me dia source. 226 // 4.2 Queue a task to fire a simple event named sourceopen at the parent me dia source.
225 m_source->openIfInEndedState(); 227 m_source->openIfInEndedState();
226 228
227 // 5. If the append state equals PARSING_MEDIA_SEGMENT, then throw an INVALI D_STATE_ERR and abort these steps. 229 // 5. If the append state equals PARSING_MEDIA_SEGMENT, then throw an INVALI D_STATE_ERR and abort these steps.
228 // 6. If the mode attribute equals "sequence", then set the group start time stamp to new timestamp offset. 230 // 6. If the mode attribute equals "sequence", then set the group start time stamp to new timestamp offset.
229 if (!m_webSourceBuffer->setTimestampOffset(offset)) { 231 if (!m_webSourceBuffer->setTimestampOffset(offset)) {
230 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError, "The timestamp offset may not be set while the SourceBuffer's append state is 'P ARSING_MEDIA_SEGMENT'."); 232 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError, "The timestamp offset may not be set while the SourceBuffer's append state is 'P ARSING_MEDIA_SEGMENT'.");
231 return; 233 return;
232 } 234 }
233 235
234 // 7. Update the attribute to new timestamp offset. 236 // 7. Update the attribute to new timestamp offset.
235 m_timestampOffset = offset; 237 m_timestampOffset = offset;
236 } 238 }
237 239
238 AudioTrackList& SourceBuffer::audioTracks() 240 AudioTrackList& SourceBuffer::audioTracks()
239 { 241 {
240 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); 242 DCHECK(RuntimeEnabledFeatures::audioVideoTracksEnabled());
241 return *m_audioTracks; 243 return *m_audioTracks;
242 } 244 }
243 245
244 VideoTrackList& SourceBuffer::videoTracks() 246 VideoTrackList& SourceBuffer::videoTracks()
245 { 247 {
246 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); 248 DCHECK(RuntimeEnabledFeatures::audioVideoTracksEnabled());
247 return *m_videoTracks; 249 return *m_videoTracks;
248 } 250 }
249 251
250 double SourceBuffer::appendWindowStart() const 252 double SourceBuffer::appendWindowStart() const
251 { 253 {
252 return m_appendWindowStart; 254 return m_appendWindowStart;
253 } 255 }
254 256
255 void SourceBuffer::setAppendWindowStart(double start, ExceptionState& exceptionS tate) 257 void SourceBuffer::setAppendWindowStart(double start, ExceptionState& exceptionS tate)
256 { 258 {
257 WTF_LOG(Media, "SourceBuffer::setAppendWindowStart %p start=%f", this, start ); 259 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") start=" << start;
258 // Section 3.1 appendWindowStart attribute setter steps. 260 // Section 3.1 appendWindowStart attribute setter steps.
259 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source. html#widl-SourceBuffer-appendWindowStart 261 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source. html#widl-SourceBuffer-appendWindowStart
260 // 1. If this object has been removed from the sourceBuffers attribute of th e parent media source then throw an 262 // 1. If this object has been removed from the sourceBuffers attribute of th e parent media source then throw an
261 // InvalidStateError exception and abort these steps. 263 // InvalidStateError exception and abort these steps.
262 // 2. If the updating attribute equals true, then throw an InvalidStateError exception and abort these steps. 264 // 2. If the updating attribute equals true, then throw an InvalidStateError exception and abort these steps.
263 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat e)) 265 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat e))
264 return; 266 return;
265 267
266 // 3. If the new value is less than 0 or greater than or equal to appendWind owEnd then throw an InvalidAccessError 268 // 3. If the new value is less than 0 or greater than or equal to appendWind owEnd then throw an InvalidAccessError
267 // exception and abort these steps. 269 // exception and abort these steps.
268 if (start < 0 || start >= m_appendWindowEnd) { 270 if (start < 0 || start >= m_appendWindowEnd) {
269 MediaSource::logAndThrowDOMException(exceptionState, InvalidAccessError, ExceptionMessages::indexOutsideRange("value", start, 0.0, ExceptionMessages::Ex clusiveBound, m_appendWindowEnd, ExceptionMessages::InclusiveBound)); 271 MediaSource::logAndThrowDOMException(exceptionState, InvalidAccessError, ExceptionMessages::indexOutsideRange("value", start, 0.0, ExceptionMessages::Ex clusiveBound, m_appendWindowEnd, ExceptionMessages::InclusiveBound));
270 return; 272 return;
271 } 273 }
272 274
273 m_webSourceBuffer->setAppendWindowStart(start); 275 m_webSourceBuffer->setAppendWindowStart(start);
274 276
275 // 4. Update the attribute to the new value. 277 // 4. Update the attribute to the new value.
276 m_appendWindowStart = start; 278 m_appendWindowStart = start;
277 } 279 }
278 280
279 double SourceBuffer::appendWindowEnd() const 281 double SourceBuffer::appendWindowEnd() const
280 { 282 {
281 return m_appendWindowEnd; 283 return m_appendWindowEnd;
282 } 284 }
283 285
284 void SourceBuffer::setAppendWindowEnd(double end, ExceptionState& exceptionState ) 286 void SourceBuffer::setAppendWindowEnd(double end, ExceptionState& exceptionState )
285 { 287 {
286 WTF_LOG(Media, "SourceBuffer::setAppendWindowEnd %p end=%f", this, end); 288 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") end=" << end;
287 // Section 3.1 appendWindowEnd attribute setter steps. 289 // Section 3.1 appendWindowEnd attribute setter steps.
288 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source. html#widl-SourceBuffer-appendWindowEnd 290 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source. html#widl-SourceBuffer-appendWindowEnd
289 // 1. If this object has been removed from the sourceBuffers attribute of th e parent media source then throw an 291 // 1. If this object has been removed from the sourceBuffers attribute of th e parent media source then throw an
290 // InvalidStateError exception and abort these steps. 292 // InvalidStateError exception and abort these steps.
291 // 2. If the updating attribute equals true, then throw an InvalidStateError exception and abort these steps. 293 // 2. If the updating attribute equals true, then throw an InvalidStateError exception and abort these steps.
292 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat e)) 294 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat e))
293 return; 295 return;
294 296
295 // 3. If the new value equals NaN, then throw an InvalidAccessError and abor t these steps. 297 // 3. If the new value equals NaN, then throw an InvalidAccessError and abor t these steps.
296 if (std::isnan(end)) { 298 if (std::isnan(end)) {
297 MediaSource::logAndThrowDOMException(exceptionState, InvalidAccessError, ExceptionMessages::notAFiniteNumber(end)); 299 MediaSource::logAndThrowDOMException(exceptionState, InvalidAccessError, ExceptionMessages::notAFiniteNumber(end));
298 return; 300 return;
299 } 301 }
300 // 4. If the new value is less than or equal to appendWindowStart then throw an InvalidAccessError 302 // 4. If the new value is less than or equal to appendWindowStart then throw an InvalidAccessError
301 // exception and abort these steps. 303 // exception and abort these steps.
302 if (end <= m_appendWindowStart) { 304 if (end <= m_appendWindowStart) {
303 MediaSource::logAndThrowDOMException(exceptionState, InvalidAccessError, ExceptionMessages::indexExceedsMinimumBound("value", end, m_appendWindowStart)) ; 305 MediaSource::logAndThrowDOMException(exceptionState, InvalidAccessError, ExceptionMessages::indexExceedsMinimumBound("value", end, m_appendWindowStart)) ;
304 return; 306 return;
305 } 307 }
306 308
307 m_webSourceBuffer->setAppendWindowEnd(end); 309 m_webSourceBuffer->setAppendWindowEnd(end);
308 310
309 // 5. Update the attribute to the new value. 311 // 5. Update the attribute to the new value.
310 m_appendWindowEnd = end; 312 m_appendWindowEnd = end;
311 } 313 }
312 314
313 void SourceBuffer::appendBuffer(DOMArrayBuffer* data, ExceptionState& exceptionS tate) 315 void SourceBuffer::appendBuffer(DOMArrayBuffer* data, ExceptionState& exceptionS tate)
314 { 316 {
315 WTF_LOG(Media, "SourceBuffer(%p)::appendBuffer size=%u", this, data->byteLen gth()); 317 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") size=" < < data->byteLength();
316 // Section 3.2 appendBuffer() 318 // Section 3.2 appendBuffer()
317 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-appendBuffer-void-ArrayBufferView-data 319 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-appendBuffer-void-ArrayBufferView-data
318 appendBufferInternal(static_cast<const unsigned char*>(data->data()), data-> byteLength(), exceptionState); 320 appendBufferInternal(static_cast<const unsigned char*>(data->data()), data-> byteLength(), exceptionState);
319 } 321 }
320 322
321 void SourceBuffer::appendBuffer(DOMArrayBufferView* data, ExceptionState& except ionState) 323 void SourceBuffer::appendBuffer(DOMArrayBufferView* data, ExceptionState& except ionState)
322 { 324 {
323 WTF_LOG(Media, "SourceBuffer(%p)::appendBuffer size=%u", this, data->byteLen gth()); 325 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") size=" < < data->byteLength();
324 // Section 3.2 appendBuffer() 326 // Section 3.2 appendBuffer()
325 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-appendBuffer-void-ArrayBufferView-data 327 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-appendBuffer-void-ArrayBufferView-data
326 appendBufferInternal(static_cast<const unsigned char*>(data->baseAddress()), data->byteLength(), exceptionState); 328 appendBufferInternal(static_cast<const unsigned char*>(data->baseAddress()), data->byteLength(), exceptionState);
327 } 329 }
328 330
329 void SourceBuffer::appendStream(Stream* stream, ExceptionState& exceptionState) 331 void SourceBuffer::appendStream(Stream* stream, ExceptionState& exceptionState)
330 { 332 {
331 m_streamMaxSizeValid = false; 333 m_streamMaxSizeValid = false;
332 appendStreamInternal(stream, exceptionState); 334 appendStreamInternal(stream, exceptionState);
333 } 335 }
334 336
335 void SourceBuffer::appendStream(Stream* stream, unsigned long long maxSize, Exce ptionState& exceptionState) 337 void SourceBuffer::appendStream(Stream* stream, unsigned long long maxSize, Exce ptionState& exceptionState)
336 { 338 {
337 WTF_LOG(Media, "SourceBuffer(%p)::appendStream maxSize=%llu", this, maxSize) ; 339 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") maxSize= " << maxSize;
338 m_streamMaxSizeValid = maxSize > 0; 340 m_streamMaxSizeValid = maxSize > 0;
339 if (m_streamMaxSizeValid) 341 if (m_streamMaxSizeValid)
340 m_streamMaxSize = maxSize; 342 m_streamMaxSize = maxSize;
341 appendStreamInternal(stream, exceptionState); 343 appendStreamInternal(stream, exceptionState);
342 } 344 }
343 345
344 void SourceBuffer::abort(ExceptionState& exceptionState) 346 void SourceBuffer::abort(ExceptionState& exceptionState)
345 { 347 {
346 WTF_LOG(Media, "SourceBuffer::abort %p", this); 348 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ")";
347 // Section 3.2 abort() method steps. 349 // Section 3.2 abort() method steps.
348 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-abort-void 350 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-abort-void
349 // 1. If this object has been removed from the sourceBuffers attribute of th e parent media source 351 // 1. If this object has been removed from the sourceBuffers attribute of th e parent media source
350 // then throw an InvalidStateError exception and abort these steps. 352 // then throw an InvalidStateError exception and abort these steps.
351 // 2. If the readyState attribute of the parent media source is not in the " open" state 353 // 2. If the readyState attribute of the parent media source is not in the " open" state
352 // then throw an InvalidStateError exception and abort these steps. 354 // then throw an InvalidStateError exception and abort these steps.
353 if (isRemoved()) { 355 if (isRemoved()) {
354 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError, "This SourceBuffer has been removed from the parent media source."); 356 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError, "This SourceBuffer has been removed from the parent media source.");
355 return; 357 return;
356 } 358 }
(...skipping 10 matching lines...) Expand all
367 369
368 // 5. Set appendWindowStart to 0. 370 // 5. Set appendWindowStart to 0.
369 setAppendWindowStart(0, exceptionState); 371 setAppendWindowStart(0, exceptionState);
370 372
371 // 6. Set appendWindowEnd to positive Infinity. 373 // 6. Set appendWindowEnd to positive Infinity.
372 setAppendWindowEnd(std::numeric_limits<double>::infinity(), exceptionState); 374 setAppendWindowEnd(std::numeric_limits<double>::infinity(), exceptionState);
373 } 375 }
374 376
375 void SourceBuffer::remove(double start, double end, ExceptionState& exceptionSta te) 377 void SourceBuffer::remove(double start, double end, ExceptionState& exceptionSta te)
376 { 378 {
377 WTF_LOG(Media, "SourceBuffer(%p)::remove start=%f end=%f", this, start, end) ; 379 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") start=" << start << " end=" << end;
378 380
379 // Section 3.2 remove() method steps. 381 // Section 3.2 remove() method steps.
380 // 1. If duration equals NaN, then throw an InvalidAccessError exception and abort these steps. 382 // 1. If duration equals NaN, then throw an InvalidAccessError exception and abort these steps.
381 // 2. If start is negative or greater than duration, then throw an InvalidAc cessError exception and abort these steps. 383 // 2. If start is negative or greater than duration, then throw an InvalidAc cessError exception and abort these steps.
382 384
383 if (start < 0 || (m_source && (std::isnan(m_source->duration()) || start > m _source->duration()))) { 385 if (start < 0 || (m_source && (std::isnan(m_source->duration()) || start > m _source->duration()))) {
384 MediaSource::logAndThrowDOMException(exceptionState, InvalidAccessError, ExceptionMessages::indexOutsideRange("start", start, 0.0, ExceptionMessages::Ex clusiveBound, !m_source || std::isnan(m_source->duration()) ? 0 : m_source->dura tion(), ExceptionMessages::ExclusiveBound)); 386 MediaSource::logAndThrowDOMException(exceptionState, InvalidAccessError, ExceptionMessages::indexOutsideRange("start", start, 0.0, ExceptionMessages::Ex clusiveBound, !m_source || std::isnan(m_source->duration()) ? 0 : m_source->dura tion(), ExceptionMessages::ExclusiveBound));
385 return; 387 return;
386 } 388 }
387 389
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 return; 444 return;
443 445
444 const char* traceEventName = 0; 446 const char* traceEventName = 0;
445 if (!m_pendingAppendData.isEmpty()) { 447 if (!m_pendingAppendData.isEmpty()) {
446 traceEventName = "SourceBuffer::appendBuffer"; 448 traceEventName = "SourceBuffer::appendBuffer";
447 } else if (m_stream) { 449 } else if (m_stream) {
448 traceEventName = "SourceBuffer::appendStream"; 450 traceEventName = "SourceBuffer::appendStream";
449 } else if (m_pendingRemoveStart != -1) { 451 } else if (m_pendingRemoveStart != -1) {
450 traceEventName = "SourceBuffer::remove"; 452 traceEventName = "SourceBuffer::remove";
451 } else { 453 } else {
452 ASSERT_NOT_REACHED(); 454 NOTREACHED();
453 } 455 }
454 456
455 // 3.1. Abort the buffer append and stream append loop algorithms if they ar e running. 457 // 3.1. Abort the buffer append and stream append loop algorithms if they ar e running.
456 m_appendBufferAsyncPartRunner->stop(); 458 m_appendBufferAsyncPartRunner->stop();
457 m_pendingAppendData.clear(); 459 m_pendingAppendData.clear();
458 m_pendingAppendDataOffset = 0; 460 m_pendingAppendDataOffset = 0;
459 461
460 m_removeAsyncPartRunner->stop(); 462 m_removeAsyncPartRunner->stop();
461 m_pendingRemoveStart = -1; 463 m_pendingRemoveStart = -1;
462 m_pendingRemoveEnd = -1; 464 m_pendingRemoveEnd = -1;
(...skipping 11 matching lines...) Expand all
474 scheduleEvent(EventTypeNames::updateend); 476 scheduleEvent(EventTypeNames::updateend);
475 477
476 TRACE_EVENT_ASYNC_END0("media", traceEventName, this); 478 TRACE_EVENT_ASYNC_END0("media", traceEventName, this);
477 } 479 }
478 480
479 void SourceBuffer::removedFromMediaSource() 481 void SourceBuffer::removedFromMediaSource()
480 { 482 {
481 if (isRemoved()) 483 if (isRemoved())
482 return; 484 return;
483 485
484 WTF_LOG(Media, "SourceBuffer(%p)::removedFromMediaSource", this); 486 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ")";
485 abortIfUpdating(); 487 abortIfUpdating();
486 488
487 if (RuntimeEnabledFeatures::audioVideoTracksEnabled()) { 489 if (RuntimeEnabledFeatures::audioVideoTracksEnabled()) {
488 ASSERT(m_source); 490 DCHECK(m_source);
489 if (m_source->mediaElement()->audioTracks().length() > 0 491 if (m_source->mediaElement()->audioTracks().length() > 0
490 || m_source->mediaElement()->videoTracks().length() > 0) { 492 || m_source->mediaElement()->videoTracks().length() > 0) {
491 removeMediaTracks(); 493 removeMediaTracks();
492 } 494 }
493 } 495 }
494 496
495 m_webSourceBuffer->removedFromMediaSource(); 497 m_webSourceBuffer->removedFromMediaSource();
496 m_webSourceBuffer.clear(); 498 m_webSourceBuffer.clear();
497 m_source = nullptr; 499 m_source = nullptr;
498 m_asyncEventQueue = nullptr; 500 m_asyncEventQueue = nullptr;
499 } 501 }
500 502
501 void SourceBuffer::removeMediaTracks() 503 void SourceBuffer::removeMediaTracks()
502 { 504 {
503 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); 505 DCHECK(RuntimeEnabledFeatures::audioVideoTracksEnabled());
504 // Spec: http://w3c.github.io/media-source/#widl-MediaSource-removeSourceBuf fer-void-SourceBuffer-sourceBuffer 506 // Spec: http://w3c.github.io/media-source/#widl-MediaSource-removeSourceBuf fer-void-SourceBuffer-sourceBuffer
505 ASSERT(m_source); 507 DCHECK(m_source);
506 508
507 HTMLMediaElement* mediaElement = m_source->mediaElement(); 509 HTMLMediaElement* mediaElement = m_source->mediaElement();
508 ASSERT(mediaElement); 510 DCHECK(mediaElement);
509 // 3. Let SourceBuffer audioTracks list equal the AudioTrackList object retu rned by sourceBuffer.audioTracks. 511 // 3. Let SourceBuffer audioTracks list equal the AudioTrackList object retu rned by sourceBuffer.audioTracks.
510 // 4. If the SourceBuffer audioTracks list is not empty, then run the follow ing steps: 512 // 4. If the SourceBuffer audioTracks list is not empty, then run the follow ing steps:
511 // 4.1 Let HTMLMediaElement audioTracks list equal the AudioTrackList object returned by the audioTracks attribute on the HTMLMediaElement. 513 // 4.1 Let HTMLMediaElement audioTracks list equal the AudioTrackList object returned by the audioTracks attribute on the HTMLMediaElement.
512 // 4.2 Let the removed enabled audio track flag equal false. 514 // 4.2 Let the removed enabled audio track flag equal false.
513 bool removedEnabledAudioTrack = false; 515 bool removedEnabledAudioTrack = false;
514 // 4.3 For each AudioTrack object in the SourceBuffer audioTracks list, run the following steps: 516 // 4.3 For each AudioTrack object in the SourceBuffer audioTracks list, run the following steps:
515 while (audioTracks().length() > 0) { 517 while (audioTracks().length() > 0) {
516 AudioTrack* audioTrack = audioTracks().anonymousIndexedGetter(0); 518 AudioTrack* audioTrack = audioTracks().anonymousIndexedGetter(0);
517 // 4.3.1 Set the sourceBuffer attribute on the AudioTrack object to null . 519 // 4.3.1 Set the sourceBuffer attribute on the AudioTrack object to null .
518 SourceBufferTrackBaseSupplement::setSourceBuffer(*audioTrack, nullptr); 520 SourceBufferTrackBaseSupplement::setSourceBuffer(*audioTrack, nullptr);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 // > If more than one track for a single type are present (ie 2 audio tracks ), then the Track IDs match the ones in the first initialization segment. 572 // > If more than one track for a single type are present (ie 2 audio tracks ), then the Track IDs match the ones in the first initialization segment.
571 // I.e. we only need to search by TrackID if there is more than one track, o therwise we can assume that the only 573 // I.e. we only need to search by TrackID if there is more than one track, o therwise we can assume that the only
572 // track of the given type is the same one that we had in previous init segm ents. 574 // track of the given type is the same one that we had in previous init segm ents.
573 if (trackList.length() == 1) 575 if (trackList.length() == 1)
574 return trackList.anonymousIndexedGetter(0); 576 return trackList.anonymousIndexedGetter(0);
575 return trackList.getTrackById(id); 577 return trackList.getTrackById(id);
576 } 578 }
577 579
578 WebVector<WebMediaPlayer::TrackId> SourceBuffer::initializationSegmentReceived(c onst WebVector<MediaTrackInfo>& newTracks) 580 WebVector<WebMediaPlayer::TrackId> SourceBuffer::initializationSegmentReceived(c onst WebVector<MediaTrackInfo>& newTracks)
579 { 581 {
580 WTF_LOG(Media, "SourceBuffer::initializationSegmentReceived %p tracks=%zu", this, newTracks.size()); 582 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") tracks=" << newTracks.size();
581 ASSERT(m_source); 583 DCHECK(m_source);
582 ASSERT(m_source->mediaElement()); 584 DCHECK(m_source->mediaElement());
583 ASSERT(m_updating); 585 DCHECK(m_updating);
584 586
585 // TODO(servolk): Implement proper 'initialization segment received' algorit hm according to MSE spec: 587 // TODO(servolk): Implement proper 'initialization segment received' algorit hm according to MSE spec:
586 // https://w3c.github.io/media-source/#sourcebuffer-init-segment-received 588 // https://w3c.github.io/media-source/#sourcebuffer-init-segment-received
587 WebVector<WebMediaPlayer::TrackId> result(newTracks.size()); 589 WebVector<WebMediaPlayer::TrackId> result(newTracks.size());
588 unsigned resultIdx = 0; 590 unsigned resultIdx = 0;
589 for (const auto& trackInfo : newTracks) { 591 for (const auto& trackInfo : newTracks) {
590 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) { 592 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) {
591 static WebMediaPlayer::TrackId nextTrackId = 0; 593 static WebMediaPlayer::TrackId nextTrackId = 0;
592 result[resultIdx++] = ++nextTrackId; 594 result[resultIdx++] = ++nextTrackId;
593 continue; 595 continue;
594 } 596 }
595 597
596 const TrackBase* trackBase = nullptr; 598 const TrackBase* trackBase = nullptr;
597 if (trackInfo.trackType == WebMediaPlayer::AudioTrack) { 599 if (trackInfo.trackType == WebMediaPlayer::AudioTrack) {
598 AudioTrack* audioTrack = nullptr; 600 AudioTrack* audioTrack = nullptr;
599 if (!m_firstInitializationSegmentReceived) { 601 if (!m_firstInitializationSegmentReceived) {
600 audioTrack = AudioTrack::create(trackInfo.byteStreamTrackId, tra ckInfo.kind, trackInfo.label, trackInfo.language, false); 602 audioTrack = AudioTrack::create(trackInfo.byteStreamTrackId, tra ckInfo.kind, trackInfo.label, trackInfo.language, false);
601 SourceBufferTrackBaseSupplement::setSourceBuffer(*audioTrack, th is); 603 SourceBufferTrackBaseSupplement::setSourceBuffer(*audioTrack, th is);
602 audioTracks().add(audioTrack); 604 audioTracks().add(audioTrack);
603 m_source->mediaElement()->audioTracks().add(audioTrack); 605 m_source->mediaElement()->audioTracks().add(audioTrack);
604 } else { 606 } else {
605 audioTrack = findExistingTrackById(audioTracks(), trackInfo.byte StreamTrackId); 607 audioTrack = findExistingTrackById(audioTracks(), trackInfo.byte StreamTrackId);
606 ASSERT(audioTrack); 608 DCHECK(audioTrack);
607 } 609 }
608 trackBase = audioTrack; 610 trackBase = audioTrack;
609 result[resultIdx++] = audioTrack->trackId(); 611 result[resultIdx++] = audioTrack->trackId();
610 } else if (trackInfo.trackType == WebMediaPlayer::VideoTrack) { 612 } else if (trackInfo.trackType == WebMediaPlayer::VideoTrack) {
611 VideoTrack* videoTrack = nullptr; 613 VideoTrack* videoTrack = nullptr;
612 if (!m_firstInitializationSegmentReceived) { 614 if (!m_firstInitializationSegmentReceived) {
613 videoTrack = VideoTrack::create(trackInfo.byteStreamTrackId, tra ckInfo.kind, trackInfo.label, trackInfo.language, false); 615 videoTrack = VideoTrack::create(trackInfo.byteStreamTrackId, tra ckInfo.kind, trackInfo.label, trackInfo.language, false);
614 SourceBufferTrackBaseSupplement::setSourceBuffer(*videoTrack, th is); 616 SourceBufferTrackBaseSupplement::setSourceBuffer(*videoTrack, th is);
615 videoTracks().add(videoTrack); 617 videoTracks().add(videoTrack);
616 m_source->mediaElement()->videoTracks().add(videoTrack); 618 m_source->mediaElement()->videoTracks().add(videoTrack);
617 } else { 619 } else {
618 videoTrack = findExistingTrackById(videoTracks(), trackInfo.byte StreamTrackId); 620 videoTrack = findExistingTrackById(videoTracks(), trackInfo.byte StreamTrackId);
619 ASSERT(videoTrack); 621 DCHECK(videoTrack);
620 } 622 }
621 trackBase = videoTrack; 623 trackBase = videoTrack;
622 result[resultIdx++] = videoTrack->trackId(); 624 result[resultIdx++] = videoTrack->trackId();
623 } else { 625 } else {
624 NOTREACHED(); 626 NOTREACHED();
625 } 627 }
626 (void)trackBase; 628 (void)trackBase;
627 #if !LOG_DISABLED 629 #if !LOG_DISABLED
628 const char* logActionStr = m_firstInitializationSegmentReceived ? "using existing" : "added"; 630 const char* logActionStr = m_firstInitializationSegmentReceived ? "using existing" : "added";
629 const char* logTrackTypeStr = (trackInfo.trackType == WebMediaPlayer::Au dioTrack) ? "audio" : "video"; 631 const char* logTrackTypeStr = (trackInfo.trackType == WebMediaPlayer::Au dioTrack) ? "audio" : "video";
630 WTF_LOG(Media, "Tracks (sb=%p): %s %sTrack %p trackId=%d id=%s label=%s lang=%s", this, logActionStr, logTrackTypeStr, trackBase, trackBase->trackId(), trackBase->id().utf8().data(), trackBase->label().utf8().data(), trackBase->lang uage().utf8().data()); 632 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") " << logActionStr << " "
633 << logTrackTypeStr << " Track " << trackBase << "trackId=" << trackBase- >trackId() << " id="
wolenetz 2016/05/31 17:46:18 nit: indentation
Srirama 2016/06/01 11:39:35 Done.
634 << trackBase->id() << " label=" << trackBase->label() << " lang=" << tra ckBase->language();
631 #endif 635 #endif
632 } 636 }
633 637
634 if (!m_firstInitializationSegmentReceived) { 638 if (!m_firstInitializationSegmentReceived) {
635 // 5. If active track flag equals true, then run the following steps: 639 // 5. If active track flag equals true, then run the following steps:
636 // 5.1. Add this SourceBuffer to activeSourceBuffers. 640 // 5.1. Add this SourceBuffer to activeSourceBuffers.
637 // 5.2. Queue a task to fire a simple event named addsourcebuffer at 641 // 5.2. Queue a task to fire a simple event named addsourcebuffer at
638 // activesourcebuffers. 642 // activesourcebuffers.
639 m_source->setSourceBufferActive(this); 643 m_source->setSourceBufferActive(this);
640 644
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 return EventTargetNames::SourceBuffer; 685 return EventTargetNames::SourceBuffer;
682 } 686 }
683 687
684 bool SourceBuffer::isRemoved() const 688 bool SourceBuffer::isRemoved() const
685 { 689 {
686 return !m_source; 690 return !m_source;
687 } 691 }
688 692
689 void SourceBuffer::scheduleEvent(const AtomicString& eventName) 693 void SourceBuffer::scheduleEvent(const AtomicString& eventName)
690 { 694 {
691 ASSERT(m_asyncEventQueue); 695 DCHECK(m_asyncEventQueue);
692 696
693 Event* event = Event::create(eventName); 697 Event* event = Event::create(eventName);
694 event->setTarget(this); 698 event->setTarget(this);
695 699
696 m_asyncEventQueue->enqueueEvent(event); 700 m_asyncEventQueue->enqueueEvent(event);
697 } 701 }
698 702
699 bool SourceBuffer::prepareAppend(size_t newDataSize, ExceptionState& exceptionSt ate) 703 bool SourceBuffer::prepareAppend(size_t newDataSize, ExceptionState& exceptionSt ate)
700 { 704 {
701 TRACE_EVENT_ASYNC_BEGIN0("media", "SourceBuffer::prepareAppend", this); 705 TRACE_EVENT_ASYNC_BEGIN0("media", "SourceBuffer::prepareAppend", this);
702 // http://w3c.github.io/media-source/#sourcebuffer-prepare-append 706 // http://w3c.github.io/media-source/#sourcebuffer-prepare-append
703 // 3.5.4 Prepare Append Algorithm 707 // 3.5.4 Prepare Append Algorithm
704 // 1. If the SourceBuffer has been removed from the sourceBuffers attribute of the parent media source then throw an InvalidStateError exception and abort t hese steps. 708 // 1. If the SourceBuffer has been removed from the sourceBuffers attribute of the parent media source then throw an InvalidStateError exception and abort t hese steps.
705 // 2. If the updating attribute equals true, then throw an InvalidStateError exception and abort these steps. 709 // 2. If the updating attribute equals true, then throw an InvalidStateError exception and abort these steps.
706 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat e)) { 710 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat e)) {
707 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::prepareAppend", this); 711 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::prepareAppend", this);
708 return false; 712 return false;
709 } 713 }
710 714
711 // 3. If the HTMLMediaElement.error attribute is not null, then throw an Inv alidStateError exception and abort these steps. 715 // 3. If the HTMLMediaElement.error attribute is not null, then throw an Inv alidStateError exception and abort these steps.
712 ASSERT(m_source); 716 DCHECK(m_source);
713 ASSERT(m_source->mediaElement()); 717 DCHECK(m_source->mediaElement());
714 if (m_source->mediaElement()->error()) { 718 if (m_source->mediaElement()->error()) {
715 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError, "The HTMLMediaElement.error attribute is not null."); 719 MediaSource::logAndThrowDOMException(exceptionState, InvalidStateError, "The HTMLMediaElement.error attribute is not null.");
716 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::prepareAppend", this); 720 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::prepareAppend", this);
717 return false; 721 return false;
718 } 722 }
719 723
720 // 4. If the readyState attribute of the parent media source is in the "ende d" state then run the following steps: 724 // 4. If the readyState attribute of the parent media source is in the "ende d" state then run the following steps:
721 // 1. Set the readyState attribute of the parent media source to "open" 725 // 1. Set the readyState attribute of the parent media source to "open"
722 // 2. Queue a task to fire a simple event named sourceopen at the parent media source. 726 // 2. Queue a task to fire a simple event named sourceopen at the parent media source.
723 m_source->openIfInEndedState(); 727 m_source->openIfInEndedState();
724 728
725 // 5. Run the coded frame eviction algorithm. 729 // 5. Run the coded frame eviction algorithm.
726 if (!evictCodedFrames(newDataSize)) { 730 if (!evictCodedFrames(newDataSize)) {
727 // 6. If the buffer full flag equals true, then throw a QUOTA_EXCEEDED_E RR exception and abort these steps. 731 // 6. If the buffer full flag equals true, then throw a QUOTA_EXCEEDED_E RR exception and abort these steps.
728 WTF_LOG(Media, "SourceBuffer(%p)::prepareAppend -> throw QuotaExceededEr ror", this); 732 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") -> t hrow QuotaExceededError";
729 MediaSource::logAndThrowDOMException(exceptionState, QuotaExceededError, "The SourceBuffer is full, and cannot free space to append additional buffers." ); 733 MediaSource::logAndThrowDOMException(exceptionState, QuotaExceededError, "The SourceBuffer is full, and cannot free space to append additional buffers." );
730 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::prepareAppend", this); 734 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::prepareAppend", this);
731 return false; 735 return false;
732 } 736 }
733 737
734 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::prepareAppend", this); 738 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::prepareAppend", this);
735 return true; 739 return true;
736 } 740 }
737 741
738 bool SourceBuffer::evictCodedFrames(size_t newDataSize) 742 bool SourceBuffer::evictCodedFrames(size_t newDataSize)
739 { 743 {
740 ASSERT(m_source); 744 DCHECK(m_source);
741 ASSERT(m_source->mediaElement()); 745 DCHECK(m_source->mediaElement());
742 double currentTime = m_source->mediaElement()->currentTime(); 746 double currentTime = m_source->mediaElement()->currentTime();
743 bool result = m_webSourceBuffer->evictCodedFrames(currentTime, newDataSize); 747 bool result = m_webSourceBuffer->evictCodedFrames(currentTime, newDataSize);
744 if (!result) { 748 DVLOG_IF(SOURCE_BUFFER_LOG_LEVEL, !result) << __FUNCTION__ << "(" << this << ") failed. newDataSize=" << newDataSize
745 WTF_LOG(Media, "SourceBuffer(%p)::evictCodedFrames failed. newDataSize=% zu currentTime=%f buffered=%s", this, newDataSize, currentTime, webTimeRangesToS tring(m_webSourceBuffer->buffered()).utf8().data()); 749 << " currentTime=" << currentTime << " buffered=" << webTimeRangesToString(m _webSourceBuffer->buffered());
746 }
747 return result; 750 return result;
748 } 751 }
749 752
750 void SourceBuffer::appendBufferInternal(const unsigned char* data, unsigned size , ExceptionState& exceptionState) 753 void SourceBuffer::appendBufferInternal(const unsigned char* data, unsigned size , ExceptionState& exceptionState)
751 { 754 {
752 TRACE_EVENT_ASYNC_BEGIN1("media", "SourceBuffer::appendBuffer", this, "size" , size); 755 TRACE_EVENT_ASYNC_BEGIN1("media", "SourceBuffer::appendBuffer", this, "size" , size);
753 // Section 3.2 appendBuffer() 756 // Section 3.2 appendBuffer()
754 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-appendBuffer-void-ArrayBufferView-data 757 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-appendBuffer-void-ArrayBufferView-data
755 758
756 // 1. Run the prepare append algorithm. 759 // 1. Run the prepare append algorithm.
757 if (!prepareAppend(size, exceptionState)) { 760 if (!prepareAppend(size, exceptionState)) {
758 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendBuffer", this); 761 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendBuffer", this);
759 return; 762 return;
760 } 763 }
761 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendBuffer", this, "p repareAppend"); 764 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendBuffer", this, "p repareAppend");
762 765
763 // 2. Add data to the end of the input buffer. 766 // 2. Add data to the end of the input buffer.
764 ASSERT(data || size == 0); 767 DCHECK_EQ(size, 0u);
Srirama 2016/05/23 13:46:18 Removed assert for "data" as we are already checki
wolenetz 2016/05/31 17:46:18 The original condition was correct: Caller either
Srirama 2016/06/01 11:39:35 Done.
765 if (data) 768 if (data)
766 m_pendingAppendData.append(data, size); 769 m_pendingAppendData.append(data, size);
767 m_pendingAppendDataOffset = 0; 770 m_pendingAppendDataOffset = 0;
768 771
769 // 3. Set the updating attribute to true. 772 // 3. Set the updating attribute to true.
770 m_updating = true; 773 m_updating = true;
771 774
772 // 4. Queue a task to fire a simple event named updatestart at this SourceBu ffer object. 775 // 4. Queue a task to fire a simple event named updatestart at this SourceBu ffer object.
773 scheduleEvent(EventTypeNames::updatestart); 776 scheduleEvent(EventTypeNames::updatestart);
774 777
775 // 5. Asynchronously run the buffer append algorithm. 778 // 5. Asynchronously run the buffer append algorithm.
776 m_appendBufferAsyncPartRunner->runAsync(); 779 m_appendBufferAsyncPartRunner->runAsync();
777 780
778 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendBuffer", this, "i nitialDelay"); 781 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendBuffer", this, "i nitialDelay");
779 } 782 }
780 783
781 void SourceBuffer::appendBufferAsyncPart() 784 void SourceBuffer::appendBufferAsyncPart()
782 { 785 {
783 ASSERT(m_updating); 786 DCHECK(m_updating);
784 787
785 // Section 3.5.4 Buffer Append Algorithm 788 // Section 3.5.4 Buffer Append Algorithm
786 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#sourcebuffer-buffer-append 789 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#sourcebuffer-buffer-append
787 790
788 // 1. Run the segment parser loop algorithm. 791 // 1. Run the segment parser loop algorithm.
789 // Step 2 doesn't apply since we run Step 1 synchronously here. 792 // Step 2 doesn't apply since we run Step 1 synchronously here.
790 ASSERT(m_pendingAppendData.size() >= m_pendingAppendDataOffset); 793 DCHECK_GE(m_pendingAppendData.size(), m_pendingAppendDataOffset);
791 size_t appendSize = m_pendingAppendData.size() - m_pendingAppendDataOffset; 794 size_t appendSize = m_pendingAppendData.size() - m_pendingAppendDataOffset;
792 795
793 // Impose an arbitrary max size for a single append() call so that an append 796 // Impose an arbitrary max size for a single append() call so that an append
794 // doesn't block the renderer event loop very long. This value was selected 797 // doesn't block the renderer event loop very long. This value was selected
795 // by looking at YouTube SourceBuffer usage across a variety of bitrates. 798 // by looking at YouTube SourceBuffer usage across a variety of bitrates.
796 // This value allows relatively large appends while keeping append() call 799 // This value allows relatively large appends while keeping append() call
797 // duration in the ~5-15ms range. 800 // duration in the ~5-15ms range.
798 const size_t MaxAppendSize = 128 * 1024; 801 const size_t MaxAppendSize = 128 * 1024;
799 if (appendSize > MaxAppendSize) 802 if (appendSize > MaxAppendSize)
800 appendSize = MaxAppendSize; 803 appendSize = MaxAppendSize;
(...skipping 22 matching lines...) Expand all
823 m_updating = false; 826 m_updating = false;
824 m_pendingAppendData.clear(); 827 m_pendingAppendData.clear();
825 m_pendingAppendDataOffset = 0; 828 m_pendingAppendDataOffset = 0;
826 829
827 // 4. Queue a task to fire a simple event named update at this SourceBuffer object. 830 // 4. Queue a task to fire a simple event named update at this SourceBuffer object.
828 scheduleEvent(EventTypeNames::update); 831 scheduleEvent(EventTypeNames::update);
829 832
830 // 5. Queue a task to fire a simple event named updateend at this SourceBuff er object. 833 // 5. Queue a task to fire a simple event named updateend at this SourceBuff er object.
831 scheduleEvent(EventTypeNames::updateend); 834 scheduleEvent(EventTypeNames::updateend);
832 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendBuffer", this); 835 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendBuffer", this);
833 WTF_LOG(Media, "SourceBuffer(%p)::appendBuffer ended. buffered=%s", this, we bTimeRangesToString(m_webSourceBuffer->buffered()).utf8().data()); 836 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") ended. b uffered=" << webTimeRangesToString(m_webSourceBuffer->buffered());
834 } 837 }
835 838
836 void SourceBuffer::removeAsyncPart() 839 void SourceBuffer::removeAsyncPart()
837 { 840 {
838 ASSERT(m_updating); 841 DCHECK(m_updating);
839 ASSERT(m_pendingRemoveStart >= 0); 842 DCHECK_GE(m_pendingRemoveStart, 0);
840 ASSERT(m_pendingRemoveStart < m_pendingRemoveEnd); 843 DCHECK_LT(m_pendingRemoveStart, m_pendingRemoveEnd);
841 844
842 // Section 3.2 remove() method steps 845 // Section 3.2 remove() method steps
843 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-remove-void-double-start-double-end 846 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-remove-void-double-start-double-end
844 847
845 // 9. Run the coded frame removal algorithm with start and end as the start and end of the removal range. 848 // 9. Run the coded frame removal algorithm with start and end as the start and end of the removal range.
846 m_webSourceBuffer->remove(m_pendingRemoveStart, m_pendingRemoveEnd); 849 m_webSourceBuffer->remove(m_pendingRemoveStart, m_pendingRemoveEnd);
847 850
848 // 10. Set the updating attribute to false. 851 // 10. Set the updating attribute to false.
849 m_updating = false; 852 m_updating = false;
850 m_pendingRemoveStart = -1; 853 m_pendingRemoveStart = -1;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 888
886 // 4. Asynchronously run the stream append loop algorithm with stream and ma xSize. 889 // 4. Asynchronously run the stream append loop algorithm with stream and ma xSize.
887 stream->neuter(); 890 stream->neuter();
888 m_loader = FileReaderLoader::create(FileReaderLoader::ReadByClient, this); 891 m_loader = FileReaderLoader::create(FileReaderLoader::ReadByClient, this);
889 m_stream = stream; 892 m_stream = stream;
890 m_appendStreamAsyncPartRunner->runAsync(); 893 m_appendStreamAsyncPartRunner->runAsync();
891 } 894 }
892 895
893 void SourceBuffer::appendStreamAsyncPart() 896 void SourceBuffer::appendStreamAsyncPart()
894 { 897 {
895 ASSERT(m_updating); 898 DCHECK(m_updating);
896 ASSERT(m_loader); 899 DCHECK(m_loader);
897 ASSERT(m_stream); 900 DCHECK(m_stream);
898 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendStream", this, "a ppendStreamAsyncPart"); 901 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendStream", this, "a ppendStreamAsyncPart");
899 902
900 // Section 3.5.6 Stream Append Loop 903 // Section 3.5.6 Stream Append Loop
901 // http://w3c.github.io/media-source/#sourcebuffer-stream-append-loop 904 // http://w3c.github.io/media-source/#sourcebuffer-stream-append-loop
902 905
903 // 1. If maxSize is set, then let bytesLeft equal maxSize. 906 // 1. If maxSize is set, then let bytesLeft equal maxSize.
904 // 2. Loop Top: If maxSize is set and bytesLeft equals 0, then jump to the l oop done step below. 907 // 2. Loop Top: If maxSize is set and bytesLeft equals 0, then jump to the l oop done step below.
905 if (m_streamMaxSizeValid && !m_streamMaxSize) { 908 if (m_streamMaxSizeValid && !m_streamMaxSize) {
906 appendStreamDone(true); 909 appendStreamDone(true);
907 return; 910 return;
908 } 911 }
909 912
910 // Steps 3-11 are handled by m_loader. 913 // Steps 3-11 are handled by m_loader.
911 // Note: Passing 0 here signals that maxSize was not set. (i.e. Read all the data in the stream). 914 // Note: Passing 0 here signals that maxSize was not set. (i.e. Read all the data in the stream).
912 m_loader->start(getExecutionContext(), *m_stream, m_streamMaxSizeValid ? m_s treamMaxSize : 0); 915 m_loader->start(getExecutionContext(), *m_stream, m_streamMaxSizeValid ? m_s treamMaxSize : 0);
913 } 916 }
914 917
915 void SourceBuffer::appendStreamDone(bool success) 918 void SourceBuffer::appendStreamDone(bool success)
916 { 919 {
917 ASSERT(m_updating); 920 DCHECK(m_updating);
918 ASSERT(m_loader); 921 DCHECK(m_loader);
919 ASSERT(m_stream); 922 DCHECK(m_stream);
920 923
921 clearAppendStreamState(); 924 clearAppendStreamState();
922 925
923 if (!success) { 926 if (!success) {
924 appendError(false); 927 appendError(false);
925 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this); 928 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this);
926 return; 929 return;
927 } 930 }
928 931
929 // Section 3.5.6 Stream Append Loop 932 // Section 3.5.6 Stream Append Loop
930 // Steps 1-11 are handled by appendStreamAsyncPart(), |m_loader|, and |m_web SourceBuffer|. 933 // Steps 1-11 are handled by appendStreamAsyncPart(), |m_loader|, and |m_web SourceBuffer|.
931 934
932 // 12. Loop Done: Set the updating attribute to false. 935 // 12. Loop Done: Set the updating attribute to false.
933 m_updating = false; 936 m_updating = false;
934 937
935 // 13. Queue a task to fire a simple event named update at this SourceBuffer object. 938 // 13. Queue a task to fire a simple event named update at this SourceBuffer object.
936 scheduleEvent(EventTypeNames::update); 939 scheduleEvent(EventTypeNames::update);
937 940
938 // 14. Queue a task to fire a simple event named updateend at this SourceBuf fer object. 941 // 14. Queue a task to fire a simple event named updateend at this SourceBuf fer object.
939 scheduleEvent(EventTypeNames::updateend); 942 scheduleEvent(EventTypeNames::updateend);
940 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this); 943 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this);
941 WTF_LOG(Media, "SourceBuffer(%p)::appendStream ended. buffered=%s", this, we bTimeRangesToString(m_webSourceBuffer->buffered()).utf8().data()); 944 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") ended. b uffered=" << webTimeRangesToString(m_webSourceBuffer->buffered());
942 } 945 }
943 946
944 void SourceBuffer::clearAppendStreamState() 947 void SourceBuffer::clearAppendStreamState()
945 { 948 {
946 m_streamMaxSizeValid = false; 949 m_streamMaxSizeValid = false;
947 m_streamMaxSize = 0; 950 m_streamMaxSize = 0;
948 m_loader.clear(); 951 m_loader.clear();
949 m_stream = nullptr; 952 m_stream = nullptr;
950 } 953 }
951 954
952 void SourceBuffer::appendError(bool decodeError) 955 void SourceBuffer::appendError(bool decodeError)
953 { 956 {
954 WTF_LOG(Media, "SourceBuffer::appendError %p decodeError=%d", this, decodeEr ror); 957 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") decodeEr ror=" << decodeError;
955 // Section 3.5.3 Append Error Algorithm 958 // Section 3.5.3 Append Error Algorithm
956 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#sourcebuffer-append-error 959 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#sourcebuffer-append-error
957 960
958 // 1. Run the reset parser state algorithm. 961 // 1. Run the reset parser state algorithm.
959 m_webSourceBuffer->resetParserState(); 962 m_webSourceBuffer->resetParserState();
960 963
961 // 2. Set the updating attribute to false. 964 // 2. Set the updating attribute to false.
962 m_updating = false; 965 m_updating = false;
963 966
964 // 3. Queue a task to fire a simple event named error at this SourceBuffer o bject. 967 // 3. Queue a task to fire a simple event named error at this SourceBuffer o bject.
965 scheduleEvent(EventTypeNames::error); 968 scheduleEvent(EventTypeNames::error);
966 969
967 // 4. Queue a task to fire a simple event named updateend at this SourceBuff er object. 970 // 4. Queue a task to fire a simple event named updateend at this SourceBuff er object.
968 scheduleEvent(EventTypeNames::updateend); 971 scheduleEvent(EventTypeNames::updateend);
969 972
970 // 5. If decode error is true, then run the end of stream algorithm with the 973 // 5. If decode error is true, then run the end of stream algorithm with the
971 // error parameter set to "decode". 974 // error parameter set to "decode".
972 if (decodeError) 975 if (decodeError)
973 m_source->endOfStream("decode", ASSERT_NO_EXCEPTION); 976 m_source->endOfStream("decode", ASSERT_NO_EXCEPTION);
974 } 977 }
975 978
976 void SourceBuffer::didStartLoading() 979 void SourceBuffer::didStartLoading()
977 { 980 {
978 WTF_LOG(Media, "SourceBuffer(%p)::didStartLoading", this); 981 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ")";
979 } 982 }
980 983
981 void SourceBuffer::didReceiveDataForClient(const char* data, unsigned dataLength ) 984 void SourceBuffer::didReceiveDataForClient(const char* data, unsigned dataLength )
982 { 985 {
983 WTF_LOG(Media, "SourceBuffer(%p)::didReceiveDataForClient dataLength=%u", th is, dataLength); 986 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") dataLeng th=" << dataLength;
984 ASSERT(m_updating); 987 DCHECK(m_updating);
985 ASSERT(m_loader); 988 DCHECK(m_loader);
986 989
987 // Section 3.5.6 Stream Append Loop 990 // Section 3.5.6 Stream Append Loop
988 // http://w3c.github.io/media-source/#sourcebuffer-stream-append-loop 991 // http://w3c.github.io/media-source/#sourcebuffer-stream-append-loop
989 992
990 // 10. Run the coded frame eviction algorithm. 993 // 10. Run the coded frame eviction algorithm.
991 if (!evictCodedFrames(dataLength)) { 994 if (!evictCodedFrames(dataLength)) {
992 // 11. (in appendStreamDone) If the buffer full flag equals true, then r un the append error algorithm with the decode error parameter set to false and a bort this algorithm. 995 // 11. (in appendStreamDone) If the buffer full flag equals true, then r un the append error algorithm with the decode error parameter set to false and a bort this algorithm.
993 appendStreamDone(false); 996 appendStreamDone(false);
994 return; 997 return;
995 } 998 }
996 999
997 m_webSourceBuffer->append(reinterpret_cast<const unsigned char*>(data), data Length, &m_timestampOffset); 1000 m_webSourceBuffer->append(reinterpret_cast<const unsigned char*>(data), data Length, &m_timestampOffset);
998 } 1001 }
999 1002
1000 void SourceBuffer::didFinishLoading() 1003 void SourceBuffer::didFinishLoading()
1001 { 1004 {
1002 WTF_LOG(Media, "SourceBuffer(%p)::didFinishLoading", this); 1005 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ")";
1003 ASSERT(m_loader); 1006 DCHECK(m_loader);
1004 appendStreamDone(true); 1007 appendStreamDone(true);
1005 } 1008 }
1006 1009
1007 void SourceBuffer::didFail(FileError::ErrorCode errorCode) 1010 void SourceBuffer::didFail(FileError::ErrorCode errorCode)
1008 { 1011 {
1009 WTF_LOG(Media, "SourceBuffer(%p)::didFail errorCode=%d", this, errorCode); 1012 DVLOG(SOURCE_BUFFER_LOG_LEVEL) << __FUNCTION__ << "(" << this << ") errorCod e=" << errorCode;
1010 // m_loader might be already released, in case appendStream has failed due 1013 // m_loader might be already released, in case appendStream has failed due
1011 // to evictCodedFrames failing in didReceiveDataForClient. In that case 1014 // to evictCodedFrames failing in didReceiveDataForClient. In that case
1012 // appendStreamDone will be invoked from there, no need to repeat it here. 1015 // appendStreamDone will be invoked from there, no need to repeat it here.
1013 if (m_loader) 1016 if (m_loader)
1014 appendStreamDone(false); 1017 appendStreamDone(false);
1015 } 1018 }
1016 1019
1017 DEFINE_TRACE(SourceBuffer) 1020 DEFINE_TRACE(SourceBuffer)
1018 { 1021 {
1019 visitor->trace(m_source); 1022 visitor->trace(m_source);
1020 visitor->trace(m_trackDefaults); 1023 visitor->trace(m_trackDefaults);
1021 visitor->trace(m_asyncEventQueue); 1024 visitor->trace(m_asyncEventQueue);
1022 visitor->trace(m_appendBufferAsyncPartRunner); 1025 visitor->trace(m_appendBufferAsyncPartRunner);
1023 visitor->trace(m_removeAsyncPartRunner); 1026 visitor->trace(m_removeAsyncPartRunner);
1024 visitor->trace(m_appendStreamAsyncPartRunner); 1027 visitor->trace(m_appendStreamAsyncPartRunner);
1025 visitor->trace(m_stream); 1028 visitor->trace(m_stream);
1026 visitor->trace(m_audioTracks); 1029 visitor->trace(m_audioTracks);
1027 visitor->trace(m_videoTracks); 1030 visitor->trace(m_videoTracks);
1028 EventTargetWithInlineData::trace(visitor); 1031 EventTargetWithInlineData::trace(visitor);
1029 ActiveDOMObject::trace(visitor); 1032 ActiveDOMObject::trace(visitor);
1030 } 1033 }
1031 1034
1032 } // namespace blink 1035 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698