[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-10851-g50815da

eric.carlson at apple.com eric.carlson at apple.com
Wed Dec 22 18:40:07 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 74267d16e1e5494eba234d1f825f70242ea4b712
Author: eric.carlson at apple.com <eric.carlson at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Dec 15 17:27:20 2010 +0000

    2010-12-15  Eric Carlson  <eric.carlson at apple.com>
    
            Reviewed by Darin Adler.
    
            MediaPlayer should try all installed media engines
            https://bugs.webkit.org/show_bug.cgi?id=50209
    
            * platform/graphics/MediaPlayer.cpp:
            (WebCore::bestMediaEngineForTypeAndCodecs): Rename from chooseBestEngineForTypeAndCodecs. Take optional
            parameter for current engine.
            (WebCore::nextMediaEngine): New, return the next media engine in the list.
            (WebCore::MediaPlayer::MediaPlayer): Initialize reload timer.
            (WebCore::MediaPlayer::load): Store url, mime type, and codecs parameter in member variables.
            (WebCore::MediaPlayer::loadWithNextMediaEngine): New, initiate loading with the next media engine.
            (WebCore::MediaPlayer::supportsType): Make contentType parameter const.
            (WebCore::MediaPlayer::reloadTimerFired): New, call loadWithNextMediaEngine.
            (WebCore::MediaPlayer::networkStateChanged): If network state signals a failure and the file's
            metadata has not loaded, give the next installed engine a try.
            * platform/graphics/MediaPlayer.h:
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@74118 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index db26d03..1dc3732 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,23 @@
+2010-12-15  Eric Carlson  <eric.carlson at apple.com>
+
+        Reviewed by Darin Adler.
+
+        MediaPlayer should try all installed media engines
+        https://bugs.webkit.org/show_bug.cgi?id=50209
+
+        * platform/graphics/MediaPlayer.cpp:
+        (WebCore::bestMediaEngineForTypeAndCodecs): Rename from chooseBestEngineForTypeAndCodecs. Take optional
+        parameter for current engine. 
+        (WebCore::nextMediaEngine): New, return the next media engine in the list.
+        (WebCore::MediaPlayer::MediaPlayer): Initialize reload timer.
+        (WebCore::MediaPlayer::load): Store url, mime type, and codecs parameter in member variables.
+        (WebCore::MediaPlayer::loadWithNextMediaEngine): New, initiate loading with the next media engine.
+        (WebCore::MediaPlayer::supportsType): Make contentType parameter const.
+        (WebCore::MediaPlayer::reloadTimerFired): New, call loadWithNextMediaEngine.
+        (WebCore::MediaPlayer::networkStateChanged): If network state signals a failure and the file's
+        metadata has not loaded, give the next installed engine a try.
+        * platform/graphics/MediaPlayer.h:
+
 2010-12-15  Amruth Raj  <amruthraj at motorola.com> and Ravi Kasibhatla  <ravi.kasibhatla at motorola.com>
 
         Reviewed by Martin Robinson.
diff --git a/WebCore/platform/graphics/MediaPlayer.cpp b/WebCore/platform/graphics/MediaPlayer.cpp
index 235c1fd..2baee95 100644
--- a/WebCore/platform/graphics/MediaPlayer.cpp
+++ b/WebCore/platform/graphics/MediaPlayer.cpp
@@ -161,7 +161,8 @@ struct MediaPlayerFactory : Noncopyable {
 };
 
 static void addMediaEngine(CreateMediaEnginePlayer, MediaEngineSupportedTypes, MediaEngineSupportsType);
-static MediaPlayerFactory* chooseBestEngineForTypeAndCodecs(const String& type, const String& codecs);
+static MediaPlayerFactory* bestMediaEngineForTypeAndCodecs(const String& type, const String& codecs, MediaPlayerFactory* current = 0);
+static MediaPlayerFactory* nextMediaEngine(MediaPlayerFactory* current);
 
 static Vector<MediaPlayerFactory*>& installedMediaEngines() 
 {
@@ -209,10 +210,12 @@ static const AtomicString& codecs()
     return codecs;
 }
 
-static MediaPlayerFactory* chooseBestEngineForTypeAndCodecs(const String& type, const String& codecs)
+static MediaPlayerFactory* bestMediaEngineForTypeAndCodecs(const String& type, const String& codecs, MediaPlayerFactory* current)
 {
-    Vector<MediaPlayerFactory*>& engines = installedMediaEngines();
+    if (type.isEmpty())
+        return 0;
 
+    Vector<MediaPlayerFactory*>& engines = installedMediaEngines();
     if (engines.isEmpty())
         return 0;
 
@@ -226,9 +229,13 @@ static MediaPlayerFactory* chooseBestEngineForTypeAndCodecs(const String& type,
     
     MediaPlayerFactory* engine = 0;
     MediaPlayer::SupportsType supported = MediaPlayer::IsNotSupported;
-
     unsigned count = engines.size();
     for (unsigned ndx = 0; ndx < count; ndx++) {
+        if (current) {
+            if (current == engines[ndx])
+                current = 0;
+            continue;
+        }
         MediaPlayer::SupportsType engineSupport = engines[ndx]->supportsTypeAndCodecs(type, codecs);
         if (engineSupport > supported) {
             supported = engineSupport;
@@ -239,10 +246,27 @@ static MediaPlayerFactory* chooseBestEngineForTypeAndCodecs(const String& type,
     return engine;
 }
 
+static MediaPlayerFactory* nextMediaEngine(MediaPlayerFactory* current)
+{
+    Vector<MediaPlayerFactory*>& engines = installedMediaEngines();
+    if (engines.isEmpty())
+        return 0;
+
+    if (!current) 
+        return engines.first();
+
+    size_t currentIndex = engines.find(current);
+    if (currentIndex == WTF::notFound || currentIndex == engines.size()) 
+        return 0;
+
+    return engines[currentIndex + 1];
+}
+
 // media player
 
 MediaPlayer::MediaPlayer(MediaPlayerClient* client)
     : m_mediaPlayerClient(client)
+    , m_reloadTimer(this, &MediaPlayer::reloadTimerFired)
     , m_private(createNullMediaPlayer(this))
     , m_currentMediaEngine(0)
     , m_frameView(0)
@@ -289,15 +313,23 @@ void MediaPlayer::load(const String& url, const ContentType& contentType)
         }
     }
 
-    MediaPlayerFactory* engine = 0;
-    if (!type.isEmpty())
-        engine = chooseBestEngineForTypeAndCodecs(type, typeCodecs);
+    m_url = url;
+    m_contentMIMEType = type;
+    m_contentTypeCodecs = typeCodecs;
+    loadWithNextMediaEngine(0);
+}
 
-    // If we didn't find an engine and no MIME type is specified, just use the first engine.
-    if (!engine && type.isEmpty() && !installedMediaEngines().isEmpty())
-        engine = installedMediaEngines()[0];
+void MediaPlayer::loadWithNextMediaEngine(MediaPlayerFactory* current)
+{
+    MediaPlayerFactory* engine;
+
+    // If no MIME type is specified, just use the next engine.
+    if (m_contentMIMEType.isEmpty())
+        engine = nextMediaEngine(current);
+    else
+        engine = bestMediaEngineForTypeAndCodecs(m_contentMIMEType, m_contentTypeCodecs, current);
     
-    // Don't delete and recreate the player unless it comes from a different engine
+    // Don't delete and recreate the player unless it comes from a different engine.
     if (!engine) {
         m_currentMediaEngine = engine;
         m_private.clear();
@@ -315,7 +347,7 @@ void MediaPlayer::load(const String& url, const ContentType& contentType)
     }
 
     if (m_private)
-        m_private->load(url);
+        m_private->load(m_url);
     else {
         m_private.set(createNullMediaPlayer(this));
         if (m_mediaPlayerClient)
@@ -561,7 +593,7 @@ void MediaPlayer::paintCurrentFrameInContext(GraphicsContext* p, const IntRect&
     m_private->paintCurrentFrameInContext(p, r);
 }
 
-MediaPlayer::SupportsType MediaPlayer::supportsType(ContentType contentType)
+MediaPlayer::SupportsType MediaPlayer::supportsType(const ContentType& contentType)
 {
     String type = contentType.type().lower();
     String typeCodecs = contentType.parameter(codecs());
@@ -571,7 +603,7 @@ MediaPlayer::SupportsType MediaPlayer::supportsType(ContentType contentType)
     if (type == applicationOctetStream())
         return IsNotSupported;
 
-    MediaPlayerFactory* engine = chooseBestEngineForTypeAndCodecs(type, typeCodecs);
+    MediaPlayerFactory* engine = bestMediaEngineForTypeAndCodecs(type, typeCodecs);
     if (!engine)
         return IsNotSupported;
 
@@ -654,9 +686,25 @@ double MediaPlayer::maximumDurationToCacheMediaTime() const
     return m_private->maximumDurationToCacheMediaTime();
 }
 
+void MediaPlayer::reloadTimerFired(Timer<MediaPlayer>*)
+{
+    m_private->cancelLoad();
+    loadWithNextMediaEngine(m_currentMediaEngine);
+}
+
+
 // Client callbacks.
 void MediaPlayer::networkStateChanged()
 {
+    // If more than one media engine is installed and this one failed before finding metadata,
+    // let the next engine try.
+    if (m_private->networkState() >= FormatError
+        && m_private->readyState() < HaveMetadata 
+        && installedMediaEngines().size() > 1 
+        && bestMediaEngineForTypeAndCodecs(m_contentMIMEType, m_contentTypeCodecs, m_currentMediaEngine)) {
+            m_reloadTimer.startOneShot(0);
+            return;
+    }
     if (m_mediaPlayerClient)
         m_mediaPlayerClient->mediaPlayerNetworkStateChanged(this);
 }
diff --git a/WebCore/platform/graphics/MediaPlayer.h b/WebCore/platform/graphics/MediaPlayer.h
index a506a6e..1d1b86e 100644
--- a/WebCore/platform/graphics/MediaPlayer.h
+++ b/WebCore/platform/graphics/MediaPlayer.h
@@ -91,6 +91,7 @@ class GraphicsContext;
 class IntRect;
 class IntSize;
 class MediaPlayer;
+class MediaPlayerFactory;
 class TimeRanges;
 
 class MediaPlayerClient {
@@ -159,7 +160,7 @@ public:
 
     // media engine support
     enum SupportsType { IsNotSupported, IsSupported, MayBeSupported };
-    static MediaPlayer::SupportsType supportsType(ContentType contentType);
+    static MediaPlayer::SupportsType supportsType(const ContentType&);
     static void getSupportedTypes(HashSet<String>&);
     static bool isAvailable();
 
@@ -181,7 +182,7 @@ public:
     IntSize size() const { return m_size; }
     void setSize(const IntSize& size);
     
-    void load(const String& url, const ContentType& contentType);
+    void load(const String& url, const ContentType&);
     void cancelLoad();
     
     bool visible() const;
@@ -282,12 +283,18 @@ public:
 
 private:
     MediaPlayer(MediaPlayerClient*);
+    void loadWithNextMediaEngine(MediaPlayerFactory*);
+    void reloadTimerFired(Timer<MediaPlayer>*);
 
     static void initializeMediaEngines();
 
     MediaPlayerClient* m_mediaPlayerClient;
+    Timer<MediaPlayer> m_reloadTimer;
     OwnPtr<MediaPlayerPrivateInterface*> m_private;
-    void* m_currentMediaEngine;
+    MediaPlayerFactory* m_currentMediaEngine;
+    String m_url;
+    String m_contentMIMEType;
+    String m_contentTypeCodecs;
     FrameView* m_frameView;
     IntSize m_size;
     Preload m_preload;

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list