[MSE] Add MediaSource compatable loading functions to MediaPlayer
authorjer.noble@apple.com <jer.noble@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 30 Oct 2013 18:18:28 +0000 (18:18 +0000)
committerjer.noble@apple.com <jer.noble@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 30 Oct 2013 18:18:28 +0000 (18:18 +0000)
https://bugs.webkit.org/show_bug.cgi?id=123353

Reviewed by Eric Carlson.

Add methods to MediaPlayer to allow it to select the correct MediaPlayerFactory
when attempting to load a MediaSource URL.

* Modules/mediasource/MediaSource.cpp:
(WebCore::MediaSource::addSourceBuffer):
(WebCore::MediaSource::isTypeSupported):
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::loadResource):
(WebCore::HTMLMediaElement::canPlayType):
(WebCore::HTMLMediaElement::selectNextSourceChild):
* platform/graphics/MediaPlayer.cpp:
(WebCore::MediaPlayer::load):
(WebCore::MediaPlayer::supportsType):
* platform/graphics/MediaPlayer.h:
* dom/DOMImplementation.cpp:
(WebCore::DOMImplementation::createDocument):

Remove the isSupportedMediaSourceMIMEType() method:
* platform/MIMETypeRegistry.h:
* platform/efl/MIMETypeRegistryEfl.cpp:
* platform/mac/MIMETypeRegistryMac.mm:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@158291 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/Modules/mediasource/MediaSource.cpp
Source/WebCore/dom/DOMImplementation.cpp
Source/WebCore/html/HTMLMediaElement.cpp
Source/WebCore/platform/MIMETypeRegistry.h
Source/WebCore/platform/efl/MIMETypeRegistryEfl.cpp
Source/WebCore/platform/graphics/MediaPlayer.cpp
Source/WebCore/platform/graphics/MediaPlayer.h
Source/WebCore/platform/mac/MIMETypeRegistryMac.mm

index 55cea8212fb26b5798e47312a846c6d390368ce8..db4483c27da26a3fd6bf77b8a95669a748c82c3f 100644 (file)
@@ -1,3 +1,33 @@
+2013-10-30  Jer Noble  <jer.noble@apple.com>
+
+        [MSE] Add MediaSource compatable loading functions to MediaPlayer
+        https://bugs.webkit.org/show_bug.cgi?id=123353
+
+        Reviewed by Eric Carlson.
+
+        Add methods to MediaPlayer to allow it to select the correct MediaPlayerFactory
+        when attempting to load a MediaSource URL.
+
+        * Modules/mediasource/MediaSource.cpp:
+        (WebCore::MediaSource::addSourceBuffer):
+        (WebCore::MediaSource::isTypeSupported):
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::loadResource):
+        (WebCore::HTMLMediaElement::canPlayType):
+        (WebCore::HTMLMediaElement::selectNextSourceChild):
+        * platform/graphics/MediaPlayer.cpp:
+        (WebCore::MediaPlayer::load):
+        (WebCore::MediaPlayer::supportsType):
+        * platform/graphics/MediaPlayer.h:
+        * dom/DOMImplementation.cpp:
+        (WebCore::DOMImplementation::createDocument):
+
+        Remove the isSupportedMediaSourceMIMEType() method:
+        * platform/MIMETypeRegistry.h:
+        * platform/efl/MIMETypeRegistryEfl.cpp:
+        * platform/mac/MIMETypeRegistryMac.mm:
+
+
 2013-10-30  Brady Eidson  <beidson@apple.com>
 
         IDBCursorBackendLevelDB should be made cross-platform
index 162406c03356a418b1548471a93e591928197661..f21b263ed90c0a3c48f9cb817351925315923699 100644 (file)
@@ -38,6 +38,7 @@
 #include "GenericEventQueue.h"
 #include "Logging.h"
 #include "MIMETypeRegistry.h"
