1 /* 2 * Copyright (C) 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 28 #if ENABLE(VIDEO) 29 #include "MediaPlayer.h" 30 31 #include "ContentType.h" 32 #include "Document.h" 33 #include "Frame.h" 34 #include "FrameView.h" 35 #include "IntRect.h" 36 #include "MIMETypeRegistry.h" 37 #include "MediaPlayerPrivate.h" 38 #include "TimeRanges.h" 39 40 #if PLATFORM(QT) 41 #include <QtGlobal> 42 #endif 43 44 #if USE(GSTREAMER) 45 #include "MediaPlayerPrivateGStreamer.h" 46 #endif 47 48 #if PLATFORM(MAC) 49 #include "MediaPlayerPrivateQTKit.h" 50 #if USE(AVFOUNDATION) 51 #include "MediaPlayerPrivateAVFoundationObjC.h" 52 #endif 53 #define PlatformMediaEngineClassName MediaPlayerPrivateQTKit 54 #elif OS(WINCE) && !PLATFORM(QT) 55 #include "MediaPlayerPrivateWinCE.h" 56 #define PlatformMediaEngineClassName MediaPlayerPrivate 57 #elif PLATFORM(WIN) 58 #include "MediaPlayerPrivateQuickTimeVisualContext.h" 59 #define PlatformMediaEngineClassName MediaPlayerPrivateQuickTimeVisualContext 60 #elif PLATFORM(QT) 61 #if USE(QT_MULTIMEDIA) && !USE(GSTREAMER) 62 #include "MediaPlayerPrivateQt.h" 63 #define PlatformMediaEngineClassName MediaPlayerPrivateQt 64 #elif !USE(GSTREAMER) 65 #include "MediaPlayerPrivatePhonon.h" 66 #define PlatformMediaEngineClassName MediaPlayerPrivatePhonon 67 #endif 68 #elif PLATFORM(CHROMIUM) 69 #include "MediaPlayerPrivateChromium.h" 70 #define PlatformMediaEngineClassName MediaPlayerPrivate 71 #elif PLATFORM(ANDROID) 72 #include "MediaPlayerPrivateAndroid.h" 73 #define PlatformMediaEngineClassName MediaPlayerPrivate 74 #endif 75 76 namespace WebCore { 77 78 const PlatformMedia NoPlatformMedia = { PlatformMedia::None, {0} }; 79 80 // a null player to make MediaPlayer logic simpler 81 82 class NullMediaPlayerPrivate : public MediaPlayerPrivateInterface { 83 public: 84 NullMediaPlayerPrivate(MediaPlayer*) { } 85 86 virtual void load(const String&) { } 87 virtual void cancelLoad() { } 88 89 virtual void prepareToPlay() { } 90 virtual void play() { } 91 virtual void pause() { } 92 93 virtual PlatformMedia platformMedia() const { return NoPlatformMedia; } 94 #if USE(ACCELERATED_COMPOSITING) 95 virtual PlatformLayer* platformLayer() const { return 0; } 96 #endif 97 98 virtual IntSize naturalSize() const { return IntSize(0, 0); } 99 100 virtual bool hasVideo() const { return false; } 101 virtual bool hasAudio() const { return false; } 102 103 virtual void setVisible(bool) { } 104 105 virtual float duration() const { return 0; } 106 107 virtual float currentTime() const { return 0; } 108 virtual void seek(float) { } 109 virtual bool seeking() const { return false; } 110 111 virtual void setRate(float) { } 112 virtual void setPreservesPitch(bool) { } 113 virtual bool paused() const { return false; } 114 115 virtual void setVolume(float) { } 116 117 virtual bool supportsMuting() const { return false; } 118 virtual void setMuted(bool) { } 119 120 virtual bool hasClosedCaptions() const { return false; } 121 virtual void setClosedCaptionsVisible(bool) { }; 122 123 virtual MediaPlayer::NetworkState networkState() const { return MediaPlayer::Empty; } 124 virtual MediaPlayer::ReadyState readyState() const { return MediaPlayer::HaveNothing; } 125 126 virtual float maxTimeSeekable() const { return 0; } 127 virtual PassRefPtr<TimeRanges> buffered() const { return TimeRanges::create(); } 128 129 virtual unsigned totalBytes() const { return 0; } 130 virtual unsigned bytesLoaded() const { return 0; } 131 132 virtual void setSize(const IntSize&) { } 133 134 virtual void paint(GraphicsContext*, const IntRect&) { } 135 136 virtual bool canLoadPoster() const { return false; } 137 virtual void setPoster(const String&) { } 138 139 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) 140 virtual void deliverNotification(MediaPlayerProxyNotificationType) { } 141 virtual void setMediaPlayerProxy(WebMediaPlayerProxy*) { } 142 virtual void setControls(bool) { } 143 #endif 144 145 virtual bool hasSingleSecurityOrigin() const { return true; } 146 }; 147 148 static MediaPlayerPrivateInterface* createNullMediaPlayer(MediaPlayer* player) 149 { 150 return new NullMediaPlayerPrivate(player); 151 } 152 153 154 // engine support 155 156 struct MediaPlayerFactory { 157 WTF_MAKE_NONCOPYABLE(MediaPlayerFactory); WTF_MAKE_FAST_ALLOCATED; 158 public: 159 MediaPlayerFactory(CreateMediaEnginePlayer constructor, MediaEngineSupportedTypes getSupportedTypes, MediaEngineSupportsType supportsTypeAndCodecs, 160 MediaEngineGetSitesInMediaCache getSitesInMediaCache, MediaEngineClearMediaCache clearMediaCache, MediaEngineClearMediaCacheForSite clearMediaCacheForSite) 161 : constructor(constructor) 162 , getSupportedTypes(getSupportedTypes) 163 , supportsTypeAndCodecs(supportsTypeAndCodecs) 164 , getSitesInMediaCache(getSitesInMediaCache) 165 , clearMediaCache(clearMediaCache) 166 , clearMediaCacheForSite(clearMediaCacheForSite) 167 168 { 169 } 170 171 CreateMediaEnginePlayer constructor; 172 MediaEngineSupportedTypes getSupportedTypes; 173 MediaEngineSupportsType supportsTypeAndCodecs; 174 MediaEngineGetSitesInMediaCache getSitesInMediaCache; 175 MediaEngineClearMediaCache clearMediaCache; 176 MediaEngineClearMediaCacheForSite clearMediaCacheForSite; 177 }; 178 179 static void addMediaEngine(CreateMediaEnginePlayer, MediaEngineSupportedTypes, MediaEngineSupportsType, MediaEngineGetSitesInMediaCache, MediaEngineClearMediaCache, MediaEngineClearMediaCacheForSite); 180 static MediaPlayerFactory* bestMediaEngineForTypeAndCodecs(const String& type, const String& codecs, MediaPlayerFactory* current = 0); 181 static MediaPlayerFactory* nextMediaEngine(MediaPlayerFactory* current); 182 183 static Vector<MediaPlayerFactory*>& installedMediaEngines() 184 { 185 DEFINE_STATIC_LOCAL(Vector<MediaPlayerFactory*>, installedEngines, ()); 186 static bool enginesQueried = false; 187 188 if (!enginesQueried) { 189 enginesQueried = true; 190 191 #if USE(GSTREAMER) 192 MediaPlayerPrivateGStreamer::registerMediaEngine(addMediaEngine); 193 #endif 194 195 #if USE(AVFOUNDATION) && PLATFORM(MAC) 196 MediaPlayerPrivateAVFoundationObjC::registerMediaEngine(addMediaEngine); 197 #endif 198 199 #if !PLATFORM(GTK) && !PLATFORM(EFL) && !(PLATFORM(QT) && USE(GSTREAMER)) 200 PlatformMediaEngineClassName::registerMediaEngine(addMediaEngine); 201 #endif 202 } 203 204 return installedEngines; 205 } 206 207 static void addMediaEngine(CreateMediaEnginePlayer constructor, MediaEngineSupportedTypes getSupportedTypes, MediaEngineSupportsType supportsType, 208 MediaEngineGetSitesInMediaCache getSitesInMediaCache, MediaEngineClearMediaCache clearMediaCache, MediaEngineClearMediaCacheForSite clearMediaCacheForSite) 209 { 210 ASSERT(constructor); 211 ASSERT(getSupportedTypes); 212 ASSERT(supportsType); 213 214 installedMediaEngines().append(new MediaPlayerFactory(constructor, getSupportedTypes, supportsType, getSitesInMediaCache, clearMediaCache, clearMediaCacheForSite)); 215 } 216 217 static const AtomicString& applicationOctetStream() 218 { 219 DEFINE_STATIC_LOCAL(const AtomicString, applicationOctetStream, ("application/octet-stream")); 220 return applicationOctetStream; 221 } 222 223 static const AtomicString& textPlain() 224 { 225 DEFINE_STATIC_LOCAL(const AtomicString, textPlain, ("text/plain")); 226 return textPlain; 227 } 228 229 static const AtomicString& codecs() 230 { 231 DEFINE_STATIC_LOCAL(const AtomicString, codecs, ("codecs")); 232 return codecs; 233 } 234 235 static MediaPlayerFactory* bestMediaEngineForTypeAndCodecs(const String& type, const String& codecs, MediaPlayerFactory* current) 236 { 237 if (type.isEmpty()) 238 return 0; 239 240 Vector<MediaPlayerFactory*>& engines = installedMediaEngines(); 241 if (engines.isEmpty()) 242 return 0; 243 244 // 4.8.10.3 MIME types - In the absence of a specification to the contrary, the MIME type "application/octet-stream" 245 // when used with parameters, e.g. "application/octet-stream;codecs=theora", is a type that the user agent knows 246 // it cannot render. 247 if (type == applicationOctetStream()) { 248 if (!codecs.isEmpty()) 249 return 0; 250 } 251 252 MediaPlayerFactory* engine = 0; 253 MediaPlayer::SupportsType supported = MediaPlayer::IsNotSupported; 254 unsigned count = engines.size(); 255 for (unsigned ndx = 0; ndx < count; ndx++) { 256 if (current) { 257 if (current == engines[ndx]) 258 current = 0; 259 continue; 260 } 261 MediaPlayer::SupportsType engineSupport = engines[ndx]->supportsTypeAndCodecs(type, codecs); 262 if (engineSupport > supported) { 263 supported = engineSupport; 264 engine = engines[ndx]; 265 } 266 } 267 268 return engine; 269 } 270 271 static MediaPlayerFactory* nextMediaEngine(MediaPlayerFactory* current) 272 { 273 Vector<MediaPlayerFactory*>& engines = installedMediaEngines(); 274 if (engines.isEmpty()) 275 return 0; 276 277 if (!current) 278 return engines.first(); 279 280 size_t currentIndex = engines.find(current); 281 if (currentIndex == WTF::notFound || currentIndex == engines.size()) 282 return 0; 283 284 return engines[currentIndex + 1]; 285 } 286 287 // media player 288 289 MediaPlayer::MediaPlayer(MediaPlayerClient* client) 290 : m_mediaPlayerClient(client) 291 , m_reloadTimer(this, &MediaPlayer::reloadTimerFired) 292 , m_private(createNullMediaPlayer(this)) 293 , m_currentMediaEngine(0) 294 , m_frameView(0) 295 , m_preload(Auto) 296 , m_visible(false) 297 , m_rate(1.0f) 298 , m_volume(1.0f) 299 , m_muted(false) 300 , m_preservesPitch(true) 301 , m_privateBrowsing(false) 302 , m_shouldPrepareToRender(false) 303 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) 304 , m_playerProxy(0) 305 #endif 306 #if PLATFORM(ANDROID) 307 , m_mediaElementType(Video) 308 #endif 309 { 310 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) 311 Vector<MediaPlayerFactory*>& engines = installedMediaEngines(); 312 if (!engines.isEmpty()) { 313 m_currentMediaEngine = engines[0]; 314 m_private.clear(); 315 m_private.set(engines[0]->constructor(this)); 316 if (m_mediaPlayerClient) 317 m_mediaPlayerClient->mediaPlayerEngineUpdated(this); 318 } 319 #endif 320 } 321 322 MediaPlayer::~MediaPlayer() 323 { 324 m_mediaPlayerClient = 0; 325 } 326 327 void MediaPlayer::load(const String& url, const ContentType& contentType) 328 { 329 String type = contentType.type().lower(); 330 String typeCodecs = contentType.parameter(codecs()); 331 332 // If the MIME type is missing or is not meaningful, try to figure it out from the URL. 333 if (type.isEmpty() || type == applicationOctetStream() || type == textPlain()) { 334 if (protocolIs(url, "data")) 335 type = mimeTypeFromDataURL(url); 336 else { 337 size_t pos = url.reverseFind('.'); 338 if (pos != notFound) { 339 String extension = url.substring(pos + 1); 340 String mediaType = MIMETypeRegistry::getMediaMIMETypeForExtension(extension); 341 if (!mediaType.isEmpty()) 342 type = mediaType; 343 } 344 } 345 } 346 347 m_url = url; 348 m_contentMIMEType = type; 349 m_contentTypeCodecs = typeCodecs; 350 loadWithNextMediaEngine(0); 351 } 352 353 void MediaPlayer::loadWithNextMediaEngine(MediaPlayerFactory* current) 354 { 355 MediaPlayerFactory* engine; 356 357 // If no MIME type is specified, just use the next engine. 358 if (m_contentMIMEType.isEmpty()) 359 engine = nextMediaEngine(current); 360 else 361 engine = bestMediaEngineForTypeAndCodecs(m_contentMIMEType, m_contentTypeCodecs, current); 362 363 // Don't delete and recreate the player unless it comes from a different engine. 364 if (!engine) { 365 m_currentMediaEngine = engine; 366 m_private.clear(); 367 } else if (m_currentMediaEngine != engine) { 368 m_currentMediaEngine = engine; 369 m_private.clear(); 370 m_private.set(engine->constructor(this)); 371 if (m_mediaPlayerClient) 372 m_mediaPlayerClient->mediaPlayerEngineUpdated(this); 373 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) 374 m_private->setMediaPlayerProxy(m_playerProxy); 375 #endif 376 m_private->setPrivateBrowsingMode(m_privateBrowsing); 377 m_private->setPreload(m_preload); 378 m_private->setPreservesPitch(preservesPitch()); 379 if (m_shouldPrepareToRender) 380 m_private->prepareForRendering(); 381 } 382 383 if (m_private) 384 m_private->load(m_url); 385 else { 386 m_private.set(createNullMediaPlayer(this)); 387 if (m_mediaPlayerClient) 388 m_mediaPlayerClient->mediaPlayerEngineUpdated(this); 389 } 390 } 391 392 bool MediaPlayer::hasAvailableVideoFrame() const 393 { 394 return m_private->hasAvailableVideoFrame(); 395 } 396 397 void MediaPlayer::prepareForRendering() 398 { 399 m_shouldPrepareToRender = true; 400 m_private->prepareForRendering(); 401 } 402 403 bool MediaPlayer::canLoadPoster() const 404 { 405 return m_private->canLoadPoster(); 406 } 407 408 void MediaPlayer::setPoster(const String& url) 409 { 410 m_private->setPoster(url); 411 } 412 413 void MediaPlayer::cancelLoad() 414 { 415 m_private->cancelLoad(); 416 } 417 418 void MediaPlayer::prepareToPlay() 419 { 420 m_private->prepareToPlay(); 421 } 422 423 void MediaPlayer::play() 424 { 425 m_private->play(); 426 } 427 428 void MediaPlayer::pause() 429 { 430 m_private->pause(); 431 } 432 433 float MediaPlayer::duration() const 434 { 435 return m_private->duration(); 436 } 437 438 float MediaPlayer::startTime() const 439 { 440 return m_private->startTime(); 441 } 442 443 float MediaPlayer::currentTime() const 444 { 445 return m_private->currentTime(); 446 } 447 448 void MediaPlayer::seek(float time) 449 { 450 m_private->seek(time); 451 } 452 453 bool MediaPlayer::paused() const 454 { 455 return m_private->paused(); 456 } 457 458 bool MediaPlayer::seeking() const 459 { 460 return m_private->seeking(); 461 } 462 463 bool MediaPlayer::supportsFullscreen() const 464 { 465 return m_private->supportsFullscreen(); 466 } 467 468 bool MediaPlayer::supportsSave() const 469 { 470 return m_private->supportsSave(); 471 } 472 473 IntSize MediaPlayer::naturalSize() 474 { 475 return m_private->naturalSize(); 476 } 477 478 bool MediaPlayer::hasVideo() const 479 { 480 return m_private->hasVideo(); 481 } 482 483 bool MediaPlayer::hasAudio() const 484 { 485 return m_private->hasAudio(); 486 } 487 488 bool MediaPlayer::inMediaDocument() 489 { 490 Frame* frame = m_frameView ? m_frameView->frame() : 0; 491 Document* document = frame ? frame->document() : 0; 492 493 return document && document->isMediaDocument(); 494 } 495 496 PlatformMedia MediaPlayer::platformMedia() const 497 { 498 return m_private->platformMedia(); 499 } 500 501 #if USE(ACCELERATED_COMPOSITING) 502 PlatformLayer* MediaPlayer::platformLayer() const 503 { 504 return m_private->platformLayer(); 505 } 506 #endif 507 508 MediaPlayer::NetworkState MediaPlayer::networkState() 509 { 510 return m_private->networkState(); 511 } 512 513 MediaPlayer::ReadyState MediaPlayer::readyState() 514 { 515 return m_private->readyState(); 516 } 517 518 float MediaPlayer::volume() const 519 { 520 return m_volume; 521 } 522 523 void MediaPlayer::setVolume(float volume) 524 { 525 m_volume = volume; 526 527 if (m_private->supportsMuting() || !m_muted) 528 m_private->setVolume(volume); 529 } 530 531 bool MediaPlayer::muted() const 532 { 533 return m_muted; 534 } 535 536 void MediaPlayer::setMuted(bool muted) 537 { 538 m_muted = muted; 539 540 if (m_private->supportsMuting()) 541 m_private->setMuted(muted); 542 else 543 m_private->setVolume(muted ? 0 : m_volume); 544 } 545 546 bool MediaPlayer::hasClosedCaptions() const 547 { 548 return m_private->hasClosedCaptions(); 549 } 550 551 void MediaPlayer::setClosedCaptionsVisible(bool closedCaptionsVisible) 552 { 553 m_private->setClosedCaptionsVisible(closedCaptionsVisible); 554 } 555 556 float MediaPlayer::rate() const 557 { 558 return m_rate; 559 } 560 561 void MediaPlayer::setRate(float rate) 562 { 563 m_rate = rate; 564 m_private->setRate(rate); 565 } 566 567 bool MediaPlayer::preservesPitch() const 568 { 569 return m_preservesPitch; 570 } 571 572 void MediaPlayer::setPreservesPitch(bool preservesPitch) 573 { 574 m_preservesPitch = preservesPitch; 575 m_private->setPreservesPitch(preservesPitch); 576 } 577 578 PassRefPtr<TimeRanges> MediaPlayer::buffered() 579 { 580 return m_private->buffered(); 581 } 582 583 float MediaPlayer::maxTimeSeekable() 584 { 585 return m_private->maxTimeSeekable(); 586 } 587 588 unsigned MediaPlayer::bytesLoaded() 589 { 590 return m_private->bytesLoaded(); 591 } 592 593 void MediaPlayer::setSize(const IntSize& size) 594 { 595 m_size = size; 596 m_private->setSize(size); 597 } 598 599 bool MediaPlayer::visible() const 600 { 601 return m_visible; 602 } 603 604 void MediaPlayer::setVisible(bool b) 605 { 606 m_visible = b; 607 m_private->setVisible(b); 608 } 609 610 MediaPlayer::Preload MediaPlayer::preload() const 611 { 612 return m_preload; 613 } 614 615 void MediaPlayer::setPreload(MediaPlayer::Preload preload) 616 { 617 m_preload = preload; 618 m_private->setPreload(preload); 619 } 620 621 void MediaPlayer::paint(GraphicsContext* p, const IntRect& r) 622 { 623 m_private->paint(p, r); 624 } 625 626 void MediaPlayer::paintCurrentFrameInContext(GraphicsContext* p, const IntRect& r) 627 { 628 m_private->paintCurrentFrameInContext(p, r); 629 } 630 631 MediaPlayer::SupportsType MediaPlayer::supportsType(const ContentType& contentType) 632 { 633 String type = contentType.type().lower(); 634 String typeCodecs = contentType.parameter(codecs()); 635 636 // 4.8.10.3 MIME types - The canPlayType(type) method must return the empty string if type is a type that the 637 // user agent knows it cannot render or is the type "application/octet-stream" 638 if (type == applicationOctetStream()) 639 return IsNotSupported; 640 641 MediaPlayerFactory* engine = bestMediaEngineForTypeAndCodecs(type, typeCodecs); 642 if (!engine) 643 return IsNotSupported; 644 645 return engine->supportsTypeAndCodecs(type, typeCodecs); 646 } 647 648 void MediaPlayer::getSupportedTypes(HashSet<String>& types) 649 { 650 Vector<MediaPlayerFactory*>& engines = installedMediaEngines(); 651 if (engines.isEmpty()) 652 return; 653 654 unsigned count = engines.size(); 655 for (unsigned ndx = 0; ndx < count; ndx++) 656 engines[ndx]->getSupportedTypes(types); 657 } 658 659 bool MediaPlayer::isAvailable() 660 { 661 return !installedMediaEngines().isEmpty(); 662 } 663 664 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) 665 void MediaPlayer::deliverNotification(MediaPlayerProxyNotificationType notification) 666 { 667 m_private->deliverNotification(notification); 668 } 669 670 void MediaPlayer::setMediaPlayerProxy(WebMediaPlayerProxy* proxy) 671 { 672 m_playerProxy = proxy; 673 m_private->setMediaPlayerProxy(proxy); 674 } 675 676 void MediaPlayer::setControls(bool controls) 677 { 678 m_private->setControls(controls); 679 } 680 681 void MediaPlayer::enterFullscreen() 682 { 683 m_private->enterFullscreen(); 684 } 685 686 void MediaPlayer::exitFullscreen() 687 { 688 m_private->exitFullscreen(); 689 } 690 #endif 691 692 #if PLATFORM(ANDROID) 693 void MediaPlayer::enterFullscreenMode() 694 { 695 // Tell the player to enter full screen mode. 696 m_private->enterFullscreenMode(); 697 } 698 #endif 699 700 #if USE(ACCELERATED_COMPOSITING) 701 void MediaPlayer::acceleratedRenderingStateChanged() 702 { 703 m_private->acceleratedRenderingStateChanged(); 704 } 705 706 bool MediaPlayer::supportsAcceleratedRendering() const 707 { 708 return m_private->supportsAcceleratedRendering(); 709 } 710 #endif // USE(ACCELERATED_COMPOSITING) 711 712 bool MediaPlayer::hasSingleSecurityOrigin() const 713 { 714 return m_private->hasSingleSecurityOrigin(); 715 } 716 717 MediaPlayer::MovieLoadType MediaPlayer::movieLoadType() const 718 { 719 return m_private->movieLoadType(); 720 } 721 722 float MediaPlayer::mediaTimeForTimeValue(float timeValue) const 723 { 724 return m_private->mediaTimeForTimeValue(timeValue); 725 } 726 727 double MediaPlayer::maximumDurationToCacheMediaTime() const 728 { 729 return m_private->maximumDurationToCacheMediaTime(); 730 } 731 732 unsigned MediaPlayer::decodedFrameCount() const 733 { 734 return m_private->decodedFrameCount(); 735 } 736 737 unsigned MediaPlayer::droppedFrameCount() const 738 { 739 return m_private->droppedFrameCount(); 740 } 741 742 unsigned MediaPlayer::audioDecodedByteCount() const 743 { 744 return m_private->audioDecodedByteCount(); 745 } 746 747 unsigned MediaPlayer::videoDecodedByteCount() const 748 { 749 return m_private->videoDecodedByteCount(); 750 } 751 752 void MediaPlayer::reloadTimerFired(Timer<MediaPlayer>*) 753 { 754 m_private->cancelLoad(); 755 loadWithNextMediaEngine(m_currentMediaEngine); 756 } 757 758 void MediaPlayer::getSitesInMediaCache(Vector<String>& sites) 759 { 760 Vector<MediaPlayerFactory*>& engines = installedMediaEngines(); 761 unsigned size = engines.size(); 762 for (unsigned i = 0; i < size; i++) { 763 if (!engines[i]->getSitesInMediaCache) 764 continue; 765 Vector<String> engineSites; 766 engines[i]->getSitesInMediaCache(engineSites); 767 sites.append(engineSites); 768 } 769 } 770 771 void MediaPlayer::clearMediaCache() 772 { 773 Vector<MediaPlayerFactory*>& engines = installedMediaEngines(); 774 unsigned size = engines.size(); 775 for (unsigned i = 0; i < size; i++) { 776 if (engines[i]->clearMediaCache) 777 engines[i]->clearMediaCache(); 778 } 779 } 780 781 void MediaPlayer::clearMediaCacheForSite(const String& site) 782 { 783 Vector<MediaPlayerFactory*>& engines = installedMediaEngines(); 784 unsigned size = engines.size(); 785 for (unsigned i = 0; i < size; i++) { 786 if (engines[i]->clearMediaCacheForSite) 787 engines[i]->clearMediaCacheForSite(site); 788 } 789 } 790 791 void MediaPlayer::setPrivateBrowsingMode(bool privateBrowsingMode) 792 { 793 m_privateBrowsing = privateBrowsingMode; 794 m_private->setPrivateBrowsingMode(m_privateBrowsing); 795 } 796 797 // Client callbacks. 798 void MediaPlayer::networkStateChanged() 799 { 800 // If more than one media engine is installed and this one failed before finding metadata, 801 // let the next engine try. 802 if (m_private->networkState() >= FormatError 803 && m_private->readyState() < HaveMetadata 804 && installedMediaEngines().size() > 1) { 805 if ( m_contentMIMEType.isEmpty() || bestMediaEngineForTypeAndCodecs(m_contentMIMEType, m_contentTypeCodecs, m_currentMediaEngine)) { 806 m_reloadTimer.startOneShot(0); 807 return; 808 } 809 } 810 if (m_mediaPlayerClient) 811 m_mediaPlayerClient->mediaPlayerNetworkStateChanged(this); 812 } 813 814 void MediaPlayer::readyStateChanged() 815 { 816 if (m_mediaPlayerClient) 817 m_mediaPlayerClient->mediaPlayerReadyStateChanged(this); 818 } 819 820 void MediaPlayer::volumeChanged(float newVolume) 821 { 822 m_volume = newVolume; 823 if (m_mediaPlayerClient) 824 m_mediaPlayerClient->mediaPlayerVolumeChanged(this); 825 } 826 827 void MediaPlayer::muteChanged(bool newMuted) 828 { 829 m_muted = newMuted; 830 if (m_mediaPlayerClient) 831 m_mediaPlayerClient->mediaPlayerMuteChanged(this); 832 } 833 834 void MediaPlayer::timeChanged() 835 { 836 if (m_mediaPlayerClient) 837 m_mediaPlayerClient->mediaPlayerTimeChanged(this); 838 } 839 840 void MediaPlayer::sizeChanged() 841 { 842 if (m_mediaPlayerClient) 843 m_mediaPlayerClient->mediaPlayerSizeChanged(this); 844 } 845 846 void MediaPlayer::repaint() 847 { 848 if (m_mediaPlayerClient) 849 m_mediaPlayerClient->mediaPlayerRepaint(this); 850 } 851 852 void MediaPlayer::durationChanged() 853 { 854 if (m_mediaPlayerClient) 855 m_mediaPlayerClient->mediaPlayerDurationChanged(this); 856 } 857 858 void MediaPlayer::rateChanged() 859 { 860 if (m_mediaPlayerClient) 861 m_mediaPlayerClient->mediaPlayerRateChanged(this); 862 } 863 864 void MediaPlayer::playbackStateChanged() 865 { 866 if (m_mediaPlayerClient) 867 m_mediaPlayerClient->mediaPlayerPlaybackStateChanged(this); 868 } 869 870 void MediaPlayer::firstVideoFrameAvailable() 871 { 872 if (m_mediaPlayerClient) 873 m_mediaPlayerClient->mediaPlayerFirstVideoFrameAvailable(this); 874 } 875 876 } 877 878 #endif 879