buffering_state.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chromecast/media/cma/base/buffering_state.h" 6 7#include <sstream> 8 9#include "base/logging.h" 10#include "media/base/buffers.h" 11 12namespace chromecast { 13namespace media { 14 15BufferingConfig::BufferingConfig( 16 base::TimeDelta low_level_threshold, 17 base::TimeDelta high_level_threshold) 18 : low_level_threshold_(low_level_threshold), 19 high_level_threshold_(high_level_threshold) { 20} 21 22BufferingConfig::~BufferingConfig() { 23} 24 25 26BufferingState::BufferingState( 27 const scoped_refptr<BufferingConfig>& config, 28 const base::Closure& state_changed_cb, 29 const HighLevelBufferCB& high_level_buffer_cb) 30 : config_(config), 31 state_changed_cb_(state_changed_cb), 32 high_level_buffer_cb_(high_level_buffer_cb), 33 state_(kLowLevel), 34 media_time_(::media::kNoTimestamp()), 35 max_rendering_time_(::media::kNoTimestamp()), 36 buffered_time_(::media::kNoTimestamp()) { 37} 38 39BufferingState::~BufferingState() { 40} 41 42void BufferingState::OnConfigChanged() { 43 state_ = GetBufferLevelState(); 44} 45 46void BufferingState::SetMediaTime(base::TimeDelta media_time) { 47 media_time_ = media_time; 48 switch (state_) { 49 case kLowLevel: 50 case kMediumLevel: 51 case kHighLevel: 52 UpdateState(GetBufferLevelState()); 53 break; 54 case kEosReached: 55 break; 56 } 57} 58 59void BufferingState::SetMaxRenderingTime(base::TimeDelta max_rendering_time) { 60 max_rendering_time_ = max_rendering_time; 61} 62 63base::TimeDelta BufferingState::GetMaxRenderingTime() const { 64 return max_rendering_time_; 65} 66 67void BufferingState::SetBufferedTime(base::TimeDelta buffered_time) { 68 buffered_time_ = buffered_time; 69 switch (state_) { 70 case kLowLevel: 71 case kMediumLevel: 72 case kHighLevel: 73 UpdateState(GetBufferLevelState()); 74 break; 75 case kEosReached: 76 break; 77 } 78} 79 80void BufferingState::NotifyEos() { 81 UpdateState(kEosReached); 82} 83 84void BufferingState::NotifyMaxCapacity(base::TimeDelta buffered_time) { 85 if (media_time_ == ::media::kNoTimestamp() || 86 buffered_time == ::media::kNoTimestamp()) { 87 LOG(WARNING) << "Max capacity with no timestamp"; 88 return; 89 } 90 base::TimeDelta buffer_duration = buffered_time - media_time_; 91 if (buffer_duration < config_->high_level()) 92 high_level_buffer_cb_.Run(buffer_duration); 93} 94 95std::string BufferingState::ToString() const { 96 std::ostringstream s; 97 s << "state=" << state_ 98 << " media_time_ms=" << media_time_.InMilliseconds() 99 << " buffered_time_ms=" << buffered_time_.InMilliseconds() 100 << " low_level_ms=" << config_->low_level().InMilliseconds() 101 << " high_level_ms=" << config_->high_level().InMilliseconds(); 102 return s.str(); 103} 104 105BufferingState::State BufferingState::GetBufferLevelState() const { 106 if (media_time_ == ::media::kNoTimestamp() || 107 buffered_time_ == ::media::kNoTimestamp()) { 108 return kLowLevel; 109 } 110 111 base::TimeDelta buffer_duration = buffered_time_ - media_time_; 112 if (buffer_duration < config_->low_level()) 113 return kLowLevel; 114 if (buffer_duration >= config_->high_level()) 115 return kHighLevel; 116 return kMediumLevel; 117} 118 119void BufferingState::UpdateState(State new_state) { 120 if (new_state == state_) 121 return; 122 123 state_ = new_state; 124 if (!state_changed_cb_.is_null()) 125 state_changed_cb_.Run(); 126} 127 128} // namespace media 129} // namespace chromecast 130