Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(836)

Unified Diff: media/base/clock.cc

Issue 9155003: Fix media timeline so that thumb never exceeds buffered data (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/base/clock.cc
diff --git a/media/base/clock.cc b/media/base/clock.cc
index 4cdc021780e73306afc5143f2361597b3d195c52..4ec1d4859fcc479d66dcf41c01bd93517b9f5b8c 100644
--- a/media/base/clock.cc
+++ b/media/base/clock.cc
@@ -10,9 +10,8 @@
namespace media {
Clock::Clock(TimeProvider* time_provider)
- : time_provider_(time_provider),
- playing_(false),
- playback_rate_(1.0f) {
+ : time_provider_(time_provider) {
+ Reset();
}
Clock::~Clock() {}
@@ -23,44 +22,64 @@ bool Clock::IsPlaying() const {
base::TimeDelta Clock::Play() {
DCHECK(!playing_);
- reference_ = GetTimeFromProvider();
+ UpdateReferencePoints();
playing_ = true;
return media_time_;
}
base::TimeDelta Clock::Pause() {
DCHECK(playing_);
- // Save our new accumulated amount of media time.
- media_time_ = Elapsed();
+ UpdateReferencePoints();
playing_ = false;
return media_time_;
}
void Clock::SetPlaybackRate(float playback_rate) {
- if (playing_) {
- base::Time time = GetTimeFromProvider();
- media_time_ = ElapsedViaProvidedTime(time);
- reference_ = time;
- }
+ UpdateReferencePoints();
playback_rate_ = playback_rate;
}
-void Clock::SetTime(const base::TimeDelta& time) {
- if (time == kNoTimestamp()) {
+void Clock::SetTime(base::TimeDelta current_time, base::TimeDelta max_time) {
+ DCHECK(current_time <= max_time);
+ if (current_time == kNoTimestamp()) {
acolwell GONE FROM CHROMIUM 2012/01/24 18:13:59 Should we convert this into a DCHECK? Any idea why
vrk (LEFT CHROMIUM) 2012/01/25 00:09:32 Introduced in this CL: http://codereview.chromium.
NOTREACHED();
return;
}
- if (playing_) {
- reference_ = GetTimeFromProvider();
- }
- media_time_ = time;
+ underflow_ = false;
+ UpdateReferencePoints(current_time);
+ SetMaxTime(max_time);
}
-base::TimeDelta Clock::Elapsed() const {
- if (!playing_) {
+base::TimeDelta Clock::Elapsed() {
+ if (duration_ == kNoTimestamp())
+ return base::TimeDelta();
+
+ if (!IsTimeProgressing())
return media_time_;
+
+ base::TimeDelta elapsed = EstimatedElapsedTime();
+ if (max_time_ != kNoTimestamp() && elapsed > max_time_) {
+ UpdateReferencePoints(max_time_);
+ underflow_ = true;
+ elapsed = max_time_;
}
- return ElapsedViaProvidedTime(GetTimeFromProvider());
+
+ return elapsed;
+}
+
+void Clock::SetMaxTime(base::TimeDelta max_time) {
+ DCHECK(max_time != kNoTimestamp());
+ UpdateReferencePoints();
+ max_time_ = ClampToValidTimeRange(max_time);
+
+ DCHECK(media_time_ <= max_time_);
+ underflow_ = false;
+}
+
+void Clock::SetDuration(base::TimeDelta duration) {
+ DCHECK(duration_ == kNoTimestamp());
+ DCHECK(duration > base::TimeDelta());
+ duration_ = duration;
}
base::TimeDelta Clock::ElapsedViaProvidedTime(const base::Time& time) const {
@@ -71,10 +90,58 @@ base::TimeDelta Clock::ElapsedViaProvidedTime(const base::Time& time) const {
}
base::Time Clock::GetTimeFromProvider() const {
- if (time_provider_) {
+ if (time_provider_)
return time_provider_();
- }
return base::Time();
}
+base::TimeDelta Clock::ClampToValidTimeRange(base::TimeDelta time) const {
+ if (duration_ == kNoTimestamp())
+ return base::TimeDelta();
+ return std::max(std::min(time, duration_), base::TimeDelta());
+}
+
+void Clock::EndOfStream() {
+ Pause();
+ SetTime(Duration(), Duration());
+}
+
+base::TimeDelta Clock::Duration() const {
+ if (duration_ == kNoTimestamp())
+ return base::TimeDelta();
+ return duration_;
+}
+
+bool Clock::IsTimeProgressing() const {
+ return playing_ && !underflow_;
+}
+
+void Clock::UpdateReferencePoints() {
+ if (IsTimeProgressing())
acolwell GONE FROM CHROMIUM 2012/01/24 18:13:59 I think this function body can be replaced with Up
vrk (LEFT CHROMIUM) 2012/01/25 00:09:32 Yes, you are right! Done.
+ media_time_ = Elapsed();
+ else
+ DCHECK(media_time_ == Elapsed());
+ reference_ = GetTimeFromProvider();
+}
+
+void Clock::UpdateReferencePoints(base::TimeDelta current_time) {
+ media_time_ = ClampToValidTimeRange(current_time);
+ reference_ = GetTimeFromProvider();
+}
+
+base::TimeDelta Clock::EstimatedElapsedTime() {
+ return ClampToValidTimeRange(
+ ElapsedViaProvidedTime(GetTimeFromProvider()));
+}
+
+void Clock::Reset() {
+ playing_ = false;
+ playback_rate_ = 1.0f;
+ max_time_ = kNoTimestamp();
+ duration_ = kNoTimestamp();
+ media_time_ = base::TimeDelta();
+ reference_ = base::Time();
+ underflow_ = false;
+}
+
} // namespace media
« no previous file with comments | « media/base/clock.h ('k') | media/base/clock_unittest.cc » ('j') | media/base/clock_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698