<!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>[170049] 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/170049">170049</a></dd>
<dt>Author</dt> <dd>jer.noble@apple.com</dd>
<dt>Date</dt> <dd>2014-06-17 00:43:53 -0700 (Tue, 17 Jun 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>[MSE] Overwritten samples are removed from buffered ranges using decode times; added samples using presentation times
https://bugs.webkit.org/show_bug.cgi?id=133959
Reviewed by Eric Carlson.
Source/WebCore:
Test: media/media-source/media-source-overlapping-append-buffered.html
Explicitly call presentationTime() on removed samples, rather than implicitly asking for the iterator's "first"
member. When iterating over samples, "first" can either be presentation time, or decode time, depending on which
iteration method is called. In the case of removing samples, this was using the decode time incorrectly.
* Modules/mediasource/SourceBuffer.cpp:
(WebCore::SourceBuffer::sourceBufferPrivateDidReceiveSample):
LayoutTests:
* media/media-source/media-source-overlapping-append-buffered-expected.txt: Added.
* media/media-source/media-source-overlapping-append-buffered.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="#trunkSourceWebCoreModulesmediasourceSourceBuffercpp">trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsmediamediasourcemediasourceoverlappingappendbufferedexpectedtxt">trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediamediasourcemediasourceoverlappingappendbufferedhtml">trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered.html</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (170048 => 170049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-06-17 07:42:32 UTC (rev 170048)
+++ trunk/LayoutTests/ChangeLog        2014-06-17 07:43:53 UTC (rev 170049)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2014-06-17 Jer Noble <jer.noble@apple.com>
+
+ [MSE] Overwritten samples are removed from buffered ranges using decode times; added samples using presentation times
+ https://bugs.webkit.org/show_bug.cgi?id=133959
+
+ Reviewed by Eric Carlson.
+
+ * media/media-source/media-source-overlapping-append-buffered-expected.txt: Added.
+ * media/media-source/media-source-overlapping-append-buffered.html: Added.
+
</ins><span class="cx"> 2014-06-16 Mihnea Ovidenie <mihnea@adobe.com>
</span><span class="cx">
</span><span class="cx"> [CSS Regions] Move the overflow tests to a separate folder
</span></span></pre></div>
<a id="trunkLayoutTestsmediamediasourcemediasourceoverlappingappendbufferedexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered-expected.txt (0 => 170049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered-expected.txt         (rev 0)
+++ trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered-expected.txt        2014-06-17 07:43:53 UTC (rev 170049)
</span><span class="lines">@@ -0,0 +1,15 @@
</span><ins>+
+EXPECTED (source.readyState == 'closed') OK
+EVENT(sourceopen)
+RUN(sourceBuffer = source.addSourceBuffer("video/mock; codecs=mock"))
+RUN(sourceBuffer.appendBuffer(initSegment))
+EVENT(updateend)
+RUN(sourceBuffer.appendBuffer(samples))
+EVENT(updateend)
+RUN(sourceBuffer.appendBuffer(samples))
+EVENT(updateend)
+EXPECTED (video.buffered.length == '1') OK
+EXPECTED (video.buffered.start(0).toFixed(3) == '1') OK
+EXPECTED (video.buffered.end(0).toFixed(3) == '7') OK
+END OF TEST
+
</ins></span></pre></div>
<a id="trunkLayoutTestsmediamediasourcemediasourceoverlappingappendbufferedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered.html (0 => 170049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered.html         (rev 0)
+++ trunk/LayoutTests/media/media-source/media-source-overlapping-append-buffered.html        2014-06-17 07:43:53 UTC (rev 170049)
</span><span class="lines">@@ -0,0 +1,74 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<head>
+ <title>mock-media-source</title>
+ <script src="mock-media-source.js"></script>
+ <script src="../video-test.js"></script>
+ <script>
+ var source;
+ var sourceBuffer;
+ var initSegment;
+ var samples;
+
+ if (window.internals)
+ internals.initializeMockMediaSource();
+
+ function runTest() {
+ findMediaElement();
+
+ source = new MediaSource();
+ testExpected('source.readyState', 'closed');
+
+ waitForEventOn(source, 'sourceopen', sourceOpen);
+ var videoSource = document.createElement('source');
+ videoSource.type = 'video/mock; codecs=mock';
+ videoSource.src = URL.createObjectURL(source);
+ video.appendChild(videoSource);
+ }
+
+ function sourceOpen() {
+ run('sourceBuffer = source.addSourceBuffer("video/mock; codecs=mock")');
+ waitForEventOn(sourceBuffer, 'updateend', loadSamples, false, true);
+ initSegment = makeAInit(8, [makeATrack(1, 'mock', TRACK_KIND.VIDEO)]);
+ run('sourceBuffer.appendBuffer(initSegment)');
+ }
+
+ function loadSamples() {
+ samples = concatenateSamples([
+ makeASample(1, 0, 1, 1, SAMPLE_FLAG.SYNC),
+ makeASample(2, 1, 1, 1, SAMPLE_FLAG.NONE),
+ makeASample(3, 2, 1, 1, SAMPLE_FLAG.NONE),
+ makeASample(4, 3, 1, 1, SAMPLE_FLAG.SYNC),
+ makeASample(6, 4, 1, 1, SAMPLE_FLAG.NONE),
+ makeASample(5, 5, 1, 1, SAMPLE_FLAG.NONE),
+ ]);
+ waitForEventOn(sourceBuffer, 'updateend', loadMoreSamples, false, true);
+ run('sourceBuffer.appendBuffer(samples)');
+ }
+
+ function loadMoreSamples() {
+ samples = concatenateSamples([
+ makeASample(1, 0, 1, 1, SAMPLE_FLAG.SYNC),
+ makeASample(2, 1, 1, 1, SAMPLE_FLAG.NONE),
+ makeASample(3, 2, 1, 1, SAMPLE_FLAG.NONE),
+ makeASample(4, 3, 1, 1, SAMPLE_FLAG.SYNC),
+ makeASample(6, 4, 1, 1, SAMPLE_FLAG.NONE),
+ makeASample(5, 5, 1, 1, SAMPLE_FLAG.NONE),
+ ]);
+ waitForEventOn(sourceBuffer, 'updateend', loadComplete, false, true);
+ run('sourceBuffer.appendBuffer(samples)');
+ }
+
+ function loadComplete() {
+ testExpected('video.buffered.length', 1);
+ testExpected('video.buffered.start(0).toFixed(3)', 1);
+ testExpected('video.buffered.end(0).toFixed(3)', 7);
+ endTest();
+ }
+
+ </script>
+</head>
+<body onload="runTest()">
+ <video></video>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (170048 => 170049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-06-17 07:42:32 UTC (rev 170048)
+++ trunk/Source/WebCore/ChangeLog        2014-06-17 07:43:53 UTC (rev 170049)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2014-06-17 Jer Noble <jer.noble@apple.com>
+
+ [MSE] Overwritten samples are removed from buffered ranges using decode times; added samples using presentation times
+ https://bugs.webkit.org/show_bug.cgi?id=133959
+
+ Reviewed by Eric Carlson.
+
+ Test: media/media-source/media-source-overlapping-append-buffered.html
+
+ Explicitly call presentationTime() on removed samples, rather than implicitly asking for the iterator's "first"
+ member. When iterating over samples, "first" can either be presentation time, or decode time, depending on which
+ iteration method is called. In the case of removing samples, this was using the decode time incorrectly.
+
+ * Modules/mediasource/SourceBuffer.cpp:
+ (WebCore::SourceBuffer::sourceBufferPrivateDidReceiveSample):
+
</ins><span class="cx"> 2014-06-16 Mihnea Ovidenie <mihnea@adobe.com>
</span><span class="cx">
</span><span class="cx"> [CSSRegions] Region with border radius and overflow:hidden does not clip content
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediasourceSourceBuffercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (170048 => 170049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp        2014-06-17 07:42:32 UTC (rev 170048)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp        2014-06-17 07:43:53 UTC (rev 170049)
</span><span class="lines">@@ -1158,16 +1158,16 @@
</span><span class="cx">
</span><span class="cx"> RefPtr<TimeRanges> erasedRanges = TimeRanges::create();
</span><span class="cx"> for (auto erasedIt = erasedSamples.begin(), end = erasedSamples.end(); erasedIt != end; ++erasedIt) {
</span><del>- double startTime = erasedIt->first.toDouble();
- double endTime = ((erasedIt->first + erasedIt->second->duration()) + microsecond).toDouble();
- erasedRanges->add(startTime, endTime);
</del><ins>+ MediaTime startTime = erasedIt->second->presentationTime();
+ MediaTime endTime = startTime + erasedIt->second->duration() + microsecond;
+ erasedRanges->add(startTime.toDouble(), endTime.toDouble());
</ins><span class="cx"> trackBuffer.samples.removeSample(erasedIt->second.get());
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> for (auto dependentIt = dependentSamples.begin(), end = dependentSamples.end(); dependentIt != end; ++dependentIt) {
</span><del>- double startTime = dependentIt->first.toDouble();
- double endTime = ((dependentIt->first + dependentIt->second->duration()) + microsecond).toDouble();
- erasedRanges->add(startTime, endTime);
</del><ins>+ MediaTime startTime = dependentIt->second->presentationTime();
+ MediaTime endTime = startTime + dependentIt->second->duration() + microsecond;
+ erasedRanges->add(startTime.toDouble(), endTime.toDouble());
</ins><span class="cx"> trackBuffer.samples.removeSample(dependentIt->second.get());
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre>
</div>
</div>
</body>
</html>