| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple 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 | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 #include "public/platform/Platform.h" | 74 #include "public/platform/Platform.h" |
| 75 #include "public/platform/WebContentDecryptionModule.h" | 75 #include "public/platform/WebContentDecryptionModule.h" |
| 76 #include "public/platform/WebInbandTextTrack.h" | 76 #include "public/platform/WebInbandTextTrack.h" |
| 77 #include "wtf/CurrentTime.h" | 77 #include "wtf/CurrentTime.h" |
| 78 #include "wtf/MathExtras.h" | 78 #include "wtf/MathExtras.h" |
| 79 #include "wtf/NonCopyingSort.h" | 79 #include "wtf/NonCopyingSort.h" |
| 80 #include "wtf/Uint8Array.h" | 80 #include "wtf/Uint8Array.h" |
| 81 #include "wtf/text/CString.h" | 81 #include "wtf/text/CString.h" |
| 82 #include <limits> | 82 #include <limits> |
| 83 | 83 |
| 84 #if ENABLE(WEB_AUDIO) | |
| 85 #include "platform/audio/AudioSourceProvider.h" | 84 #include "platform/audio/AudioSourceProvider.h" |
| 86 #include "platform/audio/AudioSourceProviderClient.h" | 85 #include "platform/audio/AudioSourceProviderClient.h" |
| 87 #endif | |
| 88 | 86 |
| 89 using blink::WebInbandTextTrack; | 87 using blink::WebInbandTextTrack; |
| 90 using blink::WebMediaPlayer; | 88 using blink::WebMediaPlayer; |
| 91 using blink::WebMimeRegistry; | 89 using blink::WebMimeRegistry; |
| 92 using blink::WebMediaPlayerClient; | 90 using blink::WebMediaPlayerClient; |
| 93 | 91 |
| 94 namespace blink { | 92 namespace blink { |
| 95 | 93 |
| 96 #if !LOG_DISABLED | 94 #if !LOG_DISABLED |
| 97 static String urlForLoggingMedia(const KURL& url) | 95 static String urlForLoggingMedia(const KURL& url) |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 m_mediaElement->endIgnoringTrackDisplayUpdateRequests(); | 163 m_mediaElement->endIgnoringTrackDisplayUpdateRequests(); |
| 166 } | 164 } |
| 167 | 165 |
| 168 private: | 166 private: |
| 169 RawPtrWillBeMember<HTMLMediaElement> m_mediaElement; | 167 RawPtrWillBeMember<HTMLMediaElement> m_mediaElement; |
| 170 }; | 168 }; |
| 171 | 169 |
| 172 class AudioSourceProviderClientLockScope { | 170 class AudioSourceProviderClientLockScope { |
| 173 STACK_ALLOCATED(); | 171 STACK_ALLOCATED(); |
| 174 public: | 172 public: |
| 175 #if ENABLE(WEB_AUDIO) | |
| 176 AudioSourceProviderClientLockScope(HTMLMediaElement& element) | 173 AudioSourceProviderClientLockScope(HTMLMediaElement& element) |
| 177 : m_client(element.audioSourceNode()) | 174 : m_client(element.audioSourceNode()) |
| 178 { | 175 { |
| 179 if (m_client) | 176 if (m_client) |
| 180 m_client->lock(); | 177 m_client->lock(); |
| 181 } | 178 } |
| 182 ~AudioSourceProviderClientLockScope() | 179 ~AudioSourceProviderClientLockScope() |
| 183 { | 180 { |
| 184 if (m_client) | 181 if (m_client) |
| 185 m_client->unlock(); | 182 m_client->unlock(); |
| 186 } | 183 } |
| 187 | 184 |
| 188 private: | 185 private: |
| 189 Member<AudioSourceProviderClient> m_client; | 186 Member<AudioSourceProviderClient> m_client; |
| 190 #else | |
| 191 explicit AudioSourceProviderClientLockScope(HTMLMediaElement&) { } | |
| 192 ~AudioSourceProviderClientLockScope() { } | |
| 193 #endif | |
| 194 }; | 187 }; |
| 195 | 188 |
| 196 static const AtomicString& AudioKindToString(WebMediaPlayerClient::AudioTrackKin
d kind) | 189 static const AtomicString& AudioKindToString(WebMediaPlayerClient::AudioTrackKin
d kind) |
| 197 { | 190 { |
| 198 switch (kind) { | 191 switch (kind) { |
| 199 case WebMediaPlayerClient::AudioTrackKindNone: | 192 case WebMediaPlayerClient::AudioTrackKindNone: |
| 200 return emptyAtom; | 193 return emptyAtom; |
| 201 case WebMediaPlayerClient::AudioTrackKindAlternative: | 194 case WebMediaPlayerClient::AudioTrackKindAlternative: |
| 202 return AudioTrack::alternativeKeyword(); | 195 return AudioTrack::alternativeKeyword(); |
| 203 case WebMediaPlayerClient::AudioTrackKindDescriptions: | 196 case WebMediaPlayerClient::AudioTrackKindDescriptions: |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 , m_playingRemotely(false) | 348 , m_playingRemotely(false) |
| 356 #if ENABLE(OILPAN) | 349 #if ENABLE(OILPAN) |
| 357 , m_isFinalizing(false) | 350 , m_isFinalizing(false) |
| 358 , m_closeMediaSourceWhenFinalizing(false) | 351 , m_closeMediaSourceWhenFinalizing(false) |
| 359 #endif | 352 #endif |
| 360 , m_lastTextTrackUpdateTime(-1) | 353 , m_lastTextTrackUpdateTime(-1) |
| 361 , m_audioTracks(AudioTrackList::create(*this)) | 354 , m_audioTracks(AudioTrackList::create(*this)) |
| 362 , m_videoTracks(VideoTrackList::create(*this)) | 355 , m_videoTracks(VideoTrackList::create(*this)) |
| 363 , m_textTracks(nullptr) | 356 , m_textTracks(nullptr) |
| 364 , m_ignoreTrackDisplayUpdate(0) | 357 , m_ignoreTrackDisplayUpdate(0) |
| 365 #if ENABLE(WEB_AUDIO) | |
| 366 , m_audioSourceNode(nullptr) | 358 , m_audioSourceNode(nullptr) |
| 367 #endif | |
| 368 { | 359 { |
| 369 ASSERT(RuntimeEnabledFeatures::mediaEnabled()); | 360 ASSERT(RuntimeEnabledFeatures::mediaEnabled()); |
| 370 | 361 |
| 371 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement(%p)", this); | 362 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement(%p)", this); |
| 372 | 363 |
| 373 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes
ture()) | 364 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes
ture()) |
| 374 m_userGestureRequiredForPlay = true; | 365 m_userGestureRequiredForPlay = true; |
| 375 | 366 |
| 376 setHasCustomStyleCallbacks(); | 367 setHasCustomStyleCallbacks(); |
| 377 addElementToDocumentMap(this, &document); | 368 addElementToDocumentMap(this, &document); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 // avoid having to finalize it from here; this whole #if block | 445 // avoid having to finalize it from here; this whole #if block |
| 455 // could then be removed (along with the state bit it depends on.) | 446 // could then be removed (along with the state bit it depends on.) |
| 456 // crbug.com/378229 | 447 // crbug.com/378229 |
| 457 m_isFinalizing = true; | 448 m_isFinalizing = true; |
| 458 #endif | 449 #endif |
| 459 | 450 |
| 460 // m_audioSourceNode is explicitly cleared by AudioNode::dispose(). | 451 // m_audioSourceNode is explicitly cleared by AudioNode::dispose(). |
| 461 // Since AudioNode::dispose() is guaranteed to be always called before | 452 // Since AudioNode::dispose() is guaranteed to be always called before |
| 462 // the AudioNode is destructed, m_audioSourceNode is explicitly cleared | 453 // the AudioNode is destructed, m_audioSourceNode is explicitly cleared |
| 463 // even if the AudioNode and the HTMLMediaElement die together. | 454 // even if the AudioNode and the HTMLMediaElement die together. |
| 464 #if ENABLE(WEB_AUDIO) | |
| 465 ASSERT(!m_audioSourceNode); | 455 ASSERT(!m_audioSourceNode); |
| 466 #endif | |
| 467 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); | 456 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); |
| 468 | 457 |
| 469 #if !ENABLE(OILPAN) | 458 #if !ENABLE(OILPAN) |
| 470 document().decrementLoadEventDelayCount(); | 459 document().decrementLoadEventDelayCount(); |
| 471 #endif | 460 #endif |
| 472 } | 461 } |
| 473 | 462 |
| 474 #if ENABLE(OILPAN) | 463 #if ENABLE(OILPAN) |
| 475 void HTMLMediaElement::setCloseMediaSourceWhenFinalizing() | 464 void HTMLMediaElement::setCloseMediaSourceWhenFinalizing() |
| 476 { | 465 { |
| (...skipping 2969 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3446 | 3435 |
| 3447 // Reset m_readyState since m_player is gone. | 3436 // Reset m_readyState since m_player is gone. |
| 3448 m_readyState = HAVE_NOTHING; | 3437 m_readyState = HAVE_NOTHING; |
| 3449 invalidateCachedTime(); | 3438 invalidateCachedTime(); |
| 3450 updateMediaController(); | 3439 updateMediaController(); |
| 3451 updateActiveTextTrackCues(0); | 3440 updateActiveTextTrackCues(0); |
| 3452 } | 3441 } |
| 3453 | 3442 |
| 3454 void HTMLMediaElement::clearMediaPlayerAndAudioSourceProviderClientWithoutLockin
g() | 3443 void HTMLMediaElement::clearMediaPlayerAndAudioSourceProviderClientWithoutLockin
g() |
| 3455 { | 3444 { |
| 3456 #if ENABLE(WEB_AUDIO) | |
| 3457 if (audioSourceProvider()) | 3445 if (audioSourceProvider()) |
| 3458 audioSourceProvider()->setClient(0); | 3446 audioSourceProvider()->setClient(0); |
| 3459 #endif | |
| 3460 m_player.clear(); | 3447 m_player.clear(); |
| 3461 } | 3448 } |
| 3462 | 3449 |
| 3463 void HTMLMediaElement::clearMediaPlayer(int flags) | 3450 void HTMLMediaElement::clearMediaPlayer(int flags) |
| 3464 { | 3451 { |
| 3465 forgetResourceSpecificTracks(); | 3452 forgetResourceSpecificTracks(); |
| 3466 | 3453 |
| 3467 closeMediaSource(); | 3454 closeMediaSource(); |
| 3468 | 3455 |
| 3469 cancelDeferredLoad(); | 3456 cancelDeferredLoad(); |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3800 AudioSourceProviderClientLockScope scope(*this); | 3787 AudioSourceProviderClientLockScope scope(*this); |
| 3801 | 3788 |
| 3802 closeMediaSource(); | 3789 closeMediaSource(); |
| 3803 | 3790 |
| 3804 m_player = MediaPlayer::create(this); | 3791 m_player = MediaPlayer::create(this); |
| 3805 | 3792 |
| 3806 // We haven't yet found out if any remote routes are available. | 3793 // We haven't yet found out if any remote routes are available. |
| 3807 m_remoteRoutesAvailable = false; | 3794 m_remoteRoutesAvailable = false; |
| 3808 m_playingRemotely = false; | 3795 m_playingRemotely = false; |
| 3809 | 3796 |
| 3810 #if ENABLE(WEB_AUDIO) | |
| 3811 if (m_audioSourceNode && audioSourceProvider()) { | 3797 if (m_audioSourceNode && audioSourceProvider()) { |
| 3812 // When creating the player, make sure its AudioSourceProvider knows abo
ut the client. | 3798 // When creating the player, make sure its AudioSourceProvider knows abo
ut the client. |
| 3813 audioSourceProvider()->setClient(m_audioSourceNode); | 3799 audioSourceProvider()->setClient(m_audioSourceNode); |
| 3814 } | 3800 } |
| 3815 #endif | |
| 3816 } | 3801 } |
| 3817 | 3802 |
| 3818 #if ENABLE(WEB_AUDIO) | |
| 3819 void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode) | 3803 void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode) |
| 3820 { | 3804 { |
| 3821 m_audioSourceNode = sourceNode; | 3805 m_audioSourceNode = sourceNode; |
| 3822 | 3806 |
| 3823 AudioSourceProviderClientLockScope scope(*this); | 3807 AudioSourceProviderClientLockScope scope(*this); |
| 3824 if (audioSourceProvider()) | 3808 if (audioSourceProvider()) |
| 3825 audioSourceProvider()->setClient(m_audioSourceNode); | 3809 audioSourceProvider()->setClient(m_audioSourceNode); |
| 3826 } | 3810 } |
| 3827 | 3811 |
| 3828 AudioSourceProvider* HTMLMediaElement::audioSourceProvider() | 3812 AudioSourceProvider* HTMLMediaElement::audioSourceProvider() |
| 3829 { | 3813 { |
| 3830 if (m_player) | 3814 if (m_player) |
| 3831 return m_player->audioSourceProvider(); | 3815 return m_player->audioSourceProvider(); |
| 3832 | 3816 |
| 3833 return 0; | 3817 return 0; |
| 3834 } | 3818 } |
| 3835 #endif | |
| 3836 | 3819 |
| 3837 const AtomicString& HTMLMediaElement::mediaGroup() const | 3820 const AtomicString& HTMLMediaElement::mediaGroup() const |
| 3838 { | 3821 { |
| 3839 return fastGetAttribute(mediagroupAttr); | 3822 return fastGetAttribute(mediagroupAttr); |
| 3840 } | 3823 } |
| 3841 | 3824 |
| 3842 void HTMLMediaElement::setMediaGroup(const AtomicString& group) | 3825 void HTMLMediaElement::setMediaGroup(const AtomicString& group) |
| 3843 { | 3826 { |
| 3844 // When a media element is created with a mediagroup attribute, and when a m
edia element's mediagroup | 3827 // When a media element is created with a mediagroup attribute, and when a m
edia element's mediagroup |
| 3845 // attribute is set, changed, or removed, the user agent must run the follow
ing steps: | 3828 // attribute is set, changed, or removed, the user agent must run the follow
ing steps: |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3986 visitor->trace(m_asyncEventQueue); | 3969 visitor->trace(m_asyncEventQueue); |
| 3987 visitor->trace(m_error); | 3970 visitor->trace(m_error); |
| 3988 visitor->trace(m_currentSourceNode); | 3971 visitor->trace(m_currentSourceNode); |
| 3989 visitor->trace(m_nextChildNodeToConsider); | 3972 visitor->trace(m_nextChildNodeToConsider); |
| 3990 visitor->trace(m_mediaSource); | 3973 visitor->trace(m_mediaSource); |
| 3991 visitor->trace(m_audioTracks); | 3974 visitor->trace(m_audioTracks); |
| 3992 visitor->trace(m_videoTracks); | 3975 visitor->trace(m_videoTracks); |
| 3993 visitor->trace(m_textTracks); | 3976 visitor->trace(m_textTracks); |
| 3994 visitor->trace(m_textTracksWhenResourceSelectionBegan); | 3977 visitor->trace(m_textTracksWhenResourceSelectionBegan); |
| 3995 visitor->trace(m_mediaController); | 3978 visitor->trace(m_mediaController); |
| 3996 #if ENABLE(WEB_AUDIO) | |
| 3997 visitor->registerWeakMembers<HTMLMediaElement, &HTMLMediaElement::clearWeakM
embers>(this); | 3979 visitor->registerWeakMembers<HTMLMediaElement, &HTMLMediaElement::clearWeakM
embers>(this); |
| 3998 #endif | |
| 3999 HeapSupplementable<HTMLMediaElement>::trace(visitor); | 3980 HeapSupplementable<HTMLMediaElement>::trace(visitor); |
| 4000 #endif | 3981 #endif |
| 4001 HTMLElement::trace(visitor); | 3982 HTMLElement::trace(visitor); |
| 4002 } | 3983 } |
| 4003 | 3984 |
| 4004 void HTMLMediaElement::createPlaceholderTracksIfNecessary() | 3985 void HTMLMediaElement::createPlaceholderTracksIfNecessary() |
| 4005 { | 3986 { |
| 4006 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | 3987 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) |
| 4007 return; | 3988 return; |
| 4008 | 3989 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 4022 | 4003 |
| 4023 // Enable the first audio track if an audio track hasn't been enabled yet. | 4004 // Enable the first audio track if an audio track hasn't been enabled yet. |
| 4024 if (audioTracks().length() > 0 && !audioTracks().hasEnabledTrack()) | 4005 if (audioTracks().length() > 0 && !audioTracks().hasEnabledTrack()) |
| 4025 audioTracks().anonymousIndexedGetter(0)->setEnabled(true); | 4006 audioTracks().anonymousIndexedGetter(0)->setEnabled(true); |
| 4026 | 4007 |
| 4027 // Select the first video track if a video track hasn't been selected yet. | 4008 // Select the first video track if a video track hasn't been selected yet. |
| 4028 if (videoTracks().length() > 0 && videoTracks().selectedIndex() == -1) | 4009 if (videoTracks().length() > 0 && videoTracks().selectedIndex() == -1) |
| 4029 videoTracks().anonymousIndexedGetter(0)->setSelected(true); | 4010 videoTracks().anonymousIndexedGetter(0)->setSelected(true); |
| 4030 } | 4011 } |
| 4031 | 4012 |
| 4032 #if ENABLE(WEB_AUDIO) | |
| 4033 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) | 4013 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) |
| 4034 { | 4014 { |
| 4035 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) | 4015 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) |
| 4036 audioSourceProvider()->setClient(0); | 4016 audioSourceProvider()->setClient(0); |
| 4037 } | 4017 } |
| 4038 #endif | |
| 4039 | 4018 |
| 4040 } | 4019 } |
| OLD | NEW |