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

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: 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 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::WallTimeForTimestamp(
93 base::TimeDelta timestamp) const {
94 DCHECK(timestamp >= front_timestamp_);
95 DCHECK(timestamp <= back_timestamp_);
96
97 base::TimeDelta media_time = front_timestamp_;
98 int64_t frames_until_timestamp = 0;
99
100 for (size_t i = 0; i < buffered_.size(); ++i) {
101 // Leading silence is always accounted prior to anything else.
102 if (i == 0 && buffered_[i].playback_rate == 0) {
103 frames_until_timestamp += buffered_[i].frames;
104 continue;
105 }
106
107 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
108 break;
109
110 // Account for any silence between chunks of buffered audio data.
111 if (buffered_[i].playback_rate == 0) {
112 frames_until_timestamp += buffered_[i].frames;
113 continue;
114 }
115
116 // Calculate upper bound on media time for current block of buffered frames.
117 base::TimeDelta max_media_time =
118 media_time + base::TimeDelta::FromMicroseconds(
119 buffered_[i].frames * buffered_[i].playback_rate *
120 microseconds_per_frame_);
121
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.
122 // Determine amount of media time to convert to frames for current block.
123 base::TimeDelta delta = std::min(max_media_time, timestamp) - media_time;
124 frames_until_timestamp +=
125 delta.InSecondsF() * sample_rate_ / buffered_[i].playback_rate;
126 media_time += delta;
127 }
128
129 return base::TimeDelta::FromMicroseconds(frames_until_timestamp *
130 microseconds_per_frame_);
131 }
132
92 AudioClock::AudioData::AudioData(int64_t frames, float playback_rate) 133 AudioClock::AudioData::AudioData(int64_t frames, float playback_rate)
93 : frames(frames), playback_rate(playback_rate) { 134 : frames(frames), playback_rate(playback_rate) {
94 } 135 }
95 136
96 void AudioClock::PushBufferedAudioData(int64_t frames, float playback_rate) { 137 void AudioClock::PushBufferedAudioData(int64_t frames, float playback_rate) {
97 if (frames == 0) 138 if (frames == 0)
98 return; 139 return;
99 140
100 total_buffered_frames_ += frames; 141 total_buffered_frames_ += frames;
101 142
(...skipping 29 matching lines...) Expand all
131 int64_t min_frames = std::min(buffered_[i].frames, frames); 172 int64_t min_frames = std::min(buffered_[i].frames, frames);
132 scaled_frames += min_frames * buffered_[i].playback_rate; 173 scaled_frames += min_frames * buffered_[i].playback_rate;
133 frames -= min_frames; 174 frames -= min_frames;
134 } 175 }
135 176
136 return base::TimeDelta::FromMicroseconds(scaled_frames * 177 return base::TimeDelta::FromMicroseconds(scaled_frames *
137 microseconds_per_frame_); 178 microseconds_per_frame_);
138 } 179 }
139 180
140 } // namespace media 181 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698