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

philn at webkit.org philn at webkit.org
Wed Dec 22 17:57:39 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 5615320fd18c4e9fa47a7778b5620b060fe2c7ad
Author: philn at webkit.org <philn at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri Dec 3 11:06:08 2010 +0000

    2010-12-02  Philippe Normand  <pnormand at igalia.com>
    
            Reviewed by Martin Robinson.
    
            [GStreamer] hasVideo/Audio return false until the pipeline reaches PAUSED
            https://bugs.webkit.org/show_bug.cgi?id=50382
    
            Go to PAUSED even if preload is deactivated. In that case don't
            process the GStreamer state changes until commitLoad() has been
            called. This patch also fixes hasVideo and hasAudio methods,
            making them reactive to the playbin2 audio/video tags-changed
            signals.
    
            Test: media/controls-without-preload.html
    
            * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
            (WebCore::mediaPlayerPrivateMessageCallback):
            (WebCore::mediaPlayerPrivateVideoTagsChangedCallback):
            (WebCore::mediaPlayerPrivateAudioTagsChangedCallback):
            (WebCore::mediaPlayerPrivateAudioTagsChangeTimeoutCallback):
            (WebCore::mediaPlayerPrivateVideoTagsChangeTimeoutCallback):
            (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer):
            (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer):
            (WebCore::MediaPlayerPrivateGStreamer::load):
            (WebCore::MediaPlayerPrivateGStreamer::commitLoad):
            (WebCore::MediaPlayerPrivateGStreamer::videoTagsChanged):
            (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVideoTags):
            (WebCore::MediaPlayerPrivateGStreamer::audioTagsChanged):
            (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfAudioTags):
            (WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin):
            * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
            (WebCore::MediaPlayerPrivateGStreamer::hasVideo):
            (WebCore::MediaPlayerPrivateGStreamer::hasAudio):
            (WebCore::MediaPlayerPrivateGStreamer::loadDelayed):
    
    LayoutTests:
    
            Reviewed by Martin Robinson.
    
            hasVideo/hasAudio reimplementations
    
            [GStreamer] hasVideo/Audio return false until the pipeline reaches PAUSED
            https://bugs.webkit.org/show_bug.cgi?id=50382
    
            * media/controls-without-preload.html: Added.
            * platform/gtk/media/controls-without-preload-expected.txt: Added.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@73257 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index f5bbd89..e58c565 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,15 @@
+2010-12-02  Philippe Normand  <pnormand at igalia.com>
+
+        Reviewed by Martin Robinson.
+
+        hasVideo/hasAudio reimplementations
+
+        [GStreamer] hasVideo/Audio return false until the pipeline reaches PAUSED
+        https://bugs.webkit.org/show_bug.cgi?id=50382
+
+        * media/controls-without-preload.html: Added.
+        * platform/gtk/media/controls-without-preload-expected.txt: Added.
+
 2010-12-03  Yuta Kitamura  <yutak at chromium.org>
 
         Unreviewed.
