Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/stl_util-inl.h" | 8 #include "base/stl_util-inl.h" |
| 9 #include "media/base/pipeline_impl.h" | 9 #include "media/base/pipeline_impl.h" |
| 10 #include "media/base/media_format.h" | 10 #include "media/base/media_format.h" |
| 11 #include "media/base/filters.h" | 11 #include "media/base/filters.h" |
| 12 #include "media/base/filter_host.h" | 12 #include "media/base/filter_host.h" |
| 13 #include "media/base/mock_callback.h" | 13 #include "media/base/mock_callback.h" |
| 14 #include "media/base/mock_filters.h" | 14 #include "media/base/mock_filters.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 16 |
| 17 using ::testing::_; | 17 using ::testing::_; |
| 18 using ::testing::DeleteArg; | 18 using ::testing::DeleteArg; |
| 19 using ::testing::InSequence; | 19 using ::testing::InSequence; |
| 20 using ::testing::Invoke; | 20 using ::testing::Invoke; |
| 21 using ::testing::InvokeArgument; | |
|
acolwell GONE FROM CHROMIUM
2011/03/08 21:48:09
Is this still needed?
Ami GONE FROM CHROMIUM
2011/03/08 22:44:48
Nope, deleted.
| |
| 21 using ::testing::Mock; | 22 using ::testing::Mock; |
| 22 using ::testing::NotNull; | 23 using ::testing::NotNull; |
| 23 using ::testing::Return; | 24 using ::testing::Return; |
| 24 using ::testing::ReturnRef; | 25 using ::testing::ReturnRef; |
| 25 using ::testing::StrictMock; | 26 using ::testing::StrictMock; |
| 26 | 27 |
| 27 namespace { | 28 namespace { |
| 28 | 29 |
| 29 // Total bytes of the data source. | 30 // Total bytes of the data source. |
| 30 const int kTotalBytes = 1024; | 31 const int kTotalBytes = 1024; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 83 &CallbackHelper::OnStop)); | 84 &CallbackHelper::OnStop)); |
| 84 message_loop_.RunAllPending(); | 85 message_loop_.RunAllPending(); |
| 85 | 86 |
| 86 // Free allocated media formats (if any). | 87 // Free allocated media formats (if any). |
| 87 STLDeleteElements(&stream_media_formats_); | 88 STLDeleteElements(&stream_media_formats_); |
| 88 | 89 |
| 89 mocks_.reset(); | 90 mocks_.reset(); |
| 90 } | 91 } |
| 91 | 92 |
| 92 protected: | 93 protected: |
| 93 // Sets up expectations to allow the data source to initialize. | |
| 94 void InitializeDataSource() { | |
| 95 mocks_->data_source()->SetTotalAndBufferedBytes(kTotalBytes, | |
| 96 kBufferedBytes); | |
| 97 | |
| 98 EXPECT_CALL(*mocks_->data_source(), SetPlaybackRate(0.0f)); | |
| 99 EXPECT_CALL(*mocks_->data_source(), Seek(base::TimeDelta(), NotNull())) | |
| 100 .WillOnce(Invoke(&RunFilterCallback)); | |
| 101 EXPECT_CALL(*mocks_->data_source(), Stop(NotNull())) | |
| 102 .WillOnce(Invoke(&RunStopFilterCallback)); | |
| 103 } | |
| 104 | |
| 105 // Sets up expectations to allow the demuxer to initialize. | 94 // Sets up expectations to allow the demuxer to initialize. |
| 106 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; | 95 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; |
| 107 void InitializeDemuxer(MockDemuxerStreamVector* streams, | 96 void InitializeDemuxer(MockDemuxerStreamVector* streams, |
| 108 const base::TimeDelta& duration) { | 97 const base::TimeDelta& duration) { |
| 109 EXPECT_CALL(*mocks_->demuxer(), | 98 mocks_->demuxer()->SetTotalAndBufferedBytesAndDuration( |
| 110 Initialize(mocks_->data_source(), NotNull())) | 99 kTotalBytes, kBufferedBytes, duration); |
| 111 .WillOnce(DoAll(SetDuration(mocks_->data_source(), duration), | |
| 112 Invoke(&RunFilterCallback))); | |
| 113 EXPECT_CALL(*mocks_->demuxer(), GetNumberOfStreams()) | 100 EXPECT_CALL(*mocks_->demuxer(), GetNumberOfStreams()) |
| 114 .WillRepeatedly(Return(streams->size())); | 101 .WillRepeatedly(Return(streams->size())); |
| 115 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f)); | 102 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f)); |
| 116 EXPECT_CALL(*mocks_->demuxer(), Seek(base::TimeDelta(), NotNull())) | 103 EXPECT_CALL(*mocks_->demuxer(), Seek(base::TimeDelta(), NotNull())) |
| 117 .WillOnce(Invoke(&RunFilterCallback)); | 104 .WillOnce(Invoke(&RunFilterCallback)); |
| 118 EXPECT_CALL(*mocks_->demuxer(), Stop(NotNull())) | 105 EXPECT_CALL(*mocks_->demuxer(), Stop(NotNull())) |
| 119 .WillOnce(Invoke(&RunStopFilterCallback)); | 106 .WillOnce(Invoke(&RunStopFilterCallback)); |
| 120 | 107 |
| 121 // Configure the demuxer to return the streams. | 108 // Configure the demuxer to return the streams. |
| 122 for (size_t i = 0; i < streams->size(); ++i) { | 109 for (size_t i = 0; i < streams->size(); ++i) { |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 225 MockDemuxerStream* audio_stream() { | 212 MockDemuxerStream* audio_stream() { |
| 226 return audio_stream_; | 213 return audio_stream_; |
| 227 } | 214 } |
| 228 | 215 |
| 229 MockDemuxerStream* video_stream() { | 216 MockDemuxerStream* video_stream() { |
| 230 return video_stream_; | 217 return video_stream_; |
| 231 } | 218 } |
| 232 | 219 |
| 233 void ExpectSeek(const base::TimeDelta& seek_time) { | 220 void ExpectSeek(const base::TimeDelta& seek_time) { |
| 234 // Every filter should receive a call to Seek(). | 221 // Every filter should receive a call to Seek(). |
| 235 EXPECT_CALL(*mocks_->data_source(), Seek(seek_time, NotNull())) | |
| 236 .WillOnce(Invoke(&RunFilterCallback)); | |
| 237 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, NotNull())) | 222 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, NotNull())) |
| 238 .WillOnce(Invoke(&RunFilterCallback)); | 223 .WillOnce(Invoke(&RunFilterCallback)); |
| 239 | 224 |
| 240 if (audio_stream_) { | 225 if (audio_stream_) { |
| 241 EXPECT_CALL(*mocks_->audio_decoder(), Seek(seek_time, NotNull())) | 226 EXPECT_CALL(*mocks_->audio_decoder(), Seek(seek_time, NotNull())) |
| 242 .WillOnce(Invoke(&RunFilterCallback)); | 227 .WillOnce(Invoke(&RunFilterCallback)); |
| 243 EXPECT_CALL(*mocks_->audio_renderer(), Seek(seek_time, NotNull())) | 228 EXPECT_CALL(*mocks_->audio_renderer(), Seek(seek_time, NotNull())) |
| 244 .WillOnce(Invoke(&RunFilterCallback)); | 229 .WillOnce(Invoke(&RunFilterCallback)); |
| 245 } | 230 } |
| 246 | 231 |
| 247 if (video_stream_) { | 232 if (video_stream_) { |
| 248 EXPECT_CALL(*mocks_->video_decoder(), Seek(seek_time, NotNull())) | 233 EXPECT_CALL(*mocks_->video_decoder(), Seek(seek_time, NotNull())) |
| 249 .WillOnce(Invoke(&RunFilterCallback)); | 234 .WillOnce(Invoke(&RunFilterCallback)); |
| 250 EXPECT_CALL(*mocks_->video_renderer(), Seek(seek_time, NotNull())) | 235 EXPECT_CALL(*mocks_->video_renderer(), Seek(seek_time, NotNull())) |
| 251 .WillOnce(Invoke(&RunFilterCallback)); | 236 .WillOnce(Invoke(&RunFilterCallback)); |
| 252 } | 237 } |
| 253 | 238 |
| 254 // We expect a successful seek callback. | 239 // We expect a successful seek callback. |
| 255 EXPECT_CALL(callbacks_, OnSeek()); | 240 EXPECT_CALL(callbacks_, OnSeek()); |
| 256 | 241 |
| 257 } | 242 } |
| 258 | 243 |
| 259 void DoSeek(const base::TimeDelta& seek_time) { | 244 void DoSeek(const base::TimeDelta& seek_time) { |
| 260 pipeline_->Seek(seek_time, | 245 pipeline_->Seek(seek_time, |
| 261 NewCallback(reinterpret_cast<CallbackHelper*>(&callbacks_), | 246 NewCallback(reinterpret_cast<CallbackHelper*>(&callbacks_), |
| 262 &CallbackHelper::OnSeek)); | 247 &CallbackHelper::OnSeek)); |
| 263 | 248 |
| 264 // We expect the time to be updated only after the seek has completed. | 249 // We expect the time to be updated only after the seek has completed. |
| 265 EXPECT_TRUE(seek_time != pipeline_->GetCurrentTime()); | 250 EXPECT_NE(seek_time, pipeline_->GetCurrentTime()); |
| 266 message_loop_.RunAllPending(); | 251 message_loop_.RunAllPending(); |
| 267 EXPECT_TRUE(seek_time == pipeline_->GetCurrentTime()); | 252 EXPECT_EQ(seek_time, pipeline_->GetCurrentTime()); |
| 268 } | 253 } |
| 269 | 254 |
| 270 // Fixture members. | 255 // Fixture members. |
| 271 StrictMock<CallbackHelper> callbacks_; | 256 StrictMock<CallbackHelper> callbacks_; |
| 272 MessageLoop message_loop_; | 257 MessageLoop message_loop_; |
| 273 scoped_refptr<PipelineImpl> pipeline_; | 258 scoped_refptr<PipelineImpl> pipeline_; |
| 274 scoped_ptr<media::MockFilterCollection> mocks_; | 259 scoped_ptr<media::MockFilterCollection> mocks_; |
| 275 scoped_refptr<StrictMock<MockDemuxerStream> > audio_stream_; | 260 scoped_refptr<StrictMock<MockDemuxerStream> > audio_stream_; |
| 276 scoped_refptr<StrictMock<MockDemuxerStream> > video_stream_; | 261 scoped_refptr<StrictMock<MockDemuxerStream> > video_stream_; |
| 277 | 262 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 378 EXPECT_CALL(callbacks_, OnError()); | 363 EXPECT_CALL(callbacks_, OnError()); |
| 379 | 364 |
| 380 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND); | 365 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND); |
| 381 EXPECT_FALSE(pipeline_->IsInitialized()); | 366 EXPECT_FALSE(pipeline_->IsInitialized()); |
| 382 EXPECT_EQ(PIPELINE_ERROR_URL_NOT_FOUND, pipeline_->GetError()); | 367 EXPECT_EQ(PIPELINE_ERROR_URL_NOT_FOUND, pipeline_->GetError()); |
| 383 } | 368 } |
| 384 | 369 |
| 385 TEST_F(PipelineImplTest, NoStreams) { | 370 TEST_F(PipelineImplTest, NoStreams) { |
| 386 // Manually set these expectations because SetPlaybackRate() is not called if | 371 // Manually set these expectations because SetPlaybackRate() is not called if |
| 387 // we cannot fully initialize the pipeline. | 372 // we cannot fully initialize the pipeline. |
| 388 EXPECT_CALL(*mocks_->data_source(), Stop(NotNull())) | |
| 389 .WillOnce(Invoke(&RunStopFilterCallback)); | |
| 390 | |
| 391 EXPECT_CALL(*mocks_->demuxer(), Initialize(mocks_->data_source(), NotNull())) | |
| 392 .WillOnce(Invoke(&RunFilterCallback)); | |
| 393 EXPECT_CALL(*mocks_->demuxer(), GetNumberOfStreams()) | 373 EXPECT_CALL(*mocks_->demuxer(), GetNumberOfStreams()) |
| 394 .WillRepeatedly(Return(0)); | 374 .WillRepeatedly(Return(0)); |
| 395 EXPECT_CALL(*mocks_->demuxer(), Stop(NotNull())) | 375 EXPECT_CALL(*mocks_->demuxer(), Stop(NotNull())) |
| 396 .WillOnce(Invoke(&RunStopFilterCallback)); | 376 .WillOnce(Invoke(&RunStopFilterCallback)); |
| 397 EXPECT_CALL(callbacks_, OnError()); | 377 EXPECT_CALL(callbacks_, OnError()); |
| 398 | 378 |
| 399 InitializePipeline(); | 379 InitializePipeline(); |
| 400 EXPECT_FALSE(pipeline_->IsInitialized()); | 380 EXPECT_FALSE(pipeline_->IsInitialized()); |
| 401 EXPECT_EQ(PIPELINE_ERROR_COULD_NOT_RENDER, pipeline_->GetError()); | 381 EXPECT_EQ(PIPELINE_ERROR_COULD_NOT_RENDER, pipeline_->GetError()); |
| 402 } | 382 } |
| 403 | 383 |
| 404 TEST_F(PipelineImplTest, AudioStream) { | 384 TEST_F(PipelineImplTest, AudioStream) { |
| 405 CreateAudioStream(); | 385 CreateAudioStream(); |
| 406 MockDemuxerStreamVector streams; | 386 MockDemuxerStreamVector streams; |
| 407 streams.push_back(audio_stream()); | 387 streams.push_back(audio_stream()); |
| 408 | 388 |
| 409 InitializeDataSource(); | |
| 410 InitializeDemuxer(&streams, base::TimeDelta()); | 389 InitializeDemuxer(&streams, base::TimeDelta()); |
| 411 InitializeAudioDecoder(audio_stream()); | 390 InitializeAudioDecoder(audio_stream()); |
| 412 InitializeAudioRenderer(); | 391 InitializeAudioRenderer(); |
| 413 | 392 |
| 414 InitializePipeline(); | 393 InitializePipeline(); |
| 415 EXPECT_TRUE(pipeline_->IsInitialized()); | 394 EXPECT_TRUE(pipeline_->IsInitialized()); |
| 416 EXPECT_EQ(PIPELINE_OK, pipeline_->GetError()); | 395 EXPECT_EQ(PIPELINE_OK, pipeline_->GetError()); |
| 417 EXPECT_TRUE(pipeline_->IsRendered(media::mime_type::kMajorTypeAudio)); | 396 EXPECT_TRUE(pipeline_->IsRendered(media::mime_type::kMajorTypeAudio)); |
| 418 EXPECT_FALSE(pipeline_->IsRendered(media::mime_type::kMajorTypeVideo)); | 397 EXPECT_FALSE(pipeline_->IsRendered(media::mime_type::kMajorTypeVideo)); |
| 419 } | 398 } |
| 420 | 399 |
| 421 TEST_F(PipelineImplTest, VideoStream) { | 400 TEST_F(PipelineImplTest, VideoStream) { |
| 422 CreateVideoStream(); | 401 CreateVideoStream(); |
| 423 MockDemuxerStreamVector streams; | 402 MockDemuxerStreamVector streams; |
| 424 streams.push_back(video_stream()); | 403 streams.push_back(video_stream()); |
| 425 | 404 |
| 426 InitializeDataSource(); | |
| 427 InitializeDemuxer(&streams, base::TimeDelta()); | 405 InitializeDemuxer(&streams, base::TimeDelta()); |
| 428 InitializeVideoDecoder(video_stream()); | 406 InitializeVideoDecoder(video_stream()); |
| 429 InitializeVideoRenderer(); | 407 InitializeVideoRenderer(); |
| 430 | 408 |
| 431 InitializePipeline(); | 409 InitializePipeline(); |
| 432 EXPECT_TRUE(pipeline_->IsInitialized()); | 410 EXPECT_TRUE(pipeline_->IsInitialized()); |
| 433 EXPECT_EQ(PIPELINE_OK, pipeline_->GetError()); | 411 EXPECT_EQ(PIPELINE_OK, pipeline_->GetError()); |
| 434 EXPECT_FALSE(pipeline_->IsRendered(media::mime_type::kMajorTypeAudio)); | 412 EXPECT_FALSE(pipeline_->IsRendered(media::mime_type::kMajorTypeAudio)); |
| 435 EXPECT_TRUE(pipeline_->IsRendered(media::mime_type::kMajorTypeVideo)); | 413 EXPECT_TRUE(pipeline_->IsRendered(media::mime_type::kMajorTypeVideo)); |
| 436 } | 414 } |
| 437 | 415 |
| 438 TEST_F(PipelineImplTest, AudioVideoStream) { | 416 TEST_F(PipelineImplTest, AudioVideoStream) { |
| 439 CreateAudioStream(); | 417 CreateAudioStream(); |
| 440 CreateVideoStream(); | 418 CreateVideoStream(); |
| 441 MockDemuxerStreamVector streams; | 419 MockDemuxerStreamVector streams; |
| 442 streams.push_back(audio_stream()); | 420 streams.push_back(audio_stream()); |
| 443 streams.push_back(video_stream()); | 421 streams.push_back(video_stream()); |
| 444 | 422 |
| 445 InitializeDataSource(); | |
| 446 InitializeDemuxer(&streams, base::TimeDelta()); | 423 InitializeDemuxer(&streams, base::TimeDelta()); |
| 447 InitializeAudioDecoder(audio_stream()); | 424 InitializeAudioDecoder(audio_stream()); |
| 448 InitializeAudioRenderer(); | 425 InitializeAudioRenderer(); |
| 449 InitializeVideoDecoder(video_stream()); | 426 InitializeVideoDecoder(video_stream()); |
| 450 InitializeVideoRenderer(); | 427 InitializeVideoRenderer(); |
| 451 | 428 |
| 452 InitializePipeline(); | 429 InitializePipeline(); |
| 453 EXPECT_TRUE(pipeline_->IsInitialized()); | 430 EXPECT_TRUE(pipeline_->IsInitialized()); |
| 454 EXPECT_EQ(PIPELINE_OK, pipeline_->GetError()); | 431 EXPECT_EQ(PIPELINE_OK, pipeline_->GetError()); |
| 455 EXPECT_TRUE(pipeline_->IsRendered(media::mime_type::kMajorTypeAudio)); | 432 EXPECT_TRUE(pipeline_->IsRendered(media::mime_type::kMajorTypeAudio)); |
| 456 EXPECT_TRUE(pipeline_->IsRendered(media::mime_type::kMajorTypeVideo)); | 433 EXPECT_TRUE(pipeline_->IsRendered(media::mime_type::kMajorTypeVideo)); |
| 457 } | 434 } |
| 458 | 435 |
| 459 TEST_F(PipelineImplTest, Seek) { | 436 TEST_F(PipelineImplTest, Seek) { |
| 460 CreateAudioStream(); | 437 CreateAudioStream(); |
| 461 CreateVideoStream(); | 438 CreateVideoStream(); |
| 462 MockDemuxerStreamVector streams; | 439 MockDemuxerStreamVector streams; |
| 463 streams.push_back(audio_stream()); | 440 streams.push_back(audio_stream()); |
| 464 streams.push_back(video_stream()); | 441 streams.push_back(video_stream()); |
| 465 | 442 |
| 466 InitializeDataSource(); | |
| 467 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000)); | 443 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000)); |
| 468 InitializeAudioDecoder(audio_stream()); | 444 InitializeAudioDecoder(audio_stream()); |
| 469 InitializeAudioRenderer(); | 445 InitializeAudioRenderer(); |
| 470 InitializeVideoDecoder(video_stream()); | 446 InitializeVideoDecoder(video_stream()); |
| 471 InitializeVideoRenderer(); | 447 InitializeVideoRenderer(); |
| 472 | 448 |
| 473 // Every filter should receive a call to Seek(). | 449 // Every filter should receive a call to Seek(). |
| 474 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); | 450 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); |
| 475 ExpectSeek(expected); | 451 ExpectSeek(expected); |
| 476 | 452 |
| 477 // Initialize then seek! | 453 // Initialize then seek! |
| 478 InitializePipeline(); | 454 InitializePipeline(); |
| 479 DoSeek(expected); | 455 DoSeek(expected); |
| 480 } | 456 } |
| 481 | 457 |
| 482 TEST_F(PipelineImplTest, SetVolume) { | 458 TEST_F(PipelineImplTest, SetVolume) { |
| 483 CreateAudioStream(); | 459 CreateAudioStream(); |
| 484 MockDemuxerStreamVector streams; | 460 MockDemuxerStreamVector streams; |
| 485 streams.push_back(audio_stream()); | 461 streams.push_back(audio_stream()); |
| 486 | 462 |
| 487 InitializeDataSource(); | |
| 488 InitializeDemuxer(&streams, base::TimeDelta()); | 463 InitializeDemuxer(&streams, base::TimeDelta()); |
| 489 InitializeAudioDecoder(audio_stream()); | 464 InitializeAudioDecoder(audio_stream()); |
| 490 InitializeAudioRenderer(); | 465 InitializeAudioRenderer(); |
| 491 | 466 |
| 492 // The audio renderer should receive a call to SetVolume(). | 467 // The audio renderer should receive a call to SetVolume(). |
| 493 float expected = 0.5f; | 468 float expected = 0.5f; |
| 494 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(expected)); | 469 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(expected)); |
| 495 | 470 |
| 496 // Initialize then set volume! | 471 // Initialize then set volume! |
| 497 InitializePipeline(); | 472 InitializePipeline(); |
| 498 pipeline_->SetVolume(expected); | 473 pipeline_->SetVolume(expected); |
| 499 } | 474 } |
| 500 | 475 |
| 501 TEST_F(PipelineImplTest, Properties) { | 476 TEST_F(PipelineImplTest, Properties) { |
| 502 CreateVideoStream(); | 477 CreateVideoStream(); |
| 503 MockDemuxerStreamVector streams; | 478 MockDemuxerStreamVector streams; |
| 504 streams.push_back(video_stream()); | 479 streams.push_back(video_stream()); |
| 505 | 480 |
| 506 InitializeDataSource(); | |
| 507 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); | 481 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); |
| 508 InitializeDemuxer(&streams, kDuration); | 482 InitializeDemuxer(&streams, kDuration); |
| 509 InitializeVideoDecoder(video_stream()); | 483 InitializeVideoDecoder(video_stream()); |
| 510 InitializeVideoRenderer(); | 484 InitializeVideoRenderer(); |
| 511 | 485 |
| 512 InitializePipeline(); | 486 InitializePipeline(); |
| 513 EXPECT_TRUE(pipeline_->IsInitialized()); | 487 EXPECT_TRUE(pipeline_->IsInitialized()); |
| 514 EXPECT_EQ(PIPELINE_OK, pipeline_->GetError()); | 488 EXPECT_EQ(PIPELINE_OK, pipeline_->GetError()); |
| 515 EXPECT_EQ(kDuration.ToInternalValue(), | 489 EXPECT_EQ(kDuration.ToInternalValue(), |
| 516 pipeline_->GetMediaDuration().ToInternalValue()); | 490 pipeline_->GetMediaDuration().ToInternalValue()); |
| 517 EXPECT_EQ(kTotalBytes, pipeline_->GetTotalBytes()); | 491 EXPECT_EQ(kTotalBytes, pipeline_->GetTotalBytes()); |
| 518 EXPECT_EQ(kBufferedBytes, pipeline_->GetBufferedBytes()); | 492 EXPECT_EQ(kBufferedBytes, pipeline_->GetBufferedBytes()); |
| 519 | 493 |
| 520 // Because kTotalBytes and kBufferedBytes are equal to each other, | 494 // Because kTotalBytes and kBufferedBytes are equal to each other, |
| 521 // the entire video should be buffered. | 495 // the entire video should be buffered. |
| 522 EXPECT_EQ(kDuration.ToInternalValue(), | 496 EXPECT_EQ(kDuration.ToInternalValue(), |
| 523 pipeline_->GetBufferedTime().ToInternalValue()); | 497 pipeline_->GetBufferedTime().ToInternalValue()); |
| 524 } | 498 } |
| 525 | 499 |
| 526 TEST_F(PipelineImplTest, GetBufferedTime) { | 500 TEST_F(PipelineImplTest, GetBufferedTime) { |
| 527 CreateVideoStream(); | 501 CreateVideoStream(); |
| 528 MockDemuxerStreamVector streams; | 502 MockDemuxerStreamVector streams; |
| 529 streams.push_back(video_stream()); | 503 streams.push_back(video_stream()); |
| 530 | 504 |
| 531 InitializeDataSource(); | |
| 532 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); | 505 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); |
| 533 InitializeDemuxer(&streams, kDuration); | 506 InitializeDemuxer(&streams, kDuration); |
| 534 InitializeVideoDecoder(video_stream()); | 507 InitializeVideoDecoder(video_stream()); |
| 535 InitializeVideoRenderer(); | 508 InitializeVideoRenderer(); |
| 536 | 509 |
| 537 InitializePipeline(); | 510 InitializePipeline(); |
| 538 EXPECT_TRUE(pipeline_->IsInitialized()); | 511 EXPECT_TRUE(pipeline_->IsInitialized()); |
| 539 EXPECT_EQ(PIPELINE_OK, pipeline_->GetError()); | 512 EXPECT_EQ(PIPELINE_OK, pipeline_->GetError()); |
| 540 | 513 |
| 541 // TODO(vrk): The following mini-test cases are order-dependent, and should | 514 // TODO(vrk): The following mini-test cases are order-dependent, and should |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 591 pipeline_->GetBufferedTime().ToInternalValue()); | 564 pipeline_->GetBufferedTime().ToInternalValue()); |
| 592 } | 565 } |
| 593 | 566 |
| 594 TEST_F(PipelineImplTest, DisableAudioRenderer) { | 567 TEST_F(PipelineImplTest, DisableAudioRenderer) { |
| 595 CreateAudioStream(); | 568 CreateAudioStream(); |
| 596 CreateVideoStream(); | 569 CreateVideoStream(); |
| 597 MockDemuxerStreamVector streams; | 570 MockDemuxerStreamVector streams; |
| 598 streams.push_back(audio_stream()); | 571 streams.push_back(audio_stream()); |
| 599 streams.push_back(video_stream()); | 572 streams.push_back(video_stream()); |
| 600 | 573 |
| 601 InitializeDataSource(); | |
| 602 InitializeDemuxer(&streams, base::TimeDelta()); | 574 InitializeDemuxer(&streams, base::TimeDelta()); |
| 603 InitializeAudioDecoder(audio_stream()); | 575 InitializeAudioDecoder(audio_stream()); |
| 604 InitializeAudioRenderer(); | 576 InitializeAudioRenderer(); |
| 605 InitializeVideoDecoder(video_stream()); | 577 InitializeVideoDecoder(video_stream()); |
| 606 InitializeVideoRenderer(); | 578 InitializeVideoRenderer(); |
| 607 | 579 |
| 608 InitializePipeline(); | 580 InitializePipeline(); |
| 609 EXPECT_TRUE(pipeline_->IsInitialized()); | 581 EXPECT_TRUE(pipeline_->IsInitialized()); |
| 610 EXPECT_EQ(PIPELINE_OK, pipeline_->GetError()); | 582 EXPECT_EQ(PIPELINE_OK, pipeline_->GetError()); |
| 611 EXPECT_TRUE(pipeline_->IsRendered(mime_type::kMajorTypeAudio)); | 583 EXPECT_TRUE(pipeline_->IsRendered(mime_type::kMajorTypeAudio)); |
| 612 EXPECT_TRUE(pipeline_->IsRendered(mime_type::kMajorTypeVideo)); | 584 EXPECT_TRUE(pipeline_->IsRendered(mime_type::kMajorTypeVideo)); |
| 613 | 585 |
| 614 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(1.0f)) | 586 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(1.0f)) |
| 615 .WillOnce(DisableAudioRenderer(mocks_->audio_renderer())); | 587 .WillOnce(DisableAudioRenderer(mocks_->audio_renderer())); |
| 616 EXPECT_CALL(*mocks_->data_source(), | |
| 617 OnAudioRendererDisabled()); | |
| 618 EXPECT_CALL(*mocks_->demuxer(), | 588 EXPECT_CALL(*mocks_->demuxer(), |
| 619 OnAudioRendererDisabled()); | 589 OnAudioRendererDisabled()); |
| 620 EXPECT_CALL(*mocks_->audio_decoder(), | 590 EXPECT_CALL(*mocks_->audio_decoder(), |
| 621 OnAudioRendererDisabled()); | 591 OnAudioRendererDisabled()); |
| 622 EXPECT_CALL(*mocks_->audio_renderer(), | 592 EXPECT_CALL(*mocks_->audio_renderer(), |
| 623 OnAudioRendererDisabled()); | 593 OnAudioRendererDisabled()); |
| 624 EXPECT_CALL(*mocks_->video_decoder(), | 594 EXPECT_CALL(*mocks_->video_decoder(), |
| 625 OnAudioRendererDisabled()); | 595 OnAudioRendererDisabled()); |
| 626 EXPECT_CALL(*mocks_->video_renderer(), | 596 EXPECT_CALL(*mocks_->video_renderer(), |
| 627 OnAudioRendererDisabled()); | 597 OnAudioRendererDisabled()); |
| 628 | 598 |
| 629 mocks_->audio_renderer()->SetPlaybackRate(1.0f); | 599 mocks_->audio_renderer()->SetPlaybackRate(1.0f); |
| 630 | 600 |
| 631 // Verify that ended event is fired when video ends. | 601 // Verify that ended event is fired when video ends. |
| 632 EXPECT_CALL(*mocks_->video_renderer(), HasEnded()) | 602 EXPECT_CALL(*mocks_->video_renderer(), HasEnded()) |
| 633 .WillOnce(Return(true)); | 603 .WillOnce(Return(true)); |
| 634 EXPECT_CALL(callbacks_, OnEnded()); | 604 EXPECT_CALL(callbacks_, OnEnded()); |
| 635 FilterHost* host = pipeline_; | 605 FilterHost* host = pipeline_; |
| 636 host->NotifyEnded(); | 606 host->NotifyEnded(); |
| 637 } | 607 } |
| 638 | 608 |
| 639 TEST_F(PipelineImplTest, DisableAudioRendererDuringInit) { | 609 TEST_F(PipelineImplTest, DisableAudioRendererDuringInit) { |
| 640 CreateAudioStream(); | 610 CreateAudioStream(); |
| 641 CreateVideoStream(); | 611 CreateVideoStream(); |
| 642 MockDemuxerStreamVector streams; | 612 MockDemuxerStreamVector streams; |
| 643 streams.push_back(audio_stream()); | 613 streams.push_back(audio_stream()); |
| 644 streams.push_back(video_stream()); | 614 streams.push_back(video_stream()); |
| 645 | 615 |
| 646 InitializeDataSource(); | |
| 647 InitializeDemuxer(&streams, base::TimeDelta()); | 616 InitializeDemuxer(&streams, base::TimeDelta()); |
| 648 InitializeAudioDecoder(audio_stream()); | 617 InitializeAudioDecoder(audio_stream()); |
| 649 InitializeAudioRenderer(true); | 618 InitializeAudioRenderer(true); |
| 650 InitializeVideoDecoder(video_stream()); | 619 InitializeVideoDecoder(video_stream()); |
| 651 InitializeVideoRenderer(); | 620 InitializeVideoRenderer(); |
| 652 | 621 |
| 653 EXPECT_CALL(*mocks_->data_source(), | |
| 654 OnAudioRendererDisabled()); | |
| 655 EXPECT_CALL(*mocks_->demuxer(), | 622 EXPECT_CALL(*mocks_->demuxer(), |
| 656 OnAudioRendererDisabled()); | 623 OnAudioRendererDisabled()); |
| 657 EXPECT_CALL(*mocks_->audio_decoder(), | 624 EXPECT_CALL(*mocks_->audio_decoder(), |
| 658 OnAudioRendererDisabled()); | 625 OnAudioRendererDisabled()); |
| 659 EXPECT_CALL(*mocks_->audio_renderer(), | 626 EXPECT_CALL(*mocks_->audio_renderer(), |
| 660 OnAudioRendererDisabled()); | 627 OnAudioRendererDisabled()); |
| 661 EXPECT_CALL(*mocks_->video_decoder(), | 628 EXPECT_CALL(*mocks_->video_decoder(), |
| 662 OnAudioRendererDisabled()); | 629 OnAudioRendererDisabled()); |
| 663 EXPECT_CALL(*mocks_->video_renderer(), | 630 EXPECT_CALL(*mocks_->video_renderer(), |
| 664 OnAudioRendererDisabled()); | 631 OnAudioRendererDisabled()); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 677 host->NotifyEnded(); | 644 host->NotifyEnded(); |
| 678 } | 645 } |
| 679 | 646 |
| 680 TEST_F(PipelineImplTest, EndedCallback) { | 647 TEST_F(PipelineImplTest, EndedCallback) { |
| 681 CreateAudioStream(); | 648 CreateAudioStream(); |
| 682 CreateVideoStream(); | 649 CreateVideoStream(); |
| 683 MockDemuxerStreamVector streams; | 650 MockDemuxerStreamVector streams; |
| 684 streams.push_back(audio_stream()); | 651 streams.push_back(audio_stream()); |
| 685 streams.push_back(video_stream()); | 652 streams.push_back(video_stream()); |
| 686 | 653 |
| 687 InitializeDataSource(); | |
| 688 InitializeDemuxer(&streams, base::TimeDelta()); | 654 InitializeDemuxer(&streams, base::TimeDelta()); |
| 689 InitializeAudioDecoder(audio_stream()); | 655 InitializeAudioDecoder(audio_stream()); |
| 690 InitializeAudioRenderer(); | 656 InitializeAudioRenderer(); |
| 691 InitializeVideoDecoder(video_stream()); | 657 InitializeVideoDecoder(video_stream()); |
| 692 InitializeVideoRenderer(); | 658 InitializeVideoRenderer(); |
| 693 InitializePipeline(); | 659 InitializePipeline(); |
| 694 | 660 |
| 695 // For convenience to simulate filters calling the methods. | 661 // For convenience to simulate filters calling the methods. |
| 696 FilterHost* host = pipeline_; | 662 FilterHost* host = pipeline_; |
| 697 | 663 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 723 | 689 |
| 724 TEST_F(PipelineImplTest, AudioStreamShorterThanVideo) { | 690 TEST_F(PipelineImplTest, AudioStreamShorterThanVideo) { |
| 725 base::TimeDelta duration = base::TimeDelta::FromSeconds(10); | 691 base::TimeDelta duration = base::TimeDelta::FromSeconds(10); |
| 726 | 692 |
| 727 CreateAudioStream(); | 693 CreateAudioStream(); |
| 728 CreateVideoStream(); | 694 CreateVideoStream(); |
| 729 MockDemuxerStreamVector streams; | 695 MockDemuxerStreamVector streams; |
| 730 streams.push_back(audio_stream()); | 696 streams.push_back(audio_stream()); |
| 731 streams.push_back(video_stream()); | 697 streams.push_back(video_stream()); |
| 732 | 698 |
| 733 InitializeDataSource(); | |
| 734 InitializeDemuxer(&streams, duration); | 699 InitializeDemuxer(&streams, duration); |
| 735 InitializeAudioDecoder(audio_stream()); | 700 InitializeAudioDecoder(audio_stream()); |
| 736 InitializeAudioRenderer(); | 701 InitializeAudioRenderer(); |
| 737 InitializeVideoDecoder(video_stream()); | 702 InitializeVideoDecoder(video_stream()); |
| 738 InitializeVideoRenderer(); | 703 InitializeVideoRenderer(); |
| 739 InitializePipeline(); | 704 InitializePipeline(); |
| 740 | 705 |
| 741 // For convenience to simulate filters calling the methods. | 706 // For convenience to simulate filters calling the methods. |
| 742 FilterHost* host = pipeline_; | 707 FilterHost* host = pipeline_; |
| 743 | 708 |
| 744 // Replace the clock so we can simulate wallclock time advancing w/o using | 709 // Replace the clock so we can simulate wallclock time advancing w/o using |
| 745 // Sleep(). | 710 // Sleep(). |
| 746 pipeline_->SetClockForTesting(new Clock(&StaticClockFunction)); | 711 pipeline_->SetClockForTesting(new Clock(&StaticClockFunction)); |
| 747 | 712 |
| 748 EXPECT_EQ(0, host->GetTime().ToInternalValue()); | 713 EXPECT_EQ(0, host->GetTime().ToInternalValue()); |
| 749 | 714 |
| 750 float playback_rate = 1.0f; | 715 float playback_rate = 1.0f; |
| 751 EXPECT_CALL(*mocks_->data_source(), SetPlaybackRate(playback_rate)); | |
| 752 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate)); | 716 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate)); |
| 753 EXPECT_CALL(*mocks_->video_decoder(), SetPlaybackRate(playback_rate)); | 717 EXPECT_CALL(*mocks_->video_decoder(), SetPlaybackRate(playback_rate)); |
| 754 EXPECT_CALL(*mocks_->audio_decoder(), SetPlaybackRate(playback_rate)); | 718 EXPECT_CALL(*mocks_->audio_decoder(), SetPlaybackRate(playback_rate)); |
| 755 EXPECT_CALL(*mocks_->video_renderer(), SetPlaybackRate(playback_rate)); | 719 EXPECT_CALL(*mocks_->video_renderer(), SetPlaybackRate(playback_rate)); |
| 756 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate)); | 720 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate)); |
| 757 pipeline_->SetPlaybackRate(playback_rate); | 721 pipeline_->SetPlaybackRate(playback_rate); |
| 758 message_loop_.RunAllPending(); | 722 message_loop_.RunAllPending(); |
| 759 | 723 |
| 760 InSequence s; | 724 InSequence s; |
| 761 | 725 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 787 .WillOnce(Return(true)); | 751 .WillOnce(Return(true)); |
| 788 EXPECT_CALL(callbacks_, OnEnded()); | 752 EXPECT_CALL(callbacks_, OnEnded()); |
| 789 host->NotifyEnded(); | 753 host->NotifyEnded(); |
| 790 } | 754 } |
| 791 | 755 |
| 792 TEST_F(PipelineImplTest, ErrorDuringSeek) { | 756 TEST_F(PipelineImplTest, ErrorDuringSeek) { |
| 793 CreateAudioStream(); | 757 CreateAudioStream(); |
| 794 MockDemuxerStreamVector streams; | 758 MockDemuxerStreamVector streams; |
| 795 streams.push_back(audio_stream()); | 759 streams.push_back(audio_stream()); |
| 796 | 760 |
| 797 InitializeDataSource(); | |
| 798 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(10)); | 761 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(10)); |
| 799 InitializeAudioDecoder(audio_stream()); | 762 InitializeAudioDecoder(audio_stream()); |
| 800 InitializeAudioRenderer(); | 763 InitializeAudioRenderer(); |
| 801 InitializePipeline(); | 764 InitializePipeline(); |
| 802 | 765 |
| 803 float playback_rate = 1.0f; | 766 float playback_rate = 1.0f; |
| 804 EXPECT_CALL(*mocks_->data_source(), SetPlaybackRate(playback_rate)); | |
| 805 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate)); | 767 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate)); |
| 806 EXPECT_CALL(*mocks_->audio_decoder(), SetPlaybackRate(playback_rate)); | 768 EXPECT_CALL(*mocks_->audio_decoder(), SetPlaybackRate(playback_rate)); |
| 807 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate)); | 769 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate)); |
| 808 pipeline_->SetPlaybackRate(playback_rate); | 770 pipeline_->SetPlaybackRate(playback_rate); |
| 809 message_loop_.RunAllPending(); | 771 message_loop_.RunAllPending(); |
| 810 | 772 |
| 811 InSequence s; | 773 InSequence s; |
| 812 | 774 |
| 813 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); | 775 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); |
| 814 EXPECT_CALL(*mocks_->data_source(), Seek(seek_time, NotNull())) | |
| 815 .WillOnce(Invoke(&RunFilterCallback)); | |
| 816 | 776 |
| 817 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, NotNull())) | 777 EXPECT_CALL(*mocks_->demuxer(), Seek(seek_time, NotNull())) |
| 818 .WillOnce(DoAll(SetError(mocks_->demuxer(), | 778 .WillOnce(DoAll(SetError(mocks_->demuxer(), |
| 819 PIPELINE_ERROR_READ), | 779 PIPELINE_ERROR_READ), |
| 820 Invoke(&RunFilterCallback))); | 780 Invoke(&RunFilterCallback))); |
| 821 | 781 |
| 822 pipeline_->Seek(seek_time, NewExpectedCallback()); | 782 pipeline_->Seek(seek_time, NewExpectedCallback()); |
| 823 EXPECT_CALL(callbacks_, OnError()); | 783 EXPECT_CALL(callbacks_, OnError()); |
| 824 message_loop_.RunAllPending(); | 784 message_loop_.RunAllPending(); |
| 825 } | 785 } |
| 826 | 786 |
| 827 } // namespace media | 787 } // namespace media |
| OLD | NEW |