Title: [254507] trunk/Source/WebCore
Revision
254507
Author
ph...@webkit.org
Date
2020-01-14 06:49:40 -0800 (Tue, 14 Jan 2020)

Log Message

[GStreamer] improve video rendering stats
https://bugs.webkit.org/show_bug.cgi?id=143827

Reviewed by Xabier Rodriguez-Calvar.

Enable fpsdisplaysink unconditionally for statistics retrieval. If
GStreamer 1.18 (current git master is 1.17) is detected at runtime
we can simply use the new basesink `stats` property, so proxy it
in our custom GL sink. The ENABLE(MEDIA_STATISTICS) feature seems
to have been deprecated in favor of the
HTMLVideoElement.getVideoPlaybackQuality() interface so remove the
unused corresponding MediaPlayerPrivate method overrides.

* platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp:
(webKitGLVideoSinkGetProperty):
(webkit_gl_video_sink_class_init):
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::createVideoSink):
(WebCore::MediaPlayerPrivateGStreamer::videoPlaybackQualityMetrics):
(WebCore::MediaPlayerPrivateGStreamer::decodedFrameCount const): Deleted.
(WebCore::MediaPlayerPrivateGStreamer::droppedFrameCount const): Deleted.
(WebCore::MediaPlayerPrivateGStreamer::audioDecodedByteCount const): Deleted.
(WebCore::MediaPlayerPrivateGStreamer::videoDecodedByteCount const): Deleted.
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (254506 => 254507)


--- trunk/Source/WebCore/ChangeLog	2020-01-14 14:40:12 UTC (rev 254506)
+++ trunk/Source/WebCore/ChangeLog	2020-01-14 14:49:40 UTC (rev 254507)
@@ -1,3 +1,30 @@
+2020-01-14  Philippe Normand  <pnorm...@igalia.com>
+
+        [GStreamer] improve video rendering stats
+        https://bugs.webkit.org/show_bug.cgi?id=143827
+
+        Reviewed by Xabier Rodriguez-Calvar.
+
+        Enable fpsdisplaysink unconditionally for statistics retrieval. If
+        GStreamer 1.18 (current git master is 1.17) is detected at runtime
+        we can simply use the new basesink `stats` property, so proxy it
+        in our custom GL sink. The ENABLE(MEDIA_STATISTICS) feature seems
+        to have been deprecated in favor of the
+        HTMLVideoElement.getVideoPlaybackQuality() interface so remove the
+        unused corresponding MediaPlayerPrivate method overrides.
+
+        * platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp:
+        (webKitGLVideoSinkGetProperty):
+        (webkit_gl_video_sink_class_init):
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+        (WebCore::MediaPlayerPrivateGStreamer::createVideoSink):
+        (WebCore::MediaPlayerPrivateGStreamer::videoPlaybackQualityMetrics):
+        (WebCore::MediaPlayerPrivateGStreamer::decodedFrameCount const): Deleted.
+        (WebCore::MediaPlayerPrivateGStreamer::droppedFrameCount const): Deleted.
+        (WebCore::MediaPlayerPrivateGStreamer::audioDecodedByteCount const): Deleted.
+        (WebCore::MediaPlayerPrivateGStreamer::videoDecodedByteCount const): Deleted.
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
+
 2020-01-14  Carlos Alberto Lopez Perez  <clo...@igalia.com>
 
         [Freetype] Support for the -webkit-font-smoothing CSS property

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp (254506 => 254507)


--- trunk/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp	2020-01-14 14:40:12 UTC (rev 254506)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp	2020-01-14 14:49:40 UTC (rev 254507)
@@ -58,6 +58,12 @@
 
 using namespace WebCore;
 
+enum {
+    PROP_0,
+    PROP_STATS,
+    PROP_LAST
+};
+
 struct _WebKitGLVideoSinkPrivate {
     GRefPtr<GstElement> appSink;
     GRefPtr<GstGLContext> glContext;
@@ -291,6 +297,25 @@
     return GST_ELEMENT_CLASS(parent_class)->change_state(element, transition);
 }
 