diff --git a/LayoutTests/media/controls-without-preload.html b/LayoutTests/media/controls-without-preload.html
new file mode 100644
index 0000000..4a2d492
--- /dev/null
+++ b/LayoutTests/media/controls-without-preload.html
@@ -0,0 +1,26 @@
+<html>
+    <head>
+        <script src=media-file.js></script>
+        <script>
+            if (window.layoutTestController)
+                layoutTestController.waitUntilDone();
+
+            function start()
+            {
+                setSrcByTagName("video", findMediaFile("video", "content/test"));
+                setTimeout(finish, 200);
+            }
+
+            function finish()
+            {
+                if (window.layoutTestController)
+                    layoutTestController.notifyDone();
+            }
+        </script>
+    </head>
+
+    <body onload="start()">
+        <p>The controls should not depend on preload value.</p>
+        <video preload=none controls ></video>
+    </body>
+</html>
diff --git a/LayoutTests/platform/gtk/media/controls-without-preload-expected.txt b/LayoutTests/platform/gtk/media/controls-without-preload-expected.txt
new file mode 100644
index 0000000..a593f64
--- /dev/null
+++ b/LayoutTests/platform/gtk/media/controls-without-preload-expected.txt
@@ -0,0 +1,24 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {P} at (0,0) size 784x19
+        RenderText {#text} at (0,0) size 312x19
+          text run at (0,0) width 312: "The controls should not depend on preload value."
+      RenderBlock (anonymous) at (0,35) size 784x150
+        RenderText {#text} at (0,0) size 0x0
+layer at (8,43) size 300x150
+  RenderVideo {VIDEO} at (0,0) size 300x150
+layer at (8,43) size 300x150
+  RenderBlock (relative positioned) {DIV} at (0,0) size 300x150
+layer at (8,173) size 300x20
+  RenderFlexibleBox (positioned) {DIV} at (0,130) size 300x20
+    RenderButton {INPUT} at (0,0) size 20x20
+    RenderFlexibleBox {DIV} at (20,0) size 200x20 [border: (1px solid #FFFFFF33) none (1px solid #FFFFFF33)]
+      RenderSlider {INPUT} at (1,0) size 198x20
+        RenderBlock {DIV} at (2,4) size 12x12
+    RenderButton {INPUT} at (220,0) size 20x20
+    RenderButton {INPUT} at (240,0) size 20x20
+    RenderButton {INPUT} at (260,0) size 20x20
+    RenderButton {INPUT} at (280,0) size 20x20
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 084e6a5..4953a54 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,38 @@
+2010-12-02  Philippe Normand  <pnormand at igalia.com>
+
+        Reviewed by Martin Robinson.
+
+        [GStreamer] hasVideo/Audio return false until the pipeline reaches PAUSED
+        https://bugs.webkit.org/show_bug.cgi?id=50382
+
+        Go to PAUSED even if preload is deactivated. In that case don't
+        process the GStreamer state changes until commitLoad() has been
+        called. This patch also fixes hasVideo and hasAudio methods,
+        making them reactive to the playbin2 audio/video tags-changed
+        signals.
+
+        Test: media/controls-without-preload.html
+
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+        (WebCore::mediaPlayerPrivateMessageCallback):
+        (WebCore::mediaPlayerPrivateVideoTagsChangedCallback):
+        (WebCore::mediaPlayerPrivateAudioTagsChangedCallback):
+        (WebCore::mediaPlayerPrivateAudioTagsChangeTimeoutCallback):
+        (WebCore::mediaPlayerPrivateVideoTagsChangeTimeoutCallback):
+        (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer):
+        (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer):
+        (WebCore::MediaPlayerPrivateGStreamer::load):
+        (WebCore::MediaPlayerPrivateGStreamer::commitLoad):
+        (WebCore::MediaPlayerPrivateGStreamer::videoTagsChanged):
+        (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVideoTags):
+        (WebCore::MediaPlayerPrivateGStreamer::audioTagsChanged):
+        (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfAudioTags):
+        (WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin):
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
+        (WebCore::MediaPlayerPrivateGStreamer::hasVideo):
+        (WebCore::MediaPlayerPrivateGStreamer::hasAudio):
+        (WebCore::MediaPlayerPrivateGStreamer::loadDelayed):
+
 2010-12-03  Nikolas Zimmermann  <nzimmermann at rim.com>
 
         Reviewed by Dirk Schulze.
diff --git a/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp b/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
index dbef4c9..e583096 100644
--- a/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
+++ b/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
@@ -134,6 +134,13 @@ gboolean mediaPlayerPrivateMessageCallback(GstBus* bus, GstMessage* message, gpo
         mp->didEnd();
         break;
     case GST_MESSAGE_STATE_CHANGED:
+        // Ignore state changes if load is delayed (preload=none). The
+        // player state will be updated once commitLoad() is called.
+        if (mp->loadDelayed()) {
+            LOG_VERBOSE(Media, "Media load has been delayed. Ignoring state changes for now");
+            break;
+        }
+
         // Ignore state changes from internal elements. They are
         // forwarded to playbin2 anyway.
         if (GST_MESSAGE_SRC(message) == reinterpret_cast<GstObject*>(pipeline))
@@ -198,6 +205,30 @@ gboolean mediaPlayerPrivateMuteChangeTimeoutCallback(MediaPlayerPrivateGStreamer
     return FALSE;
 }
 
+void mediaPlayerPrivateVideoTagsChangedCallback(GObject* element, gint streamId, MediaPlayerPrivateGStreamer* player)
+{
+    player->videoTagsChanged(streamId);
+}
+
+void mediaPlayerPrivateAudioTagsChangedCallback(GObject* element, gint streamId, MediaPlayerPrivateGStreamer* player)
+{
+    player->audioTagsChanged(streamId);
+}
+
+gboolean mediaPlayerPrivateAudioTagsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
+{
+    // This is the callback of the timeout source created in ::audioTagsChanged.
+    player->notifyPlayerOfAudioTags();
+    return FALSE;
+}
+
+gboolean mediaPlayerPrivateVideoTagsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
+{
+    // This is the callback of the timeout source created in ::videoTagsChanged.
+    player->notifyPlayerOfVideoTags();
+    return FALSE;
+}
+
 static float playbackPosition(GstElement* playbin)
 {
 
@@ -309,6 +340,12 @@ MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer(MediaPlayer* player)
     , m_preload(MediaPlayer::Auto)
     , m_delayingLoad(false)
     , m_mediaDurationKnown(true)
+    , m_volumeTimerHandler(0)
+    , m_muteTimerHandler(0)
+    , m_hasVideo(false)
+    , m_hasAudio(false)
+    , m_audioTagsTimerHandler(0)
+    , m_videoTagsTimerHandler(0)
 {
     if (doGstInit())
         createGSTPlayBin();
@@ -348,11 +385,15 @@ MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer()
 
     if (m_muteTimerHandler)
         g_source_remove(m_muteTimerHandler);
-    m_muteTimerHandler = 0;
 
     if (m_volumeTimerHandler)
         g_source_remove(m_volumeTimerHandler);
-    m_volumeTimerHandler = 0;
+
+    if (m_videoTagsTimerHandler)
+        g_source_remove(m_videoTagsTimerHandler);
+
+    if (m_audioTagsTimerHandler)
+        g_source_remove(m_audioTagsTimerHandler);
 }
 
 void MediaPlayerPrivateGStreamer::load(const String& url)
@@ -364,27 +405,21 @@ void MediaPlayerPrivateGStreamer::load(const String& url)
     if (m_preload == MediaPlayer::None) {
         LOG_VERBOSE(Media, "Delaying load.");
         m_delayingLoad = true;
-        return;
     }
 
-    commitLoad();
-}
-
-void MediaPlayerPrivateGStreamer::commitLoad()
-{
     // GStreamer needs to have the pipeline set to a paused state to
     // start providing anything useful.
     gst_element_set_state(m_playBin, GST_STATE_PAUSED);
 
+    if (!m_delayingLoad)
+        commitLoad();
+}
+
+void MediaPlayerPrivateGStreamer::commitLoad()
+{
+    ASSERT(!m_delayingLoad);
     LOG_VERBOSE(Media, "Committing load.");
-    if (m_networkState != MediaPlayer::Loading) {
-        m_networkState = MediaPlayer::Loading;
-        m_player->networkStateChanged();
-    }
-    if (m_readyState != MediaPlayer::HaveNothing) {
-        m_readyState = MediaPlayer::HaveNothing;
-        m_player->readyStateChanged();
-    }
+    updateStates();
 }
 
 bool MediaPlayerPrivateGStreamer::changePipelineState(GstState newState)
@@ -584,20 +619,40 @@ IntSize MediaPlayerPrivateGStreamer::naturalSize() const
     return IntSize(static_cast<int>(width), static_cast<int>(height));
 }
 
-bool MediaPlayerPrivateGStreamer::hasVideo() const
+void MediaPlayerPrivateGStreamer::videoTagsChanged(gint streamId)
+{
+    if (m_videoTagsTimerHandler)
+        g_source_remove(m_videoTagsTimerHandler);
+    m_videoTagsTimerHandler = g_timeout_add(0, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateVideoTagsChangeTimeoutCallback), this);
+}
+
+void MediaPlayerPrivateGStreamer::notifyPlayerOfVideoTags()
 {
+    m_videoTagsTimerHandler = 0;
+
     gint currentVideo = -1;
     if (m_playBin)
         g_object_get(m_playBin, "current-video", &currentVideo, NULL);
-    return currentVideo > -1;
+    m_hasVideo = currentVideo > -1;
+    m_player->mediaPlayerClient()->mediaPlayerEngineUpdated(m_player);
 }
 
-bool MediaPlayerPrivateGStreamer::hasAudio() const
+void MediaPlayerPrivateGStreamer::audioTagsChanged(gint streamId)
 {
+    if (m_audioTagsTimerHandler)
+        g_source_remove(m_audioTagsTimerHandler);
+    m_audioTagsTimerHandler = g_timeout_add(0, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateAudioTagsChangeTimeoutCallback), this);
+}
+
+void MediaPlayerPrivateGStreamer::notifyPlayerOfAudioTags()
+{
+    m_audioTagsTimerHandler = 0;
+
     gint currentAudio = -1;
     if (m_playBin)
         g_object_get(m_playBin, "current-audio", &currentAudio, NULL);
-    return currentAudio > -1;
+    m_hasAudio = currentAudio > -1;
+    m_player->mediaPlayerClient()->mediaPlayerEngineUpdated(m_player);
 }
 
 void MediaPlayerPrivateGStreamer::setVolume(float volume)
@@ -1441,6 +1496,8 @@ void MediaPlayerPrivateGStreamer::createGSTPlayBin()
     g_signal_connect(m_playBin, "notify::volume", G_CALLBACK(mediaPlayerPrivateVolumeChangedCallback), this);
     g_signal_connect(m_playBin, "notify::source", G_CALLBACK(mediaPlayerPrivateSourceChangedCallback), this);
     g_signal_connect(m_playBin, "notify::mute", G_CALLBACK(mediaPlayerPrivateMuteChangedCallback), this);
+    g_signal_connect(m_playBin, "video-tags-changed", G_CALLBACK(mediaPlayerPrivateVideoTagsChangedCallback), this);
+    g_signal_connect(m_playBin, "audio-tags-changed", G_CALLBACK(mediaPlayerPrivateAudioTagsChangedCallback), this);
 
     m_webkitVideoSink = webkit_video_sink_new();
 
diff --git a/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h b/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
index 23095ec..46943ac 100644
--- a/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
+++ b/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
@@ -49,6 +49,11 @@ gboolean mediaPlayerPrivateMessageCallback(GstBus* bus, GstMessage* message, gpo
 void mediaPlayerPrivateVolumeChangedCallback(GObject* element, GParamSpec* pspec, gpointer data);
 void mediaPlayerPrivateMuteChangedCallback(GObject* element, GParamSpec* pspec, gpointer data);
 void mediaPlayerPrivateSourceChangedCallback(GObject* element, GParamSpec* pspec, gpointer data);
+void mediaPlayerPrivateVideoTagsChangedCallback(GObject* element, gint, MediaPlayerPrivateGStreamer*);
+void mediaPlayerPrivateAudioTagsChangedCallback(GObject* element, gint, MediaPlayerPrivateGStreamer*);
+gboolean mediaPlayerPrivateAudioTagsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player);
+gboolean mediaPlayerPrivateVideoTagsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player);
+
 gboolean mediaPlayerPrivateVolumeChangeTimeoutCallback(MediaPlayerPrivateGStreamer*);
 gboolean mediaPlayerPrivateMuteChangeTimeoutCallback(MediaPlayerPrivateGStreamer*);
 
@@ -61,8 +66,8 @@ class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateInterface {
             static void registerMediaEngine(MediaEngineRegistrar);
 
             IntSize naturalSize() const;
-            bool hasVideo() const;
-            bool hasAudio() const;
+            bool hasVideo() const { return m_hasVideo; }
+            bool hasAudio() const { return m_hasAudio; }
 
             void load(const String &url);
             void commitLoad();
@@ -91,6 +96,7 @@ class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateInterface {
             void muteChanged();
             void notifyPlayerOfMute();
 
+            bool loadDelayed() const { return m_delayingLoad; }
             void setPreload(MediaPlayer::Preload);
             void fillTimerFired(Timer<MediaPlayerPrivateGStreamer>*);
 
@@ -124,6 +130,11 @@ class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateInterface {
             GstElement* pipeline() const { return m_playBin; }
             bool pipelineReset() const { return m_resetPipeline; }
 
+            void videoTagsChanged(gint);
+            void audioTagsChanged(gint);
+            void notifyPlayerOfVideoTags();
+            void notifyPlayerOfAudioTags();
+
         private:
             MediaPlayerPrivateGStreamer(MediaPlayer*);
             ~MediaPlayerPrivateGStreamer();
@@ -181,6 +192,10 @@ class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateInterface {
             RefPtr<GStreamerGWorld> m_gstGWorld;
             guint m_volumeTimerHandler;
             guint m_muteTimerHandler;
+            bool m_hasVideo;
+            bool m_hasAudio;
+            guint m_audioTagsTimerHandler;
+            guint m_videoTagsTimerHandler;
     };
 }
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list