Changeset 254565 in webkit
- Timestamp:
- Jan 15, 2020, 6:40:01 AM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
-
ChangeLog (modified) (1 diff)
-
platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r254564 r254565 1 2020-01-15 Thibault Saunier <tsaunier@igalia.com> 2 3 [GStreamer] Several buffering fixes 4 https://bugs.webkit.org/show_bug.cgi?id=206234 5 6 Reviewed by Xabier Rodriguez-Calvar. 7 8 No new tests as this is already tested. 9 10 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: 11 (WebCore::MediaPlayerPrivateGStreamer::durationChanged): Minor typo fix 12 (WebCore::MediaPlayerPrivateGStreamer::fillTimerFired): Query buffering on the pipeline not the source 13 otherwise GstBaseSrc returns some useless values before `downloadbuffer` actually gives us the 14 info about DOWNLOAD buffering status. Also ignores response if they are not in DOWNLOAD mode as those 15 will end up screwing our buffering management algorithm. 16 (WebCore::MediaPlayerPrivateGStreamer::handleMessage): 17 - Detect when DOWNLOAD is done by using the `downloadbuffer` `GstCacheDownloadComplete` 18 element message which is what is supposed to be used for that purpose. 19 - Fix the way we detect that buffering is done (mostly when using a `downloadbuffer`) by relying on a 20 buffering query to check if it is still buffering. 21 (WebCore::MediaPlayerPrivateGStreamer::updateBufferingStatus): Ensure that we properly pause the pipeline when 22 restarting buffering. There were cases when not using `downloadbuffer` where we didn't pause the pipeline 23 leading to pretty bad user experience. 24 (WebCore::MediaPlayerPrivateGStreamer::updateStates): Buffering should happen only on **non live** pipelines. 25 1 26 2020-01-15 youenn fablet <youenn@apple.com> 2 27 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
r254507 r254565 1054 1054 m_cachedDuration = MediaTime::invalidTime(); 1055 1055 1056 // Avoid emit ing durationchanged in the case where the previous1056 // Avoid emitting durationChanged in the case where the previous 1057 1057 // duration was 0 because that case is already handled by the 1058 1058 // HTMLMediaElement. … … 1457 1457 GstBufferingMode mode = GST_BUFFERING_DOWNLOAD; 1458 1458 1459 if (gst_element_query( m_source.get(), query.get())) {1459 if (gst_element_query(pipeline(), query.get())) { 1460 1460 gst_query_parse_buffering_stats(query.get(), &mode, nullptr, nullptr, nullptr); 1461 1461 … … 1471 1471 } 1472 1472 1473 updateBufferingStatus(mode, fillStatus); 1473 if (mode != GST_BUFFERING_DOWNLOAD) 1474 GST_INFO_OBJECT(pipeline(), "Ignoring buffering in %s", enumToString(GST_TYPE_BUFFERING_MODE, mode).data()); 1475 else 1476 updateBufferingStatus(mode, fillStatus); 1474 1477 } 1475 1478 … … 2199 2202 m_hasTaintedOrigin = webKitSrcWouldTaintOrigin(WEBKIT_WEB_SRC_CAST(m_source.get()), SecurityOrigin::create(URL(URL(), uri))); 2200 2203 } 2204 } else if (gst_structure_has_name(structure, "GstCacheDownloadComplete")) { 2205 GST_INFO_OBJECT(pipeline(), "Stream is fully downloaded, stopping monitoring downloading progress."); 2206 m_fillTimer.stop(); 2207 m_bufferingPercentage = 100; 2208 updateStates(); 2201 2209 } else 2202 2210 GST_DEBUG_OBJECT(pipeline(), "Unhandled element message: %" GST_PTR_FORMAT, structure); … … 2293 2301 void MediaPlayerPrivateGStreamer::updateBufferingStatus(GstBufferingMode mode, double percentage) 2294 2302 { 2303 bool wasBuffering = m_isBuffering; 2304 2295 2305 GST_DEBUG_OBJECT(pipeline(), "[Buffering] mode: %s, status: %f%%", enumToString(GST_TYPE_BUFFERING_MODE, mode).data(), percentage); 2296 2306 … … 2298 2308 m_isBuffering = !m_didDownloadFinish; 2299 2309 2310 if (!m_didDownloadFinish) 2311 m_isBuffering = true; 2312 2313 m_bufferingPercentage = percentage; 2300 2314 switch (mode) { 2301 2315 case GST_BUFFERING_STREAM: { … … 2303 2317 2304 2318 m_bufferingPercentage = percentage; 2305 if (m_didDownloadFinish )2319 if (m_didDownloadFinish || (!wasBuffering && m_isBuffering)) 2306 2320 updateStates(); 2307 2321 … … 2310 2324 case GST_BUFFERING_DOWNLOAD: { 2311 2325 updateMaxTimeLoaded(percentage); 2312 2313 // Media is now fully loaded. It will play even if network connection is2314 // cut. Buffering is done, remove the fill source from the main loop.2315 if (m_didDownloadFinish)2316 m_fillTimer.stop();2317 2318 2326 updateStates(); 2319 2327 break; … … 2578 2586 case GST_STATE_PLAYING: 2579 2587 if (m_isBuffering) { 2580 if (m_bufferingPercentage == 100) { 2581 GST_DEBUG_OBJECT(pipeline(), "[Buffering] Complete."); 2582 m_isBuffering = false; 2588 GRefPtr<GstQuery> query = adoptGRef(gst_query_new_buffering(GST_FORMAT_PERCENT)); 2589 2590 m_isBuffering = m_bufferingPercentage == 100; 2591 if (gst_element_query(m_pipeline.get(), query.get())) { 2592 gboolean isBuffering = m_isBuffering; 2593 gst_query_parse_buffering_percent(query.get(), &isBuffering, nullptr); 2594 m_isBuffering = isBuffering; 2595 } 2596 2597 if (!m_isBuffering) { 2598 GST_INFO_OBJECT(pipeline(), "[Buffering] Complete."); 2583 2599 m_readyState = MediaPlayer::ReadyState::HaveEnoughData; 2584 2600 m_networkState = m_didDownloadFinish ? MediaPlayer::NetworkState::Idle : MediaPlayer::NetworkState::Loading; … … 2610 2626 2611 2627 if (didBuffering && !m_isBuffering && !m_isPaused && m_playbackRate) { 2612 GST_ DEBUG_OBJECT(pipeline(), "[Buffering] Restarting playback.");2628 GST_INFO_OBJECT(pipeline(), "[Buffering] Restarting playback."); 2613 2629 changePipelineState(GST_STATE_PLAYING); 2614 2630 } … … 2617 2633 2618 2634 if ((m_isBuffering && !m_isLiveStream) || !m_playbackRate) { 2619 GST_ DEBUG_OBJECT(pipeline(), "[Buffering] Pausing stream for buffering.");2635 GST_INFO_OBJECT(pipeline(), "[Buffering] Pausing stream for buffering."); 2620 2636 changePipelineState(GST_STATE_PAUSED); 2621 2637 }
Note:
See TracChangeset
for help on using the changeset viewer.