Changeset 254507 in webkit
- Timestamp:
- Jan 14, 2020 6:49:40 AM (4 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r254506 r254507 1 2020-01-14 Philippe Normand <pnormand@igalia.com> 2 3 [GStreamer] improve video rendering stats 4 https://bugs.webkit.org/show_bug.cgi?id=143827 5 6 Reviewed by Xabier Rodriguez-Calvar. 7 8 Enable fpsdisplaysink unconditionally for statistics retrieval. If 9 GStreamer 1.18 (current git master is 1.17) is detected at runtime 10 we can simply use the new basesink `stats` property, so proxy it 11 in our custom GL sink. The ENABLE(MEDIA_STATISTICS) feature seems 12 to have been deprecated in favor of the 13 HTMLVideoElement.getVideoPlaybackQuality() interface so remove the 14 unused corresponding MediaPlayerPrivate method overrides. 15 16 * platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp: 17 (webKitGLVideoSinkGetProperty): 18 (webkit_gl_video_sink_class_init): 19 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: 20 (WebCore::MediaPlayerPrivateGStreamer::createVideoSink): 21 (WebCore::MediaPlayerPrivateGStreamer::videoPlaybackQualityMetrics): 22 (WebCore::MediaPlayerPrivateGStreamer::decodedFrameCount const): Deleted. 23 (WebCore::MediaPlayerPrivateGStreamer::droppedFrameCount const): Deleted. 24 (WebCore::MediaPlayerPrivateGStreamer::audioDecodedByteCount const): Deleted. 25 (WebCore::MediaPlayerPrivateGStreamer::videoDecodedByteCount const): Deleted. 26 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: 27 1 28 2020-01-14 Carlos Alberto Lopez Perez <clopez@igalia.com> 2 29 -
trunk/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp
r254064 r254507 59 59 using namespace WebCore; 60 60 61 enum { 62 PROP_0, 63 PROP_STATS, 64 PROP_LAST 65 }; 66 61 67 struct _WebKitGLVideoSinkPrivate { 62 68 GRefPtr<GstElement> appSink; … … 292 298 } 293 299 300 static void webKitGLVideoSinkGetProperty(GObject* object, guint propertyId, GValue* value, GParamSpec* paramSpec) 301 { 302 WebKitGLVideoSink* sink = WEBKIT_GL_VIDEO_SINK(object); 303 304 switch (propertyId) { 305 case PROP_STATS: 306 if (webkitGstCheckVersion(1, 17, 0)) { 307 GUniqueOutPtr<GstStructure> stats; 308 g_object_get(sink->priv->appSink.get(), "stats", &stats.outPtr(), nullptr); 309 gst_value_set_structure(value, stats.get()); 310 } 311 break; 312 default: 313 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propertyId, paramSpec); 314 RELEASE_ASSERT_NOT_REACHED(); 315 break; 316 } 317 } 318 294 319 static void webkit_gl_video_sink_class_init(WebKitGLVideoSinkClass* klass) 295 320 { … … 299 324 objectClass->constructed = webKitGLVideoSinkConstructed; 300 325 objectClass->finalize = webKitGLVideoSinkFinalize; 326 objectClass->get_property = webKitGLVideoSinkGetProperty; 301 327 302 328 gst_element_class_add_pad_template(elementClass, gst_static_pad_template_get(&sinkTemplate)); 303 329 gst_element_class_set_static_metadata(elementClass, "WebKit GL video sink", "Sink/Video", "Renders video", "Philippe Normand <philn@igalia.com>"); 330 331 g_object_class_install_property(objectClass, PROP_STATS, g_param_spec_boxed("stats", "Statistics", 332 "Sink Statistics", GST_TYPE_STRUCTURE, static_cast<GParamFlags>(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); 304 333 305 334 elementClass->change_state = GST_DEBUG_FUNCPTR(webKitGLVideoSinkChangeState); -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
r254503 r254507 3503 3503 3504 3504 GstElement* videoSink = nullptr; 3505 #if ENABLE(MEDIA_STATISTICS) 3506 m_fpsSink = gst_element_factory_make("fpsdisplaysink", "sink");3507 if (m_fpsSink) {3508 g_object_set(m_fpsSink.get(), "silent", TRUE , nullptr);3509 3510 // Turn off text overlay unless tracing is enabled.3511 if (gst_debug_category_get_threshold(webkit_media_player_debug) < GST_LEVEL_TRACE)3512 g_object_set(m_fpsSink.get(), "text-overlay", FALSE , nullptr);3513 3514 if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_fpsSink.get()), "video-sink")) {3515 g_object_set(m_fpsSink.get(), "video-sink", m_videoSink.get(), nullptr);3516 videoSink = m_fpsSink.get();3517 } else3518 m_fpsSink = nullptr;3519 }3520 #endif 3505 if (!webkitGstCheckVersion(1, 17, 0)) { 3506 m_fpsSink = gst_element_factory_make("fpsdisplaysink", "sink"); 3507 if (m_fpsSink) { 3508 g_object_set(m_fpsSink.get(), "silent", TRUE , nullptr); 3509 3510 // Turn off text overlay unless tracing is enabled. 3511 if (gst_debug_category_get_threshold(webkit_media_player_debug) < GST_LEVEL_TRACE) 3512 g_object_set(m_fpsSink.get(), "text-overlay", FALSE , nullptr); 3513 3514 if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_fpsSink.get()), "video-sink")) { 3515 g_object_set(m_fpsSink.get(), "video-sink", m_videoSink.get(), nullptr); 3516 videoSink = m_fpsSink.get(); 3517 } else 3518 m_fpsSink = nullptr; 3519 } 3520 } 3521 3521 3522 3522 if (!m_fpsSink) … … 3524 3524 3525 3525 ASSERT(videoSink); 3526 3527 3526 return videoSink; 3528 3527 } … … 3548 3547 } 3549 3548 3550 unsigned MediaPlayerPrivateGStreamer::decodedFrameCount() const 3551 { 3552 uint64_t decodedFrames = 0; 3553 if (m_fpsSink) 3554 g_object_get(m_fpsSink.get(), "frames-rendered", &decodedFrames, nullptr); 3555 return static_cast<unsigned>(decodedFrames); 3556 } 3557 3558 unsigned MediaPlayerPrivateGStreamer::droppedFrameCount() const 3559 { 3560 uint64_t framesDropped = 0; 3561 if (m_fpsSink) 3562 g_object_get(m_fpsSink.get(), "frames-dropped", &framesDropped, nullptr); 3563 return static_cast<unsigned>(framesDropped); 3564 } 3565 3566 unsigned MediaPlayerPrivateGStreamer::audioDecodedByteCount() const 3567 { 3568 GstQuery* query = gst_query_new_position(GST_FORMAT_BYTES); 3569 gint64 position = 0; 3570 3571 if (audioSink() && gst_element_query(audioSink(), query)) 3572 gst_query_parse_position(query, 0, &position); 3573 3574 gst_query_unref(query); 3575 return static_cast<unsigned>(position); 3576 } 3577 3578 unsigned MediaPlayerPrivateGStreamer::videoDecodedByteCount() const 3579 { 3580 GstQuery* query = gst_query_new_position(GST_FORMAT_BYTES); 3581 gint64 position = 0; 3582 3583 if (gst_element_query(m_videoSink.get(), query)) 3584 gst_query_parse_position(query, 0, &position); 3585 3586 gst_query_unref(query); 3587 return static_cast<unsigned>(position); 3549 Optional<VideoPlaybackQualityMetrics> MediaPlayerPrivateGStreamer::videoPlaybackQualityMetrics() 3550 { 3551 if (!webkitGstCheckVersion(1, 17, 0) && !m_fpsSink) 3552 return WTF::nullopt; 3553 3554 uint64_t totalVideoFrames = 0; 3555 uint64_t droppedVideoFrames = 0; 3556 if (webkitGstCheckVersion(1, 17, 0)) { 3557 GUniqueOutPtr<GstStructure> stats; 3558 g_object_get(m_videoSink.get(), "stats", &stats.outPtr(), nullptr); 3559 3560 if (!gst_structure_get_uint64(stats.get(), "rendered", &totalVideoFrames)) 3561 return WTF::nullopt; 3562 3563 if (!gst_structure_get_uint64(stats.get(), "dropped", &droppedVideoFrames)) 3564 return WTF::nullopt; 3565 } else if (m_fpsSink) { 3566 unsigned renderedFrames, droppedFrames; 3567 g_object_get(m_fpsSink.get(), "frames-rendered", &renderedFrames, "frames-dropped", &droppedFrames, nullptr); 3568 totalVideoFrames = renderedFrames; 3569 droppedVideoFrames = droppedFrames; 3570 } 3571 3572 uint32_t corruptedVideoFrames = 0; 3573 double totalFrameDelay = 0; 3574 uint32_t displayCompositedVideoFrames = 0; 3575 return VideoPlaybackQualityMetrics { 3576 static_cast<uint32_t>(totalVideoFrames), 3577 static_cast<uint32_t>(droppedVideoFrames), 3578 corruptedVideoFrames, 3579 totalFrameDelay, 3580 displayCompositedVideoFrames, 3581 }; 3588 3582 } 3589 3583 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
r254214 r254507 182 182 MediaPlayer::MovieLoadType movieLoadType() const final; 183 183 184 unsigned decodedFrameCount() const final; 185 unsigned droppedFrameCount() const final; 186 unsigned audioDecodedByteCount() const final; 187 unsigned videoDecodedByteCount() const final; 188 184 Optional<VideoPlaybackQualityMetrics> videoPlaybackQualityMetrics() final; 189 185 void acceleratedRenderingStateChanged() final; 190 186
Note: See TracChangeset
for help on using the changeset viewer.