| 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 796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 TRACE_EVENT_ASYNC_STEP_INTO1("media", "SourceBuffer::appendBuffer", this, "a
ppending", "appendSize", static_cast<unsigned>(appendSize)); | 807 TRACE_EVENT_ASYNC_STEP_INTO1("media", "SourceBuffer::appendBuffer", this, "a
ppending", "appendSize", static_cast<unsigned>(appendSize)); |
| 808 | 808 |
| 809 // |zero| is used for 0 byte appends so we always have a valid pointer. | 809 // |zero| is used for 0 byte appends so we always have a valid pointer. |
| 810 // We need to convey all appends, even 0 byte ones to |m_webSourceBuffer| | 810 // We need to convey all appends, even 0 byte ones to |m_webSourceBuffer| |
| 811 // so that it can clear its end of stream state if necessary. | 811 // so that it can clear its end of stream state if necessary. |
| 812 unsigned char zero = 0; | 812 unsigned char zero = 0; |
| 813 unsigned char* appendData = &zero; | 813 unsigned char* appendData = &zero; |
| 814 if (appendSize) | 814 if (appendSize) |
| 815 appendData = m_pendingAppendData.data() + m_pendingAppendDataOffset; | 815 appendData = m_pendingAppendData.data() + m_pendingAppendDataOffset; |
| 816 | 816 |
| 817 m_webSourceBuffer->append(appendData, appendSize, &m_timestampOffset); | 817 bool appendSuccess = m_webSourceBuffer->append(appendData, appendSize, &m_ti
mestampOffset); |
| 818 | 818 |
| 819 m_pendingAppendDataOffset += appendSize; | 819 if (!appendSuccess) { |
| 820 m_pendingAppendData.clear(); |
| 821 m_pendingAppendDataOffset = 0; |
| 822 appendError(true); |
| 823 } else { |
| 824 m_pendingAppendDataOffset += appendSize; |
| 820 | 825 |
| 821 if (m_pendingAppendDataOffset < m_pendingAppendData.size()) { | 826 if (m_pendingAppendDataOffset < m_pendingAppendData.size()) { |
| 822 m_appendBufferAsyncPartRunner->runAsync(); | 827 m_appendBufferAsyncPartRunner->runAsync(); |
| 823 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendBuffer", this
, "nextPieceDelay"); | 828 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendBuffer",
this, "nextPieceDelay"); |
| 824 return; | 829 return; |
| 830 } |
| 831 |
| 832 // 3. Set the updating attribute to false. |
| 833 m_updating = false; |
| 834 m_pendingAppendData.clear(); |
| 835 m_pendingAppendDataOffset = 0; |
| 836 |
| 837 // 4. Queue a task to fire a simple event named update at this SourceBuf
fer object. |
| 838 scheduleEvent(EventTypeNames::update); |
| 839 |
| 840 // 5. Queue a task to fire a simple event named updateend at this Source
Buffer object. |
| 841 scheduleEvent(EventTypeNames::updateend); |
| 825 } | 842 } |
| 826 | 843 |
| 827 // 3. Set the updating attribute to false. | |
| 828 m_updating = false; | |
| 829 m_pendingAppendData.clear(); | |
| 830 m_pendingAppendDataOffset = 0; | |
| 831 | |
| 832 // 4. Queue a task to fire a simple event named update at this SourceBuffer
object. | |
| 833 scheduleEvent(EventTypeNames::update); | |
| 834 | |
| 835 // 5. Queue a task to fire a simple event named updateend at this SourceBuff
er object. | |
| 836 scheduleEvent(EventTypeNames::updateend); | |
| 837 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendBuffer", this); | 844 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendBuffer", this); |
| 838 SBLOG << __FUNCTION__ << " done. this=" << this << " buffered=" << webTimeRa
ngesToString(m_webSourceBuffer->buffered()); | 845 SBLOG << __FUNCTION__ << " done. this=" << this << " buffered=" << webTimeRa
ngesToString(m_webSourceBuffer->buffered()); |
| 839 } | 846 } |
| 840 | 847 |
| 841 void SourceBuffer::removeAsyncPart() | 848 void SourceBuffer::removeAsyncPart() |
| 842 { | 849 { |
| 843 DCHECK(m_updating); | 850 DCHECK(m_updating); |
| 844 DCHECK_GE(m_pendingRemoveStart, 0); | 851 DCHECK_GE(m_pendingRemoveStart, 0); |
| 845 DCHECK_LT(m_pendingRemoveStart, m_pendingRemoveEnd); | 852 DCHECK_LT(m_pendingRemoveStart, m_pendingRemoveEnd); |
| 846 | 853 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 901 DCHECK(m_loader); | 908 DCHECK(m_loader); |
| 902 DCHECK(m_stream); | 909 DCHECK(m_stream); |
| 903 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendStream", this, "a
ppendStreamAsyncPart"); | 910 TRACE_EVENT_ASYNC_STEP_INTO0("media", "SourceBuffer::appendStream", this, "a
ppendStreamAsyncPart"); |
| 904 | 911 |
| 905 // Section 3.5.6 Stream Append Loop | 912 // Section 3.5.6 Stream Append Loop |
| 906 // http://w3c.github.io/media-source/#sourcebuffer-stream-append-loop | 913 // http://w3c.github.io/media-source/#sourcebuffer-stream-append-loop |
| 907 | 914 |
| 908 // 1. If maxSize is set, then let bytesLeft equal maxSize. | 915 // 1. If maxSize is set, then let bytesLeft equal maxSize. |
| 909 // 2. Loop Top: If maxSize is set and bytesLeft equals 0, then jump to the l
oop done step below. | 916 // 2. Loop Top: If maxSize is set and bytesLeft equals 0, then jump to the l
oop done step below. |
| 910 if (m_streamMaxSizeValid && !m_streamMaxSize) { | 917 if (m_streamMaxSizeValid && !m_streamMaxSize) { |
| 911 appendStreamDone(true); | 918 appendStreamDone(false, false); |
| 912 return; | 919 return; |
| 913 } | 920 } |
| 914 | 921 |
| 915 // Steps 3-11 are handled by m_loader. | 922 // Steps 3-11 are handled by m_loader. |
| 916 // Note: Passing 0 here signals that maxSize was not set. (i.e. Read all the
data in the stream). | 923 // Note: Passing 0 here signals that maxSize was not set. (i.e. Read all the
data in the stream). |
| 917 m_loader->start(getExecutionContext(), *m_stream, m_streamMaxSizeValid ? m_s
treamMaxSize : 0); | 924 m_loader->start(getExecutionContext(), *m_stream, m_streamMaxSizeValid ? m_s
treamMaxSize : 0); |
| 918 } | 925 } |
| 919 | 926 |
| 920 void SourceBuffer::appendStreamDone(bool success) | 927 void SourceBuffer::appendStreamDone(bool runAppendError, bool decodeError) |
| 921 { | 928 { |
| 922 DCHECK(m_updating); | 929 DCHECK(m_updating); |
| 923 DCHECK(m_loader); | 930 DCHECK(m_loader); |
| 924 DCHECK(m_stream); | 931 DCHECK(m_stream); |
| 925 | 932 |
| 926 clearAppendStreamState(); | 933 clearAppendStreamState(); |
| 927 | 934 |
| 928 if (!success) { | 935 if (runAppendError) { |
| 929 appendError(false); | 936 appendError(decodeError); |
| 930 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this); | 937 TRACE_EVENT_ASYNC_END0("media", "SourceBuffer::appendStream", this); |
| 931 return; | 938 return; |
| 932 } | 939 } |
| 933 | 940 |
| 934 // Section 3.5.6 Stream Append Loop | 941 // Section 3.5.6 Stream Append Loop |
| 935 // Steps 1-11 are handled by appendStreamAsyncPart(), |m_loader|, and |m_web
SourceBuffer|. | 942 // Steps 1-11 are handled by appendStreamAsyncPart(), |m_loader|, and |m_web
SourceBuffer|. |
| 936 | 943 |
| 937 // 12. Loop Done: Set the updating attribute to false. | 944 // 12. Loop Done: Set the updating attribute to false. |
| 938 m_updating = false; | 945 m_updating = false; |
| 939 | 946 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 988 SBLOG << __FUNCTION__ << " this=" << this << " dataLength=" << dataLength; | 995 SBLOG << __FUNCTION__ << " this=" << this << " dataLength=" << dataLength; |
| 989 DCHECK(m_updating); | 996 DCHECK(m_updating); |
| 990 DCHECK(m_loader); | 997 DCHECK(m_loader); |
| 991 | 998 |
| 992 // Section 3.5.6 Stream Append Loop | 999 // Section 3.5.6 Stream Append Loop |
| 993 // http://w3c.github.io/media-source/#sourcebuffer-stream-append-loop | 1000 // http://w3c.github.io/media-source/#sourcebuffer-stream-append-loop |
| 994 | 1001 |
| 995 // 10. Run the coded frame eviction algorithm. | 1002 // 10. Run the coded frame eviction algorithm. |
| 996 if (!evictCodedFrames(dataLength)) { | 1003 if (!evictCodedFrames(dataLength)) { |
| 997 // 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. | 1004 // 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. |
| 998 appendStreamDone(false); | 1005 appendStreamDone(true, false); |
| 999 return; | 1006 return; |
| 1000 } | 1007 } |
| 1001 | 1008 |
| 1002 m_webSourceBuffer->append(reinterpret_cast<const unsigned char*>(data), data
Length, &m_timestampOffset); | 1009 if (!m_webSourceBuffer->append(reinterpret_cast<const unsigned char*>(data),
dataLength, &m_timestampOffset)) |
| 1010 appendStreamDone(true, true); |
| 1003 } | 1011 } |
| 1004 | 1012 |
| 1005 void SourceBuffer::didFinishLoading() | 1013 void SourceBuffer::didFinishLoading() |
| 1006 { | 1014 { |
| 1007 SBLOG << __FUNCTION__ << " this=" << this; | 1015 SBLOG << __FUNCTION__ << " this=" << this; |
| 1008 DCHECK(m_loader); | 1016 DCHECK(m_loader); |
| 1009 appendStreamDone(true); | 1017 appendStreamDone(false, false); |
| 1010 } | 1018 } |
| 1011 | 1019 |
| 1012 void SourceBuffer::didFail(FileError::ErrorCode errorCode) | 1020 void SourceBuffer::didFail(FileError::ErrorCode errorCode) |
| 1013 { | 1021 { |
| 1014 SBLOG << __FUNCTION__ << " this=" << this << " errorCode=" << errorCode; | 1022 SBLOG << __FUNCTION__ << " this=" << this << " errorCode=" << errorCode; |
| 1015 // m_loader might be already released, in case appendStream has failed due | 1023 // m_loader might be already released, in case appendStream has failed due |
| 1016 // to evictCodedFrames failing in didReceiveDataForClient. In that case | 1024 // to evictCodedFrames or WebSourceBuffer append failing in |
| 1017 // appendStreamDone will be invoked from there, no need to repeat it here. | 1025 // didReceiveDataForClient. In that case appendStreamDone will be invoked |
| 1026 // from there, no need to repeat it here. |
| 1018 if (m_loader) | 1027 if (m_loader) |
| 1019 appendStreamDone(false); | 1028 appendStreamDone(true, false); |
| 1020 } | 1029 } |
| 1021 | 1030 |
| 1022 DEFINE_TRACE(SourceBuffer) | 1031 DEFINE_TRACE(SourceBuffer) |
| 1023 { | 1032 { |
| 1024 visitor->trace(m_source); | 1033 visitor->trace(m_source); |
| 1025 visitor->trace(m_trackDefaults); | 1034 visitor->trace(m_trackDefaults); |
| 1026 visitor->trace(m_asyncEventQueue); | 1035 visitor->trace(m_asyncEventQueue); |
| 1027 visitor->trace(m_appendBufferAsyncPartRunner); | 1036 visitor->trace(m_appendBufferAsyncPartRunner); |
| 1028 visitor->trace(m_removeAsyncPartRunner); | 1037 visitor->trace(m_removeAsyncPartRunner); |
| 1029 visitor->trace(m_appendStreamAsyncPartRunner); | 1038 visitor->trace(m_appendStreamAsyncPartRunner); |
| 1030 visitor->trace(m_stream); | 1039 visitor->trace(m_stream); |
| 1031 visitor->trace(m_audioTracks); | 1040 visitor->trace(m_audioTracks); |
| 1032 visitor->trace(m_videoTracks); | 1041 visitor->trace(m_videoTracks); |
| 1033 EventTargetWithInlineData::trace(visitor); | 1042 EventTargetWithInlineData::trace(visitor); |
| 1034 ActiveDOMObject::trace(visitor); | 1043 ActiveDOMObject::trace(visitor); |
| 1035 } | 1044 } |
| 1036 | 1045 |
| 1037 } // namespace blink | 1046 } // namespace blink |
| OLD | NEW |