<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[166052] trunk/Source/WebCore</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/166052">166052</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2014-03-21 01:04:59 -0700 (Fri, 21 Mar 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>[GTK] Use GMainLoopSource for idle and timeout sources in WebCore
https://bugs.webkit.org/show_bug.cgi?id=130078
Reviewed by Philippe Normand.
* platform/audio/gstreamer/AudioFileReaderGStreamer.cpp:
* platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp:
* platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h:
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp:
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h:
* platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp:
* platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h:
* platform/graphics/gstreamer/VideoSinkGStreamer.cpp:
* platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp:
* platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
* platform/gtk/GtkDragAndDropHelper.cpp:
* platform/gtk/SharedTimerGtk.cpp:</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformaudiogstreamerAudioFileReaderGStreamercpp">trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerInbandTextTrackPrivateGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerInbandTextTrackPrivateGStreamerh">trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerh">trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerBasecpp">trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerBaseh">trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerTrackPrivateBaseGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerTrackPrivateBaseGStreamerh">trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerVideoSinkGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerWebKitMediaSourceGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerWebKitWebSourceGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgtkGtkDragAndDropHelpercpp">trunk/Source/WebCore/platform/gtk/GtkDragAndDropHelper.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgtkSharedTimerGtkcpp">trunk/Source/WebCore/platform/gtk/SharedTimerGtk.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/ChangeLog        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2014-03-20 Carlos Garcia Campos <cgarcia@igalia.com>
+
+ [GTK] Use GMainLoopSource for idle and timeout sources in WebCore
+ https://bugs.webkit.org/show_bug.cgi?id=130078
+
+ Reviewed by Philippe Normand.
+
+ * platform/audio/gstreamer/AudioFileReaderGStreamer.cpp:
+ * platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp:
+ * platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h:
+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp:
+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h:
+ * platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp:
+ * platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h:
+ * platform/graphics/gstreamer/VideoSinkGStreamer.cpp:
+ * platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp:
+ * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
+ * platform/gtk/GtkDragAndDropHelper.cpp:
+ * platform/gtk/SharedTimerGtk.cpp:
+
</ins><span class="cx"> 2014-03-21 Andreas Kling <akling@apple.com>
</span><span class="cx">
</span><span class="cx"> HTMLFrameOwnerElement should obey the SubframeLoadingDisabler when creating subframes
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudiogstreamerAudioFileReaderGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -27,14 +27,14 @@
</span><span class="cx">
</span><span class="cx"> #include <gio/gio.h>
</span><span class="cx"> #include <gst/app/gstappsink.h>
</span><ins>+#include <gst/audio/audio.h>
</ins><span class="cx"> #include <gst/gst.h>
</span><span class="cx"> #include <gst/pbutils/pbutils.h>
</span><span class="cx"> #include <wtf/Noncopyable.h>
</span><ins>+#include <wtf/gobject/GMainLoopSource.h>
</ins><span class="cx"> #include <wtf/gobject/GRefPtr.h>
</span><span class="cx"> #include <wtf/gobject/GUniquePtr.h>
</span><span class="cx">
</span><del>-#include <gst/audio/audio.h>
-
</del><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="cx"> class AudioFileReader {
</span><span class="lines">@@ -108,13 +108,6 @@
</span><span class="cx"> reader->plugDeinterleave(pad);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-gboolean enteredMainLoopCallback(gpointer userData)
-{
- AudioFileReader* reader = reinterpret_cast<AudioFileReader*>(userData);
- reader->decodeAudioForBusCreation();
- return FALSE;
-}
-
</del><span class="cx"> AudioFileReader::AudioFileReader(const char* filePath)
</span><span class="cx"> : m_data(0)
</span><span class="cx"> , m_dataSize(0)
</span><span class="lines">@@ -341,9 +334,8 @@
</span><span class="cx"> m_loop = adoptGRef(g_main_loop_new(context.get(), FALSE));
</span><span class="cx">
</span><span class="cx"> // Start the pipeline processing just after the loop is started.
</span><del>- GRefPtr<GSource> timeoutSource = adoptGRef(g_timeout_source_new(0));
- g_source_attach(timeoutSource.get(), context.get());
- g_source_set_callback(timeoutSource.get(), reinterpret_cast<GSourceFunc>(enteredMainLoopCallback), this, 0);
</del><ins>+ GMainLoopSource source;
+ source.schedule("[WebKit] AudioFileReader::decodeAudioForBusCreation", std::bind(&AudioFileReader::decodeAudioForBusCreation, this), G_PRIORITY_DEFAULT, nullptr, context.get());
</ins><span class="cx">
</span><span class="cx"> g_main_loop_run(m_loop.get());
</span><span class="cx"> g_main_context_pop_thread_default(context.get());
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerInbandTextTrackPrivateGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -52,22 +52,8 @@
</span><span class="cx"> return GST_PAD_PROBE_OK;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean textTrackPrivateSampleTimeoutCallback(InbandTextTrackPrivateGStreamer* track)
-{
- track->notifyTrackOfSample();
- return FALSE;
-}
-
-static gboolean textTrackPrivateStreamTimeoutCallback(InbandTextTrackPrivateGStreamer* track)
-{
- track->notifyTrackOfStreamChanged();
- return FALSE;
-}
-
</del><span class="cx"> InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(gint index, GRefPtr<GstPad> pad)
</span><span class="cx"> : InbandTextTrackPrivate(WebVTT), TrackPrivateBaseGStreamer(this, index, pad)
</span><del>- , m_sampleTimerHandler(0)
- , m_streamTimerHandler(0)
</del><span class="cx"> {
</span><span class="cx"> m_eventProbe = gst_pad_add_probe(m_pad.get(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
</span><span class="cx"> reinterpret_cast<GstPadProbeCallback>(textTrackPrivateEventCallback), this, 0);
</span><span class="lines">@@ -82,36 +68,28 @@
</span><span class="cx">
</span><span class="cx"> gst_pad_remove_probe(m_pad.get(), m_eventProbe);
</span><span class="cx">
</span><del>- if (m_streamTimerHandler)
- g_source_remove(m_streamTimerHandler);
</del><ins>+ m_streamTimerHandler.cancel();
</ins><span class="cx">
</span><span class="cx"> TrackPrivateBaseGStreamer::disconnect();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void InbandTextTrackPrivateGStreamer::handleSample(GRefPtr<GstSample> sample)
</span><span class="cx"> {
</span><del>- if (m_sampleTimerHandler)
- g_source_remove(m_sampleTimerHandler);
</del><ins>+ m_sampleTimerHandler.cancel();
</ins><span class="cx"> {
</span><span class="cx"> MutexLocker lock(m_sampleMutex);
</span><span class="cx"> m_pendingSamples.append(sample);
</span><span class="cx"> }
</span><del>- m_sampleTimerHandler = g_timeout_add(0,
- reinterpret_cast<GSourceFunc>(textTrackPrivateSampleTimeoutCallback), this);
</del><ins>+ m_sampleTimerHandler.schedule("[WebKit] InbandTextTrackPrivateGStreamer::notifyTrackOfSample", std::bind(&InbandTextTrackPrivateGStreamer::notifyTrackOfSample, this));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void InbandTextTrackPrivateGStreamer::streamChanged()
</span><span class="cx"> {
</span><del>- if (m_streamTimerHandler)
- g_source_remove(m_streamTimerHandler);
- m_streamTimerHandler = g_timeout_add(0,
- reinterpret_cast<GSourceFunc>(textTrackPrivateStreamTimeoutCallback), this);
</del><ins>+ m_streamTimerHandler.schedule("[WebKit] InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged", std::bind(&InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged, this));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void InbandTextTrackPrivateGStreamer::notifyTrackOfSample()
</span><span class="cx"> {
</span><del>- m_sampleTimerHandler = 0;
-
</del><span class="cx"> Vector<GRefPtr<GstSample> > samples;
</span><span class="cx"> {
</span><span class="cx"> MutexLocker lock(m_sampleMutex);
</span><span class="lines">@@ -142,8 +120,6 @@
</span><span class="cx">
</span><span class="cx"> void InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged()
</span><span class="cx"> {
</span><del>- m_streamTimerHandler = 0;
-
</del><span class="cx"> GRefPtr<GstEvent> event = adoptGRef(gst_pad_get_sticky_event(m_pad.get(),
</span><span class="cx"> GST_EVENT_STREAM_START, 0));
</span><span class="cx"> if (!event)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerInbandTextTrackPrivateGStreamerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include "GRefPtrGStreamer.h"
</span><span class="cx"> #include "InbandTextTrackPrivate.h"
</span><span class="cx"> #include "TrackPrivateBaseGStreamer.h"
</span><ins>+#include <wtf/gobject/GMainLoopSource.h>
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="lines">@@ -61,8 +62,8 @@
</span><span class="cx"> private:
</span><span class="cx"> InbandTextTrackPrivateGStreamer(gint index, GRefPtr<GstPad>);
</span><span class="cx">
</span><del>- guint m_sampleTimerHandler;
- guint m_streamTimerHandler;
</del><ins>+ GMainLoopSource m_sampleTimerHandler;
+ GMainLoopSource m_streamTimerHandler;
</ins><span class="cx"> gulong m_eventProbe;
</span><span class="cx"> Vector<GRefPtr<GstSample> > m_pendingSamples;
</span><span class="cx"> String m_streamId;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -58,7 +58,7 @@
</span><span class="cx">
</span><span class="cx"> // Max interval in seconds to stay in the READY state on manual
</span><span class="cx"> // state change requests.
</span><del>-static const guint gReadyStateTimerInterval = 60;
</del><ins>+static const unsigned gReadyStateTimerInterval = 60;
</ins><span class="cx">
</span><span class="cx"> GST_DEBUG_CATEGORY_EXTERN(webkit_media_player_debug);
</span><span class="cx"> #define GST_CAT_DEFAULT webkit_media_player_debug
</span><span class="lines">@@ -92,46 +92,18 @@
</span><span class="cx"> player->audioChanged();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean mediaPlayerPrivateAudioChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
-{
- // This is the callback of the timeout source created in ::audioChanged.
- player->notifyPlayerOfAudio();
- return FALSE;
-}
-
</del><span class="cx"> static void setAudioStreamPropertiesCallback(GstChildProxy*, GObject* object, gchar*,
</span><span class="cx"> MediaPlayerPrivateGStreamer* player)
</span><span class="cx"> {
</span><span class="cx"> player->setAudioStreamProperties(object);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean mediaPlayerPrivateVideoChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
-{
- // This is the callback of the timeout source created in ::videoChanged.
- player->notifyPlayerOfVideo();
- return FALSE;
-}
-
-static gboolean mediaPlayerPrivateVideoCapsChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
-{
- // This is the callback of the timeout source created in ::videoCapsChanged.
- player->notifyPlayerOfVideoCaps();
- return FALSE;
-}
-
</del><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><span class="cx"> static void mediaPlayerPrivateTextChangedCallback(GObject*, MediaPlayerPrivateGStreamer* player)
</span><span class="cx"> {
</span><span class="cx"> player->textChanged();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean mediaPlayerPrivateTextChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
-{
- // This is the callback of the timeout source created in ::textChanged.
- player->notifyPlayerOfText();
- return FALSE;
-}
-
</del><span class="cx"> static GstFlowReturn mediaPlayerPrivateNewTextSampleCallback(GObject*, MediaPlayerPrivateGStreamer* player)
</span><span class="cx"> {
</span><span class="cx"> player->newTextSample();
</span><span class="lines">@@ -139,14 +111,6 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>-static gboolean mediaPlayerPrivateReadyStateTimeoutCallback(MediaPlayerPrivateGStreamer* player)
-{
- // This is the callback of the timeout source created in ::changePipelineState.
- // Reset pipeline if we are sitting on READY state when timeout is reached
- player->changePipelineState(GST_STATE_NULL);
- return FALSE;
-}
-
</del><span class="cx"> static void mediaPlayerPrivatePluginInstallerResultFunction(GstInstallPluginsReturn result, gpointer userData)
</span><span class="cx"> {
</span><span class="cx"> MediaPlayerPrivateGStreamer* player = reinterpret_cast<MediaPlayerPrivateGStreamer*>(userData);
</span><span class="lines">@@ -249,11 +213,6 @@
</span><span class="cx"> , m_volumeAndMuteInitialized(false)
</span><span class="cx"> , m_hasVideo(false)
</span><span class="cx"> , m_hasAudio(false)
</span><del>- , m_audioTimerHandler(0)
- , m_textTimerHandler(0)
- , m_videoTimerHandler(0)
- , m_videoCapsTimerHandler(0)
- , m_readyTimerHandler(0)
</del><span class="cx"> , m_totalBytes(-1)
</span><span class="cx"> , m_preservesPitch(false)
</span><span class="cx"> , m_requestedState(GST_STATE_VOID_PENDING)
</span><span class="lines">@@ -285,8 +244,7 @@
</span><span class="cx"> g_signal_handlers_disconnect_by_func(G_OBJECT(m_autoAudioSink.get()),
</span><span class="cx"> reinterpret_cast<gpointer>(setAudioStreamPropertiesCallback), this);
</span><span class="cx">
</span><del>- if (m_readyTimerHandler)
- g_source_remove(m_readyTimerHandler);
</del><ins>+ m_readyTimerHandler.cancel();
</ins><span class="cx">
</span><span class="cx"> if (m_playBin) {
</span><span class="cx"> GRefPtr<GstBus> bus = adoptGRef(gst_pipeline_get_bus(GST_PIPELINE(m_playBin.get())));
</span><span class="lines">@@ -308,18 +266,6 @@
</span><span class="cx">
</span><span class="cx"> GRefPtr<GstPad> videoSinkPad = adoptGRef(gst_element_get_static_pad(m_webkitVideoSink.get(), "sink"));
</span><span class="cx"> g_signal_handlers_disconnect_by_func(videoSinkPad.get(), reinterpret_cast<gpointer>(mediaPlayerPrivateVideoSinkCapsChangedCallback), this);
</span><del>-
- if (m_videoTimerHandler)
- g_source_remove(m_videoTimerHandler);
-
- if (m_audioTimerHandler)
- g_source_remove(m_audioTimerHandler);
-
- if (m_textTimerHandler)
- g_source_remove(m_textTimerHandler);
-
- if (m_videoCapsTimerHandler)
- g_source_remove(m_videoCapsTimerHandler);
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::load(const String& url)
</span><span class="lines">@@ -443,12 +389,11 @@
</span><span class="cx"> // if we stay for too long on READY.
</span><span class="cx"> // Also lets remove the timer if we request a state change for any state other than READY.
</span><span class="cx"> // See also https://bugs.webkit.org/show_bug.cgi?id=117354
</span><del>- if (newState == GST_STATE_READY && !m_readyTimerHandler) {
- m_readyTimerHandler = g_timeout_add_seconds(gReadyStateTimerInterval, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateReadyStateTimeoutCallback), this);
- g_source_set_name_by_id(m_readyTimerHandler, "[WebKit] mediaPlayerPrivateReadyStateTimeoutCallback");
- } else if (newState != GST_STATE_READY && m_readyTimerHandler) {
- g_source_remove(m_readyTimerHandler);
- m_readyTimerHandler = 0;
</del><ins>+ if (newState == GST_STATE_READY && !m_readyTimerHandler.isScheduled()) {
+ m_readyTimerHandler.scheduleAfterDelay("[WebKit] mediaPlayerPrivateReadyStateTimeoutCallback", [this] { changePipelineState(GST_STATE_NULL); },
+ std::chrono::seconds(gReadyStateTimerInterval));
+ } else if (newState != GST_STATE_READY && m_readyTimerHandler.isScheduled()) {
+ m_readyTimerHandler.cancel();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> return true;
</span><span class="lines">@@ -669,24 +614,16 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::videoChanged()
</span><span class="cx"> {
</span><del>- if (m_videoTimerHandler)
- g_source_remove(m_videoTimerHandler);
- m_videoTimerHandler = g_idle_add_full(G_PRIORITY_DEFAULT, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateVideoChangeTimeoutCallback), this, 0);
- g_source_set_name_by_id(m_videoTimerHandler, "[WebKit] mediaPlayerPrivateVideoChangeTimeoutCallback");
</del><ins>+ m_videoTimerHandler.schedule("[WebKit] MediaPlayerPrivateGStreamer::videoChanged", std::bind(&MediaPlayerPrivateGStreamer::notifyPlayerOfVideo, this));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::videoCapsChanged()
</span><span class="cx"> {
</span><del>- if (m_videoCapsTimerHandler)
- g_source_remove(m_videoCapsTimerHandler);
- m_videoCapsTimerHandler = g_timeout_add(0, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateVideoCapsChangeTimeoutCallback), this);
- g_source_set_name_by_id(m_videoCapsTimerHandler, "[WebKit] mediaPlayerPrivateVideoCapsChangeTimeoutCallback");
</del><ins>+ m_videoCapsTimerHandler.schedule("[WebKit] MediaPlayerPrivateGStreamer::videoCapsChanged", std::bind(&MediaPlayerPrivateGStreamer::notifyPlayerOfVideoCaps, this));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::notifyPlayerOfVideo()
</span><span class="cx"> {
</span><del>- m_videoTimerHandler = 0;
-
</del><span class="cx"> gint numTracks = 0;
</span><span class="cx"> if (m_playBin)
</span><span class="cx"> g_object_get(m_playBin.get(), "n-video", &numTracks, NULL);
</span><span class="lines">@@ -724,23 +661,17 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::notifyPlayerOfVideoCaps()
</span><span class="cx"> {
</span><del>- m_videoCapsTimerHandler = 0;
</del><span class="cx"> m_videoSize = IntSize();
</span><span class="cx"> m_player->mediaPlayerClient()->mediaPlayerEngineUpdated(m_player);
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::audioChanged()
</span><span class="cx"> {
</span><del>- if (m_audioTimerHandler)
- g_source_remove(m_audioTimerHandler);
- m_audioTimerHandler = g_idle_add_full(G_PRIORITY_DEFAULT, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateAudioChangeTimeoutCallback), this, 0);
- g_source_set_name_by_id(m_audioTimerHandler, "[WebKit] mediaPlayerPrivateAudioChangeTimeoutCallback");
</del><ins>+ m_audioTimerHandler.schedule("[WebKit] MediaPlayerPrivateGStreamer::audioChanged", std::bind(&MediaPlayerPrivateGStreamer::notifyPlayerOfAudio, this));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::notifyPlayerOfAudio()
</span><span class="cx"> {
</span><del>- m_audioTimerHandler = 0;
-
</del><span class="cx"> gint numTracks = 0;
</span><span class="cx"> if (m_playBin)
</span><span class="cx"> g_object_get(m_playBin.get(), "n-audio", &numTracks, NULL);
</span><span class="lines">@@ -779,16 +710,11 @@
</span><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><span class="cx"> void MediaPlayerPrivateGStreamer::textChanged()
</span><span class="cx"> {
</span><del>- if (m_textTimerHandler)
- g_source_remove(m_textTimerHandler);
- m_textTimerHandler = g_timeout_add(0, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateTextChangeTimeoutCallback), this);
- g_source_set_name_by_id(m_textTimerHandler, "[WebKit] mediaPlayerPrivateTextChangeTimeoutCallback");
</del><ins>+ m_textTimerHandler.schedule("[WebKit] MediaPlayerPrivateGStreamer::textChanged", std::bind(&MediaPlayerPrivateGStreamer::notifyPlayerOfText, this));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::notifyPlayerOfText()
</span><span class="cx"> {
</span><del>- m_textTimerHandler = 0;
-
</del><span class="cx"> gint numTracks = 0;
</span><span class="cx"> if (m_playBin)
</span><span class="cx"> g_object_get(m_playBin.get(), "n-text", &numTracks, NULL);
</span><span class="lines">@@ -1640,10 +1566,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // Loading failed, remove ready timer.
</span><del>- if (m_readyTimerHandler) {
- g_source_remove(m_readyTimerHandler);
- m_readyTimerHandler = 0;
- }
</del><ins>+ m_readyTimerHandler.cancel();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static HashSet<String> mimeTypeCache()
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include <gst/gst.h>
</span><span class="cx"> #include <gst/pbutils/install-plugins.h>
</span><span class="cx"> #include <wtf/Forward.h>
</span><ins>+#include <wtf/gobject/GMainLoopSource.h>
</ins><span class="cx">
</span><span class="cx"> #if ENABLE(MEDIA_SOURCE)
</span><span class="cx"> #include "MediaSourceGStreamer.h"
</span><span class="lines">@@ -189,11 +190,11 @@
</span><span class="cx"> bool m_volumeAndMuteInitialized;
</span><span class="cx"> bool m_hasVideo;
</span><span class="cx"> bool m_hasAudio;
</span><del>- guint m_audioTimerHandler;
- guint m_textTimerHandler;
- guint m_videoTimerHandler;
- guint m_videoCapsTimerHandler;
- guint m_readyTimerHandler;
</del><ins>+ GMainLoopSource m_audioTimerHandler;
+ GMainLoopSource m_textTimerHandler;
+ GMainLoopSource m_videoTimerHandler;
+ GMainLoopSource m_videoCapsTimerHandler;
+ GMainLoopSource m_readyTimerHandler;
</ins><span class="cx"> mutable long m_totalBytes;
</span><span class="cx"> URL m_url;
</span><span class="cx"> bool m_preservesPitch;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -72,26 +72,12 @@
</span><span class="cx"> player->volumeChanged();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean mediaPlayerPrivateVolumeChangeTimeoutCallback(MediaPlayerPrivateGStreamerBase* player)
-{
- // This is the callback of the timeout source created in ::volumeChanged.
- player->notifyPlayerOfVolumeChange();
- return FALSE;
-}
-
</del><span class="cx"> static void mediaPlayerPrivateMuteChangedCallback(GObject*, GParamSpec*, MediaPlayerPrivateGStreamerBase* player)
</span><span class="cx"> {
</span><span class="cx"> // This is called when m_volumeElement receives the notify::mute signal.
</span><span class="cx"> player->muteChanged();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean mediaPlayerPrivateMuteChangeTimeoutCallback(MediaPlayerPrivateGStreamerBase* player)
-{
- // This is the callback of the timeout source created in ::muteChanged.
- player->notifyPlayerOfMute();
- return FALSE;
-}
-
</del><span class="cx"> static void mediaPlayerPrivateRepaintCallback(WebKitVideoSink*, GstBuffer *buffer, MediaPlayerPrivateGStreamerBase* playerPrivate)
</span><span class="cx"> {
</span><span class="cx"> playerPrivate->triggerRepaint(buffer);
</span><span class="lines">@@ -103,8 +89,6 @@
</span><span class="cx"> , m_readyState(MediaPlayer::HaveNothing)
</span><span class="cx"> , m_networkState(MediaPlayer::Empty)
</span><span class="cx"> , m_buffer(0)
</span><del>- , m_volumeTimerHandler(0)
- , m_muteTimerHandler(0)
</del><span class="cx"> , m_repaintHandler(0)
</span><span class="cx"> , m_volumeSignalHandler(0)
</span><span class="cx"> , m_muteSignalHandler(0)
</span><span class="lines">@@ -134,12 +118,6 @@
</span><span class="cx">
</span><span class="cx"> m_player = 0;
</span><span class="cx">
</span><del>- if (m_muteTimerHandler)
- g_source_remove(m_muteTimerHandler);
-
- if (m_volumeTimerHandler)
- g_source_remove(m_volumeTimerHandler);
-
</del><span class="cx"> if (m_volumeSignalHandler) {
</span><span class="cx"> g_signal_handler_disconnect(m_volumeElement.get(), m_volumeSignalHandler);
</span><span class="cx"> m_volumeSignalHandler = 0;
</span><span class="lines">@@ -231,8 +209,6 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamerBase::notifyPlayerOfVolumeChange()
</span><span class="cx"> {
</span><del>- m_volumeTimerHandler = 0;
-
</del><span class="cx"> if (!m_player || !m_volumeElement)
</span><span class="cx"> return;
</span><span class="cx"> double volume;
</span><span class="lines">@@ -246,10 +222,7 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamerBase::volumeChanged()
</span><span class="cx"> {
</span><del>- if (m_volumeTimerHandler)
- g_source_remove(m_volumeTimerHandler);
- m_volumeTimerHandler = g_idle_add_full(G_PRIORITY_DEFAULT, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateVolumeChangeTimeoutCallback), this, 0);
- g_source_set_name_by_id(m_volumeTimerHandler, "[WebKit] mediaPlayerPrivateVolumeChangeTimeoutCallback");
</del><ins>+ m_volumeTimerHandler.schedule("[WebKit] MediaPlayerPrivateGStreamerBase::volumeChanged", std::bind(&MediaPlayerPrivateGStreamerBase::notifyPlayerOfVolumeChange, this));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> MediaPlayer::NetworkState MediaPlayerPrivateGStreamerBase::networkState() const
</span><span class="lines">@@ -287,8 +260,6 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamerBase::notifyPlayerOfMute()
</span><span class="cx"> {
</span><del>- m_muteTimerHandler = 0;
-
</del><span class="cx"> if (!m_player || !m_volumeElement)
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="lines">@@ -299,13 +270,9 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamerBase::muteChanged()
</span><span class="cx"> {
</span><del>- if (m_muteTimerHandler)
- g_source_remove(m_muteTimerHandler);
- m_muteTimerHandler = g_idle_add_full(G_PRIORITY_DEFAULT, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateMuteChangeTimeoutCallback), this, 0);
- g_source_set_name_by_id(m_muteTimerHandler, "[WebKit] mediaPlayerPrivateMuteChangeTimeoutCallback");
</del><ins>+ m_muteTimerHandler.schedule("[WebKit] MediaPlayerPrivateGStreamerBase::muteChanged", std::bind(&MediaPlayerPrivateGStreamerBase::notifyPlayerOfMute, this));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-
</del><span class="cx"> #if USE(TEXTURE_MAPPER_GL) && !USE(COORDINATED_GRAPHICS)
</span><span class="cx"> PassRefPtr<BitmapTexture> MediaPlayerPrivateGStreamerBase::updateTexture(TextureMapper* textureMapper)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include <glib.h>
</span><span class="cx">
</span><span class="cx"> #include <wtf/Forward.h>
</span><ins>+#include <wtf/gobject/GMainLoopSource.h>
</ins><span class="cx">
</span><span class="cx"> #if USE(TEXTURE_MAPPER_GL) && !USE(COORDINATED_GRAPHICS)
</span><span class="cx"> #include "TextureMapperPlatformLayer.h"
</span><span class="lines">@@ -119,8 +120,8 @@
</span><span class="cx"> IntSize m_size;
</span><span class="cx"> GMutex* m_bufferMutex;
</span><span class="cx"> GstBuffer* m_buffer;
</span><del>- unsigned long m_volumeTimerHandler;
- unsigned long m_muteTimerHandler;
</del><ins>+ GMainLoopSource m_volumeTimerHandler;
+ GMainLoopSource m_muteTimerHandler;
</ins><span class="cx"> unsigned long m_repaintHandler;
</span><span class="cx"> unsigned long m_volumeSignalHandler;
</span><span class="cx"> unsigned long m_muteSignalHandler;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerTrackPrivateBaseGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -53,24 +53,10 @@
</span><span class="cx"> track->tagsChanged();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean trackPrivateActiveChangeTimeoutCallback(TrackPrivateBaseGStreamer* track)
-{
- track->notifyTrackOfActiveChanged();
- return FALSE;
-}
-
-static gboolean trackPrivateTagsChangeTimeoutCallback(TrackPrivateBaseGStreamer* track)
-{
- track->notifyTrackOfTagsChanged();
- return FALSE;
-}
-
</del><span class="cx"> TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer(TrackPrivateBase* owner, gint index, GRefPtr<GstPad> pad)
</span><span class="cx"> : m_index(index)
</span><span class="cx"> , m_pad(pad)
</span><span class="cx"> , m_owner(owner)
</span><del>- , m_activeTimerHandler(0)
- , m_tagTimerHandler(0)
</del><span class="cx"> {
</span><span class="cx"> ASSERT(m_pad);
</span><span class="cx">
</span><span class="lines">@@ -97,31 +83,21 @@
</span><span class="cx"> g_signal_handlers_disconnect_by_func(m_pad.get(),
</span><span class="cx"> reinterpret_cast<gpointer>(trackPrivateTagsChangedCallback), this);
</span><span class="cx">
</span><del>- if (m_activeTimerHandler)
- g_source_remove(m_activeTimerHandler);
- m_activeTimerHandler = 0;
</del><ins>+ m_activeTimerHandler.cancel();
+ m_tagTimerHandler.cancel();
</ins><span class="cx">
</span><del>- if (m_tagTimerHandler)
- g_source_remove(m_tagTimerHandler);
- m_tagTimerHandler = 0;
-
</del><span class="cx"> m_pad.clear();
</span><span class="cx"> m_tags.clear();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void TrackPrivateBaseGStreamer::activeChanged()
</span><span class="cx"> {
</span><del>- if (m_activeTimerHandler)
- g_source_remove(m_activeTimerHandler);
- m_activeTimerHandler = g_timeout_add(0,
- reinterpret_cast<GSourceFunc>(trackPrivateActiveChangeTimeoutCallback), this);
- g_source_set_name_by_id(m_activeTimerHandler, "[WebKit] trackPrivateActiveChangeTimeoutCallback");
</del><ins>+ m_activeTimerHandler.schedule("[WebKit] TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged", std::bind(&TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged, this));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void TrackPrivateBaseGStreamer::tagsChanged()
</span><span class="cx"> {
</span><del>- if (m_tagTimerHandler)
- g_source_remove(m_tagTimerHandler);
</del><ins>+ m_tagTimerHandler.cancel();
</ins><span class="cx">
</span><span class="cx"> GRefPtr<GstTagList> tags;
</span><span class="cx"> g_object_get(m_pad.get(), "tags", &tags.outPtr(), NULL);
</span><span class="lines">@@ -130,14 +106,11 @@
</span><span class="cx"> m_tags.swap(tags);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- m_tagTimerHandler = g_timeout_add(0,
- reinterpret_cast<GSourceFunc>(trackPrivateTagsChangeTimeoutCallback), this);
- g_source_set_name_by_id(m_tagTimerHandler, "[WebKit] trackPrivateTagsChangeTimeoutCallback");
</del><ins>+ m_tagTimerHandler.schedule("[WebKit] TrackPrivateBaseGStreamer::notifyTrackOfTagsChanged", std::bind(&TrackPrivateBaseGStreamer::notifyTrackOfTagsChanged, this));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged()
</span><span class="cx"> {
</span><del>- m_activeTimerHandler = 0;
</del><span class="cx"> if (!m_pad)
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="lines">@@ -175,7 +148,6 @@
</span><span class="cx">
</span><span class="cx"> void TrackPrivateBaseGStreamer::notifyTrackOfTagsChanged()
</span><span class="cx"> {
</span><del>- m_tagTimerHandler = 0;
</del><span class="cx"> if (!m_pad)
</span><span class="cx"> return;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerTrackPrivateBaseGStreamerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx">
</span><span class="cx"> #include "GRefPtrGStreamer.h"
</span><span class="cx"> #include <wtf/ThreadingPrimitives.h>
</span><ins>+#include <wtf/gobject/GMainLoopSource.h>
</ins><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -67,8 +68,8 @@
</span><span class="cx"> bool getTag(GstTagList* tags, const gchar* tagName, String& value);
</span><span class="cx">
</span><span class="cx"> TrackPrivateBase* m_owner;
</span><del>- guint m_activeTimerHandler;
- guint m_tagTimerHandler;
</del><ins>+ GMainLoopSource m_activeTimerHandler;
+ GMainLoopSource m_tagTimerHandler;
</ins><span class="cx">
</span><span class="cx"> Mutex m_tagMutex;
</span><span class="cx"> GRefPtr<GstTagList> m_tags;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerVideoSinkGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include <gst/gst.h>
</span><span class="cx"> #include <gst/video/gstvideometa.h>
</span><span class="cx"> #include <wtf/OwnPtr.h>
</span><ins>+#include <wtf/gobject/GMainLoopSource.h>
</ins><span class="cx"> #include <wtf/gobject/GMutexLocker.h>
</span><span class="cx">
</span><span class="cx"> using namespace WebCore;
</span><span class="lines">@@ -74,7 +75,7 @@
</span><span class="cx">
</span><span class="cx"> struct _WebKitVideoSinkPrivate {
</span><span class="cx"> GstBuffer* buffer;
</span><del>- guint timeoutId;
</del><ins>+ GMainLoopSource timeoutSource;
</ins><span class="cx"> GMutex* bufferMutex;
</span><span class="cx"> GCond* dataCondition;
</span><span class="cx">
</span><span class="lines">@@ -100,6 +101,7 @@
</span><span class="cx"> static void webkit_video_sink_init(WebKitVideoSink* sink)
</span><span class="cx"> {
</span><span class="cx"> sink->priv = G_TYPE_INSTANCE_GET_PRIVATE(sink, WEBKIT_TYPE_VIDEO_SINK, WebKitVideoSinkPrivate);
</span><ins>+ new (sink->priv) WebKitVideoSinkPrivate();
</ins><span class="cx"> #if GLIB_CHECK_VERSION(2, 31, 0)
</span><span class="cx"> sink->priv->dataCondition = new GCond;
</span><span class="cx"> g_cond_init(sink->priv->dataCondition);
</span><span class="lines">@@ -113,26 +115,22 @@
</span><span class="cx"> gst_video_info_init(&sink->priv->info);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean webkitVideoSinkTimeoutCallback(gpointer data)
</del><ins>+static void webkitVideoSinkTimeoutCallback(WebKitVideoSink* sink)
</ins><span class="cx"> {
</span><del>- WebKitVideoSink* sink = reinterpret_cast<WebKitVideoSink*>(data);
</del><span class="cx"> WebKitVideoSinkPrivate* priv = sink->priv;
</span><span class="cx">
</span><span class="cx"> GMutexLocker lock(priv->bufferMutex);
</span><span class="cx"> GstBuffer* buffer = priv->buffer;
</span><span class="cx"> priv->buffer = 0;
</span><del>- priv->timeoutId = 0;
</del><span class="cx">
</span><span class="cx"> if (!buffer || priv->unlocked || UNLIKELY(!GST_IS_BUFFER(buffer))) {
</span><span class="cx"> g_cond_signal(priv->dataCondition);
</span><del>- return FALSE;
</del><ins>+ return;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> g_signal_emit(sink, webkitVideoSinkSignals[REPAINT_REQUESTED], 0, buffer);
</span><span class="cx"> gst_buffer_unref(buffer);
</span><span class="cx"> g_cond_signal(priv->dataCondition);
</span><del>-
- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static GstFlowReturn webkitVideoSinkRender(GstBaseSink* baseSink, GstBuffer* buffer)
</span><span class="lines">@@ -216,9 +214,9 @@
</span><span class="cx"> // This should likely use a lower priority, but glib currently starves
</span><span class="cx"> // lower priority sources.
</span><span class="cx"> // See: https://bugzilla.gnome.org/show_bug.cgi?id=610830.
</span><del>- priv->timeoutId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, webkitVideoSinkTimeoutCallback,
- gst_object_ref(sink), reinterpret_cast<GDestroyNotify>(gst_object_unref));
- g_source_set_name_by_id(priv->timeoutId, "[WebKit] webkitVideoSinkTimeoutCallback");
</del><ins>+ gst_object_ref(sink);
+ priv->timeoutSource.schedule("[WebKit] webkitVideoSinkTimeoutCallback", std::bind(webkitVideoSinkTimeoutCallback, sink), G_PRIORITY_DEFAULT,
+ [sink] { gst_object_unref(sink); });
</ins><span class="cx">
</span><span class="cx"> g_cond_wait(priv->dataCondition, priv->bufferMutex);
</span><span class="cx"> return GST_FLOW_OK;
</span><span class="lines">@@ -252,6 +250,12 @@
</span><span class="cx"> G_OBJECT_CLASS(parent_class)->dispose(object);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+static void webkitVideoSinkFinalize(GObject* object)
+{
+ WEBKIT_VIDEO_SINK(object)->priv->~WebKitVideoSinkPrivate();
+ G_OBJECT_CLASS(parent_class)->finalize(object);
+}
+
</ins><span class="cx"> static void webkitVideoSinkGetProperty(GObject* object, guint propertyId, GValue* value, GParamSpec* parameterSpec)
</span><span class="cx"> {
</span><span class="cx"> WebKitVideoSink* sink = WEBKIT_VIDEO_SINK(object);
</span><span class="lines">@@ -376,6 +380,7 @@
</span><span class="cx"> g_type_class_add_private(klass, sizeof(WebKitVideoSinkPrivate));
</span><span class="cx">
</span><span class="cx"> gobjectClass->dispose = webkitVideoSinkDispose;
</span><ins>+ gobjectClass->finalize = webkitVideoSinkFinalize;
</ins><span class="cx"> gobjectClass->get_property = webkitVideoSinkGetProperty;
</span><span class="cx">
</span><span class="cx"> baseSinkClass->unlock = webkitVideoSinkUnlock;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerWebKitMediaSourceGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include <gst/app/gstappsrc.h>
</span><span class="cx"> #include <gst/gst.h>
</span><span class="cx"> #include <gst/pbutils/missing-plugins.h>
</span><ins>+#include <wtf/gobject/GMainLoopSource.h>
</ins><span class="cx"> #include <wtf/gobject/GUniquePtr.h>
</span><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="lines">@@ -43,11 +44,11 @@
</span><span class="cx"> guint64 size;
</span><span class="cx"> gboolean paused;
</span><span class="cx">
</span><del>- guint startId;
- guint stopId;
- guint needDataId;
- guint enoughDataId;
- guint seekId;
</del><ins>+ GMainLoopSource start;
+ GMainLoopSource stop;
+ GMainLoopSource needData;
+ GMainLoopSource enoughData;
+ GMainLoopSource seek;
</ins><span class="cx">
</span><span class="cx"> guint64 requestedOffset;
</span><span class="cx"> } Source;
</span><span class="lines">@@ -172,6 +173,7 @@
</span><span class="cx"> {
</span><span class="cx"> WebKitMediaSrcPrivate* priv = WEBKIT_MEDIA_SRC_GET_PRIVATE(src);
</span><span class="cx"> src->priv = priv;
</span><ins>+ new (priv) WebKitMediaSrcPrivate();
</ins><span class="cx">
</span><span class="cx"> priv->sourceVideo.appsrc = gst_element_factory_make("appsrc", "videoappsrc");
</span><span class="cx"> gst_app_src_set_callbacks(GST_APP_SRC(priv->sourceVideo.appsrc), &appsrcCallbacksVideo, src, 0);
</span><span class="lines">@@ -188,6 +190,7 @@
</span><span class="cx"> WebKitMediaSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="cx"> g_free(priv->uri);
</span><ins>+ priv->~WebKitMediaSrcPrivate();
</ins><span class="cx">
</span><span class="cx"> GST_CALL_PARENT(G_OBJECT_CLASS, finalize, (object));
</span><span class="cx"> }
</span><span class="lines">@@ -223,36 +226,24 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // must be called on main thread and with object unlocked
</span><del>-static gboolean webKitMediaVideoSrcStop(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaVideoSrcStop(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitMediaSrcPrivate* priv = src->priv;
</span><span class="cx"> gboolean seeking;
</span><span class="cx">
</span><span class="cx"> GST_OBJECT_LOCK(src);
</span><span class="cx">
</span><del>- seeking = priv->sourceVideo.seekId;
</del><ins>+ seeking = priv->sourceVideo.seek.isActive();
</ins><span class="cx">
</span><del>- if (priv->sourceVideo.startId) {
- g_source_remove(priv->sourceVideo.startId);
- priv->sourceVideo.startId = 0;
- }
</del><ins>+ priv->sourceVideo.start.cancel();
</ins><span class="cx">
</span><span class="cx"> priv->player = 0;
</span><span class="cx"> priv->playbin = 0;
</span><span class="cx">
</span><del>- if (priv->sourceVideo.needDataId)
- g_source_remove(priv->sourceVideo.needDataId);
- priv->sourceVideo.needDataId = 0;
</del><ins>+ priv->sourceVideo.needData.cancel();
+ priv->sourceVideo.enoughData.cancel();
+ priv->sourceVideo.seek.cancel();
</ins><span class="cx">
</span><del>- if (priv->sourceVideo.enoughDataId)
- g_source_remove(priv->sourceVideo.enoughDataId);
- priv->sourceVideo.enoughDataId = 0;
-
- if (priv->sourceVideo.seekId)
- g_source_remove(priv->sourceVideo.seekId);
-
- priv->sourceVideo.seekId = 0;
-
</del><span class="cx"> priv->sourceVideo.paused = FALSE;
</span><span class="cx"> priv->sourceVideo.offset = 0;
</span><span class="cx"> priv->seekable = FALSE;
</span><span class="lines">@@ -260,8 +251,6 @@
</span><span class="cx"> priv->duration = 0;
</span><span class="cx"> priv->nbSource = 0;
</span><span class="cx">
</span><del>- priv->sourceVideo.stopId = 0;
-
</del><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx">
</span><span class="cx"> if (priv->sourceVideo.appsrc) {
</span><span class="lines">@@ -271,41 +260,27 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Stopped request");
</span><del>-
- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean webKitMediaAudioSrcStop(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaAudioSrcStop(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitMediaSrcPrivate* priv = src->priv;
</span><span class="cx"> gboolean seeking;
</span><span class="cx">
</span><span class="cx"> GST_OBJECT_LOCK(src);
</span><span class="cx">
</span><del>- seeking = priv->sourceAudio.seekId;
</del><ins>+ seeking = priv->sourceAudio.seek.isActive();
</ins><span class="cx">
</span><del>- if (priv->sourceAudio.startId) {
- g_source_remove(priv->sourceAudio.startId);
- priv->sourceAudio.startId = 0;
- }
</del><ins>+ priv->sourceAudio.start.cancel();
</ins><span class="cx">
</span><span class="cx"> priv->player = 0;
</span><span class="cx">
</span><span class="cx"> priv->playbin = 0;
</span><span class="cx">
</span><del>- if (priv->sourceAudio.needDataId)
- g_source_remove(priv->sourceAudio.needDataId);
- priv->sourceAudio.needDataId = 0;
</del><ins>+ priv->sourceAudio.needData.cancel();
+ priv->sourceAudio.enoughData.cancel();
+ priv->sourceAudio.seek.cancel();
</ins><span class="cx">
</span><del>- if (priv->sourceAudio.enoughDataId)
- g_source_remove(priv->sourceAudio.enoughDataId);
- priv->sourceAudio.enoughDataId = 0;
-
- if (priv->sourceAudio.seekId)
- g_source_remove(priv->sourceAudio.seekId);
-
- priv->sourceAudio.seekId = 0;
-
</del><span class="cx"> priv->sourceAudio.paused = FALSE;
</span><span class="cx">
</span><span class="cx"> priv->sourceAudio.offset = 0;
</span><span class="lines">@@ -315,8 +290,6 @@
</span><span class="cx"> priv->duration = 0;
</span><span class="cx"> priv->nbSource = 0;
</span><span class="cx">
</span><del>- priv->sourceAudio.stopId = 0;
-
</del><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx">
</span><span class="cx"> if (priv->sourceAudio.appsrc) {
</span><span class="lines">@@ -326,12 +299,10 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Stopped request");
</span><del>-
- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // must be called on main thread and with object unlocked
</span><del>-static gboolean webKitMediaVideoSrcStart(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaVideoSrcStart(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitMediaSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="lines">@@ -340,19 +311,15 @@
</span><span class="cx"> GST_ERROR_OBJECT(src, "No URI provided");
</span><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> webKitMediaVideoSrcStop(src);
</span><del>- return FALSE;
</del><ins>+ return;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- priv->sourceVideo.startId = 0;
-
</del><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Started request");
</span><del>-
- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // must be called on main thread and with object unlocked
</span><del>-static gboolean webKitMediaAudioSrcStart(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaAudioSrcStart(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitMediaSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="lines">@@ -361,15 +328,11 @@
</span><span class="cx"> GST_ERROR_OBJECT(src, "No URI provided");
</span><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> webKitMediaAudioSrcStop(src);
</span><del>- return FALSE;
</del><ins>+ return;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- priv->sourceAudio.startId = 0;
-
</del><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Started request");
</span><del>-
- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static GstStateChangeReturn webKitMediaSrcChangeState(GstElement* element, GstStateChange transition)
</span><span class="lines">@@ -401,19 +364,29 @@
</span><span class="cx"> case GST_STATE_CHANGE_READY_TO_PAUSED:
</span><span class="cx"> GST_DEBUG_OBJECT(src, "READY->PAUSED");
</span><span class="cx"> GST_OBJECT_LOCK(src);
</span><del>- priv->sourceVideo.startId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaVideoSrcStart, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
- g_source_set_name_by_id(priv->sourceVideo.startId, "[WebKit] webKitMediaVideoSrcStart");
- priv->sourceAudio.startId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaAudioSrcStart, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
- g_source_set_name_by_id(priv->sourceAudio.startId, "[WebKit] webKitMediaAudioSrcStart");
</del><ins>+
+ gst_object_ref(src);
+ priv->sourceVideo.start.schedule("[WebKit] webKitMediaVideoSrcStart", std::bind(webKitMediaVideoSrcStart, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
+
+ gst_object_ref(src);
+ priv->sourceAudio.start.schedule("[WebKit] webKitMediaAudioSrcStart", std::bind(webKitMediaAudioSrcStart, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
+
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> break;
</span><span class="cx"> case GST_STATE_CHANGE_PAUSED_TO_READY:
</span><span class="cx"> GST_DEBUG_OBJECT(src, "PAUSED->READY");
</span><span class="cx"> GST_OBJECT_LOCK(src);
</span><del>- priv->sourceVideo.stopId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaVideoSrcStop, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
- g_source_set_name_by_id(priv->sourceVideo.stopId, "[WebKit] webKitMediaVideoSrcStop");
- priv->sourceAudio.stopId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaAudioSrcStop, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
- g_source_set_name_by_id(priv->sourceAudio.stopId, "[WebKit] webKitMediaAudioSrcStop");
</del><ins>+
+ gst_object_ref(src);
+ priv->sourceVideo.stop.schedule("[WebKit] webKitMediaVideoSrcStop", std::bind(webKitMediaVideoSrcStop, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
+
+ gst_object_ref(src);
+ priv->sourceAudio.stop.schedule("[WebKit] webKitMediaAudioSrcStop", std::bind(webKitMediaAudioSrcStop, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
+
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> break;
</span><span class="cx"> default:
</span><span class="lines">@@ -519,40 +492,22 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // appsrc callbacks
</span><del>-static gboolean webKitMediaVideoSrcNeedDataMainCb(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaVideoSrcNeedDataMainCb(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitMediaSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="cx"> GST_OBJECT_LOCK(src);
</span><del>- // already stopped
- if (!priv->sourceVideo.needDataId) {
- GST_OBJECT_UNLOCK(src);
- return FALSE;
- }
-
</del><span class="cx"> priv->sourceVideo.paused = FALSE;
</span><del>- priv->sourceVideo.needDataId = 0;
</del><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><del>-
- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean webKitMediaAudioSrcNeedDataMainCb(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaAudioSrcNeedDataMainCb(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitMediaSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="cx"> GST_OBJECT_LOCK(src);
</span><del>- // already stopped
- if (!priv->sourceAudio.needDataId) {
- GST_OBJECT_UNLOCK(src);
- return FALSE;
- }
-
</del><span class="cx"> priv->sourceAudio.paused = FALSE;
</span><del>- priv->sourceAudio.needDataId = 0;
</del><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><del>-
- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static void webKitMediaVideoSrcNeedDataCb(GstAppSrc*, guint length, gpointer userData)
</span><span class="lines">@@ -563,13 +518,14 @@
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Need more data: %u", length);
</span><span class="cx">
</span><span class="cx"> GST_OBJECT_LOCK(src);
</span><del>- if (priv->sourceVideo.needDataId || !priv->sourceVideo.paused) {
</del><ins>+ if (priv->sourceVideo.needData.isScheduled() || !priv->sourceVideo.paused) {
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- priv->sourceVideo.needDataId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaVideoSrcNeedDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
- g_source_set_name_by_id(priv->sourceVideo.needDataId, "[WebKit] webKitMediaVideoSrcNeedDataMainCb");
</del><ins>+ gst_object_ref(src);
+ priv->sourceVideo.needData.schedule("[WebKit] webKitMediaVideoSrcNeedDataMainCb", std::bind(webKitMediaVideoSrcNeedDataMainCb, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -581,50 +537,33 @@
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Need more data: %u", length);
</span><span class="cx">
</span><span class="cx"> GST_OBJECT_LOCK(src);
</span><del>- if (priv->sourceAudio.needDataId || !priv->sourceAudio.paused) {
</del><ins>+ if (priv->sourceAudio.needData.isScheduled() || !priv->sourceAudio.paused) {
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- priv->sourceAudio.needDataId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaAudioSrcNeedDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
- g_source_set_name_by_id(priv->sourceAudio.needDataId, "[WebKit] webKitMediaAudioSrcNeedDataMainCb");
</del><ins>+ gst_object_ref(src);
+ priv->sourceAudio.needData.schedule("[WebKit] webKitMediaAudioSrcNeedDataMainCb", std::bind(webKitMediaAudioSrcNeedDataMainCb, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean webKitMediaVideoSrcEnoughDataMainCb(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaVideoSrcEnoughDataMainCb(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitMediaSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="cx"> GST_OBJECT_LOCK(src);
</span><del>- // already stopped
- if (!priv->sourceVideo.enoughDataId) {
- GST_OBJECT_UNLOCK(src);
- return FALSE;
- }
-
</del><span class="cx"> priv->sourceVideo.paused = TRUE;
</span><del>- priv->sourceVideo.enoughDataId = 0;
</del><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><del>-
- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean webKitMediaAudioSrcEnoughDataMainCb(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaAudioSrcEnoughDataMainCb(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitMediaSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="cx"> GST_OBJECT_LOCK(src);
</span><del>- // already stopped
- if (!priv->sourceAudio.enoughDataId) {
- GST_OBJECT_UNLOCK(src);
- return FALSE;
- }
-
</del><span class="cx"> priv->sourceAudio.paused = TRUE;
</span><del>- priv->sourceAudio.enoughDataId = 0;
</del><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><del>-
- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static void webKitMediaVideoSrcEnoughDataCb(GstAppSrc*, gpointer userData)
</span><span class="lines">@@ -635,13 +574,15 @@
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Have enough data");
</span><span class="cx">
</span><span class="cx"> GST_OBJECT_LOCK(src);
</span><del>- if (priv->sourceVideo.enoughDataId || priv->sourceVideo.paused) {
</del><ins>+ if (priv->sourceVideo.enoughData.isScheduled() || priv->sourceVideo.paused) {
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- priv->sourceVideo.enoughDataId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaVideoSrcEnoughDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
- g_source_set_name_by_id(priv->sourceVideo.enoughDataId, "[WebKit] webKitMediaVideoSrcEnoughDataMainCb");
</del><ins>+ gst_object_ref(src);
+ priv->sourceVideo.enoughData.schedule("[WebKit] webKitMediaVideoSrcEnoughDataMainCb", std::bind(webKitMediaVideoSrcEnoughDataMainCb, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
+
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -653,28 +594,27 @@
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Have enough data");
</span><span class="cx">
</span><span class="cx"> GST_OBJECT_LOCK(src);
</span><del>- if (priv->sourceAudio.enoughDataId || priv->sourceAudio.paused) {
</del><ins>+ if (priv->sourceAudio.enoughData.isScheduled() || priv->sourceAudio.paused) {
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- priv->sourceAudio.enoughDataId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaAudioSrcEnoughDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
- g_source_set_name_by_id(priv->sourceAudio.enoughDataId, "[WebKit] webKitMediaAudioSrcEnoughDataMainCb");
</del><ins>+ gst_object_ref(src);
+ priv->sourceAudio.enoughData.schedule("[WebKit] webKitMediaAudioSrcEnoughDataMainCb", std::bind(webKitMediaAudioSrcEnoughDataMainCb, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
+
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean webKitMediaVideoSrcSeekMainCb(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaVideoSrcSeekMainCb(WebKitMediaSrc*)
</ins><span class="cx"> {
</span><span class="cx"> notImplemented();
</span><del>- src->priv->sourceVideo.seekId = 0;
- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean webKitMediaAudioSrcSeekMainCb(WebKitMediaSrc* src)
</del><ins>+
+static void webKitMediaAudioSrcSeekMainCb(WebKitMediaSrc*)
</ins><span class="cx"> {
</span><span class="cx"> notImplemented();
</span><del>- src->priv->sourceAudio.seekId = 0;
- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static gboolean webKitMediaVideoSrcSeekDataCb(GstAppSrc*, guint64 offset, gpointer userData)
</span><span class="lines">@@ -701,10 +641,10 @@
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Doing range-request seek");
</span><span class="cx"> priv->sourceVideo.requestedOffset = offset;
</span><span class="cx">
</span><del>- if (priv->sourceVideo.seekId)
- g_source_remove(priv->sourceVideo.seekId);
- priv->sourceVideo.seekId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaVideoSrcSeekMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
- g_source_set_name_by_id(priv->sourceVideo.seekId, "[WebKit] webKitMediaVideoSrcSeekMainCb");
</del><ins>+ gst_object_ref(src);
+ priv->sourceVideo.seek.schedule("[WebKit] webKitMediaVideoSrcSeekMainCb", std::bind(webKitMediaVideoSrcSeekMainCb, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
+
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx">
</span><span class="cx"> return TRUE;
</span><span class="lines">@@ -734,10 +674,10 @@
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Doing range-request seek");
</span><span class="cx"> priv->sourceAudio.requestedOffset = offset;
</span><span class="cx">
</span><del>- if (priv->sourceAudio.seekId)
- g_source_remove(priv->sourceAudio.seekId);
- priv->sourceAudio.seekId = g_timeout_add_full(G_PRIORITY_DEFAULT, 0, (GSourceFunc) webKitMediaAudioSrcSeekMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
- g_source_set_name_by_id(priv->sourceAudio.seekId, "[WebKit] webKitMediaAudioSrcSeekMainCb");
</del><ins>+ gst_object_ref(src);
+ priv->sourceAudio.seek.schedule("[WebKit] webKitMediaAudioSrcSeekMainCb", std::bind(webKitMediaAudioSrcSeekMainCb, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
+
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx">
</span><span class="cx"> return TRUE;
</span><span class="lines">@@ -822,14 +762,14 @@
</span><span class="cx"> GST_DEBUG_OBJECT(m_src, "Have EOS");
</span><span class="cx">
</span><span class="cx"> GST_OBJECT_LOCK(m_src);
</span><del>- if (!priv->sourceVideo.seekId) {
</del><ins>+ if (!priv->sourceVideo.seek.isActive()) {
</ins><span class="cx"> GST_OBJECT_UNLOCK(m_src);
</span><span class="cx"> gst_app_src_end_of_stream(GST_APP_SRC(priv->sourceVideo.appsrc));
</span><span class="cx"> } else
</span><span class="cx"> GST_OBJECT_UNLOCK(m_src);
</span><span class="cx">
</span><span class="cx"> GST_OBJECT_LOCK(m_src);
</span><del>- if (!priv->sourceAudio.seekId) {
</del><ins>+ if (!priv->sourceAudio.seek.isActive()) {
</ins><span class="cx"> GST_OBJECT_UNLOCK(m_src);
</span><span class="cx"> gst_app_src_end_of_stream(GST_APP_SRC(priv->sourceAudio.appsrc));
</span><span class="cx"> } else
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerWebKitWebSourceGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -40,6 +40,7 @@
</span><span class="cx"> #include <gst/gst.h>
</span><span class="cx"> #include <gst/pbutils/missing-plugins.h>
</span><span class="cx"> #include <wtf/Noncopyable.h>
</span><ins>+#include <wtf/gobject/GMainLoopSource.h>
</ins><span class="cx"> #include <wtf/gobject/GMutexLocker.h>
</span><span class="cx"> #include <wtf/gobject/GRefPtr.h>
</span><span class="cx"> #include <wtf/gobject/GUniquePtr.h>
</span><span class="lines">@@ -126,11 +127,11 @@
</span><span class="cx">
</span><span class="cx"> guint64 requestedOffset;
</span><span class="cx">
</span><del>- guint startID;
- guint stopID;
- guint needDataID;
- guint enoughDataID;
- guint seekID;
</del><ins>+ GMainLoopSource startSource;
+ GMainLoopSource stopSource;
+ GMainLoopSource needDataSource;
+ GMainLoopSource enoughDataSource;
+ GMainLoopSource seekSource;
</ins><span class="cx">
</span><span class="cx"> GRefPtr<GstBuffer> buffer;
</span><span class="cx">
</span><span class="lines">@@ -253,6 +254,7 @@
</span><span class="cx"> WebKitWebSrcPrivate* priv = WEBKIT_WEB_SRC_GET_PRIVATE(src);
</span><span class="cx">
</span><span class="cx"> src->priv = priv;
</span><ins>+ new (priv) WebKitWebSrcPrivate();
</ins><span class="cx">
</span><span class="cx"> priv->appsrc = GST_APP_SRC(gst_element_factory_make("appsrc", 0));
</span><span class="cx"> if (!priv->appsrc) {
</span><span class="lines">@@ -314,6 +316,7 @@
</span><span class="cx"> WebKitWebSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="cx"> g_free(priv->uri);
</span><ins>+ priv->~WebKitWebSrcPrivate();
</ins><span class="cx">
</span><span class="cx"> GST_CALL_PARENT(G_OBJECT_CLASS, finalize, (object));
</span><span class="cx"> }
</span><span class="lines">@@ -364,24 +367,13 @@
</span><span class="cx"> {
</span><span class="cx"> WebKitWebSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><del>- if (priv->startID)
- g_source_remove(priv->startID);
- priv->startID = 0;
-
- if (priv->needDataID)
- g_source_remove(priv->needDataID);
- priv->needDataID = 0;
-
- if (priv->enoughDataID)
- g_source_remove(priv->enoughDataID);
- priv->enoughDataID = 0;
-
- if (priv->seekID)
- g_source_remove(priv->seekID);
- priv->seekID = 0;
</del><ins>+ priv->startSource.cancel();
+ priv->needDataSource.cancel();
+ priv->enoughDataSource.cancel();
+ priv->seekSource.cancel();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean webKitWebSrcStop(WebKitWebSrc* src)
</del><ins>+static void webKitWebSrcStop(WebKitWebSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitWebSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="lines">@@ -389,10 +381,9 @@
</span><span class="cx">
</span><span class="cx"> GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><span class="cx">
</span><del>- bool seeking = priv->seekID;
</del><ins>+ bool seeking = priv->seekSource.isActive();
</ins><span class="cx">
</span><span class="cx"> removeTimeoutSources(src);
</span><del>- priv->stopID = 0;
</del><span class="cx">
</span><span class="cx"> if (priv->client) {
</span><span class="cx"> delete priv->client;
</span><span class="lines">@@ -436,11 +427,9 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Stopped request");
</span><del>-
- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean webKitWebSrcStart(WebKitWebSrc* src)
</del><ins>+static void webKitWebSrcStart(WebKitWebSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitWebSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="lines">@@ -448,13 +437,11 @@
</span><span class="cx">
</span><span class="cx"> GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><span class="cx">
</span><del>- priv->startID = 0;
-
</del><span class="cx"> if (!priv->uri) {
</span><span class="cx"> GST_ERROR_OBJECT(src, "No URI provided");
</span><span class="cx"> locker.unlock();
</span><span class="cx"> webKitWebSrcStop(src);
</span><del>- return FALSE;
</del><ins>+ return;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> ASSERT(!priv->client);
</span><span class="lines">@@ -510,10 +497,9 @@
</span><span class="cx"> }
</span><span class="cx"> locker.unlock();
</span><span class="cx"> webKitWebSrcStop(src);
</span><del>- return FALSE;
</del><ins>+ return;
</ins><span class="cx"> }
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Started request");
</span><del>- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static GstStateChangeReturn webKitWebSrcChangeState(GstElement* element, GstStateChange transition)
</span><span class="lines">@@ -545,13 +531,17 @@
</span><span class="cx"> switch (transition) {
</span><span class="cx"> case GST_STATE_CHANGE_READY_TO_PAUSED:
</span><span class="cx"> GST_DEBUG_OBJECT(src, "READY->PAUSED");
</span><del>- priv->startID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcStart, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</del><ins>+ gst_object_ref(src);
+ priv->startSource.schedule("[WebKit] webKitWebSrcStart", std::bind(webKitWebSrcStart, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
</ins><span class="cx"> break;
</span><span class="cx"> case GST_STATE_CHANGE_PAUSED_TO_READY:
</span><span class="cx"> GST_DEBUG_OBJECT(src, "PAUSED->READY");
</span><span class="cx"> // cancel pending sources
</span><span class="cx"> removeTimeoutSources(src);
</span><del>- priv->stopID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcStop, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</del><ins>+ gst_object_ref(src);
+ priv->stopSource.schedule("[WebKit] webKitWebSrcStop", std::bind(webKitWebSrcStop, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
</ins><span class="cx"> break;
</span><span class="cx"> default:
</span><span class="cx"> break;
</span><span class="lines">@@ -666,24 +656,18 @@
</span><span class="cx">
</span><span class="cx"> // appsrc callbacks
</span><span class="cx">
</span><del>-static gboolean webKitWebSrcNeedDataMainCb(WebKitWebSrc* src)
</del><ins>+static void webKitWebSrcNeedDataMainCb(WebKitWebSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitWebSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="cx"> ASSERT(isMainThread());
</span><span class="cx">
</span><span class="cx"> GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><del>- // already stopped
- if (!priv->needDataID)
- return FALSE;
-
</del><span class="cx"> priv->paused = FALSE;
</span><del>- priv->needDataID = 0;
</del><span class="cx"> locker.unlock();
</span><span class="cx">
</span><span class="cx"> if (priv->client)
</span><span class="cx"> priv->client->setDefersLoading(false);
</span><del>- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static void webKitWebSrcNeedDataCb(GstAppSrc*, guint length, gpointer userData)
</span><span class="lines">@@ -694,31 +678,26 @@
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Need more data: %u", length);
</span><span class="cx">
</span><span class="cx"> GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><del>- if (priv->needDataID || !priv->paused) {
</del><ins>+ if (priv->needDataSource.isScheduled() || !priv->paused)
</ins><span class="cx"> return;
</span><del>- }
</del><span class="cx">
</span><del>- priv->needDataID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcNeedDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</del><ins>+ gst_object_ref(src);
+ priv->needDataSource.schedule("[WebKit] webKitWebSrcNeedDataMainCb", std::bind(webKitWebSrcNeedDataMainCb, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean webKitWebSrcEnoughDataMainCb(WebKitWebSrc* src)
</del><ins>+static void webKitWebSrcEnoughDataMainCb(WebKitWebSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitWebSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="cx"> ASSERT(isMainThread());
</span><span class="cx">
</span><span class="cx"> GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><del>- // already stopped
- if (!priv->enoughDataID)
- return FALSE;
-
</del><span class="cx"> priv->paused = TRUE;
</span><del>- priv->enoughDataID = 0;
</del><span class="cx"> locker.unlock();
</span><span class="cx">
</span><span class="cx"> if (priv->client)
</span><span class="cx"> priv->client->setDefersLoading(true);
</span><del>- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static void webKitWebSrcEnoughDataCb(GstAppSrc*, gpointer userData)
</span><span class="lines">@@ -729,29 +708,20 @@
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Have enough data");
</span><span class="cx">
</span><span class="cx"> GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><del>- if (priv->enoughDataID || priv->paused) {
</del><ins>+ if (priv->enoughDataSource.isScheduled() || priv->paused)
</ins><span class="cx"> return;
</span><del>- }
</del><span class="cx">
</span><del>- priv->enoughDataID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcEnoughDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</del><ins>+ gst_object_ref(src);
+ priv->enoughDataSource.schedule("[WebKit] webKitWebSrcEnoughDataMainCb", std::bind(webKitWebSrcEnoughDataMainCb, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean webKitWebSrcSeekMainCb(WebKitWebSrc* src)
</del><ins>+static void webKitWebSrcSeekMainCb(WebKitWebSrc* src)
</ins><span class="cx"> {
</span><del>- WebKitWebSrcPrivate* priv = src->priv;
-
</del><span class="cx"> ASSERT(isMainThread());
</span><span class="cx">
</span><del>- GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
- // already stopped
- if (!priv->seekID)
- return FALSE;
- locker.unlock();
-
</del><span class="cx"> webKitWebSrcStop(src);
</span><span class="cx"> webKitWebSrcStart(src);
</span><del>-
- return FALSE;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static gboolean webKitWebSrcSeekDataCb(GstAppSrc*, guint64 offset, gpointer userData)
</span><span class="lines">@@ -770,9 +740,9 @@
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Doing range-request seek");
</span><span class="cx"> priv->requestedOffset = offset;
</span><span class="cx">
</span><del>- if (priv->seekID)
- g_source_remove(priv->seekID);
- priv->seekID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcSeekMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</del><ins>+ gst_object_ref(src);
+ priv->seekSource.schedule("[WebKit] webKitWebSrcSeekMainCb", std::bind(webKitWebSrcSeekMainCb, src), G_PRIORITY_DEFAULT,
+ [src] { gst_object_unref(src); });
</ins><span class="cx"> return TRUE;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -828,7 +798,7 @@
</span><span class="cx">
</span><span class="cx"> GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><span class="cx">
</span><del>- if (priv->seekID) {
</del><ins>+ if (priv->seekSource.isActive()) {
</ins><span class="cx"> GST_DEBUG_OBJECT(src, "Seek in progress, ignoring response");
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="lines">@@ -932,7 +902,7 @@
</span><span class="cx"> if (priv->buffer)
</span><span class="cx"> unmapGstBuffer(priv->buffer.get());
</span><span class="cx">
</span><del>- if (priv->seekID) {
</del><ins>+ if (priv->seekSource.isActive()) {
</ins><span class="cx"> GST_DEBUG_OBJECT(src, "Seek in progress, ignoring data");
</span><span class="cx"> priv->buffer.clear();
</span><span class="cx"> return;
</span><span class="lines">@@ -993,7 +963,7 @@
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Have EOS");
</span><span class="cx">
</span><span class="cx"> GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><del>- if (!priv->seekID) {
</del><ins>+ if (!priv->seekSource.isActive()) {
</ins><span class="cx"> locker.unlock();
</span><span class="cx"> gst_app_src_end_of_stream(priv->appsrc);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgtkGtkDragAndDropHelpercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/gtk/GtkDragAndDropHelper.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/gtk/GtkDragAndDropHelper.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/gtk/GtkDragAndDropHelper.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> #include "GtkVersioning.h"
</span><span class="cx"> #include "PasteboardHelper.h"
</span><span class="cx"> #include <gtk/gtk.h>
</span><ins>+#include <wtf/gobject/GMainLoopSource.h>
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="lines">@@ -68,18 +69,6 @@
</span><span class="cx"> PasteboardHelper::defaultPasteboardHelper()->fillSelectionData(selectionData, info, dataObject);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-struct HandleDragLaterData {
- DroppingContext* context;
- GtkDragAndDropHelper* glue;
-};
-
-static gboolean handleDragLeaveLaterCallback(HandleDragLaterData* data)
-{
- data->glue->handleDragLeaveLater(data->context);
- delete data;
- return FALSE;
-}
-
</del><span class="cx"> void GtkDragAndDropHelper::handleDragLeaveLater(DroppingContext* context)
</span><span class="cx"> {
</span><span class="cx"> auto iterator = m_droppingContexts.find(context->gdkContext);
</span><span class="lines">@@ -109,11 +98,8 @@
</span><span class="cx"> // During a drop GTK+ will fire a drag-leave signal right before firing
</span><span class="cx"> // the drag-drop signal. We want the actions for drag-leave to happen after
</span><span class="cx"> // those for drag-drop, so schedule them to happen asynchronously here.
</span><del>- HandleDragLaterData* data = new HandleDragLaterData;
- data->context = context;
- data->context->exitedCallback = exitedCallback;
- data->glue = this;
- g_idle_add_full(G_PRIORITY_DEFAULT, reinterpret_cast<GSourceFunc>(handleDragLeaveLaterCallback), data, 0);
</del><ins>+ context->exitedCallback = exitedCallback;
+ GMainLoopSource::createAndDeleteOnDestroy().schedule("[WebKit] handleDragLeaveLater", std::bind(&GtkDragAndDropHelper::handleDragLeaveLater, this, context));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static void queryNewDropContextData(DroppingContext* dropContext, GtkWidget* widget, guint time)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgtkSharedTimerGtkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/gtk/SharedTimerGtk.cpp (166051 => 166052)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/gtk/SharedTimerGtk.cpp        2014-03-21 07:58:30 UTC (rev 166051)
+++ trunk/Source/WebCore/platform/gtk/SharedTimerGtk.cpp        2014-03-21 08:04:59 UTC (rev 166052)
</span><span class="lines">@@ -28,47 +28,32 @@
</span><span class="cx"> #include "config.h"
</span><span class="cx"> #include "SharedTimer.h"
</span><span class="cx">
</span><del>-#include <wtf/Assertions.h>
-#include <wtf/CurrentTime.h>
</del><span class="cx"> #include <gdk/gdk.h>
</span><del>-#include <glib.h>
</del><ins>+#include <wtf/gobject/GMainLoopSource.h>
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-static guint sharedTimer;
</del><ins>+static GMainLoopSource gSharedTimer;
</ins><span class="cx"> static void (*sharedTimerFiredFunction)();
</span><span class="cx">
</span><span class="cx"> void setSharedTimerFiredFunction(void (*f)())
</span><span class="cx"> {
</span><span class="cx"> sharedTimerFiredFunction = f;
</span><ins>+ if (!sharedTimerFiredFunction)
+ gSharedTimer.cancel();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static gboolean sharedTimerTimeoutCallback(gpointer)
-{
- if (sharedTimerFiredFunction)
- sharedTimerFiredFunction();
- return FALSE;
-}
-
</del><span class="cx"> void setSharedTimerFireInterval(double interval)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(sharedTimerFiredFunction);
</span><span class="cx">
</span><del>- guint intervalInMS = static_cast<guint>(interval * 1000);
-
- stopSharedTimer();
- sharedTimer = g_timeout_add_full(GDK_PRIORITY_REDRAW, intervalInMS, sharedTimerTimeoutCallback, 0, 0);
- g_source_set_name_by_id(sharedTimer, "[WebKit] sharedTimerTimeoutCallback");
</del><ins>+ gSharedTimer.scheduleAfterDelay("[WebKit] sharedTimerTimeoutCallback", sharedTimerFiredFunction,
+ std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::duration<double>(interval)), GDK_PRIORITY_REDRAW);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void stopSharedTimer()
</span><span class="cx"> {
</span><del>- if (sharedTimer == 0)
- return;
-
- gboolean removedSource = g_source_remove(sharedTimer);
- ASSERT_UNUSED(removedSource, removedSource);
- sharedTimer = 0;
</del><ins>+ gSharedTimer.cancel();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre>
</div>
</div>
</body>
</html>