Changeset 73257 in webkit


Ignore:
Timestamp:
Dec 3, 2010 3:06:08 AM (13 years ago)
Author:
Philippe Normand
Message:

2010-12-02 Philippe Normand <pnormand@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.
Location:
trunk
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r73253 r73257  
     12010-12-02  Philippe Normand  <pnormand@igalia.com>
     2
     3        Reviewed by Martin Robinson.
     4
     5        hasVideo/hasAudio reimplementations
     6
     7        [GStreamer] hasVideo/Audio return false until the pipeline reaches PAUSED
     8        https://bugs.webkit.org/show_bug.cgi?id=50382
     9
     10        * media/controls-without-preload.html: Added.
     11        * platform/gtk/media/controls-without-preload-expected.txt: Added.
     12
    1132010-12-03  Yuta Kitamura  <yutak@chromium.org>
    214
  • trunk/WebCore/ChangeLog

    r73254 r73257  
     12010-12-02  Philippe Normand  <pnormand@igalia.com>
     2
     3        Reviewed by Martin Robinson.
     4
     5        [GStreamer] hasVideo/Audio return false until the pipeline reaches PAUSED
     6        https://bugs.webkit.org/show_bug.cgi?id=50382
     7
     8        Go to PAUSED even if preload is deactivated. In that case don't
     9        process the GStreamer state changes until commitLoad() has been
     10        called. This patch also fixes hasVideo and hasAudio methods,
     11        making them reactive to the playbin2 audio/video tags-changed
     12        signals.
     13
     14        Test: media/controls-without-preload.html
     15
     16        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
     17        (WebCore::mediaPlayerPrivateMessageCallback):
     18        (WebCore::mediaPlayerPrivateVideoTagsChangedCallback):
     19        (WebCore::mediaPlayerPrivateAudioTagsChangedCallback):
     20        (WebCore::mediaPlayerPrivateAudioTagsChangeTimeoutCallback):
     21        (WebCore::mediaPlayerPrivateVideoTagsChangeTimeoutCallback):
     22        (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer):
     23        (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer):
     24        (WebCore::MediaPlayerPrivateGStreamer::load):
     25        (WebCore::MediaPlayerPrivateGStreamer::commitLoad):
     26        (WebCore::MediaPlayerPrivateGStreamer::videoTagsChanged):
     27        (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVideoTags):
     28        (WebCore::MediaPlayerPrivateGStreamer::audioTagsChanged):
     29        (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfAudioTags):
     30        (WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin):
     31        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
     32        (WebCore::MediaPlayerPrivateGStreamer::hasVideo):
     33        (WebCore::MediaPlayerPrivateGStreamer::hasAudio):
     34        (WebCore::MediaPlayerPrivateGStreamer::loadDelayed):
     35
    1362010-12-03  Nikolas Zimmermann  <nzimmermann@rim.com>
    237
  • trunk/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp

    r73014 r73257  
    135135        break;
    136136    case GST_MESSAGE_STATE_CHANGED:
     137        // Ignore state changes if load is delayed (preload=none). The
     138        // player state will be updated once commitLoad() is called.
     139        if (mp->loadDelayed()) {
     140            LOG_VERBOSE(Media, "Media load has been delayed. Ignoring state changes for now");
     141            break;
     142        }
     143
    137144        // Ignore state changes from internal elements. They are
    138145        // forwarded to playbin2 anyway.
     
    196203    // This is the callback of the timeout source created in ::muteChanged.
    197204    player->notifyPlayerOfMute();
     205    return FALSE;
     206}
     207
     208void mediaPlayerPrivateVideoTagsChangedCallback(GObject* element, gint streamId, MediaPlayerPrivateGStreamer* player)
     209{
     210    player->videoTagsChanged(streamId);
     211}
     212
     213void mediaPlayerPrivateAudioTagsChangedCallback(GObject* element, gint streamId, MediaPlayerPrivateGStreamer* player)
     214{
     215    player->audioTagsChanged(streamId);
     216}
     217
     218gboolean mediaPlayerPrivateAudioTagsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
     219{
     220    // This is the callback of the timeout source created in ::audioTagsChanged.
     221    player->notifyPlayerOfAudioTags();
     222    return FALSE;
     223}
     224
     225gboolean mediaPlayerPrivateVideoTagsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
     226{
     227    // This is the callback of the timeout source created in ::videoTagsChanged.
     228    player->notifyPlayerOfVideoTags();
    198229    return FALSE;
    199230}
     
    310341    , m_delayingLoad(false)
    311342    , m_mediaDurationKnown(true)
     343    , m_volumeTimerHandler(0)
     344    , m_muteTimerHandler(0)
     345    , m_hasVideo(false)
     346    , m_hasAudio(false)
     347    , m_audioTagsTimerHandler(0)
     348    , m_videoTagsTimerHandler(0)
    312349{
    313350    if (doGstInit())
     
    349386    if (m_muteTimerHandler)
    350387        g_source_remove(m_muteTimerHandler);
    351     m_muteTimerHandler = 0;
    352388
    353389    if (m_volumeTimerHandler)
    354390        g_source_remove(m_volumeTimerHandler);
    355     m_volumeTimerHandler = 0;
     391
     392    if (m_videoTagsTimerHandler)
     393        g_source_remove(m_videoTagsTimerHandler);
     394
     395    if (m_audioTagsTimerHandler)
     396        g_source_remove(m_audioTagsTimerHandler);
    356397}
    357398
     
    365406        LOG_VERBOSE(Media, "Delaying load.");
    366407        m_delayingLoad = true;
    367         return;
    368     }
    369 
    370     commitLoad();
    371 }
    372 
    373 void MediaPlayerPrivateGStreamer::commitLoad()
    374 {
     408    }
     409
    375410    // GStreamer needs to have the pipeline set to a paused state to
    376411    // start providing anything useful.
    377412    gst_element_set_state(m_playBin, GST_STATE_PAUSED);
    378413
     414    if (!m_delayingLoad)
     415        commitLoad();
     416}
     417
     418void MediaPlayerPrivateGStreamer::commitLoad()
     419{
     420    ASSERT(!m_delayingLoad);
    379421    LOG_VERBOSE(Media, "Committing load.");
    380     if (m_networkState != MediaPlayer::Loading) {
    381         m_networkState = MediaPlayer::Loading;
    382         m_player->networkStateChanged();
    383     }
    384     if (m_readyState != MediaPlayer::HaveNothing) {
    385         m_readyState = MediaPlayer::HaveNothing;
    386         m_player->readyStateChanged();
    387     }
     422    updateStates();
    388423}
    389424
     
    585620}
    586621
    587 bool MediaPlayerPrivateGStreamer::hasVideo() const
    588 {
     622void MediaPlayerPrivateGStreamer::videoTagsChanged(gint streamId)
     623{
     624    if (m_videoTagsTimerHandler)
     625        g_source_remove(m_videoTagsTimerHandler);
     626    m_videoTagsTimerHandler = g_timeout_add(0, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateVideoTagsChangeTimeoutCallback), this);
     627}
     628
     629void MediaPlayerPrivateGStreamer::notifyPlayerOfVideoTags()
     630{
     631    m_videoTagsTimerHandler = 0;
     632
    589633    gint currentVideo = -1;
    590634    if (m_playBin)
    591635        g_object_get(m_playBin, "current-video", &currentVideo, NULL);
    592     return currentVideo > -1;
    593 }
    594 
    595 bool MediaPlayerPrivateGStreamer::hasAudio() const
    596 {
     636    m_hasVideo = currentVideo > -1;
     637    m_player->mediaPlayerClient()->mediaPlayerEngineUpdated(m_player);
     638}
     639
     640void MediaPlayerPrivateGStreamer::audioTagsChanged(gint streamId)
     641{
     642    if (m_audioTagsTimerHandler)
     643        g_source_remove(m_audioTagsTimerHandler);
     644    m_audioTagsTimerHandler = g_timeout_add(0, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateAudioTagsChangeTimeoutCallback), this);
     645}
     646
     647void MediaPlayerPrivateGStreamer::notifyPlayerOfAudioTags()
     648{
     649    m_audioTagsTimerHandler = 0;
     650
    597651    gint currentAudio = -1;
    598652    if (m_playBin)
    599653        g_object_get(m_playBin, "current-audio", &currentAudio, NULL);
    600     return currentAudio > -1;
     654    m_hasAudio = currentAudio > -1;
     655    m_player->mediaPlayerClient()->mediaPlayerEngineUpdated(m_player);
    601656}
    602657
     
    14421497    g_signal_connect(m_playBin, "notify::source", G_CALLBACK(mediaPlayerPrivateSourceChangedCallback), this);
    14431498    g_signal_connect(m_playBin, "notify::mute", G_CALLBACK(mediaPlayerPrivateMuteChangedCallback), this);
     1499    g_signal_connect(m_playBin, "video-tags-changed", G_CALLBACK(mediaPlayerPrivateVideoTagsChangedCallback), this);
     1500    g_signal_connect(m_playBin, "audio-tags-changed", G_CALLBACK(mediaPlayerPrivateAudioTagsChangedCallback), this);
    14441501
    14451502    m_webkitVideoSink = webkit_video_sink_new();
  • trunk/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h

    r73014 r73257  
    5050void mediaPlayerPrivateMuteChangedCallback(GObject* element, GParamSpec* pspec, gpointer data);
    5151void mediaPlayerPrivateSourceChangedCallback(GObject* element, GParamSpec* pspec, gpointer data);
     52void mediaPlayerPrivateVideoTagsChangedCallback(GObject* element, gint, MediaPlayerPrivateGStreamer*);
     53void mediaPlayerPrivateAudioTagsChangedCallback(GObject* element, gint, MediaPlayerPrivateGStreamer*);
     54gboolean mediaPlayerPrivateAudioTagsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player);
     55gboolean mediaPlayerPrivateVideoTagsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player);
     56
    5257gboolean mediaPlayerPrivateVolumeChangeTimeoutCallback(MediaPlayerPrivateGStreamer*);
    5358gboolean mediaPlayerPrivateMuteChangeTimeoutCallback(MediaPlayerPrivateGStreamer*);
     
    6267
    6368            IntSize naturalSize() const;
    64             bool hasVideo() const;
    65             bool hasAudio() const;
     69            bool hasVideo() const { return m_hasVideo; }
     70            bool hasAudio() const { return m_hasAudio; }
    6671
    6772            void load(const String &url);
     
    9297            void notifyPlayerOfMute();
    9398
     99            bool loadDelayed() const { return m_delayingLoad; }
    94100            void setPreload(MediaPlayer::Preload);
    95101            void fillTimerFired(Timer<MediaPlayerPrivateGStreamer>*);
     
    124130            GstElement* pipeline() const { return m_playBin; }
    125131            bool pipelineReset() const { return m_resetPipeline; }
     132
     133            void videoTagsChanged(gint);
     134            void audioTagsChanged(gint);
     135            void notifyPlayerOfVideoTags();
     136            void notifyPlayerOfAudioTags();
    126137
    127138        private:
     
    182193            guint m_volumeTimerHandler;
    183194            guint m_muteTimerHandler;
     195            bool m_hasVideo;
     196            bool m_hasAudio;
     197            guint m_audioTagsTimerHandler;
     198            guint m_videoTagsTimerHandler;
    184199    };
    185200}
Note: See TracChangeset for help on using the changeset viewer.