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

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: Rebase ToT, again 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
« no previous file with comments | « media/base/clock.h ('k') | media/base/clock_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/clock.cc
diff --git a/media/base/clock.cc b/media/base/clock.cc
index 4cdc021780e73306afc5143f2361597b3d195c52..2517d1d9c4a9d19115db4ffe423c67247a6e35cb 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()) {
- NOTREACHED();
- return;
- }
- if (playing_) {
- reference_ = GetTimeFromProvider();
- }
- media_time_ = time;
+void Clock::SetTime(base::TimeDelta current_time, base::TimeDelta max_time) {
+ DCHECK(current_time <= max_time);
+ DCHECK(current_time != kNoTimestamp());
+
+ UpdateReferencePoints(current_time);
+ max_time_ = ClampToValidTimeRange(max_time);
+ underflow_ = false;
}
-base::TimeDelta Clock::Elapsed() const {
- if (!playing_) {
+base::TimeDelta Clock::Elapsed() {
+ if (duration_ == kNoTimestamp())
+ return base::TimeDelta();
+
+ // The clock is not advancing, so return the last recorded time.
+ if (!playing_ || underflow_)
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,50 @@ 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_;
+}
+
+void Clock::UpdateReferencePoints() {
+ UpdateReferencePoints(Elapsed());
+}
+
+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') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698