Changeset 207874 in webkit


Ignore:
Timestamp:
Oct 26, 2016 1:37:08 AM (7 years ago)
Author:
eocanha@igalia.com
Message:

[GStreamer] Drain query support
https://bugs.webkit.org/show_bug.cgi?id=162872

Reviewed by Žan Doberšek.

Under some circumstances, GStreamer deadlocks completely during MSE seeks on OpenGL ES
systems. This is because the video sink still holds samples. Proper DRAIN support
fixes this issue and is also good for all the platforms, not only OpenGL ES.

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp:

(WebCore::MediaPlayerPrivateGStreamerBase::triggerDrain):
(WebCore::MediaPlayerPrivateGStreamerBase::drainCallback):
(WebCore::MediaPlayerPrivateGStreamerBase::createVideoSink):
(WebCore::MediaPlayerPrivateGStreamerBase::createVideoSinkGL): Deleted.

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h:
  • platform/graphics/gstreamer/VideoSinkGStreamer.cpp:

(VideoRenderRequestScheduler::drain):
(webkitVideoSinkQuery):
(webkitVideoSinkEvent):
(webkit_video_sink_class_init):
(VideoRenderRequestScheduler::stop): Deleted.
(webkitVideoSinkProposeAllocation): Deleted.

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r207873 r207874  
     12016-10-26  Enrique Ocaña González  <eocanha@igalia.com>
     2
     3        [GStreamer] Drain query support
     4        https://bugs.webkit.org/show_bug.cgi?id=162872
     5
     6        Reviewed by Žan Doberšek.
     7
     8        Under some circumstances, GStreamer deadlocks completely during MSE seeks on OpenGL ES
     9        systems. This is because the video sink still holds samples. Proper DRAIN support
     10        fixes this issue and is also good for all the platforms, not only OpenGL ES.
     11
     12        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp:
     13        (WebCore::MediaPlayerPrivateGStreamerBase::triggerDrain):
     14        (WebCore::MediaPlayerPrivateGStreamerBase::drainCallback):
     15        (WebCore::MediaPlayerPrivateGStreamerBase::createVideoSink):
     16        (WebCore::MediaPlayerPrivateGStreamerBase::createVideoSinkGL): Deleted.
     17        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h:
     18        * platform/graphics/gstreamer/VideoSinkGStreamer.cpp:
     19        (VideoRenderRequestScheduler::drain):
     20        (webkitVideoSinkQuery):
     21        (webkitVideoSinkEvent):
     22        (webkit_video_sink_class_init):
     23        (VideoRenderRequestScheduler::stop): Deleted.
     24        (webkitVideoSinkProposeAllocation): Deleted.
     25
    1262016-10-26  Enrique Ocaña González  <eocanha@igalia.com>
    227
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp

    r207666 r207874  
    629629}
    630630
     631void MediaPlayerPrivateGStreamerBase::triggerDrain()
     632{
     633    WTF::GMutexLocker<GMutex> lock(m_sampleMutex);
     634    m_videoSize = FloatSize();
     635    m_sample = nullptr;
     636}
     637
    631638void MediaPlayerPrivateGStreamerBase::repaintCallback(MediaPlayerPrivateGStreamerBase* player, GstSample* sample)
    632639{
    633640    player->triggerRepaint(sample);
     641}
     642
     643void MediaPlayerPrivateGStreamerBase::drainCallback(MediaPlayerPrivateGStreamerBase* player)
     644{
     645    player->triggerDrain();
    634646}
    635647
     
    968980        m_videoSink = webkitVideoSinkNew();
    969981        g_signal_connect_swapped(m_videoSink.get(), "repaint-requested", G_CALLBACK(repaintCallback), this);
     982        g_signal_connect_swapped(m_videoSink.get(), "drain", G_CALLBACK(drainCallback), this);
    970983    }
    971984
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h

    r207666 r207874  
    151151    virtual bool handleSyncMessage(GstMessage*);
    152152
     153    void triggerDrain();
     154
    153155    void triggerRepaint(GstSample*);
    154156    void repaint();
    155157
     158    static void drainCallback(MediaPlayerPrivateGStreamerBase*);
    156159    static void repaintCallback(MediaPlayerPrivateGStreamerBase*, GstSample*);
    157160
  • trunk/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp

    r205180 r207874  
    22 *  Copyright (C) 2007 OpenedHand
    33 *  Copyright (C) 2007 Alp Toker <alp@atoker.com>
    4  *  Copyright (C) 2009, 2010, 2011, 2012 Igalia S.L
     4 *  Copyright (C) 2009, 2010, 2011, 2012, 2015, 2016 Igalia S.L
     5 *  Copyright (C) 2015, 2016 Metrological Group B.V.
    56 *
    67 *  This library is free software; you can redistribute it and/or
     
    5859enum {
    5960    REPAINT_REQUESTED,
     61    DRAIN,
    6062    LAST_SIGNAL
    6163};
     
    9496        m_dataCondition.notifyOne();
    9597#endif
     98    }
     99
     100    void drain()
     101    {
     102        LockHolder locker(m_sampleMutex);
     103        m_sample = nullptr;
    96104    }
    97105
     
    348356}
    349357
     358static gboolean webkitVideoSinkQuery(GstBaseSink* baseSink, GstQuery* query)
     359{
     360    WebKitVideoSink* sink = WEBKIT_VIDEO_SINK(baseSink);
     361
     362    switch (GST_QUERY_TYPE(query)) {
     363    case GST_QUERY_DRAIN:
     364        GST_OBJECT_LOCK(sink);
     365        g_signal_emit(sink, webkitVideoSinkSignals[DRAIN], 0);
     366        GST_OBJECT_UNLOCK(sink);
     367        return TRUE;
     368    default:
     369        return GST_CALL_PARENT_WITH_DEFAULT(GST_BASE_SINK_CLASS, query, (baseSink, query), TRUE);
     370    }
     371}
     372
     373static gboolean webkitVideoSinkEvent(GstBaseSink* baseSink, GstEvent* event)
     374{
     375    switch (GST_EVENT_TYPE(event)) {
     376    case GST_EVENT_FLUSH_START: {
     377        WebKitVideoSink* sink = WEBKIT_VIDEO_SINK(baseSink);
     378        sink->priv->scheduler.drain();
     379
     380        GST_DEBUG_OBJECT(sink, "Flush-start, emitting DRAIN signal and releasing m_sample");
     381
     382        GST_OBJECT_LOCK(sink);
     383        g_signal_emit(sink, webkitVideoSinkSignals[DRAIN], 0);
     384        GST_OBJECT_UNLOCK(sink);
     385        }
     386        FALLTHROUGH;
     387    default:
     388        return GST_CALL_PARENT_WITH_DEFAULT(GST_BASE_SINK_CLASS, event, (baseSink, event), TRUE);
     389    }
     390}
     391
    350392static void webkit_video_sink_class_init(WebKitVideoSinkClass* klass)
    351393{
     
    369411    baseSinkClass->set_caps = webkitVideoSinkSetCaps;
    370412    baseSinkClass->propose_allocation = webkitVideoSinkProposeAllocation;
     413    baseSinkClass->query = webkitVideoSinkQuery;
     414    baseSinkClass->event = webkitVideoSinkEvent;
    371415
    372416    webkitVideoSinkSignals[REPAINT_REQUESTED] = g_signal_new("repaint-requested",
     
    380424            1, // Only one parameter
    381425            GST_TYPE_SAMPLE);
     426
     427    webkitVideoSinkSignals[DRAIN] = g_signal_new("drain",
     428        G_TYPE_FROM_CLASS(klass),
     429        static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
     430        0, // Class offset.
     431        0, // Accumulator.
     432        0, // Accumulator data.
     433        g_cclosure_marshal_generic,
     434        G_TYPE_NONE, // Return type.
     435        0); // No parameters.
    382436}
    383437
Note: See TracChangeset for help on using the changeset viewer.