Index: third_party/WebKit/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp |
diff --git a/third_party/WebKit/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp b/third_party/WebKit/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0cabfd234afe9279365b8b56575408fa755ecb66 |
--- /dev/null |
+++ b/third_party/WebKit/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp |
@@ -0,0 +1,497 @@ |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "config.h" |
+#include "WebMediaPlayerClientImpl.h" |
+ |
+#if ENABLE(VIDEO) |
+ |
+#include "Frame.h" |
+#include "GraphicsContext.h" |
+#include "HTMLMediaElement.h" |
+#include "IntSize.h" |
+#include "KURL.h" |
+#include "MediaPlayer.h" |
+#include "NotImplemented.h" |
+#include "RenderView.h" |
+#include "TimeRanges.h" |
+#include "VideoLayerChromium.h" |
+ |
+#if USE(ACCELERATED_COMPOSITING) |
+#include "RenderLayerCompositor.h" |
+#endif |
+ |
+#include "VideoFrameChromium.h" |
+#include "VideoFrameChromiumImpl.h" |
+#include "WebCanvas.h" |
+#include "WebCString.h" |
+#include "WebFrameClient.h" |
+#include "WebFrameImpl.h" |
+#include "WebKit.h" |
+#include "WebKitClient.h" |
+#include "WebMediaElement.h" |
+#include "WebMediaPlayer.h" |
+#include "WebMimeRegistry.h" |
+#include "WebRect.h" |
+#include "WebSize.h" |
+#include "WebString.h" |
+#include "WebURL.h" |
+#include "WebViewImpl.h" |
+ |
+// WebCommon.h defines WEBKIT_USING_SKIA so this has to be included last. |
+#if WEBKIT_USING_SKIA |
+#include "PlatformContextSkia.h" |
+#endif |
+ |
+#include <wtf/Assertions.h> |
+#include <wtf/text/CString.h> |
+ |
+using namespace WebCore; |
+ |
+namespace WebKit { |
+ |
+static WebMediaPlayer* createWebMediaPlayer( |
+ WebMediaPlayerClient* client, Frame* frame) |
+{ |
+ WebFrameImpl* webFrame = WebFrameImpl::fromFrame(frame); |
+ |
+ if (!webFrame->client()) |
+ return 0; |
+ return webFrame->client()->createMediaPlayer(webFrame, client); |
+} |
+ |
+bool WebMediaPlayerClientImpl::m_isEnabled = false; |
+ |
+bool WebMediaPlayerClientImpl::isEnabled() |
+{ |
+ return m_isEnabled; |
+} |
+ |
+void WebMediaPlayerClientImpl::setIsEnabled(bool isEnabled) |
+{ |
+ m_isEnabled = isEnabled; |
+} |
+ |
+void WebMediaPlayerClientImpl::registerSelf(MediaEngineRegistrar registrar) |
+{ |
+ if (m_isEnabled) { |
+ registrar(WebMediaPlayerClientImpl::create, |
+ WebMediaPlayerClientImpl::getSupportedTypes, |
+ WebMediaPlayerClientImpl::supportsType); |
+ } |
+} |
+ |
+WebMediaPlayerClientImpl* WebMediaPlayerClientImpl::fromMediaElement(const WebMediaElement* element) |
+{ |
+ PlatformMedia pm = element->constUnwrap<HTMLMediaElement>()->platformMedia(); |
+ return static_cast<WebMediaPlayerClientImpl*>(pm.media.chromiumMediaPlayer); |
+} |
+ |
+WebMediaPlayer* WebMediaPlayerClientImpl::mediaPlayer() const |
+{ |
+ return m_webMediaPlayer.get(); |
+} |
+ |
+// WebMediaPlayerClient -------------------------------------------------------- |
+ |
+void WebMediaPlayerClientImpl::networkStateChanged() |
+{ |
+ ASSERT(m_mediaPlayer); |
+ m_mediaPlayer->networkStateChanged(); |
+} |
+ |
+void WebMediaPlayerClientImpl::readyStateChanged() |
+{ |
+ ASSERT(m_mediaPlayer); |
+ m_mediaPlayer->readyStateChanged(); |
+} |
+ |
+void WebMediaPlayerClientImpl::volumeChanged(float newVolume) |
+{ |
+ ASSERT(m_mediaPlayer); |
+ m_mediaPlayer->volumeChanged(newVolume); |
+} |
+ |
+void WebMediaPlayerClientImpl::muteChanged(bool newMute) |
+{ |
+ ASSERT(m_mediaPlayer); |
+ m_mediaPlayer->muteChanged(newMute); |
+} |
+ |
+void WebMediaPlayerClientImpl::timeChanged() |
+{ |
+ ASSERT(m_mediaPlayer); |
+ m_mediaPlayer->timeChanged(); |
+} |
+ |
+void WebMediaPlayerClientImpl::repaint() |
+{ |
+ ASSERT(m_mediaPlayer); |
+#if USE(ACCELERATED_COMPOSITING) |
+ if (m_videoLayer.get() && supportsAcceleratedRendering()) |
+ m_videoLayer->setNeedsDisplay(FloatRect(0, 0, m_videoLayer->bounds().width(), m_videoLayer->bounds().height())); |
+#endif |
+ m_mediaPlayer->repaint(); |
+} |
+ |
+void WebMediaPlayerClientImpl::durationChanged() |
+{ |
+ ASSERT(m_mediaPlayer); |
+ m_mediaPlayer->durationChanged(); |
+} |
+ |
+void WebMediaPlayerClientImpl::rateChanged() |
+{ |
+ ASSERT(m_mediaPlayer); |
+ m_mediaPlayer->rateChanged(); |
+} |
+ |
+void WebMediaPlayerClientImpl::sizeChanged() |
+{ |
+ ASSERT(m_mediaPlayer); |
+ m_mediaPlayer->sizeChanged(); |
+} |
+ |
+void WebMediaPlayerClientImpl::sawUnsupportedTracks() |
+{ |
+ ASSERT(m_mediaPlayer); |
+ m_mediaPlayer->mediaPlayerClient()->mediaPlayerSawUnsupportedTracks(m_mediaPlayer); |
+} |
+ |
+float WebMediaPlayerClientImpl::volume() const |
+{ |
+ if (m_mediaPlayer) |
+ return m_mediaPlayer->volume(); |
+ return 0.0f; |
+} |
+ |
+// MediaPlayerPrivateInterface ------------------------------------------------- |
+ |
+void WebMediaPlayerClientImpl::load(const String& url) |
+{ |
+ Frame* frame = static_cast<HTMLMediaElement*>( |
+ m_mediaPlayer->mediaPlayerClient())->document()->frame(); |
+ |
+ m_webMediaPlayer.set(createWebMediaPlayer(this, frame)); |
+ if (m_webMediaPlayer.get()) |
+ m_webMediaPlayer->load(KURL(ParsedURLString, url)); |
+} |
+ |
+void WebMediaPlayerClientImpl::cancelLoad() |
+{ |
+ if (m_webMediaPlayer.get()) |
+ m_webMediaPlayer->cancelLoad(); |
+} |
+ |
+#if USE(ACCELERATED_COMPOSITING) |
+PlatformLayer* WebMediaPlayerClientImpl::platformLayer() const |
+{ |
+ ASSERT(m_supportsAcceleratedCompositing); |
+ return m_videoLayer.get(); |
+} |
+#endif |
+ |
+PlatformMedia WebMediaPlayerClientImpl::platformMedia() const |
+{ |
+ PlatformMedia pm; |
+ pm.type = PlatformMedia::ChromiumMediaPlayerType; |
+ pm.media.chromiumMediaPlayer = const_cast<WebMediaPlayerClientImpl*>(this); |
+ return pm; |
+} |
+ |
+void WebMediaPlayerClientImpl::play() |
+{ |
+ if (m_webMediaPlayer.get()) |
+ m_webMediaPlayer->play(); |
+} |
+ |
+void WebMediaPlayerClientImpl::pause() |
+{ |
+ if (m_webMediaPlayer.get()) |
+ m_webMediaPlayer->pause(); |
+} |
+ |
+IntSize WebMediaPlayerClientImpl::naturalSize() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return m_webMediaPlayer->naturalSize(); |
+ return IntSize(); |
+} |
+ |
+bool WebMediaPlayerClientImpl::hasVideo() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return m_webMediaPlayer->hasVideo(); |
+ return false; |
+} |
+ |
+bool WebMediaPlayerClientImpl::hasAudio() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return m_webMediaPlayer->hasAudio(); |
+ return false; |
+} |
+ |
+void WebMediaPlayerClientImpl::setVisible(bool visible) |
+{ |
+ if (m_webMediaPlayer.get()) |
+ m_webMediaPlayer->setVisible(visible); |
+} |
+ |
+float WebMediaPlayerClientImpl::duration() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return m_webMediaPlayer->duration(); |
+ return 0.0f; |
+} |
+ |
+float WebMediaPlayerClientImpl::currentTime() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return m_webMediaPlayer->currentTime(); |
+ return 0.0f; |
+} |
+ |
+void WebMediaPlayerClientImpl::seek(float time) |
+{ |
+ if (m_webMediaPlayer.get()) |
+ m_webMediaPlayer->seek(time); |
+} |
+ |
+bool WebMediaPlayerClientImpl::seeking() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return m_webMediaPlayer->seeking(); |
+ return false; |
+} |
+ |
+void WebMediaPlayerClientImpl::setEndTime(float time) |
+{ |
+ if (m_webMediaPlayer.get()) |
+ m_webMediaPlayer->setEndTime(time); |
+} |
+ |
+void WebMediaPlayerClientImpl::setRate(float rate) |
+{ |
+ if (m_webMediaPlayer.get()) |
+ m_webMediaPlayer->setRate(rate); |
+} |
+ |
+bool WebMediaPlayerClientImpl::paused() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return m_webMediaPlayer->paused(); |
+ return false; |
+} |
+ |
+bool WebMediaPlayerClientImpl::supportsFullscreen() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return m_webMediaPlayer->supportsFullscreen(); |
+ return false; |
+} |
+ |
+bool WebMediaPlayerClientImpl::supportsSave() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return m_webMediaPlayer->supportsSave(); |
+ return false; |
+} |
+ |
+void WebMediaPlayerClientImpl::setVolume(float volume) |
+{ |
+ if (m_webMediaPlayer.get()) |
+ m_webMediaPlayer->setVolume(volume); |
+} |
+ |
+MediaPlayer::NetworkState WebMediaPlayerClientImpl::networkState() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return static_cast<MediaPlayer::NetworkState>(m_webMediaPlayer->networkState()); |
+ return MediaPlayer::Empty; |
+} |
+ |
+MediaPlayer::ReadyState WebMediaPlayerClientImpl::readyState() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return static_cast<MediaPlayer::ReadyState>(m_webMediaPlayer->readyState()); |
+ return MediaPlayer::HaveNothing; |
+} |
+ |
+float WebMediaPlayerClientImpl::maxTimeSeekable() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return m_webMediaPlayer->maxTimeSeekable(); |
+ return 0.0f; |
+} |
+ |
+PassRefPtr<TimeRanges> WebMediaPlayerClientImpl::buffered() const |
+{ |
+ if (m_webMediaPlayer.get()) { |
+ const WebTimeRanges& webRanges = m_webMediaPlayer->buffered(); |
+ |
+ // FIXME: Save the time ranges in a member variable and update it when needed. |
+ RefPtr<TimeRanges> ranges = TimeRanges::create(); |
+ for (size_t i = 0; i < webRanges.size(); ++i) |
+ ranges->add(webRanges[i].start, webRanges[i].end); |
+ return ranges.release(); |
+ } |
+ return TimeRanges::create(); |
+} |
+ |
+int WebMediaPlayerClientImpl::dataRate() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return m_webMediaPlayer->dataRate(); |
+ return 0; |
+} |
+ |
+bool WebMediaPlayerClientImpl::totalBytesKnown() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return m_webMediaPlayer->totalBytesKnown(); |
+ return false; |
+} |
+ |
+unsigned WebMediaPlayerClientImpl::totalBytes() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return static_cast<unsigned>(m_webMediaPlayer->totalBytes()); |
+ return 0; |
+} |
+ |
+unsigned WebMediaPlayerClientImpl::bytesLoaded() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return static_cast<unsigned>(m_webMediaPlayer->bytesLoaded()); |
+ return 0; |
+} |
+ |
+void WebMediaPlayerClientImpl::setSize(const IntSize& size) |
+{ |
+ if (m_webMediaPlayer.get()) |
+ m_webMediaPlayer->setSize(WebSize(size.width(), size.height())); |
+} |
+ |
+void WebMediaPlayerClientImpl::paint(GraphicsContext* context, const IntRect& rect) |
+{ |
+ // Normally GraphicsContext operations do nothing when painting is disabled. |
+ // Since we're accessing platformContext() directly we have to manually |
+ // check. |
+ if (m_webMediaPlayer.get() && !context->paintingDisabled()) { |
+#if WEBKIT_USING_SKIA |
+ m_webMediaPlayer->paint(context->platformContext()->canvas(), rect); |
+#elif WEBKIT_USING_CG |
+ m_webMediaPlayer->paint(context->platformContext(), rect); |
+#else |
+ notImplemented(); |
+#endif |
+ } |
+} |
+ |
+void WebMediaPlayerClientImpl::setAutobuffer(bool autoBuffer) |
+{ |
+ if (m_webMediaPlayer.get()) |
+ m_webMediaPlayer->setAutoBuffer(autoBuffer); |
+} |
+ |
+bool WebMediaPlayerClientImpl::hasSingleSecurityOrigin() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return m_webMediaPlayer->hasSingleSecurityOrigin(); |
+ return false; |
+} |
+ |
+#if USE(ACCELERATED_COMPOSITING) |
+bool WebMediaPlayerClientImpl::supportsAcceleratedRendering() const |
+{ |
+ return m_supportsAcceleratedCompositing; |
+} |
+#endif |
+ |
+MediaPlayer::MovieLoadType WebMediaPlayerClientImpl::movieLoadType() const |
+{ |
+ if (m_webMediaPlayer.get()) |
+ return static_cast<MediaPlayer::MovieLoadType>( |
+ m_webMediaPlayer->movieLoadType()); |
+ return MediaPlayer::Unknown; |
+} |
+ |
+void WebMediaPlayerClientImpl::getCurrentFrame(VideoFrameChromium** frameOut) |
+{ |
+ *frameOut = 0; |
+ if (m_webMediaPlayer.get()) { |
+ WebVideoFrame* webkitFrame = 0; |
+ m_webMediaPlayer->getCurrentFrame(&webkitFrame); |
+ if (webkitFrame) |
+ *frameOut = new VideoFrameChromiumImpl(webkitFrame); |
+ } |
+} |
+ |
+void WebMediaPlayerClientImpl::putCurrentFrame(VideoFrameChromium* frame) |
+{ |
+ if (m_webMediaPlayer.get()) |
+ m_webMediaPlayer->putCurrentFrame(VideoFrameChromiumImpl::toWebVideoFrame(frame)); |
+} |
+ |
+MediaPlayerPrivateInterface* WebMediaPlayerClientImpl::create(MediaPlayer* player) |
+{ |
+ WebMediaPlayerClientImpl* client = new WebMediaPlayerClientImpl(); |
+ client->m_mediaPlayer = player; |
+ |
+#if USE(ACCELERATED_COMPOSITING) |
+ Frame* frame = static_cast<HTMLMediaElement*>( |
+ client->m_mediaPlayer->mediaPlayerClient())->document()->frame(); |
+ |
+ // This does not actually check whether the hardware can support accelerated |
+ // compositing, but only if the flag is set. However, this is checked lazily |
+ // in WebViewImpl::setIsAcceleratedCompositingActive() and will fail there |
+ // if necessary. |
+ client->m_supportsAcceleratedCompositing = |
+ frame->contentRenderer()->compositor()->hasAcceleratedCompositing(); |
+ |
+ if (client->m_supportsAcceleratedCompositing) |
+ client->m_videoLayer = VideoLayerChromium::create(0, client); |
+#endif |
+ |
+ return client; |
+} |
+ |
+void WebMediaPlayerClientImpl::getSupportedTypes(HashSet<String>& supportedTypes) |
+{ |
+ // FIXME: integrate this list with WebMediaPlayerClientImpl::supportsType. |
+ notImplemented(); |
+} |
+ |
+MediaPlayer::SupportsType WebMediaPlayerClientImpl::supportsType(const String& type, |
+ const String& codecs) |
+{ |
+ WebMimeRegistry::SupportsType supportsType = |
+ webKitClient()->mimeRegistry()->supportsMediaMIMEType(type, codecs); |
+ |
+ switch (supportsType) { |
+ default: |
+ ASSERT_NOT_REACHED(); |
+ case WebMimeRegistry::IsNotSupported: |
+ return MediaPlayer::IsNotSupported; |
+ case WebMimeRegistry::IsSupported: |
+ return MediaPlayer::IsSupported; |
+ case WebMimeRegistry::MayBeSupported: |
+ return MediaPlayer::MayBeSupported; |
+ } |
+ return MediaPlayer::IsNotSupported; |
+} |
+ |
+WebMediaPlayerClientImpl::WebMediaPlayerClientImpl() |
+ : m_mediaPlayer(0) |
+#if USE(ACCELERATED_COMPOSITING) |
+ , m_videoLayer(0) |
+ , m_supportsAcceleratedCompositing(false) |
+#endif |
+{ |
+} |
+ |
+} // namespace WebKit |
+ |
+#endif // ENABLE(VIDEO) |