Changeset 124217 in webkit
- Timestamp:
- Jul 31, 2012 10:16:24 AM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r124214 r124217 1 2012-07-07 Philippe Normand <pnormand@igalia.com> 2 3 [GStreamer] Live stream support is weak 4 https://bugs.webkit.org/show_bug.cgi?id=90084 5 6 Reviewed by Martin Robinson. 7 8 Make sure on-disk buffering is disabled for live streams. It is 9 enabled initially when loading any remote media file if preload is 10 set to Auto. Later on if the player detects that the media is live 11 it disables on-disk buffering. This patch also adds support for 12 caching the total size of the media. 13 14 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: 15 (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer): 16 (WebCore::MediaPlayerPrivateGStreamer::load): Keep track of the 17 media url as an instance attribute. 18 (WebCore::MediaPlayerPrivateGStreamer::duration): Logging improvement. 19 (WebCore::MediaPlayerPrivateGStreamer::setRate): use the new 20 isLiveStream() method. 21 (WebCore::MediaPlayerPrivateGStreamer::buffered): Ditto. 22 (WebCore::MediaPlayerPrivateGStreamer::handleMessage): Indicate 23 source of duration message. 24 (WebCore::MediaPlayerPrivateGStreamer::fillTimerFired): Perform an 25 anonymous duration change emission, mostly to cache its value. 26 (WebCore::MediaPlayerPrivateGStreamer::totalBytes): Return 27 cached size when available. 28 (WebCore::MediaPlayerPrivateGStreamer::updateStates): Use the new 29 isLiveStream() method and handle state change corner cases for live streams. 30 (WebCore::MediaPlayerPrivateGStreamer::durationChanged): Cache 31 media total size and re-enable on-disk buffering if caching succeeds. 32 (WebCore::MediaPlayerPrivateGStreamer::movieLoadType): New 33 implementation handling on-disk buffered and live streaming cases. 34 (WebCore::MediaPlayerPrivateGStreamer::setPreload): Remember the 35 case where preload is updated from Auto to another value, do 36 on-disk buffering only for Auto preload attribute. 37 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: 38 (MediaPlayerPrivateGStreamer): 39 (WebCore::MediaPlayerPrivateGStreamer::isLiveStream): Utility 40 method, a stream is live if it goes to PAUSE without prerolling. 41 1 42 2012-07-17 Antonio Gomes <agomes@rim.com> 2 43 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
r122670 r124217 236 236 , m_videoTimerHandler(0) 237 237 , m_webkitAudioSink(0) 238 , m_totalBytes(-1) 239 , m_originalPreloadWasAutoAndWasOverridden(false) 238 240 { 239 241 if (initializeGStreamerAndRegisterWebKitElements()) … … 293 295 cleanUrl = cleanUrl.substring(0, kurl.pathEnd()); 294 296 297 m_url = KURL(KURL(), cleanUrl); 295 298 g_object_set(m_playBin, "uri", cleanUrl.utf8().data(), NULL); 296 299 … … 408 411 #endif 409 412 if (failure) { 410 LOG_VERBOSE(Media, "Time duration query failed .");413 LOG_VERBOSE(Media, "Time duration query failed for %s", m_url.string().utf8().data()); 411 414 return numeric_limits<float>::infinity(); 412 415 } … … 635 638 return; 636 639 637 if ( m_isStreaming)640 if (isLiveStream()) 638 641 return; 639 642 … … 693 696 { 694 697 RefPtr<TimeRanges> timeRanges = TimeRanges::create(); 695 if (m_errorOccured || m_isStreaming)698 if (m_errorOccured || isLiveStream()) 696 699 return timeRanges.release(); 697 700 … … 724 727 #else 725 728 float loaded = maxTimeLoaded(); 726 if (!m_errorOccured && ! m_isStreaming&& loaded > 0)729 if (!m_errorOccured && !isLiveStream() && loaded > 0) 727 730 timeRanges->add(0, loaded); 728 731 #endif … … 750 753 } 751 754 755 LOG_VERBOSE(Media, "Message received from element %s", GST_MESSAGE_SRC_NAME(message)); 752 756 switch (GST_MESSAGE_TYPE(message)) { 753 757 case GST_MESSAGE_ERROR: … … 755 759 break; 756 760 gst_message_parse_error(message, &err.outPtr(), &debug.outPtr()); 757 LOG_VERBOSE(Media, "Error : %d, %s", err->code, err->message);761 LOG_VERBOSE(Media, "Error %d: %s (url=%s)", err->code, err->message, m_url.string().utf8().data()); 758 762 759 763 GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(m_playBin), GST_DEBUG_GRAPH_SHOW_ALL, "webkit-video.error"); … … 942 946 unsigned MediaPlayerPrivateGStreamer::totalBytes() const 943 947 { 948 if (m_errorOccured) 949 return 0; 950 951 if (m_totalBytes != -1) 952 return m_totalBytes; 953 944 954 if (!m_source) 945 return 0;946 947 if (m_errorOccured)948 955 return 0; 949 956 … … 956 963 #endif 957 964 LOG_VERBOSE(Media, "totalBytes %" G_GINT64_FORMAT, length); 958 return static_cast<unsigned>(length); 965 m_totalBytes = static_cast<unsigned>(length); 966 m_isStreaming = !length; 967 return m_totalBytes; 959 968 } 960 969 … … 1004 1013 1005 1014 LOG_VERBOSE(Media, "totalBytes %" G_GINT64_FORMAT, length); 1006 1007 return static_cast<unsigned>(length); 1015 m_totalBytes = static_cast<unsigned>(length); 1016 m_isStreaming = !length; 1017 return m_totalBytes; 1008 1018 } 1009 1019 … … 1151 1161 m_paused = false; 1152 1162 1153 if (m_buffering ) {1163 if (m_buffering && !isLiveStream()) { 1154 1164 m_readyState = MediaPlayer::HaveCurrentData; 1155 1165 m_networkState = MediaPlayer::Loading; … … 1183 1193 // Change in progress 1184 1194 1185 if (!m_isStreaming && !m_buffering) 1195 // On-disk buffering was attempted but the media is live. This 1196 // can't work so disable on-disk buffering and reset the 1197 // pipeline. 1198 if (state == GST_STATE_READY && isLiveStream() && m_preload == MediaPlayer::Auto) { 1199 setPreload(MediaPlayer::None); 1200 gst_element_set_state(m_playBin, GST_STATE_NULL); 1201 gst_element_set_state(m_playBin, GST_STATE_PAUSED); 1202 } 1203 1204 // A live stream was paused, reset the pipeline. 1205 if (state == GST_STATE_PAUSED && pending == GST_STATE_PLAYING && isLiveStream()) { 1206 gst_element_set_state(m_playBin, GST_STATE_NULL); 1207 gst_element_set_state(m_playBin, GST_STATE_PLAYING); 1208 } 1209 1210 if (!isLiveStream() && !m_buffering) 1186 1211 return; 1187 1212 … … 1414 1439 if (previousDuration && m_mediaDuration != previousDuration) 1415 1440 m_player->durationChanged(); 1441 1442 if (m_preload == MediaPlayer::None && m_originalPreloadWasAutoAndWasOverridden) { 1443 m_totalBytes = -1; 1444 if (totalBytes() && !isLiveStream()) { 1445 setPreload(MediaPlayer::Auto); 1446 gst_element_set_state(m_playBin, GST_STATE_NULL); 1447 gst_element_set_state(m_playBin, GST_STATE_PAUSED); 1448 } 1449 } 1416 1450 } 1417 1451 … … 1643 1677 } 1644 1678 1679 MediaPlayer::MovieLoadType MediaPlayerPrivateGStreamer::movieLoadType() const 1680 { 1681 if (m_readyState == MediaPlayer::HaveNothing) 1682 return MediaPlayer::Unknown; 1683 1684 if (isLiveStream()) 1685 return MediaPlayer::LiveStream; 1686 1687 return MediaPlayer::Download; 1688 } 1689 1645 1690 void MediaPlayerPrivateGStreamer::setPreload(MediaPlayer::Preload preload) 1646 1691 { 1692 m_originalPreloadWasAutoAndWasOverridden = m_preload != preload && m_preload == MediaPlayer::Auto; 1693 1694 m_preload = preload; 1695 1647 1696 ASSERT(m_playBin); 1648 1649 m_preload = preload;1650 1697 1651 1698 GstPlayFlags flags; 1652 1699 g_object_get(m_playBin, "flags", &flags, NULL); 1653 if (preload == MediaPlayer::None) 1700 if (m_preload == MediaPlayer::Auto) { 1701 LOG_VERBOSE(Media, "Enabling on-disk buffering"); 1702 g_object_set(m_playBin, "flags", flags | GST_PLAY_FLAG_DOWNLOAD, NULL); 1703 } else { 1704 LOG_VERBOSE(Media, "Disabling on-disk buffering"); 1654 1705 g_object_set(m_playBin, "flags", flags & ~GST_PLAY_FLAG_DOWNLOAD, NULL); 1655 else 1656 g_object_set(m_playBin, "flags", flags | GST_PLAY_FLAG_DOWNLOAD, NULL); 1706 } 1657 1707 1658 1708 if (m_delayingLoad && m_preload != MediaPlayer::None) { -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
r123747 r124217 125 125 unsigned videoDecodedByteCount() const; 126 126 127 MediaPlayer::MovieLoadType movieLoadType() const; 128 127 129 private: 128 130 MediaPlayerPrivateGStreamer(MediaPlayer*); … … 152 154 153 155 virtual String engineDescription() const { return "GStreamer"; } 156 bool isLiveStream() const { return m_isStreaming; } 154 157 155 158 private: … … 196 199 guint m_videoTimerHandler; 197 200 GRefPtr<GstElement> m_webkitAudioSink; 201 mutable long m_totalBytes; 198 202 GRefPtr<GstPad> m_videoSinkPad; 199 203 mutable IntSize m_videoSize; 204 KURL m_url; 205 bool m_originalPreloadWasAutoAndWasOverridden; 200 206 }; 201 207 }
Note: See TracChangeset
for help on using the changeset viewer.