Index: chromecast/media/cma/base/buffering_state.cc |
diff --git a/chromecast/media/cma/base/buffering_state.cc b/chromecast/media/cma/base/buffering_state.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2366aa075798190404b9441c39df8734bd084a9f |
--- /dev/null |
+++ b/chromecast/media/cma/base/buffering_state.cc |
@@ -0,0 +1,126 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chromecast/media/cma/base/buffering_state.h" |
+ |
+#include <sstream> |
+ |
+#include "base/logging.h" |
+#include "media/base/buffers.h" |
+ |
+namespace media { |
+namespace cma { |
+ |
+BufferingConfig::BufferingConfig( |
+ base::TimeDelta low_level_threshold, |
+ base::TimeDelta high_level_threshold) |
+ : low_level_threshold_(low_level_threshold), |
+ high_level_threshold_(high_level_threshold) { |
+} |
+ |
+BufferingConfig::~BufferingConfig() { |
+} |
+ |
+ |
+BufferingState::BufferingState( |
+ const scoped_refptr<BufferingConfig>& config, |
+ const base::Closure& state_changed_cb, |
+ const HighLevelBufferCb& high_level_buffer_cb) |
+ : config_(config), |
+ state_changed_cb_(state_changed_cb), |
+ high_level_buffer_cb_(high_level_buffer_cb), |
+ state_(kLowLevel), |
+ media_time_(kNoTimestamp()), |
+ max_rendering_time_(kNoTimestamp()), |
+ buffered_time_(kNoTimestamp()) { |
+} |
+ |
+BufferingState::~BufferingState() { |
+} |
+ |
+void BufferingState::OnConfigChanged() { |
+ state_ = GetBufferLevelState(); |
+} |
+ |
+void BufferingState::SetMediaTime(base::TimeDelta media_time) { |
+ media_time_ = media_time; |
+ switch (state_) { |
+ case kLowLevel: |
+ case kMediumLevel: |
+ case kHighLevel: |
+ UpdateState(GetBufferLevelState()); |
+ break; |
+ case kEosReached: |
+ break; |
+ } |
+} |
+ |
+void BufferingState::SetMaxRenderingTime(base::TimeDelta max_rendering_time) { |
+ max_rendering_time_ = max_rendering_time; |
+} |
+ |
+base::TimeDelta BufferingState::GetMaxRenderingTime() const { |
+ return max_rendering_time_; |
+} |
+ |
+void BufferingState::SetBufferedTime(base::TimeDelta buffered_time) { |
+ buffered_time_ = buffered_time; |
+ switch (state_) { |
+ case kLowLevel: |
+ case kMediumLevel: |
+ case kHighLevel: |
+ UpdateState(GetBufferLevelState()); |
+ break; |
+ case kEosReached: |
+ break; |
+ } |
+} |
+ |
+void BufferingState::NotifyEos() { |
+ UpdateState(kEosReached); |
+} |
+ |
+void BufferingState::NotifyMaxCapacity(base::TimeDelta buffered_time) { |
+ if (media_time_ == kNoTimestamp() || buffered_time == kNoTimestamp()) { |
+ LOG(WARNING) << "Max capacity with no timestamp"; |
+ return; |
+ } |
+ base::TimeDelta buffer_duration = buffered_time - media_time_; |
+ if (buffer_duration < config_->high_level()) |
+ high_level_buffer_cb_.Run(buffer_duration); |
+} |
+ |
+std::string BufferingState::ToString() const { |
+ std::ostringstream s; |
+ s << "state=" << state_ |
+ << " media_time_ms=" << media_time_.InMilliseconds() |
+ << " buffered_time_ms=" << buffered_time_.InMilliseconds() |
+ << " low_level_ms=" << config_->low_level().InMilliseconds() |
+ << " high_level_ms=" << config_->high_level().InMilliseconds(); |
+ return s.str(); |
+} |
+ |
+BufferingState::State BufferingState::GetBufferLevelState() const { |
+ if (media_time_ == kNoTimestamp() || buffered_time_ == kNoTimestamp()) |
+ return kLowLevel; |
+ |
+ base::TimeDelta buffer_duration = buffered_time_ - media_time_; |
+ if (buffer_duration < config_->low_level()) |
+ return kLowLevel; |
+ if (buffer_duration >= config_->high_level()) |
+ return kHighLevel; |
+ return kMediumLevel; |
+} |
+ |
+void BufferingState::UpdateState(State new_state) { |
+ if (new_state == state_) |
+ return; |
+ |
+ state_ = new_state; |
+ if (!state_changed_cb_.is_null()) |
+ state_changed_cb_.Run(); |
+} |
+ |
+} // namespace cma |
+} // namespace media |