<!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>[177790] trunk</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/177790">177790</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-12-29 06:46:39 -0800 (Mon, 29 Dec 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Source/WebCore:
[GStreamer] Rewrite MediaSource implementation
https://bugs.webkit.org/show_bug.cgi?id=139441

Patch by Sebastian Dröge &lt;sebastian@centricular.com&gt; on 2014-12-29
Reviewed by Philippe Normand.

This now is a clean reimplementation around appsrc that works good
enough for YouTube (except for seeking), but it still does not
implement the complete API correctly. Further work is required on
top of this and the Bugzilla ticket linked above contains some
further work in the right direction.

* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::doSeek):
(WebCore::MediaPlayerPrivateGStreamer::didLoadingProgress):
(WebCore::MediaPlayerPrivateGStreamer::sourceChanged):
(WebCore::MediaPlayerPrivateGStreamer::canSaveMediaData):
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
(WebCore::MediaPlayerPrivateGStreamer::totalVideoFrames):
(WebCore::MediaPlayerPrivateGStreamer::droppedVideoFrames):
(WebCore::MediaPlayerPrivateGStreamer::corruptedVideoFrames):
(WebCore::MediaPlayerPrivateGStreamer::totalFrameDelay):
(WebCore::MediaPlayerPrivateGStreamer::isMediaSource):
* platform/graphics/gstreamer/MediaSourceGStreamer.cpp:
(WebCore::MediaSourceGStreamer::MediaSourceGStreamer):
(WebCore::MediaSourceGStreamer::addSourceBuffer):
(WebCore::MediaSourceGStreamer::durationChanged):
(WebCore::MediaSourceGStreamer::markEndOfStream):
(WebCore::MediaSourceGStreamer::unmarkEndOfStream):
(WebCore::MediaSourceGStreamer::readyState):
(WebCore::MediaSourceGStreamer::setReadyState):
(WebCore::MediaSourceGStreamer::waitForSeekCompleted):
(WebCore::MediaSourceGStreamer::seekCompleted):
* platform/graphics/gstreamer/MediaSourceGStreamer.h:
* platform/graphics/gstreamer/SourceBufferPrivateGStreamer.cpp:
(WebCore::SourceBufferPrivateGStreamer::SourceBufferPrivateGStreamer):
(WebCore::SourceBufferPrivateGStreamer::~SourceBufferPrivateGStreamer):
(WebCore::SourceBufferPrivateGStreamer::setClient):
(WebCore::SourceBufferPrivateGStreamer::append):
(WebCore::SourceBufferPrivateGStreamer::removedFromMediaSource):
(WebCore::SourceBufferPrivateGStreamer::readyState):
(WebCore::SourceBufferPrivateGStreamer::setReadyState):
(WebCore::SourceBufferPrivateGStreamer::flushAndEnqueueNonDisplayingSamples):
(WebCore::SourceBufferPrivateGStreamer::enqueueSample):
(WebCore::SourceBufferPrivateGStreamer::isReadyForMoreSamples):
(WebCore::SourceBufferPrivateGStreamer::setActive):
(WebCore::SourceBufferPrivateGStreamer::stopAskingForMoreSamples):
(WebCore::SourceBufferPrivateGStreamer::notifyClientWhenReadyForMoreSamples):
* platform/graphics/gstreamer/SourceBufferPrivateGStreamer.h:
* platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp:
(webkit_media_src_class_init):
(webkit_media_src_init):
(webKitMediaSrcFinalize):
(webKitMediaSrcSetProperty):
(webKitMediaSrcGetProperty):
(webKitMediaSrcDoAsyncStart):
(webKitMediaSrcDoAsyncDone):
(webKitMediaSrcChangeState):
(webKitMediaSrcQueryWithParent):
(webKitMediaSrcGetUri):
(webKitMediaSrcSetUri):
(WebCore::MediaSourceClientGStreamer::MediaSourceClientGStreamer):
(WebCore::MediaSourceClientGStreamer::~MediaSourceClientGStreamer):
(WebCore::MediaSourceClientGStreamer::addSourceBuffer):
(WebCore::MediaSourceClientGStreamer::durationChanged):
(WebCore::MediaSourceClientGStreamer::append):
(WebCore::MediaSourceClientGStreamer::markEndOfStream):
(WebCore::MediaSourceClientGStreamer::removedFromMediaSource):
(WTF::adoptGRef):
(WTF::refGPtr&lt;WebKitMediaSrc&gt;):
(WTF::derefGPtr&lt;WebKitMediaSrc&gt;):
(webKitMediaSrcAddSrc): Deleted.
(webKitMediaVideoSrcStop): Deleted.
(webKitMediaAudioSrcStop): Deleted.
(webKitMediaVideoSrcStart): Deleted.
(webKitMediaAudioSrcStart): Deleted.
(webKitMediaVideoSrcNeedDataMainCb): Deleted.
(webKitMediaAudioSrcNeedDataMainCb): Deleted.
(webKitMediaVideoSrcNeedDataCb): Deleted.
(webKitMediaAudioSrcNeedDataCb): Deleted.
(webKitMediaVideoSrcEnoughDataMainCb): Deleted.
(webKitMediaAudioSrcEnoughDataMainCb): Deleted.
(webKitMediaVideoSrcEnoughDataCb): Deleted.
(webKitMediaAudioSrcEnoughDataCb): Deleted.
(webKitMediaVideoSrcSeekMainCb): Deleted.
(webKitMediaAudioSrcSeekMainCb): Deleted.
(webKitMediaVideoSrcSeekDataCb): Deleted.
(webKitMediaAudioSrcSeekDataCb): Deleted.
(webKitMediaSrcSetMediaPlayer): Deleted.
(webKitMediaSrcSetPlayBin): Deleted.
(MediaSourceClientGstreamer::MediaSourceClientGstreamer): Deleted.
(MediaSourceClientGstreamer::~MediaSourceClientGstreamer): Deleted.
(MediaSourceClientGstreamer::didReceiveDuration): Deleted.
(MediaSourceClientGstreamer::didReceiveData): Deleted.
(MediaSourceClientGstreamer::didFinishLoading): Deleted.
(MediaSourceClientGstreamer::didFail): Deleted.
* platform/graphics/gstreamer/WebKitMediaSourceGStreamer.h:
Rewrite MediaSource implementation for GStreamer. The old code was
overly complicated and did not work at all for anything I've tested
it with.

LayoutTests:
Enable MediaSource tests for the GTK port
https://bugs.webkit.org/show_bug.cgi?id=139441

Patch by Sebastian Dröge &lt;sebastian@centricular.com&gt; on 2014-12-29
Reviewed by Philippe Normand.

