| Index: media/base/pipeline_impl.cc
|
| diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
|
| index d7f153d5b009b862ecf71aaf161085fe597f5043..ec0f7911ab559363637fef76153df11523310132 100644
|
| --- a/media/base/pipeline_impl.cc
|
| +++ b/media/base/pipeline_impl.cc
|
| @@ -221,11 +221,13 @@ base::TimeDelta PipelineImpl::GetCurrentTime() const {
|
| return elapsed;
|
| }
|
|
|
| -
|
| base::TimeDelta PipelineImpl::GetBufferedTime() {
|
| - DCHECK(buffered_bytes_ >= current_bytes_);
|
| AutoLock auto_lock(lock_);
|
|
|
| + // If media is fully loaded, then return duration.
|
| + if (loaded_)
|
| + return duration_;
|
| +
|
| // If buffered time was set, we report that value directly.
|
| if (buffered_time_.ToInternalValue() > 0)
|
| return buffered_time_;
|
| @@ -238,15 +240,18 @@ base::TimeDelta PipelineImpl::GetBufferedTime() {
|
| double current_time = static_cast<double>(current_bytes_) / total_bytes_ *
|
| duration_.InMilliseconds();
|
| double rate = current_time / current_bytes_;
|
| - double buffered_time = rate * (buffered_bytes_ - current_bytes_) +
|
| - current_time;
|
| + DCHECK_GE(buffered_bytes_, current_bytes_);
|
| + base::TimeDelta buffered_time = base::TimeDelta::FromMilliseconds(
|
| + static_cast<int64>(rate * (buffered_bytes_ - current_bytes_) +
|
| + current_time));
|
| +
|
| + // Cap approximated buffered time at the length of the video.
|
| + buffered_time = std::min(buffered_time, duration_);
|
|
|
| // Only print the max buffered time for smooth buffering.
|
| - if (buffered_time > max_buffered_time_)
|
| - max_buffered_time_ = buffered_time;
|
| + max_buffered_time_ = std::max(buffered_time, max_buffered_time_);
|
|
|
| - return base::TimeDelta::FromMilliseconds(
|
| - static_cast<int64>(max_buffered_time_));
|
| + return max_buffered_time_;
|
| }
|
|
|
| base::TimeDelta PipelineImpl::GetMediaDuration() const {
|
|
|