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

Side by Side 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: rebase Created 6 years, 2 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/filters/audio_clock.h" 5 #include "media/filters/audio_clock.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "media/base/buffers.h" 10 #include "media/base/buffers.h"
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 82
83 base::TimeDelta AudioClock::TimestampSinceWriting( 83 base::TimeDelta AudioClock::TimestampSinceWriting(
84 base::TimeDelta time_since_writing) const { 84 base::TimeDelta time_since_writing) const {
85 int64_t frames_played_since_writing = std::min( 85 int64_t frames_played_since_writing = std::min(
86 total_buffered_frames_, 86 total_buffered_frames_,
87 static_cast<int64_t>(time_since_writing.InSecondsF() * sample_rate_)); 87 static_cast<int64_t>(time_since_writing.InSecondsF() * sample_rate_));
88 return front_timestamp_ + 88 return front_timestamp_ +
89 ComputeBufferedMediaTime(frames_played_since_writing); 89 ComputeBufferedMediaTime(frames_played_since_writing);
90 } 90 }
91 91
92 base::TimeDelta AudioClock::TimeUntilPlayback(base::TimeDelta timestamp) const {
93 DCHECK(timestamp >= front_timestamp_);
94 DCHECK(timestamp <= back_timestamp_);
95
96 int64_t frames_until_timestamp = 0;
97 double timestamp_us = timestamp.InMicroseconds();
98 double media_time_us = front_timestamp_.InMicroseconds();
99
100 for (size_t i = 0; i < buffered_.size(); ++i) {
101 // Leading silence is always accounted prior to anything else.
102 if (buffered_[i].playback_rate == 0) {
103 frames_until_timestamp += buffered_[i].frames;
104 continue;
105 }
106
107 // Calculate upper bound on media time for current block of buffered frames.
108 double delta_us = buffered_[i].frames * buffered_[i].playback_rate *
109 microseconds_per_frame_;
110 double max_media_time_us = media_time_us + delta_us;
111
112 // Determine amount of media time to convert to frames for current block. If
113 // target timestamp falls within current block, scale the amount of frames
114 // based on remaining amount of media time.
115 if (timestamp_us <= max_media_time_us) {
116 frames_until_timestamp +=
117 buffered_[i].frames * (timestamp_us - media_time_us) / delta_us;
118 break;
119 }
120
121 media_time_us = max_media_time_us;
122 frames_until_timestamp += buffered_[i].frames;
123 }
124
125 return base::TimeDelta::FromMicroseconds(frames_until_timestamp *
126 microseconds_per_frame_);
127 }
128
92 AudioClock::AudioData::AudioData(int64_t frames, float playback_rate) 129 AudioClock::AudioData::AudioData(int64_t frames, float playback_rate)
93 : frames(frames), playback_rate(playback_rate) { 130 : frames(frames), playback_rate(playback_rate) {
94 } 131 }
95 132
96 void AudioClock::PushBufferedAudioData(int64_t frames, float playback_rate) { 133 void AudioClock::PushBufferedAudioData(int64_t frames, float playback_rate) {
97 if (frames == 0) 134 if (frames == 0)
98 return; 135 return;
99 136
100 total_buffered_frames_ += frames; 137 total_buffered_frames_ += frames;
101 138
(...skipping 29 matching lines...) Expand all
131 int64_t min_frames = std::min(buffered_[i].frames, frames); 168 int64_t min_frames = std::min(buffered_[i].frames, frames);
132 scaled_frames += min_frames * buffered_[i].playback_rate; 169 scaled_frames += min_frames * buffered_[i].playback_rate;
133 frames -= min_frames; 170 frames -= min_frames;
134 } 171 }
135 172
136 return base::TimeDelta::FromMicroseconds(scaled_frames * 173 return base::TimeDelta::FromMicroseconds(scaled_frames *
137 microseconds_per_frame_); 174 microseconds_per_frame_);
138 } 175 }
139 176
140 } // namespace media 177 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698