<!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>[279973] 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/279973">279973</a></dd>
<dt>Author</dt> <dd>jya@apple.com</dd>
<dt>Date</dt> <dd>2021-07-15 19:07:47 -0700 (Thu, 15 Jul 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>[MSE] sequence mode is broken if GPU Process is enabled
https://bugs.webkit.org/show_bug.cgi?id=227864
<rdar://problem/80445041>

Reviewed by Jer Noble.

Source/WebCore:

When the source buffer's mode is set to sequence, the timestampOffset attribute
should be updated after each appendBuffer operation. However, when the GPU process
is enabled, the timestampOffset calculations are all done in the GPU process and
its result wasn't communicated back to the WebContent process leading its value
to always be 0 on read.
Fly-by fix: the timestamp offset calculation was incorrect, per spec
https://w3c.github.io/media-source/#sourcebuffer-coded-frame-processing
step 3.5.8.3.1 we read:
// Set timestampOffset equal to group start timestamp - presentation timestamp.
but the code did otherwise.

Test: media/media-source/media-mp4-h264-sequence-mode.html

* platform/graphics/SourceBufferPrivate.cpp:
(WebCore::SourceBufferPrivate::didReceiveSample): Offset m_timestampOffset by
the sample's presentation timestamp

Source/WebKit:

 When the source buffer's mode is set to sequence, the timestampOffset attribute
should be updated after each appendBuffer operation. However, when the GPU process
is enabled, the timestampOffset calculations are all done in the GPU process and
its result wasn't communicated back to the WebContent process leading its value
to always be 0 on read.

* GPUProcess/media/RemoteSourceBufferProxy.cpp:
(WebKit::RemoteSourceBufferProxy::sourceBufferPrivateAppendComplete): Add value of
the potentially updated timestamp offset back to the content process.
* WebProcess/GPU/media/SourceBufferPrivateRemote.cpp:
(WebKit::SourceBufferPrivateRemote::sourceBufferPrivateAppendComplete):
* WebProcess/GPU/media/SourceBufferPrivateRemote.h:
* WebProcess/GPU/media/SourceBufferPrivateRemote.messages.in: Add extra timestampOffset
parameter.

LayoutTests:

Note: we had tests checking on the correctness of the operation; however it's
using a mock SourceBuffer which doesn't run in the GPU process. Doing bug 225367
should be a priority so we get better code coverage and such bugs don't skip
under the radar.
To get around this issue, we write a new test that uses a mp4 and a h264 video track.

* media/media-source/media-mp4-h264-sequence-mode-expected.txt: Added.
* media/media-source/media-mp4-h264-sequence-mode.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsSourceBufferPrivatecpp">trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.cpp</a></li>
<li><a href="#trunkSourceWebKitChangeLog">trunk/Source/WebKit/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitGPUProcessmediaRemoteSourceBufferProxycpp">trunk/Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.cpp</a></li>
<li><a href="#trunkSourceWebKitWebProcessGPUmediaSourceBufferPrivateRemotecpp">trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp</a></li>
<li><a href="#trunkSourceWebKitWebProcessGPUmediaSourceBufferPrivateRemoteh">trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.h</a></li>
<li><a href="#trunkSourceWebKitWebProcessGPUmediaSourceBufferPrivateRemotemessagesin">trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.messages.in</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsmediamediasourcemediamp4h264sequencemodeexpectedtxt">trunk/LayoutTests/media/media-source/media-mp4-h264-sequence-mode-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediamediasourcemediamp4h264sequencemodehtml">trunk/LayoutTests/media/media-source/media-mp4-h264-sequence-mode.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (279972 => 279973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2021-07-16 01:25:20 UTC (rev 279972)
+++ trunk/LayoutTests/ChangeLog 2021-07-16 02:07:47 UTC (rev 279973)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2021-07-15  Jean-Yves Avenard  <jya@apple.com>
+
+        [MSE] sequence mode is broken if GPU Process is enabled
+        https://bugs.webkit.org/show_bug.cgi?id=227864
+        <rdar://problem/80445041>
+
+        Reviewed by Jer Noble.
+
+        Note: we had tests checking on the correctness of the operation; however it's
+        using a mock SourceBuffer which doesn't run in the GPU process. Doing bug 225367
+        should be a priority so we get better code coverage and such bugs don't skip
+        under the radar.
+        To get around this issue, we write a new test that uses a mp4 and a h264 video track.
+
+        * media/media-source/media-mp4-h264-sequence-mode-expected.txt: Added.
+        * media/media-source/media-mp4-h264-sequence-mode.html: Added.
+
</ins><span class="cx"> 2021-07-15  Chris Dumez  <cdumez@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Add initial support for BroadcastChannel behind a runtime flag
</span></span></pre></div>
<a id="trunkLayoutTestsmediamediasourcemediamp4h264sequencemodeexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/media/media-source/media-mp4-h264-sequence-mode-expected.txt (0 => 279973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-source/media-mp4-h264-sequence-mode-expected.txt                           (rev 0)
+++ trunk/LayoutTests/media/media-source/media-mp4-h264-sequence-mode-expected.txt      2021-07-16 02:07:47 UTC (rev 279973)
</span><span class="lines">@@ -0,0 +1,22 @@
</span><ins>+
+RUN(video.src = URL.createObjectURL(source))
+EVENT(sourceopen)
+Append the init segment
+RUN(sourceBuffer = source.addSourceBuffer(loader.type()))
+RUN(sourceBuffer.appendBuffer(loader.initSegment()))
+EVENT(update)
+EXPECTED (sourceBuffer.timestampOffset == '0') OK
+RUN(sourceBuffer.appendBuffer(loader.mediaSegment(1)))
+EVENT(update)
+EXPECTED (sourceBuffer.timestampOffset == '0') OK
+EXPECTED (sourceBuffer.buffered.length == '1') OK
+EXPECTED (sourceBuffer.buffered.start(0) == '1') OK
+EXPECTED (sourceBuffer.buffered.end(0) == '2') OK
+RUN(sourceBuffer.mode="sequence")
+RUN(sourceBuffer.appendBuffer(loader.mediaSegment(1)))
+EVENT(update)
+EXPECTED (sourceBuffer.timestampOffset == '1') OK
+EXPECTED (sourceBuffer.buffered.length == '1') OK
+EXPECTED (sourceBuffer.buffered.end(0) == '3') OK
+END OF TEST
+
</ins></span></pre></div>
<a id="trunkLayoutTestsmediamediasourcemediamp4h264sequencemodehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/media/media-source/media-mp4-h264-sequence-mode.html (0 => 279973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-source/media-mp4-h264-sequence-mode.html                           (rev 0)
+++ trunk/LayoutTests/media/media-source/media-mp4-h264-sequence-mode.html      2021-07-16 02:07:47 UTC (rev 279973)
</span><span class="lines">@@ -0,0 +1,65 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<head>
+    <title>media-mp4-h264-sequence-mode</title>
+    <script src="media-source-loader.js"></script>
+    <script src="../video-test.js"></script>
+    <script>
+    var loader;
+    var source;
+    var sourceBuffer;
+    var random;
+
+    function loaderPromise(loader) {
+        return new Promise((resolve, reject) => {
+            loader.onload = resolve;
+            loader.onerror = reject;
+        });
+    }
+
+    function randomNumber(min, max) {
+        return Math.floor(Math.random() * (max - min) + min);
+    }
+
+    window.addEventListener('load', async event => {
+        try {
+            findMediaElement();
+            loader = new MediaSourceLoader('content/test-fragmented-video-manifest.json');
+            await loaderPromise(loader);
+
+            source = new MediaSource();
+            run('video.src = URL.createObjectURL(source)');
+            await waitFor(source, 'sourceopen');
+            waitFor(video, 'error').then(failTest);
+
+            consoleWrite('Append the init segment');
+            run('sourceBuffer = source.addSourceBuffer(loader.type())');
+            run('sourceBuffer.appendBuffer(loader.initSegment())');
+            await waitFor(sourceBuffer, 'update');
+
+            testExpected('sourceBuffer.timestampOffset', '0');
+            run('sourceBuffer.appendBuffer(loader.mediaSegment(1))');
+            await waitFor(sourceBuffer, 'update');
+            testExpected('sourceBuffer.timestampOffset', '0');
+            testExpected('sourceBuffer.buffered.length', '1');
+            testExpected('sourceBuffer.buffered.start(0)', '1');
+            testExpected('sourceBuffer.buffered.end(0)', '2');
+
+            run('sourceBuffer.mode="sequence"');
+            run('sourceBuffer.appendBuffer(loader.mediaSegment(1))');
+            await waitFor(sourceBuffer, 'update');
+            testExpected('sourceBuffer.timestampOffset', '1');
+            testExpected('sourceBuffer.buffered.length', '1');
+            testExpected('sourceBuffer.buffered.end(0)', '3');
+
+            endTest();
+        } catch (e) {
+            failTest(`Caught exception: "${e}"`);
+        }
+    });
+    </script>
+</head>
+<body>
+    <video controls></video>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (279972 => 279973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2021-07-16 01:25:20 UTC (rev 279972)
+++ trunk/Source/WebCore/ChangeLog      2021-07-16 02:07:47 UTC (rev 279973)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2021-07-15  Jean-Yves Avenard  <jya@apple.com>
+
+        [MSE] sequence mode is broken if GPU Process is enabled
+        https://bugs.webkit.org/show_bug.cgi?id=227864
+        <rdar://problem/80445041>
+
+        Reviewed by Jer Noble.
+
+        When the source buffer's mode is set to sequence, the timestampOffset attribute
+        should be updated after each appendBuffer operation. However, when the GPU process
+        is enabled, the timestampOffset calculations are all done in the GPU process and
+        its result wasn't communicated back to the WebContent process leading its value
+        to always be 0 on read.
+        Fly-by fix: the timestamp offset calculation was incorrect, per spec
+        https://w3c.github.io/media-source/#sourcebuffer-coded-frame-processing
+        step 3.5.8.3.1 we read:
+        // Set timestampOffset equal to group start timestamp - presentation timestamp.
+        but the code did otherwise.
+
+        Test: media/media-source/media-mp4-h264-sequence-mode.html
+
+        * platform/graphics/SourceBufferPrivate.cpp:
+        (WebCore::SourceBufferPrivate::didReceiveSample): Offset m_timestampOffset by
+        the sample's presentation timestamp
+
</ins><span class="cx"> 2021-07-15  Chris Dumez  <cdumez@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Add initial support for BroadcastChannel behind a runtime flag
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsSourceBufferPrivatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.cpp (279972 => 279973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.cpp   2021-07-16 01:25:20 UTC (rev 279972)
+++ trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.cpp      2021-07-16 02:07:47 UTC (rev 279973)
</span><span class="lines">@@ -891,7 +891,7 @@
</span><span class="cx">         // 1.3 If mode equals "sequence" and group start timestamp is set, then run the following steps:
</span><span class="cx">         if (m_appendMode == SourceBufferAppendMode::Sequence && m_groupStartTimestamp.isValid()) {
</span><span class="cx">             // 1.3.1 Set timestampOffset equal to group start timestamp - presentation timestamp.
</span><del>-            m_timestampOffset = m_groupStartTimestamp;
</del><ins>+            m_timestampOffset = m_groupStartTimestamp - presentationTimestamp;
</ins><span class="cx"> 
</span><span class="cx">             for (auto& trackBuffer : m_trackBufferMap.values()) {
</span><span class="cx">                 trackBuffer.get().lastFrameTimescale = 0;
</span></span></pre></div>
<a id="trunkSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/ChangeLog (279972 => 279973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/ChangeLog    2021-07-16 01:25:20 UTC (rev 279972)
+++ trunk/Source/WebKit/ChangeLog       2021-07-16 02:07:47 UTC (rev 279973)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2021-07-15  Jean-Yves Avenard  <jya@apple.com>
+
+        [MSE] sequence mode is broken if GPU Process is enabled
+        https://bugs.webkit.org/show_bug.cgi?id=227864
+        <rdar://problem/80445041>
+
+        Reviewed by Jer Noble.
+
+         When the source buffer's mode is set to sequence, the timestampOffset attribute
+        should be updated after each appendBuffer operation. However, when the GPU process
+        is enabled, the timestampOffset calculations are all done in the GPU process and
+        its result wasn't communicated back to the WebContent process leading its value
+        to always be 0 on read.
+
+        * GPUProcess/media/RemoteSourceBufferProxy.cpp:
+        (WebKit::RemoteSourceBufferProxy::sourceBufferPrivateAppendComplete): Add value of
+        the potentially updated timestamp offset back to the content process.
+        * WebProcess/GPU/media/SourceBufferPrivateRemote.cpp:
+        (WebKit::SourceBufferPrivateRemote::sourceBufferPrivateAppendComplete):
+        * WebProcess/GPU/media/SourceBufferPrivateRemote.h:
+        * WebProcess/GPU/media/SourceBufferPrivateRemote.messages.in: Add extra timestampOffset
+        parameter.
+
</ins><span class="cx"> 2021-07-15  Chris Dumez  <cdumez@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Add initial support for BroadcastChannel behind a runtime flag
</span></span></pre></div>
<a id="trunkSourceWebKitGPUProcessmediaRemoteSourceBufferProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.cpp (279972 => 279973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.cpp 2021-07-16 01:25:20 UTC (rev 279972)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.cpp    2021-07-16 02:07:47 UTC (rev 279973)
</span><span class="lines">@@ -165,7 +165,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     auto buffered = m_sourceBufferPrivate->buffered()->ranges();
</span><del>-    m_connectionToWebProcess->connection().send(Messages::SourceBufferPrivateRemote::SourceBufferPrivateAppendComplete(appendResult, WTFMove(buffered), m_sourceBufferPrivate->totalTrackBufferSizeInBytes()), m_identifier);
</del><ins>+    m_connectionToWebProcess->connection().send(Messages::SourceBufferPrivateRemote::SourceBufferPrivateAppendComplete(appendResult, WTFMove(buffered), m_sourceBufferPrivate->totalTrackBufferSizeInBytes(), m_sourceBufferPrivate->timestampOffset()), m_identifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RemoteSourceBufferProxy::sourceBufferPrivateDidReceiveRenderingError(int64_t errorCode)
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessGPUmediaSourceBufferPrivateRemotecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp (279972 => 279973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp   2021-07-16 01:25:20 UTC (rev 279972)
+++ trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp      2021-07-16 02:07:47 UTC (rev 279973)
</span><span class="lines">@@ -414,12 +414,14 @@
</span><span class="cx">         m_client->sourceBufferPrivateAppendError(decodeError);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SourceBufferPrivateRemote::sourceBufferPrivateAppendComplete(SourceBufferPrivateClient::AppendResult appendResult, const PlatformTimeRanges& buffered, uint64_t totalTrackBufferSizeInBytes)
</del><ins>+void SourceBufferPrivateRemote::sourceBufferPrivateAppendComplete(SourceBufferPrivateClient::AppendResult appendResult, const PlatformTimeRanges& buffered, uint64_t totalTrackBufferSizeInBytes, const MediaTime& timestampOffset)
</ins><span class="cx"> {
</span><span class="cx">     setBufferedRanges(buffered);
</span><span class="cx">     m_totalTrackBufferSizeInBytes = totalTrackBufferSizeInBytes;
</span><del>-    if (m_client)
</del><ins>+    if (m_client) {
+        setTimestampOffset(timestampOffset);
</ins><span class="cx">         m_client->sourceBufferPrivateAppendComplete(appendResult);
</span><ins>+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SourceBufferPrivateRemote::sourceBufferPrivateHighestPresentationTimestampChanged(const MediaTime& timestamp)
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessGPUmediaSourceBufferPrivateRemoteh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.h (279972 => 279973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.h     2021-07-16 01:25:20 UTC (rev 279972)
+++ trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.h        2021-07-16 02:07:47 UTC (rev 279973)
</span><span class="lines">@@ -111,7 +111,7 @@
</span><span class="cx">     void sourceBufferPrivateDidReceiveInitializationSegment(InitializationSegmentInfo&&, CompletionHandler<void()>&&);
</span><span class="cx">     void sourceBufferPrivateStreamEndedWithDecodeError();
</span><span class="cx">     void sourceBufferPrivateAppendError(bool decodeError);
</span><del>-    void sourceBufferPrivateAppendComplete(WebCore::SourceBufferPrivateClient::AppendResult, const WebCore::PlatformTimeRanges& buffered, uint64_t totalTrackBufferSizeInBytes);
</del><ins>+    void sourceBufferPrivateAppendComplete(WebCore::SourceBufferPrivateClient::AppendResult, const WebCore::PlatformTimeRanges& buffered, uint64_t totalTrackBufferSizeInBytes, const MediaTime& timestampOffset);
</ins><span class="cx">     void sourceBufferPrivateHighestPresentationTimestampChanged(const MediaTime&);
</span><span class="cx">     void sourceBufferPrivateDurationChanged(const MediaTime&);
</span><span class="cx">     void sourceBufferPrivateDidParseSample(double sampleDuration);
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessGPUmediaSourceBufferPrivateRemotemessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.messages.in (279972 => 279973)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.messages.in   2021-07-16 01:25:20 UTC (rev 279972)
+++ trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.messages.in      2021-07-16 02:07:47 UTC (rev 279973)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx">     SourceBufferPrivateDidReceiveInitializationSegment(struct WebKit::InitializationSegmentInfo segmentConfiguration) -> () Async
</span><span class="cx">     SourceBufferPrivateStreamEndedWithDecodeError()
</span><span class="cx">     SourceBufferPrivateAppendError(bool decodeError)
</span><del>-    SourceBufferPrivateAppendComplete(WebCore::SourceBufferPrivateClient::AppendResult appendResult, WebCore::PlatformTimeRanges buffered, uint64_t totalTrackBufferSizeInBytes)
</del><ins>+    SourceBufferPrivateAppendComplete(WebCore::SourceBufferPrivateClient::AppendResult appendResult, WebCore::PlatformTimeRanges buffered, uint64_t totalTrackBufferSizeInBytes, MediaTime timeStampOffset)
</ins><span class="cx">     SourceBufferPrivateHighestPresentationTimestampChanged(MediaTime timestamp)
</span><span class="cx">     SourceBufferPrivateDurationChanged(MediaTime duration)
</span><span class="cx">     SourceBufferPrivateDidParseSample(double sampleDuration)
</span></span></pre>
</div>
</div>

</body>
</html>