| OLD | NEW |
| 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 void Initialize(); | 141 void Initialize(); |
| 142 | 142 |
| 143 void MonitorLoop(); | 143 void MonitorLoop(); |
| 144 | 144 |
| 145 void OnPauseCompleted(); | 145 void OnPauseCompleted(); |
| 146 | 146 |
| 147 scoped_ptr<TaskRunnerImpl> task_runner_; | 147 scoped_ptr<TaskRunnerImpl> task_runner_; |
| 148 scoped_ptr<MediaPipelineBackend> backend_; | 148 scoped_ptr<MediaPipelineBackend> backend_; |
| 149 scoped_ptr<BufferFeeder> audio_feeder_; | 149 scoped_ptr<BufferFeeder> audio_feeder_; |
| 150 scoped_ptr<BufferFeeder> video_feeder_; | 150 scoped_ptr<BufferFeeder> video_feeder_; |
| 151 bool stopped_; |
| 151 | 152 |
| 152 // Current media time. | 153 // Current media time. |
| 153 base::TimeDelta pause_time_; | 154 base::TimeDelta pause_time_; |
| 154 | 155 |
| 155 // Pause settings | 156 // Pause settings |
| 156 std::vector<PauseInfo> pause_pattern_; | 157 std::vector<PauseInfo> pause_pattern_; |
| 157 int pause_pattern_idx_; | 158 int pause_pattern_idx_; |
| 158 | 159 |
| 159 DISALLOW_COPY_AND_ASSIGN(AudioVideoPipelineDeviceTest); | 160 DISALLOW_COPY_AND_ASSIGN(AudioVideoPipelineDeviceTest); |
| 160 }; | 161 }; |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 | 280 |
| 280 VLOG(2) << "Got " << buffers.size() << " video input frames"; | 281 VLOG(2) << "Got " << buffers.size() << " video input frames"; |
| 281 scoped_ptr<BufferFeeder> feeder(new BufferFeeder(eos_cb)); | 282 scoped_ptr<BufferFeeder> feeder(new BufferFeeder(eos_cb)); |
| 282 feeder->Initialize(decoder, buffers); | 283 feeder->Initialize(decoder, buffers); |
| 283 return feeder; | 284 return feeder; |
| 284 } | 285 } |
| 285 | 286 |
| 286 } // namespace | 287 } // namespace |
| 287 | 288 |
| 288 AudioVideoPipelineDeviceTest::AudioVideoPipelineDeviceTest() | 289 AudioVideoPipelineDeviceTest::AudioVideoPipelineDeviceTest() |
| 289 : pause_pattern_() {} | 290 : stopped_(false), pause_pattern_() {} |
| 290 | 291 |
| 291 AudioVideoPipelineDeviceTest::~AudioVideoPipelineDeviceTest() {} | 292 AudioVideoPipelineDeviceTest::~AudioVideoPipelineDeviceTest() {} |
| 292 | 293 |
| 293 void AudioVideoPipelineDeviceTest::AddPause(base::TimeDelta delay, | 294 void AudioVideoPipelineDeviceTest::AddPause(base::TimeDelta delay, |
| 294 base::TimeDelta length) { | 295 base::TimeDelta length) { |
| 295 pause_pattern_.push_back(PauseInfo(delay, length)); | 296 pause_pattern_.push_back(PauseInfo(delay, length)); |
| 296 } | 297 } |
| 297 | 298 |
| 298 void AudioVideoPipelineDeviceTest::SetPausePattern( | 299 void AudioVideoPipelineDeviceTest::SetPausePattern( |
| 299 const std::vector<PauseInfo> pattern) { | 300 const std::vector<PauseInfo> pattern) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 331 video_feeder_ = BufferFeeder::LoadVideo(backend_.get(), filename, | 332 video_feeder_ = BufferFeeder::LoadVideo(backend_.get(), filename, |
| 332 false /* raw_h264 */, eos_cb); | 333 false /* raw_h264 */, eos_cb); |
| 333 audio_feeder_ = BufferFeeder::LoadAudio(backend_.get(), filename, eos_cb); | 334 audio_feeder_ = BufferFeeder::LoadAudio(backend_.get(), filename, eos_cb); |
| 334 bool success = backend_->Initialize(); | 335 bool success = backend_->Initialize(); |
| 335 ASSERT_TRUE(success); | 336 ASSERT_TRUE(success); |
| 336 } | 337 } |
| 337 | 338 |
| 338 void AudioVideoPipelineDeviceTest::Start() { | 339 void AudioVideoPipelineDeviceTest::Start() { |
| 339 pause_time_ = base::TimeDelta(); | 340 pause_time_ = base::TimeDelta(); |
| 340 pause_pattern_idx_ = 0; | 341 pause_pattern_idx_ = 0; |
| 342 stopped_ = false; |
| 341 | 343 |
| 342 if (audio_feeder_) | 344 if (audio_feeder_) |
| 343 audio_feeder_->Start(); | 345 audio_feeder_->Start(); |
| 344 if (video_feeder_) | 346 if (video_feeder_) |
| 345 video_feeder_->Start(); | 347 video_feeder_->Start(); |
| 346 | 348 |
| 347 backend_->Start(0); | 349 backend_->Start(0); |
| 348 | 350 |
| 349 base::ThreadTaskRunnerHandle::Get()->PostTask( | 351 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 350 FROM_HERE, base::Bind(&AudioVideoPipelineDeviceTest::MonitorLoop, | 352 FROM_HERE, base::Bind(&AudioVideoPipelineDeviceTest::MonitorLoop, |
| 351 base::Unretained(this))); | 353 base::Unretained(this))); |
| 352 } | 354 } |
| 353 | 355 |
| 354 void AudioVideoPipelineDeviceTest::OnEndOfStream() { | 356 void AudioVideoPipelineDeviceTest::OnEndOfStream() { |
| 355 if ((!audio_feeder_ || audio_feeder_->eos()) && | 357 if ((!audio_feeder_ || audio_feeder_->eos()) && |
| 356 (!video_feeder_ || video_feeder_->eos())) { | 358 (!video_feeder_ || video_feeder_->eos())) { |
| 357 bool success = backend_->Stop(); | 359 bool success = backend_->Stop(); |
| 360 stopped_ = true; |
| 358 ASSERT_TRUE(success); | 361 ASSERT_TRUE(success); |
| 359 base::MessageLoop::current()->QuitWhenIdle(); | 362 base::MessageLoop::current()->QuitWhenIdle(); |
| 360 } | 363 } |
| 361 } | 364 } |
| 362 | 365 |
| 363 void AudioVideoPipelineDeviceTest::MonitorLoop() { | 366 void AudioVideoPipelineDeviceTest::MonitorLoop() { |
| 364 // Backend is stopped, no need to monitor the loop any more. | 367 // Backend is stopped, no need to monitor the loop any more. |
| 365 if (!audio_feeder_ && !video_feeder_) | 368 if (stopped_) |
| 366 return; | 369 return; |
| 367 | 370 |
| 368 base::TimeDelta media_time = | 371 base::TimeDelta media_time = |
| 369 base::TimeDelta::FromMicroseconds(backend_->GetCurrentPts()); | 372 base::TimeDelta::FromMicroseconds(backend_->GetCurrentPts()); |
| 370 | 373 |
| 371 if (!pause_pattern_.empty() && | 374 if (!pause_pattern_.empty() && |
| 372 pause_pattern_[pause_pattern_idx_].delay >= base::TimeDelta() && | 375 pause_pattern_[pause_pattern_idx_].delay >= base::TimeDelta() && |
| 373 media_time >= pause_time_ + pause_pattern_[pause_pattern_idx_].delay) { | 376 media_time >= pause_time_ + pause_pattern_[pause_pattern_idx_].delay) { |
| 374 // Do Pause | 377 // Do Pause |
| 375 backend_->Pause(); | 378 backend_->Pause(); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 TEST_F(AudioVideoPipelineDeviceTest, WebmPlayback) { | 476 TEST_F(AudioVideoPipelineDeviceTest, WebmPlayback) { |
| 474 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); | 477 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
| 475 | 478 |
| 476 ConfigureForFile("bear-640x360.webm"); | 479 ConfigureForFile("bear-640x360.webm"); |
| 477 Start(); | 480 Start(); |
| 478 message_loop->Run(); | 481 message_loop->Run(); |
| 479 } | 482 } |
| 480 | 483 |
| 481 } // namespace media | 484 } // namespace media |
| 482 } // namespace chromecast | 485 } // namespace chromecast |
| OLD | NEW |