+static void webKitGLVideoSinkGetProperty(GObject* object, guint propertyId, GValue* value, GParamSpec* paramSpec)
+{
+    WebKitGLVideoSink* sink = WEBKIT_GL_VIDEO_SINK(object);
+
+    switch (propertyId) {
+    case PROP_STATS:
+        if (webkitGstCheckVersion(1, 17, 0)) {
+            GUniqueOutPtr<GstStructure> stats;
+            g_object_get(sink->priv->appSink.get(), "stats", &stats.outPtr(), nullptr);
+            gst_value_set_structure(value, stats.get());
+        }
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propertyId, paramSpec);
+        RELEASE_ASSERT_NOT_REACHED();
+        break;
+    }
+}
+
 static void webkit_gl_video_sink_class_init(WebKitGLVideoSinkClass* klass)
 {
     GObjectClass* objectClass = G_OBJECT_CLASS(klass);
@@ -298,10 +323,14 @@
 
     objectClass->constructed = webKitGLVideoSinkConstructed;
     objectClass->finalize = webKitGLVideoSinkFinalize;
+    objectClass->get_property = webKitGLVideoSinkGetProperty;
 
     gst_element_class_add_pad_template(elementClass, gst_static_pad_template_get(&sinkTemplate));
     gst_element_class_set_static_metadata(elementClass, "WebKit GL video sink", "Sink/Video", "Renders video", "Philippe Normand <ph...@igalia.com>");
 
+    g_object_class_install_property(objectClass, PROP_STATS, g_param_spec_boxed("stats", "Statistics",
+        "Sink Statistics", GST_TYPE_STRUCTURE, static_cast<GParamFlags>(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)));
+
     elementClass->change_state = GST_DEBUG_FUNCPTR(webKitGLVideoSinkChangeState);
 }
 

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (254506 => 254507)


--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp	2020-01-14 14:40:12 UTC (rev 254506)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp	2020-01-14 14:49:40 UTC (rev 254507)
@@ -3502,28 +3502,27 @@
     }
 
     GstElement* videoSink = nullptr;
-#if ENABLE(MEDIA_STATISTICS)
-    m_fpsSink = gst_element_factory_make("fpsdisplaysink", "sink");
-    if (m_fpsSink) {
-        g_object_set(m_fpsSink.get(), "silent", TRUE , nullptr);
+    if (!webkitGstCheckVersion(1, 17, 0)) {
+        m_fpsSink = gst_element_factory_make("fpsdisplaysink", "sink");
+        if (m_fpsSink) {
+            g_object_set(m_fpsSink.get(), "silent", TRUE , nullptr);
 
-        // Turn off text overlay unless tracing is enabled.
-        if (gst_debug_category_get_threshold(webkit_media_player_debug) < GST_LEVEL_TRACE)
-            g_object_set(m_fpsSink.get(), "text-overlay", FALSE , nullptr);
+            // Turn off text overlay unless tracing is enabled.
+            if (gst_debug_category_get_threshold(webkit_media_player_debug) < GST_LEVEL_TRACE)
+                g_object_set(m_fpsSink.get(), "text-overlay", FALSE , nullptr);
 
-        if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_fpsSink.get()), "video-sink")) {
-            g_object_set(m_fpsSink.get(), "video-sink", m_videoSink.get(), nullptr);
-            videoSink = m_fpsSink.get();
-        } else
-            m_fpsSink = nullptr;
+            if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_fpsSink.get()), "video-sink")) {
+                g_object_set(m_fpsSink.get(), "video-sink", m_videoSink.get(), nullptr);
+                videoSink = m_fpsSink.get();
+            } else
+                m_fpsSink = nullptr;
+        }
     }
-#endif
 
     if (!m_fpsSink)
         videoSink = m_videoSink.get();
 
     ASSERT(videoSink);
-
     return videoSink;
 }
 
@@ -3547,46 +3546,41 @@
     g_signal_connect_swapped(m_volumeElement.get(), "notify::mute", G_CALLBACK(muteChangedCallback), this);
 }
 
