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;
};