Changeset 73257 in webkit
- Timestamp:
- Dec 3, 2010 3:06:08 AM (13 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r73253 r73257 1 2010-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 1 13 2010-12-03 Yuta Kitamura <yutak@chromium.org> 2 14 -
trunk/WebCore/ChangeLog
r73254 r73257 1 2010-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 1 36 2010-12-03 Nikolas Zimmermann <nzimmermann@rim.com> 2 37 -
trunk/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
r73014 r73257 135 135 break; 136 136 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 137 144 // Ignore state changes from internal elements. They are 138 145 // forwarded to playbin2 anyway. … … 196 203 // This is the callback of the timeout source created in ::muteChanged. 197 204 player->notifyPlayerOfMute(); 205 return FALSE; 206 } 207 208 void mediaPlayerPrivateVideoTagsChangedCallback(GObject* element, gint streamId, MediaPlayerPrivateGStreamer* player) 209 { 210 player->videoTagsChanged(streamId); 211 } 212 213 void mediaPlayerPrivateAudioTagsChangedCallback(GObject* element, gint streamId, MediaPlayerPrivateGStreamer* player) 214 { 215 player->audioTagsChanged(streamId); 216 } 217 218 gboolean mediaPlayerPrivateAudioTagsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player) 219 { 220 // This is the callback of the timeout source created in ::audioTagsChanged. 221 player->notifyPlayerOfAudioTags(); 222 return FALSE; 223 } 224 225 gboolean mediaPlayerPrivateVideoTagsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player) 226 { 227 // This is the callback of the timeout source created in ::videoTagsChanged. 228 player->notifyPlayerOfVideoTags(); 198 229 return FALSE; 199 230 } … … 310 341 , m_delayingLoad(false) 311 342 , 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) 312 349 { 313 350 if (doGstInit()) … … 349 386 if (m_muteTimerHandler) 350 387 g_source_remove(m_muteTimerHandler); 351 m_muteTimerHandler = 0;352 388 353 389 if (m_volumeTimerHandler) 354 390 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); 356 397 } 357 398 … … 365 406 LOG_VERBOSE(Media, "Delaying load."); 366 407 m_delayingLoad = true; 367 return; 368 } 369 370 commitLoad(); 371 } 372 373 void MediaPlayerPrivateGStreamer::commitLoad() 374 { 408 } 409 375 410 // GStreamer needs to have the pipeline set to a paused state to 376 411 // start providing anything useful. 377 412 gst_element_set_state(m_playBin, GST_STATE_PAUSED); 378 413 414 if (!m_delayingLoad) 415 commitLoad(); 416 } 417 418 void MediaPlayerPrivateGStreamer::commitLoad() 419 { 420 ASSERT(!m_delayingLoad); 379 421 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(); 388 423 } 389 424 … … 585 620 } 586 621 587 bool MediaPlayerPrivateGStreamer::hasVideo() const 588 { 622 void 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 629 void MediaPlayerPrivateGStreamer::notifyPlayerOfVideoTags() 630 { 631 m_videoTagsTimerHandler = 0; 632 589 633 gint currentVideo = -1; 590 634 if (m_playBin) 591 635 g_object_get(m_playBin, "current-video", ¤tVideo, 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 640 void 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 647 void MediaPlayerPrivateGStreamer::notifyPlayerOfAudioTags() 648 { 649 m_audioTagsTimerHandler = 0; 650 597 651 gint currentAudio = -1; 598 652 if (m_playBin) 599 653 g_object_get(m_playBin, "current-audio", ¤tAudio, NULL); 600 return currentAudio > -1; 654 m_hasAudio = currentAudio > -1; 655 m_player->mediaPlayerClient()->mediaPlayerEngineUpdated(m_player); 601 656 } 602 657 … … 1442 1497 g_signal_connect(m_playBin, "notify::source", G_CALLBACK(mediaPlayerPrivateSourceChangedCallback), this); 1443 1498 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); 1444 1501 1445 1502 m_webkitVideoSink = webkit_video_sink_new(); -
trunk/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
r73014 r73257 50 50 void mediaPlayerPrivateMuteChangedCallback(GObject* element, GParamSpec* pspec, gpointer data); 51 51 void mediaPlayerPrivateSourceChangedCallback(GObject* element, GParamSpec* pspec, gpointer data); 52 void mediaPlayerPrivateVideoTagsChangedCallback(GObject* element, gint, MediaPlayerPrivateGStreamer*); 53 void mediaPlayerPrivateAudioTagsChangedCallback(GObject* element, gint, MediaPlayerPrivateGStreamer*); 54 gboolean mediaPlayerPrivateAudioTagsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player); 55 gboolean mediaPlayerPrivateVideoTagsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player); 56 52 57 gboolean mediaPlayerPrivateVolumeChangeTimeoutCallback(MediaPlayerPrivateGStreamer*); 53 58 gboolean mediaPlayerPrivateMuteChangeTimeoutCallback(MediaPlayerPrivateGStreamer*); … … 62 67 63 68 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; } 66 71 67 72 void load(const String &url); … … 92 97 void notifyPlayerOfMute(); 93 98 99 bool loadDelayed() const { return m_delayingLoad; } 94 100 void setPreload(MediaPlayer::Preload); 95 101 void fillTimerFired(Timer<MediaPlayerPrivateGStreamer>*); … … 124 130 GstElement* pipeline() const { return m_playBin; } 125 131 bool pipelineReset() const { return m_resetPipeline; } 132 133 void videoTagsChanged(gint); 134 void audioTagsChanged(gint); 135 void notifyPlayerOfVideoTags(); 136 void notifyPlayerOfAudioTags(); 126 137 127 138 private: … … 182 193 guint m_volumeTimerHandler; 183 194 guint m_muteTimerHandler; 195 bool m_hasVideo; 196 bool m_hasAudio; 197 guint m_audioTagsTimerHandler; 198 guint m_videoTagsTimerHandler; 184 199 }; 185 200 }
Note: See TracChangeset
for help on using the changeset viewer.