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

Unified Diff: media/filters/audio_clock.cc

Issue 591603003: Introduce media::AudioClock::WallTimeForTimestamp(). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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/filters/audio_clock.cc
diff --git a/media/filters/audio_clock.cc b/media/filters/audio_clock.cc
index 69d2c9be7d7f1581e03bf8246b023d178f009cc9..5e6efde32053a88d2963b45aca37bf887fe24c4e 100644
--- a/media/filters/audio_clock.cc
+++ b/media/filters/audio_clock.cc
@@ -89,6 +89,47 @@ base::TimeDelta AudioClock::TimestampSinceWriting(
ComputeBufferedMediaTime(frames_played_since_writing);
}
+base::TimeDelta AudioClock::WallTimeForTimestamp(
+ base::TimeDelta timestamp) const {
+ DCHECK(timestamp >= front_timestamp_);
+ DCHECK(timestamp <= back_timestamp_);
+
+ base::TimeDelta media_time = front_timestamp_;
+ int64_t frames_until_timestamp = 0;
+
+ for (size_t i = 0; i < buffered_.size(); ++i) {
+ // Leading silence is always accounted prior to anything else.
+ if (i == 0 && buffered_[i].playback_rate == 0) {
+ frames_until_timestamp += buffered_[i].frames;
+ continue;
+ }
+
+ if (media_time >= timestamp)
DaleCurtis 2014/09/20 00:17:12 Should never be true? Which should allow the lowe
scherkus (not reviewing) 2014/09/22 18:34:12 Yeah code got a little mucked up after a few itera
+ break;
+
+ // Account for any silence between chunks of buffered audio data.
+ if (buffered_[i].playback_rate == 0) {
+ frames_until_timestamp += buffered_[i].frames;
+ continue;
+ }
+
+ // Calculate upper bound on media time for current block of buffered frames.
+ base::TimeDelta max_media_time =
+ media_time + base::TimeDelta::FromMicroseconds(
+ buffered_[i].frames * buffered_[i].playback_rate *
+ microseconds_per_frame_);
+
DaleCurtis 2014/09/20 00:17:12 I'm wary of all these conversions back and forth f
scherkus (not reviewing) 2014/09/22 18:34:12 Done.
+ // Determine amount of media time to convert to frames for current block.
+ base::TimeDelta delta = std::min(max_media_time, timestamp) - media_time;
+ frames_until_timestamp +=
+ delta.InSecondsF() * sample_rate_ / buffered_[i].playback_rate;
+ media_time += delta;
+ }
+
+ return base::TimeDelta::FromMicroseconds(frames_until_timestamp *
+ microseconds_per_frame_);
+}
+
AudioClock::AudioData::AudioData(int64_t frames, float playback_rate)
: frames(frames), playback_rate(playback_rate) {
}

Powered by Google App Engine
This is Rietveld 408576698