1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "web/WebMediaPlayerClientImpl.h"
8 #include "core/frame/LocalFrame.h"
9 #include "core/html/HTMLMediaElement.h"
10 #include "core/html/TimeRanges.h"
11 #include "core/rendering/RenderView.h"
12 #include "core/rendering/compositing/RenderLayerCompositor.h"
13 #include "modules/encryptedmedia/HTMLMediaElementEncryptedMedia.h"
14 #include "modules/encryptedmedia/MediaKeyNeededEvent.h"
15 #include "modules/mediastream/MediaStreamRegistry.h"
16 #include "platform/audio/AudioBus.h"
17 #include "platform/audio/AudioSourceProviderClient.h"
18 #include "platform/geometry/IntSize.h"
19 #include "platform/graphics/GraphicsContext.h"
20 #include "platform/graphics/GraphicsLayer.h"
21 #include "platform/graphics/gpu/Extensions3DUtil.h"
22 #include "platform/graphics/skia/GaneshUtils.h"
23 #include "public/platform/Platform.h"
24 #include "public/platform/WebAudioSourceProvider.h"
25 #include "public/platform/WebCString.h"
26 #include "public/platform/WebCanvas.h"
27 #include "public/platform/WebCompositorSupport.h"
28 #include "public/platform/WebContentDecryptionModule.h"
29 #include "public/platform/WebGraphicsContext3DProvider.h"
30 #include "public/platform/WebInbandTextTrack.h"
31 #include "public/platform/WebMediaPlayer.h"
32 #include "public/platform/WebRect.h"
33 #include "public/platform/WebString.h"
34 #include "public/platform/WebURL.h"
35 #include "public/web/WebDocument.h"
36 #include "public/web/WebFrameClient.h"
37 #include "web/WebLocalFrameImpl.h"
38 #include "web/WebViewImpl.h"
41 #include "GrContext.h"
44 #include "SkGrPixelRef.h"
48 #include "wtf/Assertions.h"
49 #include "wtf/text/CString.h"
53 static PassOwnPtr<WebMediaPlayer> createWebMediaPlayer(WebMediaPlayerClient* client, const WebURL& url, LocalFrame* frame, WebContentDecryptionModule* initialCdm)
55 WebLocalFrameImpl* webFrame = WebLocalFrameImpl::fromFrame(frame);
57 if (!webFrame || !webFrame->client())
59 return adoptPtr(webFrame->client()->createMediaPlayer(webFrame, url, client, initialCdm));
62 WebMediaPlayer* WebMediaPlayerClientImpl::webMediaPlayer() const
64 return m_webMediaPlayer.get();
67 // WebMediaPlayerClient --------------------------------------------------------
69 WebMediaPlayerClientImpl::~WebMediaPlayerClientImpl()
71 // Explicitly destroy the WebMediaPlayer to allow verification of tear down.
72 m_webMediaPlayer.clear();
74 HTMLMediaElementEncryptedMedia::playerDestroyed(mediaElement());
77 void WebMediaPlayerClientImpl::networkStateChanged()
79 m_client->mediaPlayerNetworkStateChanged();
82 void WebMediaPlayerClientImpl::readyStateChanged()
84 m_client->mediaPlayerReadyStateChanged();
87 void WebMediaPlayerClientImpl::timeChanged()
89 m_client->mediaPlayerTimeChanged();
92 void WebMediaPlayerClientImpl::repaint()
94 m_client->mediaPlayerRepaint();
97 void WebMediaPlayerClientImpl::durationChanged()
99 m_client->mediaPlayerDurationChanged();
102 void WebMediaPlayerClientImpl::sizeChanged()
104 m_client->mediaPlayerSizeChanged();
107 void WebMediaPlayerClientImpl::playbackStateChanged()
109 m_client->mediaPlayerPlaybackStateChanged();
112 void WebMediaPlayerClientImpl::keyAdded(const WebString& keySystem, const WebString& sessionId)
114 HTMLMediaElementEncryptedMedia::keyAdded(mediaElement(), keySystem, sessionId);
117 void WebMediaPlayerClientImpl::keyError(const WebString& keySystem, const WebString& sessionId, MediaKeyErrorCode errorCode, unsigned short systemCode)
119 HTMLMediaElementEncryptedMedia::keyError(mediaElement(), keySystem, sessionId, errorCode, systemCode);
122 void WebMediaPlayerClientImpl::keyMessage(const WebString& keySystem, const WebString& sessionId, const unsigned char* message, unsigned messageLength, const WebURL& defaultURL)
124 HTMLMediaElementEncryptedMedia::keyMessage(mediaElement(), keySystem, sessionId, message, messageLength, defaultURL);
127 void WebMediaPlayerClientImpl::keyNeeded(const WebString& contentType, const unsigned char* initData, unsigned initDataLength)
129 HTMLMediaElementEncryptedMedia::keyNeeded(mediaElement(), contentType, initData, initDataLength);
132 void WebMediaPlayerClientImpl::setWebLayer(WebLayer* layer)
134 m_client->mediaPlayerSetWebLayer(layer);
137 WebMediaPlayer::TrackId WebMediaPlayerClientImpl::addAudioTrack(const WebString& id, AudioTrackKind kind, const WebString& label, const WebString& language, bool enabled)
139 return mediaElement().addAudioTrack(id, kind, label, language, enabled);
142 void WebMediaPlayerClientImpl::removeAudioTrack(WebMediaPlayer::TrackId id)
144 mediaElement().removeAudioTrack(id);
147 WebMediaPlayer::TrackId WebMediaPlayerClientImpl::addVideoTrack(const WebString& id, VideoTrackKind kind, const WebString& label, const WebString& language, bool selected)
149 return mediaElement().addVideoTrack(id, kind, label, language, selected);
152 void WebMediaPlayerClientImpl::removeVideoTrack(WebMediaPlayer::TrackId id)
154 mediaElement().removeVideoTrack(id);
157 void WebMediaPlayerClientImpl::addTextTrack(WebInbandTextTrack* textTrack)
159 m_client->mediaPlayerDidAddTextTrack(textTrack);
162 void WebMediaPlayerClientImpl::removeTextTrack(WebInbandTextTrack* textTrack)
164 m_client->mediaPlayerDidRemoveTextTrack(textTrack);
167 void WebMediaPlayerClientImpl::mediaSourceOpened(WebMediaSource* webMediaSource)
169 ASSERT(webMediaSource);
170 m_client->mediaPlayerMediaSourceOpened(webMediaSource);
173 void WebMediaPlayerClientImpl::requestFullscreen()
175 m_client->mediaPlayerRequestFullscreen();
178 void WebMediaPlayerClientImpl::requestSeek(double time)
180 m_client->mediaPlayerRequestSeek(time);
183 void WebMediaPlayerClientImpl::remoteRouteAvailabilityChanged(bool routesAvailable)
185 mediaElement().remoteRouteAvailabilityChanged(routesAvailable);
188 void WebMediaPlayerClientImpl::connectedToRemoteDevice()
190 mediaElement().connectedToRemoteDevice();
193 void WebMediaPlayerClientImpl::disconnectedFromRemoteDevice()
195 mediaElement().disconnectedFromRemoteDevice();
198 // MediaPlayer -------------------------------------------------
199 void WebMediaPlayerClientImpl::load(WebMediaPlayer::LoadType loadType, const WTF::String& url, WebMediaPlayer::CORSMode corsMode)
201 ASSERT(!m_webMediaPlayer);
203 // FIXME: Remove this cast
204 LocalFrame* frame = mediaElement().document().frame();
206 WebURL poster = m_client->mediaPlayerPosterURL();
208 KURL kurl(ParsedURLString, url);
209 m_webMediaPlayer = createWebMediaPlayer(this, kurl, frame, HTMLMediaElementEncryptedMedia::contentDecryptionModule(mediaElement()));
210 if (!m_webMediaPlayer)
213 #if ENABLE(WEB_AUDIO)
214 // Make sure if we create/re-create the WebMediaPlayer that we update our wrapper.
215 m_audioSourceProvider.wrap(m_webMediaPlayer->audioSourceProvider());
218 m_webMediaPlayer->setVolume(mediaElement().effectiveMediaVolume());
220 m_webMediaPlayer->setPoster(poster);
222 m_webMediaPlayer->load(loadType, kurl, corsMode);
225 void WebMediaPlayerClientImpl::setPreload(MediaPlayer::Preload preload)
227 if (m_webMediaPlayer)
228 m_webMediaPlayer->setPreload(static_cast<WebMediaPlayer::Preload>(preload));
231 #if ENABLE(WEB_AUDIO)
232 AudioSourceProvider* WebMediaPlayerClientImpl::audioSourceProvider()
234 return &m_audioSourceProvider;
238 PassOwnPtr<MediaPlayer> WebMediaPlayerClientImpl::create(MediaPlayerClient* client)
240 return adoptPtr(new WebMediaPlayerClientImpl(client));
243 WebMediaPlayerClientImpl::WebMediaPlayerClientImpl(MediaPlayerClient* client)
249 HTMLMediaElement& WebMediaPlayerClientImpl::mediaElement() const
251 return *static_cast<HTMLMediaElement*>(m_client);
254 #if ENABLE(WEB_AUDIO)
255 void WebMediaPlayerClientImpl::AudioSourceProviderImpl::wrap(WebAudioSourceProvider* provider)
257 MutexLocker locker(provideInputLock);
259 if (m_webAudioSourceProvider && provider != m_webAudioSourceProvider)
260 m_webAudioSourceProvider->setClient(0);
262 m_webAudioSourceProvider = provider;
263 if (m_webAudioSourceProvider)
264 m_webAudioSourceProvider->setClient(m_client.get());
267 void WebMediaPlayerClientImpl::AudioSourceProviderImpl::setClient(AudioSourceProviderClient* client)
269 MutexLocker locker(provideInputLock);
272 m_client = new WebMediaPlayerClientImpl::AudioClientImpl(client);
276 if (m_webAudioSourceProvider)
277 m_webAudioSourceProvider->setClient(m_client.get());
280 void WebMediaPlayerClientImpl::AudioSourceProviderImpl::provideInput(AudioBus* bus, size_t framesToProcess)
286 MutexTryLocker tryLocker(provideInputLock);
287 if (!tryLocker.locked() || !m_webAudioSourceProvider || !m_client.get()) {
292 // Wrap the AudioBus channel data using WebVector.
293 size_t n = bus->numberOfChannels();
294 WebVector<float*> webAudioData(n);
295 for (size_t i = 0; i < n; ++i)
296 webAudioData[i] = bus->channel(i)->mutableData();
298 m_webAudioSourceProvider->provideInput(webAudioData, framesToProcess);
301 void WebMediaPlayerClientImpl::AudioClientImpl::setFormat(size_t numberOfChannels, float sampleRate)
304 m_client->setFormat(numberOfChannels, sampleRate);
307 void WebMediaPlayerClientImpl::AudioClientImpl::trace(Visitor* visitor)
309 visitor->trace(m_client);