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

Side by Side Diff: chromecast/media/cma/backend/multizone_backend_unittest.cc

Issue 2133293003: [Chromecast] Make ALSA rendering delay either accurate or kNoTimestamp (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Fix ALSA unit tests Created 4 years, 5 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
« no previous file with comments | « chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 <stdint.h> 5 #include <stdint.h>
6 #include <stdlib.h> 6 #include <stdlib.h>
7 7
8 #include <algorithm> 8 #include <algorithm>
9 #include <limits> 9 #include <limits>
10 #include <memory> 10 #include <memory>
(...skipping 23 matching lines...) Expand all
34 namespace media { 34 namespace media {
35 35
36 class MultizoneBackendTest; 36 class MultizoneBackendTest;
37 37
38 namespace { 38 namespace {
39 39
40 const int64_t kMicrosecondsPerSecond = 1000 * 1000; 40 const int64_t kMicrosecondsPerSecond = 1000 * 1000;
41 // Total length of test, in microseconds. 41 // Total length of test, in microseconds.
42 const int64_t kPushTimeUs = 2 * kMicrosecondsPerSecond; 42 const int64_t kPushTimeUs = 2 * kMicrosecondsPerSecond;
43 const int64_t kStartPts = 0; 43 const int64_t kStartPts = 0;
44 const int64_t kRenderingDelayGracePeriodUs = 250 * 1000;
45 const int64_t kMaxRenderingDelayErrorUs = 200; 44 const int64_t kMaxRenderingDelayErrorUs = 200;
46 const int kNumEffectsStreams = 1; 45 const int kNumEffectsStreams = 1;
46 const int64_t kNoTimestamp = std::numeric_limits<int64_t>::min();
47 47
48 void IgnoreEos() {} 48 void IgnoreEos() {}
49 49
50 class BufferFeeder : public MediaPipelineBackend::Decoder::Delegate { 50 class BufferFeeder : public MediaPipelineBackend::Decoder::Delegate {
51 public: 51 public:
52 BufferFeeder(const AudioConfig& config, 52 BufferFeeder(const AudioConfig& config,
53 bool effects_only, 53 bool effects_only,
54 const base::Closure& eos_cb); 54 const base::Closure& eos_cb);
55 ~BufferFeeder() override {} 55 ~BufferFeeder() override {}
56 56
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 max_positive_rendering_delay_error_us_(0), 164 max_positive_rendering_delay_error_us_(0),
165 max_negative_rendering_delay_error_us_(0), 165 max_negative_rendering_delay_error_us_(0),
166 total_rendering_delay_error_us_(0), 166 total_rendering_delay_error_us_(0),
167 sample_count_(0), 167 sample_count_(0),
168 feeding_completed_(false), 168 feeding_completed_(false),
169 task_runner_(new TaskRunnerImpl()), 169 task_runner_(new TaskRunnerImpl()),
170 decoder_(nullptr), 170 decoder_(nullptr),
171 push_limit_us_(effects_only_ ? 0 : kPushTimeUs), 171 push_limit_us_(effects_only_ ? 0 : kPushTimeUs),
172 last_push_length_us_(0), 172 last_push_length_us_(0),
173 pushed_us_(0), 173 pushed_us_(0),
174 next_push_playback_timestamp_(0) { 174 next_push_playback_timestamp_(kNoTimestamp) {
175 CHECK(!eos_cb_.is_null()); 175 CHECK(!eos_cb_.is_null());
176 } 176 }
177 177
178 void BufferFeeder::Initialize() { 178 void BufferFeeder::Initialize() {
179 MediaPipelineDeviceParams params( 179 MediaPipelineDeviceParams params(
180 MediaPipelineDeviceParams::kModeIgnorePts, 180 MediaPipelineDeviceParams::kModeIgnorePts,
181 effects_only_ ? MediaPipelineDeviceParams::kAudioStreamSoundEffects 181 effects_only_ ? MediaPipelineDeviceParams::kAudioStreamSoundEffects
182 : MediaPipelineDeviceParams::kAudioStreamNormal, 182 : MediaPipelineDeviceParams::kAudioStreamNormal,
183 task_runner_.get()); 183 task_runner_.get());
184 backend_.reset(CastMediaShlib::CreateMediaPipelineBackend(params)); 184 backend_.reset(CastMediaShlib::CreateMediaPipelineBackend(params));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 } 239 }
240 240
241 void BufferFeeder::OnPushBufferComplete(BufferStatus status) { 241 void BufferFeeder::OnPushBufferComplete(BufferStatus status) {
242 DCHECK(thread_checker_.CalledOnValidThread()); 242 DCHECK(thread_checker_.CalledOnValidThread());
243 pending_buffer_ = nullptr; 243 pending_buffer_ = nullptr;
244 ASSERT_NE(status, MediaPipelineBackend::kBufferFailed); 244 ASSERT_NE(status, MediaPipelineBackend::kBufferFailed);
245 245
246 if (!effects_only_) { 246 if (!effects_only_) {
247 MediaPipelineBackend::AudioDecoder::RenderingDelay delay = 247 MediaPipelineBackend::AudioDecoder::RenderingDelay delay =
248 decoder_->GetRenderingDelay(); 248 decoder_->GetRenderingDelay();
249 int64_t expected_next_push_playback_timestamp = 249
250 next_push_playback_timestamp_ + last_push_length_us_; 250 if (delay.timestamp_microseconds != kNoTimestamp) {
251 next_push_playback_timestamp_ = 251 if (next_push_playback_timestamp_ == kNoTimestamp) {
252 delay.timestamp_microseconds + delay.delay_microseconds; 252 next_push_playback_timestamp_ =
253 // Check rendering delay accuracy only if we have pushed more than 253 delay.timestamp_microseconds + delay.delay_microseconds;
254 // kRenderingDelayGracePeriodUs of data.
255 if (pushed_us_ > kRenderingDelayGracePeriodUs) {
256 int64_t error =
257 next_push_playback_timestamp_ - expected_next_push_playback_timestamp;
258 max_rendering_delay_error_us_ =
259 std::max(max_rendering_delay_error_us_, std::abs(error));
260 total_rendering_delay_error_us_ += std::abs(error);
261 if (error >= 0) {
262 max_positive_rendering_delay_error_us_ =
263 std::max(max_positive_rendering_delay_error_us_, error);
264 } else { 254 } else {
265 max_negative_rendering_delay_error_us_ = 255 int64_t expected_next_push_playback_timestamp =
266 std::min(max_negative_rendering_delay_error_us_, error); 256 next_push_playback_timestamp_ + last_push_length_us_;
257 next_push_playback_timestamp_ =
258 delay.timestamp_microseconds + delay.delay_microseconds;
259 int64_t error = next_push_playback_timestamp_ -
260 expected_next_push_playback_timestamp;
261 max_rendering_delay_error_us_ =
262 std::max(max_rendering_delay_error_us_, std::abs(error));
263 total_rendering_delay_error_us_ += std::abs(error);
264 if (error >= 0) {
265 max_positive_rendering_delay_error_us_ =
266 std::max(max_positive_rendering_delay_error_us_, error);
267 } else {
268 max_negative_rendering_delay_error_us_ =
269 std::min(max_negative_rendering_delay_error_us_, error);
270 }
271 sample_count_++;
267 } 272 }
268 sample_count_++;
269 } 273 }
270 } 274 }
271 pushed_us_ += last_push_length_us_; 275 pushed_us_ += last_push_length_us_;
272 276
273 if (feeding_completed_) 277 if (feeding_completed_)
274 return; 278 return;
275 279
276 base::ThreadTaskRunnerHandle::Get()->PostTask( 280 base::ThreadTaskRunnerHandle::Get()->PostTask(
277 FROM_HERE, base::Bind(&BufferFeeder::FeedBuffer, base::Unretained(this))); 281 FROM_HERE, base::Bind(&BufferFeeder::FeedBuffer, base::Unretained(this)));
278 } 282 }
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 32000, 362 32000,
359 44100, 363 44100,
360 48000)); 364 48000));
361 365
362 INSTANTIATE_TEST_CASE_P(Optional, 366 INSTANTIATE_TEST_CASE_P(Optional,
363 MultizoneBackendTest, 367 MultizoneBackendTest,
364 ::testing::Values(64000, 88200, 96000)); 368 ::testing::Values(64000, 88200, 96000));
365 369
366 } // namespace media 370 } // namespace media
367 } // namespace chromecast 371 } // namespace chromecast
OLDNEW
« no previous file with comments | « chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698