+#include "MediaPlayer.h"
 #include "MediaSourceRegistry.h"
 #include "SourceBufferPrivate.h"
 #include "TimeRanges.h"
@@ -95,7 +96,6 @@ SourceBuffer* MediaSource::addSourceBuffer(const String& type, ExceptionCode& ec
 
     // 5. Create a new SourceBuffer object and associated resources.
     ContentType contentType(type);
-    Vector<String> codecs = contentType.codecs();
     RefPtr<SourceBufferPrivate> sourceBufferPrivate = createSourceBufferPrivate(contentType, ec);
 
     if (!sourceBufferPrivate) {
@@ -204,7 +204,11 @@ bool MediaSource::isTypeSupported(const String& type)
     // 4. If type contains at a codec that the MediaSource does not support, then return false.
     // 5. If the MediaSource does not support the specified combination of media type, media subtype, and codecs then return false.
     // 6. Return true.
-    return MIMETypeRegistry::isSupportedMediaSourceMIMEType(contentType.type(), codecs);
+    MediaEngineSupportParameters parameters = { };
+    parameters.type = contentType.type();
+    parameters.codecs = codecs;
+    parameters.isMediaSource = true;
+    return MediaPlayer::supportsType(parameters, 0) != MediaPlayer::IsNotSupported;
 }
 
 EventTargetInterface MediaSource::eventTargetInterface() const
index 301b502332c251682e8aecad2dab6117acc1c7a2..bb2fec0ce98f2342fdb8dba5fc046c758f3d8408 100644 (file)
@@ -356,7 +356,10 @@ PassRefPtr<Document> DOMImplementation::createDocument(const String& type, Frame
      // Check to see if the type can be played by our MediaPlayer, if so create a MediaDocument
     // Key system is not applicable here.
     DOMImplementationSupportsTypeClient client(frame && frame->settings().needsSiteSpecificQuirks(), url.host());
-    if (MediaPlayer::supportsType(ContentType(type), String(), url, &client))
+    MediaEngineSupportParameters parameters = { };
+    parameters.type = type;
+    parameters.url = url;
+    if (MediaPlayer::supportsType(parameters, &client))
          return MediaDocument::create(frame, url);
 #endif
 
index d754de72e5e7db04a7062b090dd82803bd7dbb1b..6c5c53cc81f0e2538bb6ca07d1fec005f67f441d 100644 (file)
@@ -762,7 +762,15 @@ HTMLMediaElement::NetworkState HTMLMediaElement::networkState() const
 
 String HTMLMediaElement::canPlayType(const String& mimeType, const String& keySystem, const URL& url) const
 {
-    MediaPlayer::SupportsType support = MediaPlayer::supportsType(ContentType(mimeType), keySystem, url, this);
+    MediaEngineSupportParameters parameters = { };
+    ContentType contentType(mimeType);
+    parameters.type = contentType.type();
+    parameters.codecs = contentType.parameter(ASCIILiteral("codecs"));
+    parameters.url = url;
+#if ENABLE(ENCRYPTED_MEDIA)
+    parameters.keySystem = keySystem;
+#endif
+    MediaPlayer::SupportsType support = MediaPlayer::supportsType(parameters, this);
     String canPlay;
 
     // 4.8.10.3
@@ -1114,7 +1122,7 @@ void HTMLMediaElement::loadResource(const URL& initialURL, ContentType& contentT
 
     if (m_mediaSource) {
         if (m_mediaSource->attachToElement())
-            m_player->load(url, m_mediaSource);
+            m_player->load(url, contentType, m_mediaSource);
         else {
             // Forget our reference to the MediaSource, so we leave it alone
             // while processing remainder of load failure.
@@ -3521,7 +3529,15 @@ URL HTMLMediaElement::selectNextSourceChild(ContentType* contentType, String* ke
             if (shouldLog)
                 LOG(Media, "HTMLMediaElement::selectNextSourceChild - 'type' is '%s' - key system is '%s'", type.utf8().data(), system.utf8().data());
 #endif
-            if (!MediaPlayer::supportsType(ContentType(type), system, mediaURL, this))
+            MediaEngineSupportParameters parameters = { };
+            ContentType contentType(type);
+            parameters.type = contentType.type();
+            parameters.codecs = contentType.parameter(ASCIILiteral("codecs"));
+            parameters.url = mediaURL;
+#if ENABLE(ENCRYPTED_MEDIA)
+            parameters.keySystem = system;
+#endif
+            if (!MediaPlayer::supportsType(parameters, this))
                 goto check_again;
         }
 
index ecc766cc471d5ba184b54c044bc896973ed24014..f720f586fc9a944b46febd5f48f31e6eb349f0de 100644 (file)
@@ -67,11 +67,6 @@ public:
     // Check to see if a mime type is suitable for being loaded using <video> and <audio>
     static bool isSupportedMediaMIMEType(const String& mimeType); 
 
-#if ENABLE(MEDIA_SOURCE)
-    // Check to see if the mime type and codecs are supported by the MediaSource implementation.
-    static bool isSupportedMediaSourceMIMEType(const String& mimeType, const String& codecs);
-#endif
-
     // Check to see if the mime type is not suitable for being loaded as a text
     // document in a frame. Only valid for mime types begining with "text/".
     static bool isUnsupportedTextMIMEType(const String& mimeType);
index d7e0b0c44f8aea3ab1fa2c3fd497140e5e2c8f29..4ae81815f34631cbe0f4ea5206d46eba162c094e 100644 (file)
@@ -96,12 +96,4 @@ bool MIMETypeRegistry::isApplicationPluginMIMEType(const String&)
     return false;
 }
 
-#if ENABLE(MEDIA_SOURCE)
-bool MIMETypeRegistry::isSupportedMediaSourceMIMEType(const String&, const String&)
-{
-    notImplemented();
-    return false;
-}
-#endif
-
 }
index 5fce7fcc936e59a50a7830161461f1dbbcb31bf7..fd32ff38b0ab8a9f13c7c281de0252e2a2d20688 100644 (file)
@@ -379,11 +379,11 @@ bool MediaPlayer::load(const URL& url, const ContentType& contentType, const Str
 }
 
 #if ENABLE(MEDIA_SOURCE)
-bool MediaPlayer::load(const URL& url, PassRefPtr<HTMLMediaSource> mediaSource)
+bool MediaPlayer::load(const URL& url, const ContentType& contentType, PassRefPtr<HTMLMediaSource> mediaSource)
 {
     m_mediaSource = mediaSource;
-    m_contentMIMEType = "";
-    m_contentTypeCodecs = "";
+    m_contentMIMEType = contentType.type().lower();
+    m_contentTypeCodecs = contentType.parameter(codecs());
     m_url = url;
     m_keySystem = "";
     m_contentMIMETypeWasInferredFromExtension = false;
@@ -741,23 +741,8 @@ bool MediaPlayer::copyVideoTextureToPlatformTexture(GraphicsContext3D* context,
     return m_private->copyVideoTextureToPlatformTexture(context, texture, level, type, internalFormat, premultiplyAlpha, flipY);
 }
 
-MediaPlayer::SupportsType MediaPlayer::supportsType(const ContentType& contentType, const String& keySystem, const URL& url, const MediaPlayerSupportsTypeClient* client)
+MediaPlayer::SupportsType MediaPlayer::supportsType(const MediaEngineSupportParameters& parameters, const MediaPlayerSupportsTypeClient* client)
 {
-    MediaEngineSupportParameters parameters;
-    parameters.type = contentType.type().lower();
-    // The codecs string is not lower-cased because MP4 values are case sensitive
-    // per http://tools.ietf.org/html/rfc4281#page-7.
-    parameters.codecs = contentType.parameter(codecs());
-    parameters.url = url;
-#if ENABLE(ENCRYPTED_MEDIA)
-    parameters.keySystem = keySystem.lower();
-#else
-    UNUSED_PARAM(keySystem);
-#endif
-#if ENABLE(MEDIA_SOURCE)
-    parameters.isMediaSource = false;
-#endif
-
     // 4.8.10.3 MIME types - The canPlayType(type) method must return the empty string if type is a type that the 
     // user agent knows it cannot render or is the type "application/octet-stream"
     if (parameters.type == applicationOctetStream())
@@ -777,7 +762,7 @@ MediaPlayer::SupportsType MediaPlayer::supportsType(const ContentType& contentTy
     if (client && client->mediaPlayerNeedsSiteSpecificHacks()) {
         String host = client->mediaPlayerDocumentHost();
         if ((host.endsWith(".youtube.com", false) || equalIgnoringCase("youtube.com", host))
-            && (contentType.type().startsWith("video/webm", false) || contentType.type().startsWith("video/x-flv", false)))
+            && (parameters.type.startsWith("video/webm", false) || parameters.type.startsWith("video/x-flv", false)))
             return IsNotSupported;
     }
 #else
index 5faf9dc5a520e85f695baf4c90300eb366b0de0d..e4257d537c9dc57075a2007c2bd3c9cd961dd3f8 100644 (file)
@@ -102,6 +102,18 @@ struct PlatformMedia {
     } media;
 };
 
+struct MediaEngineSupportParameters {
+    String type;
+    String codecs;
+    URL url;
+#if ENABLE(ENCRYPTED_MEDIA)
+    String keySystem;
+#endif
+#if ENABLE(MEDIA_SOURCE)
+    bool isMediaSource;
+#endif
+};
+
 extern const PlatformMedia NoPlatformMedia;
 
 class CachedResourceLoader;
@@ -253,7 +265,7 @@ public:
 
     // Media engine support.
     enum SupportsType { IsNotSupported, IsSupported, MayBeSupported };
-    static MediaPlayer::SupportsType supportsType(const ContentType&, const String& keySystem, const URL&, const MediaPlayerSupportsTypeClient*);
+    static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&, const MediaPlayerSupportsTypeClient*);
     static void getSupportedTypes(HashSet<String>&);
     static bool isAvailable();
     static void getSitesInMediaCache(Vector<String>&);
@@ -282,7 +294,7 @@ public:
 
     bool load(const URL&, const ContentType&, const String& keySystem);
 #if ENABLE(MEDIA_SOURCE)
-    bool load(const URL&, PassRefPtr<HTMLMediaSource>);
+    bool load(const URL&, const ContentType&, PassRefPtr<HTMLMediaSource>);
 #endif
     void cancelLoad();
 
@@ -524,18 +536,6 @@ private:
 #endif
 };
 
-struct MediaEngineSupportParameters {
-    String type;
-    String codecs;
-    URL url;
-#if ENABLE(ENCRYPTED_MEDIA)
-    String keySystem;
-#endif
-#if ENABLE(MEDIA_SOURCE)
-    bool isMediaSource;
-#endif
-};
-
 typedef PassOwnPtr<MediaPlayerPrivateInterface> (*CreateMediaEnginePlayer)(MediaPlayer*);
 typedef void (*MediaEngineSupportedTypes)(HashSet<String>& types);
 typedef MediaPlayer::SupportsType (*MediaEngineSupportsType)(const MediaEngineSupportParameters& parameters);
index 8836640503c8fd4c11ead16b9d94550621810d83..d22e2b661981c008837dfbc2c9a5326006b2b4b8 100644 (file)
@@ -73,11 +73,4 @@ bool MIMETypeRegistry::isApplicationPluginMIMEType(const String& MIMEType)
     return false;
 }
 
-#if ENABLE(MEDIA_SOURCE)
-bool MIMETypeRegistry::isSupportedMediaSourceMIMEType(const String&, const String&)
-{
-    return false;
-}
-#endif
-
 }