Changeset 171215 in webkit


Ignore:
Timestamp:
Jul 17, 2014 11:16:56 PM (10 years ago)
Author:
jer.noble@apple.com
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):

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r171212 r171215  
     12014-07-17  Jer Noble  <jer.noble@apple.com>
     2
     3        [MSE] Re-enqueue after a removeCodedFrames() only if the removed frames overlap what may have possibly been enqueued but undisplayed.
     4        https://bugs.webkit.org/show_bug.cgi?id=135039
     5
     6        Reviewed by Eric Carlson.
     7
     8        When a client calls removeCodedFrames(), we must re-enqueue those ranges if the removed samples overlap with
     9        enqueued but possibly un-displayed samples. Otherwise, replacement samples may lead to decode errors as those
     10        new samples dependencies are not met. But if we re-enqueue too frequently, this may cause subtle but noticible
     11        display timing glitches, so only re-enqueue when removeCodedFrames have a possiblity of removing enqueued, but
     12        not yet displayed samples.
     13
     14        * Modules/mediasource/SourceBuffer.cpp:
     15        (WebCore::SourceBuffer::removeCodedFrames):
     16
    1172014-07-17  David Kilzer  <ddkilzer@apple.com>
    218
  • trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp

    r171033 r171215  
    577577        }
    578578
     579        // Only force the TrackBuffer to re-enqueue if the removed ranges overlap with enqueued and possibly
     580        // not yet displayed samples.
     581        PlatformTimeRanges possiblyEnqueuedRanges(currentMediaTime, trackBuffer.lastEnqueuedPresentationTime);
     582        possiblyEnqueuedRanges.intersectWith(erasedRanges->ranges());
     583        if (possiblyEnqueuedRanges.length())
     584            trackBuffer.needsReenqueueing = true;
     585
    579586        erasedRanges->invert();
    580587        m_buffered->intersectWith(*erasedRanges);
     
    585592        if (m_active && currentMediaTime >= start && currentMediaTime < end && m_private->readyState() > MediaPlayer::HaveMetadata)
    586593            m_private->setReadyState(MediaPlayer::HaveMetadata);
    587 
    588         trackBuffer.needsReenqueueing = true;
    589594    }
    590595
Note: See TracChangeset for help on using the changeset viewer.