Home | History | Annotate | Download | only in src
      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.
      4 
      5 #include "config.h"
      6 #include "WebMediaPlayerClientImpl.h"
      7 
      8 #if ENABLE(VIDEO)
      9 
     10 #include "CString.h"
     11 #include "Frame.h"
     12 #include "GraphicsContext.h"
     13 #include "HTMLMediaElement.h"
     14 #include "IntSize.h"
     15 #include "KURL.h"
     16 #include "MediaPlayer.h"
     17 #include "NotImplemented.h"
     18 #include "TimeRanges.h"
     19 
     20 #include "WebCanvas.h"
     21 #include "WebCString.h"
     22 #include "WebFrameClient.h"
     23 #include "WebFrameImpl.h"
     24 #include "WebKit.h"
     25 #include "WebKitClient.h"
     26 #include "WebMediaPlayer.h"
     27 #include "WebMimeRegistry.h"
     28 #include "WebRect.h"
     29 #include "WebSize.h"
     30 #include "WebString.h"
     31 #include "WebURL.h"
     32 
     33 // WebCommon.h defines WEBKIT_USING_SKIA so this has to be included last.
     34 #if WEBKIT_USING_SKIA
     35 #include "PlatformContextSkia.h"
     36 #endif
     37 
     38 #include <wtf/Assertions.h>
     39 
     40 using namespace WebCore;
     41 
     42 namespace WebKit {
     43 
     44 static WebMediaPlayer* createWebMediaPlayer(
     45     WebMediaPlayerClient* client, Frame* frame)
     46 {
     47     WebFrameImpl* webFrame = WebFrameImpl::fromFrame(frame);
     48     if (!webFrame->client())
     49         return 0;
     50     return webFrame->client()->createMediaPlayer(webFrame, client);
     51 }
     52 
     53 bool WebMediaPlayerClientImpl::m_isEnabled = false;
     54 
     55 bool WebMediaPlayerClientImpl::isEnabled()
     56 {
     57     return m_isEnabled;
     58 }
     59 
     60 void WebMediaPlayerClientImpl::setIsEnabled(bool isEnabled)
     61 {
     62     m_isEnabled = isEnabled;
     63 }
     64 
     65 void WebMediaPlayerClientImpl::registerSelf(MediaEngineRegistrar registrar)
     66 {
     67     if (m_isEnabled) {
     68         registrar(WebMediaPlayerClientImpl::create,
     69                   WebMediaPlayerClientImpl::getSupportedTypes,
     70                   WebMediaPlayerClientImpl::supportsType);
     71     }
     72 }
     73 
     74 // WebMediaPlayerClient --------------------------------------------------------
     75 
     76 void WebMediaPlayerClientImpl::networkStateChanged()
     77 {
     78     ASSERT(m_mediaPlayer);
     79     m_mediaPlayer->networkStateChanged();
     80 }
     81 
     82 void WebMediaPlayerClientImpl::readyStateChanged()
     83 {
     84     ASSERT(m_mediaPlayer);
     85     m_mediaPlayer->readyStateChanged();
     86 }
     87 
     88 void WebMediaPlayerClientImpl::volumeChanged(float newVolume)
     89 {
     90     ASSERT(m_mediaPlayer);
     91     m_mediaPlayer->volumeChanged(newVolume);
     92 }
     93 
     94 void WebMediaPlayerClientImpl::muteChanged(bool newMute)
     95 {
     96     ASSERT(m_mediaPlayer);
     97     m_mediaPlayer->muteChanged(newMute);
     98 }
     99 
    100 void WebMediaPlayerClientImpl::timeChanged()
    101 {
    102     ASSERT(m_mediaPlayer);
    103     m_mediaPlayer->timeChanged();
    104 }
    105 
    106 void WebMediaPlayerClientImpl::repaint()
    107 {
    108     ASSERT(m_mediaPlayer);
    109     m_mediaPlayer->repaint();
    110 }
    111 
    112 void WebMediaPlayerClientImpl::durationChanged()
    113 {
    114     ASSERT(m_mediaPlayer);
    115     m_mediaPlayer->durationChanged();
    116 }
    117 
    118 void WebMediaPlayerClientImpl::rateChanged()
    119 {
    120     ASSERT(m_mediaPlayer);
    121     m_mediaPlayer->rateChanged();
    122 }
    123 
    124 void WebMediaPlayerClientImpl::sizeChanged()
    125 {
    126     ASSERT(m_mediaPlayer);
    127     m_mediaPlayer->sizeChanged();
    128 }
    129 
    130 void WebMediaPlayerClientImpl::sawUnsupportedTracks()
    131 {
    132     ASSERT(m_mediaPlayer);
    133     m_mediaPlayer->mediaPlayerClient()->mediaPlayerSawUnsupportedTracks(m_mediaPlayer);
    134 }
    135 
    136 // MediaPlayerPrivateInterface -------------------------------------------------
    137 
    138 void WebMediaPlayerClientImpl::load(const String& url)
    139 {
    140     Frame* frame = static_cast<HTMLMediaElement*>(
    141         m_mediaPlayer->mediaPlayerClient())->document()->frame();
    142     m_webMediaPlayer.set(createWebMediaPlayer(this, frame));
    143     if (m_webMediaPlayer.get())
    144         m_webMediaPlayer->load(KURL(ParsedURLString, url));
    145 }
    146 
    147 void WebMediaPlayerClientImpl::cancelLoad()
    148 {
    149     if (m_webMediaPlayer.get())
    150         m_webMediaPlayer->cancelLoad();
    151 }
    152 
    153 void WebMediaPlayerClientImpl::play()
    154 {
    155     if (m_webMediaPlayer.get())
    156         m_webMediaPlayer->play();
    157 }
    158 
    159 void WebMediaPlayerClientImpl::pause()
    160 {
    161     if (m_webMediaPlayer.get())
    162         m_webMediaPlayer->pause();
    163 }
    164 
    165 IntSize WebMediaPlayerClientImpl::naturalSize() const
    166 {
    167     if (m_webMediaPlayer.get())
    168         return m_webMediaPlayer->naturalSize();
    169     return IntSize();
    170 }
    171 
    172 bool WebMediaPlayerClientImpl::hasVideo() const
    173 {
    174     if (m_webMediaPlayer.get())
    175         return m_webMediaPlayer->hasVideo();
    176     return false;
    177 }
    178 
    179 bool WebMediaPlayerClientImpl::hasAudio() const
    180 {
    181     if (m_webMediaPlayer.get())
    182         return m_webMediaPlayer->hasAudio();
    183     return false;
    184 }
    185 
    186 void WebMediaPlayerClientImpl::setVisible(bool visible)
    187 {
    188     if (m_webMediaPlayer.get())
    189         m_webMediaPlayer->setVisible(visible);
    190 }
    191 
    192 float WebMediaPlayerClientImpl::duration() const
    193 {
    194     if (m_webMediaPlayer.get())
    195         return m_webMediaPlayer->duration();
    196     return 0.0f;
    197 }
    198 
    199 float WebMediaPlayerClientImpl::currentTime() const
    200 {
    201     if (m_webMediaPlayer.get())
    202         return m_webMediaPlayer->currentTime();
    203     return 0.0f;
    204 }
    205 
    206 void WebMediaPlayerClientImpl::seek(float time)
    207 {
    208     if (m_webMediaPlayer.get())
    209         m_webMediaPlayer->seek(time);
    210 }
    211 
    212 bool WebMediaPlayerClientImpl::seeking() const
    213 {
    214     if (m_webMediaPlayer.get())
    215         return m_webMediaPlayer->seeking();
    216     return false;
    217 }
    218 
    219 void WebMediaPlayerClientImpl::setEndTime(float time)
    220 {
    221     if (m_webMediaPlayer.get())
    222         m_webMediaPlayer->setEndTime(time);
    223 }
    224 
    225 void WebMediaPlayerClientImpl::setRate(float rate)
    226 {
    227     if (m_webMediaPlayer.get())
    228         m_webMediaPlayer->setRate(rate);
    229 }
    230 
    231 bool WebMediaPlayerClientImpl::paused() const
    232 {
    233     if (m_webMediaPlayer.get())
    234         return m_webMediaPlayer->paused();
    235     return false;
    236 }
    237 
    238 bool WebMediaPlayerClientImpl::supportsFullscreen() const
    239 {
    240     if (m_webMediaPlayer.get())
    241         return m_webMediaPlayer->supportsFullscreen();
    242     return false;
    243 }
    244 
    245 bool WebMediaPlayerClientImpl::supportsSave() const
    246 {
    247     if (m_webMediaPlayer.get())
    248         return m_webMediaPlayer->supportsSave();
    249     return false;
    250 }
    251 
    252 void WebMediaPlayerClientImpl::setVolume(float volume)
    253 {
    254     if (m_webMediaPlayer.get())
    255         m_webMediaPlayer->setVolume(volume);
    256 }
    257 
    258 MediaPlayer::NetworkState WebMediaPlayerClientImpl::networkState() const
    259 {
    260     if (m_webMediaPlayer.get())
    261         return static_cast<MediaPlayer::NetworkState>(m_webMediaPlayer->networkState());
    262     return MediaPlayer::Empty;
    263 }
    264 
    265 MediaPlayer::ReadyState WebMediaPlayerClientImpl::readyState() const
    266 {
    267     if (m_webMediaPlayer.get())
    268         return static_cast<MediaPlayer::ReadyState>(m_webMediaPlayer->readyState());
    269     return MediaPlayer::HaveNothing;
    270 }
    271 
    272 float WebMediaPlayerClientImpl::maxTimeSeekable() const
    273 {
    274     if (m_webMediaPlayer.get())
    275         return m_webMediaPlayer->maxTimeSeekable();
    276     return 0.0f;
    277 }
    278 
    279 PassRefPtr<TimeRanges> WebMediaPlayerClientImpl::buffered() const
    280 {
    281     if (m_webMediaPlayer.get()) {
    282         const WebTimeRanges& webRanges = m_webMediaPlayer->buffered();
    283 
    284         // FIXME: Save the time ranges in a member variable and update it when needed.
    285         RefPtr<TimeRanges> ranges = TimeRanges::create();
    286         for (size_t i = 0; i < webRanges.size(); ++i)
    287             ranges->add(webRanges[i].start, webRanges[i].end);
    288         return ranges.release();
    289     }
    290     return TimeRanges::create();
    291 }
    292 
    293 int WebMediaPlayerClientImpl::dataRate() const
    294 {
    295     if (m_webMediaPlayer.get())
    296         return m_webMediaPlayer->dataRate();
    297     return 0;
    298 }
    299 
    300 bool WebMediaPlayerClientImpl::totalBytesKnown() const
    301 {
    302     if (m_webMediaPlayer.get())
    303         return m_webMediaPlayer->totalBytesKnown();
    304     return false;
    305 }
    306 
    307 unsigned WebMediaPlayerClientImpl::totalBytes() const
    308 {
    309     if (m_webMediaPlayer.get())
    310         return static_cast<unsigned>(m_webMediaPlayer->totalBytes());
    311     return 0;
    312 }
    313 
    314 unsigned WebMediaPlayerClientImpl::bytesLoaded() const
    315 {
    316     if (m_webMediaPlayer.get())
    317         return static_cast<unsigned>(m_webMediaPlayer->bytesLoaded());
    318     return 0;
    319 }
    320 
    321 void WebMediaPlayerClientImpl::setSize(const IntSize& size)
    322 {
    323     if (m_webMediaPlayer.get())
    324         m_webMediaPlayer->setSize(WebSize(size.width(), size.height()));
    325 }
    326 
    327 void WebMediaPlayerClientImpl::paint(GraphicsContext* context, const IntRect& rect)
    328 {
    329     // Normally GraphicsContext operations do nothing when painting is disabled.
    330     // Since we're accessing platformContext() directly we have to manually
    331     // check.
    332     if (m_webMediaPlayer.get() && !context->paintingDisabled()) {
    333 #if WEBKIT_USING_SKIA
    334         m_webMediaPlayer->paint(context->platformContext()->canvas(), rect);
    335 #elif WEBKIT_USING_CG
    336         m_webMediaPlayer->paint(context->platformContext(), rect);
    337 #else
    338         notImplemented();
    339 #endif
    340     }
    341 }
    342 
    343 void WebMediaPlayerClientImpl::setAutobuffer(bool autoBuffer)
    344 {
    345     if (m_webMediaPlayer.get())
    346         m_webMediaPlayer->setAutoBuffer(autoBuffer);
    347 }
    348 
    349 bool WebMediaPlayerClientImpl::hasSingleSecurityOrigin() const
    350 {
    351     if (m_webMediaPlayer.get())
    352         return m_webMediaPlayer->hasSingleSecurityOrigin();
    353     return false;
    354 }
    355 
    356 MediaPlayer::MovieLoadType WebMediaPlayerClientImpl::movieLoadType() const
    357 {
    358     if (m_webMediaPlayer.get())
    359         return static_cast<MediaPlayer::MovieLoadType>(
    360             m_webMediaPlayer->movieLoadType());
    361     return MediaPlayer::Unknown;
    362 }
    363 
    364 MediaPlayerPrivateInterface* WebMediaPlayerClientImpl::create(MediaPlayer* player)
    365 {
    366     WebMediaPlayerClientImpl* client = new WebMediaPlayerClientImpl();
    367     client->m_mediaPlayer = player;
    368     return client;
    369 }
    370 
    371 void WebMediaPlayerClientImpl::getSupportedTypes(HashSet<String>& supportedTypes)
    372 {
    373     // FIXME: integrate this list with WebMediaPlayerClientImpl::supportsType.
    374     notImplemented();
    375 }
    376 
    377 MediaPlayer::SupportsType WebMediaPlayerClientImpl::supportsType(const String& type,
    378                                                                  const String& codecs)
    379 {
    380     WebMimeRegistry::SupportsType supportsType =
    381         webKitClient()->mimeRegistry()->supportsMediaMIMEType(type, codecs);
    382 
    383     switch (supportsType) {
    384     default:
    385         ASSERT_NOT_REACHED();
    386     case WebMimeRegistry::IsNotSupported:
    387         return MediaPlayer::IsNotSupported;
    388     case WebMimeRegistry::IsSupported:
    389         return MediaPlayer::IsSupported;
    390     case WebMimeRegistry::MayBeSupported:
    391         return MediaPlayer::MayBeSupported;
    392     }
    393     return MediaPlayer::IsNotSupported;
    394 }
    395 
    396 WebMediaPlayerClientImpl::WebMediaPlayerClientImpl()
    397     : m_mediaPlayer(0)
    398 {
    399 }
    400 
    401 } // namespace WebKit
    402 
    403 #endif  // ENABLE(VIDEO)
    404