Changeset 254507 in webkit


Ignore:
Timestamp:
Jan 14, 2020 6:49:40 AM (4 years ago)
Author:
Philippe Normand
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:
Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r254506 r254507  
     12020-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
    1282020-01-14  Carlos Alberto Lopez Perez  <clopez@igalia.com>
    229
  • trunk/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp

    r254064 r254507  
    5959using namespace WebCore;
    6060
     61enum {
     62    PROP_0,
     63    PROP_STATS,
     64    PROP_LAST
     65};
     66
    6167struct _WebKitGLVideoSinkPrivate {
    6268    GRefPtr<GstElement> appSink;
     
    292298}
    293299
     300static 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
    294319static void webkit_gl_video_sink_class_init(WebKitGLVideoSinkClass* klass)
    295320{
     
    299324    objectClass->constructed = webKitGLVideoSinkConstructed;
    300325    objectClass->finalize = webKitGLVideoSinkFinalize;
     326    objectClass->get_property = webKitGLVideoSinkGetProperty;
    301327
    302328    gst_element_class_add_pad_template(elementClass, gst_static_pad_template_get(&sinkTemplate));
    303329    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)));
    304333
    305334    elementClass->change_state = GST_DEBUG_FUNCPTR(webKitGLVideoSinkChangeState);
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp

    r254503 r254507  
    35033503
    35043504    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         } else
    3518             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    }
    35213521
    35223522    if (!m_fpsSink)
     
    35243524
    35253525    ASSERT(videoSink);
    3526 
    35273526    return videoSink;
    35283527}
     
    35483547}
    35493548
    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);
     3549Optional<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    };
    35883582}
    35893583
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h

    r254214 r254507  
    182182    MediaPlayer::MovieLoadType movieLoadType() const final;
    183183
    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;
    189185    void acceleratedRenderingStateChanged() final;
    190186
Note: See TracChangeset for help on using the changeset viewer.