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

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

Issue 1013923002: Fix MSE GC, make it less aggressive, more spec-compliant (Blink CL) (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: m_loader might be released before didFail, if appendStream failed due to full buffer Created 5 years, 4 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
« no previous file with comments | « Source/modules/mediasource/SourceBuffer.h ('k') | public/platform/WebSourceBuffer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 22 matching lines...) Expand all
33 33
34 #include "bindings/core/v8/ExceptionMessages.h" 34 #include "bindings/core/v8/ExceptionMessages.h"
35 #include "bindings/core/v8/ExceptionState.h" 35 #include "bindings/core/v8/ExceptionState.h"
36 #include "core/dom/DOMArrayBuffer.h" 36 #include "core/dom/DOMArrayBuffer.h"
37 #include "core/dom/DOMArrayBufferView.h" 37 #include "core/dom/DOMArrayBufferView.h"
38 #include "core/dom/ExceptionCode.h" 38 #include "core/dom/ExceptionCode.h"
39 #include "core/dom/ExecutionContext.h" 39 #include "core/dom/ExecutionContext.h"
40 #include "core/events/Event.h" 40 #include "core/events/Event.h"
41 #include "core/events/GenericEventQueue.h" 41 #include "core/events/GenericEventQueue.h"
42 #include "core/fileapi/FileReaderLoader.h" 42 #include "core/fileapi/FileReaderLoader.h"
43 #include "core/html/HTMLMediaElement.h"
44 #include "core/html/MediaError.h"
43 #include "core/html/TimeRanges.h" 45 #include "core/html/TimeRanges.h"
44 #include "core/streams/Stream.h" 46 #include "core/streams/Stream.h"
45 #include "modules/mediasource/MediaSource.h" 47 #include "modules/mediasource/MediaSource.h"
46 #include "platform/Logging.h" 48 #include "platform/Logging.h"
47 #include "platform/TraceEvent.h" 49 #include "platform/TraceEvent.h"
48 #include "public/platform/WebSourceBuffer.h" 50 #include "public/platform/WebSourceBuffer.h"
49 #include "wtf/MathExtras.h" 51 #include "wtf/MathExtras.h"
50 52
51 #include <limits> 53 #include <limits>
52 54
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 } 263 }
262 264
263 m_webSourceBuffer->setAppendWindowEnd(end); 265 m_webSourceBuffer->setAppendWindowEnd(end);
264 266
265 // 5. Update the attribute to the new value. 267 // 5. Update the attribute to the new value.
266 m_appendWindowEnd = end; 268 m_appendWindowEnd = end;
267 } 269 }
268 270
269 void SourceBuffer::appendBuffer(PassRefPtr<DOMArrayBuffer> data, ExceptionState& exceptionState) 271 void SourceBuffer::appendBuffer(PassRefPtr<DOMArrayBuffer> data, ExceptionState& exceptionState)
270 { 272 {
273 WTF_LOG(Media, "SourceBuffer::appendBuffer %p size=%u", this, data->byteLeng th());
271 // Section 3.2 appendBuffer() 274 // Section 3.2 appendBuffer()
272 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-appendBuffer-void-ArrayBufferView-data 275 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-appendBuffer-void-ArrayBufferView-data
273 appendBufferInternal(static_cast<const unsigned char*>(data->data()), data-> byteLength(), exceptionState); 276 appendBufferInternal(static_cast<const unsigned char*>(data->data()), data-> byteLength(), exceptionState);
274 } 277 }
275 278
276 void SourceBuffer::appendBuffer(PassRefPtr<DOMArrayBufferView> data, ExceptionSt ate& exceptionState) 279 void SourceBuffer::appendBuffer(PassRefPtr<DOMArrayBufferView> data, ExceptionSt ate& exceptionState)
277 { 280 {
281 WTF_LOG(Media, "SourceBuffer::appendBuffer %p size=%u", this, data->byteLeng th());
278 // Section 3.2 appendBuffer() 282 // Section 3.2 appendBuffer()
279 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-appendBuffer-void-ArrayBufferView-data 283 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-appendBuffer-void-ArrayBufferView-data
280 appendBufferInternal(static_cast<const unsigned char*>(data->baseAddress()), data->byteLength(), exceptionState); 284 appendBufferInternal(static_cast<const unsigned char*>(data->baseAddress()), data->byteLength(), exceptionState);
281 } 285 }
282 286
283 void SourceBuffer::appendStream(Stream* stream, ExceptionState& exceptionState) 287 void SourceBuffer::appendStream(Stream* stream, ExceptionState& exceptionState)
284 { 288 {
285 m_streamMaxSizeValid = false; 289 m_streamMaxSizeValid = false;
286 appendStreamInternal(stream, exceptionState); 290 appendStreamInternal(stream, exceptionState);
287 } 291 }
288 292
289 void SourceBuffer::appendStream(Stream* stream, unsigned long long maxSize, Exce ptionState& exceptionState) 293 void SourceBuffer::appendStream(Stream* stream, unsigned long long maxSize, Exce ptionState& exceptionState)
290 { 294 {
295 WTF_LOG(Media, "SourceBuffer::appendStream %p maxSize=%llu", this, maxSize);
291 m_streamMaxSizeValid = maxSize > 0; 296 m_streamMaxSizeValid = maxSize > 0;
292 if (m_streamMaxSizeValid) 297 if (m_streamMaxSizeValid)
293 m_streamMaxSize = maxSize; 298 m_streamMaxSize = maxSize;
294 appendStreamInternal(stream, exceptionState); 299 appendStreamInternal(stream, exceptionState);
295 } 300 }
296 301
297 void SourceBuffer::abort(ExceptionState& exceptionState) 302 void SourceBuffer::abort(ExceptionState& exceptionState)
298 { 303 {
299 // Section 3.2 abort() method steps. 304 // Section 3.2 abort() method steps.
300 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-abort-void 305 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-abort-void
(...skipping 18 matching lines...) Expand all
319 324
320 // 5. Set appendWindowStart to 0. 325 // 5. Set appendWindowStart to 0.
321 setAppendWindowStart(0, exceptionState); 326 setAppendWindowStart(0, exceptionState);
322 327
323 // 6. Set appendWindowEnd to positive Infinity. 328 // 6. Set appendWindowEnd to positive Infinity.
324 setAppendWindowEnd(std::numeric_limits<double>::infinity(), exceptionState); 329 setAppendWindowEnd(std::numeric_limits<double>::infinity(), exceptionState);
325 } 330 }
326 331
327 void SourceBuffer::remove(double start, double end, ExceptionState& exceptionSta te) 332 void SourceBuffer::remove(double start, double end, ExceptionState& exceptionSta te)
328 { 333 {
334 WTF_LOG(Media, "SourceBuffer::remove %p start=%f end=%f", this, start, end);
335
329 // Section 3.2 remove() method steps. 336 // Section 3.2 remove() method steps.
330 // 1. If duration equals NaN, then throw an InvalidAccessError exception and abort these steps. 337 // 1. If duration equals NaN, then throw an InvalidAccessError exception and abort these steps.
331 // 2. If start is negative or greater than duration, then throw an InvalidAc cessError exception and abort these steps. 338 // 2. If start is negative or greater than duration, then throw an InvalidAc cessError exception and abort these steps.
332 339
333 if (start < 0 || (m_source && (std::isnan(m_source->duration()) || start > m _source->duration()))) { 340 if (start < 0 || (m_source && (std::isnan(m_source->duration()) || start > m _source->duration()))) {
334 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages:: indexOutsideRange("start", start, 0.0, ExceptionMessages::ExclusiveBound, !m_sou rce || std::isnan(m_source->duration()) ? 0 : m_source->duration(), ExceptionMes sages::ExclusiveBound)); 341 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages:: indexOutsideRange("start", start, 0.0, ExceptionMessages::ExclusiveBound, !m_sou rce || std::isnan(m_source->duration()) ? 0 : m_source->duration(), ExceptionMes sages::ExclusiveBound));
335 return; 342 return;
336 } 343 }
337 344
338 // 3. If end is less than or equal to start or end equals NaN, then throw an InvalidAccessError exception and abort these steps. 345 // 3. If end is less than or equal to start or end equals NaN, then throw an InvalidAccessError exception and abort these steps.
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 void SourceBuffer::scheduleEvent(const AtomicString& eventName) 513 void SourceBuffer::scheduleEvent(const AtomicString& eventName)
507 { 514 {
508 ASSERT(m_asyncEventQueue); 515 ASSERT(m_asyncEventQueue);
509 516
510 RefPtrWillBeRawPtr<Event> event = Event::create(eventName); 517 RefPtrWillBeRawPtr<Event> event = Event::create(eventName);
511 event->setTarget(this); 518 event->setTarget(this);
512 519
513 m_asyncEventQueue->enqueueEvent(event.release()); 520 m_asyncEventQueue->enqueueEvent(event.release());
514 } 521 }
515 522
523 bool SourceBuffer::prepareAppend(size_t newDataSize, ExceptionState& exceptionSt ate)
524 {
525 TRACE_EVENT_ASYNC_BEGIN0("media", "SourceBuffer::prepareAppend", this);
526 // http://w3c.github.io/media-source/#sourcebuffer-prepare-append
527 // 3.5.4 Prepare Append Algorithm
528 // 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.
529 // 2. If the updating attribute equals true, then throw an InvalidStateError exception and abort these steps.
530 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat e)) {
531 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::prepareAppend", this);
532 return false;
533 }
534
535 // 3. If the HTMLMediaElement.error attribute is not null, then throw an Inv alidStateError exception and abort these steps.
536 ASSERT(m_source);
537 ASSERT(m_source->mediaElement());
538 if (m_source->mediaElement()->error()) {
539 exceptionState.throwDOMException(InvalidStateError, "The HTMLMediaElemen t.error attribute is not null.");
540 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::prepareAppend", this);
541 return false;
542 }
543
544 // 4. If the readyState attribute of the parent media source is in the "ende d" state then run the following steps:
545 // 1. Set the readyState attribute of the parent media source to "open"
546 // 2. Queue a task to fire a simple event named sourceopen at the parent media source.
547 m_source->openIfInEndedState();
548
549 // 5. Run the coded frame eviction algorithm.
550 if (!evictCodedFrames(newDataSize)) {
551 // 6. If the buffer full flag equals true, then throw a QUOTA_EXCEEDED_E RR exception and abort these steps.
552 WTF_LOG(Media, "SourceBuffer::prepareAppend %p -> throw QuotaExceededErr or", this);
553 exceptionState.throwDOMException(QuotaExceededError, "The SourceBuffer i s full, and cannot free space to append additional buffers.");
554 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::prepareAppend", this);
555 return false;
556 }
557
558 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::prepareAppend", this);
559 return true;
560 }
561
562 bool SourceBuffer::evictCodedFrames(size_t newDataSize)
563 {
564 ASSERT(m_source);
565 ASSERT(m_source->mediaElement());
566 double currentTime = m_source->mediaElement()->currentTime();
567 return m_webSourceBuffer->evictCodedFrames(currentTime, newDataSize);
568 }
569
516 void SourceBuffer::appendBufferInternal(const unsigned char* data, unsigned size , ExceptionState& exceptionState) 570 void SourceBuffer::appendBufferInternal(const unsigned char* data, unsigned size , ExceptionState& exceptionState)
517 { 571 {
572 TRACE_EVENT_ASYNC_BEGIN1("media", "SourceBuffer::appendBuffer", this, "size" , size);
518 // Section 3.2 appendBuffer() 573 // Section 3.2 appendBuffer()
519 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-appendBuffer-void-ArrayBufferView-data 574 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#widl-SourceBuffer-appendBuffer-void-ArrayBufferView-data
520 575
521 // 1. Run the prepare append algorithm. 576 // 1. Run the prepare append algorithm.
522 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#sourcebuffer-prepare-append 577 if (!prepareAppend(size, exceptionState)) {
523 // 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. 578 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendBuffer", this);
524 // 2. If the updating attribute equals true, then throw an InvalidStateErro r exception and abort these steps.
525 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat e))
526 return; 579 return;
527 580 }
528 TRACE_EVENT_ASYNC_BEGIN1("media", "SourceBuffer::appendBuffer", this, "size" , size); 581 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendBuffer", this, "p repareAppend");
529
530 // 3. If the readyState attribute of the parent media source is in the "end ed" state then run the following steps: ...
531 m_source->openIfInEndedState();
532
533 // Steps 4-5 - end "prepare append" algorithm.
534 582
535 // 2. Add data to the end of the input buffer. 583 // 2. Add data to the end of the input buffer.
536 ASSERT(data || size == 0); 584 ASSERT(data || size == 0);
537 if (data) 585 if (data)
538 m_pendingAppendData.append(data, size); 586 m_pendingAppendData.append(data, size);
539 m_pendingAppendDataOffset = 0; 587 m_pendingAppendDataOffset = 0;
540 588
541 // 3. Set the updating attribute to true. 589 // 3. Set the updating attribute to true.
542 m_updating = true; 590 m_updating = true;
543 591
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 671
624 // 11. Queue a task to fire a simple event named update at this SourceBuffer object. 672 // 11. Queue a task to fire a simple event named update at this SourceBuffer object.
625 scheduleEvent(EventTypeNames::update); 673 scheduleEvent(EventTypeNames::update);
626 674
627 // 12. Queue a task to fire a simple event named updateend at this SourceBuf fer object. 675 // 12. Queue a task to fire a simple event named updateend at this SourceBuf fer object.
628 scheduleEvent(EventTypeNames::updateend); 676 scheduleEvent(EventTypeNames::updateend);
629 } 677 }
630 678
631 void SourceBuffer::appendStreamInternal(Stream* stream, ExceptionState& exceptio nState) 679 void SourceBuffer::appendStreamInternal(Stream* stream, ExceptionState& exceptio nState)
632 { 680 {
681 TRACE_EVENT_ASYNC_BEGIN0("media", "SourceBuffer::appendStream", this);
682
633 // Section 3.2 appendStream() 683 // Section 3.2 appendStream()
634 // 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 684 // http://w3c.github.io/media-source/#widl-SourceBuffer-appendStream-void-Re adableStream-stream-unsigned-long-long-maxSize
635 // (0. If the stream has been neutered, then throw an InvalidAccessError exc eption and abort these steps.) 685 // (0. If the stream has been neutered, then throw an InvalidAccessError exc eption and abort these steps.)
636 if (stream->isNeutered()) { 686 if (stream->isNeutered()) {
637 exceptionState.throwDOMException(InvalidAccessError, "The stream provide d has been neutered."); 687 exceptionState.throwDOMException(InvalidAccessError, "The stream provide d has been neutered.");
688 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this);
638 return; 689 return;
639 } 690 }
640 691
641 // 1. Run the prepare append algorithm. 692 // 1. Run the prepare append algorithm.
642 // Section 3.5.4 Prepare Append Algorithm. 693 size_t newDataSize = m_streamMaxSizeValid ? m_streamMaxSize : 0;
643 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-so urce.html#sourcebuffer-prepare-append 694 if (!prepareAppend(newDataSize, exceptionState)) {
644 // 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. 695 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this);
645 // 2. If the updating attribute equals true, then throw an InvalidStateErro r exception and abort these steps.
646 if (throwExceptionIfRemovedOrUpdating(isRemoved(), m_updating, exceptionStat e))
647 return; 696 return;
648 697 }
649 TRACE_EVENT_ASYNC_BEGIN0("media", "SourceBuffer::appendStream", this);
650
651 // 3. If the readyState attribute of the parent media source is in the "end ed" state then run the following steps: ...
652 m_source->openIfInEndedState();
653
654 // Steps 4-5 of the prepare append algorithm are handled by m_webSourceBuffe r.
655 698
656 // 2. Set the updating attribute to true. 699 // 2. Set the updating attribute to true.
657 m_updating = true; 700 m_updating = true;
658 701
659 // 3. Queue a task to fire a simple event named updatestart at this SourceBu ffer object. 702 // 3. Queue a task to fire a simple event named updatestart at this SourceBu ffer object.
660 scheduleEvent(EventTypeNames::updatestart); 703 scheduleEvent(EventTypeNames::updatestart);
661 704
662 // 4. Asynchronously run the stream append loop algorithm with stream and ma xSize. 705 // 4. Asynchronously run the stream append loop algorithm with stream and ma xSize.
663
664 stream->neuter(); 706 stream->neuter();
665 m_loader = FileReaderLoader::create(FileReaderLoader::ReadByClient, this); 707 m_loader = FileReaderLoader::create(FileReaderLoader::ReadByClient, this);
666 m_stream = stream; 708 m_stream = stream;
667 m_appendStreamAsyncPartRunner.runAsync(); 709 m_appendStreamAsyncPartRunner.runAsync();
668 } 710 }
669 711
670 void SourceBuffer::appendStreamAsyncPart() 712 void SourceBuffer::appendStreamAsyncPart()
671 { 713 {
672 ASSERT(m_updating); 714 ASSERT(m_updating);
673 ASSERT(m_loader); 715 ASSERT(m_loader);
674 ASSERT(m_stream); 716 ASSERT(m_stream);
717 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendStream", this, "a ppendStreamAsyncPart");
675 718
676 // Section 3.5.6 Stream Append Loop 719 // Section 3.5.6 Stream Append Loop
677 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#sourcebuffer-stream-append-loop 720 // http://w3c.github.io/media-source/#sourcebuffer-stream-append-loop
678 721
679 // 1. If maxSize is set, then let bytesLeft equal maxSize. 722 // 1. If maxSize is set, then let bytesLeft equal maxSize.
680 // 2. Loop Top: If maxSize is set and bytesLeft equals 0, then jump to the l oop done step below. 723 // 2. Loop Top: If maxSize is set and bytesLeft equals 0, then jump to the l oop done step below.
681 if (m_streamMaxSizeValid && !m_streamMaxSize) { 724 if (m_streamMaxSizeValid && !m_streamMaxSize) {
682 appendStreamDone(true); 725 appendStreamDone(true);
683 return; 726 return;
684 } 727 }
685 728
686 // Steps 3-11 are handled by m_loader. 729 // Steps 3-11 are handled by m_loader.
687 // Note: Passing 0 here signals that maxSize was not set. (i.e. Read all the data in the stream). 730 // Note: Passing 0 here signals that maxSize was not set. (i.e. Read all the data in the stream).
688 m_loader->start(executionContext(), *m_stream, m_streamMaxSizeValid ? m_stre amMaxSize : 0); 731 m_loader->start(executionContext(), *m_stream, m_streamMaxSizeValid ? m_stre amMaxSize : 0);
689 } 732 }
690 733
691 void SourceBuffer::appendStreamDone(bool success) 734 void SourceBuffer::appendStreamDone(bool success)
692 { 735 {
693 ASSERT(m_updating); 736 ASSERT(m_updating);
694 ASSERT(m_loader); 737 ASSERT(m_loader);
695 ASSERT(m_stream); 738 ASSERT(m_stream);
696 739
697 clearAppendStreamState(); 740 clearAppendStreamState();
698 741
699 if (!success) { 742 if (!success) {
700 // Section 3.5.3 Append Error Algorithm 743 appendError(false);
701 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media -source.html#sourcebuffer-append-error
702 //
703 // 1. Run the reset parser state algorithm. (Handled by caller)
704 // 2. Set the updating attribute to false.
705 m_updating = false;
706
707 // 3. Queue a task to fire a simple event named error at this SourceBuff er object.
708 scheduleEvent(EventTypeNames::error);
709
710 // 4. Queue a task to fire a simple event named updateend at this Source Buffer object.
711 scheduleEvent(EventTypeNames::updateend);
712 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this); 744 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this);
713 return; 745 return;
714 } 746 }
715 747
716 // Section 3.5.6 Stream Append Loop 748 // Section 3.5.6 Stream Append Loop
717 // Steps 1-11 are handled by appendStreamAsyncPart(), |m_loader|, and |m_web SourceBuffer|. 749 // Steps 1-11 are handled by appendStreamAsyncPart(), |m_loader|, and |m_web SourceBuffer|.
750
718 // 12. Loop Done: Set the updating attribute to false. 751 // 12. Loop Done: Set the updating attribute to false.
719 m_updating = false; 752 m_updating = false;
720 753
721 // 13. Queue a task to fire a simple event named update at this SourceBuffer object. 754 // 13. Queue a task to fire a simple event named update at this SourceBuffer object.
722 scheduleEvent(EventTypeNames::update); 755 scheduleEvent(EventTypeNames::update);
723 756
724 // 14. Queue a task to fire a simple event named updateend at this SourceBuf fer object. 757 // 14. Queue a task to fire a simple event named updateend at this SourceBuf fer object.
725 scheduleEvent(EventTypeNames::updateend); 758 scheduleEvent(EventTypeNames::updateend);
726 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this); 759 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this);
727 } 760 }
728 761
729 void SourceBuffer::clearAppendStreamState() 762 void SourceBuffer::clearAppendStreamState()
730 { 763 {
731 m_streamMaxSizeValid = false; 764 m_streamMaxSizeValid = false;
732 m_streamMaxSize = 0; 765 m_streamMaxSize = 0;
733 m_loader.clear(); 766 m_loader.clear();
734 m_stream = nullptr; 767 m_stream = nullptr;
735 } 768 }
736 769
770 void SourceBuffer::appendError(bool decodeError)
771 {
772 // Section 3.5.3 Append Error Algorithm
773 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#sourcebuffer-append-error
774
775 // 1. Run the reset parser state algorithm.
776 m_webSourceBuffer->abort();
777
778 // 2. Set the updating attribute to false.
779 m_updating = false;
780
781 // 3. Queue a task to fire a simple event named error at this SourceBuffer o bject.
782 scheduleEvent(EventTypeNames::error);
783
784 // 4. Queue a task to fire a simple event named updateend at this SourceBuff er object.
785 scheduleEvent(EventTypeNames::updateend);
786
787 // 5. If decode error is true, then run the end of stream algorithm with the
788 // error parameter set to "decode".
789 if (decodeError)
790 m_source->endOfStream("decode", ASSERT_NO_EXCEPTION);
791 }
792
737 void SourceBuffer::didStartLoading() 793 void SourceBuffer::didStartLoading()
738 { 794 {
739 WTF_LOG(Media, "SourceBuffer::didStartLoading() %p", this); 795 WTF_LOG(Media, "SourceBuffer::didStartLoading() %p", this);
740 } 796 }
741 797
742 void SourceBuffer::didReceiveDataForClient(const char* data, unsigned dataLength ) 798 void SourceBuffer::didReceiveDataForClient(const char* data, unsigned dataLength )
743 { 799 {
744 WTF_LOG(Media, "SourceBuffer::didReceiveDataForClient(%d) %p", dataLength, t his); 800 WTF_LOG(Media, "SourceBuffer::didReceiveDataForClient(%d) %p", dataLength, t his);
745 ASSERT(m_updating); 801 ASSERT(m_updating);
746 ASSERT(m_loader); 802 ASSERT(m_loader);
803
804 // Section 3.5.6 Stream Append Loop
805 // http://w3c.github.io/media-source/#sourcebuffer-stream-append-loop
806
807 // 10. Run the coded frame eviction algorithm.
808 if (!evictCodedFrames(dataLength)) {
809 // 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.
810 appendStreamDone(false);
811 return;
812 }
813
747 m_webSourceBuffer->append(reinterpret_cast<const unsigned char*>(data), data Length, &m_timestampOffset); 814 m_webSourceBuffer->append(reinterpret_cast<const unsigned char*>(data), data Length, &m_timestampOffset);
748 } 815 }
749 816
750 void SourceBuffer::didFinishLoading() 817 void SourceBuffer::didFinishLoading()
751 { 818 {
752 WTF_LOG(Media, "SourceBuffer::didFinishLoading() %p", this); 819 WTF_LOG(Media, "SourceBuffer::didFinishLoading() %p", this);
820 ASSERT(m_loader);
753 appendStreamDone(true); 821 appendStreamDone(true);
754 } 822 }
755 823
756 void SourceBuffer::didFail(FileError::ErrorCode errorCode) 824 void SourceBuffer::didFail(FileError::ErrorCode errorCode)
757 { 825 {
758 WTF_LOG(Media, "SourceBuffer::didFail(%d) %p", errorCode, this); 826 WTF_LOG(Media, "SourceBuffer::didFail(%d) %p", errorCode, this);
759 appendStreamDone(false); 827 // m_loader might be already released, in case appendStream has failed due
828 // to evictCodedFrames failing in didReceiveDataForClient. In that case
829 // appendStreamDone will be invoked from there, no need to repeat it here.
830 if (m_loader)
831 appendStreamDone(false);
760 } 832 }
761 833
762 DEFINE_TRACE(SourceBuffer) 834 DEFINE_TRACE(SourceBuffer)
763 { 835 {
764 visitor->trace(m_source); 836 visitor->trace(m_source);
765 visitor->trace(m_stream); 837 visitor->trace(m_stream);
766 visitor->trace(m_trackDefaults); 838 visitor->trace(m_trackDefaults);
767 visitor->trace(m_asyncEventQueue); 839 visitor->trace(m_asyncEventQueue);
768 RefCountedGarbageCollectedEventTargetWithInlineData<SourceBuffer>::trace(vis itor); 840 RefCountedGarbageCollectedEventTargetWithInlineData<SourceBuffer>::trace(vis itor);
769 ActiveDOMObject::trace(visitor); 841 ActiveDOMObject::trace(visitor);
770 } 842 }
771 843
772 } // namespace blink 844 } // namespace blink
OLDNEW
« no previous file with comments | « Source/modules/mediasource/SourceBuffer.h ('k') | public/platform/WebSourceBuffer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698