Changeset 182240 in webkit
- Timestamp:
- Apr 1, 2015, 11:07:16 AM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r182239 r182240 1 2015-04-01 Eric Carlson <eric.carlson@apple.com> 2 3 [Mac] Do not include route button if element does not support target playback 4 https://bugs.webkit.org/show_bug.cgi?id=143251 5 6 Reviewed by Jer Noble. 7 8 * Modules/mediacontrols/mediaControlsApple.js: 9 (Controller.prototype.currentPlaybackTargetIsWireless): Return false if target playback is disabled. 10 (Controller.prototype.updateWirelessTargetAvailable): Do not show the picker if target 11 playback is disabled. 12 (Controller.prototype.handleWirelessPlaybackChange): Call updateWirelessTargetAvailable. 13 14 * dom/Document.cpp: 15 (WebCore::Document::showPlaybackTargetPicker): Update for Page::showPlaybackTargetPicker change. 16 (WebCore::Document::didChoosePlaybackTarget): Notify clients in vector-order, lower level code 17 now tracks which one requested the picker. 18 19 * html/HTMLMediaElement.cpp: 20 (WebCore::HTMLMediaElement::loadResource): Don't call applyMediaPlayerRestrictions, it is done 21 in mediaPlayerEngineFailedToLoad. 22 (WebCore::HTMLMediaElement::setReadyState): Enqueue a target availability event if there are 23 listeners readyState reaches HAVE_METADATA so controls are setup correctly. 24 (WebCore::HTMLMediaElement::mediaPlayerEngineFailedToLoad): Call applyMediaPlayerRestrictions. 25 (WebCore::HTMLMediaElement::clearMediaPlayer): Enqueue a target availability event in so controls 26 have a chance to hide the picker. 27 (WebCore::HTMLMediaElement::webkitCurrentPlaybackTargetIsSupported): New, passthrough to the 28 media engine. 29 (WebCore::HTMLMediaElement::canPlayToWirelessPlaybackTarget): Ditto. 30 (WebCore::HTMLMediaElement::startPlayingToPlaybackTarget): Ditto. 31 (WebCore::HTMLMediaElement::stopPlayingToPlaybackTarget): Ditto. 32 * html/HTMLMediaElement.h: 33 * html/HTMLMediaElement.idl: 34 35 * html/HTMLMediaSession.cpp: 36 (WebCore::HTMLMediaSession::HTMLMediaSession): Initialize m_playbackTarget. 37 (WebCore::HTMLMediaSession::currentPlaybackTargetIsSupported): New. 38 (WebCore::HTMLMediaSession::showPlaybackTargetPicker): Pull logic from showingPlaybackTargetPickerPermitted 39 inline. Don't refuse to show a picker if the element doesn't support target playback, it is up 40 to script to decide which elements can display a picker. 41 (WebCore::HTMLMediaSession::wirelessVideoPlaybackDisabled): Return true if there is no player. 42 (WebCore::HTMLMediaSession::didChoosePlaybackTarget): Call startPlayingToPlaybackTarget or 43 stopPlayingToPlaybackTarget because setWirelessPlaybackTarget doesn't apply the target. 44 (WebCore::HTMLMediaSession::externalOutputDeviceAvailableDidChange): Add logging. 45 (WebCore::HTMLMediaSession::showingPlaybackTargetPickerPermitted): Deleted. 46 * html/HTMLMediaSession.h: 47 48 * page/Page.cpp: 49 (WebCore::Page::Page): Initialize m_playbackTarget. 50 (WebCore::Page::showPlaybackTargetPicker): Don't set m_documentRequestingPlaybackTargetPicker. 51 (WebCore::Page::didChoosePlaybackTarget): Notify Pages in vector-order, lower level code 52 now tracks which one requested the picker. 53 (WebCore::Page::configurePlaybackTargetMonitoring): Don't track m_requiresPlaybackTargetMonitoring, it 54 is too easy for it to get out of sync with the UI process state. 55 * page/Page.h: 56 57 * platform/audio/MediaSession.cpp: 58 (WebCore::MediaSession::canPlayToWirelessPlaybackTarget): New, client passthrough. 59 (WebCore::MediaSession::startPlayingToPlaybackTarget): Ditto. 60 (WebCore::MediaSession::stopPlayingToPlaybackTarget): Ditto. 61 * platform/audio/MediaSession.h: 62 (WebCore::MediaSessionClient::canPlayToWirelessPlaybackTarget): 63 (WebCore::MediaSessionClient::startPlayingToPlaybackTarget): 64 (WebCore::MediaSessionClient::stopPlayingToPlaybackTarget): 65 66 * platform/audio/MediaSessionManager.cpp: 67 (WebCore::MediaSessionManager::sessionWillBeginPlayback): Call startPlayingToPlaybackTarget & 68 stopPlayingToPlaybackTarget as necessary. 69 * platform/audio/MediaSessionManager.h: 70 71 * platform/graphics/MediaPlaybackTarget.h: 72 (WebCore::MediaPlaybackTarget::hasActiveRoute): New. 73 * platform/graphics/MediaPlaybackTargetPickerClient.h: 74 * platform/graphics/MediaPlayer.cpp: 75 (WebCore::MediaPlayer::isCurrentPlaybackTargetSupported): New, engine passthrough. 76 (WebCore::MediaPlayer::canPlayToWirelessPlaybackTarget): Ditto. 77 (WebCore::MediaPlayer::startPlayingToPlaybackTarget): Ditto. 78 (WebCore::MediaPlayer::stopPlayingToPlaybackTarget): Ditto. 79 * platform/graphics/MediaPlayer.h: 80 * platform/graphics/MediaPlayerPrivate.h: 81 (WebCore::MediaPlayerPrivateInterface::isCurrentPlaybackTargetSupported): 82 (WebCore::MediaPlayerPrivateInterface::wirelessVideoPlaybackDisabled): 83 (WebCore::MediaPlayerPrivateInterface::canPlayToWirelessPlaybackTarget): 84 (WebCore::MediaPlayerPrivateInterface::startPlayingToPlaybackTarget): 85 (WebCore::MediaPlayerPrivateInterface::stopPlayingToPlaybackTarget): 86 87 * platform/graphics/avfoundation/MediaPlaybackTargetMac.mm: 88 (WebCore::MediaPlaybackTarget::hasActiveRoute): New. 89 90 * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h: 91 (WebCore::MediaPlayerPrivateAVFoundationObjC::canPlayToWirelessPlaybackTarget): 92 * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm: 93 (WebCore::MediaPlayerPrivateAVFoundationObjC::cancelLoad): Use playerKVOProperties. Drive-by 94 code cleanup. 95 (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayer): Use playerKVOProperties. 96 (WebCore::MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetName): Implement for Mac. 97 (WebCore::MediaPlayerPrivateAVFoundationObjC::setWirelessVideoPlaybackDisabled): Delay callbacks 98 while setting AVPlayer property. 99 (WebCore::MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget): Add logging. Don't set 100 the AVPlayer outputContext immediately. 101 (WebCore::MediaPlayerPrivateAVFoundationObjC::startPlayingToPlaybackTarget): New. 102 (WebCore::MediaPlayerPrivateAVFoundationObjC::stopPlayingToPlaybackTarget): New. 103 (WebCore::playerKVOProperties): New. 104 (-[WebCoreAVFMovieObserver observeValueForKeyPath:ofObject:change:context:]): Notify when 105 allowsExternalPlayback changes. 106 107 * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h: 108 * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm: 109 (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::isCurrentPlaybackTargetSupported): New. 110 (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::setWirelessPlaybackTarget): Ditto. 111 (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::togglePlayingToPlaybackTarget): Ditto. 112 (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::startPlayingToPlaybackTarget): Ditto. 113 (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::stopPlayingToPlaybackTarget): Ditto. 114 115 * platform/graphics/mac/MediaPlayerPrivateQTKit.h: 116 * platform/graphics/mac/MediaPlayerPrivateQTKit.mm: 117 (WebCore::MediaPlayerPrivateQTKit::isCurrentPlaybackTargetSupported): Ditto. 118 (WebCore::MediaPlayerPrivateQTKit::setWirelessPlaybackTarget): Ditto. 119 (WebCore::MediaPlayerPrivateQTKit::togglePlayingToPlaybackTarget): Ditto. 120 (WebCore::MediaPlayerPrivateQTKit::startPlayingToPlaybackTarget): Ditto. 121 (WebCore::MediaPlayerPrivateQTKit::stopPlayingToPlaybackTarget): Ditto. 122 1 123 2015-04-01 Alex Christensen <achristensen@webkit.org> 2 124 -
trunk/Source/WebCore/Modules/mediacontrols/mediaControlsApple.js
r182036 r182240 1696 1696 1697 1697 currentPlaybackTargetIsWireless: function() { 1698 return Controller.gSimulateWirelessPlaybackTarget || (('webkitCurrentPlaybackTargetIsWireless' in this.video) && this.video.webkitCurrentPlaybackTargetIsWireless); 1698 if (Controller.gSimulateWirelessPlaybackTarget) 1699 return true; 1700 1701 if (!this.video.webkitCurrentPlaybackTargetIsWireless || this.video.webkitWirelessVideoPlaybackDisabled) 1702 return false; 1703 1704 return true; 1699 1705 }, 1700 1706 … … 1741 1747 1742 1748 updateWirelessTargetAvailable: function() { 1743 if (Controller.gSimulateWirelessPlaybackTarget || this.hasWirelessPlaybackTargets) 1749 var wirelessPlaybackTargetsAvailable = Controller.gSimulateWirelessPlaybackTarget || this.hasWirelessPlaybackTargets; 1750 if (this.video.webkitWirelessVideoPlaybackDisabled) 1751 wirelessPlaybackTargetsAvailable = false; 1752 1753 if (wirelessPlaybackTargetsAvailable) 1744 1754 this.controls.wirelessTargetPicker.classList.remove(this.ClassNames.hidden); 1745 1755 else … … 1754 1764 1755 1765 handleWirelessPlaybackChange: function(event) { 1766 this.updateWirelessTargetAvailable(); 1756 1767 this.updateWirelessPlaybackStatus(); 1757 1768 this.setNeedsTimelineMetricsUpdate(); -
trunk/Source/WebCore/dom/Document.cpp
r182215 r182240 6551 6551 return; 6552 6552 6553 page->showPlaybackTargetPicker( this,view()->lastKnownMousePosition(), is<HTMLVideoElement>(element));6553 page->showPlaybackTargetPicker(view()->lastKnownMousePosition(), is<HTMLVideoElement>(element)); 6554 6554 } 6555 6555 … … 6605 6605 void Document::didChoosePlaybackTarget(const MediaPlaybackTarget& device) 6606 6606 { 6607 MediaPlaybackTargetPickerClient* clientThatRequestedPicker = nullptr; 6608 6609 for (auto* client : m_playbackTargetClients) { 6610 if (client->requestedPlaybackTargetPicker()) { 6611 clientThatRequestedPicker = client; 6612 continue; 6613 } 6614 6607 for (auto* client : m_playbackTargetClients) 6615 6608 client->didChoosePlaybackTarget(device); 6616 }6617 6618 // Notify the client that requested the chooser last because if more than one6619 // is playing, only the last one to set the context will actually get to play6620 // to the external device.6621 if (clientThatRequestedPicker)6622 clientThatRequestedPicker->didChoosePlaybackTarget(device);6623 6609 } 6624 6610 -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r182205 r182240 1180 1180 mediaLoadingFailed(MediaPlayer::FormatError); 1181 1181 1182 m_mediaSession->applyMediaPlayerRestrictions(*this);1183 1184 1182 // If there is no poster to display, allow the media engine to render video frames as soon as 1185 1183 // they are available. … … 1988 1986 scheduleEvent(eventNames().durationchangeEvent); 1989 1987 scheduleEvent(eventNames().loadedmetadataEvent); 1988 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 1989 if (hasEventListeners(eventNames().webkitplaybacktargetavailabilitychangedEvent)) 1990 enqueuePlaybackTargetAvailabilityChangedEvent(); 1991 #endif 1992 1990 1993 if (hasMediaControls()) 1991 1994 mediaControls()->loadedMetadata(); … … 4269 4272 m_havePreparedToPlay = false; 4270 4273 4274 m_mediaSession->applyMediaPlayerRestrictions(*this); 4275 4271 4276 #if PLATFORM(IOS) 4272 4277 if (!m_player) … … 4655 4660 4656 4661 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 4657 if (hasEventListeners(eventNames().webkitplaybacktargetavailabilitychangedEvent)) 4662 if (hasEventListeners(eventNames().webkitplaybacktargetavailabilitychangedEvent)) { 4658 4663 m_mediaSession->setHasPlaybackTargetAvailabilityListeners(*this, false); 4664 4665 // Send an availability event in case scripts want to hide the picker when the element 4666 // doesn't support playback to a target. 4667 enqueuePlaybackTargetAvailabilityChangedEvent(); 4668 } 4659 4669 #endif 4660 4670 … … 4811 4821 } 4812 4822 4823 bool HTMLMediaElement::webkitCurrentPlaybackTargetIsSupported() const 4824 { 4825 return m_mediaSession->currentPlaybackTargetIsSupported(*this); 4826 } 4827 4813 4828 void HTMLMediaElement::wirelessRoutesAvailableDidChange() 4814 4829 { … … 4869 4884 if (m_player) 4870 4885 m_player->setWirelessPlaybackTarget(device); 4886 } 4887 4888 bool HTMLMediaElement::canPlayToWirelessPlaybackTarget() 4889 { 4890 bool canPlay = m_player && m_player->canPlayToWirelessPlaybackTarget(); 4891 4892 LOG(Media, "HTMLMediaElement::canPlayToWirelessPlaybackTarget(%p) - returning %s", this, boolString(canPlay)); 4893 4894 return canPlay; 4895 } 4896 4897 void HTMLMediaElement::startPlayingToPlaybackTarget() 4898 { 4899 if (m_player) 4900 m_player->startPlayingToPlaybackTarget(); 4901 } 4902 4903 void HTMLMediaElement::stopPlayingToPlaybackTarget() 4904 { 4905 if (m_player) 4906 m_player->stopPlayingToPlaybackTarget(); 4871 4907 } 4872 4908 #endif -
trunk/Source/WebCore/html/HTMLMediaElement.h
r182141 r182240 355 355 void webkitShowPlaybackTargetPicker(); 356 356 bool webkitCurrentPlaybackTargetIsWireless() const; 357 bool webkitCurrentPlaybackTargetIsSupported() const; 357 358 358 359 virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture) override; … … 360 361 361 362 virtual void wirelessRoutesAvailableDidChange() override; 363 virtual bool canPlayToWirelessPlaybackTarget() override; 362 364 virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&) override; 365 virtual void startPlayingToPlaybackTarget() override; 366 virtual void stopPlayingToPlaybackTarget() override; 363 367 #endif 364 368 -
trunk/Source/WebCore/html/HTMLMediaElement.idl
r181358 r182240 117 117 [Conditional=WIRELESS_PLAYBACK_TARGET] void webkitShowPlaybackTargetPicker(); 118 118 [Conditional=WIRELESS_PLAYBACK_TARGET] readonly attribute boolean webkitCurrentPlaybackTargetIsWireless; 119 [Conditional=WIRELESS_PLAYBACK_TARGET] readonly attribute boolean webkitCurrentPlaybackTargetIsSupported; 119 120 }; -
trunk/Source/WebCore/html/HTMLMediaSession.cpp
r181838 r182240 77 77 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 78 78 , m_targetAvailabilityChangedTimer(*this, &HTMLMediaSession::targetAvailabilityChangedTimerFired) 79 , m_playbackTarget(std::make_unique<MediaPlaybackTarget>()) 79 80 #endif 80 81 { … … 164 165 165 166 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 166 bool HTMLMediaSession::showingPlaybackTargetPickerPermitted(const HTMLMediaElement& element) const167 {168 if (m_restrictions & RequireUserGestureToShowPlaybackTargetPicker && !ScriptController::processingUserGesture()) {169 LOG(Media, "HTMLMediaSession::showingPlaybackTargetPickerPermitted - returning FALSE because of permissions");170 return false;171 }172 173 if (!element.document().page()) {174 LOG(Media, "HTMLMediaSession::showingPlaybackTargetPickerPermitted - returning FALSE because page is NULL");175 return false;176 }177 178 return !wirelessVideoPlaybackDisabled(element);179 }180 181 167 bool HTMLMediaSession::currentPlaybackTargetIsWireless(const HTMLMediaElement& element) const 182 168 { … … 193 179 } 194 180 181 bool HTMLMediaSession::currentPlaybackTargetIsSupported(const HTMLMediaElement& element) const 182 { 183 MediaPlayer* player = element.player(); 184 if (!player) { 185 LOG(Media, "HTMLMediaSession::currentPlaybackTargetIsSupported - returning FALSE because player is NULL"); 186 return false; 187 } 188 189 bool isSupported = player->isCurrentPlaybackTargetSupported(); 190 LOG(Media, "HTMLMediaSession::currentPlaybackTargetIsSupported - returning %s", isSupported ? "TRUE" : "FALSE"); 191 192 return isSupported; 193 } 194 195 195 void HTMLMediaSession::showPlaybackTargetPicker(const HTMLMediaElement& element) 196 196 { 197 197 LOG(Media, "HTMLMediaSession::showPlaybackTargetPicker"); 198 198 199 if (!showingPlaybackTargetPickerPermitted(element)) 199 if (m_restrictions & RequireUserGestureToShowPlaybackTargetPicker && !ScriptController::processingUserGesture()) { 200 LOG(Media, "HTMLMediaSession::showPlaybackTargetPicker - returning early because of permissions"); 200 201 return; 201 202 m_haveRequestedPlaybackTargetPicker = true; 202 } 203 204 if (!element.document().page()) { 205 LOG(Media, "HTMLMediaSession::showingPlaybackTargetPickerPermitted - returning early because page is NULL"); 206 return; 207 } 208 209 MediaSessionManager::sharedManager().setCurrentSession(*this); 203 210 element.document().showPlaybackTargetPicker(element); 204 211 } … … 239 246 MediaPlayer* player = element.player(); 240 247 if (!player) 241 return false;248 return true; 242 249 243 250 bool disabled = player->wirelessVideoPlaybackDisabled(); … … 278 285 void HTMLMediaSession::didChoosePlaybackTarget(const MediaPlaybackTarget& device) 279 286 { 280 m_haveRequestedPlaybackTargetPicker = false; 281 client().setWirelessPlaybackTarget(device); 287 m_playbackTarget->setDevicePickerContext(device.devicePickerContext()); 288 client().setWirelessPlaybackTarget(*m_playbackTarget.get()); 289 if (device.hasActiveRoute() && MediaSessionManager::sharedManager().currentSession() == this) 290 startPlayingToPlaybackTarget(); 291 else 292 stopPlayingToPlaybackTarget(); 282 293 } 283 294 … … 291 302 if (m_hasPlaybackTargets == hasTargets) 292 303 return; 304 305 LOG(Media, "HTMLMediaSession::externalOutputDeviceAvailableDidChange - hasTargets %s", hasTargets ? "TRUE" : "FALSE"); 293 306 294 307 m_hasPlaybackTargets = hasTargets; -
trunk/Source/WebCore/html/HTMLMediaSession.h
r182068 r182240 55 55 56 56 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 57 bool showingPlaybackTargetPickerPermitted(const HTMLMediaElement&) const;58 57 bool currentPlaybackTargetIsWireless(const HTMLMediaElement&) const; 58 bool currentPlaybackTargetIsSupported(const HTMLMediaElement&) const; 59 59 void showPlaybackTargetPicker(const HTMLMediaElement&); 60 60 bool hasWirelessPlaybackTargets(const HTMLMediaElement&) const; … … 103 103 virtual void externalOutputDeviceAvailableDidChange(bool) const override; 104 104 virtual bool requiresPlaybackTargetRouteMonitoring() const override; 105 virtual bool requestedPlaybackTargetPicker() const override { return m_haveRequestedPlaybackTargetPicker; }106 105 #endif 107 106 … … 110 109 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 111 110 mutable Timer m_targetAvailabilityChangedTimer; 111 std::unique_ptr<MediaPlaybackTarget> m_playbackTarget; 112 112 bool m_hasPlaybackTargetAvailabilityListeners { false }; 113 113 mutable bool m_hasPlaybackTargets { false }; 114 mutable bool m_haveRequestedPlaybackTargetPicker { false };115 114 #endif 116 115 }; -
trunk/Source/WebCore/page/Page.cpp
r182132 r182240 213 213 , m_visitedLinkStore(*WTF::move(pageConfiguration.visitedLinkStore)) 214 214 , m_sessionID(SessionID::defaultSessionID()) 215 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 216 , m_playbackTarget(std::make_unique<MediaPlaybackTarget>()) 217 #endif 215 218 , m_isClosing(false) 216 219 , m_isPlayingAudio(false) … … 1682 1685 1683 1686 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 1684 void Page::showPlaybackTargetPicker(Document* document, const WebCore::IntPoint& location, bool isVideo) 1685 { 1686 m_documentRequestingPlaybackTargetPicker = document; 1687 1687 void Page::showPlaybackTargetPicker(const WebCore::IntPoint& location, bool isVideo) 1688 { 1688 1689 #if PLATFORM(IOS) 1689 1690 // FIXME: refactor iOS implementation. … … 1697 1698 void Page::didChoosePlaybackTarget(const MediaPlaybackTarget& target) 1698 1699 { 1699 Document* documentThatRequestedPicker = nullptr; 1700 1701 m_playbackTarget = std::make_unique<MediaPlaybackTarget>(target.devicePickerContext()); 1702 for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) { 1703 Document* document = frame->document(); 1704 if (frame->document() == m_documentRequestingPlaybackTargetPicker) { 1705 documentThatRequestedPicker = document; 1706 continue; 1707 } 1700 m_playbackTarget->setDevicePickerContext(target.devicePickerContext()); 1701 for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) 1708 1702 frame->document()->didChoosePlaybackTarget(target); 1709 }1710 1711 // Notify the document that requested the chooser last because if more than one element1712 // is playing the last one to set the context will be the one that actually gets to1713 // play to the external device.1714 if (documentThatRequestedPicker)1715 documentThatRequestedPicker->didChoosePlaybackTarget(target);1716 1717 m_documentRequestingPlaybackTargetPicker = nullptr;1718 1703 } 1719 1704 … … 1735 1720 } 1736 1721 1737 if (m_requiresPlaybackTargetMonitoring == monitoringRequired)1738 return;1739 m_requiresPlaybackTargetMonitoring = monitoringRequired;1740 1741 1722 if (monitoringRequired) 1742 1723 chrome().client().startingMonitoringPlaybackTargets(); -
trunk/Source/WebCore/page/Page.h
r182132 r182240 427 427 428 428 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 429 void showPlaybackTargetPicker( Document*,const WebCore::IntPoint&, bool);429 void showPlaybackTargetPicker(const WebCore::IntPoint&, bool); 430 430 bool hasWirelessPlaybackTarget() const { return m_hasWirelessPlaybackTarget; } 431 431 MediaPlaybackTarget& playbackTarget() const { return *m_playbackTarget.get(); } … … 588 588 589 589 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 590 Document* m_documentRequestingPlaybackTargetPicker { nullptr };591 590 std::unique_ptr<MediaPlaybackTarget> m_playbackTarget; 592 bool m_requiresPlaybackTargetMonitoring { false };593 591 bool m_hasWirelessPlaybackTarget { false }; 594 592 #endif -
trunk/Source/WebCore/platform/audio/MediaSession.cpp
r182141 r182240 228 228 } 229 229 230 bool MediaSession::canPlayToWirelessPlaybackTarget() const 231 { 232 return m_client.canPlayToWirelessPlaybackTarget(); 233 } 234 235 void MediaSession::startPlayingToPlaybackTarget() 236 { 237 client().startPlayingToPlaybackTarget(); 238 } 239 240 void MediaSession::stopPlayingToPlaybackTarget() 241 { 242 client().stopPlayingToPlaybackTarget(); 243 } 244 230 245 String MediaSessionClient::mediaSessionTitle() const 231 246 { … … 242 257 return MediaPlayer::invalidTime(); 243 258 } 244 245 259 } 246 260 #endif -
trunk/Source/WebCore/platform/audio/MediaSession.h
r182141 r182240 118 118 bool isHidden() const; 119 119 120 bool canPlayToWirelessPlaybackTarget() const; 121 void startPlayingToPlaybackTarget(); 122 void stopPlayingToPlaybackTarget(); 123 120 124 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 121 125 // MediaPlaybackTargetPickerClient … … 123 127 virtual void externalOutputDeviceAvailableDidChange(bool) const override { } 124 128 virtual bool requiresPlaybackTargetRouteMonitoring() const override { return false; } 125 virtual bool requestedPlaybackTargetPicker() const override { return false; }126 129 #endif 127 130 … … 165 168 virtual bool overrideBackgroundPlaybackRestriction() const = 0; 166 169 167 #if ENABLE(WIRELESS_PLAYBACK_TARGET)168 170 virtual void wirelessRoutesAvailableDidChange() { } 169 171 virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&) { } 170 #endif 172 virtual bool canPlayToWirelessPlaybackTarget() { return false; } 173 virtual void startPlayingToPlaybackTarget() { } 174 virtual void stopPlayingToPlaybackTarget() { } 171 175 172 176 protected: -
trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp
r182141 r182240 187 187 endInterruption(MediaSession::NoFlags); 188 188 189 if (!restrictions & ConcurrentPlaybackNotPermitted) 190 return true; 191 189 bool newSessionCanPlayToPlaybackTarget = session.canPlayToWirelessPlaybackTarget(); 192 190 Vector<MediaSession*> sessions = m_sessions; 193 191 for (auto* oneSession : sessions) { 194 192 if (oneSession == &session) 195 193 continue; 196 if ( oneSession->mediaType() != sessionType)197 continue;198 if ( restrictions & ConcurrentPlaybackNotPermitted)194 if (newSessionCanPlayToPlaybackTarget) 195 oneSession->stopPlayingToPlaybackTarget(); 196 if (oneSession->mediaType() == sessionType && restrictions & ConcurrentPlaybackNotPermitted) 199 197 oneSession->pauseSession(); 200 198 } 201 199 session.startPlayingToPlaybackTarget(); 200 202 201 updateSessionState(); 203 202 return true; -
trunk/Source/WebCore/platform/audio/MediaSessionManager.h
r182141 r182240 86 86 #endif 87 87 88 void setCurrentSession(MediaSession&); 89 MediaSession* currentSession(); 90 88 91 protected: 89 92 friend class MediaSession; … … 92 95 void addSession(MediaSession&); 93 96 void removeSession(MediaSession&); 94 95 void setCurrentSession(MediaSession&);96 MediaSession* currentSession();97 97 98 98 Vector<MediaSession*> sessions() { return m_sessions; } -
trunk/Source/WebCore/platform/graphics/MediaPlaybackTarget.h
r182117 r182240 51 51 void setDevicePickerContext(AVOutputContext *context) { m_devicePickerContext = context; } 52 52 AVOutputContext *devicePickerContext() const { return m_devicePickerContext.get(); } 53 bool hasActiveRoute() const; 54 #else 55 void setDevicePickerContext(AVOutputContext *) { } 56 AVOutputContext *devicePickerContext() const { return nullptr; } 57 bool hasActiveRoute() const { return false; } 53 58 #endif 54 59 -
trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetPickerClient.h
r181838 r182240 43 43 44 44 virtual bool requiresPlaybackTargetRouteMonitoring() const = 0; 45 virtual bool requestedPlaybackTargetPicker() const = 0;46 45 }; 47 46 -
trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp
r181423 r182240 844 844 } 845 845 846 bool MediaPlayer::isCurrentPlaybackTargetSupported() const 847 { 848 return m_private->isCurrentPlaybackTargetSupported(); 849 } 850 846 851 String MediaPlayer::wirelessPlaybackTargetName() const 847 852 { … … 869 874 } 870 875 876 bool MediaPlayer::canPlayToWirelessPlaybackTarget() const 877 { 878 return m_private->canPlayToWirelessPlaybackTarget(); 879 } 880 871 881 void MediaPlayer::setWirelessPlaybackTarget(const MediaPlaybackTarget& device) 872 882 { 873 883 m_private->setWirelessPlaybackTarget(device); 884 } 885 886 void MediaPlayer::startPlayingToPlaybackTarget() 887 { 888 m_private->startPlayingToPlaybackTarget(); 889 } 890 891 void MediaPlayer::stopPlayingToPlaybackTarget() 892 { 893 m_private->stopPlayingToPlaybackTarget(); 874 894 } 875 895 #endif -
trunk/Source/WebCore/platform/graphics/MediaPlayer.h
r181423 r182240 467 467 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 468 468 bool isCurrentPlaybackTargetWireless() const; 469 bool isCurrentPlaybackTargetSupported() const; 469 470 470 471 enum WirelessPlaybackTargetType { TargetTypeNone, TargetTypeAirPlay, TargetTypeTVOut }; … … 479 480 void playbackTargetAvailabilityChanged(); 480 481 482 bool canPlayToWirelessPlaybackTarget() const; 481 483 void setWirelessPlaybackTarget(const MediaPlaybackTarget&); 484 485 void startPlayingToPlaybackTarget(); 486 void stopPlayingToPlaybackTarget(); 482 487 #endif 483 488 -
trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h
r181423 r182240 162 162 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 163 163 virtual bool isCurrentPlaybackTargetWireless() const { return false; } 164 virtual bool isCurrentPlaybackTargetSupported() const { return true; } 164 165 165 166 virtual String wirelessPlaybackTargetName() const { return emptyString(); } 166 167 virtual MediaPlayer::WirelessPlaybackTargetType wirelessPlaybackTargetType() const { return MediaPlayer::TargetTypeNone; } 167 168 168 virtual bool wirelessVideoPlaybackDisabled() const { return false; }169 virtual bool wirelessVideoPlaybackDisabled() const { return true; } 169 170 virtual void setWirelessVideoPlaybackDisabled(bool) { } 170 171 172 virtual bool canPlayToWirelessPlaybackTarget() const { return false; } 171 173 virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&) { } 174 175 virtual void startPlayingToPlaybackTarget() { } 176 virtual void stopPlayingToPlaybackTarget() { } 172 177 #endif 173 178 -
trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlaybackTargetMac.mm
r182117 r182240 29 29 #if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS) 30 30 31 #import <WebCore/ MediaPlaybackTarget.h>31 #import <WebCore/AVFoundationSPI.h> 32 32 #import <WebCore/SoftLinking.h> 33 33 #import <objc/runtime.h> … … 64 64 } 65 65 66 bool MediaPlaybackTarget::hasActiveRoute() const 67 { 68 return m_devicePickerContext && m_devicePickerContext.get().deviceName; 69 } 70 71 66 72 } // namespace WebCore 67 73 -
trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp
r182081 r182240 620 620 void MediaPlayerPrivateAVFoundation::rateChanged() 621 621 { 622 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 622 #if ENABLE(WIRELESS_PLAYBACK_TARGET) && PLATFORM(IOS) 623 623 if (isCurrentPlaybackTargetWireless()) 624 624 m_player->handlePlaybackCommand(rate() ? MediaSession::PlayCommand : MediaSession::PauseCommand); -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h
r182117 r182240 277 277 virtual MediaPlayer::WirelessPlaybackTargetType wirelessPlaybackTargetType() const override; 278 278 virtual bool wirelessVideoPlaybackDisabled() const override; 279 #if !PLATFORM(IOS)280 virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&) override;281 #endif282 279 virtual void setWirelessVideoPlaybackDisabled(bool) override; 283 280 void updateDisableExternalPlayback(); 281 bool canPlayToWirelessPlaybackTarget() const { return true; } 282 #endif 283 284 #if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS) 285 virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&) override; 286 virtual void startPlayingToPlaybackTarget() override; 287 virtual void stopPlayingToPlaybackTarget() override; 284 288 #endif 285 289 -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm
r182117 r182240 348 348 static NSArray *assetMetadataKeyNames(); 349 349 static NSArray *itemKVOProperties(); 350 static NSArray* assetTrackMetadataKeyNames(); 350 static NSArray *assetTrackMetadataKeyNames(); 351 static NSArray *playerKVOProperties(); 351 352 352 353 #if !LOG_DISABLED … … 546 547 [m_avPlayer.get() removeTimeObserver:m_timeObserver.get()]; 547 548 m_timeObserver = nil; 548 [m_avPlayer.get() removeObserver:m_objcObserver.get() forKeyPath:@"rate"]; 549 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 550 [m_avPlayer.get() removeObserver:m_objcObserver.get() forKeyPath:@"externalPlaybackActive"]; 551 [m_avPlayer.get() removeObserver:m_objcObserver.get() forKeyPath:@"outputContext"]; 552 #endif 549 550 for (NSString *keyName in playerKVOProperties()) 551 [m_avPlayer.get() removeObserver:m_objcObserver.get() forKeyPath:keyName]; 553 552 m_avPlayer = nil; 554 553 } … … 928 927 929 928 m_avPlayer = adoptNS([allocAVPlayerInstance() init]); 930 [m_avPlayer.get() addObserver:m_objcObserver.get() forKeyPath:@"rate" options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextPlayer]; 931 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 932 [m_avPlayer.get() addObserver:m_objcObserver.get() forKeyPath:@"externalPlaybackActive" options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextPlayer]; 933 [m_avPlayer.get() addObserver:m_objcObserver.get() forKeyPath:@"outputContext" options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextPlayer]; 929 for (NSString *keyName in playerKVOProperties()) 930 [m_avPlayer.get() addObserver:m_objcObserver.get() forKeyPath:keyName options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextPlayer]; 931 932 #if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP) && HAVE(AVFOUNDATION_LEGIBLE_OUTPUT_SUPPORT) 933 [m_avPlayer.get() setAppliesMediaSelectionCriteriaAutomatically:NO]; 934 934 #endif 935 935 936 936 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 937 937 updateDisableExternalPlayback(); 938 #endif939 940 #if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP) && HAVE(AVFOUNDATION_LEGIBLE_OUTPUT_SUPPORT)941 [m_avPlayer.get() setAppliesMediaSelectionCriteriaAutomatically:NO];942 #endif943 944 #if ENABLE(WIRELESS_PLAYBACK_TARGET)945 938 [m_avPlayer.get() setAllowsExternalPlayback:m_allowsWirelessVideoPlayback]; 946 #endif 947 948 #if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS) 939 940 #if !PLATFORM(IOS) 949 941 if (m_outputContext) 950 942 m_avPlayer.get().outputContext = m_outputContext.get(); 943 #endif 951 944 #endif 952 945 … … 2732 2725 if (!m_avPlayer) 2733 2726 return emptyString(); 2734 2735 String wirelessTargetName = wkExernalDeviceDisplayNameForPlayer(m_avPlayer.get()); 2727 2728 String wirelessTargetName; 2729 #if !PLATFORM(IOS) 2730 if (m_outputContext) 2731 wirelessTargetName = m_outputContext.get().deviceName; 2732 #else 2733 wirelessTargetName = wkExernalDeviceDisplayNameForPlayer(m_avPlayer.get()); 2734 #endif 2736 2735 LOG(Media, "MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetName(%p) - returning %s", this, wirelessTargetName.utf8().data()); 2737 2736 … … 2757 2756 return; 2758 2757 2758 setDelayCallbacks(true); 2759 2759 [m_avPlayer.get() setAllowsExternalPlayback:!disabled]; 2760 setDelayCallbacks(false); 2760 2761 } 2761 2762 … … 2764 2765 { 2765 2766 m_outputContext = target.devicePickerContext(); 2766 2767 2767 LOG(Media, "MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget(%p) - target = %p", this, m_outputContext.get()); 2768 2768 } 2769 2770 void MediaPlayerPrivateAVFoundationObjC::startPlayingToPlaybackTarget() 2771 { 2769 2772 if (!m_avPlayer) 2770 2773 return; 2771 2774 2775 if ([m_avPlayer.get().outputContext isEqual:m_outputContext.get()]) 2776 return; 2777 2778 setDelayCallbacks(true); 2772 2779 m_avPlayer.get().outputContext = m_outputContext.get(); 2780 setDelayCallbacks(false); 2781 } 2782 2783 void MediaPlayerPrivateAVFoundationObjC::stopPlayingToPlaybackTarget() 2784 { 2785 if (!m_avPlayer) 2786 return; 2787 2788 setDelayCallbacks(true); 2789 // FIXME: uncomment the following line once rdar://20335217 has been fixed. 2790 // m_avPlayer.get().outputContext = nil; 2791 setDelayCallbacks(false); 2773 2792 } 2774 2793 #endif … … 3085 3104 } 3086 3105 3106 NSArray* playerKVOProperties() 3107 { 3108 static NSArray* keys = [[NSArray alloc] initWithObjects:@"rate", 3109 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 3110 @"externalPlaybackActive", @"outputContext", @"allowsExternalPlayback", 3111 #endif 3112 nil]; 3113 return keys; 3114 } 3087 3115 } // namespace WebCore 3088 3116 … … 3201 3229 function = WTF::bind(&MediaPlayerPrivateAVFoundationObjC::rateDidChange, m_callback, [newValue doubleValue]); 3202 3230 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 3203 else if ([keyPath isEqualToString:@"externalPlaybackActive"]) 3204 function = WTF::bind(&MediaPlayerPrivateAVFoundationObjC::playbackTargetIsWirelessDidChange, m_callback); 3205 else if ([keyPath isEqualToString:@"outputContext"]) 3231 else if ([keyPath isEqualToString:@"externalPlaybackActive"] || [keyPath isEqualToString:@"outputContext"] || [keyPath isEqualToString:@"allowsExternalPlayback"]) 3206 3232 function = WTF::bind(&MediaPlayerPrivateAVFoundationObjC::playbackTargetIsWirelessDidChange, m_callback); 3207 3233 #endif -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h
r181865 r182240 172 172 virtual MediaTime totalFrameDelay() override; 173 173 174 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 175 virtual bool isCurrentPlaybackTargetSupported() const override; 176 virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&); 177 virtual void startPlayingToPlaybackTarget() override; 178 virtual void stopPlayingToPlaybackTarget() override; 179 void togglePlayingToPlaybackTarget(); 180 #endif 181 174 182 void ensureLayer(); 175 183 void destroyLayer(); … … 213 221 mutable bool m_loadingProgressed; 214 222 bool m_hasAvailableVideoFrame; 223 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 224 std::unique_ptr<MediaPlaybackTarget> m_playbackTarget; 225 bool m_currentPlaybackTargetIsSupported { true }; 226 #endif 215 227 }; 216 228 -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm
r181036 r182240 807 807 } 808 808 809 } 810 809 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 810 bool MediaPlayerPrivateMediaSourceAVFObjC::isCurrentPlaybackTargetSupported() const 811 { 812 if (!m_playbackTarget) 813 return true; 814 815 return !m_playbackTarget->hasActiveRoute(); 816 } 817 818 void MediaPlayerPrivateMediaSourceAVFObjC::setWirelessPlaybackTarget(const MediaPlaybackTarget& target) 819 { 820 if (!m_playbackTarget) 821 m_playbackTarget = std::make_unique<MediaPlaybackTarget>(); 822 m_playbackTarget->setDevicePickerContext(target.devicePickerContext()); 823 } 824 825 void MediaPlayerPrivateMediaSourceAVFObjC::togglePlayingToPlaybackTarget() 826 { 827 bool oldSupported = m_currentPlaybackTargetIsSupported; 828 m_currentPlaybackTargetIsSupported = !m_playbackTarget || !m_playbackTarget->hasActiveRoute(); 829 830 if (m_player && oldSupported != m_currentPlaybackTargetIsSupported) 831 m_player->currentPlaybackTargetIsWirelessChanged(); 832 } 833 834 void MediaPlayerPrivateMediaSourceAVFObjC::startPlayingToPlaybackTarget() 835 { 836 togglePlayingToPlaybackTarget(); 837 } 838 839 void MediaPlayerPrivateMediaSourceAVFObjC::stopPlayingToPlaybackTarget() 840 { 841 togglePlayingToPlaybackTarget(); 842 } 811 843 #endif 844 845 } 846 847 #endif -
trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h
r181153 r182240 179 179 virtual String engineDescription() const { return "QTKit"; } 180 180 virtual long platformErrorCode() const; 181 182 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 183 virtual bool isCurrentPlaybackTargetSupported() const override; 184 virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&); 185 virtual void startPlayingToPlaybackTarget() override; 186 virtual void stopPlayingToPlaybackTarget() override; 187 void togglePlayingToPlaybackTarget(); 188 #endif 181 189 182 190 MediaPlayer* m_player; … … 207 215 mutable MediaTime m_maxTimeLoadedAtLastDidLoadingProgress; 208 216 mutable FloatSize m_cachedNaturalSize; 217 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 218 std::unique_ptr<MediaPlaybackTarget> m_playbackTarget; 219 bool m_currentPlaybackTargetIsSupported { true }; 220 #endif 209 221 }; 210 222 -
trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm
r182204 r182240 1541 1541 } 1542 1542 1543 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 1544 bool MediaPlayerPrivateQTKit::isCurrentPlaybackTargetSupported() const 1545 { 1546 if (!m_playbackTarget) 1547 return true; 1548 1549 return !m_playbackTarget->hasActiveRoute(); 1550 } 1551 1552 void MediaPlayerPrivateQTKit::setWirelessPlaybackTarget(const MediaPlaybackTarget& target) 1553 { 1554 if (!m_playbackTarget) 1555 m_playbackTarget = std::make_unique<MediaPlaybackTarget>(); 1556 m_playbackTarget->setDevicePickerContext(target.devicePickerContext()); 1557 } 1558 1559 void MediaPlayerPrivateQTKit::togglePlayingToPlaybackTarget() 1560 { 1561 bool oldSupported = m_currentPlaybackTargetIsSupported; 1562 m_currentPlaybackTargetIsSupported = !m_playbackTarget || !m_playbackTarget->hasActiveRoute(); 1563 1564 if (m_player && oldSupported != m_currentPlaybackTargetIsSupported) 1565 m_player->currentPlaybackTargetIsWirelessChanged(); 1566 } 1567 1568 void MediaPlayerPrivateQTKit::startPlayingToPlaybackTarget() 1569 { 1570 togglePlayingToPlaybackTarget(); 1571 } 1572 1573 void MediaPlayerPrivateQTKit::stopPlayingToPlaybackTarget() 1574 { 1575 togglePlayingToPlaybackTarget(); 1576 } 1577 #endif 1578 1543 1579 } // namespace WebCore 1544 1580
Note:
See TracChangeset
for help on using the changeset viewer.