OLD | NEW |
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 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 | 352 |
353 // 2. If the readyState attribute is not "open" then throw an InvalidStateEr
ror | 353 // 2. If the readyState attribute is not "open" then throw an InvalidStateEr
ror |
354 // exception and abort these steps. | 354 // exception and abort these steps. |
355 // 3. If the updating attribute equals true on any SourceBuffer in sourceBuf
fers, | 355 // 3. If the updating attribute equals true on any SourceBuffer in sourceBuf
fers, |
356 // then throw an InvalidStateError exception and abort these steps. | 356 // then throw an InvalidStateError exception and abort these steps. |
357 if (throwExceptionIfClosedOrUpdating(isOpen(), isUpdating(), exceptionState)
) | 357 if (throwExceptionIfClosedOrUpdating(isOpen(), isUpdating(), exceptionState)
) |
358 return; | 358 return; |
359 | 359 |
360 // 4. Run the duration change algorithm with new duration set to the value b
eing | 360 // 4. Run the duration change algorithm with new duration set to the value b
eing |
361 // assigned to this attribute. | 361 // assigned to this attribute. |
362 // Synchronously process duration change algorithm to enforce any required | 362 durationChangeAlgorithm(duration); |
363 // seek is started prior to returning. | 363 } |
364 m_attachedElement->durationChanged(duration); | 364 |
365 m_webMediaSource->setDuration(duration); | 365 void MediaSource::durationChangeAlgorithm(double newDuration) |
| 366 { |
| 367 // Section 2.6.4 Duration change |
| 368 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou
rce.html#duration-change-algorithm |
| 369 // 1. If the current value of duration is equal to new duration, then return
. |
| 370 if (newDuration == duration()) |
| 371 return; |
| 372 |
| 373 // 2. Set old duration to the current value of duration. |
| 374 double oldDuration = duration(); |
| 375 |
| 376 bool requestSeek = m_attachedElement->currentTime() > newDuration; |
| 377 |
| 378 // 3. Update duration to new duration. |
| 379 m_webMediaSource->setDuration(newDuration); |
| 380 |
| 381 // 4. If the new duration is less than old duration, then call remove(new du
ration, old duration) on all all objects in sourceBuffers. |
| 382 if (newDuration < oldDuration) { |
| 383 for (size_t i = 0; i < m_sourceBuffers->length(); ++i) |
| 384 m_sourceBuffers->item(i)->remove(newDuration, oldDuration, ASSERT_NO
_EXCEPTION); |
| 385 } |
| 386 |
| 387 // 5. If a user agent is unable to partially render audio frames or text cue
s that start before and end after the duration, then run the following steps: |
| 388 // NOTE: Currently we assume that the media engine is able to render partial
frames/cues. If a media |
| 389 // engine gets added that doesn't support this, then we'll need to add logic
to handle the substeps. |
| 390 |
| 391 // 6. Update the media controller duration to new duration and run the HTMLM
ediaElement duration change algorithm. |
| 392 m_attachedElement->durationChanged(newDuration, requestSeek); |
366 } | 393 } |
367 | 394 |
368 void MediaSource::setReadyState(const AtomicString& state) | 395 void MediaSource::setReadyState(const AtomicString& state) |
369 { | 396 { |
370 ASSERT(state == openKeyword() || state == closedKeyword() || state == endedK
eyword()); | 397 ASSERT(state == openKeyword() || state == closedKeyword() || state == endedK
eyword()); |
371 | 398 |
372 AtomicString oldState = readyState(); | 399 AtomicString oldState = readyState(); |
373 WTF_LOG(Media, "MediaSource::setReadyState() %p : %s -> %s", this, oldState.
ascii().data(), state.ascii().data()); | 400 WTF_LOG(Media, "MediaSource::setReadyState() %p : %s -> %s", this, oldState.
ascii().data(), state.ascii().data()); |
374 | 401 |
375 if (state == closedKeyword()) { | 402 if (state == closedKeyword()) { |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 | 544 |
518 m_asyncEventQueue->enqueueEvent(event.release()); | 545 m_asyncEventQueue->enqueueEvent(event.release()); |
519 } | 546 } |
520 | 547 |
521 URLRegistry& MediaSource::registry() const | 548 URLRegistry& MediaSource::registry() const |
522 { | 549 { |
523 return MediaSourceRegistry::registry(); | 550 return MediaSourceRegistry::registry(); |
524 } | 551 } |
525 | 552 |
526 } // namespace WebCore | 553 } // namespace WebCore |
OLD | NEW |