Chromium Code Reviews| 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) { |
| } |