Chromium Code Reviews| Index: media/filters/chunk_demuxer.cc | 
| diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc | 
| index b1c238940d38405c4e079fb0d60c8cefbf3b41f0..da41762f52640b5d5a23218676d4e0c40fbb3e9f 100644 | 
| --- a/media/filters/chunk_demuxer.cc | 
| +++ b/media/filters/chunk_demuxer.cc | 
| @@ -199,7 +199,9 @@ class ChunkDemuxerStream : public DemuxerStream { | 
| virtual void EnableBitstreamConverter() OVERRIDE; | 
| virtual const AudioDecoderConfig& audio_decoder_config() OVERRIDE; | 
| virtual const VideoDecoderConfig& video_decoder_config() OVERRIDE; | 
| - virtual Ranges<TimeDelta> GetBufferedRanges() OVERRIDE; | 
| + | 
| + // Returns the range of buffered data in this stream, capped at |duration|. | 
| + Ranges<TimeDelta> GetBufferedRanges(base::TimeDelta duration) const; | 
| 
 
acolwell GONE FROM CHROMIUM
2012/08/01 17:09:45
nit: perhaps move this just below Append() so it's
 
vrk (LEFT CHROMIUM)
2012/08/02 18:23:00
Done.
 
 | 
| protected: | 
| virtual ~ChunkDemuxerStream(); | 
| @@ -318,9 +320,14 @@ bool ChunkDemuxerStream::Append(const StreamParser::BufferQueue& buffers) { | 
| return true; | 
| } | 
| -Ranges<TimeDelta> ChunkDemuxerStream::GetBufferedRanges() { | 
| +Ranges<TimeDelta> ChunkDemuxerStream::GetBufferedRanges( | 
| + base::TimeDelta duration) const { | 
| base::AutoLock auto_lock(lock_); | 
| - return stream_->GetBufferedTime(); | 
| + Ranges<TimeDelta> range = stream_->GetBufferedTime(); | 
| + | 
| + Ranges<TimeDelta> valid_time_range; | 
| + valid_time_range.Add(base::TimeDelta(), duration); | 
| 
 
acolwell GONE FROM CHROMIUM
2012/08/01 17:09:45
I think base::TimeDelta() needs to be start_time_
 
 | 
| + return range.IntersectionWith(valid_time_range); | 
| 
 
acolwell GONE FROM CHROMIUM
2012/08/01 17:09:45
\o/ look who's being tricky. I like it, but this d
 
vrk (LEFT CHROMIUM)
2012/08/02 18:23:00
haha glad you like! :) commented!
 
 | 
| } | 
| bool ChunkDemuxerStream::UpdateAudioConfig(const AudioDecoderConfig& config) { | 
| @@ -671,12 +678,12 @@ Ranges<TimeDelta> ChunkDemuxer::GetBufferedRanges(const std::string& id) const { | 
| if (id == source_id_audio_ && id != source_id_video_) { | 
| // Only include ranges that have been buffered in |audio_| | 
| - return audio_ ? audio_->GetBufferedRanges() : Ranges<TimeDelta>(); | 
| + return audio_ ? audio_->GetBufferedRanges(duration_) : Ranges<TimeDelta>(); | 
| } | 
| if (id != source_id_audio_ && id == source_id_video_) { | 
| // Only include ranges that have been buffered in |video_| | 
| - return video_ ? video_->GetBufferedRanges() : Ranges<TimeDelta>(); | 
| + return video_ ? video_->GetBufferedRanges(duration_) : Ranges<TimeDelta>(); | 
| } | 
| return ComputeIntersection(); | 
| @@ -689,8 +696,8 @@ Ranges<TimeDelta> ChunkDemuxer::ComputeIntersection() const { | 
| return Ranges<TimeDelta>(); | 
| // Include ranges that have been buffered in both |audio_| and |video_|. | 
| - Ranges<TimeDelta> audio_ranges = audio_->GetBufferedRanges(); | 
| - Ranges<TimeDelta> video_ranges = video_->GetBufferedRanges(); | 
| + Ranges<TimeDelta> audio_ranges = audio_->GetBufferedRanges(duration_); | 
| + Ranges<TimeDelta> video_ranges = video_->GetBufferedRanges(duration_); | 
| Ranges<TimeDelta> result = audio_ranges.IntersectionWith(video_ranges); | 
| if (state_ == ENDED && result.size() > 0) { | 
| @@ -763,13 +770,7 @@ bool ChunkDemuxer::AppendData(const std::string& id, | 
| std::swap(cb, seek_cb_); | 
| } | 
| - if (audio_ && !video_) { | 
| - ranges = audio_->GetBufferedRanges(); | 
| - } else if (!audio_ && video_) { | 
| - ranges = video_->GetBufferedRanges(); | 
| - } else { | 
| - ranges = ComputeIntersection(); | 
| - } | 
| + ranges = GetBufferedRanges(); | 
| } | 
| for (size_t i = 0; i < ranges.size(); ++i) | 
| @@ -825,10 +826,12 @@ bool ChunkDemuxer::EndOfStream(PipelineStatus status) { | 
| if (video_) | 
| video_->EndOfStream(); | 
| - if (status != PIPELINE_OK) | 
| + if (status != PIPELINE_OK) { | 
| ReportError_Locked(status); | 
| - else | 
| + } else { | 
| ChangeState_Locked(ENDED); | 
| + DecreaseDurationIfNecessary(); | 
| + } | 
| return true; | 
| } | 
| @@ -1121,7 +1124,7 @@ void ChunkDemuxer::IncreaseDurationIfNecessary( | 
| if (buffers.back()->GetTimestamp() <= duration_) | 
| return; | 
| - Ranges<TimeDelta> ranges = stream->GetBufferedRanges(); | 
| + Ranges<TimeDelta> ranges = stream->GetBufferedRanges(kInfiniteDuration()); | 
| DCHECK_GT(ranges.size(), 0u); | 
| base::TimeDelta last_timestamp_buffered = ranges.end(ranges.size() - 1); | 
| @@ -1129,4 +1132,22 @@ void ChunkDemuxer::IncreaseDurationIfNecessary( | 
| UpdateDuration(last_timestamp_buffered); | 
| } | 
| +void ChunkDemuxer::DecreaseDurationIfNecessary() { | 
| + Ranges<TimeDelta> ranges = GetBufferedRanges(); | 
| + if (ranges.size() == 0u) | 
| + return; | 
| + | 
| + base::TimeDelta last_timestamp_buffered = ranges.end(ranges.size() - 1); | 
| + if (last_timestamp_buffered < duration_) | 
| + UpdateDuration(last_timestamp_buffered); | 
| +} | 
| + | 
| +Ranges<TimeDelta> ChunkDemuxer::GetBufferedRanges() const { | 
| 
 
vrk (LEFT CHROMIUM)
2012/08/01 00:10:06
This CL adds this guy back again; if it's still ov
 
acolwell GONE FROM CHROMIUM
2012/08/01 17:09:45
No this is fine here. My original complaint was it
 
vrk (LEFT CHROMIUM)
2012/08/02 18:23:00
SG!
 
 | 
| + if (audio_ && !video_) | 
| + return audio_->GetBufferedRanges(duration_); | 
| + else if (!audio_ && video_) | 
| + return video_->GetBufferedRanges(duration_); | 
| + return ComputeIntersection(); | 
| +} | 
| + | 
| } // namespace media |