15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright (c) 2009 The Chromium Authors. All rights reserved.
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
6f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebMediaPlayerClientImpl.h"
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLMediaElement.h"
1053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/TimeRanges.h"
1153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
12d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/RenderLayerCompositor.h"
13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "modules/encryptedmedia/HTMLMediaElementEncryptedMedia.h"
14d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "modules/encryptedmedia/MediaKeyNeededEvent.h"
1593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "modules/mediastream/MediaStreamRegistry.h"
1651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/audio/AudioBus.h"
1751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/audio/AudioSourceProviderClient.h"
181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/IntSize.h"
19a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h"
20a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsLayer.h"
2109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/graphics/gpu/Extensions3DUtil.h"
22a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/skia/GaneshUtils.h"
2309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "public/platform/Platform.h"
241e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebAudioSourceProvider.h"
2551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "public/platform/WebCString.h"
265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebCanvas.h"
275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebCompositorSupport.h"
2809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "public/platform/WebContentDecryptionModule.h"
2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "public/platform/WebGraphicsContext3DProvider.h"
3051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "public/platform/WebInbandTextTrack.h"
3151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "public/platform/WebMediaPlayer.h"
325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebRect.h"
335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebString.h"
345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebURL.h"
35f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDocument.h"
36f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebFrameClient.h"
37f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebLocalFrameImpl.h"
38f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h"
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#if OS(ANDROID)
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "GrContext.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "GrTypes.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "SkCanvas.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "SkGrPixelRef.h"
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
48591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Assertions.h"
49591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/CString.h"
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistatic PassOwnPtr<WebMediaPlayer> createWebMediaPlayer(WebMediaPlayerClient* client, const WebURL& url, LocalFrame* frame, WebContentDecryptionModule* initialCdm)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(frame);
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!webFrame || !webFrame->client())
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return nullptr;
597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return adoptPtr(webFrame->client()->createMediaPlayer(webFrame, url, client, initialCdm));
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebMediaPlayer* WebMediaPlayerClientImpl::webMediaPlayer() const
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_webMediaPlayer.get();
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebMediaPlayerClient --------------------------------------------------------
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebMediaPlayerClientImpl::~WebMediaPlayerClientImpl()
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Explicitly destroy the WebMediaPlayer to allow verification of tear down.
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_webMediaPlayer.clear();
7310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
7410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    HTMLMediaElementEncryptedMedia::playerDestroyed(mediaElement());
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::networkStateChanged()
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_client->mediaPlayerNetworkStateChanged();
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::readyStateChanged()
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_client->mediaPlayerReadyStateChanged();
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::timeChanged()
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_client->mediaPlayerTimeChanged();
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::repaint()
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_client->mediaPlayerRepaint();
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::durationChanged()
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_client->mediaPlayerDurationChanged();
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::sizeChanged()
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_client->mediaPlayerSizeChanged();
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::playbackStateChanged()
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_client->mediaPlayerPlaybackStateChanged();
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::keyAdded(const WebString& keySystem, const WebString& sessionId)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    HTMLMediaElementEncryptedMedia::keyAdded(mediaElement(), keySystem, sessionId);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::keyError(const WebString& keySystem, const WebString& sessionId, MediaKeyErrorCode errorCode, unsigned short systemCode)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    HTMLMediaElementEncryptedMedia::keyError(mediaElement(), keySystem, sessionId, errorCode, systemCode);
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebMediaPlayerClientImpl::keyMessage(const WebString& keySystem, const WebString& sessionId, const unsigned char* message, unsigned messageLength, const WebURL& defaultURL)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
124d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    HTMLMediaElementEncryptedMedia::keyMessage(mediaElement(), keySystem, sessionId, message, messageLength, defaultURL);
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void WebMediaPlayerClientImpl::keyNeeded(const WebString& contentType, const unsigned char* initData, unsigned initDataLength)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    HTMLMediaElementEncryptedMedia::keyNeeded(mediaElement(), contentType, initData, initDataLength);
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
132e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void WebMediaPlayerClientImpl::setWebLayer(WebLayer* layer)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
134a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_client->mediaPlayerSetWebLayer(layer);
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)WebMediaPlayer::TrackId WebMediaPlayerClientImpl::addAudioTrack(const WebString& id, AudioTrackKind kind, const WebString& label, const WebString& language, bool enabled)
1385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
1395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return mediaElement().addAudioTrack(id, kind, label, language, enabled);
1405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
1415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void WebMediaPlayerClientImpl::removeAudioTrack(WebMediaPlayer::TrackId id)
1435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
1445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    mediaElement().removeAudioTrack(id);
1455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
1465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)WebMediaPlayer::TrackId WebMediaPlayerClientImpl::addVideoTrack(const WebString& id, VideoTrackKind kind, const WebString& label, const WebString& language, bool selected)
1485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
1495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return mediaElement().addVideoTrack(id, kind, label, language, selected);
1505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
1515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void WebMediaPlayerClientImpl::removeVideoTrack(WebMediaPlayer::TrackId id)
1535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
1545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    mediaElement().removeVideoTrack(id);
1555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
1565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
15781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)void WebMediaPlayerClientImpl::addTextTrack(WebInbandTextTrack* textTrack)
15881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_client->mediaPlayerDidAddTextTrack(textTrack);
16081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
16181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
16281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)void WebMediaPlayerClientImpl::removeTextTrack(WebInbandTextTrack* textTrack)
16381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
164d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_client->mediaPlayerDidRemoveTextTrack(textTrack);
16581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
16681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
167c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)void WebMediaPlayerClientImpl::mediaSourceOpened(WebMediaSource* webMediaSource)
168e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
169e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    ASSERT(webMediaSource);
17009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_client->mediaPlayerMediaSourceOpened(webMediaSource);
171e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
172e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
1731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebMediaPlayerClientImpl::requestFullscreen()
1741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
1751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_client->mediaPlayerRequestFullscreen();
1761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
1771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
178e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void WebMediaPlayerClientImpl::requestSeek(double time)
179e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
180e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_client->mediaPlayerRequestSeek(time);
181e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
182e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
1837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebMediaPlayerClientImpl::remoteRouteAvailabilityChanged(bool routesAvailable)
1847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    mediaElement().remoteRouteAvailabilityChanged(routesAvailable);
1867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebMediaPlayerClientImpl::connectedToRemoteDevice()
1897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    mediaElement().connectedToRemoteDevice();
1917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebMediaPlayerClientImpl::disconnectedFromRemoteDevice()
1947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    mediaElement().disconnectedFromRemoteDevice();
1967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// MediaPlayer -------------------------------------------------
19907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid WebMediaPlayerClientImpl::load(WebMediaPlayer::LoadType loadType, const WTF::String& url, WebMediaPlayer::CORSMode corsMode)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(!m_webMediaPlayer);
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // FIXME: Remove this cast
204d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = mediaElement().document().frame();
20553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
20609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    WebURL poster = m_client->mediaPlayerPosterURL();
20709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
20807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    KURL kurl(ParsedURLString, url);
2097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_webMediaPlayer = createWebMediaPlayer(this, kurl, frame, HTMLMediaElementEncryptedMedia::contentDecryptionModule(mediaElement()));
21007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!m_webMediaPlayer)
21107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return;
21253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(WEB_AUDIO)
21407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Make sure if we create/re-create the WebMediaPlayer that we update our wrapper.
21507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_audioSourceProvider.wrap(m_webMediaPlayer->audioSourceProvider());
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
218e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    m_webMediaPlayer->setVolume(mediaElement().effectiveMediaVolume());
219d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
22007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_webMediaPlayer->setPoster(poster);
221c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
22207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_webMediaPlayer->load(loadType, kurl, corsMode);
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::setPreload(MediaPlayer::Preload preload)
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webMediaPlayer)
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webMediaPlayer->setPreload(static_cast<WebMediaPlayer::Preload>(preload));
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(WEB_AUDIO)
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)AudioSourceProvider* WebMediaPlayerClientImpl::audioSourceProvider()
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return &m_audioSourceProvider;
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)PassOwnPtr<MediaPlayer> WebMediaPlayerClientImpl::create(MediaPlayerClient* client)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return adoptPtr(new WebMediaPlayerClientImpl(client));
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)WebMediaPlayerClientImpl::WebMediaPlayerClientImpl(MediaPlayerClient* client)
2445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    : m_client(client)
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT(m_client);
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
249e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)HTMLMediaElement& WebMediaPlayerClientImpl::mediaElement() const
250d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
251d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return *static_cast<HTMLMediaElement*>(m_client);
252d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
253d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(WEB_AUDIO)
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::AudioSourceProviderImpl::wrap(WebAudioSourceProvider* provider)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
257e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    MutexLocker locker(provideInputLock);
258e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
259e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    if (m_webAudioSourceProvider && provider != m_webAudioSourceProvider)
260e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        m_webAudioSourceProvider->setClient(0);
261e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webAudioSourceProvider = provider;
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webAudioSourceProvider)
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webAudioSourceProvider->setClient(m_client.get());
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::AudioSourceProviderImpl::setClient(AudioSourceProviderClient* client)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
269e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    MutexLocker locker(provideInputLock);
270e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (client)
2729e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_client = new WebMediaPlayerClientImpl::AudioClientImpl(client);
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_client.clear();
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_webAudioSourceProvider)
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webAudioSourceProvider->setClient(m_client.get());
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::AudioSourceProviderImpl::provideInput(AudioBus* bus, size_t framesToProcess)
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(bus);
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!bus)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
286e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    MutexTryLocker tryLocker(provideInputLock);
287e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    if (!tryLocker.locked() || !m_webAudioSourceProvider || !m_client.get()) {
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bus->zero();
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Wrap the AudioBus channel data using WebVector.
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t n = bus->numberOfChannels();
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebVector<float*> webAudioData(n);
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < n; ++i)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webAudioData[i] = bus->channel(i)->mutableData();
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_webAudioSourceProvider->provideInput(webAudioData, framesToProcess);
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaPlayerClientImpl::AudioClientImpl::setFormat(size_t numberOfChannels, float sampleRate)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_client)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_client->setFormat(numberOfChannels, sampleRate);
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
307c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void WebMediaPlayerClientImpl::AudioClientImpl::trace(Visitor* visitor)
308c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
309c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_client);
310c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
311c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
315