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

Side by Side Diff: media/base/pipeline_unittest.cc

Issue 10828045: Rewrite media::Pipeline state transition machinery. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src
Patch Set: stuff Created 8 years, 4 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "base/threading/simple_thread.h" 10 #include "base/threading/simple_thread.h"
(...skipping 24 matching lines...) Expand all
35 // Demuxer properties. 35 // Demuxer properties.
36 static const int kTotalBytes = 1024; 36 static const int kTotalBytes = 1024;
37 static const int kBufferedBytes = 1024; 37 static const int kBufferedBytes = 1024;
38 static const int kBitrate = 1234; 38 static const int kBitrate = 1234;
39 39
40 ACTION_P(SetDemuxerProperties, duration) { 40 ACTION_P(SetDemuxerProperties, duration) {
41 arg0->SetTotalBytes(kTotalBytes); 41 arg0->SetTotalBytes(kTotalBytes);
42 arg0->SetDuration(duration); 42 arg0->SetDuration(duration);
43 } 43 }
44 44
45 ACTION_P2(Stop, pipeline, stop_cb) {
46 pipeline->Stop(stop_cb);
47 }
48
49 ACTION_P2(SetError, pipeline, status) {
50 pipeline->SetErrorForTesting(status);
51 }
52
45 ACTION(RunPipelineStatusCB1) { 53 ACTION(RunPipelineStatusCB1) {
46 arg1.Run(PIPELINE_OK); 54 arg1.Run(PIPELINE_OK);
47 } 55 }
48 56
49 ACTION_P(RunPipelineStatusCB1WithStatus, status) { 57 ACTION_P(RunPipelineStatusCB1WithStatus, status) {
50 arg1.Run(status); 58 arg1.Run(status);
51 } 59 }
52 60
53 // Used for setting expectations on pipeline callbacks. Using a StrictMock 61 // Used for setting expectations on pipeline callbacks. Using a StrictMock
54 // also lets us test for missing callbacks. 62 // also lets us test for missing callbacks.
(...skipping 28 matching lines...) Expand all
83 // streams. 91 // streams.
84 DemuxerStream* null_pointer = NULL; 92 DemuxerStream* null_pointer = NULL;
85 EXPECT_CALL(*mocks_->demuxer(), GetStream(_)) 93 EXPECT_CALL(*mocks_->demuxer(), GetStream(_))
86 .WillRepeatedly(Return(null_pointer)); 94 .WillRepeatedly(Return(null_pointer));
87 95
88 EXPECT_CALL(*mocks_->demuxer(), GetStartTime()) 96 EXPECT_CALL(*mocks_->demuxer(), GetStartTime())
89 .WillRepeatedly(Return(base::TimeDelta())); 97 .WillRepeatedly(Return(base::TimeDelta()));
90 } 98 }
91 99
92 virtual ~PipelineTest() { 100 virtual ~PipelineTest() {
93 if (!pipeline_->IsRunning()) {
94 return;
95 }
96
97 // Shutdown sequence. 101 // Shutdown sequence.
98 if (pipeline_->IsInitialized()) { 102 if (pipeline_->IsRunning()) {
99 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 103 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
100 .WillOnce(RunClosure()); 104 .WillOnce(RunClosure());
101 105
102 if (audio_stream_) { 106 if (audio_stream_) {
103 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
scherkus (not reviewing) 2012/07/28 02:26:07 Note lack of Pause/Flush prior to Stop!
104 .WillOnce(RunClosure());
105 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
106 .WillOnce(RunClosure());
107 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)) 107 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
108 .WillOnce(RunClosure()); 108 .WillOnce(RunClosure());
109 } 109 }
110 110
111 if (video_stream_) { 111 if (video_stream_) {
112 EXPECT_CALL(*mocks_->video_renderer(), Pause(_))
113 .WillOnce(RunClosure());
114 EXPECT_CALL(*mocks_->video_renderer(), Flush(_))
115 .WillOnce(RunClosure());
116 EXPECT_CALL(*mocks_->video_renderer(), Stop(_)) 112 EXPECT_CALL(*mocks_->video_renderer(), Stop(_))
117 .WillOnce(RunClosure()); 113 .WillOnce(RunClosure());
118 } 114 }
119 } 115 }
120 116
121 // Expect a stop callback if we were started. 117 // Stop() callbacks are always executed regardless of run state.
122 EXPECT_CALL(callbacks_, OnStop()); 118 EXPECT_CALL(callbacks_, OnStop());
123 pipeline_->Stop(base::Bind(&CallbackHelper::OnStop, 119 pipeline_->Stop(base::Bind(&CallbackHelper::OnStop,
124 base::Unretained(&callbacks_))); 120 base::Unretained(&callbacks_)));
125 message_loop_.RunAllPending(); 121 message_loop_.RunAllPending();
126 122
127 pipeline_ = NULL; 123 pipeline_ = NULL;
128 mocks_.reset(); 124 mocks_.reset();
129 } 125 }
130 126
131 protected: 127 protected:
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 } 239 }
244 240
245 MockDemuxerStream* video_stream() { 241 MockDemuxerStream* video_stream() {
246 return video_stream_; 242 return video_stream_;
247 } 243 }
248 244
249 void ExpectSeek(const base::TimeDelta& seek_time) { 245 void ExpectSeek(const base::TimeDelta& seek_time) {
250 // Every filter should receive a call to Seek(). 246 // Every filter should receive a call to Seek().
251 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _)) 247 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
252 .WillOnce(RunPipelineStatusCB1()); 248 .WillOnce(RunPipelineStatusCB1());
249 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(_));
253 250
254 if (audio_stream_) { 251 if (audio_stream_) {
255 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 252 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
256 .WillOnce(RunClosure()); 253 .WillOnce(RunClosure());
257 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 254 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
258 .WillOnce(RunClosure()); 255 .WillOnce(RunClosure());
259 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _)) 256 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _))
260 .WillOnce(RunPipelineStatusCB1()); 257 .WillOnce(RunPipelineStatusCB1());
258 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(_));
259 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(_));
scherkus (not reviewing) 2012/07/28 02:26:07 note new calls to SPR/SV()
261 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 260 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
262 .WillOnce(RunClosure()); 261 .WillOnce(RunClosure());
263 } 262 }
264 263
265 if (video_stream_) { 264 if (video_stream_) {
266 EXPECT_CALL(*mocks_->video_renderer(), Pause(_)) 265 EXPECT_CALL(*mocks_->video_renderer(), Pause(_))
267 .WillOnce(RunClosure()); 266 .WillOnce(RunClosure());
268 EXPECT_CALL(*mocks_->video_renderer(), Flush(_)) 267 EXPECT_CALL(*mocks_->video_renderer(), Flush(_))
269 .WillOnce(RunClosure()); 268 .WillOnce(RunClosure());
270 EXPECT_CALL(*mocks_->video_renderer(), Preroll(seek_time, _)) 269 EXPECT_CALL(*mocks_->video_renderer(), Preroll(seek_time, _))
271 .WillOnce(RunPipelineStatusCB1()); 270 .WillOnce(RunPipelineStatusCB1());
271 EXPECT_CALL(*mocks_->video_renderer(), SetPlaybackRate(_));
272 EXPECT_CALL(*mocks_->video_renderer(), Play(_)) 272 EXPECT_CALL(*mocks_->video_renderer(), Play(_))
273 .WillOnce(RunClosure()); 273 .WillOnce(RunClosure());
274 } 274 }
275 275
276 // We expect a successful seek callback. 276 // We expect a successful seek callback.
277 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); 277 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
278 } 278 }
279 279
280 void DoSeek(const base::TimeDelta& seek_time) { 280 void DoSeek(const base::TimeDelta& seek_time) {
281 pipeline_->Seek(seek_time, 281 pipeline_->Seek(seek_time,
282 base::Bind(&CallbackHelper::OnSeek, 282 base::Bind(&CallbackHelper::OnSeek,
283 base::Unretained(&callbacks_))); 283 base::Unretained(&callbacks_)));
284 284
285 // We expect the time to be updated only after the seek has completed. 285 // We expect the time to be updated only after the seek has completed.
286 EXPECT_NE(seek_time, pipeline_->GetMediaTime()); 286 EXPECT_NE(seek_time, pipeline_->GetMediaTime());
287 message_loop_.RunAllPending(); 287 message_loop_.RunAllPending();
288 EXPECT_EQ(seek_time, pipeline_->GetMediaTime()); 288 EXPECT_EQ(seek_time, pipeline_->GetMediaTime());
289 } 289 }
290 290
291 void SetupErrorTest() {
292 CreateAudioStream();
293 MockDemuxerStreamVector streams;
294 streams.push_back(audio_stream());
295
296 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000));
297 InitializeAudioDecoder(audio_stream());
298 InitializeAudioRenderer();
299 InitializePipeline(PIPELINE_OK);
300 }
301
291 // Fixture members. 302 // Fixture members.
292 StrictMock<CallbackHelper> callbacks_; 303 StrictMock<CallbackHelper> callbacks_;
293 MessageLoop message_loop_; 304 MessageLoop message_loop_;
294 scoped_refptr<Pipeline> pipeline_; 305 scoped_refptr<Pipeline> pipeline_;
295 scoped_ptr<media::MockFilterCollection> mocks_; 306 scoped_ptr<media::MockFilterCollection> mocks_;
296 scoped_refptr<StrictMock<MockDemuxerStream> > audio_stream_; 307 scoped_refptr<StrictMock<MockDemuxerStream> > audio_stream_;
297 scoped_refptr<StrictMock<MockDemuxerStream> > video_stream_; 308 scoped_refptr<StrictMock<MockDemuxerStream> > video_stream_;
298 AudioRenderer::TimeCB audio_time_cb_; 309 AudioRenderer::TimeCB audio_time_cb_;
299 310
300 private: 311 private:
301 DISALLOW_COPY_AND_ASSIGN(PipelineTest); 312 DISALLOW_COPY_AND_ASSIGN(PipelineTest);
302 }; 313 };
303 314
304 // Test that playback controls methods no-op when the pipeline hasn't been 315 // Test that playback controls methods no-op when the pipeline hasn't been
305 // started. 316 // started.
306 TEST_F(PipelineTest, NotStarted) { 317 TEST_F(PipelineTest, NotStarted) {
307 const base::TimeDelta kZero; 318 const base::TimeDelta kZero;
308 319
309 EXPECT_FALSE(pipeline_->IsRunning()); 320 EXPECT_FALSE(pipeline_->IsRunning());
310 EXPECT_FALSE(pipeline_->IsInitialized());
311 EXPECT_FALSE(pipeline_->HasAudio()); 321 EXPECT_FALSE(pipeline_->HasAudio());
312 EXPECT_FALSE(pipeline_->HasVideo()); 322 EXPECT_FALSE(pipeline_->HasVideo());
313 323
314 // Setting should still work. 324 // Setting should still work.
315 EXPECT_EQ(0.0f, pipeline_->GetPlaybackRate()); 325 EXPECT_EQ(0.0f, pipeline_->GetPlaybackRate());
316 pipeline_->SetPlaybackRate(-1.0f); 326 pipeline_->SetPlaybackRate(-1.0f);
317 EXPECT_EQ(0.0f, pipeline_->GetPlaybackRate()); 327 EXPECT_EQ(0.0f, pipeline_->GetPlaybackRate());
318 pipeline_->SetPlaybackRate(1.0f); 328 pipeline_->SetPlaybackRate(1.0f);
319 EXPECT_EQ(1.0f, pipeline_->GetPlaybackRate()); 329 EXPECT_EQ(1.0f, pipeline_->GetPlaybackRate());
320 330
(...skipping 10 matching lines...) Expand all
331 341
332 EXPECT_EQ(0, pipeline_->GetTotalBytes()); 342 EXPECT_EQ(0, pipeline_->GetTotalBytes());
333 343
334 // Should always get set to zero. 344 // Should always get set to zero.
335 gfx::Size size(1, 1); 345 gfx::Size size(1, 1);
336 pipeline_->GetNaturalVideoSize(&size); 346 pipeline_->GetNaturalVideoSize(&size);
337 EXPECT_EQ(0, size.width()); 347 EXPECT_EQ(0, size.width());
338 EXPECT_EQ(0, size.height()); 348 EXPECT_EQ(0, size.height());
339 } 349 }
340 350
341 TEST_F(PipelineTest, NeverInitializes) {
scherkus (not reviewing) 2012/07/28 02:26:07 this test hangs with the new pipeline because insi
acolwell GONE FROM CHROMIUM 2012/07/30 18:33:10 Doesn't this essentially test the case where the p
342 // Don't execute the callback passed into Initialize().
343 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _));
344 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
345 .WillOnce(RunClosure());
346
347 // This test hangs during initialization by never calling
348 // InitializationComplete(). StrictMock<> will ensure that the callback is
349 // never executed.
350 pipeline_->Start(
351 mocks_->Create().Pass(),
352 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
353 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
354 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)));
355 message_loop_.RunAllPending();
356
357 EXPECT_FALSE(pipeline_->IsInitialized());
358
359 // Because our callback will get executed when the test tears down, we'll
360 // verify that nothing has been called, then set our expectation for the call
361 // made during tear down.
362 Mock::VerifyAndClear(&callbacks_);
363 EXPECT_CALL(callbacks_, OnStart(PIPELINE_OK));
364 }
365
366 TEST_F(PipelineTest, RequiredFilterMissing) { 351 TEST_F(PipelineTest, RequiredFilterMissing) {
367 // Create a filter collection with missing filter. 352 // Create a filter collection with missing filter.
368 scoped_ptr<FilterCollection> collection(mocks_->Create()); 353 scoped_ptr<FilterCollection> collection(mocks_->Create());
369 collection->SetDemuxer(NULL); 354 collection->SetDemuxer(NULL);
370 355
371 EXPECT_CALL(callbacks_, OnStart(PIPELINE_ERROR_REQUIRED_FILTER_MISSING)); 356 EXPECT_CALL(callbacks_, OnStart(PIPELINE_ERROR_REQUIRED_FILTER_MISSING));
372 pipeline_->Start( 357 pipeline_->Start(
373 collection.Pass(), 358 collection.Pass(),
374 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), 359 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
375 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), 360 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
376 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_))); 361 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)));
377 message_loop_.RunAllPending(); 362 message_loop_.RunAllPending();
378 EXPECT_FALSE(pipeline_->IsInitialized());
379 } 363 }
380 364
381 TEST_F(PipelineTest, URLNotFound) { 365 TEST_F(PipelineTest, URLNotFound) {
382 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) 366 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
383 .WillOnce(RunPipelineStatusCB1WithStatus(PIPELINE_ERROR_URL_NOT_FOUND)); 367 .WillOnce(RunPipelineStatusCB1WithStatus(PIPELINE_ERROR_URL_NOT_FOUND));
384 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 368 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
385 .WillOnce(RunClosure()); 369 .WillOnce(RunClosure());
386 370
387 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND); 371 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND);
388 EXPECT_FALSE(pipeline_->IsInitialized());
389 } 372 }
390 373
391 TEST_F(PipelineTest, NoStreams) { 374 TEST_F(PipelineTest, NoStreams) {
392 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) 375 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
393 .WillOnce(RunPipelineStatusCB1()); 376 .WillOnce(RunPipelineStatusCB1());
394 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 377 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
395 .WillOnce(RunClosure()); 378 .WillOnce(RunClosure());
396 379
397 InitializePipeline(PIPELINE_ERROR_COULD_NOT_RENDER); 380 InitializePipeline(PIPELINE_ERROR_COULD_NOT_RENDER);
398 EXPECT_FALSE(pipeline_->IsInitialized());
399 } 381 }
400 382
401 TEST_F(PipelineTest, AudioStream) { 383 TEST_F(PipelineTest, AudioStream) {
402 CreateAudioStream(); 384 CreateAudioStream();
403 MockDemuxerStreamVector streams; 385 MockDemuxerStreamVector streams;
404 streams.push_back(audio_stream()); 386 streams.push_back(audio_stream());
405 387
406 InitializeDemuxer(&streams); 388 InitializeDemuxer(&streams);
407 InitializeAudioDecoder(audio_stream()); 389 InitializeAudioDecoder(audio_stream());
408 InitializeAudioRenderer(); 390 InitializeAudioRenderer();
409 391
410 InitializePipeline(PIPELINE_OK); 392 InitializePipeline(PIPELINE_OK);
411 EXPECT_TRUE(pipeline_->IsInitialized());
412 EXPECT_TRUE(pipeline_->HasAudio()); 393 EXPECT_TRUE(pipeline_->HasAudio());
413 EXPECT_FALSE(pipeline_->HasVideo()); 394 EXPECT_FALSE(pipeline_->HasVideo());
414 } 395 }
415 396
416 TEST_F(PipelineTest, VideoStream) { 397 TEST_F(PipelineTest, VideoStream) {
417 CreateVideoStream(); 398 CreateVideoStream();
418 MockDemuxerStreamVector streams; 399 MockDemuxerStreamVector streams;
419 streams.push_back(video_stream()); 400 streams.push_back(video_stream());
420 401
421 InitializeDemuxer(&streams); 402 InitializeDemuxer(&streams);
422 InitializeVideoDecoder(video_stream()); 403 InitializeVideoDecoder(video_stream());
423 InitializeVideoRenderer(); 404 InitializeVideoRenderer();
424 405
425 InitializePipeline(PIPELINE_OK); 406 InitializePipeline(PIPELINE_OK);
426 EXPECT_TRUE(pipeline_->IsInitialized());
427 EXPECT_FALSE(pipeline_->HasAudio()); 407 EXPECT_FALSE(pipeline_->HasAudio());
428 EXPECT_TRUE(pipeline_->HasVideo()); 408 EXPECT_TRUE(pipeline_->HasVideo());
429 } 409 }
430 410
431 TEST_F(PipelineTest, AudioVideoStream) { 411 TEST_F(PipelineTest, AudioVideoStream) {
432 CreateAudioStream(); 412 CreateAudioStream();
433 CreateVideoStream(); 413 CreateVideoStream();
434 MockDemuxerStreamVector streams; 414 MockDemuxerStreamVector streams;
435 streams.push_back(audio_stream()); 415 streams.push_back(audio_stream());
436 streams.push_back(video_stream()); 416 streams.push_back(video_stream());
437 417
438 InitializeDemuxer(&streams); 418 InitializeDemuxer(&streams);
439 InitializeAudioDecoder(audio_stream()); 419 InitializeAudioDecoder(audio_stream());
440 InitializeAudioRenderer(); 420 InitializeAudioRenderer();
441 InitializeVideoDecoder(video_stream()); 421 InitializeVideoDecoder(video_stream());
442 InitializeVideoRenderer(); 422 InitializeVideoRenderer();
443 423
444 InitializePipeline(PIPELINE_OK); 424 InitializePipeline(PIPELINE_OK);
445 EXPECT_TRUE(pipeline_->IsInitialized());
446 EXPECT_TRUE(pipeline_->HasAudio()); 425 EXPECT_TRUE(pipeline_->HasAudio());
447 EXPECT_TRUE(pipeline_->HasVideo()); 426 EXPECT_TRUE(pipeline_->HasVideo());
448 } 427 }
449 428
450 TEST_F(PipelineTest, Seek) { 429 TEST_F(PipelineTest, Seek) {
451 CreateAudioStream(); 430 CreateAudioStream();
452 CreateVideoStream(); 431 CreateVideoStream();
453 MockDemuxerStreamVector streams; 432 MockDemuxerStreamVector streams;
454 streams.push_back(audio_stream()); 433 streams.push_back(audio_stream());
455 streams.push_back(video_stream()); 434 streams.push_back(video_stream());
456 435
457 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000)); 436 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000));
458 InitializeAudioDecoder(audio_stream()); 437 InitializeAudioDecoder(audio_stream());
459 InitializeAudioRenderer(); 438 InitializeAudioRenderer();
460 InitializeVideoDecoder(video_stream()); 439 InitializeVideoDecoder(video_stream());
461 InitializeVideoRenderer(); 440 InitializeVideoRenderer();
462 441
463 // Initialize then seek! 442 // Initialize then seek!
464 InitializePipeline(PIPELINE_OK); 443 InitializePipeline(PIPELINE_OK);
465 444
466 // Every filter should receive a call to Seek(). 445 // Every filter should receive a call to Seek().
467 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); 446 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000);
468 ExpectSeek(expected); 447 ExpectSeek(expected);
469 DoSeek(expected); 448 DoSeek(expected);
470 } 449 }
471 450
451 TEST_F(PipelineTest, Stop_DuringStart) {
452 base::Closure stop_cb = base::Bind(
453 &CallbackHelper::OnStop, base::Unretained(&callbacks_));
454
455 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
456 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunPipelineStatusCB1()));
457 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
458 .WillOnce(RunClosure());
459
460 // Start and stop callback should fire.
461 EXPECT_CALL(callbacks_, OnStop());
462 InitializePipeline(PIPELINE_OK);
463 }
464
465 TEST_F(PipelineTest, Stop_DuringPause) {
466 SetupErrorTest();
467 base::Closure stop_cb = base::Bind(
468 &CallbackHelper::OnStop, base::Unretained(&callbacks_));
469
470 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
471 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
472 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
473 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
474
475 // Seek and stop callbacks should fire.
476 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
477 EXPECT_CALL(callbacks_, OnStop());
478 pipeline_->Seek(base::TimeDelta::FromSeconds(10), base::Bind(
479 &CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
480 message_loop_.RunAllPending();
481 }
482
483 TEST_F(PipelineTest, Stop_DuringFlush) {
484 SetupErrorTest();
485 base::Closure stop_cb = base::Bind(
486 &CallbackHelper::OnStop, base::Unretained(&callbacks_));
487
488 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure());
489 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
490 .WillOnce(DoAll(Stop(pipeline_, stop_cb), RunClosure()));
491 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
492 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
493
494 // Seek and stop callbacks should fire.
495 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
496 EXPECT_CALL(callbacks_, OnStop());
497 pipeline_->Seek(base::TimeDelta::FromSeconds(10), base::Bind(
498 &CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
499 message_loop_.RunAllPending();
500 }
501
502 TEST_F(PipelineTest, Stop_DuringSeek) {
503 SetupErrorTest();
504 base::Closure stop_cb = base::Bind(
505 &CallbackHelper::OnStop, base::Unretained(&callbacks_));
506
507 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure());
508 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure());
509 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
510 .WillOnce(DoAll(Stop(pipeline_, stop_cb),
511 RunPipelineStatusCB1WithStatus(PIPELINE_OK)));
512 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(_, _))
513 .WillOnce(RunPipelineStatusCB1());
514 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
515 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
516
517 // Seek and stop callbacks should fire.
518 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
519 EXPECT_CALL(callbacks_, OnStop());
520 pipeline_->Seek(base::TimeDelta::FromSeconds(10), base::Bind(
521 &CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
522 message_loop_.RunAllPending();
523 }
524
525 TEST_F(PipelineTest, Stop_DuringPlayback) {
526 SetupErrorTest();
527
528 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
529 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
530
531 // Stop callback should fire but nothing else.
532 EXPECT_CALL(callbacks_, OnStop());
533 pipeline_->Stop(base::Bind(
534 &CallbackHelper::OnStop, base::Unretained(&callbacks_)));
535 message_loop_.RunAllPending();
536 }
537
538 TEST_F(PipelineTest, Error_DuringStart) {
539 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
540 .WillOnce(RunPipelineStatusCB1WithStatus(PIPELINE_ERROR_READ));
541 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
542 .WillOnce(RunClosure());
543
544 // Start callback should fire with error but nothing else.
545 InitializePipeline(PIPELINE_ERROR_READ);
546 }
547
548 TEST_F(PipelineTest, Error_DuringPause) {
549 SetupErrorTest();
550
551 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
552 .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ), RunClosure()));
553 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
554 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
555
556 // Seek callback should fire with error but nothing else.
557 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
558 pipeline_->Seek(base::TimeDelta::FromSeconds(10), base::Bind(
559 &CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
560 message_loop_.RunAllPending();
561 }
562
563 TEST_F(PipelineTest, Error_DuringFlush) {
564 SetupErrorTest();
565
566 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure());
567 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
568 .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ), RunClosure()));
569 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
570 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
571
572 // Seek callback should fire with error but nothing else.
573 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
574 pipeline_->Seek(base::TimeDelta::FromSeconds(10), base::Bind(
575 &CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
576 message_loop_.RunAllPending();
577 }
578
579 TEST_F(PipelineTest, Error_DuringSeek) {
580 SetupErrorTest();
581
582 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)).WillOnce(RunClosure());
583 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)).WillOnce(RunClosure());
584 EXPECT_CALL(*mocks_->demuxer(), Seek(_, _))
585 .WillOnce(RunPipelineStatusCB1WithStatus(PIPELINE_ERROR_READ));
586 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
587 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
588
589 // Seek callback fire with error but nothing else.
590 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
591 pipeline_->Seek(base::TimeDelta::FromSeconds(10), base::Bind(
592 &CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
593 message_loop_.RunAllPending();
594 }
595
596 TEST_F(PipelineTest, Error_DuringPlayback) {
597 SetupErrorTest();
598
599 EXPECT_CALL(*mocks_->demuxer(), Stop(_)).WillOnce(RunClosure());
600 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
601
602 // Error callback should fire but nothing else.
603 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ));
604 pipeline_->SetErrorForTesting(PIPELINE_ERROR_READ);
605 message_loop_.RunAllPending();
606 }
607
608 TEST_F(PipelineTest, Error_DuringStop) {
609 SetupErrorTest();
610
611 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
612 .WillOnce(DoAll(SetError(pipeline_, PIPELINE_ERROR_READ), RunClosure()));
613 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_)).WillOnce(RunClosure());
614
615 // No error callback should fire.
616 EXPECT_CALL(callbacks_, OnStop());
617 pipeline_->Stop(base::Bind(&CallbackHelper::OnStop,
618 base::Unretained(&callbacks_)));
619 message_loop_.RunAllPending();
620 }
621
472 TEST_F(PipelineTest, SetVolume) { 622 TEST_F(PipelineTest, SetVolume) {
473 CreateAudioStream(); 623 CreateAudioStream();
474 MockDemuxerStreamVector streams; 624 MockDemuxerStreamVector streams;
475 streams.push_back(audio_stream()); 625 streams.push_back(audio_stream());
476 626
477 InitializeDemuxer(&streams); 627 InitializeDemuxer(&streams);
478 InitializeAudioDecoder(audio_stream()); 628 InitializeAudioDecoder(audio_stream());
479 InitializeAudioRenderer(); 629 InitializeAudioRenderer();
480 630
481 // The audio renderer should receive a call to SetVolume(). 631 // The audio renderer should receive a call to SetVolume().
482 float expected = 0.5f; 632 float expected = 0.5f;
483 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(expected)); 633 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(expected));
484 634
485 // Initialize then set volume! 635 // Initialize then set volume!
486 InitializePipeline(PIPELINE_OK); 636 InitializePipeline(PIPELINE_OK);
487 pipeline_->SetVolume(expected); 637 pipeline_->SetVolume(expected);
488 } 638 }
489 639
490 TEST_F(PipelineTest, Properties) { 640 TEST_F(PipelineTest, Properties) {
491 CreateVideoStream(); 641 CreateVideoStream();
492 MockDemuxerStreamVector streams; 642 MockDemuxerStreamVector streams;
493 streams.push_back(video_stream()); 643 streams.push_back(video_stream());
494 644
495 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); 645 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100);
496 InitializeDemuxer(&streams, kDuration); 646 InitializeDemuxer(&streams, kDuration);
497 InitializeVideoDecoder(video_stream()); 647 InitializeVideoDecoder(video_stream());
498 InitializeVideoRenderer(); 648 InitializeVideoRenderer();
499 649
500 InitializePipeline(PIPELINE_OK); 650 InitializePipeline(PIPELINE_OK);
501 EXPECT_TRUE(pipeline_->IsInitialized());
502 EXPECT_EQ(kDuration.ToInternalValue(), 651 EXPECT_EQ(kDuration.ToInternalValue(),
503 pipeline_->GetMediaDuration().ToInternalValue()); 652 pipeline_->GetMediaDuration().ToInternalValue());
504 EXPECT_EQ(kTotalBytes, pipeline_->GetTotalBytes()); 653 EXPECT_EQ(kTotalBytes, pipeline_->GetTotalBytes());
505 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 654 EXPECT_FALSE(pipeline_->DidLoadingProgress());
506 } 655 }
507 656
508 TEST_F(PipelineTest, GetBufferedTimeRanges) { 657 TEST_F(PipelineTest, GetBufferedTimeRanges) {
509 CreateVideoStream(); 658 CreateVideoStream();
510 MockDemuxerStreamVector streams; 659 MockDemuxerStreamVector streams;
511 streams.push_back(video_stream()); 660 streams.push_back(video_stream());
512 661
513 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); 662 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100);
514 InitializeDemuxer(&streams, kDuration); 663 InitializeDemuxer(&streams, kDuration);
515 InitializeVideoDecoder(video_stream()); 664 InitializeVideoDecoder(video_stream());
516 InitializeVideoRenderer(); 665 InitializeVideoRenderer();
517 666
518 InitializePipeline(PIPELINE_OK); 667 InitializePipeline(PIPELINE_OK);
519 EXPECT_TRUE(pipeline_->IsInitialized());
520 668
521 EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size()); 669 EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size());
522 670
523 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 671 EXPECT_FALSE(pipeline_->DidLoadingProgress());
524 pipeline_->AddBufferedByteRange(0, kTotalBytes / 8); 672 pipeline_->AddBufferedByteRange(0, kTotalBytes / 8);
525 EXPECT_TRUE(pipeline_->DidLoadingProgress()); 673 EXPECT_TRUE(pipeline_->DidLoadingProgress());
526 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 674 EXPECT_FALSE(pipeline_->DidLoadingProgress());
527 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 675 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size());
528 EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0)); 676 EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0));
529 EXPECT_EQ(kDuration / 8, pipeline_->GetBufferedTimeRanges().end(0)); 677 EXPECT_EQ(kDuration / 8, pipeline_->GetBufferedTimeRanges().end(0));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 streams.push_back(audio_stream()); 713 streams.push_back(audio_stream());
566 streams.push_back(video_stream()); 714 streams.push_back(video_stream());
567 715
568 InitializeDemuxer(&streams); 716 InitializeDemuxer(&streams);
569 InitializeAudioDecoder(audio_stream()); 717 InitializeAudioDecoder(audio_stream());
570 InitializeAudioRenderer(); 718 InitializeAudioRenderer();
571 InitializeVideoDecoder(video_stream()); 719 InitializeVideoDecoder(video_stream());
572 InitializeVideoRenderer(); 720 InitializeVideoRenderer();
573 721
574 InitializePipeline(PIPELINE_OK); 722 InitializePipeline(PIPELINE_OK);
575 EXPECT_TRUE(pipeline_->IsInitialized());
576 EXPECT_TRUE(pipeline_->HasAudio()); 723 EXPECT_TRUE(pipeline_->HasAudio());
577 EXPECT_TRUE(pipeline_->HasVideo()); 724 EXPECT_TRUE(pipeline_->HasVideo());
578 725
579 EXPECT_CALL(*mocks_->demuxer(), OnAudioRendererDisabled()); 726 EXPECT_CALL(*mocks_->demuxer(), OnAudioRendererDisabled());
580 pipeline_->OnAudioDisabled(); 727 pipeline_->OnAudioDisabled();
581 728
582 // Verify that ended event is fired when video ends. 729 // Verify that ended event is fired when video ends.
583 EXPECT_CALL(*mocks_->video_renderer(), HasEnded()) 730 EXPECT_CALL(*mocks_->video_renderer(), HasEnded())
584 .WillOnce(Return(true)); 731 .WillOnce(Return(true));
585 EXPECT_CALL(callbacks_, OnEnded(PIPELINE_OK)); 732 EXPECT_CALL(callbacks_, OnEnded(PIPELINE_OK));
(...skipping 10 matching lines...) Expand all
596 InitializeDemuxer(&streams); 743 InitializeDemuxer(&streams);
597 InitializeAudioDecoder(audio_stream()); 744 InitializeAudioDecoder(audio_stream());
598 InitializeAudioRenderer(true); 745 InitializeAudioRenderer(true);
599 InitializeVideoDecoder(video_stream()); 746 InitializeVideoDecoder(video_stream());
600 InitializeVideoRenderer(); 747 InitializeVideoRenderer();
601 748
602 EXPECT_CALL(*mocks_->demuxer(), 749 EXPECT_CALL(*mocks_->demuxer(),
603 OnAudioRendererDisabled()); 750 OnAudioRendererDisabled());
604 751
605 InitializePipeline(PIPELINE_OK); 752 InitializePipeline(PIPELINE_OK);
606 EXPECT_TRUE(pipeline_->IsInitialized());
607 EXPECT_FALSE(pipeline_->HasAudio()); 753 EXPECT_FALSE(pipeline_->HasAudio());
608 EXPECT_TRUE(pipeline_->HasVideo()); 754 EXPECT_TRUE(pipeline_->HasVideo());
609 755
610 // Verify that ended event is fired when video ends. 756 // Verify that ended event is fired when video ends.
611 EXPECT_CALL(*mocks_->video_renderer(), HasEnded()) 757 EXPECT_CALL(*mocks_->video_renderer(), HasEnded())
612 .WillOnce(Return(true)); 758 .WillOnce(Return(true));
613 EXPECT_CALL(callbacks_, OnEnded(PIPELINE_OK)); 759 EXPECT_CALL(callbacks_, OnEnded(PIPELINE_OK));
614 pipeline_->OnRendererEnded(); 760 pipeline_->OnRendererEnded();
615 } 761 }
616 762
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 854
709 // Signal end of video stream and make sure OnEnded() callback occurs. 855 // Signal end of video stream and make sure OnEnded() callback occurs.
710 EXPECT_CALL(*mocks_->audio_renderer(), HasEnded()) 856 EXPECT_CALL(*mocks_->audio_renderer(), HasEnded())
711 .WillOnce(Return(true)); 857 .WillOnce(Return(true));
712 EXPECT_CALL(*mocks_->video_renderer(), HasEnded()) 858 EXPECT_CALL(*mocks_->video_renderer(), HasEnded())
713 .WillOnce(Return(true)); 859 .WillOnce(Return(true));
714 EXPECT_CALL(callbacks_, OnEnded(PIPELINE_OK)); 860 EXPECT_CALL(callbacks_, OnEnded(PIPELINE_OK));
715 pipeline_->OnRendererEnded(); 861 pipeline_->OnRendererEnded();
716 } 862 }
717 863
718 TEST_F(PipelineTest, ErrorDuringSeek) {
scherkus (not reviewing) 2012/07/28 02:26:07 test moved up above
719 CreateAudioStream();
720 MockDemuxerStreamVector streams;
721 streams.push_back(audio_stream());
722
723 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(10));
724 InitializeAudioDecoder(audio_stream());
725 InitializeAudioRenderer();
726 InitializePipeline(PIPELINE_OK);
727
728 float playback_rate = 1.0f;
729 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate));
730 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate));
731 pipeline_->SetPlaybackRate(playback_rate);
732 message_loop_.RunAllPending();
733
734 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
735
736 // Seek() isn't called as the demuxer errors out first.
737 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
738 .WillOnce(RunClosure());
739 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
740 .WillOnce(RunClosure());
741 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
742 .WillOnce(RunClosure());
743
744 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
745 .WillOnce(RunPipelineStatusCB1WithStatus(PIPELINE_ERROR_READ));
746 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
747 .WillOnce(RunClosure());
748
749 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek,
750 base::Unretained(&callbacks_)));
751 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
752 message_loop_.RunAllPending();
753 }
754
755 // Invoked function OnError. This asserts that the pipeline does not enqueue 864 // Invoked function OnError. This asserts that the pipeline does not enqueue
756 // non-teardown related tasks while tearing down. 865 // non-teardown related tasks while tearing down.
757 static void TestNoCallsAfterError( 866 static void TestNoCallsAfterError(
758 Pipeline* pipeline, MessageLoop* message_loop, 867 Pipeline* pipeline, MessageLoop* message_loop,
759 PipelineStatus /* status */) { 868 PipelineStatus /* status */) {
760 CHECK(pipeline); 869 CHECK(pipeline);
761 CHECK(message_loop); 870 CHECK(message_loop);
762 871
763 // When we get to this stage, the message loop should be empty. 872 // When we get to this stage, the message loop should be empty.
764 message_loop->AssertIdle(); 873 message_loop->AssertIdle();
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
812 CreateVideoStream(); 921 CreateVideoStream();
813 MockDemuxerStreamVector streams; 922 MockDemuxerStreamVector streams;
814 streams.push_back(video_stream()); 923 streams.push_back(video_stream());
815 924
816 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); 925 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100);
817 InitializeDemuxer(&streams, kDuration); 926 InitializeDemuxer(&streams, kDuration);
818 InitializeVideoDecoder(video_stream()); 927 InitializeVideoDecoder(video_stream());
819 InitializeVideoRenderer(); 928 InitializeVideoRenderer();
820 929
821 InitializePipeline(PIPELINE_OK); 930 InitializePipeline(PIPELINE_OK);
822 EXPECT_TRUE(pipeline_->IsInitialized());
823 EXPECT_FALSE(pipeline_->HasAudio()); 931 EXPECT_FALSE(pipeline_->HasAudio());
824 EXPECT_TRUE(pipeline_->HasVideo()); 932 EXPECT_TRUE(pipeline_->HasVideo());
825 933
826 EXPECT_EQ(base::TimeDelta(), pipeline_->GetMediaTime()); 934 EXPECT_EQ(base::TimeDelta(), pipeline_->GetMediaTime());
827 } 935 }
828 936
829 TEST_F(PipelineTest, StartTimeIsNonZero) { 937 TEST_F(PipelineTest, StartTimeIsNonZero) {
830 const base::TimeDelta kStartTime = base::TimeDelta::FromSeconds(4); 938 const base::TimeDelta kStartTime = base::TimeDelta::FromSeconds(4);
831 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); 939 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100);
832 940
833 EXPECT_CALL(*mocks_->demuxer(), GetStartTime()) 941 EXPECT_CALL(*mocks_->demuxer(), GetStartTime())
834 .WillRepeatedly(Return(kStartTime)); 942 .WillRepeatedly(Return(kStartTime));
835 943
836 CreateVideoStream(); 944 CreateVideoStream();
837 MockDemuxerStreamVector streams; 945 MockDemuxerStreamVector streams;
838 streams.push_back(video_stream()); 946 streams.push_back(video_stream());
839 947
840 InitializeDemuxer(&streams, kDuration); 948 InitializeDemuxer(&streams, kDuration);
841 InitializeVideoDecoder(video_stream()); 949 InitializeVideoDecoder(video_stream());
842 InitializeVideoRenderer(); 950 InitializeVideoRenderer();
843 951
844 InitializePipeline(PIPELINE_OK); 952 InitializePipeline(PIPELINE_OK);
845 EXPECT_TRUE(pipeline_->IsInitialized());
846 EXPECT_FALSE(pipeline_->HasAudio()); 953 EXPECT_FALSE(pipeline_->HasAudio());
847 EXPECT_TRUE(pipeline_->HasVideo()); 954 EXPECT_TRUE(pipeline_->HasVideo());
848 955
849 EXPECT_EQ(kStartTime, pipeline_->GetMediaTime()); 956 EXPECT_EQ(kStartTime, pipeline_->GetMediaTime());
850 } 957 }
851 958
852 static void RunTimeCB(const AudioRenderer::TimeCB& time_cb, 959 static void RunTimeCB(const AudioRenderer::TimeCB& time_cb,
853 int time_in_ms, 960 int time_in_ms,
854 int max_time_in_ms) { 961 int max_time_in_ms) {
855 time_cb.Run(base::TimeDelta::FromMilliseconds(time_in_ms), 962 time_cb.Run(base::TimeDelta::FromMilliseconds(time_in_ms),
(...skipping 23 matching lines...) Expand all
879 986
880 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); 987 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
881 988
882 // Arrange to trigger a time update while the demuxer is in the middle of 989 // Arrange to trigger a time update while the demuxer is in the middle of
883 // seeking. This update should be ignored by the pipeline and the clock should 990 // seeking. This update should be ignored by the pipeline and the clock should
884 // not get updated. 991 // not get updated.
885 base::Closure closure = base::Bind(&RunTimeCB, audio_time_cb_, 300, 700); 992 base::Closure closure = base::Bind(&RunTimeCB, audio_time_cb_, 300, 700);
886 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _)) 993 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, _))
887 .WillOnce(DoAll(InvokeWithoutArgs(&closure, &base::Closure::Run), 994 .WillOnce(DoAll(InvokeWithoutArgs(&closure, &base::Closure::Run),
888 RunPipelineStatusCB1())); 995 RunPipelineStatusCB1()));
996 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate));
889 997
890 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_)) 998 EXPECT_CALL(*mocks_->audio_renderer(), Pause(_))
891 .WillOnce(RunClosure()); 999 .WillOnce(RunClosure());
892 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_)) 1000 EXPECT_CALL(*mocks_->audio_renderer(), Flush(_))
893 .WillOnce(RunClosure()); 1001 .WillOnce(RunClosure());
894 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _)) 1002 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(seek_time, _))
895 .WillOnce(RunPipelineStatusCB1()); 1003 .WillOnce(RunPipelineStatusCB1());
1004 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate));
1005 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(_));
896 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 1006 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
897 .WillOnce(RunClosure()); 1007 .WillOnce(RunClosure());
898 1008
899 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); 1009 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
900 DoSeek(seek_time); 1010 DoSeek(seek_time);
901 1011
902 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time); 1012 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time);
903 1013
904 // Now that the seek is complete, verify that time updates advance the current 1014 // Now that the seek is complete, verify that time updates advance the current
905 // time. 1015 // time.
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
956 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(0)); 1066 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(0));
957 } 1067 }
958 1068
959 // Test that different-thread, some-delay callback (the expected common case) 1069 // Test that different-thread, some-delay callback (the expected common case)
960 // works correctly. 1070 // works correctly.
961 TEST(PipelineStatusNotificationTest, DelayedCallback) { 1071 TEST(PipelineStatusNotificationTest, DelayedCallback) {
962 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(20)); 1072 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(20));
963 } 1073 }
964 1074
965 } // namespace media 1075 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698