<!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>[166055] 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/166055">166055</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-03-21 01:54:19 -0700 (Fri, 21 Mar 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>Unreviewed, rolling out <a href="http://trac.webkit.org/projects/webkit/changeset/166052">r166052</a>.
https://bugs.webkit.org/show_bug.cgi?id=130571
It broke EFL build (Requested by KaL on #webkit).
Reverted changeset:
"[GTK] Use GMainLoopSource for idle and timeout sources in
WebCore"
https://bugs.webkit.org/show_bug.cgi?id=130078
http://trac.webkit.org/changeset/166052</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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/ChangeLog        2014-03-21 08:54:19 UTC (rev 166055)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2014-03-21 Commit Queue <commit-queue@webkit.org>
+
+ Unreviewed, rolling out r166052.
+ https://bugs.webkit.org/show_bug.cgi?id=130571
+
+ It broke EFL build (Requested by KaL on #webkit).
+
+ Reverted changeset:
+
+ "[GTK] Use GMainLoopSource for idle and timeout sources in
+ WebCore"
+ https://bugs.webkit.org/show_bug.cgi?id=130078
+ http://trac.webkit.org/changeset/166052
+
</ins><span class="cx"> 2014-03-21 Gyuyoung Kim <gyuyoung.kim@samsung.com>
</span><span class="cx">
</span><span class="cx"> Add *explicit* keyword to avoid implicit type conversion
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudiogstreamerAudioFileReaderGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp        2014-03-21 08:54:19 UTC (rev 166055)
</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><del>-#include <gst/audio/audio.h>
</del><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><del>-#include <wtf/gobject/GMainLoopSource.h>
</del><span class="cx"> #include <wtf/gobject/GRefPtr.h>
</span><span class="cx"> #include <wtf/gobject/GUniquePtr.h>
</span><span class="cx">
</span><ins>+#include <gst/audio/audio.h>
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="cx"> class AudioFileReader {
</span><span class="lines">@@ -108,6 +108,13 @@
</span><span class="cx"> reader->plugDeinterleave(pad);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+gboolean enteredMainLoopCallback(gpointer userData)
+{
+ AudioFileReader* reader = reinterpret_cast<AudioFileReader*>(userData);
+ reader->decodeAudioForBusCreation();
+ return FALSE;
+}
+
</ins><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">@@ -334,8 +341,9 @@
</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>- GMainLoopSource source;
- source.schedule("[WebKit] AudioFileReader::decodeAudioForBusCreation", std::bind(&AudioFileReader::decodeAudioForBusCreation, this), G_PRIORITY_DEFAULT, nullptr, context.get());
</del><ins>+ 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);
</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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp        2014-03-21 08:54:19 UTC (rev 166055)
</span><span class="lines">@@ -52,8 +52,22 @@
</span><span class="cx"> return GST_PAD_PROBE_OK;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+static gboolean textTrackPrivateSampleTimeoutCallback(InbandTextTrackPrivateGStreamer* track)
+{
+ track->notifyTrackOfSample();
+ return FALSE;
+}
+
+static gboolean textTrackPrivateStreamTimeoutCallback(InbandTextTrackPrivateGStreamer* track)
+{
+ track->notifyTrackOfStreamChanged();
+ return FALSE;
+}
+
</ins><span class="cx"> InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(gint index, GRefPtr<GstPad> pad)
</span><span class="cx"> : InbandTextTrackPrivate(WebVTT), TrackPrivateBaseGStreamer(this, index, pad)
</span><ins>+ , m_sampleTimerHandler(0)
+ , m_streamTimerHandler(0)
</ins><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">@@ -68,28 +82,36 @@
</span><span class="cx">
</span><span class="cx"> gst_pad_remove_probe(m_pad.get(), m_eventProbe);
</span><span class="cx">
</span><del>- m_streamTimerHandler.cancel();
</del><ins>+ if (m_streamTimerHandler)
+ g_source_remove(m_streamTimerHandler);
</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>- m_sampleTimerHandler.cancel();
</del><ins>+ if (m_sampleTimerHandler)
+ g_source_remove(m_sampleTimerHandler);
</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.schedule("[WebKit] InbandTextTrackPrivateGStreamer::notifyTrackOfSample", std::bind(&InbandTextTrackPrivateGStreamer::notifyTrackOfSample, this));
</del><ins>+ m_sampleTimerHandler = g_timeout_add(0,
+ reinterpret_cast<GSourceFunc>(textTrackPrivateSampleTimeoutCallback), this);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void InbandTextTrackPrivateGStreamer::streamChanged()
</span><span class="cx"> {
</span><del>- m_streamTimerHandler.schedule("[WebKit] InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged", std::bind(&InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged, this));
</del><ins>+ if (m_streamTimerHandler)
+ g_source_remove(m_streamTimerHandler);
+ m_streamTimerHandler = g_timeout_add(0,
+ reinterpret_cast<GSourceFunc>(textTrackPrivateStreamTimeoutCallback), this);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void InbandTextTrackPrivateGStreamer::notifyTrackOfSample()
</span><span class="cx"> {
</span><ins>+ m_sampleTimerHandler = 0;
+
</ins><span class="cx"> Vector<GRefPtr<GstSample> > samples;
</span><span class="cx"> {
</span><span class="cx"> MutexLocker lock(m_sampleMutex);
</span><span class="lines">@@ -120,6 +142,8 @@
</span><span class="cx">
</span><span class="cx"> void InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged()
</span><span class="cx"> {
</span><ins>+ m_streamTimerHandler = 0;
+
</ins><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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h        2014-03-21 08:54:19 UTC (rev 166055)
</span><span class="lines">@@ -31,7 +31,6 @@
</span><span class="cx"> #include "GRefPtrGStreamer.h"
</span><span class="cx"> #include "InbandTextTrackPrivate.h"
</span><span class="cx"> #include "TrackPrivateBaseGStreamer.h"
</span><del>-#include <wtf/gobject/GMainLoopSource.h>
</del><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="lines">@@ -62,8 +61,8 @@
</span><span class="cx"> private:
</span><span class="cx"> InbandTextTrackPrivateGStreamer(gint index, GRefPtr<GstPad>);
</span><span class="cx">
</span><del>- GMainLoopSource m_sampleTimerHandler;
- GMainLoopSource m_streamTimerHandler;
</del><ins>+ guint m_sampleTimerHandler;
+ guint 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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp        2014-03-21 08:54:19 UTC (rev 166055)
</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 unsigned gReadyStateTimerInterval = 60;
</del><ins>+static const guint 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,18 +92,46 @@
</span><span class="cx"> player->audioChanged();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+static gboolean mediaPlayerPrivateAudioChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
+{
+ // This is the callback of the timeout source created in ::audioChanged.
+ player->notifyPlayerOfAudio();
+ return FALSE;
+}
+
</ins><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><ins>+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;
+}
+
</ins><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><ins>+static gboolean mediaPlayerPrivateTextChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
+{
+ // This is the callback of the timeout source created in ::textChanged.
+ player->notifyPlayerOfText();
+ return FALSE;
+}
+
</ins><span class="cx"> static GstFlowReturn mediaPlayerPrivateNewTextSampleCallback(GObject*, MediaPlayerPrivateGStreamer* player)
</span><span class="cx"> {
</span><span class="cx"> player->newTextSample();
</span><span class="lines">@@ -111,6 +139,14 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><ins>+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;
+}
+
</ins><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">@@ -213,6 +249,11 @@
</span><span class="cx"> , m_volumeAndMuteInitialized(false)
</span><span class="cx"> , m_hasVideo(false)
</span><span class="cx"> , m_hasAudio(false)
</span><ins>+ , m_audioTimerHandler(0)
+ , m_textTimerHandler(0)
+ , m_videoTimerHandler(0)
+ , m_videoCapsTimerHandler(0)
+ , m_readyTimerHandler(0)
</ins><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">@@ -244,7 +285,8 @@
</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>- m_readyTimerHandler.cancel();
</del><ins>+ if (m_readyTimerHandler)
+ g_source_remove(m_readyTimerHandler);
</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">@@ -266,6 +308,18 @@
</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><ins>+
+ 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);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::load(const String& url)
</span><span class="lines">@@ -389,11 +443,12 @@
</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.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();
</del><ins>+ 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;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> return true;
</span><span class="lines">@@ -614,16 +669,24 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::videoChanged()
</span><span class="cx"> {
</span><del>- m_videoTimerHandler.schedule("[WebKit] MediaPlayerPrivateGStreamer::videoChanged", std::bind(&MediaPlayerPrivateGStreamer::notifyPlayerOfVideo, this));
</del><ins>+ 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");
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::videoCapsChanged()
</span><span class="cx"> {
</span><del>- m_videoCapsTimerHandler.schedule("[WebKit] MediaPlayerPrivateGStreamer::videoCapsChanged", std::bind(&MediaPlayerPrivateGStreamer::notifyPlayerOfVideoCaps, this));
</del><ins>+ 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");
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::notifyPlayerOfVideo()
</span><span class="cx"> {
</span><ins>+ m_videoTimerHandler = 0;
+
</ins><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">@@ -661,17 +724,23 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::notifyPlayerOfVideoCaps()
</span><span class="cx"> {
</span><ins>+ m_videoCapsTimerHandler = 0;
</ins><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>- m_audioTimerHandler.schedule("[WebKit] MediaPlayerPrivateGStreamer::audioChanged", std::bind(&MediaPlayerPrivateGStreamer::notifyPlayerOfAudio, this));
</del><ins>+ 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");
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::notifyPlayerOfAudio()
</span><span class="cx"> {
</span><ins>+ m_audioTimerHandler = 0;
+
</ins><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">@@ -710,11 +779,16 @@
</span><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><span class="cx"> void MediaPlayerPrivateGStreamer::textChanged()
</span><span class="cx"> {
</span><del>- m_textTimerHandler.schedule("[WebKit] MediaPlayerPrivateGStreamer::textChanged", std::bind(&MediaPlayerPrivateGStreamer::notifyPlayerOfText, this));
</del><ins>+ 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");
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamer::notifyPlayerOfText()
</span><span class="cx"> {
</span><ins>+ m_textTimerHandler = 0;
+
</ins><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">@@ -1566,7 +1640,10 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // Loading failed, remove ready timer.
</span><del>- m_readyTimerHandler.cancel();
</del><ins>+ if (m_readyTimerHandler) {
+ g_source_remove(m_readyTimerHandler);
+ m_readyTimerHandler = 0;
+ }
</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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h        2014-03-21 08:54:19 UTC (rev 166055)
</span><span class="lines">@@ -32,7 +32,6 @@
</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><del>-#include <wtf/gobject/GMainLoopSource.h>
</del><span class="cx">
</span><span class="cx"> #if ENABLE(MEDIA_SOURCE)
</span><span class="cx"> #include "MediaSourceGStreamer.h"
</span><span class="lines">@@ -190,11 +189,11 @@
</span><span class="cx"> bool m_volumeAndMuteInitialized;
</span><span class="cx"> bool m_hasVideo;
</span><span class="cx"> bool m_hasAudio;
</span><del>- GMainLoopSource m_audioTimerHandler;
- GMainLoopSource m_textTimerHandler;
- GMainLoopSource m_videoTimerHandler;
- GMainLoopSource m_videoCapsTimerHandler;
- GMainLoopSource m_readyTimerHandler;
</del><ins>+ guint m_audioTimerHandler;
+ guint m_textTimerHandler;
+ guint m_videoTimerHandler;
+ guint m_videoCapsTimerHandler;
+ guint 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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp        2014-03-21 08:54:19 UTC (rev 166055)
</span><span class="lines">@@ -72,12 +72,26 @@
</span><span class="cx"> player->volumeChanged();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+static gboolean mediaPlayerPrivateVolumeChangeTimeoutCallback(MediaPlayerPrivateGStreamerBase* player)
+{
+ // This is the callback of the timeout source created in ::volumeChanged.
+ player->notifyPlayerOfVolumeChange();
+ return FALSE;
+}
+
</ins><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><ins>+static gboolean mediaPlayerPrivateMuteChangeTimeoutCallback(MediaPlayerPrivateGStreamerBase* player)
+{
+ // This is the callback of the timeout source created in ::muteChanged.
+ player->notifyPlayerOfMute();
+ return FALSE;
+}
+
</ins><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">@@ -89,6 +103,8 @@
</span><span class="cx"> , m_readyState(MediaPlayer::HaveNothing)
</span><span class="cx"> , m_networkState(MediaPlayer::Empty)
</span><span class="cx"> , m_buffer(0)
</span><ins>+ , m_volumeTimerHandler(0)
+ , m_muteTimerHandler(0)
</ins><span class="cx"> , m_repaintHandler(0)
</span><span class="cx"> , m_volumeSignalHandler(0)
</span><span class="cx"> , m_muteSignalHandler(0)
</span><span class="lines">@@ -118,6 +134,12 @@
</span><span class="cx">
</span><span class="cx"> m_player = 0;
</span><span class="cx">
</span><ins>+ if (m_muteTimerHandler)
+ g_source_remove(m_muteTimerHandler);
+
+ if (m_volumeTimerHandler)
+ g_source_remove(m_volumeTimerHandler);
+
</ins><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">@@ -209,6 +231,8 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamerBase::notifyPlayerOfVolumeChange()
</span><span class="cx"> {
</span><ins>+ m_volumeTimerHandler = 0;
+
</ins><span class="cx"> if (!m_player || !m_volumeElement)
</span><span class="cx"> return;
</span><span class="cx"> double volume;
</span><span class="lines">@@ -222,7 +246,10 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamerBase::volumeChanged()
</span><span class="cx"> {
</span><del>- m_volumeTimerHandler.schedule("[WebKit] MediaPlayerPrivateGStreamerBase::volumeChanged", std::bind(&MediaPlayerPrivateGStreamerBase::notifyPlayerOfVolumeChange, this));
</del><ins>+ 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");
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> MediaPlayer::NetworkState MediaPlayerPrivateGStreamerBase::networkState() const
</span><span class="lines">@@ -260,6 +287,8 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamerBase::notifyPlayerOfMute()
</span><span class="cx"> {
</span><ins>+ m_muteTimerHandler = 0;
+
</ins><span class="cx"> if (!m_player || !m_volumeElement)
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="lines">@@ -270,9 +299,13 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateGStreamerBase::muteChanged()
</span><span class="cx"> {
</span><del>- m_muteTimerHandler.schedule("[WebKit] MediaPlayerPrivateGStreamerBase::muteChanged", std::bind(&MediaPlayerPrivateGStreamerBase::notifyPlayerOfMute, this));
</del><ins>+ 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");
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+
</ins><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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h        2014-03-21 08:54:19 UTC (rev 166055)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx"> #include <glib.h>
</span><span class="cx">
</span><span class="cx"> #include <wtf/Forward.h>
</span><del>-#include <wtf/gobject/GMainLoopSource.h>
</del><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">@@ -120,8 +119,8 @@
</span><span class="cx"> IntSize m_size;
</span><span class="cx"> GMutex* m_bufferMutex;
</span><span class="cx"> GstBuffer* m_buffer;
</span><del>- GMainLoopSource m_volumeTimerHandler;
- GMainLoopSource m_muteTimerHandler;
</del><ins>+ unsigned long m_volumeTimerHandler;
+ unsigned long 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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp        2014-03-21 08:54:19 UTC (rev 166055)
</span><span class="lines">@@ -53,10 +53,24 @@
</span><span class="cx"> track->tagsChanged();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+static gboolean trackPrivateActiveChangeTimeoutCallback(TrackPrivateBaseGStreamer* track)
+{
+ track->notifyTrackOfActiveChanged();
+ return FALSE;
+}
+
+static gboolean trackPrivateTagsChangeTimeoutCallback(TrackPrivateBaseGStreamer* track)
+{
+ track->notifyTrackOfTagsChanged();
+ return FALSE;
+}
+
</ins><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><ins>+ , m_activeTimerHandler(0)
+ , m_tagTimerHandler(0)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(m_pad);
</span><span class="cx">
</span><span class="lines">@@ -83,21 +97,31 @@
</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>- m_activeTimerHandler.cancel();
- m_tagTimerHandler.cancel();
</del><ins>+ if (m_activeTimerHandler)
+ g_source_remove(m_activeTimerHandler);
+ m_activeTimerHandler = 0;
</ins><span class="cx">
</span><ins>+ if (m_tagTimerHandler)
+ g_source_remove(m_tagTimerHandler);
+ m_tagTimerHandler = 0;
+
</ins><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>- m_activeTimerHandler.schedule("[WebKit] TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged", std::bind(&TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged, this));
</del><ins>+ 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");
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void TrackPrivateBaseGStreamer::tagsChanged()
</span><span class="cx"> {
</span><del>- m_tagTimerHandler.cancel();
</del><ins>+ if (m_tagTimerHandler)
+ g_source_remove(m_tagTimerHandler);
</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">@@ -106,11 +130,14 @@
</span><span class="cx"> m_tags.swap(tags);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- m_tagTimerHandler.schedule("[WebKit] TrackPrivateBaseGStreamer::notifyTrackOfTagsChanged", std::bind(&TrackPrivateBaseGStreamer::notifyTrackOfTagsChanged, this));
</del><ins>+ m_tagTimerHandler = g_timeout_add(0,
+ reinterpret_cast<GSourceFunc>(trackPrivateTagsChangeTimeoutCallback), this);
+ g_source_set_name_by_id(m_tagTimerHandler, "[WebKit] trackPrivateTagsChangeTimeoutCallback");
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void TrackPrivateBaseGStreamer::notifyTrackOfActiveChanged()
</span><span class="cx"> {
</span><ins>+ m_activeTimerHandler = 0;
</ins><span class="cx"> if (!m_pad)
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="lines">@@ -148,6 +175,7 @@
</span><span class="cx">
</span><span class="cx"> void TrackPrivateBaseGStreamer::notifyTrackOfTagsChanged()
</span><span class="cx"> {
</span><ins>+ m_tagTimerHandler = 0;
</ins><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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h        2014-03-21 08:54:19 UTC (rev 166055)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx">
</span><span class="cx"> #include "GRefPtrGStreamer.h"
</span><span class="cx"> #include <wtf/ThreadingPrimitives.h>
</span><del>-#include <wtf/gobject/GMainLoopSource.h>
</del><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -68,8 +67,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>- GMainLoopSource m_activeTimerHandler;
- GMainLoopSource m_tagTimerHandler;
</del><ins>+ guint m_activeTimerHandler;
+ guint 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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp        2014-03-21 08:54:19 UTC (rev 166055)
</span><span class="lines">@@ -36,7 +36,6 @@
</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><del>-#include <wtf/gobject/GMainLoopSource.h>
</del><span class="cx"> #include <wtf/gobject/GMutexLocker.h>
</span><span class="cx">
</span><span class="cx"> using namespace WebCore;
</span><span class="lines">@@ -75,7 +74,7 @@
</span><span class="cx">
</span><span class="cx"> struct _WebKitVideoSinkPrivate {
</span><span class="cx"> GstBuffer* buffer;
</span><del>- GMainLoopSource timeoutSource;
</del><ins>+ guint timeoutId;
</ins><span class="cx"> GMutex* bufferMutex;
</span><span class="cx"> GCond* dataCondition;
</span><span class="cx">
</span><span class="lines">@@ -101,7 +100,6 @@
</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><del>- new (sink->priv) WebKitVideoSinkPrivate();
</del><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">@@ -115,22 +113,26 @@
</span><span class="cx"> gst_video_info_init(&sink->priv->info);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static void webkitVideoSinkTimeoutCallback(WebKitVideoSink* sink)
</del><ins>+static gboolean webkitVideoSinkTimeoutCallback(gpointer data)
</ins><span class="cx"> {
</span><ins>+ WebKitVideoSink* sink = reinterpret_cast<WebKitVideoSink*>(data);
</ins><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><ins>+ priv->timeoutId = 0;
</ins><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;
</del><ins>+ return FALSE;
</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><ins>+
+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static GstFlowReturn webkitVideoSinkRender(GstBaseSink* baseSink, GstBuffer* buffer)
</span><span class="lines">@@ -214,9 +216,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>- gst_object_ref(sink);
- priv->timeoutSource.schedule("[WebKit] webkitVideoSinkTimeoutCallback", std::bind(webkitVideoSinkTimeoutCallback, sink), G_PRIORITY_DEFAULT,
- [sink] { gst_object_unref(sink); });
</del><ins>+ 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");
</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">@@ -250,12 +252,6 @@
</span><span class="cx"> G_OBJECT_CLASS(parent_class)->dispose(object);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static void webkitVideoSinkFinalize(GObject* object)
-{
- WEBKIT_VIDEO_SINK(object)->priv->~WebKitVideoSinkPrivate();
- G_OBJECT_CLASS(parent_class)->finalize(object);
-}
-
</del><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">@@ -380,7 +376,6 @@
</span><span class="cx"> g_type_class_add_private(klass, sizeof(WebKitVideoSinkPrivate));
</span><span class="cx">
</span><span class="cx"> gobjectClass->dispose = webkitVideoSinkDispose;
</span><del>- gobjectClass->finalize = webkitVideoSinkFinalize;
</del><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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp        2014-03-21 08:54:19 UTC (rev 166055)
</span><span class="lines">@@ -30,7 +30,6 @@
</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><del>-#include <wtf/gobject/GMainLoopSource.h>
</del><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">@@ -44,11 +43,11 @@
</span><span class="cx"> guint64 size;
</span><span class="cx"> gboolean paused;
</span><span class="cx">
</span><del>- GMainLoopSource start;
- GMainLoopSource stop;
- GMainLoopSource needData;
- GMainLoopSource enoughData;
- GMainLoopSource seek;
</del><ins>+ guint startId;
+ guint stopId;
+ guint needDataId;
+ guint enoughDataId;
+ guint seekId;
</ins><span class="cx">
</span><span class="cx"> guint64 requestedOffset;
</span><span class="cx"> } Source;
</span><span class="lines">@@ -173,7 +172,6 @@
</span><span class="cx"> {
</span><span class="cx"> WebKitMediaSrcPrivate* priv = WEBKIT_MEDIA_SRC_GET_PRIVATE(src);
</span><span class="cx"> src->priv = priv;
</span><del>- new (priv) WebKitMediaSrcPrivate();
</del><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">@@ -190,7 +188,6 @@
</span><span class="cx"> WebKitMediaSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="cx"> g_free(priv->uri);
</span><del>- priv->~WebKitMediaSrcPrivate();
</del><span class="cx">
</span><span class="cx"> GST_CALL_PARENT(G_OBJECT_CLASS, finalize, (object));
</span><span class="cx"> }
</span><span class="lines">@@ -226,24 +223,36 @@
</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 void webKitMediaVideoSrcStop(WebKitMediaSrc* src)
</del><ins>+static gboolean 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.seek.isActive();
</del><ins>+ seeking = priv->sourceVideo.seekId;
</ins><span class="cx">
</span><del>- priv->sourceVideo.start.cancel();
</del><ins>+ if (priv->sourceVideo.startId) {
+ g_source_remove(priv->sourceVideo.startId);
+ priv->sourceVideo.startId = 0;
+ }
</ins><span class="cx">
</span><span class="cx"> priv->player = 0;
</span><span class="cx"> priv->playbin = 0;
</span><span class="cx">
</span><del>- priv->sourceVideo.needData.cancel();
- priv->sourceVideo.enoughData.cancel();
- priv->sourceVideo.seek.cancel();
</del><ins>+ if (priv->sourceVideo.needDataId)
+ g_source_remove(priv->sourceVideo.needDataId);
+ priv->sourceVideo.needDataId = 0;
</ins><span class="cx">
</span><ins>+ 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;
+
</ins><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">@@ -251,6 +260,8 @@
</span><span class="cx"> priv->duration = 0;
</span><span class="cx"> priv->nbSource = 0;
</span><span class="cx">
</span><ins>+ priv->sourceVideo.stopId = 0;
+
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx">
</span><span class="cx"> if (priv->sourceVideo.appsrc) {
</span><span class="lines">@@ -260,27 +271,41 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Stopped request");
</span><ins>+
+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static void webKitMediaAudioSrcStop(WebKitMediaSrc* src)
</del><ins>+static gboolean 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.seek.isActive();
</del><ins>+ seeking = priv->sourceAudio.seekId;
</ins><span class="cx">
</span><del>- priv->sourceAudio.start.cancel();
</del><ins>+ if (priv->sourceAudio.startId) {
+ g_source_remove(priv->sourceAudio.startId);
+ priv->sourceAudio.startId = 0;
+ }
</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>- priv->sourceAudio.needData.cancel();
- priv->sourceAudio.enoughData.cancel();
- priv->sourceAudio.seek.cancel();
</del><ins>+ if (priv->sourceAudio.needDataId)
+ g_source_remove(priv->sourceAudio.needDataId);
+ priv->sourceAudio.needDataId = 0;
</ins><span class="cx">
</span><ins>+ 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;
+
</ins><span class="cx"> priv->sourceAudio.paused = FALSE;
</span><span class="cx">
</span><span class="cx"> priv->sourceAudio.offset = 0;
</span><span class="lines">@@ -290,6 +315,8 @@
</span><span class="cx"> priv->duration = 0;
</span><span class="cx"> priv->nbSource = 0;
</span><span class="cx">
</span><ins>+ priv->sourceAudio.stopId = 0;
+
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx">
</span><span class="cx"> if (priv->sourceAudio.appsrc) {
</span><span class="lines">@@ -299,10 +326,12 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Stopped request");
</span><ins>+
+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // must be called on main thread and with object unlocked
</span><del>-static void webKitMediaVideoSrcStart(WebKitMediaSrc* src)
</del><ins>+static gboolean webKitMediaVideoSrcStart(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitMediaSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="lines">@@ -311,15 +340,19 @@
</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;
</del><ins>+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+ priv->sourceVideo.startId = 0;
+
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Started request");
</span><ins>+
+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // must be called on main thread and with object unlocked
</span><del>-static void webKitMediaAudioSrcStart(WebKitMediaSrc* src)
</del><ins>+static gboolean webKitMediaAudioSrcStart(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitMediaSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="lines">@@ -328,11 +361,15 @@
</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;
</del><ins>+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+ priv->sourceAudio.startId = 0;
+
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Started request");
</span><ins>+
+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static GstStateChangeReturn webKitMediaSrcChangeState(GstElement* element, GstStateChange transition)
</span><span class="lines">@@ -364,29 +401,19 @@
</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>-
- 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); });
-
</del><ins>+ 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");
</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>-
- 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); });
-
</del><ins>+ 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");
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> break;
</span><span class="cx"> default:
</span><span class="lines">@@ -492,22 +519,40 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // appsrc callbacks
</span><del>-static void webKitMediaVideoSrcNeedDataMainCb(WebKitMediaSrc* src)
</del><ins>+static gboolean 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><ins>+ // already stopped
+ if (!priv->sourceVideo.needDataId) {
+ GST_OBJECT_UNLOCK(src);
+ return FALSE;
+ }
+
</ins><span class="cx"> priv->sourceVideo.paused = FALSE;
</span><ins>+ priv->sourceVideo.needDataId = 0;
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><ins>+
+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static void webKitMediaAudioSrcNeedDataMainCb(WebKitMediaSrc* src)
</del><ins>+static gboolean 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><ins>+ // already stopped
+ if (!priv->sourceAudio.needDataId) {
+ GST_OBJECT_UNLOCK(src);
+ return FALSE;
+ }
+
</ins><span class="cx"> priv->sourceAudio.paused = FALSE;
</span><ins>+ priv->sourceAudio.needDataId = 0;
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><ins>+
+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static void webKitMediaVideoSrcNeedDataCb(GstAppSrc*, guint length, gpointer userData)
</span><span class="lines">@@ -518,14 +563,13 @@
</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.needData.isScheduled() || !priv->sourceVideo.paused) {
</del><ins>+ if (priv->sourceVideo.needDataId || !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>- gst_object_ref(src);
- priv->sourceVideo.needData.schedule("[WebKit] webKitMediaVideoSrcNeedDataMainCb", std::bind(webKitMediaVideoSrcNeedDataMainCb, src), G_PRIORITY_DEFAULT,
- [src] { gst_object_unref(src); });
</del><ins>+ 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");
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -537,33 +581,50 @@
</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.needData.isScheduled() || !priv->sourceAudio.paused) {
</del><ins>+ if (priv->sourceAudio.needDataId || !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>- gst_object_ref(src);
- priv->sourceAudio.needData.schedule("[WebKit] webKitMediaAudioSrcNeedDataMainCb", std::bind(webKitMediaAudioSrcNeedDataMainCb, src), G_PRIORITY_DEFAULT,
- [src] { gst_object_unref(src); });
</del><ins>+ 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");
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static void webKitMediaVideoSrcEnoughDataMainCb(WebKitMediaSrc* src)
</del><ins>+static gboolean 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><ins>+ // already stopped
+ if (!priv->sourceVideo.enoughDataId) {
+ GST_OBJECT_UNLOCK(src);
+ return FALSE;
+ }
+
</ins><span class="cx"> priv->sourceVideo.paused = TRUE;
</span><ins>+ priv->sourceVideo.enoughDataId = 0;
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><ins>+
+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static void webKitMediaAudioSrcEnoughDataMainCb(WebKitMediaSrc* src)
</del><ins>+static gboolean 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><ins>+ // already stopped
+ if (!priv->sourceAudio.enoughDataId) {
+ GST_OBJECT_UNLOCK(src);
+ return FALSE;
+ }
+
</ins><span class="cx"> priv->sourceAudio.paused = TRUE;
</span><ins>+ priv->sourceAudio.enoughDataId = 0;
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><ins>+
+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static void webKitMediaVideoSrcEnoughDataCb(GstAppSrc*, gpointer userData)
</span><span class="lines">@@ -574,15 +635,13 @@
</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.enoughData.isScheduled() || priv->sourceVideo.paused) {
</del><ins>+ if (priv->sourceVideo.enoughDataId || 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>- gst_object_ref(src);
- priv->sourceVideo.enoughData.schedule("[WebKit] webKitMediaVideoSrcEnoughDataMainCb", std::bind(webKitMediaVideoSrcEnoughDataMainCb, src), G_PRIORITY_DEFAULT,
- [src] { gst_object_unref(src); });
-
</del><ins>+ 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");
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -594,27 +653,28 @@
</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.enoughData.isScheduled() || priv->sourceAudio.paused) {
</del><ins>+ if (priv->sourceAudio.enoughDataId || 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>- gst_object_ref(src);
- priv->sourceAudio.enoughData.schedule("[WebKit] webKitMediaAudioSrcEnoughDataMainCb", std::bind(webKitMediaAudioSrcEnoughDataMainCb, src), G_PRIORITY_DEFAULT,
- [src] { gst_object_unref(src); });
-
</del><ins>+ 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");
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static void webKitMediaVideoSrcSeekMainCb(WebKitMediaSrc*)
</del><ins>+static gboolean webKitMediaVideoSrcSeekMainCb(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> notImplemented();
</span><ins>+ src->priv->sourceVideo.seekId = 0;
+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-
-static void webKitMediaAudioSrcSeekMainCb(WebKitMediaSrc*)
</del><ins>+static gboolean webKitMediaAudioSrcSeekMainCb(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> notImplemented();
</span><ins>+ src->priv->sourceAudio.seekId = 0;
+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static gboolean webKitMediaVideoSrcSeekDataCb(GstAppSrc*, guint64 offset, gpointer userData)
</span><span class="lines">@@ -641,10 +701,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>- gst_object_ref(src);
- priv->sourceVideo.seek.schedule("[WebKit] webKitMediaVideoSrcSeekMainCb", std::bind(webKitMediaVideoSrcSeekMainCb, src), G_PRIORITY_DEFAULT,
- [src] { gst_object_unref(src); });
-
</del><ins>+ 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");
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx">
</span><span class="cx"> return TRUE;
</span><span class="lines">@@ -674,10 +734,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>- gst_object_ref(src);
- priv->sourceAudio.seek.schedule("[WebKit] webKitMediaAudioSrcSeekMainCb", std::bind(webKitMediaAudioSrcSeekMainCb, src), G_PRIORITY_DEFAULT,
- [src] { gst_object_unref(src); });
-
</del><ins>+ 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");
</ins><span class="cx"> GST_OBJECT_UNLOCK(src);
</span><span class="cx">
</span><span class="cx"> return TRUE;
</span><span class="lines">@@ -762,14 +822,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.seek.isActive()) {
</del><ins>+ if (!priv->sourceVideo.seekId) {
</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.seek.isActive()) {
</del><ins>+ if (!priv->sourceAudio.seekId) {
</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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp        2014-03-21 08:54:19 UTC (rev 166055)
</span><span class="lines">@@ -40,7 +40,6 @@
</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><del>-#include <wtf/gobject/GMainLoopSource.h>
</del><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">@@ -127,11 +126,11 @@
</span><span class="cx">
</span><span class="cx"> guint64 requestedOffset;
</span><span class="cx">
</span><del>- GMainLoopSource startSource;
- GMainLoopSource stopSource;
- GMainLoopSource needDataSource;
- GMainLoopSource enoughDataSource;
- GMainLoopSource seekSource;
</del><ins>+ guint startID;
+ guint stopID;
+ guint needDataID;
+ guint enoughDataID;
+ guint seekID;
</ins><span class="cx">
</span><span class="cx"> GRefPtr<GstBuffer> buffer;
</span><span class="cx">
</span><span class="lines">@@ -254,7 +253,6 @@
</span><span class="cx"> WebKitWebSrcPrivate* priv = WEBKIT_WEB_SRC_GET_PRIVATE(src);
</span><span class="cx">
</span><span class="cx"> src->priv = priv;
</span><del>- new (priv) WebKitWebSrcPrivate();
</del><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">@@ -316,7 +314,6 @@
</span><span class="cx"> WebKitWebSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="cx"> g_free(priv->uri);
</span><del>- priv->~WebKitWebSrcPrivate();
</del><span class="cx">
</span><span class="cx"> GST_CALL_PARENT(G_OBJECT_CLASS, finalize, (object));
</span><span class="cx"> }
</span><span class="lines">@@ -367,13 +364,24 @@
</span><span class="cx"> {
</span><span class="cx"> WebKitWebSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><del>- priv->startSource.cancel();
- priv->needDataSource.cancel();
- priv->enoughDataSource.cancel();
- priv->seekSource.cancel();
</del><ins>+ 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;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static void webKitWebSrcStop(WebKitWebSrc* src)
</del><ins>+static gboolean webKitWebSrcStop(WebKitWebSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitWebSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="lines">@@ -381,9 +389,10 @@
</span><span class="cx">
</span><span class="cx"> GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><span class="cx">
</span><del>- bool seeking = priv->seekSource.isActive();
</del><ins>+ bool seeking = priv->seekID;
</ins><span class="cx">
</span><span class="cx"> removeTimeoutSources(src);
</span><ins>+ priv->stopID = 0;
</ins><span class="cx">
</span><span class="cx"> if (priv->client) {
</span><span class="cx"> delete priv->client;
</span><span class="lines">@@ -427,9 +436,11 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Stopped request");
</span><ins>+
+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static void webKitWebSrcStart(WebKitWebSrc* src)
</del><ins>+static gboolean webKitWebSrcStart(WebKitWebSrc* src)
</ins><span class="cx"> {
</span><span class="cx"> WebKitWebSrcPrivate* priv = src->priv;
</span><span class="cx">
</span><span class="lines">@@ -437,11 +448,13 @@
</span><span class="cx">
</span><span class="cx"> GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><span class="cx">
</span><ins>+ priv->startID = 0;
+
</ins><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;
</del><ins>+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> ASSERT(!priv->client);
</span><span class="lines">@@ -497,9 +510,10 @@
</span><span class="cx"> }
</span><span class="cx"> locker.unlock();
</span><span class="cx"> webKitWebSrcStop(src);
</span><del>- return;
</del><ins>+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx"> GST_DEBUG_OBJECT(src, "Started request");
</span><ins>+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static GstStateChangeReturn webKitWebSrcChangeState(GstElement* element, GstStateChange transition)
</span><span class="lines">@@ -531,17 +545,13 @@
</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>- gst_object_ref(src);
- priv->startSource.schedule("[WebKit] webKitWebSrcStart", std::bind(webKitWebSrcStart, src), G_PRIORITY_DEFAULT,
- [src] { gst_object_unref(src); });
</del><ins>+ priv->startID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcStart, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</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>- gst_object_ref(src);
- priv->stopSource.schedule("[WebKit] webKitWebSrcStop", std::bind(webKitWebSrcStop, src), G_PRIORITY_DEFAULT,
- [src] { gst_object_unref(src); });
</del><ins>+ priv->stopID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcStop, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</ins><span class="cx"> break;
</span><span class="cx"> default:
</span><span class="cx"> break;
</span><span class="lines">@@ -656,18 +666,24 @@
</span><span class="cx">
</span><span class="cx"> // appsrc callbacks
</span><span class="cx">
</span><del>-static void webKitWebSrcNeedDataMainCb(WebKitWebSrc* src)
</del><ins>+static gboolean 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><ins>+ // already stopped
+ if (!priv->needDataID)
+ return FALSE;
+
</ins><span class="cx"> priv->paused = FALSE;
</span><ins>+ priv->needDataID = 0;
</ins><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><ins>+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static void webKitWebSrcNeedDataCb(GstAppSrc*, guint length, gpointer userData)
</span><span class="lines">@@ -678,26 +694,31 @@
</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->needDataSource.isScheduled() || !priv->paused)
</del><ins>+ if (priv->needDataID || !priv->paused) {
</ins><span class="cx"> return;
</span><ins>+ }
</ins><span class="cx">
</span><del>- gst_object_ref(src);
- priv->needDataSource.schedule("[WebKit] webKitWebSrcNeedDataMainCb", std::bind(webKitWebSrcNeedDataMainCb, src), G_PRIORITY_DEFAULT,
- [src] { gst_object_unref(src); });
</del><ins>+ priv->needDataID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcNeedDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static void webKitWebSrcEnoughDataMainCb(WebKitWebSrc* src)
</del><ins>+static gboolean 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><ins>+ // already stopped
+ if (!priv->enoughDataID)
+ return FALSE;
+
</ins><span class="cx"> priv->paused = TRUE;
</span><ins>+ priv->enoughDataID = 0;
</ins><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><ins>+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static void webKitWebSrcEnoughDataCb(GstAppSrc*, gpointer userData)
</span><span class="lines">@@ -708,20 +729,29 @@
</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->enoughDataSource.isScheduled() || priv->paused)
</del><ins>+ if (priv->enoughDataID || priv->paused) {
</ins><span class="cx"> return;
</span><ins>+ }
</ins><span class="cx">
</span><del>- gst_object_ref(src);
- priv->enoughDataSource.schedule("[WebKit] webKitWebSrcEnoughDataMainCb", std::bind(webKitWebSrcEnoughDataMainCb, src), G_PRIORITY_DEFAULT,
- [src] { gst_object_unref(src); });
</del><ins>+ priv->enoughDataID = g_idle_add_full(G_PRIORITY_DEFAULT, (GSourceFunc) webKitWebSrcEnoughDataMainCb, gst_object_ref(src), (GDestroyNotify) gst_object_unref);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-static void webKitWebSrcSeekMainCb(WebKitWebSrc* src)
</del><ins>+static gboolean webKitWebSrcSeekMainCb(WebKitWebSrc* src)
</ins><span class="cx"> {
</span><ins>+ WebKitWebSrcPrivate* priv = src->priv;
+
</ins><span class="cx"> ASSERT(isMainThread());
</span><span class="cx">
</span><ins>+ GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
+ // already stopped
+ if (!priv->seekID)
+ return FALSE;
+ locker.unlock();
+
</ins><span class="cx"> webKitWebSrcStop(src);
</span><span class="cx"> webKitWebSrcStart(src);
</span><ins>+
+ return FALSE;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static gboolean webKitWebSrcSeekDataCb(GstAppSrc*, guint64 offset, gpointer userData)
</span><span class="lines">@@ -740,9 +770,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>- gst_object_ref(src);
- priv->seekSource.schedule("[WebKit] webKitWebSrcSeekMainCb", std::bind(webKitWebSrcSeekMainCb, src), G_PRIORITY_DEFAULT,
- [src] { gst_object_unref(src); });
</del><ins>+ 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);
</ins><span class="cx"> return TRUE;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -798,7 +828,7 @@
</span><span class="cx">
</span><span class="cx"> GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
</span><span class="cx">
</span><del>- if (priv->seekSource.isActive()) {
</del><ins>+ if (priv->seekID) {
</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">@@ -902,7 +932,7 @@
</span><span class="cx"> if (priv->buffer)
</span><span class="cx"> unmapGstBuffer(priv->buffer.get());
</span><span class="cx">
</span><del>- if (priv->seekSource.isActive()) {
</del><ins>+ if (priv->seekID) {
</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">@@ -963,7 +993,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->seekSource.isActive()) {
</del><ins>+ if (!priv->seekID) {
</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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/gtk/GtkDragAndDropHelper.cpp        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/gtk/GtkDragAndDropHelper.cpp        2014-03-21 08:54:19 UTC (rev 166055)
</span><span class="lines">@@ -25,7 +25,6 @@
</span><span class="cx"> #include "GtkVersioning.h"
</span><span class="cx"> #include "PasteboardHelper.h"
</span><span class="cx"> #include <gtk/gtk.h>
</span><del>-#include <wtf/gobject/GMainLoopSource.h>
</del><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="lines">@@ -69,6 +68,18 @@
</span><span class="cx"> PasteboardHelper::defaultPasteboardHelper()->fillSelectionData(selectionData, info, dataObject);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+struct HandleDragLaterData {
+ DroppingContext* context;
+ GtkDragAndDropHelper* glue;
+};
+
+static gboolean handleDragLeaveLaterCallback(HandleDragLaterData* data)
+{
+ data->glue->handleDragLeaveLater(data->context);
+ delete data;
+ return FALSE;
+}
+
</ins><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">@@ -98,8 +109,11 @@
</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>- context->exitedCallback = exitedCallback;
- GMainLoopSource::createAndDeleteOnDestroy().schedule("[WebKit] handleDragLeaveLater", std::bind(&GtkDragAndDropHelper::handleDragLeaveLater, this, context));
</del><ins>+ 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);
</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 (166054 => 166055)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/gtk/SharedTimerGtk.cpp        2014-03-21 08:27:52 UTC (rev 166054)
+++ trunk/Source/WebCore/platform/gtk/SharedTimerGtk.cpp        2014-03-21 08:54:19 UTC (rev 166055)
</span><span class="lines">@@ -28,32 +28,47 @@
</span><span class="cx"> #include "config.h"
</span><span class="cx"> #include "SharedTimer.h"
</span><span class="cx">
</span><ins>+#include <wtf/Assertions.h>
+#include <wtf/CurrentTime.h>
</ins><span class="cx"> #include <gdk/gdk.h>
</span><del>-#include <wtf/gobject/GMainLoopSource.h>
</del><ins>+#include <glib.h>
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-static GMainLoopSource gSharedTimer;
</del><ins>+static guint sharedTimer;
</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><del>- if (!sharedTimerFiredFunction)
- gSharedTimer.cancel();
</del><span class="cx"> }
</span><span class="cx">
</span><ins>+static gboolean sharedTimerTimeoutCallback(gpointer)
+{
+ if (sharedTimerFiredFunction)
+ sharedTimerFiredFunction();
+ return FALSE;
+}
+
</ins><span class="cx"> void setSharedTimerFireInterval(double interval)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(sharedTimerFiredFunction);
</span><span class="cx">
</span><del>- gSharedTimer.scheduleAfterDelay("[WebKit] sharedTimerTimeoutCallback", sharedTimerFiredFunction,
- std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::duration<double>(interval)), GDK_PRIORITY_REDRAW);
</del><ins>+ 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");
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void stopSharedTimer()
</span><span class="cx"> {
</span><del>- gSharedTimer.cancel();
</del><ins>+ if (sharedTimer == 0)
+ return;
+
+ gboolean removedSource = g_source_remove(sharedTimer);
+ ASSERT_UNUSED(removedSource, removedSource);
+ sharedTimer = 0;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre>
</div>
</div>
</body>
</html>