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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 , m_source(source) | 104 , m_source(source) |
105 , m_trackDefaults(TrackDefaultList::create()) | 105 , m_trackDefaults(TrackDefaultList::create()) |
106 , m_asyncEventQueue(asyncEventQueue) | 106 , m_asyncEventQueue(asyncEventQueue) |
107 , m_mode(segmentsKeyword()) | 107 , m_mode(segmentsKeyword()) |
108 , m_updating(false) | 108 , m_updating(false) |
109 , m_timestampOffset(0) | 109 , m_timestampOffset(0) |
110 , m_appendWindowStart(0) | 110 , m_appendWindowStart(0) |
111 , m_appendWindowEnd(std::numeric_limits<double>::infinity()) | 111 , m_appendWindowEnd(std::numeric_limits<double>::infinity()) |
112 , m_firstInitializationSegmentReceived(false) | 112 , m_firstInitializationSegmentReceived(false) |
113 , m_pendingAppendDataOffset(0) | 113 , m_pendingAppendDataOffset(0) |
114 , m_appendBufferAsyncPartRunner(this, &SourceBuffer::appendBufferAsyncPart) | 114 , m_appendBufferAsyncPartRunner(AsyncMethodRunner<SourceBuffer>::create(this
, &SourceBuffer::appendBufferAsyncPart)) |
115 , m_pendingRemoveStart(-1) | 115 , m_pendingRemoveStart(-1) |
116 , m_pendingRemoveEnd(-1) | 116 , m_pendingRemoveEnd(-1) |
117 , m_removeAsyncPartRunner(this, &SourceBuffer::removeAsyncPart) | 117 , m_removeAsyncPartRunner(AsyncMethodRunner<SourceBuffer>::create(this, &Sou
rceBuffer::removeAsyncPart)) |
118 , m_streamMaxSizeValid(false) | 118 , m_streamMaxSizeValid(false) |
119 , m_streamMaxSize(0) | 119 , m_streamMaxSize(0) |
120 , m_appendStreamAsyncPartRunner(this, &SourceBuffer::appendStreamAsyncPart) | 120 , m_appendStreamAsyncPartRunner(AsyncMethodRunner<SourceBuffer>::create(this
, &SourceBuffer::appendStreamAsyncPart)) |
121 { | 121 { |
122 ASSERT(m_webSourceBuffer); | 122 ASSERT(m_webSourceBuffer); |
123 ASSERT(m_source); | 123 ASSERT(m_source); |
124 m_webSourceBuffer->setClient(this); | 124 m_webSourceBuffer->setClient(this); |
125 } | 125 } |
126 | 126 |
127 SourceBuffer::~SourceBuffer() | 127 SourceBuffer::~SourceBuffer() |
128 { | 128 { |
129 // Oilpan: a SourceBuffer might be finalized without having been | 129 // Oilpan: a SourceBuffer might be finalized without having been |
130 // explicitly removed first, hence the asserts below will not | 130 // explicitly removed first, hence the asserts below will not |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 // 7. Run the range removal algorithm with start and end as the start and en
d of the removal range. | 387 // 7. Run the range removal algorithm with start and end as the start and en
d of the removal range. |
388 // 7.3. Set the updating attribute to true. | 388 // 7.3. Set the updating attribute to true. |
389 m_updating = true; | 389 m_updating = true; |
390 | 390 |
391 // 7.4. Queue a task to fire a simple event named updatestart at this Source
Buffer object. | 391 // 7.4. Queue a task to fire a simple event named updatestart at this Source
Buffer object. |
392 scheduleEvent(EventTypeNames::updatestart); | 392 scheduleEvent(EventTypeNames::updatestart); |
393 | 393 |
394 // 7.5. Return control to the caller and run the rest of the steps asynchron
ously. | 394 // 7.5. Return control to the caller and run the rest of the steps asynchron
ously. |
395 m_pendingRemoveStart = start; | 395 m_pendingRemoveStart = start; |
396 m_pendingRemoveEnd = end; | 396 m_pendingRemoveEnd = end; |
397 m_removeAsyncPartRunner.runAsync(); | 397 m_removeAsyncPartRunner->runAsync(); |
398 } | 398 } |
399 | 399 |
400 void SourceBuffer::setTrackDefaults(TrackDefaultList* trackDefaults, ExceptionSt
ate& exceptionState) | 400 void SourceBuffer::setTrackDefaults(TrackDefaultList* trackDefaults, ExceptionSt
ate& exceptionState) |
401 { | 401 { |
402 // Per 02 Dec 2014 Editor's Draft | 402 // Per 02 Dec 2014 Editor's Draft |
403 // http://w3c.github.io/media-source/#widl-SourceBuffer-trackDefaults | 403 // http://w3c.github.io/media-source/#widl-SourceBuffer-trackDefaults |
404 // 1. If this object has been removed from the sourceBuffers attribute of | 404 // 1. If this object has been removed from the sourceBuffers attribute of |
405 // the parent media source, then throw an InvalidStateError exception | 405 // the parent media source, then throw an InvalidStateError exception |
406 // and abort these steps. | 406 // and abort these steps. |
407 // 2. If the updating attribute equals true, then throw an InvalidStateError | 407 // 2. If the updating attribute equals true, then throw an InvalidStateError |
(...skipping 18 matching lines...) Expand all Loading... |
426 traceEventName = "SourceBuffer::appendBuffer"; | 426 traceEventName = "SourceBuffer::appendBuffer"; |
427 } else if (m_stream) { | 427 } else if (m_stream) { |
428 traceEventName = "SourceBuffer::appendStream"; | 428 traceEventName = "SourceBuffer::appendStream"; |
429 } else if (m_pendingRemoveStart != -1) { | 429 } else if (m_pendingRemoveStart != -1) { |
430 traceEventName = "SourceBuffer::remove"; | 430 traceEventName = "SourceBuffer::remove"; |
431 } else { | 431 } else { |
432 ASSERT_NOT_REACHED(); | 432 ASSERT_NOT_REACHED(); |
433 } | 433 } |
434 | 434 |
435 // 3.1. Abort the buffer append and stream append loop algorithms if they ar
e running. | 435 // 3.1. Abort the buffer append and stream append loop algorithms if they ar
e running. |
436 m_appendBufferAsyncPartRunner.stop(); | 436 m_appendBufferAsyncPartRunner->stop(); |
437 m_pendingAppendData.clear(); | 437 m_pendingAppendData.clear(); |
438 m_pendingAppendDataOffset = 0; | 438 m_pendingAppendDataOffset = 0; |
439 | 439 |
440 m_removeAsyncPartRunner.stop(); | 440 m_removeAsyncPartRunner->stop(); |
441 m_pendingRemoveStart = -1; | 441 m_pendingRemoveStart = -1; |
442 m_pendingRemoveEnd = -1; | 442 m_pendingRemoveEnd = -1; |
443 | 443 |
444 m_appendStreamAsyncPartRunner.stop(); | 444 m_appendStreamAsyncPartRunner->stop(); |
445 clearAppendStreamState(); | 445 clearAppendStreamState(); |
446 | 446 |
447 // 3.2. Set the updating attribute to false. | 447 // 3.2. Set the updating attribute to false. |
448 m_updating = false; | 448 m_updating = false; |
449 | 449 |
450 // 3.3. Queue a task to fire a simple event named abort at this SourceBuffer
object. | 450 // 3.3. Queue a task to fire a simple event named abort at this SourceBuffer
object. |
451 scheduleEvent(EventTypeNames::abort); | 451 scheduleEvent(EventTypeNames::abort); |
452 | 452 |
453 // 3.4. Queue a task to fire a simple event named updateend at this SourceBu
ffer object. | 453 // 3.4. Queue a task to fire a simple event named updateend at this SourceBu
ffer object. |
454 scheduleEvent(EventTypeNames::updateend); | 454 scheduleEvent(EventTypeNames::updateend); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 } | 494 } |
495 } | 495 } |
496 | 496 |
497 bool SourceBuffer::hasPendingActivity() const | 497 bool SourceBuffer::hasPendingActivity() const |
498 { | 498 { |
499 return m_source; | 499 return m_source; |
500 } | 500 } |
501 | 501 |
502 void SourceBuffer::suspend() | 502 void SourceBuffer::suspend() |
503 { | 503 { |
504 m_appendBufferAsyncPartRunner.suspend(); | 504 m_appendBufferAsyncPartRunner->suspend(); |
505 m_removeAsyncPartRunner.suspend(); | 505 m_removeAsyncPartRunner->suspend(); |
506 m_appendStreamAsyncPartRunner.suspend(); | 506 m_appendStreamAsyncPartRunner->suspend(); |
507 } | 507 } |
508 | 508 |
509 void SourceBuffer::resume() | 509 void SourceBuffer::resume() |
510 { | 510 { |
511 m_appendBufferAsyncPartRunner.resume(); | 511 m_appendBufferAsyncPartRunner->resume(); |
512 m_removeAsyncPartRunner.resume(); | 512 m_removeAsyncPartRunner->resume(); |
513 m_appendStreamAsyncPartRunner.resume(); | 513 m_appendStreamAsyncPartRunner->resume(); |
514 } | 514 } |
515 | 515 |
516 void SourceBuffer::stop() | 516 void SourceBuffer::stop() |
517 { | 517 { |
518 m_appendBufferAsyncPartRunner.stop(); | 518 m_appendBufferAsyncPartRunner->stop(); |
519 m_removeAsyncPartRunner.stop(); | 519 m_removeAsyncPartRunner->stop(); |
520 m_appendStreamAsyncPartRunner.stop(); | 520 m_appendStreamAsyncPartRunner->stop(); |
521 } | 521 } |
522 | 522 |
523 ExecutionContext* SourceBuffer::executionContext() const | 523 ExecutionContext* SourceBuffer::executionContext() const |
524 { | 524 { |
525 return ActiveDOMObject::executionContext(); | 525 return ActiveDOMObject::executionContext(); |
526 } | 526 } |
527 | 527 |
528 const AtomicString& SourceBuffer::interfaceName() const | 528 const AtomicString& SourceBuffer::interfaceName() const |
529 { | 529 { |
530 return EventTargetNames::SourceBuffer; | 530 return EventTargetNames::SourceBuffer; |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 m_pendingAppendData.append(data, size); | 615 m_pendingAppendData.append(data, size); |
616 m_pendingAppendDataOffset = 0; | 616 m_pendingAppendDataOffset = 0; |
617 | 617 |
618 // 3. Set the updating attribute to true. | 618 // 3. Set the updating attribute to true. |
619 m_updating = true; | 619 m_updating = true; |
620 | 620 |
621 // 4. Queue a task to fire a simple event named updatestart at this SourceBu
ffer object. | 621 // 4. Queue a task to fire a simple event named updatestart at this SourceBu
ffer object. |
622 scheduleEvent(EventTypeNames::updatestart); | 622 scheduleEvent(EventTypeNames::updatestart); |
623 | 623 |
624 // 5. Asynchronously run the buffer append algorithm. | 624 // 5. Asynchronously run the buffer append algorithm. |
625 m_appendBufferAsyncPartRunner.runAsync(); | 625 m_appendBufferAsyncPartRunner->runAsync(); |
626 | 626 |
627 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendBuffer", this, "i
nitialDelay"); | 627 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendBuffer", this, "i
nitialDelay"); |
628 } | 628 } |
629 | 629 |
630 void SourceBuffer::appendBufferAsyncPart() | 630 void SourceBuffer::appendBufferAsyncPart() |
631 { | 631 { |
632 ASSERT(m_updating); | 632 ASSERT(m_updating); |
633 | 633 |
634 // Section 3.5.4 Buffer Append Algorithm | 634 // Section 3.5.4 Buffer Append Algorithm |
635 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou
rce.html#sourcebuffer-buffer-append | 635 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou
rce.html#sourcebuffer-buffer-append |
(...skipping 20 matching lines...) Expand all Loading... |
656 unsigned char zero = 0; | 656 unsigned char zero = 0; |
657 unsigned char* appendData = &zero; | 657 unsigned char* appendData = &zero; |
658 if (appendSize) | 658 if (appendSize) |
659 appendData = m_pendingAppendData.data() + m_pendingAppendDataOffset; | 659 appendData = m_pendingAppendData.data() + m_pendingAppendDataOffset; |
660 | 660 |
661 m_webSourceBuffer->append(appendData, appendSize, &m_timestampOffset); | 661 m_webSourceBuffer->append(appendData, appendSize, &m_timestampOffset); |
662 | 662 |
663 m_pendingAppendDataOffset += appendSize; | 663 m_pendingAppendDataOffset += appendSize; |
664 | 664 |
665 if (m_pendingAppendDataOffset < m_pendingAppendData.size()) { | 665 if (m_pendingAppendDataOffset < m_pendingAppendData.size()) { |
666 m_appendBufferAsyncPartRunner.runAsync(); | 666 m_appendBufferAsyncPartRunner->runAsync(); |
667 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendBuffer", this
, "nextPieceDelay"); | 667 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendBuffer", this
, "nextPieceDelay"); |
668 return; | 668 return; |
669 } | 669 } |
670 | 670 |
671 // 3. Set the updating attribute to false. | 671 // 3. Set the updating attribute to false. |
672 m_updating = false; | 672 m_updating = false; |
673 m_pendingAppendData.clear(); | 673 m_pendingAppendData.clear(); |
674 m_pendingAppendDataOffset = 0; | 674 m_pendingAppendDataOffset = 0; |
675 | 675 |
676 // 4. Queue a task to fire a simple event named update at this SourceBuffer
object. | 676 // 4. Queue a task to fire a simple event named update at this SourceBuffer
object. |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 // 2. Set the updating attribute to true. | 729 // 2. Set the updating attribute to true. |
730 m_updating = true; | 730 m_updating = true; |
731 | 731 |
732 // 3. Queue a task to fire a simple event named updatestart at this SourceBu
ffer object. | 732 // 3. Queue a task to fire a simple event named updatestart at this SourceBu
ffer object. |
733 scheduleEvent(EventTypeNames::updatestart); | 733 scheduleEvent(EventTypeNames::updatestart); |
734 | 734 |
735 // 4. Asynchronously run the stream append loop algorithm with stream and ma
xSize. | 735 // 4. Asynchronously run the stream append loop algorithm with stream and ma
xSize. |
736 stream->neuter(); | 736 stream->neuter(); |
737 m_loader = FileReaderLoader::create(FileReaderLoader::ReadByClient, this); | 737 m_loader = FileReaderLoader::create(FileReaderLoader::ReadByClient, this); |
738 m_stream = stream; | 738 m_stream = stream; |
739 m_appendStreamAsyncPartRunner.runAsync(); | 739 m_appendStreamAsyncPartRunner->runAsync(); |
740 } | 740 } |
741 | 741 |
742 void SourceBuffer::appendStreamAsyncPart() | 742 void SourceBuffer::appendStreamAsyncPart() |
743 { | 743 { |
744 ASSERT(m_updating); | 744 ASSERT(m_updating); |
745 ASSERT(m_loader); | 745 ASSERT(m_loader); |
746 ASSERT(m_stream); | 746 ASSERT(m_stream); |
747 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendStream", this, "a
ppendStreamAsyncPart"); | 747 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendStream", this, "a
ppendStreamAsyncPart"); |
748 | 748 |
749 // Section 3.5.6 Stream Append Loop | 749 // Section 3.5.6 Stream Append Loop |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
859 // m_loader might be already released, in case appendStream has failed due | 859 // m_loader might be already released, in case appendStream has failed due |
860 // to evictCodedFrames failing in didReceiveDataForClient. In that case | 860 // to evictCodedFrames failing in didReceiveDataForClient. In that case |
861 // appendStreamDone will be invoked from there, no need to repeat it here. | 861 // appendStreamDone will be invoked from there, no need to repeat it here. |
862 if (m_loader) | 862 if (m_loader) |
863 appendStreamDone(false); | 863 appendStreamDone(false); |
864 } | 864 } |
865 | 865 |
866 DEFINE_TRACE(SourceBuffer) | 866 DEFINE_TRACE(SourceBuffer) |
867 { | 867 { |
868 visitor->trace(m_source); | 868 visitor->trace(m_source); |
869 visitor->trace(m_stream); | |
870 visitor->trace(m_trackDefaults); | 869 visitor->trace(m_trackDefaults); |
871 visitor->trace(m_asyncEventQueue); | 870 visitor->trace(m_asyncEventQueue); |
| 871 visitor->trace(m_appendBufferAsyncPartRunner); |
| 872 visitor->trace(m_removeAsyncPartRunner); |
| 873 visitor->trace(m_appendStreamAsyncPartRunner); |
| 874 visitor->trace(m_stream); |
872 RefCountedGarbageCollectedEventTargetWithInlineData<SourceBuffer>::trace(vis
itor); | 875 RefCountedGarbageCollectedEventTargetWithInlineData<SourceBuffer>::trace(vis
itor); |
873 ActiveDOMObject::trace(visitor); | 876 ActiveDOMObject::trace(visitor); |
874 } | 877 } |
875 | 878 |
876 } // namespace blink | 879 } // namespace blink |
OLD | NEW |