Chromium Code Reviews| OLD | NEW | 
|---|---|
| 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/message_loop.h" | 8 #include "base/message_loop/message_loop.h" | 
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" | 
| 10 #include "base/test/simple_test_tick_clock.h" | 10 #include "base/test/simple_test_tick_clock.h" | 
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 87 filter_collection_->SetDemuxer(demuxer_.get()); | 87 filter_collection_->SetDemuxer(demuxer_.get()); | 
| 88 | 88 | 
| 89 video_renderer_ = new MockVideoRenderer(); | 89 video_renderer_ = new MockVideoRenderer(); | 
| 90 scoped_ptr<VideoRenderer> video_renderer(video_renderer_); | 90 scoped_ptr<VideoRenderer> video_renderer(video_renderer_); | 
| 91 filter_collection_->SetVideoRenderer(video_renderer.Pass()); | 91 filter_collection_->SetVideoRenderer(video_renderer.Pass()); | 
| 92 | 92 | 
| 93 audio_renderer_ = new MockAudioRenderer(); | 93 audio_renderer_ = new MockAudioRenderer(); | 
| 94 scoped_ptr<AudioRenderer> audio_renderer(audio_renderer_); | 94 scoped_ptr<AudioRenderer> audio_renderer(audio_renderer_); | 
| 95 filter_collection_->SetAudioRenderer(audio_renderer.Pass()); | 95 filter_collection_->SetAudioRenderer(audio_renderer.Pass()); | 
| 96 | 96 | 
| 97 text_renderer_ = new MockTextRenderer(); | |
| 98 scoped_ptr<TextRenderer> text_renderer(text_renderer_); | |
| 99 filter_collection_->SetTextRenderer(text_renderer.Pass()); | |
| 100 | |
| 97 // InitializeDemuxer() adds overriding expectations for expected non-NULL | 101 // InitializeDemuxer() adds overriding expectations for expected non-NULL | 
| 98 // streams. | 102 // streams. | 
| 99 DemuxerStream* null_pointer = NULL; | 103 DemuxerStream* null_pointer = NULL; | 
| 100 EXPECT_CALL(*demuxer_, GetStream(_)) | 104 EXPECT_CALL(*demuxer_, GetStream(_)) | 
| 101 .WillRepeatedly(Return(null_pointer)); | 105 .WillRepeatedly(Return(null_pointer)); | 
| 102 | 106 | 
| 103 EXPECT_CALL(*demuxer_, GetStartTime()) | 107 EXPECT_CALL(*demuxer_, GetStartTime()) | 
| 104 .WillRepeatedly(Return(base::TimeDelta())); | 108 .WillRepeatedly(Return(base::TimeDelta())); | 
| 105 } | 109 } | 
| 106 | 110 | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 167 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _)) | 171 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _)) | 
| 168 .WillOnce(DoAll(RunCallback<1>(PIPELINE_OK), | 172 .WillOnce(DoAll(RunCallback<1>(PIPELINE_OK), | 
| 169 WithArg<6>(RunClosure<0>()))); // |disabled_cb|. | 173 WithArg<6>(RunClosure<0>()))); // |disabled_cb|. | 
| 170 } else { | 174 } else { | 
| 171 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _)) | 175 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _)) | 
| 172 .WillOnce(DoAll(SaveArg<4>(&audio_time_cb_), | 176 .WillOnce(DoAll(SaveArg<4>(&audio_time_cb_), | 
| 173 RunCallback<1>(PIPELINE_OK))); | 177 RunCallback<1>(PIPELINE_OK))); | 
| 174 } | 178 } | 
| 175 } | 179 } | 
| 176 | 180 | 
| 181 // Sets up expectations to allow the text renderer to initialize. | |
| 182 void InitializeTextRenderer() { | |
| 183 EXPECT_CALL(*text_renderer_, Initialize(demuxer_.get(), _, _)) | |
| 184 .WillOnce(RunCallback<1>(PIPELINE_OK)); | |
| 185 | |
| 186 // Startup sequence. | |
| 187 EXPECT_CALL(*text_renderer_, Play(_)) | |
| 188 .WillOnce(RunClosure<0>()); | |
| 189 } | |
| 190 | |
| 177 // Sets up expectations on the callback and initializes the pipeline. Called | 191 // Sets up expectations on the callback and initializes the pipeline. Called | 
| 178 // after tests have set expectations any filters they wish to use. | 192 // after tests have set expectations any filters they wish to use. | 
| 179 void InitializePipeline(PipelineStatus start_status) { | 193 void InitializePipeline(PipelineStatus start_status) { | 
| 180 EXPECT_CALL(callbacks_, OnStart(start_status)); | 194 EXPECT_CALL(callbacks_, OnStart(start_status)); | 
| 181 | 195 | 
| 182 if (start_status == PIPELINE_OK) { | 196 if (start_status == PIPELINE_OK) { | 
| 183 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kHaveMetadata)); | 197 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kHaveMetadata)); | 
| 184 EXPECT_CALL(*demuxer_, SetPlaybackRate(0.0f)); | 198 EXPECT_CALL(*demuxer_, SetPlaybackRate(0.0f)); | 
| 185 | 199 | 
| 186 if (audio_stream_) { | 200 if (audio_stream_) { | 
| (...skipping 23 matching lines...) Expand all Loading... | |
| 210 | 224 | 
| 211 void CreateAudioStream() { | 225 void CreateAudioStream() { | 
| 212 audio_stream_ = CreateStream(DemuxerStream::AUDIO); | 226 audio_stream_ = CreateStream(DemuxerStream::AUDIO); | 
| 213 } | 227 } | 
| 214 | 228 | 
| 215 void CreateVideoStream() { | 229 void CreateVideoStream() { | 
| 216 video_stream_ = CreateStream(DemuxerStream::VIDEO); | 230 video_stream_ = CreateStream(DemuxerStream::VIDEO); | 
| 217 video_stream_->set_video_decoder_config(video_decoder_config_); | 231 video_stream_->set_video_decoder_config(video_decoder_config_); | 
| 218 } | 232 } | 
| 219 | 233 | 
| 234 void CreateTextStream() { | |
| 235 text_stream_ = CreateStream(DemuxerStream::TEXT); | |
| 236 } | |
| 237 | |
| 220 MockDemuxerStream* audio_stream() { | 238 MockDemuxerStream* audio_stream() { | 
| 221 return audio_stream_.get(); | 239 return audio_stream_.get(); | 
| 222 } | 240 } | 
| 223 | 241 | 
| 224 MockDemuxerStream* video_stream() { | 242 MockDemuxerStream* video_stream() { | 
| 225 return video_stream_.get(); | 243 return video_stream_.get(); | 
| 226 } | 244 } | 
| 227 | 245 | 
| 246 MockDemuxerStream* text_stream() { | |
| 247 return text_stream_.get(); | |
| 248 } | |
| 249 | |
| 228 void ExpectSeek(const base::TimeDelta& seek_time) { | 250 void ExpectSeek(const base::TimeDelta& seek_time) { | 
| 229 // Every filter should receive a call to Seek(). | 251 // Every filter should receive a call to Seek(). | 
| 230 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) | 252 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) | 
| 231 .WillOnce(RunCallback<1>(PIPELINE_OK)); | 253 .WillOnce(RunCallback<1>(PIPELINE_OK)); | 
| 232 EXPECT_CALL(*demuxer_, SetPlaybackRate(_)); | 254 EXPECT_CALL(*demuxer_, SetPlaybackRate(_)); | 
| 233 | 255 | 
| 234 if (audio_stream_) { | 256 if (audio_stream_) { | 
| 235 EXPECT_CALL(*audio_renderer_, Pause(_)) | 257 EXPECT_CALL(*audio_renderer_, Pause(_)) | 
| 236 .WillOnce(RunClosure<0>()); | 258 .WillOnce(RunClosure<0>()); | 
| 237 EXPECT_CALL(*audio_renderer_, Flush(_)) | 259 EXPECT_CALL(*audio_renderer_, Flush(_)) | 
| (...skipping 11 matching lines...) Expand all Loading... | |
| 249 .WillOnce(RunClosure<0>()); | 271 .WillOnce(RunClosure<0>()); | 
| 250 EXPECT_CALL(*video_renderer_, Flush(_)) | 272 EXPECT_CALL(*video_renderer_, Flush(_)) | 
| 251 .WillOnce(RunClosure<0>()); | 273 .WillOnce(RunClosure<0>()); | 
| 252 EXPECT_CALL(*video_renderer_, Preroll(seek_time, _)) | 274 EXPECT_CALL(*video_renderer_, Preroll(seek_time, _)) | 
| 253 .WillOnce(RunCallback<1>(PIPELINE_OK)); | 275 .WillOnce(RunCallback<1>(PIPELINE_OK)); | 
| 254 EXPECT_CALL(*video_renderer_, SetPlaybackRate(_)); | 276 EXPECT_CALL(*video_renderer_, SetPlaybackRate(_)); | 
| 255 EXPECT_CALL(*video_renderer_, Play(_)) | 277 EXPECT_CALL(*video_renderer_, Play(_)) | 
| 256 .WillOnce(RunClosure<0>()); | 278 .WillOnce(RunClosure<0>()); | 
| 257 } | 279 } | 
| 258 | 280 | 
| 281 if (text_stream_) { | |
| 282 EXPECT_CALL(*text_renderer_, Pause(_)) | |
| 283 .WillOnce(RunClosure<0>()); | |
| 284 EXPECT_CALL(*text_renderer_, Play(_)) | |
| 285 .WillOnce(RunClosure<0>()); | |
| 286 } | |
| 287 | |
| 259 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted)); | 288 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted)); | 
| 260 | 289 | 
| 261 // We expect a successful seek callback. | 290 // We expect a successful seek callback. | 
| 262 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); | 291 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); | 
| 263 } | 292 } | 
| 264 | 293 | 
| 265 void DoSeek(const base::TimeDelta& seek_time) { | 294 void DoSeek(const base::TimeDelta& seek_time) { | 
| 266 pipeline_->Seek(seek_time, | 295 pipeline_->Seek(seek_time, | 
| 267 base::Bind(&CallbackHelper::OnSeek, | 296 base::Bind(&CallbackHelper::OnSeek, | 
| 268 base::Unretained(&callbacks_))); | 297 base::Unretained(&callbacks_))); | 
| 269 | 298 | 
| 270 // We expect the time to be updated only after the seek has completed. | 299 // We expect the time to be updated only after the seek has completed. | 
| 271 EXPECT_NE(seek_time, pipeline_->GetMediaTime()); | 300 EXPECT_NE(seek_time, pipeline_->GetMediaTime()); | 
| 272 message_loop_.RunUntilIdle(); | 301 message_loop_.RunUntilIdle(); | 
| 273 EXPECT_EQ(seek_time, pipeline_->GetMediaTime()); | 302 EXPECT_EQ(seek_time, pipeline_->GetMediaTime()); | 
| 274 } | 303 } | 
| 275 | 304 | 
| 276 void ExpectStop() { | 305 void ExpectStop() { | 
| 277 if (demuxer_) | 306 if (demuxer_) | 
| 278 EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>()); | 307 EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>()); | 
| 279 | 308 | 
| 280 if (audio_stream_) | 309 if (audio_stream_) | 
| 281 EXPECT_CALL(*audio_renderer_, Stop(_)).WillOnce(RunClosure<0>()); | 310 EXPECT_CALL(*audio_renderer_, Stop(_)).WillOnce(RunClosure<0>()); | 
| 282 | 311 | 
| 283 if (video_stream_) | 312 if (video_stream_) | 
| 284 EXPECT_CALL(*video_renderer_, Stop(_)).WillOnce(RunClosure<0>()); | 313 EXPECT_CALL(*video_renderer_, Stop(_)).WillOnce(RunClosure<0>()); | 
| 314 | |
| 315 if (text_stream_) | |
| 316 EXPECT_CALL(*text_renderer_, Stop(_)).WillOnce(RunClosure<0>()); | |
| 285 } | 317 } | 
| 286 | 318 | 
| 287 // Fixture members. | 319 // Fixture members. | 
| 288 StrictMock<CallbackHelper> callbacks_; | 320 StrictMock<CallbackHelper> callbacks_; | 
| 289 base::SimpleTestTickClock test_tick_clock_; | 321 base::SimpleTestTickClock test_tick_clock_; | 
| 290 base::MessageLoop message_loop_; | 322 base::MessageLoop message_loop_; | 
| 291 scoped_ptr<Pipeline> pipeline_; | 323 scoped_ptr<Pipeline> pipeline_; | 
| 292 | 324 | 
| 293 scoped_ptr<FilterCollection> filter_collection_; | 325 scoped_ptr<FilterCollection> filter_collection_; | 
| 294 scoped_ptr<MockDemuxer> demuxer_; | 326 scoped_ptr<MockDemuxer> demuxer_; | 
| 295 MockVideoRenderer* video_renderer_; | 327 MockVideoRenderer* video_renderer_; | 
| 296 MockAudioRenderer* audio_renderer_; | 328 MockAudioRenderer* audio_renderer_; | 
| 329 MockTextRenderer* text_renderer_; | |
| 297 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; | 330 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; | 
| 298 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; | 331 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; | 
| 332 scoped_ptr<StrictMock<MockDemuxerStream> > text_stream_; | |
| 299 AudioRenderer::TimeCB audio_time_cb_; | 333 AudioRenderer::TimeCB audio_time_cb_; | 
| 300 VideoDecoderConfig video_decoder_config_; | 334 VideoDecoderConfig video_decoder_config_; | 
| 301 | 335 | 
| 302 private: | 336 private: | 
| 303 DISALLOW_COPY_AND_ASSIGN(PipelineTest); | 337 DISALLOW_COPY_AND_ASSIGN(PipelineTest); | 
| 304 }; | 338 }; | 
| 305 | 339 | 
| 306 // Test that playback controls methods no-op when the pipeline hasn't been | 340 // Test that playback controls methods no-op when the pipeline hasn't been | 
| 307 // started. | 341 // started. | 
| 308 TEST_F(PipelineTest, NotStarted) { | 342 TEST_F(PipelineTest, NotStarted) { | 
| 309 const base::TimeDelta kZero; | 343 const base::TimeDelta kZero; | 
| 310 | 344 | 
| 311 EXPECT_FALSE(pipeline_->IsRunning()); | 345 EXPECT_FALSE(pipeline_->IsRunning()); | 
| 312 EXPECT_FALSE(pipeline_->HasAudio()); | 346 EXPECT_FALSE(pipeline_->HasAudio()); | 
| 313 EXPECT_FALSE(pipeline_->HasVideo()); | 347 EXPECT_FALSE(pipeline_->HasVideo()); | 
| 348 EXPECT_FALSE(pipeline_->HasText()); | |
| 314 | 349 | 
| 315 // Setting should still work. | 350 // Setting should still work. | 
| 316 EXPECT_EQ(0.0f, pipeline_->GetPlaybackRate()); | 351 EXPECT_EQ(0.0f, pipeline_->GetPlaybackRate()); | 
| 317 pipeline_->SetPlaybackRate(-1.0f); | 352 pipeline_->SetPlaybackRate(-1.0f); | 
| 318 EXPECT_EQ(0.0f, pipeline_->GetPlaybackRate()); | 353 EXPECT_EQ(0.0f, pipeline_->GetPlaybackRate()); | 
| 319 pipeline_->SetPlaybackRate(1.0f); | 354 pipeline_->SetPlaybackRate(1.0f); | 
| 320 EXPECT_EQ(1.0f, pipeline_->GetPlaybackRate()); | 355 EXPECT_EQ(1.0f, pipeline_->GetPlaybackRate()); | 
| 321 | 356 | 
| 322 // Setting should still work. | 357 // Setting should still work. | 
| 323 EXPECT_EQ(1.0f, pipeline_->GetVolume()); | 358 EXPECT_EQ(1.0f, pipeline_->GetVolume()); | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 387 CreateAudioStream(); | 422 CreateAudioStream(); | 
| 388 MockDemuxerStreamVector streams; | 423 MockDemuxerStreamVector streams; | 
| 389 streams.push_back(audio_stream()); | 424 streams.push_back(audio_stream()); | 
| 390 | 425 | 
| 391 InitializeDemuxer(&streams); | 426 InitializeDemuxer(&streams); | 
| 392 InitializeAudioRenderer(audio_stream(), false); | 427 InitializeAudioRenderer(audio_stream(), false); | 
| 393 | 428 | 
| 394 InitializePipeline(PIPELINE_OK); | 429 InitializePipeline(PIPELINE_OK); | 
| 395 EXPECT_TRUE(pipeline_->HasAudio()); | 430 EXPECT_TRUE(pipeline_->HasAudio()); | 
| 396 EXPECT_FALSE(pipeline_->HasVideo()); | 431 EXPECT_FALSE(pipeline_->HasVideo()); | 
| 432 EXPECT_FALSE(pipeline_->HasText()); | |
| 397 } | 433 } | 
| 398 | 434 | 
| 399 TEST_F(PipelineTest, VideoStream) { | 435 TEST_F(PipelineTest, VideoStream) { | 
| 400 CreateVideoStream(); | 436 CreateVideoStream(); | 
| 401 MockDemuxerStreamVector streams; | 437 MockDemuxerStreamVector streams; | 
| 402 streams.push_back(video_stream()); | 438 streams.push_back(video_stream()); | 
| 403 | 439 | 
| 404 InitializeDemuxer(&streams); | 440 InitializeDemuxer(&streams); | 
| 405 InitializeVideoRenderer(video_stream()); | 441 InitializeVideoRenderer(video_stream()); | 
| 406 | 442 | 
| 407 InitializePipeline(PIPELINE_OK); | 443 InitializePipeline(PIPELINE_OK); | 
| 408 EXPECT_FALSE(pipeline_->HasAudio()); | 444 EXPECT_FALSE(pipeline_->HasAudio()); | 
| 409 EXPECT_TRUE(pipeline_->HasVideo()); | 445 EXPECT_TRUE(pipeline_->HasVideo()); | 
| 446 EXPECT_FALSE(pipeline_->HasText()); | |
| 410 } | 447 } | 
| 411 | 448 | 
| 412 TEST_F(PipelineTest, AudioVideoStream) { | 449 TEST_F(PipelineTest, AudioVideoStream) { | 
| 413 CreateAudioStream(); | 450 CreateAudioStream(); | 
| 414 CreateVideoStream(); | 451 CreateVideoStream(); | 
| 415 MockDemuxerStreamVector streams; | 452 MockDemuxerStreamVector streams; | 
| 416 streams.push_back(audio_stream()); | 453 streams.push_back(audio_stream()); | 
| 417 streams.push_back(video_stream()); | 454 streams.push_back(video_stream()); | 
| 418 | 455 | 
| 419 InitializeDemuxer(&streams); | 456 InitializeDemuxer(&streams); | 
| 420 InitializeAudioRenderer(audio_stream(), false); | 457 InitializeAudioRenderer(audio_stream(), false); | 
| 421 InitializeVideoRenderer(video_stream()); | 458 InitializeVideoRenderer(video_stream()); | 
| 422 | 459 | 
| 423 InitializePipeline(PIPELINE_OK); | 460 InitializePipeline(PIPELINE_OK); | 
| 424 EXPECT_TRUE(pipeline_->HasAudio()); | 461 EXPECT_TRUE(pipeline_->HasAudio()); | 
| 425 EXPECT_TRUE(pipeline_->HasVideo()); | 462 EXPECT_TRUE(pipeline_->HasVideo()); | 
| 463 EXPECT_FALSE(pipeline_->HasText()); | |
| 464 } | |
| 465 | |
| 466 TEST_F(PipelineTest, VideoTextStream) { | |
| 
 
fgalligan1
2013/09/04 22:23:09
Maybe add a Text only stream test that will fail.
 
 | |
| 467 CreateVideoStream(); | |
| 468 CreateTextStream(); | |
| 469 MockDemuxerStreamVector streams; | |
| 470 streams.push_back(video_stream()); | |
| 471 streams.push_back(text_stream()); | |
| 472 | |
| 473 InitializeDemuxer(&streams); | |
| 474 InitializeVideoRenderer(video_stream()); | |
| 475 InitializeTextRenderer(); | |
| 476 | |
| 477 InitializePipeline(PIPELINE_OK); | |
| 478 EXPECT_FALSE(pipeline_->HasAudio()); | |
| 479 EXPECT_TRUE(pipeline_->HasVideo()); | |
| 480 EXPECT_TRUE(pipeline_->HasText()); | |
| 426 } | 481 } | 
| 427 | 482 | 
| 428 TEST_F(PipelineTest, Seek) { | 483 TEST_F(PipelineTest, Seek) { | 
| 429 CreateAudioStream(); | 484 CreateAudioStream(); | 
| 430 CreateVideoStream(); | 485 CreateVideoStream(); | 
| 486 CreateTextStream(); | |
| 431 MockDemuxerStreamVector streams; | 487 MockDemuxerStreamVector streams; | 
| 432 streams.push_back(audio_stream()); | 488 streams.push_back(audio_stream()); | 
| 433 streams.push_back(video_stream()); | 489 streams.push_back(video_stream()); | 
| 490 streams.push_back(text_stream()); | |
| 434 | 491 | 
| 435 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000)); | 492 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000)); | 
| 436 InitializeAudioRenderer(audio_stream(), false); | 493 InitializeAudioRenderer(audio_stream(), false); | 
| 437 InitializeVideoRenderer(video_stream()); | 494 InitializeVideoRenderer(video_stream()); | 
| 495 InitializeTextRenderer(); | |
| 438 | 496 | 
| 439 // Initialize then seek! | 497 // Initialize then seek! | 
| 440 InitializePipeline(PIPELINE_OK); | 498 InitializePipeline(PIPELINE_OK); | 
| 441 | 499 | 
| 442 // Every filter should receive a call to Seek(). | 500 // Every filter should receive a call to Seek(). | 
| 443 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); | 501 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); | 
| 444 ExpectSeek(expected); | 502 ExpectSeek(expected); | 
| 445 DoSeek(expected); | 503 DoSeek(expected); | 
| 446 } | 504 } | 
| 447 | 505 | 
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 536 streams.push_back(audio_stream()); | 594 streams.push_back(audio_stream()); | 
| 537 streams.push_back(video_stream()); | 595 streams.push_back(video_stream()); | 
| 538 | 596 | 
| 539 InitializeDemuxer(&streams); | 597 InitializeDemuxer(&streams); | 
| 540 InitializeAudioRenderer(audio_stream(), false); | 598 InitializeAudioRenderer(audio_stream(), false); | 
| 541 InitializeVideoRenderer(video_stream()); | 599 InitializeVideoRenderer(video_stream()); | 
| 542 | 600 | 
| 543 InitializePipeline(PIPELINE_OK); | 601 InitializePipeline(PIPELINE_OK); | 
| 544 EXPECT_TRUE(pipeline_->HasAudio()); | 602 EXPECT_TRUE(pipeline_->HasAudio()); | 
| 545 EXPECT_TRUE(pipeline_->HasVideo()); | 603 EXPECT_TRUE(pipeline_->HasVideo()); | 
| 604 EXPECT_FALSE(pipeline_->HasText()); | |
| 546 | 605 | 
| 547 EXPECT_CALL(*demuxer_, OnAudioRendererDisabled()); | 606 EXPECT_CALL(*demuxer_, OnAudioRendererDisabled()); | 
| 548 pipeline_->OnAudioDisabled(); | 607 pipeline_->OnAudioDisabled(); | 
| 549 | 608 | 
| 550 // Verify that ended event is fired when video ends. | 609 // Verify that ended event is fired when video ends. | 
| 551 EXPECT_CALL(callbacks_, OnEnded()); | 610 EXPECT_CALL(callbacks_, OnEnded()); | 
| 552 pipeline_->OnVideoRendererEnded(); | 611 pipeline_->OnVideoRendererEnded(); | 
| 553 } | 612 } | 
| 554 | 613 | 
| 555 TEST_F(PipelineTest, DisableAudioRendererDuringInit) { | 614 TEST_F(PipelineTest, DisableAudioRendererDuringInit) { | 
| 556 CreateAudioStream(); | 615 CreateAudioStream(); | 
| 557 CreateVideoStream(); | 616 CreateVideoStream(); | 
| 558 MockDemuxerStreamVector streams; | 617 MockDemuxerStreamVector streams; | 
| 559 streams.push_back(audio_stream()); | 618 streams.push_back(audio_stream()); | 
| 560 streams.push_back(video_stream()); | 619 streams.push_back(video_stream()); | 
| 561 | 620 | 
| 562 InitializeDemuxer(&streams); | 621 InitializeDemuxer(&streams); | 
| 563 InitializeAudioRenderer(audio_stream(), true); | 622 InitializeAudioRenderer(audio_stream(), true); | 
| 564 InitializeVideoRenderer(video_stream()); | 623 InitializeVideoRenderer(video_stream()); | 
| 565 | 624 | 
| 566 EXPECT_CALL(*demuxer_, OnAudioRendererDisabled()); | 625 EXPECT_CALL(*demuxer_, OnAudioRendererDisabled()); | 
| 567 | 626 | 
| 568 InitializePipeline(PIPELINE_OK); | 627 InitializePipeline(PIPELINE_OK); | 
| 569 EXPECT_FALSE(pipeline_->HasAudio()); | 628 EXPECT_FALSE(pipeline_->HasAudio()); | 
| 570 EXPECT_TRUE(pipeline_->HasVideo()); | 629 EXPECT_TRUE(pipeline_->HasVideo()); | 
| 630 EXPECT_FALSE(pipeline_->HasText()); | |
| 571 | 631 | 
| 572 // Verify that ended event is fired when video ends. | 632 // Verify that ended event is fired when video ends. | 
| 573 EXPECT_CALL(callbacks_, OnEnded()); | 633 EXPECT_CALL(callbacks_, OnEnded()); | 
| 574 pipeline_->OnVideoRendererEnded(); | 634 pipeline_->OnVideoRendererEnded(); | 
| 575 } | 635 } | 
| 576 | 636 | 
| 577 TEST_F(PipelineTest, EndedCallback) { | 637 TEST_F(PipelineTest, EndedCallback) { | 
| 578 CreateAudioStream(); | 638 CreateAudioStream(); | 
| 579 CreateVideoStream(); | 639 CreateVideoStream(); | 
| 640 CreateTextStream(); | |
| 580 MockDemuxerStreamVector streams; | 641 MockDemuxerStreamVector streams; | 
| 581 streams.push_back(audio_stream()); | 642 streams.push_back(audio_stream()); | 
| 582 streams.push_back(video_stream()); | 643 streams.push_back(video_stream()); | 
| 644 streams.push_back(text_stream()); | |
| 583 | 645 | 
| 584 InitializeDemuxer(&streams); | 646 InitializeDemuxer(&streams); | 
| 585 InitializeAudioRenderer(audio_stream(), false); | 647 InitializeAudioRenderer(audio_stream(), false); | 
| 586 InitializeVideoRenderer(video_stream()); | 648 InitializeVideoRenderer(video_stream()); | 
| 649 InitializeTextRenderer(); | |
| 587 InitializePipeline(PIPELINE_OK); | 650 InitializePipeline(PIPELINE_OK); | 
| 588 | 651 | 
| 589 // The ended callback shouldn't run until both renderers have ended. | 652 // The ended callback shouldn't run until all renderers have ended. | 
| 590 pipeline_->OnAudioRendererEnded(); | 653 pipeline_->OnAudioRendererEnded(); | 
| 591 message_loop_.RunUntilIdle(); | 654 message_loop_.RunUntilIdle(); | 
| 592 | 655 | 
| 656 pipeline_->OnTextRendererEnded(); | |
| 657 message_loop_.RunUntilIdle(); | |
| 658 | |
| 593 EXPECT_CALL(callbacks_, OnEnded()); | 659 EXPECT_CALL(callbacks_, OnEnded()); | 
| 594 pipeline_->OnVideoRendererEnded(); | 660 pipeline_->OnVideoRendererEnded(); | 
| 595 message_loop_.RunUntilIdle(); | 661 message_loop_.RunUntilIdle(); | 
| 596 } | 662 } | 
| 597 | 663 | 
| 598 TEST_F(PipelineTest, AudioStreamShorterThanVideo) { | 664 TEST_F(PipelineTest, AudioStreamShorterThanVideo) { | 
| 599 base::TimeDelta duration = base::TimeDelta::FromSeconds(10); | 665 base::TimeDelta duration = base::TimeDelta::FromSeconds(10); | 
| 600 | 666 | 
| 601 CreateAudioStream(); | 667 CreateAudioStream(); | 
| 602 CreateVideoStream(); | 668 CreateVideoStream(); | 
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 740 MockDemuxerStreamVector streams; | 806 MockDemuxerStreamVector streams; | 
| 741 streams.push_back(video_stream()); | 807 streams.push_back(video_stream()); | 
| 742 | 808 | 
| 743 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); | 809 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); | 
| 744 InitializeDemuxer(&streams, kDuration); | 810 InitializeDemuxer(&streams, kDuration); | 
| 745 InitializeVideoRenderer(video_stream()); | 811 InitializeVideoRenderer(video_stream()); | 
| 746 | 812 | 
| 747 InitializePipeline(PIPELINE_OK); | 813 InitializePipeline(PIPELINE_OK); | 
| 748 EXPECT_FALSE(pipeline_->HasAudio()); | 814 EXPECT_FALSE(pipeline_->HasAudio()); | 
| 749 EXPECT_TRUE(pipeline_->HasVideo()); | 815 EXPECT_TRUE(pipeline_->HasVideo()); | 
| 816 EXPECT_FALSE(pipeline_->HasText()); | |
| 750 | 817 | 
| 751 EXPECT_EQ(base::TimeDelta(), pipeline_->GetMediaTime()); | 818 EXPECT_EQ(base::TimeDelta(), pipeline_->GetMediaTime()); | 
| 752 } | 819 } | 
| 753 | 820 | 
| 754 TEST_F(PipelineTest, StartTimeIsNonZero) { | 821 TEST_F(PipelineTest, StartTimeIsNonZero) { | 
| 755 const base::TimeDelta kStartTime = base::TimeDelta::FromSeconds(4); | 822 const base::TimeDelta kStartTime = base::TimeDelta::FromSeconds(4); | 
| 756 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); | 823 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); | 
| 757 | 824 | 
| 758 EXPECT_CALL(*demuxer_, GetStartTime()) | 825 EXPECT_CALL(*demuxer_, GetStartTime()) | 
| 759 .WillRepeatedly(Return(kStartTime)); | 826 .WillRepeatedly(Return(kStartTime)); | 
| 760 | 827 | 
| 761 CreateVideoStream(); | 828 CreateVideoStream(); | 
| 762 MockDemuxerStreamVector streams; | 829 MockDemuxerStreamVector streams; | 
| 763 streams.push_back(video_stream()); | 830 streams.push_back(video_stream()); | 
| 764 | 831 | 
| 765 InitializeDemuxer(&streams, kDuration); | 832 InitializeDemuxer(&streams, kDuration); | 
| 766 InitializeVideoRenderer(video_stream()); | 833 InitializeVideoRenderer(video_stream()); | 
| 767 | 834 | 
| 768 InitializePipeline(PIPELINE_OK); | 835 InitializePipeline(PIPELINE_OK); | 
| 769 EXPECT_FALSE(pipeline_->HasAudio()); | 836 EXPECT_FALSE(pipeline_->HasAudio()); | 
| 770 EXPECT_TRUE(pipeline_->HasVideo()); | 837 EXPECT_TRUE(pipeline_->HasVideo()); | 
| 838 EXPECT_FALSE(pipeline_->HasText()); | |
| 771 | 839 | 
| 772 EXPECT_EQ(kStartTime, pipeline_->GetMediaTime()); | 840 EXPECT_EQ(kStartTime, pipeline_->GetMediaTime()); | 
| 773 } | 841 } | 
| 774 | 842 | 
| 775 static void RunTimeCB(const AudioRenderer::TimeCB& time_cb, | 843 static void RunTimeCB(const AudioRenderer::TimeCB& time_cb, | 
| 776 int time_in_ms, | 844 int time_in_ms, | 
| 777 int max_time_in_ms) { | 845 int max_time_in_ms) { | 
| 778 time_cb.Run(base::TimeDelta::FromMilliseconds(time_in_ms), | 846 time_cb.Run(base::TimeDelta::FromMilliseconds(time_in_ms), | 
| 779 base::TimeDelta::FromMilliseconds(max_time_in_ms)); | 847 base::TimeDelta::FromMilliseconds(max_time_in_ms)); | 
| 780 } | 848 } | 
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1184 INSTANTIATE_TEARDOWN_TEST(Error, Pausing); | 1252 INSTANTIATE_TEARDOWN_TEST(Error, Pausing); | 
| 1185 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); | 1253 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); | 
| 1186 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); | 1254 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); | 
| 1187 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling); | 1255 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling); | 
| 1188 INSTANTIATE_TEARDOWN_TEST(Error, Starting); | 1256 INSTANTIATE_TEARDOWN_TEST(Error, Starting); | 
| 1189 INSTANTIATE_TEARDOWN_TEST(Error, Playing); | 1257 INSTANTIATE_TEARDOWN_TEST(Error, Playing); | 
| 1190 | 1258 | 
| 1191 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); | 1259 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); | 
| 1192 | 1260 | 
| 1193 } // namespace media | 1261 } // namespace media | 
| OLD | NEW |