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) { |
} |