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