-unsigned MediaPlayerPrivateGStreamer::decodedFrameCount() const
+Optional<VideoPlaybackQualityMetrics> MediaPlayerPrivateGStreamer::videoPlaybackQualityMetrics()
 {
-    uint64_t decodedFrames = 0;
-    if (m_fpsSink)
-        g_object_get(m_fpsSink.get(), "frames-rendered", &decodedFrames, nullptr);
-    return static_cast<unsigned>(decodedFrames);
-}
+    if (!webkitGstCheckVersion(1, 17, 0) && !m_fpsSink)
+        return WTF::nullopt;
 
-unsigned MediaPlayerPrivateGStreamer::droppedFrameCount() const
-{
-    uint64_t framesDropped = 0;
-    if (m_fpsSink)
-        g_object_get(m_fpsSink.get(), "frames-dropped", &framesDropped, nullptr);
-    return static_cast<unsigned>(framesDropped);
-}
+    uint64_t totalVideoFrames = 0;
+    uint64_t droppedVideoFrames = 0;
+    if (webkitGstCheckVersion(1, 17, 0)) {
+        GUniqueOutPtr<GstStructure> stats;
+        g_object_get(m_videoSink.get(), "stats", &stats.outPtr(), nullptr);
 
-unsigned MediaPlayerPrivateGStreamer::audioDecodedByteCount() const
-{
-    GstQuery* query = gst_query_new_position(GST_FORMAT_BYTES);
-    gint64 position = 0;
+        if (!gst_structure_get_uint64(stats.get(), "rendered", &totalVideoFrames))
+            return WTF::nullopt;
 
-    if (audioSink() && gst_element_query(audioSink(), query))
-        gst_query_parse_position(query, 0, &position);
+        if (!gst_structure_get_uint64(stats.get(), "dropped", &droppedVideoFrames))
+            return WTF::nullopt;
+    } else if (m_fpsSink) {
+        unsigned renderedFrames, droppedFrames;
+        g_object_get(m_fpsSink.get(), "frames-rendered", &renderedFrames, "frames-dropped", &droppedFrames, nullptr);
+        totalVideoFrames = renderedFrames;
+        droppedVideoFrames = droppedFrames;
+    }
 
-    gst_query_unref(query);
-    return static_cast<unsigned>(position);
+    uint32_t corruptedVideoFrames = 0;
+    double totalFrameDelay = 0;
+    uint32_t displayCompositedVideoFrames = 0;
+    return VideoPlaybackQualityMetrics {
+        static_cast<uint32_t>(totalVideoFrames),
+        static_cast<uint32_t>(droppedVideoFrames),
+        corruptedVideoFrames,
+        totalFrameDelay,
+        displayCompositedVideoFrames,
+    };
 }
 
-unsigned MediaPlayerPrivateGStreamer::videoDecodedByteCount() const
-{
-    GstQuery* query = gst_query_new_position(GST_FORMAT_BYTES);
-    gint64 position = 0;
-
-    if (gst_element_query(m_videoSink.get(), query))
-        gst_query_parse_position(query, 0, &position);
-
-    gst_query_unref(query);
-    return static_cast<unsigned>(position);
-}
-
 #if ENABLE(ENCRYPTED_MEDIA)
 void MediaPlayerPrivateGStreamer::initializationDataEncountered(InitData&& initData)
 {

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h (254506 => 254507)


--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h	2020-01-14 14:40:12 UTC (rev 254506)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h	2020-01-14 14:49:40 UTC (rev 254507)
@@ -181,11 +181,7 @@
     bool supportsFullscreen() const final;
     MediaPlayer::MovieLoadType movieLoadType() const final;
 
-    unsigned decodedFrameCount() const final;
-    unsigned droppedFrameCount() const final;
-    unsigned audioDecodedByteCount() const final;
-    unsigned videoDecodedByteCount() const final;
-
+    Optional<VideoPlaybackQualityMetrics> videoPlaybackQualityMetrics() final;
     void acceleratedRenderingStateChanged() final;
 
 #if USE(TEXTURE_MAPPER_GL)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to