[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