* platform/gtk/TestExpectations:
Enable MediaSource tests that are actually succeeding for
the GTK port.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformgtkTestExpectations">trunk/LayoutTests/platform/gtk/TestExpectations</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</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="#trunkSourceWebCoreplatformgraphicsgstreamerMediaSourceGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/MediaSourceGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerMediaSourceGStreamerh">trunk/Source/WebCore/platform/graphics/gstreamer/MediaSourceGStreamer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerSourceBufferPrivateGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/SourceBufferPrivateGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerSourceBufferPrivateGStreamerh">trunk/Source/WebCore/platform/graphics/gstreamer/SourceBufferPrivateGStreamer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerWebKitMediaSourceGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerWebKitMediaSourceGStreamerh">trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (177789 => 177790)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-12-29 12:53:19 UTC (rev 177789)
+++ trunk/LayoutTests/ChangeLog        2014-12-29 14:46:39 UTC (rev 177790)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2014-12-29  Sebastian Dröge  &lt;sebastian@centricular.com&gt;
+
+        Enable MediaSource tests for the GTK port
+        https://bugs.webkit.org/show_bug.cgi?id=139441
+
+        Reviewed by Philippe Normand.
+
+        * platform/gtk/TestExpectations:
+        Enable MediaSource tests that are actually succeeding for
+        the GTK port.
+
</ins><span class="cx"> 2014-12-28  Alexey Proskuryakov  &lt;ap@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         fast/regions/layers/region-removed-during-animation.html is flaky
</span></span></pre></div>
<a id="trunkLayoutTestsplatformgtkTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/gtk/TestExpectations (177789 => 177790)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/gtk/TestExpectations        2014-12-29 12:53:19 UTC (rev 177789)
+++ trunk/LayoutTests/platform/gtk/TestExpectations        2014-12-29 14:46:39 UTC (rev 177790)
</span><span class="lines">@@ -225,9 +225,54 @@
</span><span class="cx"> webkit.org/b/92749 fast/dom/NavigatorContentUtils/is-protocol-handler-registered.html [ Skip ]
</span><span class="cx"> 
</span><span class="cx"> # Tests for MediaSource API. Feature is not totally functional.
</span><del>-webkit.org/b/99065 http/tests/media/media-source [ Skip ]
-webkit.org/b/99065 media/media-source [ Skip ]
</del><ins>+webkit.org/b/99065 http/tests/media/media-source/mediasource-append-buffer.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-append-stream.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-appendwindow.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-buffered.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-mp4-a-bitrate.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-mp4-av-audio-bitrate.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-mp4-av-framesize.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-mp4-av-video-bitrate.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-mp4-v-bitrate.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-mp4-v-framerate.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-mp4-v-framesize.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-webm-a-bitrate.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-webm-av-audio-bitrate.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-webm-av-framesize.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-webm-av-video-bitrate.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-webm-v-bitrate.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-webm-v-framerate.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-config-change-webm-v-framesize.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-duration.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-getvideoplaybackquality.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-is-type-supported.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-play.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-play-then-seek-back.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-redundant-seek.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-remove.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-seek-beyond-duration.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-seek-during-pending-seek.html [ Skip ]
+webkit.org/b/99065 http/tests/media/media-source/mediasource-sourcebuffer-mode.html [ Skip ]
</ins><span class="cx"> 
</span><ins>+webkit.org/b/99065 media/media-source/media-source-append-failed.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-multiple-initialization-segments.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-append-nonsync-sample-after-abort.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-duplicate-seeked.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-canplaythrough.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-duration-after-append.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-end-of-stream-buffered.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-end-of-stream.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-fudge-factor.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-monitor-source-buffers.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-overlapping-append.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-overlapping-decodetime.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-play.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-remove.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-seek-complete.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-track-enabled.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-tracks.html [ Skip ]
+webkit.org/b/99065 media/media-source/media-source-video-playback-quality.html [ Skip ]
+
</ins><span class="cx"> # Encrypted Media Extensions are not enabled.
</span><span class="cx"> webkit.org/b/99024 media/encrypted-media [ Skip ]
</span><span class="cx"> webkit.org/b/99024 fast/events/constructors/media-key-event-constructor.html [ Timeout ]
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (177789 => 177790)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-12-29 12:53:19 UTC (rev 177789)
+++ trunk/Source/WebCore/ChangeLog        2014-12-29 14:46:39 UTC (rev 177790)
</span><span class="lines">@@ -1,3 +1,105 @@
</span><ins>+2014-12-29  Sebastian Dröge  &lt;sebastian@centricular.com&gt;
+
+        [GStreamer] Rewrite MediaSource implementation
+        https://bugs.webkit.org/show_bug.cgi?id=139441
+
+        Reviewed by Philippe Normand.
+
+        This now is a clean reimplementation around appsrc that works good
+        enough for YouTube (except for seeking), but it still does not
+        implement the complete API correctly. Further work is required on
+        top of this and the Bugzilla ticket linked above contains some
+        further work in the right direction.
+
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+        (WebCore::MediaPlayerPrivateGStreamer::doSeek):
+        (WebCore::MediaPlayerPrivateGStreamer::didLoadingProgress):
+        (WebCore::MediaPlayerPrivateGStreamer::sourceChanged):
+        (WebCore::MediaPlayerPrivateGStreamer::canSaveMediaData):
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
+        (WebCore::MediaPlayerPrivateGStreamer::totalVideoFrames):
+        (WebCore::MediaPlayerPrivateGStreamer::droppedVideoFrames):
+        (WebCore::MediaPlayerPrivateGStreamer::corruptedVideoFrames):
+        (WebCore::MediaPlayerPrivateGStreamer::totalFrameDelay):
+        (WebCore::MediaPlayerPrivateGStreamer::isMediaSource):
+        * platform/graphics/gstreamer/MediaSourceGStreamer.cpp:
+        (WebCore::MediaSourceGStreamer::MediaSourceGStreamer):
+        (WebCore::MediaSourceGStreamer::addSourceBuffer):
+        (WebCore::MediaSourceGStreamer::durationChanged):
+        (WebCore::MediaSourceGStreamer::markEndOfStream):
+        (WebCore::MediaSourceGStreamer::unmarkEndOfStream):
+        (WebCore::MediaSourceGStreamer::readyState):
+        (WebCore::MediaSourceGStreamer::setReadyState):
+        (WebCore::MediaSourceGStreamer::waitForSeekCompleted):
+        (WebCore::MediaSourceGStreamer::seekCompleted):
+        * platform/graphics/gstreamer/MediaSourceGStreamer.h:
+        * platform/graphics/gstreamer/SourceBufferPrivateGStreamer.cpp:
+        (WebCore::SourceBufferPrivateGStreamer::SourceBufferPrivateGStreamer):
+        (WebCore::SourceBufferPrivateGStreamer::~SourceBufferPrivateGStreamer):
+        (WebCore::SourceBufferPrivateGStreamer::setClient):
+        (WebCore::SourceBufferPrivateGStreamer::append):
+        (WebCore::SourceBufferPrivateGStreamer::removedFromMediaSource):
+        (WebCore::SourceBufferPrivateGStreamer::readyState):
+        (WebCore::SourceBufferPrivateGStreamer::setReadyState):
+        (WebCore::SourceBufferPrivateGStreamer::flushAndEnqueueNonDisplayingSamples):
+        (WebCore::SourceBufferPrivateGStreamer::enqueueSample):
+        (WebCore::SourceBufferPrivateGStreamer::isReadyForMoreSamples):
+        (WebCore::SourceBufferPrivateGStreamer::setActive):
+        (WebCore::SourceBufferPrivateGStreamer::stopAskingForMoreSamples):
+        (WebCore::SourceBufferPrivateGStreamer::notifyClientWhenReadyForMoreSamples):
+        * platform/graphics/gstreamer/SourceBufferPrivateGStreamer.h:
+        * platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp:
+        (webkit_media_src_class_init):
+        (webkit_media_src_init):
+        (webKitMediaSrcFinalize):
+        (webKitMediaSrcSetProperty):
+        (webKitMediaSrcGetProperty):
+        (webKitMediaSrcDoAsyncStart):
+        (webKitMediaSrcDoAsyncDone):
+        (webKitMediaSrcChangeState):
+        (webKitMediaSrcQueryWithParent):
+        (webKitMediaSrcGetUri):
+        (webKitMediaSrcSetUri):
+        (WebCore::MediaSourceClientGStreamer::MediaSourceClientGStreamer):
+        (WebCore::MediaSourceClientGStreamer::~MediaSourceClientGStreamer):
+        (WebCore::MediaSourceClientGStreamer::addSourceBuffer):
+        (WebCore::MediaSourceClientGStreamer::durationChanged):
+        (WebCore::MediaSourceClientGStreamer::append):
+        (WebCore::MediaSourceClientGStreamer::markEndOfStream):
+        (WebCore::MediaSourceClientGStreamer::removedFromMediaSource):
+        (WTF::adoptGRef):
+        (WTF::refGPtr&lt;WebKitMediaSrc&gt;):
+        (WTF::derefGPtr&lt;WebKitMediaSrc&gt;):
+        (webKitMediaSrcAddSrc): Deleted.
+        (webKitMediaVideoSrcStop): Deleted.
+        (webKitMediaAudioSrcStop): Deleted.
+        (webKitMediaVideoSrcStart): Deleted.
+        (webKitMediaAudioSrcStart): Deleted.
+        (webKitMediaVideoSrcNeedDataMainCb): Deleted.
+        (webKitMediaAudioSrcNeedDataMainCb): Deleted.
+        (webKitMediaVideoSrcNeedDataCb): Deleted.
+        (webKitMediaAudioSrcNeedDataCb): Deleted.
+        (webKitMediaVideoSrcEnoughDataMainCb): Deleted.
+        (webKitMediaAudioSrcEnoughDataMainCb): Deleted.
+        (webKitMediaVideoSrcEnoughDataCb): Deleted.
+        (webKitMediaAudioSrcEnoughDataCb): Deleted.
+        (webKitMediaVideoSrcSeekMainCb): Deleted.
+        (webKitMediaAudioSrcSeekMainCb): Deleted.
+        (webKitMediaVideoSrcSeekDataCb): Deleted.
+        (webKitMediaAudioSrcSeekDataCb): Deleted.
+        (webKitMediaSrcSetMediaPlayer): Deleted.
+        (webKitMediaSrcSetPlayBin): Deleted.
+        (MediaSourceClientGstreamer::MediaSourceClientGstreamer): Deleted.
+        (MediaSourceClientGstreamer::~MediaSourceClientGstreamer): Deleted.
+        (MediaSourceClientGstreamer::didReceiveDuration): Deleted.
+        (MediaSourceClientGstreamer::didReceiveData): Deleted.
+        (MediaSourceClientGstreamer::didFinishLoading): Deleted.
+        (MediaSourceClientGstreamer::didFail): Deleted.
+        * platform/graphics/gstreamer/WebKitMediaSourceGStreamer.h:
+        Rewrite MediaSource implementation for GStreamer. The old code was
+        overly complicated and did not work at all for anything I've tested
+        it with.
+
</ins><span class="cx"> 2014-12-28  Gyuyoung Kim  &lt;gyuyoung.kim@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, additional build fix on win port since r177786.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (177789 => 177790)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp        2014-12-29 12:53:19 UTC (rev 177789)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp        2014-12-29 14:46:39 UTC (rev 177790)
</span><span class="lines">@@ -564,6 +564,11 @@
</span><span class="cx"> {
</span><span class="cx">     gint64 startTime, endTime;
</span><span class="cx"> 
</span><ins>+    // TODO: Should do more than that, need to notify the media source
+    // and probably flush the pipeline at least.
+    if (isMediaSource())
+        return true;
+
</ins><span class="cx">     if (rate &gt; 0) {
</span><span class="cx">         startTime = position;
</span><span class="cx">         endTime = GST_CLOCK_TIME_NONE;
</span><span class="lines">@@ -1244,7 +1249,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool MediaPlayerPrivateGStreamer::didLoadingProgress() const
</span><span class="cx"> {
</span><del>-    if (!m_playBin || !m_mediaDuration || !totalBytes())
</del><ins>+    if (!m_playBin || !m_mediaDuration || (!isMediaSource() &amp;&amp; !totalBytes()))
</ins><span class="cx">         return false;
</span><span class="cx">     float currentMaxTimeLoaded = maxTimeLoaded();
</span><span class="cx">     bool didLoadingProgress = currentMaxTimeLoaded != m_maxTimeLoadedAtLastDidLoadingProgress;
</span><span class="lines">@@ -1318,7 +1323,6 @@
</span><span class="cx"> #if ENABLE(MEDIA_SOURCE)
</span><span class="cx">     if (m_mediaSource &amp;&amp; WEBKIT_IS_MEDIA_SRC(m_source.get())) {
</span><span class="cx">         MediaSourceGStreamer::open(m_mediaSource.get(), WEBKIT_MEDIA_SRC(m_source.get()));
</span><del>-        webKitMediaSrcSetPlayBin(WEBKIT_MEDIA_SRC(m_source.get()), m_playBin.get());
</del><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="lines">@@ -1996,7 +2000,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (m_url.protocolIsInHTTPFamily())
</span><span class="cx">         return true;
</span><del>-    
</del><ins>+
</ins><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h (177789 => 177790)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h        2014-12-29 12:53:19 UTC (rev 177789)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h        2014-12-29 14:46:39 UTC (rev 177790)
</span><span class="lines">@@ -175,6 +175,14 @@
</span><span class="cx">     virtual bool didPassCORSAccessCheck() const;
</span><span class="cx">     virtual bool canSaveMediaData() const override;
</span><span class="cx"> 
</span><ins>+#if ENABLE(MEDIA_SOURCE)
+    // TODO: Implement
+    virtual unsigned long totalVideoFrames() { return 0; }
+    virtual unsigned long droppedVideoFrames() { return 0; }
+    virtual unsigned long corruptedVideoFrames() { return 0; }
+    virtual MediaTime totalFrameDelay() { return MediaTime::zeroTime(); }
+#endif
+
</ins><span class="cx"> private:
</span><span class="cx">     GRefPtr&lt;GstElement&gt; m_playBin;
</span><span class="cx">     GRefPtr&lt;GstElement&gt; m_source;
</span><span class="lines">@@ -237,6 +245,9 @@
</span><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(MEDIA_SOURCE)
</span><span class="cx">     RefPtr&lt;MediaSourcePrivateClient&gt; m_mediaSource;
</span><ins>+    bool isMediaSource() const { return m_mediaSource; }
+#else
+    bool isMediaSource() const { return false; }
</ins><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaSourceGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaSourceGStreamer.cpp (177789 => 177790)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaSourceGStreamer.cpp        2014-12-29 12:53:19 UTC (rev 177789)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaSourceGStreamer.cpp        2014-12-29 14:46:39 UTC (rev 177790)
</span><span class="lines">@@ -1,6 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2013 Google Inc. All rights reserved.
</span><span class="cx">  * Copyright (C) 2013 Orange
</span><ins>+ * Copyright (C) 2014 Sebastian Dröge &lt;sebastian@centricular.com&gt;
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions are
</span><span class="lines">@@ -34,8 +35,10 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(MEDIA_SOURCE) &amp;&amp; USE(GSTREAMER)
</span><span class="cx"> 
</span><ins>+#include &quot;NotImplemented.h&quot;
</ins><span class="cx"> #include &quot;SourceBufferPrivateGStreamer.h&quot;
</span><span class="cx"> #include &quot;WebKitMediaSourceGStreamer.h&quot;
</span><ins>+
</ins><span class="cx"> #include &lt;wtf/gobject/GRefPtr.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -47,7 +50,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> MediaSourceGStreamer::MediaSourceGStreamer(MediaSourcePrivateClient* mediaSource, WebKitMediaSrc* src)
</span><del>-    : m_client(adoptRef(new MediaSourceClientGstreamer(src)))
</del><ins>+    : m_client(adoptRef(new MediaSourceClientGStreamer(src)))
</ins><span class="cx">     , m_mediaSource(mediaSource)
</span><span class="cx">     , m_readyState(MediaPlayer::HaveNothing)
</span><span class="cx"> {
</span><span class="lines">@@ -60,23 +63,46 @@
</span><span class="cx"> 
</span><span class="cx"> MediaSourceGStreamer::AddStatus MediaSourceGStreamer::addSourceBuffer(const ContentType&amp; contentType, RefPtr&lt;SourceBufferPrivate&gt;&amp; sourceBufferPrivate)
</span><span class="cx"> {
</span><del>-    sourceBufferPrivate = adoptRef(new SourceBufferPrivateGStreamer(m_client.get(), contentType));
-    return MediaSourceGStreamer::Ok;
</del><ins>+    RefPtr&lt;SourceBufferPrivateGStreamer&gt; sourceBufferPrivateGStreamer = new SourceBufferPrivateGStreamer(m_client.get(), contentType);
+
+    sourceBufferPrivate = adoptRef(sourceBufferPrivateGStreamer.get());
+    return m_client-&gt;addSourceBuffer(sourceBufferPrivateGStreamer, contentType);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaSourceGStreamer::durationChanged()
</span><span class="cx"> {
</span><del>-    m_client-&gt;didReceiveDuration(m_mediaSource-&gt;duration().toDouble());
</del><ins>+    m_client-&gt;durationChanged(m_mediaSource-&gt;duration());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaSourceGStreamer::markEndOfStream(EndOfStreamStatus)
</del><ins>+void MediaSourceGStreamer::markEndOfStream(EndOfStreamStatus status)
</ins><span class="cx"> {
</span><del>-    m_client-&gt;didFinishLoading(0);
</del><ins>+    m_client-&gt;markEndOfStream(status);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaSourceGStreamer::unmarkEndOfStream()
</span><span class="cx"> {
</span><ins>+    notImplemented();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+MediaPlayer::ReadyState MediaSourceGStreamer::readyState() const
+{
+    return m_readyState;
</ins><span class="cx"> }
</span><ins>+
+void MediaSourceGStreamer::setReadyState(MediaPlayer::ReadyState state)
+{
+    m_readyState = state;
+}
+
+void MediaSourceGStreamer::waitForSeekCompleted()
+{
+    notImplemented();
+}
+
+void MediaSourceGStreamer::seekCompleted()
+{
+    notImplemented();
+}
+
+}
</ins><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaSourceGStreamerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaSourceGStreamer.h (177789 => 177790)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaSourceGStreamer.h        2014-12-29 12:53:19 UTC (rev 177789)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaSourceGStreamer.h        2014-12-29 14:46:39 UTC (rev 177790)
</span><span class="lines">@@ -1,6 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2013 Google Inc. All rights reserved.
</span><span class="cx">  * Copyright (C) 2013 Orange
</span><ins>+ * Copyright (C) 2014 Sebastian Dröge &lt;sebastian@centricular.com&gt;
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions are
</span><span class="lines">@@ -38,25 +39,28 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+// FIXME: Should this be called MediaSourcePrivateGStreamer?
</ins><span class="cx"> class MediaSourceGStreamer final : public MediaSourcePrivate {
</span><span class="cx"> public:
</span><span class="cx">     static void open(MediaSourcePrivateClient*, WebKitMediaSrc*);
</span><del>-    ~MediaSourceGStreamer();
</del><ins>+    virtual ~MediaSourceGStreamer();
</ins><span class="cx"> 
</span><ins>+    virtual AddStatus addSourceBuffer(const ContentType&amp;, RefPtr&lt;SourceBufferPrivate&gt;&amp;);
+    virtual void durationChanged();
+    virtual void markEndOfStream(EndOfStreamStatus);
+    virtual void unmarkEndOfStream();
+
+    virtual MediaPlayer::ReadyState readyState() const;
+    virtual void setReadyState(MediaPlayer::ReadyState);
+
+    virtual void waitForSeekCompleted();
+    virtual void seekCompleted();
+
</ins><span class="cx"> private:
</span><del>-    // MediaSourcePrivate
-    virtual AddStatus addSourceBuffer(const ContentType&amp;, RefPtr&lt;SourceBufferPrivate&gt;&amp;) override;
-    virtual void durationChanged() override;
-    virtual void markEndOfStream(EndOfStreamStatus) override;
-    virtual void unmarkEndOfStream() override;
-    virtual MediaPlayer::ReadyState readyState() const override { return m_readyState; }
-    virtual void setReadyState(MediaPlayer::ReadyState readyState) override { m_readyState = readyState; }
-    virtual void waitForSeekCompleted() override { }
-    virtual void seekCompleted() override { }
</del><ins>+    MediaSourceGStreamer(MediaSourcePrivateClient*, WebKitMediaSrc*);
</ins><span class="cx"> 
</span><del>-    RefPtr&lt;MediaSourceClientGstreamer&gt; m_client;
</del><ins>+    RefPtr&lt;MediaSourceClientGStreamer&gt; m_client;
</ins><span class="cx">     MediaSourcePrivateClient* m_mediaSource;
</span><del>-    MediaSourceGStreamer(MediaSourcePrivateClient*, WebKitMediaSrc*);
</del><span class="cx">     MediaPlayer::ReadyState m_readyState;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerSourceBufferPrivateGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/SourceBufferPrivateGStreamer.cpp (177789 => 177790)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/SourceBufferPrivateGStreamer.cpp        2014-12-29 12:53:19 UTC (rev 177789)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/SourceBufferPrivateGStreamer.cpp        2014-12-29 14:46:39 UTC (rev 177790)
</span><span class="lines">@@ -1,6 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2013 Google Inc. All rights reserved.
</span><span class="cx">  * Copyright (C) 2013 Orange
</span><ins>+ * Copyright (C) 2014 Sebastian Dröge &lt;sebastian@centricular.com&gt;
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions are
</span><span class="lines">@@ -39,19 +40,29 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-SourceBufferPrivateGStreamer::SourceBufferPrivateGStreamer(PassRefPtr&lt;MediaSourceClientGstreamer&gt; client, const ContentType&amp; contentType)
-    : m_readyState(MediaPlayer::HaveNothing)
</del><ins>+SourceBufferPrivateGStreamer::SourceBufferPrivateGStreamer(PassRefPtr&lt;MediaSourceClientGStreamer&gt; client, const ContentType&amp; contentType)
+    : m_type(contentType)
+    , m_client(client)
+    , m_readyState(MediaPlayer::HaveNothing)
</ins><span class="cx"> {
</span><del>-    m_client = client;
-    m_type = contentType.type();
</del><span class="cx"> }
</span><span class="cx"> 
</span><ins>+SourceBufferPrivateGStreamer::~SourceBufferPrivateGStreamer()
+{
+}
+
+void SourceBufferPrivateGStreamer::setClient(SourceBufferPrivateClient* client)
+{
+    m_sourceBufferPrivateClient = client;
+}
+
</ins><span class="cx"> void SourceBufferPrivateGStreamer::append(const unsigned char* data, unsigned length)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_client);
</span><del>-    m_client-&gt;didReceiveData(reinterpret_cast_ptr&lt;const char*&gt;(data), length, m_type);
</del><ins>+    ASSERT(m_sourceBufferPrivateClient);
</ins><span class="cx"> 
</span><del>-    // FIXME: call SourceBufferPrivateClient::sourceBufferPrivateAppendComplete().
</del><ins>+    SourceBufferPrivateClient::AppendResult result = m_client-&gt;append(this, data, length);
+    m_sourceBufferPrivateClient-&gt;sourceBufferPrivateAppendComplete(this, result);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SourceBufferPrivateGStreamer::abort()
</span><span class="lines">@@ -61,8 +72,51 @@
</span><span class="cx"> 
</span><span class="cx"> void SourceBufferPrivateGStreamer::removedFromMediaSource()
</span><span class="cx"> {
</span><ins>+    m_client-&gt;removedFromMediaSource(this);
+}
+
+MediaPlayer::ReadyState SourceBufferPrivateGStreamer::readyState() const
+{
+    return m_readyState;
+}
+
+void SourceBufferPrivateGStreamer::setReadyState(MediaPlayer::ReadyState state)
+{
+    m_readyState = state;
+}
+
+// TODO: Implement these
+void SourceBufferPrivateGStreamer::flushAndEnqueueNonDisplayingSamples(Vector&lt;RefPtr&lt;MediaSample&gt;&gt;, AtomicString)
+{
</ins><span class="cx">     notImplemented();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void SourceBufferPrivateGStreamer::enqueueSample(PassRefPtr&lt;MediaSample&gt;, AtomicString)
+{
+    notImplemented();
</ins><span class="cx"> }
</span><ins>+
+bool SourceBufferPrivateGStreamer::isReadyForMoreSamples(AtomicString)
+{
+    notImplemented();
+
+    return false;
+}
+
+void SourceBufferPrivateGStreamer::setActive(bool)
+{
+    notImplemented();
+}
+
+void SourceBufferPrivateGStreamer::stopAskingForMoreSamples(AtomicString)
+{
+    notImplemented();
+}
+
+void SourceBufferPrivateGStreamer::notifyClientWhenReadyForMoreSamples(AtomicString)
+{
+    notImplemented();
+}
+
+}
</ins><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerSourceBufferPrivateGStreamerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/SourceBufferPrivateGStreamer.h (177789 => 177790)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/SourceBufferPrivateGStreamer.h        2014-12-29 12:53:19 UTC (rev 177789)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/SourceBufferPrivateGStreamer.h        2014-12-29 14:46:39 UTC (rev 177790)
</span><span class="lines">@@ -1,6 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2013 Google Inc. All rights reserved.
</span><span class="cx">  * Copyright (C) 2013 Orange
</span><ins>+ * Copyright (C) 2014 Sebastian Dröge &lt;sebastian@centricular.com&gt;
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions are
</span><span class="lines">@@ -34,6 +35,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(MEDIA_SOURCE) &amp;&amp; USE(GSTREAMER)
</span><span class="cx"> 
</span><ins>+#include &quot;ContentType.h&quot;
</ins><span class="cx"> #include &quot;SourceBufferPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitMediaSourceGStreamer.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -41,21 +43,29 @@
</span><span class="cx"> 
</span><span class="cx"> class SourceBufferPrivateGStreamer final : public SourceBufferPrivate {
</span><span class="cx"> public:
</span><del>-    SourceBufferPrivateGStreamer(PassRefPtr&lt;MediaSourceClientGstreamer&gt;, const ContentType&amp;);
-    ~SourceBufferPrivateGStreamer() { }
</del><ins>+    SourceBufferPrivateGStreamer(PassRefPtr&lt;MediaSourceClientGStreamer&gt;, const ContentType&amp;);
+    virtual ~SourceBufferPrivateGStreamer();
</ins><span class="cx"> 
</span><del>-    void setClient(SourceBufferPrivateClient*) { }
-    void append(const unsigned char*, unsigned);
-    void abort();
-    void removedFromMediaSource();
-    MediaPlayer::ReadyState readyState() const { return m_readyState; }
-    void setReadyState(MediaPlayer::ReadyState readyState) { m_readyState = readyState; }
-    void evictCodedFrames() { }
-    bool isFull() { return false; }
</del><ins>+    virtual void setClient(SourceBufferPrivateClient*);
</ins><span class="cx"> 
</span><ins>+    virtual void append(const unsigned char* data, unsigned length);
+    virtual void abort();
+    virtual void removedFromMediaSource();
+
+    virtual MediaPlayer::ReadyState readyState() const;
+    virtual void setReadyState(MediaPlayer::ReadyState);
+
+    virtual void flushAndEnqueueNonDisplayingSamples(Vector&lt;RefPtr&lt;MediaSample&gt;&gt;, AtomicString);
+    virtual void enqueueSample(PassRefPtr&lt;MediaSample&gt;, AtomicString);
+    virtual bool isReadyForMoreSamples(AtomicString);
+    virtual void setActive(bool);
+    virtual void stopAskingForMoreSamples(AtomicString);
+    virtual void notifyClientWhenReadyForMoreSamples(AtomicString);
+
</ins><span class="cx"> private:
</span><del>-    String m_type;
-    RefPtr&lt;MediaSourceClientGstreamer&gt; m_client;
</del><ins>+    ContentType m_type;
+    RefPtr&lt;MediaSourceClientGStreamer&gt; m_client;
+    SourceBufferPrivateClient* m_sourceBufferPrivateClient;
</ins><span class="cx">     MediaPlayer::ReadyState m_readyState;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerWebKitMediaSourceGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp (177789 => 177790)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp        2014-12-29 12:53:19 UTC (rev 177789)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.cpp        2014-12-29 14:46:39 UTC (rev 177790)
</span><span class="lines">@@ -2,6 +2,7 @@
</span><span class="cx">  *  Copyright (C) 2009, 2010 Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;
</span><span class="cx">  *  Copyright (C) 2013 Collabora Ltd.
</span><span class="cx">  *  Copyright (C) 2013 Orange
</span><ins>+ *  Copyright (C) 2014 Sebastian Dröge &lt;sebastian@centricular.com&gt;
</ins><span class="cx">  *
</span><span class="cx">  *  This library is free software; you can redistribute it and/or
</span><span class="cx">  *  modify it under the terms of the GNU Lesser General Public
</span><span class="lines">@@ -23,61 +24,42 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(VIDEO) &amp;&amp; ENABLE(MEDIA_SOURCE) &amp;&amp; USE(GSTREAMER)
</span><span class="cx"> 
</span><del>-#include &quot;GRefPtrGStreamer.h&quot;
</del><span class="cx"> #include &quot;GStreamerUtilities.h&quot;
</span><span class="cx"> #include &quot;NotImplemented.h&quot;
</span><span class="cx"> #include &quot;TimeRanges.h&quot;
</span><ins>+
</ins><span class="cx"> #include &lt;gst/app/gstappsrc.h&gt;
</span><span class="cx"> #include &lt;gst/gst.h&gt;
</span><span class="cx"> #include &lt;gst/pbutils/missing-plugins.h&gt;
</span><del>-#include &lt;wtf/gobject/GThreadSafeMainLoopSource.h&gt;
</del><span class="cx"> #include &lt;wtf/gobject/GUniquePtr.h&gt;
</span><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="cx"> 
</span><del>-typedef struct _Source {
-    GstElement* appsrc;
-    guint sourceid;        /* To control the GSource */
-    GstPad* srcpad;
-    gboolean padAdded;
</del><ins>+typedef struct _Source Source;
+struct _Source {
+    GstElement* src;
+    // Just for identification
+    WebCore::SourceBufferPrivate* sourceBuffer;
+};
</ins><span class="cx"> 
</span><del>-    guint64 offset;
-    guint64 size;
-    gboolean paused;
-
-    GThreadSafeMainLoopSource start;
-    GThreadSafeMainLoopSource stop;
-    GThreadSafeMainLoopSource needData;
-    GThreadSafeMainLoopSource enoughData;
-    GThreadSafeMainLoopSource seek;
-
-    guint64 requestedOffset;
-} Source;
-
-
-#define WEBKIT_MEDIA_SRC_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_MEDIA_SRC, WebKitMediaSrcPrivate))
-
</del><span class="cx"> struct _WebKitMediaSrcPrivate {
</span><del>-    gchar* uri;
-    Source sourceVideo;
-    Source sourceAudio;
-    WebCore::MediaPlayer* player;
-    GstElement* playbin;
-    gint64 duration;
-    gboolean seekable;
-    gboolean noMorePad;
-    // TRUE if appsrc's version is &gt;= 0.10.27, see
-    // https://bugzilla.gnome.org/show_bug.cgi?id=609423
-    gboolean haveAppSrc27;
-    guint nbSource;
</del><ins>+    GList* sources;
+    gchar* location;
+    GstClockTime duration;
+    bool haveAppsrc;
+    bool asyncStart;
+    bool noMorePads;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> enum {
</span><del>-    PropLocation = 1,
-    ProLast
</del><ins>+    Prop0,
+    PropLocation
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-static GstStaticPadTemplate srcTemplate = GST_STATIC_PAD_TEMPLATE(&quot;src_%u&quot;, GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS_ANY);
</del><ins>+static GstStaticPadTemplate srcTemplate = GST_STATIC_PAD_TEMPLATE(&quot;src_%u&quot;, GST_PAD_SRC,
+    GST_PAD_SOMETIMES, GST_STATIC_CAPS_ANY);
</ins><span class="cx"> 
</span><ins>+#define WEBKIT_MEDIA_SRC_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_MEDIA_SRC, WebKitMediaSrcPrivate))
+
</ins><span class="cx"> GST_DEBUG_CATEGORY_STATIC(webkit_media_src_debug);
</span><span class="cx"> #define GST_CAT_DEFAULT webkit_media_src_debug
</span><span class="cx"> 
</span><span class="lines">@@ -88,24 +70,6 @@
</span><span class="cx"> static GstStateChangeReturn webKitMediaSrcChangeState(GstElement*, GstStateChange);
</span><span class="cx"> static gboolean webKitMediaSrcQueryWithParent(GstPad*, GstObject*, GstQuery*);
</span><span class="cx"> 
</span><del>-static void webKitMediaVideoSrcNeedDataCb(GstAppSrc*, guint, gpointer);
-static void webKitMediaVideoSrcEnoughDataCb(GstAppSrc*, gpointer);
-static gboolean webKitMediaVideoSrcSeekDataCb(GstAppSrc*, guint64, gpointer);
-static void webKitMediaAudioSrcNeedDataCb(GstAppSrc*, guint, gpointer);
-static void webKitMediaAudioSrcEnoughDataCb(GstAppSrc*, gpointer);
-static gboolean webKitMediaAudioSrcSeekDataCb(GstAppSrc*, guint64, gpointer);
-static GstAppSrcCallbacks appsrcCallbacksVideo = {
-    webKitMediaVideoSrcNeedDataCb,
-    webKitMediaVideoSrcEnoughDataCb,
-    webKitMediaVideoSrcSeekDataCb,
-    { 0 }
-};
-static GstAppSrcCallbacks appsrcCallbacksAudio = {
-    webKitMediaAudioSrcNeedDataCb,
-    webKitMediaAudioSrcEnoughDataCb,
-    webKitMediaAudioSrcSeekDataCb,
-    { 0 }
-};
</del><span class="cx"> #define webkit_media_src_parent_class parent_class
</span><span class="cx"> // We split this out into another macro to avoid a check-webkit-style error.
</span><span class="cx"> #define WEBKIT_MEDIA_SRC_CATEGORY_INIT GST_DEBUG_CATEGORY_INIT(webkit_media_src_debug, &quot;webkitmediasrc&quot;, 0, &quot;websrc element&quot;);
</span><span class="lines">@@ -124,7 +88,7 @@
</span><span class="cx"> 
</span><span class="cx">     gst_element_class_add_pad_template(eklass, gst_static_pad_template_get(&amp;srcTemplate));
</span><span class="cx"> 
</span><del>-    gst_element_class_set_metadata(eklass, &quot;WebKit Media source element&quot;, &quot;Source&quot;, &quot;Handles Blob uris&quot;, &quot;Stephane Jadaud &lt;sjadaud@sii.fr&gt;&quot;);
</del><ins>+    gst_element_class_set_static_metadata(eklass, &quot;WebKit Media source element&quot;, &quot;Source&quot;, &quot;Handles Blob uris&quot;, &quot;Stephane Jadaud &lt;sjadaud@sii.fr&gt;, Sebastian Dröge &lt;sebastian@centricular.com&gt;&quot;);
</ins><span class="cx"> 
</span><span class="cx">     /* Allows setting the uri using the 'location' property, which is used
</span><span class="cx">      * for example by gst_element_make_from_uri() */
</span><span class="lines">@@ -138,52 +102,9 @@
</span><span class="cx">     g_type_class_add_private(klass, sizeof(WebKitMediaSrcPrivate));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void webKitMediaSrcAddSrc(WebKitMediaSrc* src, GstElement* element)
-{
-    GstPad* ghostPad;
-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
-
-    if (!gst_bin_add(GST_BIN(src), element)) {
-        GST_DEBUG_OBJECT(src, &quot;Src element not added&quot;);
-        return;
-    }
-    GRefPtr&lt;GstPad&gt; targetsrc = adoptGRef(gst_element_get_static_pad(element, &quot;src&quot;));
-    if (!targetsrc) {
-        GST_DEBUG_OBJECT(src, &quot;Pad not found&quot;);
-        return;
-    }
-
-    gst_element_sync_state_with_parent(element);
-    GUniquePtr&lt;gchar&gt; name(g_strdup_printf(&quot;src_%u&quot;, priv-&gt;nbSource));
-    ghostPad = WebCore::webkitGstGhostPadFromStaticTemplate(&amp;srcTemplate, name.get(), targetsrc.get());
-    gst_pad_set_active(ghostPad, TRUE);
-
-    priv-&gt;nbSource++;
-
-    if (priv-&gt;sourceVideo.appsrc == element)
-        priv-&gt;sourceVideo.srcpad = ghostPad;
-    else if (priv-&gt;sourceAudio.appsrc == element)
-        priv-&gt;sourceAudio.srcpad = ghostPad;
-
-    GST_OBJECT_FLAG_SET(ghostPad, GST_PAD_FLAG_NEED_PARENT);
-    gst_pad_set_query_function(ghostPad, webKitMediaSrcQueryWithParent);
-}
-
</del><span class="cx"> static void webkit_media_src_init(WebKitMediaSrc* src)
</span><span class="cx"> {
</span><del>-    WebKitMediaSrcPrivate* priv = WEBKIT_MEDIA_SRC_GET_PRIVATE(src);
-    src-&gt;priv = priv;
-    new (priv) WebKitMediaSrcPrivate();
-
-    priv-&gt;sourceVideo.appsrc = gst_element_factory_make(&quot;appsrc&quot;, &quot;videoappsrc&quot;);
-    gst_app_src_set_callbacks(GST_APP_SRC(priv-&gt;sourceVideo.appsrc), &amp;appsrcCallbacksVideo, src, 0);
-    gst_app_src_set_stream_type(GST_APP_SRC(priv-&gt;sourceVideo.appsrc), GST_APP_STREAM_TYPE_SEEKABLE);
-    webKitMediaSrcAddSrc(src, priv-&gt;sourceVideo.appsrc);
-
-    priv-&gt;sourceAudio.appsrc = gst_element_factory_make(&quot;appsrc&quot;, &quot;audioappsrc&quot;);
-    gst_app_src_set_callbacks(GST_APP_SRC(priv-&gt;sourceAudio.appsrc), &amp;appsrcCallbacksAudio, src, 0);
-    gst_app_src_set_stream_type(GST_APP_SRC(priv-&gt;sourceAudio.appsrc), GST_APP_STREAM_TYPE_SEEKABLE);
-    webKitMediaSrcAddSrc(src, priv-&gt;sourceAudio.appsrc);
</del><ins>+    src-&gt;priv = WEBKIT_MEDIA_SRC_GET_PRIVATE(src);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void webKitMediaSrcFinalize(GObject* object)
</span><span class="lines">@@ -191,8 +112,8 @@
</span><span class="cx">     WebKitMediaSrc* src = WEBKIT_MEDIA_SRC(object);
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><del>-    g_free(priv-&gt;uri);
-    priv-&gt;~WebKitMediaSrcPrivate();
</del><ins>+    // TODO: Free sources
+    g_free(priv-&gt;location);
</ins><span class="cx"> 
</span><span class="cx">     GST_CALL_PARENT(G_OBJECT_CLASS, finalize, (object));
</span><span class="cx"> }
</span><span class="lines">@@ -200,6 +121,7 @@
</span><span class="cx"> static void webKitMediaSrcSetProperty(GObject* object, guint propId, const GValue* value, GParamSpec* pspec)
</span><span class="cx"> {
</span><span class="cx">     WebKitMediaSrc* src = WEBKIT_MEDIA_SRC(object);
</span><ins>+
</ins><span class="cx">     switch (propId) {
</span><span class="cx">     case PropLocation:
</span><span class="cx">         gst_uri_handler_set_uri(reinterpret_cast&lt;GstURIHandler*&gt;(src), g_value_get_string(value), 0);
</span><span class="lines">@@ -218,7 +140,7 @@
</span><span class="cx">     GST_OBJECT_LOCK(src);
</span><span class="cx">     switch (propId) {
</span><span class="cx">     case PropLocation:
</span><del>-        g_value_set_string(value, priv-&gt;uri);
</del><ins>+        g_value_set_string(value, priv-&gt;location);
</ins><span class="cx">         break;
</span><span class="cx">     default:
</span><span class="cx">         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, pspec);
</span><span class="lines">@@ -227,116 +149,24 @@
</span><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// must be called on main thread and with object unlocked
-static void webKitMediaVideoSrcStop(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaSrcDoAsyncStart(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><del>-    gboolean seeking;
-
-    GST_OBJECT_LOCK(src);
-
-    seeking = priv-&gt;sourceVideo.seek.isActive();
-
-    priv-&gt;sourceVideo.start.cancel();
-
-    priv-&gt;player = 0;
-    priv-&gt;playbin = 0;
-
-    priv-&gt;sourceVideo.needData.cancel();
-    priv-&gt;sourceVideo.enoughData.cancel();
-    priv-&gt;sourceVideo.seek.cancel();
-
-    priv-&gt;sourceVideo.paused = FALSE;
-    priv-&gt;sourceVideo.offset = 0;
-    priv-&gt;seekable = FALSE;
-
-    priv-&gt;duration = 0;
-    priv-&gt;nbSource = 0;
-
-    GST_OBJECT_UNLOCK(src);
-
-    if (priv-&gt;sourceVideo.appsrc) {
-        gst_app_src_set_caps(GST_APP_SRC(priv-&gt;sourceVideo.appsrc), 0);
-        if (!seeking)
-            gst_app_src_set_size(GST_APP_SRC(priv-&gt;sourceVideo.appsrc), -1);
-    }
-
-    GST_DEBUG_OBJECT(src, &quot;Stopped request&quot;);
</del><ins>+    priv-&gt;asyncStart = true;
+    GST_BIN_CLASS(parent_class)-&gt;handle_message(GST_BIN(src),
+        gst_message_new_async_start(GST_OBJECT(src)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void webKitMediaAudioSrcStop(WebKitMediaSrc* src)
</del><ins>+static void webKitMediaSrcDoAsyncDone(WebKitMediaSrc* src)
</ins><span class="cx"> {
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><del>-    gboolean seeking;
-
-    GST_OBJECT_LOCK(src);
-
-    seeking = priv-&gt;sourceAudio.seek.isActive();
-
-    priv-&gt;sourceAudio.start.cancel();
-
-    priv-&gt;player = 0;
-
-    priv-&gt;playbin = 0;
-
-    priv-&gt;sourceAudio.needData.cancel();
-    priv-&gt;sourceAudio.enoughData.cancel();
-    priv-&gt;sourceAudio.seek.cancel();
-
-    priv-&gt;sourceAudio.paused = FALSE;
-
-    priv-&gt;sourceAudio.offset = 0;
-
-    priv-&gt;seekable = FALSE;
-
-    priv-&gt;duration = 0;
-    priv-&gt;nbSource = 0;
-
-    GST_OBJECT_UNLOCK(src);
-
-    if (priv-&gt;sourceAudio.appsrc) {
-        gst_app_src_set_caps(GST_APP_SRC(priv-&gt;sourceAudio.appsrc), 0);
-        if (!seeking)
-            gst_app_src_set_size(GST_APP_SRC(priv-&gt;sourceAudio.appsrc), -1);
</del><ins>+    if (priv-&gt;asyncStart) {
+        GST_BIN_CLASS(parent_class)-&gt;handle_message(GST_BIN(src),
+            gst_message_new_async_done(GST_OBJECT(src), GST_CLOCK_TIME_NONE));
+        priv-&gt;asyncStart = false;
</ins><span class="cx">     }
</span><del>-
-    GST_DEBUG_OBJECT(src, &quot;Stopped request&quot;);
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-// must be called on main thread and with object unlocked
-static void webKitMediaVideoSrcStart(WebKitMediaSrc* src)
-{
-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
-
-    GST_OBJECT_LOCK(src);
-    if (!priv-&gt;uri) {
-        GST_ERROR_OBJECT(src, &quot;No URI provided&quot;);
-        GST_OBJECT_UNLOCK(src);
-        webKitMediaVideoSrcStop(src);
-        return;
-    }
-
-    GST_OBJECT_UNLOCK(src);
-    GST_DEBUG_OBJECT(src, &quot;Started request&quot;);
-}
-
-// must be called on main thread and with object unlocked
-static void webKitMediaAudioSrcStart(WebKitMediaSrc* src)
-{
-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
-
-    GST_OBJECT_LOCK(src);
-    if (!priv-&gt;uri) {
-        GST_ERROR_OBJECT(src, &quot;No URI provided&quot;);
-        GST_OBJECT_UNLOCK(src);
-        webKitMediaAudioSrcStop(src);
-        return;
-    }
-
-    GST_OBJECT_UNLOCK(src);
-    GST_DEBUG_OBJECT(src, &quot;Started request&quot;);
-}
-
</del><span class="cx"> static GstStateChangeReturn webKitMediaSrcChangeState(GstElement* element, GstStateChange transition)
</span><span class="cx"> {
</span><span class="cx">     GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
</span><span class="lines">@@ -344,13 +174,9 @@
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><span class="cx"> 
</span><span class="cx">     switch (transition) {
</span><del>-    case GST_STATE_CHANGE_NULL_TO_READY:
-        if (!priv-&gt;sourceVideo.appsrc &amp;&amp; !priv-&gt;sourceAudio.appsrc) {
-            gst_element_post_message(element,
-                gst_missing_element_message_new(element, &quot;appsrc&quot;));
-            GST_ELEMENT_ERROR(src, CORE, MISSING_PLUGIN, (0), (&quot;no appsrc&quot;));
-            return GST_STATE_CHANGE_FAILURE;
-        }
</del><ins>+    case GST_STATE_CHANGE_READY_TO_PAUSED:
+        priv-&gt;noMorePads = false;
+        webKitMediaSrcDoAsyncStart(src);
</ins><span class="cx">         break;
</span><span class="cx">     default:
</span><span class="cx">         break;
</span><span class="lines">@@ -359,37 +185,17 @@
</span><span class="cx">     ret = GST_ELEMENT_CLASS(parent_class)-&gt;change_state(element, transition);
</span><span class="cx">     if (G_UNLIKELY(ret == GST_STATE_CHANGE_FAILURE)) {
</span><span class="cx">         GST_DEBUG_OBJECT(src, &quot;State change failed&quot;);
</span><ins>+        webKitMediaSrcDoAsyncDone(src);
</ins><span class="cx">         return ret;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     switch (transition) {
</span><span class="cx">     case GST_STATE_CHANGE_READY_TO_PAUSED:
</span><del>-        GST_DEBUG_OBJECT(src, &quot;READY-&gt;PAUSED&quot;);
-        GST_OBJECT_LOCK(src);
-
-        gst_object_ref(src);
-        priv-&gt;sourceVideo.start.schedule(&quot;[WebKit] webKitMediaVideoSrcStart&quot;, std::function&lt;void()&gt;(std::bind(webKitMediaVideoSrcStart, src)), G_PRIORITY_DEFAULT,
-            [src] { gst_object_unref(src); });
-
-        gst_object_ref(src);
-        priv-&gt;sourceAudio.start.schedule(&quot;[WebKit] webKitMediaAudioSrcStart&quot;, std::function&lt;void()&gt;(std::bind(webKitMediaAudioSrcStart, src)), G_PRIORITY_DEFAULT,
-            [src] { gst_object_unref(src); });
-
-        GST_OBJECT_UNLOCK(src);
</del><ins>+        ret = GST_STATE_CHANGE_ASYNC;
</ins><span class="cx">         break;
</span><span class="cx">     case GST_STATE_CHANGE_PAUSED_TO_READY:
</span><del>-        GST_DEBUG_OBJECT(src, &quot;PAUSED-&gt;READY&quot;);
-        GST_OBJECT_LOCK(src);
-
-        gst_object_ref(src);
-        priv-&gt;sourceVideo.stop.schedule(&quot;[WebKit] webKitMediaVideoSrcStop&quot;, std::function&lt;void()&gt;(std::bind(webKitMediaVideoSrcStop, src)), G_PRIORITY_DEFAULT,
-            [src] { gst_object_unref(src); });
-
-        gst_object_ref(src);
-        priv-&gt;sourceAudio.stop.schedule(&quot;[WebKit] webKitMediaAudioSrcStop&quot;, std::function&lt;void()&gt;(std::bind(webKitMediaAudioSrcStop, src)), G_PRIORITY_DEFAULT,
-            [src] { gst_object_unref(src); });
-
-        GST_OBJECT_UNLOCK(src);
</del><ins>+        webKitMediaSrcDoAsyncDone(src);
+        priv-&gt;noMorePads = false;
</ins><span class="cx">         break;
</span><span class="cx">     default:
</span><span class="cx">         break;
</span><span class="lines">@@ -419,7 +225,7 @@
</span><span class="cx">     }
</span><span class="cx">     case GST_QUERY_URI: {
</span><span class="cx">         GST_OBJECT_LOCK(src);
</span><del>-        gst_query_set_uri(query, src-&gt;priv-&gt;uri);
</del><ins>+        gst_query_set_uri(query, src-&gt;priv-&gt;location);
</ins><span class="cx">         GST_OBJECT_UNLOCK(src);
</span><span class="cx">         result = TRUE;
</span><span class="cx">         break;
</span><span class="lines">@@ -454,7 +260,7 @@
</span><span class="cx">     gchar* ret;
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(src);
</span><del>-    ret = g_strdup(src-&gt;priv-&gt;uri);
</del><ins>+    ret = g_strdup(src-&gt;priv-&gt;location);
</ins><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><span class="cx">     return ret;
</span><span class="cx"> }
</span><span class="lines">@@ -463,14 +269,15 @@
</span><span class="cx"> {
</span><span class="cx">     WebKitMediaSrc* src = WEBKIT_MEDIA_SRC(handler);
</span><span class="cx">     WebKitMediaSrcPrivate* priv = src-&gt;priv;
</span><ins>+
</ins><span class="cx">     if (GST_STATE(src) &gt;= GST_STATE_PAUSED) {
</span><span class="cx">         GST_ERROR_OBJECT(src, &quot;URI can only be set in states &lt; PAUSED&quot;);
</span><span class="cx">         return FALSE;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     GST_OBJECT_LOCK(src);
</span><del>-    g_free(priv-&gt;uri);
-    priv-&gt;uri = 0;
</del><ins>+    g_free(priv-&gt;location);
+    priv-&gt;location = 0;
</ins><span class="cx">     if (!uri) {
</span><span class="cx">         GST_OBJECT_UNLOCK(src);
</span><span class="cx">         return TRUE;
</span><span class="lines">@@ -478,11 +285,10 @@
</span><span class="cx"> 
</span><span class="cx">     WebCore::URL url(WebCore::URL(), uri);
</span><span class="cx"> 
</span><del>-    priv-&gt;uri = g_strdup(url.string().utf8().data());
</del><ins>+    priv-&gt;location = g_strdup(url.string().utf8().data());
</ins><span class="cx">     GST_OBJECT_UNLOCK(src);
</span><span class="cx">     return TRUE;
</span><span class="cx"> }
</span><del>-
</del><span class="cx"> static void webKitMediaSrcUriHandlerInit(gpointer gIface, gpointer)
</span><span class="cx"> {
</span><span class="cx">     GstURIHandlerInterface* iface = (GstURIHandlerInterface *) gIface;
</span><span class="lines">@@ -493,296 +299,164 @@
</span><span class="cx">     iface-&gt;set_uri = webKitMediaSrcSetUri;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// appsrc callbacks
-static void webKitMediaVideoSrcNeedDataMainCb(WebKitMediaSrc* src)
</del><ins>+namespace WebCore {
+MediaSourceClientGStreamer::MediaSourceClientGStreamer(WebKitMediaSrc* src)
+    : m_src(adoptGRef(static_cast&lt;WebKitMediaSrc*&gt;(gst_object_ref(src))))
</ins><span class="cx"> {
</span><del>-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
-
-    GST_OBJECT_LOCK(src);
-    priv-&gt;sourceVideo.paused = FALSE;
-    GST_OBJECT_UNLOCK(src);
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void webKitMediaAudioSrcNeedDataMainCb(WebKitMediaSrc* src)
</del><ins>+MediaSourceClientGStreamer::~MediaSourceClientGStreamer()
</ins><span class="cx"> {
</span><del>-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
-
-    GST_OBJECT_LOCK(src);
-    priv-&gt;sourceAudio.paused = FALSE;
-    GST_OBJECT_UNLOCK(src);
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void webKitMediaVideoSrcNeedDataCb(GstAppSrc*, guint length, gpointer userData)
</del><ins>+MediaSourcePrivate::AddStatus MediaSourceClientGStreamer::addSourceBuffer(PassRefPtr&lt;SourceBufferPrivate&gt; sourceBufferPrivate, const ContentType&amp;)
</ins><span class="cx"> {
</span><del>-    WebKitMediaSrc* src = WEBKIT_MEDIA_SRC(userData);
-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
</del><ins>+    WebKitMediaSrcPrivate* priv = m_src-&gt;priv;
</ins><span class="cx"> 
</span><del>-    GST_DEBUG_OBJECT(src, &quot;Need more data: %u&quot;, length);
-
-    GST_OBJECT_LOCK(src);
-    if (priv-&gt;sourceVideo.needData.isScheduled() || !priv-&gt;sourceVideo.paused) {
-        GST_OBJECT_UNLOCK(src);
-        return;
</del><ins>+    if (priv-&gt;noMorePads) {
+        GST_ERROR_OBJECT(m_src.get(), &quot;Adding new source buffers after first data not supported yet&quot;);
+        return MediaSourcePrivate::NotSupported;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gst_object_ref(src);
-    priv-&gt;sourceVideo.needData.schedule(&quot;[WebKit] webKitMediaVideoSrcNeedDataMainCb&quot;, std::function&lt;void()&gt;(std::bind(webKitMediaVideoSrcNeedDataMainCb, src)), G_PRIORITY_DEFAULT,
-        [src] { gst_object_unref(src); });
-    GST_OBJECT_UNLOCK(src);
-}
</del><ins>+    GST_DEBUG_OBJECT(m_src.get(), &quot;State %d&quot;, static_cast&lt;int&gt;(GST_STATE(m_src.get())));
</ins><span class="cx"> 
</span><del>-static void webKitMediaAudioSrcNeedDataCb(GstAppSrc*, guint length, gpointer userData)
-{
-    WebKitMediaSrc* src = WEBKIT_MEDIA_SRC(userData);
-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
</del><ins>+    GST_OBJECT_LOCK(m_src.get());
</ins><span class="cx"> 
</span><del>-    GST_DEBUG_OBJECT(src, &quot;Need more data: %u&quot;, length);
</del><ins>+    Source* source = g_new0(Source, 1);
+    guint numberOfSources = g_list_length(priv-&gt;sources);
+    GUniquePtr&lt;gchar&gt; srcName(g_strdup_printf(&quot;src%u&quot;, numberOfSources));
</ins><span class="cx"> 
</span><del>-    GST_OBJECT_LOCK(src);
-    if (priv-&gt;sourceAudio.needData.isScheduled() || !priv-&gt;sourceAudio.paused) {
-        GST_OBJECT_UNLOCK(src);
-        return;
-    }
</del><ins>+    source-&gt;src = gst_element_factory_make(&quot;appsrc&quot;, srcName.get());
+    source-&gt;sourceBuffer = sourceBufferPrivate.get();
</ins><span class="cx"> 
</span><del>-    gst_object_ref(src);
-    priv-&gt;sourceAudio.needData.schedule(&quot;[WebKit] webKitMediaAudioSrcNeedDataMainCb&quot;, std::function&lt;void()&gt;(std::bind(webKitMediaAudioSrcNeedDataMainCb, src)), G_PRIORITY_DEFAULT,
-        [src] { gst_object_unref(src); });
-    GST_OBJECT_UNLOCK(src);
-}
</del><ins>+    GUniquePtr&lt;gchar&gt; padName(g_strdup_printf(&quot;src_%u&quot;, numberOfSources));
+    priv-&gt;sources = g_list_prepend(priv-&gt;sources, source);
+    GST_OBJECT_UNLOCK(m_src.get());
</ins><span class="cx"> 
</span><del>-static void webKitMediaVideoSrcEnoughDataMainCb(WebKitMediaSrc* src)
-{
-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
</del><ins>+    priv-&gt;haveAppsrc = source-&gt;src;
</ins><span class="cx"> 
</span><del>-    GST_OBJECT_LOCK(src);
-    priv-&gt;sourceVideo.paused = TRUE;
-    GST_OBJECT_UNLOCK(src);
-}
</del><ins>+    gst_bin_add(GST_BIN(m_src.get()), source-&gt;src);
+    GRefPtr&lt;GstPad&gt; pad = adoptGRef(gst_element_get_static_pad(source-&gt;src, &quot;src&quot;));
+    GRefPtr&lt;GstPad&gt; ghostPad = adoptGRef(gst_ghost_pad_new_from_template(padName.get(), pad.get(),
+        gst_static_pad_template_get(&amp;srcTemplate)));
+    gst_pad_set_query_function(ghostPad.get(), webKitMediaSrcQueryWithParent);
+    gst_pad_set_active(ghostPad.get(), TRUE);
+    gst_element_add_pad(GST_ELEMENT(m_src.get()), ghostPad.leakRef());
</ins><span class="cx"> 
</span><del>-static void webKitMediaAudioSrcEnoughDataMainCb(WebKitMediaSrc* src)
-{
-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
</del><ins>+    gst_element_sync_state_with_parent(source-&gt;src);
</ins><span class="cx"> 
</span><del>-    GST_OBJECT_LOCK(src);
-    priv-&gt;sourceAudio.paused = TRUE;
-    GST_OBJECT_UNLOCK(src);
</del><ins>+    return MediaSourcePrivate::Ok;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void webKitMediaVideoSrcEnoughDataCb(GstAppSrc*, gpointer userData)
</del><ins>+void MediaSourceClientGStreamer::durationChanged(const MediaTime&amp; duration)
</ins><span class="cx"> {
</span><del>-    WebKitMediaSrc* src = WEBKIT_MEDIA_SRC(userData);
-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
</del><ins>+    WebKitMediaSrcPrivate* priv = m_src-&gt;priv;
+    GstClockTime gstDuration = gst_util_uint64_scale(duration.timeValue(), GST_SECOND, duration.timeScale());
</ins><span class="cx"> 
</span><del>-    GST_DEBUG_OBJECT(src, &quot;Have enough data&quot;);
</del><ins>+    GST_DEBUG_OBJECT(m_src.get(), &quot;Received duration: %&quot; GST_TIME_FORMAT, GST_TIME_ARGS(gstDuration));
</ins><span class="cx"> 
</span><del>-    GST_OBJECT_LOCK(src);
-    if (priv-&gt;sourceVideo.enoughData.isScheduled() || priv-&gt;sourceVideo.paused) {
-        GST_OBJECT_UNLOCK(src);
-        return;
-    }
-
-    gst_object_ref(src);
-    priv-&gt;sourceVideo.enoughData.schedule(&quot;[WebKit] webKitMediaVideoSrcEnoughDataMainCb&quot;, std::function&lt;void()&gt;(std::bind(webKitMediaVideoSrcEnoughDataMainCb, src)), G_PRIORITY_DEFAULT,
-        [src] { gst_object_unref(src); });
-
-    GST_OBJECT_UNLOCK(src);
</del><ins>+    GST_OBJECT_LOCK(m_src.get());
+    priv-&gt;duration = gstDuration;
+    GST_OBJECT_UNLOCK(m_src.get());
+    gst_element_post_message(GST_ELEMENT(m_src.get()), gst_message_new_duration_changed(GST_OBJECT(m_src.get())));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void webKitMediaAudioSrcEnoughDataCb(GstAppSrc*, gpointer userData)
</del><ins>+SourceBufferPrivateClient::AppendResult MediaSourceClientGStreamer::append(PassRefPtr&lt;SourceBufferPrivate&gt; sourceBufferPrivate, const unsigned char* data, unsigned length)
</ins><span class="cx"> {
</span><del>-    WebKitMediaSrc* src = WEBKIT_MEDIA_SRC(userData);
-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
</del><ins>+    WebKitMediaSrcPrivate* priv = m_src-&gt;priv;
+    GstFlowReturn ret = GST_FLOW_OK;
+    GstBuffer* buffer;
+    Source* source = 0;
</ins><span class="cx"> 
</span><del>-    GST_DEBUG_OBJECT(src, &quot;Have enough data&quot;);
</del><ins>+    if (!priv-&gt;noMorePads) {
+        priv-&gt;noMorePads = true;
+        gst_element_no_more_pads(GST_ELEMENT(m_src.get()));
+        webKitMediaSrcDoAsyncDone(m_src.get());
+    }
</ins><span class="cx"> 
</span><del>-    GST_OBJECT_LOCK(src);
-    if (priv-&gt;sourceAudio.enoughData.isScheduled() || priv-&gt;sourceAudio.paused) {
-        GST_OBJECT_UNLOCK(src);
-        return;
</del><ins>+    for (GList* iter = priv-&gt;sources; iter; iter = iter-&gt;next) {
+        Source* tmp = static_cast&lt;Source*&gt;(iter-&gt;data);
+        if (tmp-&gt;sourceBuffer == sourceBufferPrivate.get()) {
+            source = tmp;
+            break;
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gst_object_ref(src);
-    priv-&gt;sourceAudio.enoughData.schedule(&quot;[WebKit] webKitMediaAudioSrcEnoughDataMainCb&quot;, std::function&lt;void()&gt;(std::bind(webKitMediaAudioSrcEnoughDataMainCb, src)), G_PRIORITY_DEFAULT,
-        [src] { gst_object_unref(src); });
</del><ins>+    if (!source || !source-&gt;src)
+        return SourceBufferPrivateClient::ReadStreamFailed;
</ins><span class="cx"> 
</span><del>-    GST_OBJECT_UNLOCK(src);
-}
</del><ins>+    buffer = gst_buffer_new_and_alloc(length);
+    gst_buffer_fill(buffer, 0, data, length);
</ins><span class="cx"> 
</span><del>-static void webKitMediaVideoSrcSeekMainCb(WebKitMediaSrc*)
-{
-    notImplemented();
-}
</del><ins>+    ret = gst_app_src_push_buffer(GST_APP_SRC(source-&gt;src), buffer);
+    GST_DEBUG_OBJECT(m_src.get(), &quot;push buffer %d\n&quot;, static_cast&lt;int&gt;(ret));
</ins><span class="cx"> 
</span><ins>+    if (ret == GST_FLOW_OK)
+        return SourceBufferPrivateClient::AppendSucceeded;
</ins><span class="cx"> 
</span><del>-static void webKitMediaAudioSrcSeekMainCb(WebKitMediaSrc*)
-{
-    notImplemented();
</del><ins>+    return SourceBufferPrivateClient::ReadStreamFailed;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean webKitMediaVideoSrcSeekDataCb(GstAppSrc*, guint64 offset, gpointer userData)
</del><ins>+void MediaSourceClientGStreamer::markEndOfStream(MediaSourcePrivate::EndOfStreamStatus)
</ins><span class="cx"> {
</span><del>-    WebKitMediaSrc* src = WEBKIT_MEDIA_SRC(userData);
-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
</del><ins>+    WebKitMediaSrcPrivate* priv = m_src-&gt;priv;
</ins><span class="cx"> 
</span><del>-    GST_DEBUG_OBJECT(src, &quot;Seeking to offset: %&quot; G_GUINT64_FORMAT, offset);
-    GST_OBJECT_LOCK(src);
-    if (offset == priv-&gt;sourceVideo.offset &amp;&amp; priv-&gt;sourceVideo.requestedOffset == priv-&gt;sourceVideo.offset) {
-        GST_OBJECT_UNLOCK(src);
-        return TRUE;
-    }
</del><ins>+    GST_DEBUG_OBJECT(m_src.get(), &quot;Have EOS&quot;);
</ins><span class="cx"> 
</span><del>-    if (!priv-&gt;seekable) {
-        GST_OBJECT_UNLOCK(src);
-        return FALSE;
</del><ins>+    if (!priv-&gt;noMorePads) {
+        priv-&gt;noMorePads = true;
+        gst_element_no_more_pads(GST_ELEMENT(m_src.get()));
+        webKitMediaSrcDoAsyncDone(m_src.get());
</ins><span class="cx">     }
</span><del>-    if (offset &gt; priv-&gt;sourceVideo.size) {
-        GST_OBJECT_UNLOCK(src);
-        return FALSE;
-    }
</del><span class="cx"> 
</span><del>-    GST_DEBUG_OBJECT(src, &quot;Doing range-request seek&quot;);
-    priv-&gt;sourceVideo.requestedOffset = offset;
-
-    gst_object_ref(src);
-    priv-&gt;sourceVideo.seek.schedule(&quot;[WebKit] webKitMediaVideoSrcSeekMainCb&quot;, std::function&lt;void()&gt;(std::bind(webKitMediaVideoSrcSeekMainCb, src)), G_PRIORITY_DEFAULT,
-        [src] { gst_object_unref(src); });
-
-    GST_OBJECT_UNLOCK(src);
-
-    return TRUE;
</del><ins>+    for (GList* iter = priv-&gt;sources; iter; iter = iter-&gt;next) {
+        Source* source = static_cast&lt;Source*&gt;(iter-&gt;data);
+        if (source-&gt;src)
+            gst_app_src_end_of_stream(GST_APP_SRC(source-&gt;src));
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean webKitMediaAudioSrcSeekDataCb(GstAppSrc*, guint64 offset, gpointer userData)
</del><ins>+void MediaSourceClientGStreamer::removedFromMediaSource(PassRefPtr&lt;SourceBufferPrivate&gt; sourceBufferPrivate)
</ins><span class="cx"> {
</span><del>-    WebKitMediaSrc* src = WEBKIT_MEDIA_SRC(userData);
-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
</del><ins>+    WebKitMediaSrcPrivate* priv = m_src-&gt;priv;
+    Source* source = 0;
</ins><span class="cx"> 
</span><del>-    GST_DEBUG_OBJECT(src, &quot;Seeking to offset: %&quot; G_GUINT64_FORMAT, offset);
-    GST_OBJECT_LOCK(src);
-    if (offset == priv-&gt;sourceAudio.offset &amp;&amp; priv-&gt;sourceAudio.requestedOffset == priv-&gt;sourceAudio.offset) {
-        GST_OBJECT_UNLOCK(src);
-        return TRUE;
</del><ins>+    for (GList* iter = priv-&gt;sources; iter; iter = iter-&gt;next) {
+        Source* tmp = static_cast&lt;Source*&gt;(iter-&gt;data);
+        if (tmp-&gt;sourceBuffer == sourceBufferPrivate.get()) {
+            source = tmp;
+            break;
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!priv-&gt;seekable) {
-        GST_OBJECT_UNLOCK(src);
-        return FALSE;
-    }
-    if (offset &gt; priv-&gt;sourceAudio.size) {
-        GST_OBJECT_UNLOCK(src);
-        return FALSE;
-    }
</del><ins>+    ASSERT(source &amp;&amp; source-&gt;src);
</ins><span class="cx"> 
</span><del>-    GST_DEBUG_OBJECT(src, &quot;Doing range-request seek&quot;);
-    priv-&gt;sourceAudio.requestedOffset = offset;
-
-    gst_object_ref(src);
-    priv-&gt;sourceAudio.seek.schedule(&quot;[WebKit] webKitMediaAudioSrcSeekMainCb&quot;, std::function&lt;void()&gt;(std::bind(webKitMediaAudioSrcSeekMainCb, src)), G_PRIORITY_DEFAULT,
-        [src] { gst_object_unref(src); });
-
-    GST_OBJECT_UNLOCK(src);
-
-    return TRUE;
</del><ins>+    gst_app_src_end_of_stream(GST_APP_SRC(source-&gt;src));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void webKitMediaSrcSetMediaPlayer(WebKitMediaSrc* src, WebCore::MediaPlayer* player)
-{
-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
-    priv-&gt;player = player;
-}
</del><ins>+};
</ins><span class="cx"> 
</span><del>-void webKitMediaSrcSetPlayBin(WebKitMediaSrc* src, GstElement* playBin)
</del><ins>+namespace WTF {
+template &lt;&gt; GRefPtr&lt;WebKitMediaSrc&gt; adoptGRef(WebKitMediaSrc* ptr)
</ins><span class="cx"> {
</span><del>-    WebKitMediaSrcPrivate* priv = src-&gt;priv;
-    priv-&gt;playbin = playBin;
</del><ins>+    ASSERT(!ptr || !g_object_is_floating(G_OBJECT(ptr)));
+    return GRefPtr&lt;WebKitMediaSrc&gt;(ptr, GRefPtrAdopt);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-MediaSourceClientGstreamer::MediaSourceClientGstreamer(WebKitMediaSrc* src)
-    : m_src(static_cast&lt;WebKitMediaSrc*&gt;(gst_object_ref(src)))
</del><ins>+template &lt;&gt; WebKitMediaSrc* refGPtr&lt;WebKitMediaSrc&gt;(WebKitMediaSrc* ptr)
</ins><span class="cx"> {
</span><del>-}
</del><ins>+    if (ptr)
+        gst_object_ref_sink(GST_OBJECT(ptr));
</ins><span class="cx"> 
</span><del>-MediaSourceClientGstreamer::~MediaSourceClientGstreamer()
-{
-    gst_object_unref(m_src);
</del><ins>+    return ptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaSourceClientGstreamer::didReceiveDuration(double duration)
</del><ins>+template &lt;&gt; void derefGPtr&lt;WebKitMediaSrc&gt;(WebKitMediaSrc* ptr)
</ins><span class="cx"> {
</span><del>-    WebKitMediaSrcPrivate* priv = m_src-&gt;priv;
-    GST_DEBUG_OBJECT(m_src, &quot;Received duration: %lf&quot;, duration);
-
-    GST_OBJECT_LOCK(m_src);
-    priv-&gt;duration = duration &gt;= 0.0 ? static_cast&lt;gint64&gt;(duration*GST_SECOND) : 0;
-    GST_OBJECT_UNLOCK(m_src);
</del><ins>+    if (ptr)
+        gst_object_unref(ptr);
</ins><span class="cx"> }
</span><ins>+};
</ins><span class="cx"> 
</span><del>-void MediaSourceClientGstreamer::didReceiveData(const char* data, int length, String type)
-{
-    WebKitMediaSrcPrivate* priv = m_src-&gt;priv;
-    GstFlowReturn ret = GST_FLOW_OK;
-    GstBuffer * buffer;
-
-    if (type.startsWith(&quot;video&quot;)) {
-        if (priv-&gt;noMorePad == FALSE &amp;&amp; priv-&gt;sourceVideo.padAdded == TRUE) {
-            gst_element_no_more_pads(GST_ELEMENT(m_src));
-            priv-&gt;noMorePad = TRUE;
-        }
-        if (priv-&gt;noMorePad == FALSE &amp;&amp; priv-&gt;sourceVideo.padAdded == FALSE) {
-            gst_element_add_pad(GST_ELEMENT(m_src), priv-&gt;sourceVideo.srcpad);
-            priv-&gt;sourceVideo.padAdded = TRUE;
-        }
-        GST_OBJECT_LOCK(m_src);
-        buffer = WebCore::createGstBufferForData(data, length);
-        GST_OBJECT_UNLOCK(m_src);
-
-        ret = gst_app_src_push_buffer(GST_APP_SRC(priv-&gt;sourceVideo.appsrc), buffer);
-    } else if (type.startsWith(&quot;audio&quot;)) {
-        if (priv-&gt;noMorePad == FALSE &amp;&amp; priv-&gt;sourceAudio.padAdded == TRUE) {
-            gst_element_no_more_pads(GST_ELEMENT(m_src));
-            priv-&gt;noMorePad = TRUE;
-        }
-        if (priv-&gt;noMorePad == FALSE &amp;&amp; priv-&gt;sourceAudio.padAdded == FALSE) {
-            gst_element_add_pad(GST_ELEMENT(m_src), priv-&gt;sourceAudio.srcpad);
-            priv-&gt;sourceAudio.padAdded = TRUE;
-        }
-        GST_OBJECT_LOCK(m_src);
-        buffer = WebCore::createGstBufferForData(data, length);
-        GST_OBJECT_UNLOCK(m_src);
-
-        ret = gst_app_src_push_buffer(GST_APP_SRC(priv-&gt;sourceAudio.appsrc), buffer);
-    }
-
-    if (ret != GST_FLOW_OK &amp;&amp; ret != GST_FLOW_EOS)
-        GST_ELEMENT_ERROR(m_src, CORE, FAILED, (0), (0));
-}
-
-void MediaSourceClientGstreamer::didFinishLoading(double)
-{
-    WebKitMediaSrcPrivate* priv = m_src-&gt;priv;
-
-    GST_DEBUG_OBJECT(m_src, &quot;Have EOS&quot;);
-
-    GST_OBJECT_LOCK(m_src);
-    if (!priv-&gt;sourceVideo.seek.isActive()) {
-        GST_OBJECT_UNLOCK(m_src);
-        gst_app_src_end_of_stream(GST_APP_SRC(priv-&gt;sourceVideo.appsrc));
-    } else
-        GST_OBJECT_UNLOCK(m_src);
-
-    GST_OBJECT_LOCK(m_src);
-    if (!priv-&gt;sourceAudio.seek.isActive()) {
-        GST_OBJECT_UNLOCK(m_src);
-        gst_app_src_end_of_stream(GST_APP_SRC(priv-&gt;sourceAudio.appsrc));
-    } else
-        GST_OBJECT_UNLOCK(m_src);
-}
-
-void MediaSourceClientGstreamer::didFail()
-{
-    gst_app_src_end_of_stream(GST_APP_SRC(m_src-&gt;priv-&gt;sourceVideo.appsrc));
-    gst_app_src_end_of_stream(GST_APP_SRC(m_src-&gt;priv-&gt;sourceAudio.appsrc));
-}
-
</del><span class="cx"> #endif // USE(GSTREAMER)
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerWebKitMediaSourceGStreamerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.h (177789 => 177790)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.h        2014-12-29 12:53:19 UTC (rev 177789)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/WebKitMediaSourceGStreamer.h        2014-12-29 14:46:39 UTC (rev 177790)
</span><span class="lines">@@ -2,6 +2,7 @@
</span><span class="cx">  *  Copyright (C) 2009, 2010 Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;
</span><span class="cx">  *  Copyright (C) 2013 Collabora Ltd.
</span><span class="cx">  *  Copyright (C) 2013 Orange
</span><ins>+ *  Copyright (C) 2014 Sebastian Dröge &lt;sebastian@centricular.com&gt;
</ins><span class="cx">  *
</span><span class="cx">  *  This library is free software; you can redistribute it and/or
</span><span class="cx">  *  modify it under the terms of the GNU Lesser General Public
</span><span class="lines">@@ -22,7 +23,12 @@
</span><span class="cx"> #define WebKitMediaSourceGStreamer_h
</span><span class="cx"> #if ENABLE(VIDEO) &amp;&amp; ENABLE(MEDIA_SOURCE) &amp;&amp; USE(GSTREAMER)
</span><span class="cx"> 
</span><ins>+#include &quot;GRefPtrGStreamer.h&quot;
</ins><span class="cx"> #include &quot;MediaPlayer.h&quot;
</span><ins>+#include &quot;MediaSource.h&quot;
+#include &quot;SourceBufferPrivate.h&quot;
+#include &quot;SourceBufferPrivateClient.h&quot;
+
</ins><span class="cx"> #include &lt;gst/gst.h&gt;
</span><span class="cx"> 
</span><span class="cx"> G_BEGIN_DECLS
</span><span class="lines">@@ -48,25 +54,38 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> GType webkit_media_src_get_type(void);
</span><del>-void webKitMediaSrcSetMediaPlayer(WebKitMediaSrc*, WebCore::MediaPlayer*);
-void webKitMediaSrcSetPlayBin(WebKitMediaSrc*, GstElement*);
</del><span class="cx"> 
</span><span class="cx"> G_END_DECLS
</span><span class="cx"> 
</span><del>-class MediaSourceClientGstreamer: public RefCounted&lt;MediaSourceClientGstreamer&gt; {
</del><ins>+namespace WTF {
+template&lt;&gt; GRefPtr&lt;WebKitMediaSrc&gt; adoptGRef(WebKitMediaSrc* ptr);
+template&lt;&gt; WebKitMediaSrc* refGPtr&lt;WebKitMediaSrc&gt;(WebKitMediaSrc* ptr);
+template&lt;&gt; void derefGPtr&lt;WebKitMediaSrc&gt;(WebKitMediaSrc* ptr);
+};
+
+namespace WebCore {
+
+class ContentType;
+
+class MediaSourceClientGStreamer: public RefCounted&lt;MediaSourceClientGStreamer&gt; {
</ins><span class="cx">     public:
</span><del>-        MediaSourceClientGstreamer(WebKitMediaSrc*);
-        ~MediaSourceClientGstreamer();
</del><ins>+        MediaSourceClientGStreamer(WebKitMediaSrc*);
+        virtual ~MediaSourceClientGStreamer();
</ins><span class="cx"> 
</span><del>-        void didReceiveDuration(double);
-        void didReceiveData(const char*, int, String);
-        void didFinishLoading(double);
-        void didFail();
</del><ins>+        // From MediaSourceGStreamer
+        MediaSourcePrivate::AddStatus addSourceBuffer(PassRefPtr&lt;SourceBufferPrivate&gt;, const ContentType&amp;);
+        void durationChanged(const MediaTime&amp;);
+        void markEndOfStream(MediaSourcePrivate::EndOfStreamStatus);
</ins><span class="cx"> 
</span><ins>+        // From SourceBufferPrivateGStreamer
+        SourceBufferPrivateClient::AppendResult append(PassRefPtr&lt;SourceBufferPrivate&gt;, const unsigned char*, unsigned);
+        void removedFromMediaSource(PassRefPtr&lt;SourceBufferPrivate&gt;);
+
</ins><span class="cx">     private:
</span><del>-        WebKitMediaSrc* m_src;
</del><ins>+        GRefPtr&lt;WebKitMediaSrc&gt; m_src;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+};
</ins><span class="cx"> 
</span><span class="cx"> #endif // USE(GSTREAMER)
</span><span class="cx"> #endif
</span></span></pre>
</div>
</div>

</body>
</html>