Title: [192101] trunk/Source/WebCore
Revision
192101
Author
[email protected]
Date
2015-11-06 06:17:19 -0800 (Fri, 06 Nov 2015)

Log Message

[GStreamer] Use MainThreadNotifier to send notifications to main thread in TrackPrivateGStreamer
https://bugs.webkit.org/show_bug.cgi?id=150889

Reviewed by Žan Doberšek.

Instead of the GThreadSafeMainLoopSources.

* platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp:
(WebCore::InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer):
(WebCore::InbandTextTrackPrivateGStreamer::handleSample):
(WebCore::InbandTextTrackPrivateGStreamer::streamChanged):
* platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h:
* platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp:
(WebCore::TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer):
(WebCore::TrackPrivateBaseGStreamer::disconnect):
(WebCore::TrackPrivateBaseGStreamer::activeChangedCallback):
(WebCore::TrackPrivateBaseGStreamer::tagsChangedCallback):
(WebCore::TrackPrivateBaseGStreamer::tagsChanged):
(WebCore::TrackPrivateBaseGStreamer::~TrackPrivateBaseGStreamer): Deleted.
(WebCore::TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged): Deleted.
* platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (192100 => 192101)


--- trunk/Source/WebCore/ChangeLog	2015-11-06 13:07:32 UTC (rev 192100)
+++ trunk/Source/WebCore/ChangeLog	2015-11-06 14:17:19 UTC (rev 192101)
@@ -1,3 +1,27 @@
+2015-11-06  Carlos Garcia Campos  <[email protected]>
+
+        [GStreamer] Use MainThreadNotifier to send notifications to main thread in TrackPrivateGStreamer
+        https://bugs.webkit.org/show_bug.cgi?id=150889
+
+        Reviewed by Žan Doberšek.
+
+        Instead of the GThreadSafeMainLoopSources.
+
+        * platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp:
+        (WebCore::InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer):
+        (WebCore::InbandTextTrackPrivateGStreamer::handleSample):
+        (WebCore::InbandTextTrackPrivateGStreamer::streamChanged):
+        * platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h:
+        * platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp:
+        (WebCore::TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer):
+        (WebCore::TrackPrivateBaseGStreamer::disconnect):
+        (WebCore::TrackPrivateBaseGStreamer::activeChangedCallback):
+        (WebCore::TrackPrivateBaseGStreamer::tagsChangedCallback):
+        (WebCore::TrackPrivateBaseGStreamer::tagsChanged):
+        (WebCore::TrackPrivateBaseGStreamer::~TrackPrivateBaseGStreamer): Deleted.
+        (WebCore::TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged): Deleted.
+        * platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h:
+
 2015-11-06  Csaba Osztrogonác  <[email protected]>
 
         Suppress deprecated-declarations warning in WebCore/platform/URL.cpp

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp (192100 => 192101)


--- trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp	2015-11-06 13:07:32 UTC (rev 192100)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp	2015-11-06 14:17:19 UTC (rev 192101)
@@ -39,24 +39,20 @@
 
 namespace WebCore {
 
-static GstPadProbeReturn textTrackPrivateEventCallback(GstPad*, GstPadProbeInfo* info, InbandTextTrackPrivateGStreamer* track)
-{
-    GstEvent* event = gst_pad_probe_info_get_event(info);
-    switch (GST_EVENT_TYPE(event)) {
-    case GST_EVENT_STREAM_START:
-        track->streamChanged();
-        break;
-    default:
-        break;
-    }
-    return GST_PAD_PROBE_OK;
-}
-
 InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(gint index, GRefPtr<GstPad> pad)
     : InbandTextTrackPrivate(WebVTT), TrackPrivateBaseGStreamer(this, index, pad)
 {
-    m_eventProbe = gst_pad_add_probe(m_pad.get(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
-        reinterpret_cast<GstPadProbeCallback>(textTrackPrivateEventCallback), this, 0);
+    m_eventProbe = gst_pad_add_probe(m_pad.get(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, [] (GstPad*, GstPadProbeInfo* info, gpointer userData) -> GstPadProbeReturn {
+        auto* track = static_cast<InbandTextTrackPrivateGStreamer*>(userData);
+        switch (GST_EVENT_TYPE(gst_pad_probe_info_get_event(info))) {
+        case GST_EVENT_STREAM_START:
+            track->streamChanged();
+            break;
+        default:
+            break;
+        }
+        return GST_PAD_PROBE_OK;
+    }, this, nullptr);
 
     notifyTrackOfStreamChanged();
 }
@@ -68,29 +64,24 @@
 
     gst_pad_remove_probe(m_pad.get(), m_eventProbe);
 
-    m_streamTimerHandler.cancel();
-
     TrackPrivateBaseGStreamer::disconnect();
 }
 
 void InbandTextTrackPrivateGStreamer::handleSample(GRefPtr<GstSample> sample)
 {
-    m_sampleTimerHandler.cancel();
     {
         LockHolder lock(m_sampleMutex);
         m_pendingSamples.append(sample);
     }
 
     RefPtr<InbandTextTrackPrivateGStreamer> protector(this);
-    m_sampleTimerHandler.schedule("[WebKit] InbandTextTrackPrivateGStreamer::notifyTrackOfSample",
-        std::function<void()>([protector] { protector->notifyTrackOfSample(); }));
+    m_notifier.notify(MainThreadNotification::NewSample, [protector] { protector->notifyTrackOfSample(); });
 }
 
 void InbandTextTrackPrivateGStreamer::streamChanged()
 {
     RefPtr<InbandTextTrackPrivateGStreamer> protector(this);
-    m_streamTimerHandler.schedule("[WebKit] InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged",
-        std::function<void()>([protector] { protector->notifyTrackOfStreamChanged(); }));
+    m_notifier.notify(MainThreadNotification::StreamChanged, [protector] { protector->notifyTrackOfStreamChanged(); });
 }
 
 void InbandTextTrackPrivateGStreamer::notifyTrackOfSample()

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h (192100 => 192101)


--- trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h	2015-11-06 13:07:32 UTC (rev 192100)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h	2015-11-06 14:17:19 UTC (rev 192101)
@@ -32,7 +32,6 @@
 #include "InbandTextTrackPrivate.h"
 #include "TrackPrivateBaseGStreamer.h"
 #include <wtf/Lock.h>
-#include <wtf/glib/GThreadSafeMainLoopSource.h>
 
 namespace WebCore {
 
@@ -55,16 +54,15 @@
     String streamId() const { return m_streamId; }
 
     void handleSample(GRefPtr<GstSample>);
+
+private:
+    InbandTextTrackPrivateGStreamer(gint index, GRefPtr<GstPad>);
+
     void streamChanged();
 
     void notifyTrackOfSample();
     void notifyTrackOfStreamChanged();
 
-private:
-    InbandTextTrackPrivateGStreamer(gint index, GRefPtr<GstPad>);
-
-    GThreadSafeMainLoopSource m_sampleTimerHandler;
-    GThreadSafeMainLoopSource m_streamTimerHandler;
     gulong m_eventProbe;
     Vector<GRefPtr<GstSample> > m_pendingSamples;
     String m_streamId;

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp (192100 => 192101)


--- trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp	2015-11-06 13:07:32 UTC (rev 192100)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp	2015-11-06 14:17:19 UTC (rev 192101)
@@ -43,16 +43,6 @@
 
 namespace WebCore {
 
-static void trackPrivateActiveChangedCallback(GObject*, GParamSpec*, TrackPrivateBaseGStreamer* track)
-{
-    track->activeChanged();
-}
-
-static void trackPrivateTagsChangedCallback(GObject*, GParamSpec*, TrackPrivateBaseGStreamer* track)
-{
-    track->tagsChanged();
-}
-
 TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer(TrackPrivateBase* owner, gint index, GRefPtr<GstPad> pad)
     : m_index(index)
     , m_pad(pad)
@@ -60,8 +50,8 @@
 {
     ASSERT(m_pad);
 
-    g_signal_connect(m_pad.get(), "notify::active", G_CALLBACK(trackPrivateActiveChangedCallback), this);
-    g_signal_connect(m_pad.get(), "notify::tags", G_CALLBACK(trackPrivateTagsChangedCallback), this);
+    g_signal_connect_swapped(m_pad.get(), "notify::active", G_CALLBACK(activeChangedCallback), this);
+    g_signal_connect_swapped(m_pad.get(), "notify::tags", G_CALLBACK(tagsChangedCallback), this);
 
     // We can't call notifyTrackOfTagsChanged() directly, because we need tagsChanged()
     // to setup m_tags.
@@ -78,37 +68,33 @@
     if (!m_pad)
         return;
 
-    g_signal_handlers_disconnect_by_func(m_pad.get(),
-        reinterpret_cast<gpointer>(trackPrivateActiveChangedCallback), this);
-    g_signal_handlers_disconnect_by_func(m_pad.get(),
-        reinterpret_cast<gpointer>(trackPrivateTagsChangedCallback), this);
+    m_notifier.cancelPendingNotifications();
+    g_signal_handlers_disconnect_matched(m_pad.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this);
 
-    m_activeTimerHandler.cancel();
-    m_tagTimerHandler.cancel();
-
     m_pad.clear();
     m_tags.clear();
 }
 
-void TrackPrivateBaseGStreamer::activeChanged()
+void TrackPrivateBaseGStreamer::activeChangedCallback(TrackPrivateBaseGStreamer* track)
 {
-    m_activeTimerHandler.schedule("[WebKit] TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged",
-        std::function<void()>([this] { notifyTrackOfActiveChanged(); }));
+    track->m_notifier.notify(MainThreadNotification::ActiveChanged, [track] { track->notifyTrackOfActiveChanged(); });
 }
 
-void TrackPrivateBaseGStreamer::tagsChanged()
+void TrackPrivateBaseGStreamer::tagsChangedCallback(TrackPrivateBaseGStreamer* track)
 {
-    m_tagTimerHandler.cancel();
+    track->tagsChanged();
+}
 
+void TrackPrivateBaseGStreamer::tagsChanged()
+{
     GRefPtr<GstTagList> tags;
-    g_object_get(m_pad.get(), "tags", &tags.outPtr(), NULL);
+    g_object_get(m_pad.get(), "tags", &tags.outPtr(), nullptr);
     {
         LockHolder lock(m_tagMutex);
         m_tags.swap(tags);
     }
 
-    m_tagTimerHandler.schedule("[WebKit] TrackPrivateBaseGStreamer::notifyTrackOfTagsChanged",
-        std::function<void()>([this] { notifyTrackOfTagsChanged(); }));
+    m_notifier.notify(MainThreadNotification::TagsChanged, [this] { notifyTrackOfTagsChanged(); });
 }
 
 void TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged()

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h (192100 => 192101)


--- trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h	2015-11-06 13:07:32 UTC (rev 192100)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h	2015-11-06 14:17:19 UTC (rev 192101)
@@ -29,9 +29,9 @@
 #if ENABLE(VIDEO) && USE(GSTREAMER) && ENABLE(VIDEO_TRACK)
 
 #include "GRefPtrGStreamer.h"
+#include "MainThreadNotifier.h"
 #include <wtf/Lock.h>
 #include <wtf/ThreadingPrimitives.h>
-#include <wtf/glib/GThreadSafeMainLoopSource.h>
 #include <wtf/text/WTFString.h>
 
 namespace WebCore {
@@ -50,15 +50,20 @@
 
     void setIndex(int index) { m_index =  index; }
 
-    void activeChanged();
-    void tagsChanged();
+protected:
+    TrackPrivateBaseGStreamer(TrackPrivateBase* owner, gint index, GRefPtr<GstPad>);
 
     void notifyTrackOfActiveChanged();
     void notifyTrackOfTagsChanged();
 
-protected:
-    TrackPrivateBaseGStreamer(TrackPrivateBase* owner, gint index, GRefPtr<GstPad>);
+    enum MainThreadNotification {
+        ActiveChanged = 1 << 0,
+        TagsChanged = 1 << 1,
+        NewSample = 1 << 2,
+        StreamChanged = 1 << 3
+    };
 
+    MainThreadNotifier<MainThreadNotification> m_notifier;
     gint m_index;
     AtomicString m_label;
     AtomicString m_language;
@@ -70,10 +75,12 @@
     template<class StringType>
     bool getTag(GstTagList* tags, const gchar* tagName, StringType& value);
 
+    static void activeChangedCallback(TrackPrivateBaseGStreamer*);
+    static void tagsChangedCallback(TrackPrivateBaseGStreamer*);
+
+    void tagsChanged();
+
     TrackPrivateBase* m_owner;
-    GThreadSafeMainLoopSource m_activeTimerHandler;
-    GThreadSafeMainLoopSource m_tagTimerHandler;
-
     Lock m_tagMutex;
     GRefPtr<GstTagList> m_tags;
 };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to