Chromium Code Reviews| Index: third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp |
| diff --git a/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp b/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp |
| index c68e8935a32394a62ba1d82f16abf2ddafa2c66d..cc6b59500d5bf7ad22b159f878d1ab34b5fd4393 100644 |
| --- a/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp |
| +++ b/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp |
| @@ -487,12 +487,78 @@ void SourceBuffer::removedFromMediaSource() |
| WTF_LOG(Media, "SourceBuffer(%p)::removedFromMediaSource", this); |
| abortIfUpdating(); |
| + if (m_source->mediaElement() && RuntimeEnabledFeatures::audioVideoTracksEnabled()) |
| + removeMediaTracks(); |
| + |
| m_webSourceBuffer->removedFromMediaSource(); |
| m_webSourceBuffer.clear(); |
| m_source = nullptr; |
| m_asyncEventQueue = nullptr; |
| } |
| +void SourceBuffer::removeMediaTracks() |
| +{ |
| + ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); |
| + // Spec: http://w3c.github.io/media-source/#widl-MediaSource-removeSourceBuffer-void-SourceBuffer-sourceBuffer |
| + ASSERT(m_source); |
| + |
| + HTMLMediaElement* mediaElement = m_source->mediaElement(); |
| + ASSERT(mediaElement); |
| + // 3. Let SourceBuffer audioTracks list equal the AudioTrackList object returned by sourceBuffer.audioTracks. |
| + // 4. If the SourceBuffer audioTracks list is not empty, then run the following steps: |
| + // 4.1 Let HTMLMediaElement audioTracks list equal the AudioTrackList object returned by the audioTracks attribute on the HTMLMediaElement. |
| + // 4.2 Let the removed enabled audio track flag equal false. |
| + bool removedEnabledAudioTrack = false; |
| + // 4.3 For each AudioTrack object in the SourceBuffer audioTracks list, run the following steps: |
| + while (audioTracks().length() > 0) { |
| + AudioTrack* audioTrack = audioTracks().anonymousIndexedGetter(0); |
| + // TODO(servolk): 4.3.1 Set the sourceBuffer attribute on the AudioTrack object to null. |
|
wolenetz
2016/03/31 19:06:15
Is this not doable once https://codereview.chromiu
servolk
2016/03/31 22:39:51
Done.
|
| + // 4.3.2 If the enabled attribute on the AudioTrack object is true, then set the removed enabled audio track flag to true. |
| + if (audioTrack->enabled()) |
| + removedEnabledAudioTrack = true; |
| + // 4.3.3 Remove the AudioTrack object from the HTMLMediaElement audioTracks list. |
| + // 4.3.4 Queue a task to fire a trusted event named removetrack, that does not bubble and is not cancelable, and that uses the TrackEvent interface, at the HTMLMediaElement audioTracks list. |
| + mediaElement->audioTracks().remove(audioTrack->trackId()); |
| + // 4.3.5 Remove the AudioTrack object from the SourceBuffer audioTracks list. |
| + // 4.3.6 Queue a task to fire a trusted event named removetrack, that does not bubble and is not cancelable, and that uses the TrackEvent interface, at the SourceBuffer audioTracks list. |
| + audioTracks().remove(audioTrack->trackId()); |
| + } |
| + // 4.4 If the removed enabled audio track flag equals true, then queue a task to fire a simple event named change at the HTMLMediaElement audioTracks list. |
| + if (removedEnabledAudioTrack) { |
| + RefPtrWillBeRawPtr<Event> event = Event::create(EventTypeNames::change); |
| + event->setTarget(&mediaElement->audioTracks()); |
| + mediaElement->scheduleEvent(event); |
| + } |
| + |
| + // 5. Let SourceBuffer videoTracks list equal the VideoTrackList object returned by sourceBuffer.videoTracks. |
| + // 6. If the SourceBuffer videoTracks list is not empty, then run the following steps: |
| + // 6.1 Let HTMLMediaElement videoTracks list equal the VideoTrackList object returned by the videoTracks attribute on the HTMLMediaElement. |
| + // 6.2 Let the removed selected video track flag equal false. |
| + bool removedSelectedVideoTrack = false; |
| + // 6.3 For each VideoTrack object in the SourceBuffer videoTracks list, run the following steps: |
| + while (videoTracks().length() > 0) { |
| + VideoTrack* videoTrack = videoTracks().anonymousIndexedGetter(0); |
| + // TODO(servolk): 6.3.1 Set the sourceBuffer attribute on the VideoTrack object to null. |
|
wolenetz
2016/03/31 19:06:15
ditto
servolk
2016/03/31 22:39:51
Done.
|
| + // 6.3.2 If the selected attribute on the VideoTrack object is true, then set the removed selected video track flag to true. |
| + if (videoTrack->selected()) |
| + removedSelectedVideoTrack = true; |
| + // 6.3.3 Remove the VideoTrack object from the HTMLMediaElement videoTracks list. |
| + // 6.3.4 Queue a task to fire a trusted event named removetrack, that does not bubble and is not cancelable, and that uses the TrackEvent interface, at the HTMLMediaElement videoTracks list. |
| + mediaElement->videoTracks().remove(videoTrack->trackId()); |
| + // 6.3.5 Remove the VideoTrack object from the SourceBuffer videoTracks list. |
| + // 6.3.6 Queue a task to fire a trusted event named removetrack, that does not bubble and is not cancelable, and that uses the TrackEvent interface, at the SourceBuffer videoTracks list. |
| + videoTracks().remove(videoTrack->trackId()); |
| + } |
| + // 6.4 If the removed selected video track flag equals true, then queue a task to fire a simple event named change at the HTMLMediaElement videoTracks list. |
| + if (removedSelectedVideoTrack) { |
| + RefPtrWillBeRawPtr<Event> event = Event::create(EventTypeNames::change); |
| + event->setTarget(&mediaElement->videoTracks()); |
| + mediaElement->scheduleEvent(event); |
| + } |
| + |
| + // 7-8. TODO(servolk): Remove text tracks once SourceBuffer has text tracks. |
| +} |
| + |
| template<class T> |
| T* findExistingTrackById(const TrackListBase<T>& trackList, const String& id) |
| { |