2 * Copyright (C) 2007-2014 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
13 * THIS SOFTWARE IS PROVIDED BY APPLE 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 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.
29 #include "MediaPlayer.h"
31 #include "ContentType.h"
34 #include "FrameView.h"
37 #include "MIMETypeRegistry.h"
38 #include "MediaPlayerPrivate.h"
39 #include "PlatformTimeRanges.h"
41 #include <wtf/text/CString.h>
43 #if ENABLE(VIDEO_TRACK)
44 #include "InbandTextTrackPrivate.h"
47 #if ENABLE(MEDIA_SOURCE)
48 #include "MediaSourcePrivateClient.h"
52 #include "MediaPlayerPrivateGStreamer.h"
53 #define PlatformMediaEngineClassName MediaPlayerPrivateGStreamer
58 #include "MediaPlayerPrivateIOS.h"
60 #include "MediaPlayerPrivateQTKit.h"
63 #include "MediaPlayerPrivateAVFoundationObjC.h"
64 #if ENABLE(MEDIA_SOURCE)
65 #include "MediaPlayerPrivateMediaSourceAVFObjC.h"
69 #include "MediaPlayerPrivateWinCE.h"
70 #define PlatformMediaEngineClassName MediaPlayerPrivate
71 #elif PLATFORM(WIN) && !USE(GSTREAMER)
73 #include "MediaPlayerPrivateAVFoundationCF.h"
74 #endif // USE(AVFOUNDATION)
79 const PlatformMedia NoPlatformMedia = { PlatformMedia::None, {0} };
81 // a null player to make MediaPlayer logic simpler
83 class NullMediaPlayerPrivate : public MediaPlayerPrivateInterface {
85 NullMediaPlayerPrivate(MediaPlayer*) { }
87 virtual void load(const String&) { }
88 #if ENABLE(MEDIA_SOURCE)
89 virtual void load(const String&, MediaSourcePrivateClient*) { }
91 virtual void cancelLoad() { }
93 virtual void prepareToPlay() { }
94 virtual void play() { }
95 virtual void pause() { }
97 virtual PlatformMedia platformMedia() const { return NoPlatformMedia; }
98 virtual PlatformLayer* platformLayer() const { return 0; }
100 virtual IntSize naturalSize() const { return IntSize(0, 0); }
102 virtual bool hasVideo() const { return false; }
103 virtual bool hasAudio() const { return false; }
105 virtual void setVisible(bool) { }
107 virtual double durationDouble() const { return 0; }
109 virtual double currentTimeDouble() const { return 0; }
110 virtual void seekDouble(double) { }
111 virtual bool seeking() const { return false; }
113 virtual void setRateDouble(double) { }
114 virtual void setPreservesPitch(bool) { }
115 virtual bool paused() const { return false; }
117 virtual void setVolumeDouble(double) { }
119 virtual bool supportsMuting() const { return false; }
120 virtual void setMuted(bool) { }
122 virtual bool hasClosedCaptions() const { return false; }
123 virtual void setClosedCaptionsVisible(bool) { };
125 virtual MediaPlayer::NetworkState networkState() const { return MediaPlayer::Empty; }
126 virtual MediaPlayer::ReadyState readyState() const { return MediaPlayer::HaveNothing; }
128 virtual double maxTimeSeekableDouble() const { return 0; }
129 virtual double minTimeSeekable() const { return 0; }
130 virtual std::unique_ptr<PlatformTimeRanges> buffered() const { return PlatformTimeRanges::create(); }
132 virtual unsigned totalBytes() const { return 0; }
133 virtual bool didLoadingProgress() const { return false; }
135 virtual void setSize(const IntSize&) { }
137 virtual void paint(GraphicsContext*, const IntRect&) { }
139 virtual bool canLoadPoster() const { return false; }
140 virtual void setPoster(const String&) { }
142 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
143 virtual void deliverNotification(MediaPlayerProxyNotificationType) { }
144 virtual void setMediaPlayerProxy(WebMediaPlayerProxy*) { }
145 virtual void setControls(bool) { }
148 virtual bool hasSingleSecurityOrigin() const { return true; }
150 #if ENABLE(ENCRYPTED_MEDIA)
151 virtual MediaPlayer::MediaKeyException generateKeyRequest(const String&, const unsigned char*, unsigned) override { return MediaPlayer::InvalidPlayerState; }
152 virtual MediaPlayer::MediaKeyException addKey(const String&, const unsigned char*, unsigned, const unsigned char*, unsigned, const String&) override { return MediaPlayer::InvalidPlayerState; }
153 virtual MediaPlayer::MediaKeyException cancelKeyRequest(const String&, const String&) override { return MediaPlayer::InvalidPlayerState; }
157 static PassOwnPtr<MediaPlayerPrivateInterface> createNullMediaPlayer(MediaPlayer* player)
159 return adoptPtr(new NullMediaPlayerPrivate(player));
165 struct MediaPlayerFactory {
166 WTF_MAKE_NONCOPYABLE(MediaPlayerFactory); WTF_MAKE_FAST_ALLOCATED;
168 MediaPlayerFactory(CreateMediaEnginePlayer constructor, MediaEngineSupportedTypes getSupportedTypes, MediaEngineSupportsType supportsTypeAndCodecs,
169 MediaEngineGetSitesInMediaCache getSitesInMediaCache, MediaEngineClearMediaCache clearMediaCache, MediaEngineClearMediaCacheForSite clearMediaCacheForSite, MediaEngineSupportsKeySystem supportsKeySystem)
170 : constructor(constructor)
171 , getSupportedTypes(getSupportedTypes)
172 , supportsTypeAndCodecs(supportsTypeAndCodecs)
173 , getSitesInMediaCache(getSitesInMediaCache)
174 , clearMediaCache(clearMediaCache)
175 , clearMediaCacheForSite(clearMediaCacheForSite)
176 , supportsKeySystem(supportsKeySystem)
180 CreateMediaEnginePlayer constructor;
181 MediaEngineSupportedTypes getSupportedTypes;
182 MediaEngineSupportsType supportsTypeAndCodecs;
183 MediaEngineGetSitesInMediaCache getSitesInMediaCache;
184 MediaEngineClearMediaCache clearMediaCache;
185 MediaEngineClearMediaCacheForSite clearMediaCacheForSite;
186 MediaEngineSupportsKeySystem supportsKeySystem;
189 static void addMediaEngine(CreateMediaEnginePlayer, MediaEngineSupportedTypes, MediaEngineSupportsType, MediaEngineGetSitesInMediaCache, MediaEngineClearMediaCache, MediaEngineClearMediaCacheForSite, MediaEngineSupportsKeySystem);
191 static MediaPlayerFactory* bestMediaEngineForSupportParameters(const MediaEngineSupportParameters&, MediaPlayerFactory* current = 0);
192 static MediaPlayerFactory* nextMediaEngine(MediaPlayerFactory* current);
194 enum RequeryEngineOptions { DoNotResetEngines, ResetEngines };
195 static Vector<MediaPlayerFactory*>& installedMediaEngines(RequeryEngineOptions requeryFlags = DoNotResetEngines )
197 DEPRECATED_DEFINE_STATIC_LOCAL(Vector<MediaPlayerFactory*>, installedEngines, ());
198 static bool enginesQueried = false;
200 if (requeryFlags == ResetEngines) {
201 installedEngines.clear();
202 enginesQueried = false;
203 return installedEngines;
207 return installedEngines;
209 enginesQueried = true;
211 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
212 if (Settings::isVideoPluginProxyEnabled())
213 MediaPlayerPrivateIOS::registerMediaEngine(addMediaEngine);
216 #if USE(AVFOUNDATION)
217 if (Settings::isAVFoundationEnabled()) {
219 MediaPlayerPrivateAVFoundationObjC::registerMediaEngine(addMediaEngine);
220 #if ENABLE(MEDIA_SOURCE)
221 MediaPlayerPrivateMediaSourceAVFObjC::registerMediaEngine(addMediaEngine);
224 MediaPlayerPrivateAVFoundationCF::registerMediaEngine(addMediaEngine);
230 if (Settings::isQTKitEnabled())
231 MediaPlayerPrivateQTKit::registerMediaEngine(addMediaEngine);
234 #if defined(PlatformMediaEngineClassName)
235 PlatformMediaEngineClassName::registerMediaEngine(addMediaEngine);
238 return installedEngines;
241 static void addMediaEngine(CreateMediaEnginePlayer constructor, MediaEngineSupportedTypes getSupportedTypes, MediaEngineSupportsType supportsType,
242 MediaEngineGetSitesInMediaCache getSitesInMediaCache, MediaEngineClearMediaCache clearMediaCache, MediaEngineClearMediaCacheForSite clearMediaCacheForSite, MediaEngineSupportsKeySystem supportsKeySystem)
245 ASSERT(getSupportedTypes);
246 ASSERT(supportsType);
248 installedMediaEngines().append(new MediaPlayerFactory(constructor, getSupportedTypes, supportsType, getSitesInMediaCache, clearMediaCache, clearMediaCacheForSite, supportsKeySystem));
251 static const AtomicString& applicationOctetStream()
253 DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, applicationOctetStream, ("application/octet-stream", AtomicString::ConstructFromLiteral));
254 return applicationOctetStream;
257 static const AtomicString& textPlain()
259 DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, textPlain, ("text/plain", AtomicString::ConstructFromLiteral));
263 static const AtomicString& codecs()
265 DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, codecs, ("codecs", AtomicString::ConstructFromLiteral));
269 static MediaPlayerFactory* bestMediaEngineForSupportParameters(const MediaEngineSupportParameters& parameters, MediaPlayerFactory* current)
271 if (parameters.type.isEmpty())
274 Vector<MediaPlayerFactory*>& engines = installedMediaEngines();
275 if (engines.isEmpty())
278 // 4.8.10.3 MIME types - In the absence of a specification to the contrary, the MIME type "application/octet-stream"
279 // when used with parameters, e.g. "application/octet-stream;codecs=theora", is a type that the user agent knows
281 if (parameters.type == applicationOctetStream()) {
282 if (!parameters.codecs.isEmpty())
286 MediaPlayerFactory* engine = 0;
287 MediaPlayer::SupportsType supported = MediaPlayer::IsNotSupported;
288 unsigned count = engines.size();
289 for (unsigned ndx = 0; ndx < count; ndx++) {
291 if (current == engines[ndx])
295 MediaPlayer::SupportsType engineSupport = engines[ndx]->supportsTypeAndCodecs(parameters);
296 if (engineSupport > supported) {
297 supported = engineSupport;
298 engine = engines[ndx];
305 static MediaPlayerFactory* nextMediaEngine(MediaPlayerFactory* current)
307 Vector<MediaPlayerFactory*>& engines = installedMediaEngines();
308 if (engines.isEmpty())
312 return engines.first();
314 size_t currentIndex = engines.find(current);
315 if (currentIndex == WTF::notFound || currentIndex + 1 >= engines.size())
318 return engines[currentIndex + 1];
323 MediaPlayer::MediaPlayer(MediaPlayerClient* client)
324 : m_mediaPlayerClient(client)
325 , m_reloadTimer(this, &MediaPlayer::reloadTimerFired)
326 , m_private(createNullMediaPlayer(this))
327 , m_currentMediaEngine(0)
334 , m_preservesPitch(true)
335 , m_privateBrowsing(false)
336 , m_shouldPrepareToRender(false)
337 , m_contentMIMETypeWasInferredFromExtension(false)
338 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
342 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
343 Vector<MediaPlayerFactory*>& engines = installedMediaEngines();
344 if (Settings::isVideoPluginProxyEnabled() && !engines.isEmpty()) {
345 m_currentMediaEngine = engines[0];
346 m_private = engines[0]->constructor(this);
347 if (m_mediaPlayerClient)
348 m_mediaPlayerClient->mediaPlayerEngineUpdated(this);
353 MediaPlayer::~MediaPlayer()
355 m_mediaPlayerClient = 0;
358 bool MediaPlayer::load(const URL& url, const ContentType& contentType, const String& keySystem)
360 m_contentMIMEType = contentType.type().lower();
361 m_contentTypeCodecs = contentType.parameter(codecs());
363 m_keySystem = keySystem.lower();
364 m_contentMIMETypeWasInferredFromExtension = false;
366 #if ENABLE(MEDIA_SOURCE)
370 // If the MIME type is missing or is not meaningful, try to figure it out from the URL.
371 if (m_contentMIMEType.isEmpty() || m_contentMIMEType == applicationOctetStream() || m_contentMIMEType == textPlain()) {
372 if (m_url.protocolIsData())
373 m_contentMIMEType = mimeTypeFromDataURL(m_url.string());
375 String lastPathComponent = url.lastPathComponent();
376 size_t pos = lastPathComponent.reverseFind('.');
377 if (pos != notFound) {
378 String extension = lastPathComponent.substring(pos + 1);
379 String mediaType = MIMETypeRegistry::getMediaMIMETypeForExtension(extension);
380 if (!mediaType.isEmpty()) {
381 m_contentMIMEType = mediaType;
382 m_contentMIMETypeWasInferredFromExtension = true;
388 loadWithNextMediaEngine(0);
389 return m_currentMediaEngine;
392 #if ENABLE(MEDIA_SOURCE)
393 bool MediaPlayer::load(const URL& url, const ContentType& contentType, MediaSourcePrivateClient* mediaSource)
396 m_mediaSource = mediaSource;
397 m_contentMIMEType = contentType.type().lower();
398 m_contentTypeCodecs = contentType.parameter(codecs());
401 m_contentMIMETypeWasInferredFromExtension = false;
402 loadWithNextMediaEngine(0);
403 return m_currentMediaEngine;
407 MediaPlayerFactory* MediaPlayer::nextBestMediaEngine(MediaPlayerFactory* current) const
409 MediaEngineSupportParameters parameters;
410 parameters.type = m_contentMIMEType;
411 parameters.codecs = m_contentTypeCodecs;
412 parameters.url = m_url;
413 #if ENABLE(ENCRYPTED_MEDIA)
414 parameters.keySystem = m_keySystem;
416 #if ENABLE(MEDIA_SOURCE)
417 parameters.isMediaSource = !!m_mediaSource;
420 return bestMediaEngineForSupportParameters(parameters, current);
423 void MediaPlayer::loadWithNextMediaEngine(MediaPlayerFactory* current)
425 MediaPlayerFactory* engine = 0;
427 if (!m_contentMIMEType.isEmpty())
428 engine = nextBestMediaEngine(current);
430 // If no MIME type is specified or the type was inferred from the file extension, just use the next engine.
431 if (!engine && (m_contentMIMEType.isEmpty() || m_contentMIMETypeWasInferredFromExtension))
432 engine = nextMediaEngine(current);
434 // Don't delete and recreate the player unless it comes from a different engine.
436 LOG(Media, "MediaPlayer::loadWithNextMediaEngine - no media engine found for type \"%s\"", m_contentMIMEType.utf8().data());
437 m_currentMediaEngine = engine;
439 } else if (m_currentMediaEngine != engine) {
440 m_currentMediaEngine = engine;
441 m_private = engine->constructor(this);
442 if (m_mediaPlayerClient)
443 m_mediaPlayerClient->mediaPlayerEngineUpdated(this);
444 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
445 m_private->setMediaPlayerProxy(m_playerProxy);
447 m_private->setPrivateBrowsingMode(m_privateBrowsing);
448 m_private->setPreload(m_preload);
449 m_private->setPreservesPitch(preservesPitch());
450 if (m_shouldPrepareToRender)
451 m_private->prepareForRendering();
455 #if ENABLE(MEDIA_SOURCE)
457 m_private->load(m_url.string(), m_mediaSource.get());
460 m_private->load(m_url.string());
462 m_private = createNullMediaPlayer(this);
463 if (m_mediaPlayerClient) {
464 m_mediaPlayerClient->mediaPlayerEngineUpdated(this);
465 m_mediaPlayerClient->mediaPlayerResourceNotSupported(this);
470 bool MediaPlayer::hasAvailableVideoFrame() const
472 return m_private->hasAvailableVideoFrame();
475 void MediaPlayer::prepareForRendering()
477 m_shouldPrepareToRender = true;
478 m_private->prepareForRendering();
481 bool MediaPlayer::canLoadPoster() const
483 return m_private->canLoadPoster();
486 void MediaPlayer::setPoster(const String& url)
488 m_private->setPoster(url);
491 void MediaPlayer::cancelLoad()
493 m_private->cancelLoad();
496 void MediaPlayer::prepareToPlay()
498 m_private->prepareToPlay();
501 void MediaPlayer::play()
506 void MediaPlayer::pause()
511 #if ENABLE(ENCRYPTED_MEDIA)
512 MediaPlayer::MediaKeyException MediaPlayer::generateKeyRequest(const String& keySystem, const unsigned char* initData, unsigned initDataLength)
514 return m_private->generateKeyRequest(keySystem.lower(), initData, initDataLength);
517 MediaPlayer::MediaKeyException MediaPlayer::addKey(const String& keySystem, const unsigned char* key, unsigned keyLength, const unsigned char* initData, unsigned initDataLength, const String& sessionId)
519 return m_private->addKey(keySystem.lower(), key, keyLength, initData, initDataLength, sessionId);
522 MediaPlayer::MediaKeyException MediaPlayer::cancelKeyRequest(const String& keySystem, const String& sessionId)
524 return m_private->cancelKeyRequest(keySystem.lower(), sessionId);
528 #if ENABLE(ENCRYPTED_MEDIA_V2)
529 std::unique_ptr<CDMSession> MediaPlayer::createSession(const String& keySystem)
531 return m_private->createSession(keySystem);
535 double MediaPlayer::duration() const
537 return m_private->durationDouble();
540 double MediaPlayer::startTime() const
542 return m_private->startTimeDouble();
545 double MediaPlayer::initialTime() const
547 return m_private->initialTime();
550 double MediaPlayer::currentTime() const
552 return m_private->currentTimeDouble();
555 void MediaPlayer::seekWithTolerance(double time, double negativeTolerance, double positiveTolerance)
557 m_private->seekWithTolerance(time, negativeTolerance, positiveTolerance);
560 void MediaPlayer::seek(double time)
562 m_private->seekDouble(time);
565 bool MediaPlayer::paused() const
567 return m_private->paused();
570 bool MediaPlayer::seeking() const
572 return m_private->seeking();
575 bool MediaPlayer::supportsFullscreen() const
577 return m_private->supportsFullscreen();
580 bool MediaPlayer::supportsSave() const
582 return m_private->supportsSave();
585 bool MediaPlayer::supportsScanning() const
587 return m_private->supportsScanning();
590 bool MediaPlayer::requiresImmediateCompositing() const
592 return m_private->requiresImmediateCompositing();
595 IntSize MediaPlayer::naturalSize()
597 return m_private->naturalSize();
600 bool MediaPlayer::hasVideo() const
602 return m_private->hasVideo();
605 bool MediaPlayer::hasAudio() const
607 return m_private->hasAudio();
610 bool MediaPlayer::inMediaDocument()
614 Document* document = m_frameView->frame().document();
615 return document && document->isMediaDocument();
618 PlatformMedia MediaPlayer::platformMedia() const
620 return m_private->platformMedia();
623 PlatformLayer* MediaPlayer::platformLayer() const
625 return m_private->platformLayer();
629 void MediaPlayer::setVideoFullscreenLayer(PlatformLayer* layer)
631 m_private->setVideoFullscreenLayer(layer);
634 void MediaPlayer::setVideoFullscreenFrame(FloatRect frame)
636 m_private->setVideoFullscreenFrame(frame);
639 void MediaPlayer::setVideoFullscreenGravity(MediaPlayer::VideoGravity gravity)
641 m_private->setVideoFullscreenGravity(gravity);
645 MediaPlayer::NetworkState MediaPlayer::networkState()
647 return m_private->networkState();
650 MediaPlayer::ReadyState MediaPlayer::readyState()
652 return m_private->readyState();
655 double MediaPlayer::volume() const
660 void MediaPlayer::setVolume(double volume)
664 if (m_private->supportsMuting() || !m_muted)
665 m_private->setVolumeDouble(volume);
668 bool MediaPlayer::muted() const
673 void MediaPlayer::setMuted(bool muted)
677 if (m_private->supportsMuting())
678 m_private->setMuted(muted);
680 m_private->setVolume(muted ? 0 : m_volume);
683 bool MediaPlayer::hasClosedCaptions() const
685 return m_private->hasClosedCaptions();
688 void MediaPlayer::setClosedCaptionsVisible(bool closedCaptionsVisible)
690 m_private->setClosedCaptionsVisible(closedCaptionsVisible);
693 double MediaPlayer::rate() const
698 void MediaPlayer::setRate(double rate)
701 m_private->setRateDouble(rate);
704 bool MediaPlayer::preservesPitch() const
706 return m_preservesPitch;
709 void MediaPlayer::setPreservesPitch(bool preservesPitch)
711 m_preservesPitch = preservesPitch;
712 m_private->setPreservesPitch(preservesPitch);
715 std::unique_ptr<PlatformTimeRanges> MediaPlayer::buffered()
717 return m_private->buffered();
720 std::unique_ptr<PlatformTimeRanges> MediaPlayer::seekable()
722 return m_private->seekable();
725 double MediaPlayer::maxTimeSeekable()
727 return m_private->maxTimeSeekableDouble();
730 double MediaPlayer::minTimeSeekable()
732 return m_private->minTimeSeekable();
735 bool MediaPlayer::didLoadingProgress()
737 return m_private->didLoadingProgress();
740 void MediaPlayer::setSize(const IntSize& size)
743 m_private->setSize(size);
746 bool MediaPlayer::visible() const
751 void MediaPlayer::setVisible(bool b)
754 m_private->setVisible(b);
757 MediaPlayer::Preload MediaPlayer::preload() const
762 void MediaPlayer::setPreload(MediaPlayer::Preload preload)
765 m_private->setPreload(preload);
768 void MediaPlayer::paint(GraphicsContext* p, const IntRect& r)
770 m_private->paint(p, r);
773 void MediaPlayer::paintCurrentFrameInContext(GraphicsContext* p, const IntRect& r)
775 m_private->paintCurrentFrameInContext(p, r);
778 bool MediaPlayer::copyVideoTextureToPlatformTexture(GraphicsContext3D* context, Platform3DObject texture, GC3Dint level, GC3Denum type, GC3Denum internalFormat, bool premultiplyAlpha, bool flipY)
780 return m_private->copyVideoTextureToPlatformTexture(context, texture, level, type, internalFormat, premultiplyAlpha, flipY);
783 PassNativeImagePtr MediaPlayer::nativeImageForCurrentTime()
785 return m_private->nativeImageForCurrentTime();
788 MediaPlayer::SupportsType MediaPlayer::supportsType(const MediaEngineSupportParameters& parameters, const MediaPlayerSupportsTypeClient* client)
790 // 4.8.10.3 MIME types - The canPlayType(type) method must return the empty string if type is a type that the
791 // user agent knows it cannot render or is the type "application/octet-stream"
792 if (parameters.type == applicationOctetStream())
793 return IsNotSupported;
795 MediaPlayerFactory* engine = bestMediaEngineForSupportParameters(parameters);
797 return IsNotSupported;
800 // YouTube will ask if the HTMLMediaElement canPlayType video/webm, then
801 // video/x-flv, then finally video/mp4, and will then load a URL of the first type
802 // in that list which returns "probably". When Perian is installed,
803 // MediaPlayerPrivateQTKit claims to support both video/webm and video/x-flv, but
804 // due to a bug in Perian, loading media in these formats will sometimes fail on
805 // slow connections. <https://bugs.webkit.org/show_bug.cgi?id=86409>
806 if (client && client->mediaPlayerNeedsSiteSpecificHacks()) {
807 String host = client->mediaPlayerDocumentHost();
808 if ((host.endsWith(".youtube.com", false) || equalIgnoringCase("youtube.com", host))
809 && (parameters.type.startsWith("video/webm", false) || parameters.type.startsWith("video/x-flv", false)))
810 return IsNotSupported;
813 UNUSED_PARAM(client);
816 return engine->supportsTypeAndCodecs(parameters);
819 void MediaPlayer::getSupportedTypes(HashSet<String>& types)
821 Vector<MediaPlayerFactory*>& engines = installedMediaEngines();
822 if (engines.isEmpty())
825 unsigned count = engines.size();
826 for (unsigned ndx = 0; ndx < count; ndx++)
827 engines[ndx]->getSupportedTypes(types);
830 bool MediaPlayer::isAvailable()
832 return !installedMediaEngines().isEmpty();
835 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
836 void MediaPlayer::deliverNotification(MediaPlayerProxyNotificationType notification)
838 m_private->deliverNotification(notification);
841 void MediaPlayer::setMediaPlayerProxy(WebMediaPlayerProxy* proxy)
843 m_playerProxy = proxy;
844 m_private->setMediaPlayerProxy(proxy);
847 void MediaPlayer::setControls(bool controls)
849 m_private->setControls(controls);
853 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) || USE(NATIVE_FULLSCREEN_VIDEO)
854 void MediaPlayer::enterFullscreen()
856 m_private->enterFullscreen();
859 void MediaPlayer::exitFullscreen()
861 m_private->exitFullscreen();
865 #if ENABLE(IOS_AIRPLAY)
866 bool MediaPlayer::isCurrentPlaybackTargetWireless() const
868 return m_private->isCurrentPlaybackTargetWireless();
871 String MediaPlayer::wirelessPlaybackTargetName() const
873 return m_private->wirelessPlaybackTargetName();
876 MediaPlayer::WirelessPlaybackTargetType MediaPlayer::wirelessPlaybackTargetType() const
878 return m_private->wirelessPlaybackTargetType();
881 void MediaPlayer::showPlaybackTargetPicker()
883 m_private->showPlaybackTargetPicker();
886 bool MediaPlayer::hasWirelessPlaybackTargets() const
888 return m_private->hasWirelessPlaybackTargets();
891 bool MediaPlayer::wirelessVideoPlaybackDisabled() const
893 return m_private->wirelessVideoPlaybackDisabled();
896 void MediaPlayer::setWirelessVideoPlaybackDisabled(bool disabled)
898 m_private->setWirelessVideoPlaybackDisabled(disabled);
901 void MediaPlayer::setHasPlaybackTargetAvailabilityListeners(bool hasListeners)
903 m_private->setHasPlaybackTargetAvailabilityListeners(hasListeners);
906 void MediaPlayer::currentPlaybackTargetIsWirelessChanged()
908 if (m_mediaPlayerClient)
909 m_mediaPlayerClient->mediaPlayerCurrentPlaybackTargetIsWirelessChanged(this);
912 void MediaPlayer::playbackTargetAvailabilityChanged()
914 if (m_mediaPlayerClient)
915 m_mediaPlayerClient->mediaPlayerPlaybackTargetAvailabilityChanged(this);
919 #if USE(NATIVE_FULLSCREEN_VIDEO)
920 bool MediaPlayer::canEnterFullscreen() const
922 return m_private->canEnterFullscreen();
926 void MediaPlayer::acceleratedRenderingStateChanged()
928 m_private->acceleratedRenderingStateChanged();
931 bool MediaPlayer::supportsAcceleratedRendering() const
933 return m_private->supportsAcceleratedRendering();
936 bool MediaPlayer::shouldMaintainAspectRatio() const
938 return m_private->shouldMaintainAspectRatio();
941 void MediaPlayer::setShouldMaintainAspectRatio(bool maintainAspectRatio)
943 m_private->setShouldMaintainAspectRatio(maintainAspectRatio);
946 bool MediaPlayer::hasSingleSecurityOrigin() const
948 return m_private->hasSingleSecurityOrigin();
951 bool MediaPlayer::didPassCORSAccessCheck() const
953 return m_private->didPassCORSAccessCheck();
956 MediaPlayer::MovieLoadType MediaPlayer::movieLoadType() const
958 return m_private->movieLoadType();
961 double MediaPlayer::mediaTimeForTimeValue(double timeValue) const
963 return m_private->mediaTimeForTimeValueDouble(timeValue);
966 double MediaPlayer::maximumDurationToCacheMediaTime() const
968 return m_private->maximumDurationToCacheMediaTime();
971 unsigned MediaPlayer::decodedFrameCount() const
973 return m_private->decodedFrameCount();
976 unsigned MediaPlayer::droppedFrameCount() const
978 return m_private->droppedFrameCount();
981 unsigned MediaPlayer::audioDecodedByteCount() const
983 return m_private->audioDecodedByteCount();
986 unsigned MediaPlayer::videoDecodedByteCount() const
988 return m_private->videoDecodedByteCount();
991 void MediaPlayer::reloadTimerFired(Timer<MediaPlayer>&)
993 m_private->cancelLoad();
994 loadWithNextMediaEngine(m_currentMediaEngine);
997 void MediaPlayer::getSitesInMediaCache(Vector<String>& sites)
999 Vector<MediaPlayerFactory*>& engines = installedMediaEngines();
1000 unsigned size = engines.size();
1001 for (unsigned i = 0; i < size; i++) {
1002 if (!engines[i]->getSitesInMediaCache)
1004 Vector<String> engineSites;
1005 engines[i]->getSitesInMediaCache(engineSites);
1006 sites.appendVector(engineSites);
1010 void MediaPlayer::clearMediaCache()
1012 Vector<MediaPlayerFactory*>& engines = installedMediaEngines();
1013 unsigned size = engines.size();
1014 for (unsigned i = 0; i < size; i++) {
1015 if (engines[i]->clearMediaCache)
1016 engines[i]->clearMediaCache();
1020 void MediaPlayer::clearMediaCacheForSite(const String& site)
1022 Vector<MediaPlayerFactory*>& engines = installedMediaEngines();
1023 unsigned size = engines.size();
1024 for (unsigned i = 0; i < size; i++) {
1025 if (engines[i]->clearMediaCacheForSite)
1026 engines[i]->clearMediaCacheForSite(site);
1030 bool MediaPlayer::supportsKeySystem(const String& keySystem, const String& mimeType)
1032 for (auto& engine : installedMediaEngines()) {
1033 if (engine->supportsKeySystem && engine->supportsKeySystem(keySystem, mimeType))
1039 void MediaPlayer::setPrivateBrowsingMode(bool privateBrowsingMode)
1041 m_privateBrowsing = privateBrowsingMode;
1042 m_private->setPrivateBrowsingMode(m_privateBrowsing);
1046 void MediaPlayer::attributeChanged(const String& name, const String& value)
1048 m_private->attributeChanged(name, value);
1051 bool MediaPlayer::readyForPlayback() const
1053 return m_private->readyForPlayback();
1057 // Client callbacks.
1058 void MediaPlayer::networkStateChanged()
1060 // If more than one media engine is installed and this one failed before finding metadata,
1061 // let the next engine try.
1062 if (m_private->networkState() >= FormatError
1063 && m_private->readyState() < HaveMetadata
1064 && installedMediaEngines().size() > 1) {
1065 if (m_contentMIMEType.isEmpty() || nextBestMediaEngine(m_currentMediaEngine)) {
1066 m_reloadTimer.startOneShot(0);
1070 if (m_mediaPlayerClient)
1071 m_mediaPlayerClient->mediaPlayerNetworkStateChanged(this);
1074 void MediaPlayer::readyStateChanged()
1076 if (m_mediaPlayerClient)
1077 m_mediaPlayerClient->mediaPlayerReadyStateChanged(this);
1080 void MediaPlayer::volumeChanged(double newVolume)
1083 UNUSED_PARAM(newVolume);
1084 m_volume = m_private->volume();
1086 m_volume = newVolume;
1088 if (m_mediaPlayerClient)
1089 m_mediaPlayerClient->mediaPlayerVolumeChanged(this);
1092 void MediaPlayer::muteChanged(bool newMuted)
1095 if (m_mediaPlayerClient)
1096 m_mediaPlayerClient->mediaPlayerMuteChanged(this);
1099 void MediaPlayer::timeChanged()
1101 if (m_mediaPlayerClient)
1102 m_mediaPlayerClient->mediaPlayerTimeChanged(this);
1105 void MediaPlayer::sizeChanged()
1107 if (m_mediaPlayerClient)
1108 m_mediaPlayerClient->mediaPlayerSizeChanged(this);
1111 void MediaPlayer::repaint()
1113 if (m_mediaPlayerClient)
1114 m_mediaPlayerClient->mediaPlayerRepaint(this);
1117 void MediaPlayer::durationChanged()
1119 if (m_mediaPlayerClient)
1120 m_mediaPlayerClient->mediaPlayerDurationChanged(this);
1123 void MediaPlayer::rateChanged()
1125 if (m_mediaPlayerClient)
1126 m_mediaPlayerClient->mediaPlayerRateChanged(this);
1129 void MediaPlayer::playbackStateChanged()
1131 if (m_mediaPlayerClient)
1132 m_mediaPlayerClient->mediaPlayerPlaybackStateChanged(this);
1135 void MediaPlayer::firstVideoFrameAvailable()
1137 if (m_mediaPlayerClient)
1138 m_mediaPlayerClient->mediaPlayerFirstVideoFrameAvailable(this);
1141 void MediaPlayer::characteristicChanged()
1143 if (m_mediaPlayerClient)
1144 m_mediaPlayerClient->mediaPlayerCharacteristicChanged(this);
1147 #if ENABLE(WEB_AUDIO)
1148 AudioSourceProvider* MediaPlayer::audioSourceProvider()
1150 return m_private->audioSourceProvider();
1154 #if ENABLE(ENCRYPTED_MEDIA)
1155 void MediaPlayer::keyAdded(const String& keySystem, const String& sessionId)
1157 if (m_mediaPlayerClient)
1158 m_mediaPlayerClient->mediaPlayerKeyAdded(this, keySystem, sessionId);
1161 void MediaPlayer::keyError(const String& keySystem, const String& sessionId, MediaPlayerClient::MediaKeyErrorCode errorCode, unsigned short systemCode)
1163 if (m_mediaPlayerClient)
1164 m_mediaPlayerClient->mediaPlayerKeyError(this, keySystem, sessionId, errorCode, systemCode);
1167 void MediaPlayer::keyMessage(const String& keySystem, const String& sessionId, const unsigned char* message, unsigned messageLength, const URL& defaultURL)
1169 if (m_mediaPlayerClient)
1170 m_mediaPlayerClient->mediaPlayerKeyMessage(this, keySystem, sessionId, message, messageLength, defaultURL);
1173 bool MediaPlayer::keyNeeded(const String& keySystem, const String& sessionId, const unsigned char* initData, unsigned initDataLength)
1175 if (m_mediaPlayerClient)
1176 return m_mediaPlayerClient->mediaPlayerKeyNeeded(this, keySystem, sessionId, initData, initDataLength);
1181 #if ENABLE(ENCRYPTED_MEDIA_V2)
1182 bool MediaPlayer::keyNeeded(Uint8Array* initData)
1184 if (m_mediaPlayerClient)
1185 return m_mediaPlayerClient->mediaPlayerKeyNeeded(this, initData);
1190 String MediaPlayer::referrer() const
1192 if (!m_mediaPlayerClient)
1195 return m_mediaPlayerClient->mediaPlayerReferrer();
1198 String MediaPlayer::userAgent() const
1200 if (!m_mediaPlayerClient)
1203 return m_mediaPlayerClient->mediaPlayerUserAgent();
1206 String MediaPlayer::engineDescription() const
1211 return m_private->engineDescription();
1214 #if PLATFORM(WIN) && USE(AVFOUNDATION)
1215 GraphicsDeviceAdapter* MediaPlayer::graphicsDeviceAdapter() const
1217 if (!m_mediaPlayerClient)
1220 return m_mediaPlayerClient->mediaPlayerGraphicsDeviceAdapter(this);
1224 CachedResourceLoader* MediaPlayer::cachedResourceLoader()
1226 if (!m_mediaPlayerClient)
1229 return m_mediaPlayerClient->mediaPlayerCachedResourceLoader();
1232 #if ENABLE(VIDEO_TRACK)
1233 void MediaPlayer::addAudioTrack(PassRefPtr<AudioTrackPrivate> track)
1235 if (!m_mediaPlayerClient)
1238 m_mediaPlayerClient->mediaPlayerDidAddAudioTrack(track);
1241 void MediaPlayer::removeAudioTrack(PassRefPtr<AudioTrackPrivate> track)
1243 if (!m_mediaPlayerClient)
1246 m_mediaPlayerClient->mediaPlayerDidRemoveAudioTrack(track);
1249 void MediaPlayer::addTextTrack(PassRefPtr<InbandTextTrackPrivate> track)
1251 if (!m_mediaPlayerClient)
1254 m_mediaPlayerClient->mediaPlayerDidAddTextTrack(track);
1257 void MediaPlayer::removeTextTrack(PassRefPtr<InbandTextTrackPrivate> track)
1259 if (!m_mediaPlayerClient)
1262 m_mediaPlayerClient->mediaPlayerDidRemoveTextTrack(track);
1265 void MediaPlayer::addVideoTrack(PassRefPtr<VideoTrackPrivate> track)
1267 if (!m_mediaPlayerClient)
1270 m_mediaPlayerClient->mediaPlayerDidAddVideoTrack(track);
1273 void MediaPlayer::removeVideoTrack(PassRefPtr<VideoTrackPrivate> track)
1275 if (!m_mediaPlayerClient)
1278 m_mediaPlayerClient->mediaPlayerDidRemoveVideoTrack(track);
1281 bool MediaPlayer::requiresTextTrackRepresentation() const
1283 return m_private->requiresTextTrackRepresentation();
1286 void MediaPlayer::setTextTrackRepresentation(TextTrackRepresentation* representation)
1288 m_private->setTextTrackRepresentation(representation);
1291 #if ENABLE(AVF_CAPTIONS)
1292 void MediaPlayer::notifyTrackModeChanged()
1295 m_private->notifyTrackModeChanged();
1298 Vector<RefPtr<PlatformTextTrack>> MediaPlayer::outOfBandTrackSources()
1300 if (!m_mediaPlayerClient)
1301 return Vector<RefPtr<PlatformTextTrack>> ();
1303 return m_mediaPlayerClient->outOfBandTrackSources();
1307 #endif // ENABLE(VIDEO_TRACK)
1309 #if USE(PLATFORM_TEXT_TRACK_MENU)
1310 bool MediaPlayer::implementsTextTrackControls() const
1312 return m_private->implementsTextTrackControls();
1315 PassRefPtr<PlatformTextTrackMenuInterface> MediaPlayer::textTrackMenu()
1317 return m_private->textTrackMenu();
1319 #endif // USE(PLATFORM_TEXT_TRACK_MENU)
1321 void MediaPlayer::resetMediaEngines()
1323 installedMediaEngines(ResetEngines);
1327 void MediaPlayer::simulateAudioInterruption()
1332 m_private->simulateAudioInterruption();
1336 String MediaPlayer::languageOfPrimaryAudioTrack() const
1339 return emptyString();
1341 return m_private->languageOfPrimaryAudioTrack();
1344 size_t MediaPlayer::extraMemoryCost() const
1349 return m_private->extraMemoryCost();
1352 unsigned long long MediaPlayer::fileSize() const
1357 return m_private->fileSize();
1360 #if ENABLE(MEDIA_SOURCE)
1361 unsigned long MediaPlayer::totalVideoFrames()
1366 return m_private->totalVideoFrames();
1369 unsigned long MediaPlayer::droppedVideoFrames()
1374 return m_private->droppedVideoFrames();
1377 unsigned long MediaPlayer::corruptedVideoFrames()
1382 return m_private->corruptedVideoFrames();
1385 double MediaPlayer::totalFrameDelay()
1390 return m_private->totalFrameDelay();
1394 bool MediaPlayer::shouldWaitForResponseToAuthenticationChallenge(const AuthenticationChallenge& challenge)
1396 if (!m_mediaPlayerClient)
1399 return m_mediaPlayerClient->mediaPlayerShouldWaitForResponseToAuthenticationChallenge(challenge);
1402 void MediaPlayer::handlePlaybackCommand(MediaSession::RemoteControlCommandType command)
1404 if (!m_mediaPlayerClient)
1407 m_mediaPlayerClient->mediaPlayerHandlePlaybackCommand(command);
1410 void MediaPlayerFactorySupport::callRegisterMediaEngine(MediaEngineRegister registerMediaEngine)
1412 registerMediaEngine(addMediaEngine);
1415 bool MediaPlayer::doesHaveAttribute(const AtomicString& attribute, AtomicString* value) const
1417 if (!m_mediaPlayerClient)
1420 return m_mediaPlayerClient->doesHaveAttribute(attribute, value);