| 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 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 // 1. If this object has been removed from the sourceBuffers attribute of t
he parent media source then throw an InvalidStateError exception and abort these
steps. | 506 // 1. If this object has been removed from the sourceBuffers attribute of t
he parent media source then throw an InvalidStateError exception and abort these
steps. |
| 507 // 2. If the updating attribute equals true, then throw an InvalidStateErro
r exception and abort these steps. | 507 // 2. If the updating attribute equals true, then throw an InvalidStateErro
r exception and abort these steps. |
| 508 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat
e)) | 508 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat
e)) |
| 509 return; | 509 return; |
| 510 | 510 |
| 511 TRACE_EVENT_ASYNC_BEGIN1("media", "SourceBuffer::appendBuffer", this, "size"
, size); | 511 TRACE_EVENT_ASYNC_BEGIN1("media", "SourceBuffer::appendBuffer", this, "size"
, size); |
| 512 | 512 |
| 513 // 3. If the readyState attribute of the parent media source is in the "end
ed" state then run the following steps: ... | 513 // 3. If the readyState attribute of the parent media source is in the "end
ed" state then run the following steps: ... |
| 514 m_source->openIfInEndedState(); | 514 m_source->openIfInEndedState(); |
| 515 | 515 |
| 516 // Steps 4-5 - end "prepare append" algorithm. | 516 // 4. Run the coded frame eviction algorithm. |
| 517 if (!evictCodedFrames()) { |
| 518 // 5. If the buffer full flag equals true, then throw a QUOTA_EXCEEDED_
ERR exception and abort these steps. |
| 519 exceptionState.throwDOMException(QuotaExceededError, "The SourceBuffer i
s full, and cannot free space to append additional buffers."); |
| 520 return; |
| 521 } |
| 517 | 522 |
| 518 // 2. Add data to the end of the input buffer. | 523 // 2. Add data to the end of the input buffer. |
| 519 ASSERT(data || size == 0); | 524 ASSERT(data || size == 0); |
| 520 if (data) | 525 if (data) |
| 521 m_pendingAppendData.append(data, size); | 526 m_pendingAppendData.append(data, size); |
| 522 m_pendingAppendDataOffset = 0; | 527 m_pendingAppendDataOffset = 0; |
| 523 | 528 |
| 524 // 3. Set the updating attribute to true. | 529 // 3. Set the updating attribute to true. |
| 525 m_updating = true; | 530 m_updating = true; |
| 526 | 531 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 604 m_pendingRemoveStart = -1; | 609 m_pendingRemoveStart = -1; |
| 605 m_pendingRemoveEnd = -1; | 610 m_pendingRemoveEnd = -1; |
| 606 | 611 |
| 607 // 11. Queue a task to fire a simple event named update at this SourceBuffer
object. | 612 // 11. Queue a task to fire a simple event named update at this SourceBuffer
object. |
| 608 scheduleEvent(EventTypeNames::update); | 613 scheduleEvent(EventTypeNames::update); |
| 609 | 614 |
| 610 // 12. Queue a task to fire a simple event named updateend at this SourceBuf
fer object. | 615 // 12. Queue a task to fire a simple event named updateend at this SourceBuf
fer object. |
| 611 scheduleEvent(EventTypeNames::updateend); | 616 scheduleEvent(EventTypeNames::updateend); |
| 612 } | 617 } |
| 613 | 618 |
| 619 bool SourceBuffer::evictCodedFrames() |
| 620 { |
| 621 return m_webSourceBuffer->evictCodedFrames(); |
| 622 } |
| 623 |
| 614 void SourceBuffer::appendStreamInternal(PassRefPtrWillBeRawPtr<Stream> stream, E
xceptionState& exceptionState) | 624 void SourceBuffer::appendStreamInternal(PassRefPtrWillBeRawPtr<Stream> stream, E
xceptionState& exceptionState) |
| 615 { | 625 { |
| 616 // Section 3.2 appendStream() | 626 // Section 3.2 appendStream() |
| 617 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou
rce.html#widl-SourceBuffer-appendStream-void-Stream-stream-unsigned-long-long-ma
xSize | 627 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou
rce.html#widl-SourceBuffer-appendStream-void-Stream-stream-unsigned-long-long-ma
xSize |
| 618 // (0. If the stream has been neutered, then throw an InvalidAccessError exc
eption and abort these steps.) | 628 // (0. If the stream has been neutered, then throw an InvalidAccessError exc
eption and abort these steps.) |
| 619 if (stream->isNeutered()) { | 629 if (stream->isNeutered()) { |
| 620 exceptionState.throwDOMException(InvalidAccessError, "The stream provide
d has been neutered."); | 630 exceptionState.throwDOMException(InvalidAccessError, "The stream provide
d has been neutered."); |
| 621 return; | 631 return; |
| 622 } | 632 } |
| 623 | 633 |
| 624 // 1. Run the prepare append algorithm. | 634 // 1. Run the prepare append algorithm. |
| 625 // Section 3.5.4 Prepare Append Algorithm. | 635 // Section 3.5.4 Prepare Append Algorithm. |
| 626 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-so
urce.html#sourcebuffer-prepare-append | 636 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-so
urce.html#sourcebuffer-prepare-append |
| 627 // 1. If this object has been removed from the sourceBuffers attribute of t
he parent media source then throw an InvalidStateError exception and abort these
steps. | 637 // 1. If this object has been removed from the sourceBuffers attribute of t
he parent media source then throw an InvalidStateError exception and abort these
steps. |
| 628 // 2. If the updating attribute equals true, then throw an InvalidStateErro
r exception and abort these steps. | 638 // 2. If the updating attribute equals true, then throw an InvalidStateErro
r exception and abort these steps. |
| 629 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat
e)) | 639 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat
e)) |
| 630 return; | 640 return; |
| 631 | 641 |
| 632 TRACE_EVENT_ASYNC_BEGIN0("media", "SourceBuffer::appendStream", this); | 642 TRACE_EVENT_ASYNC_BEGIN0("media", "SourceBuffer::appendStream", this); |
| 633 | 643 |
| 634 // 3. If the readyState attribute of the parent media source is in the "end
ed" state then run the following steps: ... | 644 // 3. If the readyState attribute of the parent media source is in the "end
ed" state then run the following steps: ... |
| 635 m_source->openIfInEndedState(); | 645 m_source->openIfInEndedState(); |
| 636 | 646 |
| 637 // Steps 4-5 of the prepare append algorithm are handled by m_webSourceBuffe
r. | 647 // 4. Run the coded frame eviction algorithm. |
| 648 if (!evictCodedFrames()) { |
| 649 // 5. If the buffer full flag equals true, then throw a QUOTA_EXCEEDED_
ERR exception and abort these steps. |
| 650 exceptionState.throwDOMException(QuotaExceededError, "The SourceBuffer i
s full, and cannot free space to append stream."); |
| 651 return; |
| 652 } |
| 638 | 653 |
| 639 // 2. Set the updating attribute to true. | 654 // 2. Set the updating attribute to true. |
| 640 m_updating = true; | 655 m_updating = true; |
| 641 | 656 |
| 642 // 3. Queue a task to fire a simple event named updatestart at this SourceBu
ffer object. | 657 // 3. Queue a task to fire a simple event named updatestart at this SourceBu
ffer object. |
| 643 scheduleEvent(EventTypeNames::updatestart); | 658 scheduleEvent(EventTypeNames::updatestart); |
| 644 | 659 |
| 645 // 4. Asynchronously run the stream append loop algorithm with stream and ma
xSize. | 660 // 4. Asynchronously run the stream append loop algorithm with stream and ma
xSize. |
| 646 | 661 |
| 647 stream->neuter(); | 662 stream->neuter(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 659 // Section 3.5.6 Stream Append Loop | 674 // Section 3.5.6 Stream Append Loop |
| 660 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou
rce.html#sourcebuffer-stream-append-loop | 675 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou
rce.html#sourcebuffer-stream-append-loop |
| 661 | 676 |
| 662 // 1. If maxSize is set, then let bytesLeft equal maxSize. | 677 // 1. If maxSize is set, then let bytesLeft equal maxSize. |
| 663 // 2. Loop Top: If maxSize is set and bytesLeft equals 0, then jump to the l
oop done step below. | 678 // 2. Loop Top: If maxSize is set and bytesLeft equals 0, then jump to the l
oop done step below. |
| 664 if (m_streamMaxSizeValid && !m_streamMaxSize) { | 679 if (m_streamMaxSizeValid && !m_streamMaxSize) { |
| 665 appendStreamDone(true); | 680 appendStreamDone(true); |
| 666 return; | 681 return; |
| 667 } | 682 } |
| 668 | 683 |
| 669 // Steps 3-11 are handled by m_loader. | 684 // Steps 3-9 are handled by m_loader. |
| 670 // Note: Passing 0 here signals that maxSize was not set. (i.e. Read all the
data in the stream). | 685 // Note: Passing 0 here signals that maxSize was not set. (i.e. Read all the
data in the stream). |
| 671 m_loader->start(executionContext(), *m_stream, m_streamMaxSizeValid ? m_stre
amMaxSize : 0); | 686 m_loader->start(executionContext(), *m_stream, m_streamMaxSizeValid ? m_stre
amMaxSize : 0); |
| 672 } | 687 } |
| 673 | 688 |
| 674 void SourceBuffer::appendStreamDone(bool success) | 689 void SourceBuffer::appendStreamDone(bool success) |
| 675 { | 690 { |
| 676 ASSERT(m_updating); | 691 ASSERT(m_updating); |
| 677 ASSERT(m_loader); | 692 ASSERT(m_loader); |
| 678 ASSERT(m_stream); | 693 ASSERT(m_stream); |
| 679 | 694 |
| 680 clearAppendStreamState(); | 695 clearAppendStreamState(); |
| 681 | 696 |
| 682 if (!success) { | 697 if (!success) { |
| 683 // Section 3.5.3 Append Error Algorithm | 698 appendError(); |
| 684 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media
-source.html#sourcebuffer-append-error | |
| 685 // | |
| 686 // 1. Run the reset parser state algorithm. (Handled by caller) | |
| 687 // 2. Set the updating attribute to false. | |
| 688 m_updating = false; | |
| 689 | |
| 690 // 3. Queue a task to fire a simple event named error at this SourceBuff
er object. | |
| 691 scheduleEvent(EventTypeNames::error); | |
| 692 | |
| 693 // 4. Queue a task to fire a simple event named updateend at this Source
Buffer object. | |
| 694 scheduleEvent(EventTypeNames::updateend); | |
| 695 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this); | 699 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this); |
| 696 return; | 700 return; |
| 697 } | 701 } |
| 698 | 702 |
| 699 // Section 3.5.6 Stream Append Loop | 703 // Section 3.5.6 Stream Append Loop |
| 700 // Steps 1-11 are handled by appendStreamAsyncPart(), |m_loader|, and |m_web
SourceBuffer|. | 704 // Steps 1-9 are handled by appendStreamAsyncPart(), |m_loader|, and |m_webS
ourceBuffer|. |
| 705 |
| 706 // 10. Run the coded frame eviction algorithm. |
| 707 if (!evictCodedFrames()) { |
| 708 // 11. If the buffer full flag equals true, then run the append error al
gorithm with the decode error parameter set to false and abort this algorithm. |
| 709 appendError(); |
| 710 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this); |
| 711 return; |
| 712 } |
| 713 |
| 701 // 12. Loop Done: Set the updating attribute to false. | 714 // 12. Loop Done: Set the updating attribute to false. |
| 702 m_updating = false; | 715 m_updating = false; |
| 703 | 716 |
| 704 // 13. Queue a task to fire a simple event named update at this SourceBuffer
object. | 717 // 13. Queue a task to fire a simple event named update at this SourceBuffer
object. |
| 705 scheduleEvent(EventTypeNames::update); | 718 scheduleEvent(EventTypeNames::update); |
| 706 | 719 |
| 707 // 14. Queue a task to fire a simple event named updateend at this SourceBuf
fer object. | 720 // 14. Queue a task to fire a simple event named updateend at this SourceBuf
fer object. |
| 708 scheduleEvent(EventTypeNames::updateend); | 721 scheduleEvent(EventTypeNames::updateend); |
| 709 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this); | 722 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this); |
| 710 } | 723 } |
| 711 | 724 |
| 712 void SourceBuffer::clearAppendStreamState() | 725 void SourceBuffer::clearAppendStreamState() |
| 713 { | 726 { |
| 714 m_streamMaxSizeValid = false; | 727 m_streamMaxSizeValid = false; |
| 715 m_streamMaxSize = 0; | 728 m_streamMaxSize = 0; |
| 716 m_loader.clear(); | 729 m_loader.clear(); |
| 717 m_stream = nullptr; | 730 m_stream = nullptr; |
| 718 } | 731 } |
| 719 | 732 |
| 733 void SourceBuffer::appendError() |
| 734 { |
| 735 // Section 3.5.3 Append Error Algorithm |
| 736 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou
rce.html#sourcebuffer-append-error |
| 737 // |
| 738 // 1. Run the reset parser state algorithm. (Handled by caller) |
| 739 // 2. Set the updating attribute to false. |
| 740 m_updating = false; |
| 741 |
| 742 // 3. Queue a task to fire a simple event named error at this SourceBuffer o
bject. |
| 743 scheduleEvent(EventTypeNames::error); |
| 744 |
| 745 // 4. Queue a task to fire a simple event named updateend at this SourceBuff
er object. |
| 746 scheduleEvent(EventTypeNames::updateend); |
| 747 } |
| 748 |
| 720 void SourceBuffer::didStartLoading() | 749 void SourceBuffer::didStartLoading() |
| 721 { | 750 { |
| 722 WTF_LOG(Media, "SourceBuffer::didStartLoading() %p", this); | 751 WTF_LOG(Media, "SourceBuffer::didStartLoading() %p", this); |
| 723 } | 752 } |
| 724 | 753 |
| 725 void SourceBuffer::didReceiveDataForClient(const char* data, unsigned dataLength
) | 754 void SourceBuffer::didReceiveDataForClient(const char* data, unsigned dataLength
) |
| 726 { | 755 { |
| 727 WTF_LOG(Media, "SourceBuffer::didReceiveDataForClient(%d) %p", dataLength, t
his); | 756 WTF_LOG(Media, "SourceBuffer::didReceiveDataForClient(%d) %p", dataLength, t
his); |
| 728 ASSERT(m_updating); | 757 ASSERT(m_updating); |
| 729 ASSERT(m_loader); | 758 ASSERT(m_loader); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 744 | 773 |
| 745 void SourceBuffer::trace(Visitor* visitor) | 774 void SourceBuffer::trace(Visitor* visitor) |
| 746 { | 775 { |
| 747 visitor->trace(m_source); | 776 visitor->trace(m_source); |
| 748 visitor->trace(m_stream); | 777 visitor->trace(m_stream); |
| 749 visitor->trace(m_asyncEventQueue); | 778 visitor->trace(m_asyncEventQueue); |
| 750 EventTargetWithInlineData::trace(visitor); | 779 EventTargetWithInlineData::trace(visitor); |
| 751 } | 780 } |
| 752 | 781 |
| 753 } // namespace blink | 782 } // namespace blink |
| OLD | NEW |