| Index: content/renderer/media/websourcebuffer_impl.cc
|
| diff --git a/content/renderer/media/websourcebuffer_impl.cc b/content/renderer/media/websourcebuffer_impl.cc
|
| index a90f478327736fe1908ce711113057aa60ec0ee7..0863b65e29afd3403ec82cae0557eec789ed7879 100644
|
| --- a/content/renderer/media/websourcebuffer_impl.cc
|
| +++ b/content/renderer/media/websourcebuffer_impl.cc
|
| @@ -30,7 +30,8 @@ static base::TimeDelta DoubleToTimeDelta(double time) {
|
| WebSourceBufferImpl::WebSourceBufferImpl(
|
| const std::string& id, media::ChunkDemuxer* demuxer)
|
| : id_(id),
|
| - demuxer_(demuxer) {
|
| + demuxer_(demuxer),
|
| + append_window_end_(media::kInfiniteDuration()) {
|
| DCHECK(demuxer_);
|
| }
|
|
|
| @@ -39,16 +40,20 @@ WebSourceBufferImpl::~WebSourceBufferImpl() {
|
| }
|
|
|
| bool WebSourceBufferImpl::setMode(WebSourceBuffer::AppendMode mode) {
|
| - bool sequence_mode = false;
|
| + if (demuxer_->IsParsingMediaSegment(id_))
|
| + return false;
|
| +
|
| switch (mode) {
|
| case WebSourceBuffer::AppendModeSegments:
|
| - break;
|
| + demuxer_->SetSequenceMode(id_, false);
|
| + return true;
|
| case WebSourceBuffer::AppendModeSequence:
|
| - sequence_mode = true;
|
| - break;
|
| + demuxer_->SetSequenceMode(id_, true);
|
| + return true;
|
| }
|
|
|
| - return demuxer_->SetSequenceMode(id_, sequence_mode);
|
| + NOTREACHED();
|
| + return false;
|
| }
|
|
|
| blink::WebTimeRanges WebSourceBufferImpl::buffered() {
|
| @@ -65,7 +70,18 @@ void WebSourceBufferImpl::append(
|
| const unsigned char* data,
|
| unsigned length,
|
| double* timestamp_offset) {
|
| - demuxer_->AppendData(id_, data, length, timestamp_offset);
|
| + base::TimeDelta old_offset = timestamp_offset_;
|
| + demuxer_->AppendData(id_, data, length,
|
| + append_window_start_, append_window_end_,
|
| + ×tamp_offset_);
|
| +
|
| + // Coded frame processing may update the timestamp offset. If the caller
|
| + // provides a non-NULL |timestamp_offset| and frame processing changes the
|
| + // timestamp offset, report the new offset to the caller. Do not update the
|
| + // caller's offset otherwise, to preserve any pre-existing value that may have
|
| + // more than microsecond precision.
|
| + if (timestamp_offset && old_offset != timestamp_offset_)
|
| + *timestamp_offset = timestamp_offset_.InSecondsF();
|
| }
|
|
|
| void WebSourceBufferImpl::abort() {
|
| @@ -77,17 +93,19 @@ void WebSourceBufferImpl::remove(double start, double end) {
|
| }
|
|
|
| bool WebSourceBufferImpl::setTimestampOffset(double offset) {
|
| - base::TimeDelta time_offset = base::TimeDelta::FromMicroseconds(
|
| - offset * base::Time::kMicrosecondsPerSecond);
|
| - return demuxer_->SetTimestampOffset(id_, time_offset);
|
| + if (demuxer_->IsParsingMediaSegment(id_))
|
| + return false;
|
| +
|
| + timestamp_offset_ = DoubleToTimeDelta(offset);
|
| + return true;
|
| }
|
|
|
| void WebSourceBufferImpl::setAppendWindowStart(double start) {
|
| - demuxer_->SetAppendWindowStart(id_, DoubleToTimeDelta(start));
|
| + append_window_start_ = DoubleToTimeDelta(start);
|
| }
|
|
|
| void WebSourceBufferImpl::setAppendWindowEnd(double end) {
|
| - demuxer_->SetAppendWindowEnd(id_, DoubleToTimeDelta(end));
|
| + append_window_end_ = DoubleToTimeDelta(end);
|
| }
|
|
|
| void WebSourceBufferImpl::removedFromMediaSource() {
|
|
|