Title: [171215] trunk/Source/WebCore
Revision
171215
Author
[email protected]
Date
2014-07-17 23:16:56 -0700 (Thu, 17 Jul 2014)

Log Message

[MSE] Re-enqueue after a removeCodedFrames() only if the removed frames overlap what may have possibly been enqueued but undisplayed.
https://bugs.webkit.org/show_bug.cgi?id=135039

Reviewed by Eric Carlson.

When a client calls removeCodedFrames(), we must re-enqueue those ranges if the removed samples overlap with
enqueued but possibly un-displayed samples. Otherwise, replacement samples may lead to decode errors as those
new samples dependencies are not met. But if we re-enqueue too frequently, this may cause subtle but noticible
display timing glitches, so only re-enqueue when removeCodedFrames have a possiblity of removing enqueued, but
not yet displayed samples.

* Modules/mediasource/SourceBuffer.cpp:
(WebCore::SourceBuffer::removeCodedFrames):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (171214 => 171215)


--- trunk/Source/WebCore/ChangeLog	2014-07-18 05:55:26 UTC (rev 171214)
+++ trunk/Source/WebCore/ChangeLog	2014-07-18 06:16:56 UTC (rev 171215)
@@ -1,3 +1,19 @@
+2014-07-17  Jer Noble  <[email protected]>
+
+        [MSE] Re-enqueue after a removeCodedFrames() only if the removed frames overlap what may have possibly been enqueued but undisplayed.
+        https://bugs.webkit.org/show_bug.cgi?id=135039
+
+        Reviewed by Eric Carlson.
+
+        When a client calls removeCodedFrames(), we must re-enqueue those ranges if the removed samples overlap with
+        enqueued but possibly un-displayed samples. Otherwise, replacement samples may lead to decode errors as those
+        new samples dependencies are not met. But if we re-enqueue too frequently, this may cause subtle but noticible
+        display timing glitches, so only re-enqueue when removeCodedFrames have a possiblity of removing enqueued, but
+        not yet displayed samples.
+
+        * Modules/mediasource/SourceBuffer.cpp:
+        (WebCore::SourceBuffer::removeCodedFrames):
+
 2014-07-17  David Kilzer  <[email protected]>
 
         SECTORDER_FLAGS should be defined in target's xcconfig file, not Base.xcconfig

Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (171214 => 171215)


--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2014-07-18 05:55:26 UTC (rev 171214)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2014-07-18 06:16:56 UTC (rev 171215)
@@ -576,6 +576,13 @@
             erasedRanges->add(startTime, endTime);
         }
 
+        // Only force the TrackBuffer to re-enqueue if the removed ranges overlap with enqueued and possibly
+        // not yet displayed samples.
+        PlatformTimeRanges possiblyEnqueuedRanges(currentMediaTime, trackBuffer.lastEnqueuedPresentationTime);
+        possiblyEnqueuedRanges.intersectWith(erasedRanges->ranges());
+        if (possiblyEnqueuedRanges.length())
+            trackBuffer.needsReenqueueing = true;
+
         erasedRanges->invert();
         m_buffered->intersectWith(*erasedRanges);
 
@@ -584,8 +591,6 @@
         // the HTMLMediaElement.readyState attribute to HAVE_METADATA and stall playback.
         if (m_active && currentMediaTime >= start && currentMediaTime < end && m_private->readyState() > MediaPlayer::HaveMetadata)
             m_private->setReadyState(MediaPlayer::HaveMetadata);
-
-        trackBuffer.needsReenqueueing = true;
     }
 
     // 4. If buffer full flag equals true and this object is ready to accept more bytes, then set the buffer full flag to false.
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to