OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
10 #include "media/base/android/media_codec_bridge.h" | 10 #include "media/base/android/media_codec_bridge.h" |
(...skipping 17 matching lines...) Expand all Loading... | |
28 } \ | 28 } \ |
29 } while (0) | 29 } while (0) |
30 | 30 |
31 static const int kDefaultDurationInMs = 10000; | 31 static const int kDefaultDurationInMs = 10000; |
32 | 32 |
33 static const char kAudioMp4[] = "audio/mp4"; | 33 static const char kAudioMp4[] = "audio/mp4"; |
34 static const char kVideoMp4[] = "video/mp4"; | 34 static const char kVideoMp4[] = "video/mp4"; |
35 static const char kAudioWebM[] = "audio/webm"; | 35 static const char kAudioWebM[] = "audio/webm"; |
36 static const char kVideoWebM[] = "video/webm"; | 36 static const char kVideoWebM[] = "video/webm"; |
37 | 37 |
38 // TODO(wolenetz/qinmin): Simplify tests with more effective mock usage, and | |
39 // fix flaky pointer-based MDJ inequality testing. See http://crbug.com/327839. | |
40 | |
38 // Mock of MediaPlayerManager for testing purpose | 41 // Mock of MediaPlayerManager for testing purpose |
39 class MockMediaPlayerManager : public MediaPlayerManager { | 42 class MockMediaPlayerManager : public MediaPlayerManager { |
40 public: | 43 public: |
41 explicit MockMediaPlayerManager(base::MessageLoop* message_loop) | 44 explicit MockMediaPlayerManager(base::MessageLoop* message_loop) |
42 : message_loop_(message_loop), | 45 : message_loop_(message_loop), |
43 playback_completed_(false) {} | 46 playback_completed_(false) {} |
44 virtual ~MockMediaPlayerManager() {} | 47 virtual ~MockMediaPlayerManager() {} |
45 | 48 |
46 // MediaPlayerManager implementation. | 49 // MediaPlayerManager implementation. |
47 virtual void RequestMediaResources(int player_id) OVERRIDE {} | 50 virtual void RequestMediaResources(int player_id) OVERRIDE {} |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
245 EXPECT_EQ(audio_codec, kCodecAAC); | 248 EXPECT_EQ(audio_codec, kCodecAAC); |
246 | 249 |
247 configs.audio_sampling_rate = 48000; | 250 configs.audio_sampling_rate = 48000; |
248 uint8 aac_extra_data[] = { 0x13, 0x10 }; | 251 uint8 aac_extra_data[] = { 0x13, 0x10 }; |
249 configs.audio_extra_data = std::vector<uint8>( | 252 configs.audio_extra_data = std::vector<uint8>( |
250 aac_extra_data, | 253 aac_extra_data, |
251 aac_extra_data + 2); | 254 aac_extra_data + 2); |
252 return configs; | 255 return configs; |
253 } | 256 } |
254 | 257 |
255 // Starts an audio decoder job. | |
256 void StartAudioDecoderJob() { | |
257 Start(CreateAudioDemuxerConfigs(kCodecVorbis)); | |
258 } | |
259 | |
260 DemuxerConfigs CreateVideoDemuxerConfigs() { | 258 DemuxerConfigs CreateVideoDemuxerConfigs() { |
261 DemuxerConfigs configs; | 259 DemuxerConfigs configs; |
262 configs.video_codec = kCodecVP8; | 260 configs.video_codec = kCodecVP8; |
263 configs.video_size = gfx::Size(320, 240); | 261 configs.video_size = gfx::Size(320, 240); |
264 configs.is_video_encrypted = false; | 262 configs.is_video_encrypted = false; |
265 configs.duration_ms = kDefaultDurationInMs; | 263 configs.duration_ms = kDefaultDurationInMs; |
266 return configs; | 264 return configs; |
267 } | 265 } |
268 | 266 |
269 DemuxerConfigs CreateAudioVideoDemuxerConfigs() { | 267 DemuxerConfigs CreateAudioVideoDemuxerConfigs() { |
270 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis); | 268 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis); |
271 configs.video_codec = kCodecVP8; | 269 configs.video_codec = kCodecVP8; |
272 configs.video_size = gfx::Size(320, 240); | 270 configs.video_size = gfx::Size(320, 240); |
273 configs.is_video_encrypted = false; | 271 configs.is_video_encrypted = false; |
274 return configs; | 272 return configs; |
275 } | 273 } |
276 | 274 |
277 void StartVideoDecoderJob() { | 275 DemuxerConfigs CreateDemuxerConfigs(bool have_audio, bool have_video) { |
278 Start(CreateVideoDemuxerConfigs()); | 276 DCHECK(have_audio || have_video); |
277 | |
278 if (have_audio && !have_video) | |
279 return CreateAudioDemuxerConfigs(kCodecVorbis); | |
280 | |
281 if (have_video && !have_audio) | |
282 return CreateVideoDemuxerConfigs(); | |
283 | |
284 return CreateAudioVideoDemuxerConfigs(); | |
279 } | 285 } |
280 | 286 |
281 // Starts decoding the data. | 287 // Starts an audio decoder job. Verifies player behavior relative to |
282 void Start(const DemuxerConfigs& configs) { | 288 // |expect_player_requests_data|. |
289 void StartAudioDecoderJob(bool expect_player_requests_data) { | |
290 Start(CreateAudioDemuxerConfigs(kCodecVorbis), expect_player_requests_data); | |
291 } | |
292 | |
293 // Starts a video decoder job. Verifies player behavior relative to | |
294 // |expect_player_requests_data|. | |
295 void StartVideoDecoderJob(bool expect_player_requests_data) { | |
296 Start(CreateVideoDemuxerConfigs(), expect_player_requests_data); | |
297 } | |
298 | |
299 // Starts decoding the data. Verifies player behavior relative to | |
300 // |expect_player_requests_data|. | |
301 void Start(const DemuxerConfigs& configs, bool expect_player_requests_data) { | |
302 bool has_audio = configs.audio_codec != kUnknownAudioCodec; | |
303 bool has_video = configs.video_codec != kUnknownVideoCodec; | |
304 int original_num_data_requests = demuxer_->num_data_requests(); | |
305 int expected_request_delta = expect_player_requests_data ? | |
306 ((has_audio ? 1 : 0) + (has_video ? 1 : 0)) : 0; | |
307 | |
283 player_.OnDemuxerConfigsAvailable(configs); | 308 player_.OnDemuxerConfigsAvailable(configs); |
284 player_.Start(); | 309 player_.Start(); |
310 | |
285 EXPECT_TRUE(player_.IsPlaying()); | 311 EXPECT_TRUE(player_.IsPlaying()); |
312 EXPECT_EQ(original_num_data_requests + expected_request_delta, | |
313 demuxer_->num_data_requests()); | |
314 | |
315 // Verify player has decoder job iff the config included the media type for | |
316 // the job and the player is expected to request data due to Start(), above. | |
317 EXPECT_EQ(expect_player_requests_data && has_audio, | |
318 GetMediaDecoderJob(true) != NULL); | |
319 EXPECT_EQ(expect_player_requests_data && has_video, | |
320 GetMediaDecoderJob(false) != NULL); | |
286 } | 321 } |
287 | 322 |
288 AccessUnit CreateAccessUnitWithData(bool is_audio, int audio_packet_id) { | 323 AccessUnit CreateAccessUnitWithData(bool is_audio, int audio_packet_id) { |
289 AccessUnit unit; | 324 AccessUnit unit; |
290 | 325 |
291 unit.status = DemuxerStream::kOk; | 326 unit.status = DemuxerStream::kOk; |
292 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile( | 327 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile( |
293 is_audio ? base::StringPrintf("vorbis-packet-%d", audio_packet_id) | 328 is_audio ? base::StringPrintf("vorbis-packet-%d", audio_packet_id) |
294 : "vp8-I-frame-320x240"); | 329 : "vp8-I-frame-320x240"); |
295 unit.data = std::vector<uint8>( | 330 unit.data = std::vector<uint8>( |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
344 // the player should not yet have sent the DemuxerSeek IPC request, though | 379 // the player should not yet have sent the DemuxerSeek IPC request, though |
345 // seek event should be pending. The audio decoder job will also still be | 380 // seek event should be pending. The audio decoder job will also still be |
346 // decoding. | 381 // decoding. |
347 void StartAudioDecoderJobAndSeekToWhileDecoding( | 382 void StartAudioDecoderJobAndSeekToWhileDecoding( |
348 const base::TimeDelta& seek_time) { | 383 const base::TimeDelta& seek_time) { |
349 EXPECT_FALSE(GetMediaDecoderJob(true)); | 384 EXPECT_FALSE(GetMediaDecoderJob(true)); |
350 EXPECT_FALSE(player_.IsPlaying()); | 385 EXPECT_FALSE(player_.IsPlaying()); |
351 EXPECT_EQ(0, demuxer_->num_data_requests()); | 386 EXPECT_EQ(0, demuxer_->num_data_requests()); |
352 EXPECT_EQ(0.0, GetPrerollTimestamp().InMillisecondsF()); | 387 EXPECT_EQ(0.0, GetPrerollTimestamp().InMillisecondsF()); |
353 EXPECT_EQ(player_.GetCurrentTime(), GetPrerollTimestamp()); | 388 EXPECT_EQ(player_.GetCurrentTime(), GetPrerollTimestamp()); |
354 StartAudioDecoderJob(); | 389 StartAudioDecoderJob(true); |
355 EXPECT_TRUE(GetMediaDecoderJob(true)); | |
356 EXPECT_FALSE(GetMediaDecoderJob(true)->is_decoding()); | 390 EXPECT_FALSE(GetMediaDecoderJob(true)->is_decoding()); |
357 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | 391 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
358 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); | 392 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
359 player_.SeekTo(seek_time); | 393 player_.SeekTo(seek_time); |
360 EXPECT_EQ(0.0, GetPrerollTimestamp().InMillisecondsF()); | 394 EXPECT_EQ(0.0, GetPrerollTimestamp().InMillisecondsF()); |
361 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
362 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 395 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
363 } | 396 } |
364 | 397 |
365 // Seek, including simulated receipt of |kAborted| read between SeekTo() | 398 // Seek, including simulated receipt of |kAborted| read between SeekTo() and |
366 // and OnDemuxerSeekDone(). Use this helper method only when the player | 399 // OnDemuxerSeekDone(). Use this helper method only when the player already |
367 // already has created the decoder job. | 400 // has created the decoder job. Exactly one request for more data is expected |
368 void SeekPlayer(bool is_audio, const base::TimeDelta& seek_time) { | 401 // following the seek, so use this helper for players with only audio or only |
369 EXPECT_TRUE(GetMediaDecoderJob(is_audio)); | 402 // video. |
370 | 403 void SeekPlayerWithAbort(bool is_audio, const base::TimeDelta& seek_time) { |
371 int original_num_seeks = demuxer_->num_seek_requests(); | 404 int original_num_seeks = demuxer_->num_seek_requests(); |
372 int original_num_data_requests = demuxer_->num_data_requests(); | 405 int original_num_data_requests = demuxer_->num_data_requests(); |
373 | 406 |
374 // Initiate a seek. Skip the round-trip of requesting seek from renderer. | 407 // Initiate a seek. Skip the round-trip of requesting seek from renderer. |
375 // Instead behave as if the renderer has asked us to seek. | 408 // Instead behave as if the renderer has asked us to seek. |
376 player_.SeekTo(seek_time); | 409 player_.SeekTo(seek_time); |
377 | 410 |
378 // Verify that the seek does not occur until previously outstanding data | 411 // Verify that the seek does not occur until previously outstanding data |
379 // request is satisfied. | 412 // request is satisfied. |
380 EXPECT_EQ(original_num_seeks, demuxer_->num_seek_requests()); | 413 EXPECT_EQ(original_num_seeks, demuxer_->num_seek_requests()); |
381 | 414 |
382 // Simulate seeking causes the demuxer to abort the outstanding read caused | 415 // Simulate seeking causes the demuxer to abort the outstanding read |
383 // by the seek. | 416 // caused by the seek. |
384 player_.OnDemuxerDataAvailable(CreateAbortedAck(is_audio)); | 417 player_.OnDemuxerDataAvailable(CreateAbortedAck(is_audio)); |
385 | 418 |
386 // Verify that the seek is requested now that the outstanding read is | 419 // Verify that the seek is requested. |
387 // completed by aborted access unit. | |
388 EXPECT_EQ(original_num_seeks + 1, demuxer_->num_seek_requests()); | 420 EXPECT_EQ(original_num_seeks + 1, demuxer_->num_seek_requests()); |
389 | 421 |
390 // Send back the seek done notification. This should trigger the player to | 422 // Send back the seek done notification. This should trigger the player to |
391 // call OnReadFromDemuxer() again. | 423 // call OnReadFromDemuxer() again. |
392 EXPECT_EQ(original_num_data_requests, demuxer_->num_data_requests()); | 424 EXPECT_EQ(original_num_data_requests, demuxer_->num_data_requests()); |
393 player_.OnDemuxerSeekDone(kNoTimestamp()); | 425 player_.OnDemuxerSeekDone(kNoTimestamp()); |
394 EXPECT_EQ(original_num_data_requests + 1, demuxer_->num_data_requests()); | 426 EXPECT_EQ(original_num_data_requests + 1, demuxer_->num_data_requests()); |
395 | 427 |
396 // No other seek should have been requested. | 428 // No other seek should have been requested. |
397 EXPECT_EQ(original_num_seeks + 1, demuxer_->num_seek_requests()); | 429 EXPECT_EQ(original_num_seeks + 1, demuxer_->num_seek_requests()); |
(...skipping 13 matching lines...) Expand all Loading... | |
411 } | 443 } |
412 | 444 |
413 // Valid only for video-only player tests. If |trigger_with_release_start| is | 445 // Valid only for video-only player tests. If |trigger_with_release_start| is |
414 // true, triggers the browser seek with a Release() + video data received + | 446 // true, triggers the browser seek with a Release() + video data received + |
415 // Start() with a new surface. If false, triggers the browser seek by | 447 // Start() with a new surface. If false, triggers the browser seek by |
416 // setting a new video surface after beginning decode of received video data. | 448 // setting a new video surface after beginning decode of received video data. |
417 // Such data receipt causes possibility that an I-frame is not next, and | 449 // Such data receipt causes possibility that an I-frame is not next, and |
418 // browser seek results once decode completes and surface change processing | 450 // browser seek results once decode completes and surface change processing |
419 // begins. | 451 // begins. |
420 void BrowserSeekPlayer(bool trigger_with_release_start) { | 452 void BrowserSeekPlayer(bool trigger_with_release_start) { |
421 int expected_num_data_requests = demuxer_->num_data_requests(); | 453 int expected_num_data_requests = demuxer_->num_data_requests() + 1; |
422 int expected_num_seek_requests = demuxer_->num_seek_requests(); | 454 int expected_num_seek_requests = demuxer_->num_seek_requests(); |
423 int expected_num_browser_seek_requests = | 455 int expected_num_browser_seek_requests = |
424 demuxer_->num_browser_seek_requests(); | 456 demuxer_->num_browser_seek_requests(); |
425 | 457 |
426 EXPECT_FALSE(GetMediaDecoderJob(false)); | 458 EXPECT_FALSE(GetMediaDecoderJob(false)); |
427 CreateNextTextureAndSetVideoSurface(); | 459 CreateNextTextureAndSetVideoSurface(); |
428 StartVideoDecoderJob(); | 460 StartVideoDecoderJob(true); |
429 EXPECT_TRUE(GetMediaDecoderJob(false)); | |
430 expected_num_data_requests++; | |
431 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); | |
432 | 461 |
433 if (trigger_with_release_start) { | 462 if (trigger_with_release_start) { |
434 ReleasePlayer(); | 463 ReleasePlayer(); |
435 | 464 |
436 // Simulate demuxer's response to the video data request. | 465 // Simulate demuxer's response to the video data request. |
437 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 466 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
438 EXPECT_FALSE(GetMediaDecoderJob(false)); | 467 EXPECT_FALSE(GetMediaDecoderJob(false)); |
439 EXPECT_FALSE(player_.IsPlaying()); | 468 EXPECT_FALSE(player_.IsPlaying()); |
440 EXPECT_EQ(expected_num_seek_requests, demuxer_->num_seek_requests()); | 469 EXPECT_EQ(expected_num_seek_requests, demuxer_->num_seek_requests()); |
441 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); | |
442 | 470 |
443 CreateNextTextureAndSetVideoSurface(); | 471 CreateNextTextureAndSetVideoSurface(); |
444 player_.Start(); | 472 StartVideoDecoderJob(false); |
445 } else { | 473 } else { |
446 // Simulate demuxer's response to the video data request. | 474 // Simulate demuxer's response to the video data request. |
447 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 475 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
448 | 476 |
449 // While the decoder is decoding, trigger a browser seek by changing | 477 // While the decoder is decoding, trigger a browser seek by changing |
450 // surface. Demuxer does not know of browser seek in advance, so no | 478 // surface. Demuxer does not know of browser seek in advance, so no |
451 // |kAborted| data is required (though |kAborted| can certainly occur for | 479 // |kAborted| data is required (though |kAborted| can certainly occur for |
452 // any pending read in reality due to renderer preparing for a regular | 480 // any pending read in reality due to renderer preparing for a regular |
453 // seek). | 481 // seek). |
454 CreateNextTextureAndSetVideoSurface(); | 482 CreateNextTextureAndSetVideoSurface(); |
455 | 483 |
456 // Browser seek should not begin until decoding has completed. | 484 // Browser seek should not begin until decoding has completed. |
457 EXPECT_TRUE(GetMediaDecoderJob(false)); | 485 EXPECT_TRUE(GetMediaDecoderJob(false)); |
458 EXPECT_EQ(expected_num_seek_requests, demuxer_->num_seek_requests()); | 486 EXPECT_EQ(expected_num_seek_requests, demuxer_->num_seek_requests()); |
459 EXPECT_EQ(expected_num_browser_seek_requests, | |
460 demuxer_->num_browser_seek_requests()); | |
461 | 487 |
462 // Wait for the decoder job to finish decoding and be reset pending the | 488 // Wait for the decoder job to finish decoding and be reset pending the |
463 // browser seek. | 489 // browser seek. |
464 while (GetMediaDecoderJob(false) && | 490 while (GetMediaDecoderJob(false)) |
465 GetMediaDecoderJob(false)->is_decoding()) { | |
466 message_loop_.RunUntilIdle(); | 491 message_loop_.RunUntilIdle(); |
467 } | |
468 } | 492 } |
469 | 493 |
470 EXPECT_FALSE(GetMediaDecoderJob(false)); | |
471 EXPECT_TRUE(player_.IsPlaying()); | |
472 | |
473 // Only one browser seek should have been initiated, and no further data | 494 // Only one browser seek should have been initiated, and no further data |
474 // should have been requested. | 495 // should have been requested. |
475 expected_num_seek_requests++; | 496 expected_num_seek_requests++; |
476 expected_num_browser_seek_requests++; | 497 expected_num_browser_seek_requests++; |
477 EXPECT_EQ(expected_num_seek_requests, demuxer_->num_seek_requests()); | 498 EXPECT_EQ(expected_num_seek_requests, demuxer_->num_seek_requests()); |
478 EXPECT_EQ(expected_num_browser_seek_requests, | 499 EXPECT_EQ(expected_num_browser_seek_requests, |
479 demuxer_->num_browser_seek_requests()); | 500 demuxer_->num_browser_seek_requests()); |
480 EXPECT_EQ(expected_num_data_requests, demuxer_->num_seek_requests()); | 501 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); |
481 } | 502 } |
482 | 503 |
483 // Creates a new decoder job and feeds it data ending with a |kConfigChanged| | 504 // Creates a new decoder job and feeds it data ending with a |kConfigChanged| |
484 // access unit. If |config_unit_in_prefetch| is true, sends feeds the config | 505 // access unit. If |config_unit_in_prefetch| is true, sends feeds the config |
485 // change AU in response to the job's first read request (prefetch). If | 506 // change AU in response to the job's first read request (prefetch). If |
486 // false, regular data is fed and decoded prior to feeding the config change | 507 // false, regular data is fed and decoded prior to feeding the config change |
487 // AU in response to the second data request (after prefetch completed). | 508 // AU in response to the second data request (after prefetch completed). |
488 // |config_unit_index| controls which access unit is |kConfigChanged|. | 509 // |config_unit_index| controls which access unit is |kConfigChanged|. |
489 void StartConfigChange(bool is_audio, | 510 void StartConfigChange(bool is_audio, |
490 bool config_unit_in_prefetch, | 511 bool config_unit_in_prefetch, |
491 int config_unit_index) { | 512 int config_unit_index) { |
492 int expected_num_data_requests = demuxer_->num_data_requests(); | |
493 int expected_num_config_requests = demuxer_->num_config_requests(); | 513 int expected_num_config_requests = demuxer_->num_config_requests(); |
494 | 514 |
495 EXPECT_FALSE(GetMediaDecoderJob(is_audio)); | 515 EXPECT_FALSE(GetMediaDecoderJob(is_audio)); |
496 if (is_audio) { | 516 if (is_audio) { |
497 StartAudioDecoderJob(); | 517 StartAudioDecoderJob(true); |
498 } else { | 518 } else { |
499 CreateNextTextureAndSetVideoSurface(); | 519 CreateNextTextureAndSetVideoSurface(); |
500 StartVideoDecoderJob(); | 520 StartVideoDecoderJob(true); |
501 } | 521 } |
502 EXPECT_TRUE(GetMediaDecoderJob(is_audio)); | 522 |
503 expected_num_data_requests++; | 523 int expected_num_data_requests = demuxer_->num_data_requests(); |
504 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); | |
505 EXPECT_EQ(expected_num_config_requests, demuxer_->num_config_requests()); | |
506 | 524 |
507 // Feed and decode a standalone access unit so the player exits prefetch. | 525 // Feed and decode a standalone access unit so the player exits prefetch. |
508 if (!config_unit_in_prefetch) { | 526 if (!config_unit_in_prefetch) { |
509 if (is_audio) | 527 if (is_audio) |
510 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | 528 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
511 else | 529 else |
512 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 530 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
513 | 531 |
514 message_loop_.Run(); | 532 message_loop_.Run(); |
515 | 533 |
516 // We should have completed the prefetch phase at this point. | 534 // We should have completed the prefetch phase at this point. |
517 EXPECT_TRUE(GetMediaDecoderJob(is_audio)); | |
518 expected_num_data_requests++; | 535 expected_num_data_requests++; |
519 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); | 536 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); |
520 EXPECT_EQ(expected_num_config_requests, demuxer_->num_config_requests()); | |
521 } | 537 } |
522 | 538 |
539 EXPECT_EQ(expected_num_config_requests, demuxer_->num_config_requests()); | |
540 | |
523 // Feed and decode access units with data for any units prior to | 541 // Feed and decode access units with data for any units prior to |
524 // |config_unit_index|, and a |kConfigChanged| unit at that index. | 542 // |config_unit_index|, and a |kConfigChanged| unit at that index. |
525 // Player should prepare to reconfigure the decoder job, and should request | 543 // Player should prepare to reconfigure the decoder job, and should request |
526 // new demuxer configs. | 544 // new demuxer configs. |
527 player_.OnDemuxerDataAvailable( | 545 player_.OnDemuxerDataAvailable( |
528 CreateReadFromDemuxerAckWithConfigChanged(is_audio, config_unit_index)); | 546 CreateReadFromDemuxerAckWithConfigChanged(is_audio, config_unit_index)); |
529 while (GetMediaDecoderJob(is_audio)->is_decoding()) | 547 WaitForDecodeDone(is_audio, !is_audio); |
530 message_loop_.RunUntilIdle(); | |
531 | 548 |
532 expected_num_config_requests++; | 549 expected_num_config_requests++; |
533 EXPECT_TRUE(player_.IsPlaying()); | |
534 EXPECT_TRUE(GetMediaDecoderJob(is_audio)); | |
535 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); | 550 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); |
536 EXPECT_EQ(expected_num_config_requests, demuxer_->num_config_requests()); | 551 EXPECT_EQ(expected_num_config_requests, demuxer_->num_config_requests()); |
537 } | 552 } |
538 | 553 |
539 void CreateNextTextureAndSetVideoSurface() { | 554 void CreateNextTextureAndSetVideoSurface() { |
540 gfx::SurfaceTexture* surface_texture; | 555 gfx::SurfaceTexture* surface_texture; |
541 if (surface_texture_a_is_next_) { | 556 if (surface_texture_a_is_next_) { |
542 surface_texture_a_ = new gfx::SurfaceTexture(next_texture_id_++); | 557 surface_texture_a_ = new gfx::SurfaceTexture(next_texture_id_++); |
543 surface_texture = surface_texture_a_.get(); | 558 surface_texture = surface_texture_a_.get(); |
544 } else { | 559 } else { |
545 surface_texture_b_ = new gfx::SurfaceTexture(next_texture_id_++); | 560 surface_texture_b_ = new gfx::SurfaceTexture(next_texture_id_++); |
546 surface_texture = surface_texture_b_.get(); | 561 surface_texture = surface_texture_b_.get(); |
547 } | 562 } |
548 | 563 |
549 surface_texture_a_is_next_ = !surface_texture_a_is_next_; | 564 surface_texture_a_is_next_ = !surface_texture_a_is_next_; |
550 gfx::ScopedJavaSurface surface = gfx::ScopedJavaSurface(surface_texture); | 565 gfx::ScopedJavaSurface surface = gfx::ScopedJavaSurface(surface_texture); |
551 player_.SetVideoSurface(surface.Pass()); | 566 player_.SetVideoSurface(surface.Pass()); |
552 } | 567 } |
553 | 568 |
569 // Wait for one or both of the jobs to complete decoding. Decoder jobs are | |
570 // assumed to exist for any stream whose decode completion is awaited. | |
571 void WaitForDecodeDone(bool wait_for_audio, bool wait_for_video) { | |
572 DCHECK(wait_for_audio || wait_for_video); | |
573 | |
574 while ((wait_for_audio && GetMediaDecoderJob(true)->is_decoding()) || | |
575 (wait_for_video && GetMediaDecoderJob(false)->is_decoding())) { | |
576 message_loop_.RunUntilIdle(); | |
577 } | |
578 } | |
579 | |
580 void WaitForAudioDecodeDone() { | |
581 WaitForDecodeDone(true, false); | |
582 } | |
583 | |
584 void WaitForVideoDecodeDone() { | |
585 WaitForDecodeDone(false, true); | |
586 } | |
587 | |
588 void WaitForAudioVideoDecodeDone() { | |
589 WaitForDecodeDone(true, true); | |
590 } | |
591 | |
592 // If |send_eos| is true, generates EOS for the stream corresponding to | |
593 // |eos_for_audio|. Verifies that playback completes and no further data | |
594 // is requested. | |
595 // If |send_eos| is false, then it is assumed that caller previously arranged | |
596 // for player to receive EOS for each stream, but the player has not yet | |
597 // decoded all of them. In this case, |eos_for_audio| is ignored. | |
598 void VerifyPlaybackCompletesOnEOSDecode(bool send_eos, bool eos_for_audio) { | |
599 int original_num_data_requests = demuxer_->num_data_requests(); | |
600 if (send_eos) | |
601 player_.OnDemuxerDataAvailable(CreateEOSAck(eos_for_audio)); | |
602 EXPECT_FALSE(manager_.playback_completed()); | |
603 message_loop_.Run(); | |
604 EXPECT_TRUE(manager_.playback_completed()); | |
605 EXPECT_EQ(original_num_data_requests, demuxer_->num_data_requests()); | |
606 } | |
607 | |
608 void VerifyCompletedPlaybackResumesOnSeekPlusStart(bool have_audio, | |
609 bool have_video) { | |
610 DCHECK(have_audio || have_video); | |
611 | |
612 EXPECT_TRUE(manager_.playback_completed()); | |
613 | |
614 player_.SeekTo(base::TimeDelta()); | |
615 player_.OnDemuxerSeekDone(kNoTimestamp()); | |
616 Start(CreateDemuxerConfigs(have_audio, have_video), true); | |
617 } | |
618 | |
619 // Starts the appropriate decoder jobs according to |have_audio| and | |
620 // |have_video|. Then starts seek during decode of EOS or non-EOS according to | |
621 // |eos_audio| and |eos_video|. Simulates seek completion and verifies that | |
622 // playback never completed. | |
623 void VerifySeekDuringEOSDecodePreventsPlaybackCompletion(bool have_audio, | |
624 bool have_video, | |
625 bool eos_audio, | |
626 bool eos_video) { | |
627 DCHECK(have_audio || have_video); | |
628 DCHECK(have_audio || !eos_audio); | |
qinmin
2013/12/12 19:40:22
nit: this feels redundant. If have_audio is false,
wolenetz
2013/12/12 21:26:06
Done.
| |
629 DCHECK(have_video || !eos_video); | |
630 | |
631 if (have_video) | |
632 CreateNextTextureAndSetVideoSurface(); | |
633 | |
634 Start(CreateDemuxerConfigs(have_audio, have_video), true); | |
635 | |
636 if (have_audio) | |
637 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | |
638 | |
639 if (have_video) | |
640 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | |
641 | |
642 // Run until more data is requested a number of times equal to the number of | |
643 // media types configured. Since prefetching may be in progress, we cannot | |
644 // reliably expect Run() to complete until we have sent demuxer data for all | |
645 // configured media types, above. | |
646 for (int i = 0; i < (have_audio ? 1 : 0) + (have_video ? 1 : 0); i++) | |
647 message_loop_.Run(); | |
648 | |
649 // Simulate seek while decoding EOS or non-EOS for the appropriate | |
650 // stream(s). | |
651 if (eos_audio) { | |
652 player_.OnDemuxerDataAvailable(CreateEOSAck(true)); | |
653 } else if (have_audio) { | |
654 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(1)); | |
655 } | |
656 | |
657 if (eos_video) { | |
658 player_.OnDemuxerDataAvailable(CreateEOSAck(false)); | |
659 } else if (have_video) { | |
660 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | |
661 } | |
662 | |
663 player_.SeekTo(base::TimeDelta()); | |
664 EXPECT_EQ(0, demuxer_->num_seek_requests()); | |
665 WaitForDecodeDone(have_audio, have_video); | |
666 EXPECT_EQ(1, demuxer_->num_seek_requests()); | |
667 | |
668 player_.OnDemuxerSeekDone(kNoTimestamp()); | |
669 EXPECT_FALSE(manager_.playback_completed()); | |
670 } | |
671 | |
554 base::TimeTicks StartTimeTicks() { | 672 base::TimeTicks StartTimeTicks() { |
555 return player_.start_time_ticks_; | 673 return player_.start_time_ticks_; |
556 } | 674 } |
557 | 675 |
558 bool IsTypeSupported(const std::vector<uint8>& scheme_uuid, | 676 bool IsTypeSupported(const std::vector<uint8>& scheme_uuid, |
559 const std::string& security_level, | 677 const std::string& security_level, |
560 const std::string& container, | 678 const std::string& container, |
561 const std::vector<std::string>& codecs) { | 679 const std::vector<std::string>& codecs) { |
562 return MediaSourcePlayer::IsTypeSupported( | 680 return MediaSourcePlayer::IsTypeSupported( |
563 scheme_uuid, security_level, container, codecs); | 681 scheme_uuid, security_level, container, codecs); |
(...skipping 19 matching lines...) Expand all Loading... | |
583 bool surface_texture_a_is_next_; | 701 bool surface_texture_a_is_next_; |
584 int next_texture_id_; | 702 int next_texture_id_; |
585 | 703 |
586 DISALLOW_COPY_AND_ASSIGN(MediaSourcePlayerTest); | 704 DISALLOW_COPY_AND_ASSIGN(MediaSourcePlayerTest); |
587 }; | 705 }; |
588 | 706 |
589 TEST_F(MediaSourcePlayerTest, StartAudioDecoderWithValidConfig) { | 707 TEST_F(MediaSourcePlayerTest, StartAudioDecoderWithValidConfig) { |
590 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 708 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
591 | 709 |
592 // Test audio decoder job will be created when codec is successfully started. | 710 // Test audio decoder job will be created when codec is successfully started. |
593 StartAudioDecoderJob(); | 711 StartAudioDecoderJob(true); |
594 EXPECT_TRUE(GetMediaDecoderJob(true)); | |
595 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
596 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 712 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
597 } | 713 } |
598 | 714 |
599 TEST_F(MediaSourcePlayerTest, StartAudioDecoderWithInvalidConfig) { | 715 TEST_F(MediaSourcePlayerTest, StartAudioDecoderWithInvalidConfig) { |
600 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 716 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
601 | 717 |
602 // Test audio decoder job will not be created when failed to start the codec. | 718 // Test audio decoder job will not be created when failed to start the codec. |
603 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis); | 719 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis); |
604 // Replace with invalid |audio_extra_data| | 720 // Replace with invalid |audio_extra_data| |
605 configs.audio_extra_data.clear(); | 721 configs.audio_extra_data.clear(); |
606 uint8 invalid_codec_data[] = { 0x00, 0xff, 0xff, 0xff, 0xff }; | 722 uint8 invalid_codec_data[] = { 0x00, 0xff, 0xff, 0xff, 0xff }; |
607 configs.audio_extra_data.insert(configs.audio_extra_data.begin(), | 723 configs.audio_extra_data.insert(configs.audio_extra_data.begin(), |
608 invalid_codec_data, invalid_codec_data + 4); | 724 invalid_codec_data, invalid_codec_data + 4); |
609 Start(configs); | 725 Start(configs, false); |
610 EXPECT_FALSE(GetMediaDecoderJob(true)); | |
611 EXPECT_EQ(0, demuxer_->num_data_requests()); | |
612 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 726 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
613 } | 727 } |
614 | 728 |
615 TEST_F(MediaSourcePlayerTest, StartVideoCodecWithValidSurface) { | 729 TEST_F(MediaSourcePlayerTest, StartVideoCodecWithValidSurface) { |
616 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 730 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
617 | 731 |
618 // Test video decoder job will be created when surface is valid. | 732 // Test video decoder job will be created when surface is valid. |
619 StartVideoDecoderJob(); | |
620 // Video decoder job will not be created until surface is available. | 733 // Video decoder job will not be created until surface is available. |
621 EXPECT_FALSE(GetMediaDecoderJob(false)); | 734 StartVideoDecoderJob(false); |
622 EXPECT_EQ(0, demuxer_->num_data_requests()); | |
623 | 735 |
624 // Set both an initial and a later video surface without receiving any | 736 // Set both an initial and a later video surface without receiving any |
625 // demuxed data yet. | 737 // demuxed data yet. |
626 CreateNextTextureAndSetVideoSurface(); | 738 CreateNextTextureAndSetVideoSurface(); |
627 MediaDecoderJob* first_job = GetMediaDecoderJob(false); | 739 MediaDecoderJob* first_job = GetMediaDecoderJob(false); |
628 EXPECT_TRUE(first_job); | 740 EXPECT_TRUE(first_job); |
629 CreateNextTextureAndSetVideoSurface(); | 741 CreateNextTextureAndSetVideoSurface(); |
630 | 742 |
631 // Setting another surface will not create a new job until any pending | 743 // Setting another surface will not create a new job until any pending |
632 // read is satisfied (and job is no longer decoding). | 744 // read is satisfied (and job is no longer decoding). |
633 EXPECT_EQ(first_job, GetMediaDecoderJob(false)); | 745 EXPECT_EQ(first_job, GetMediaDecoderJob(false)); |
634 | 746 |
635 // No seeks, even on setting surface, should have occurred. (Browser seeks can | 747 // No seeks, even on setting surface, should have occurred. (Browser seeks can |
636 // occur on setting surface, but only after previously receiving video data.) | 748 // occur on setting surface, but only after previously receiving video data.) |
637 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 749 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
638 | 750 |
639 // Note, the decoder job for the second surface set, above, will be created | 751 // Note, the decoder job for the second surface set, above, will be created |
640 // only after the pending read is satisfied and decoded, and the resulting | 752 // only after the pending read is satisfied and decoded, and the resulting |
641 // browser seek is done. See BrowserSeek_* tests for this coverage. | 753 // browser seek is done. See BrowserSeek_* tests for this coverage. |
642 } | 754 } |
643 | 755 |
644 TEST_F(MediaSourcePlayerTest, StartVideoCodecWithInvalidSurface) { | 756 TEST_F(MediaSourcePlayerTest, StartVideoCodecWithInvalidSurface) { |
645 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 757 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
646 | 758 |
647 // Test video decoder job will be created when surface is valid. | 759 // Test video decoder job will not be created when surface is invalid. |
648 scoped_refptr<gfx::SurfaceTexture> surface_texture( | 760 scoped_refptr<gfx::SurfaceTexture> surface_texture( |
649 new gfx::SurfaceTexture(0)); | 761 new gfx::SurfaceTexture(0)); |
650 gfx::ScopedJavaSurface surface(surface_texture.get()); | 762 gfx::ScopedJavaSurface surface(surface_texture.get()); |
651 StartVideoDecoderJob(); | 763 StartVideoDecoderJob(false); |
652 // Video decoder job will not be created until surface is available. | |
653 EXPECT_FALSE(GetMediaDecoderJob(false)); | |
654 EXPECT_EQ(0, demuxer_->num_data_requests()); | |
655 | 764 |
656 // Release the surface texture. | 765 // Release the surface texture. |
657 surface_texture = NULL; | 766 surface_texture = NULL; |
658 player_.SetVideoSurface(surface.Pass()); | 767 player_.SetVideoSurface(surface.Pass()); |
659 | 768 |
660 // Player should not seek the demuxer on setting initial surface. | 769 // Player should not seek the demuxer on setting initial surface. |
661 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 770 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
662 | 771 |
663 EXPECT_FALSE(GetMediaDecoderJob(false)); | 772 EXPECT_FALSE(GetMediaDecoderJob(false)); |
664 EXPECT_EQ(0, demuxer_->num_data_requests()); | 773 EXPECT_EQ(0, demuxer_->num_data_requests()); |
665 } | 774 } |
666 | 775 |
667 TEST_F(MediaSourcePlayerTest, ReadFromDemuxerAfterSeek) { | 776 TEST_F(MediaSourcePlayerTest, ReadFromDemuxerAfterSeek) { |
668 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 777 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
669 | 778 |
670 // Test decoder job will resend a ReadFromDemuxer request after seek. | 779 // Test decoder job will resend a ReadFromDemuxer request after seek. |
671 StartAudioDecoderJob(); | 780 StartAudioDecoderJob(true); |
672 EXPECT_TRUE(GetMediaDecoderJob(true)); | 781 SeekPlayerWithAbort(true, base::TimeDelta()); |
673 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
674 SeekPlayer(true, base::TimeDelta()); | |
675 EXPECT_EQ(2, demuxer_->num_data_requests()); | |
676 } | 782 } |
677 | 783 |
678 TEST_F(MediaSourcePlayerTest, SetSurfaceWhileSeeking) { | 784 TEST_F(MediaSourcePlayerTest, SetSurfaceWhileSeeking) { |
679 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 785 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
680 | 786 |
681 // Test SetVideoSurface() will not cause an extra seek while the player is | 787 // Test SetVideoSurface() will not cause an extra seek while the player is |
682 // waiting for demuxer to indicate seek is done. | 788 // waiting for demuxer to indicate seek is done. |
683 StartVideoDecoderJob(); | |
684 // Player is still waiting for SetVideoSurface(), so no request is sent. | 789 // Player is still waiting for SetVideoSurface(), so no request is sent. |
685 EXPECT_EQ(0, demuxer_->num_data_requests()); | 790 StartVideoDecoderJob(false); // Verifies no data requested. |
686 | 791 |
687 // Initiate a seek. Skip requesting element seek of renderer. | 792 // Initiate a seek. Skip requesting element seek of renderer. |
688 // Instead behave as if the renderer has asked us to seek. | 793 // Instead behave as if the renderer has asked us to seek. |
689 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 794 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
690 player_.SeekTo(base::TimeDelta()); | 795 player_.SeekTo(base::TimeDelta()); |
691 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 796 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
692 | 797 |
693 CreateNextTextureAndSetVideoSurface(); | 798 CreateNextTextureAndSetVideoSurface(); |
694 EXPECT_FALSE(GetMediaDecoderJob(false)); | 799 EXPECT_FALSE(GetMediaDecoderJob(false)); |
695 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 800 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
(...skipping 10 matching lines...) Expand all Loading... | |
706 // was not a browser seek request. | 811 // was not a browser seek request. |
707 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 812 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
708 EXPECT_EQ(0, demuxer_->num_browser_seek_requests()); | 813 EXPECT_EQ(0, demuxer_->num_browser_seek_requests()); |
709 } | 814 } |
710 | 815 |
711 TEST_F(MediaSourcePlayerTest, ChangeMultipleSurfaceWhileDecoding) { | 816 TEST_F(MediaSourcePlayerTest, ChangeMultipleSurfaceWhileDecoding) { |
712 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 817 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
713 | 818 |
714 // Test MediaSourcePlayer can switch multiple surfaces during decoding. | 819 // Test MediaSourcePlayer can switch multiple surfaces during decoding. |
715 CreateNextTextureAndSetVideoSurface(); | 820 CreateNextTextureAndSetVideoSurface(); |
716 StartVideoDecoderJob(); | 821 StartVideoDecoderJob(true); |
717 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
718 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 822 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
719 EXPECT_TRUE(GetMediaDecoderJob(false)); | |
720 | 823 |
721 // Send the first input chunk. | 824 // Send the first input chunk. |
722 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 825 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
723 | 826 |
724 // While the decoder is decoding, change multiple surfaces. Pass an empty | 827 // While the decoder is decoding, change multiple surfaces. Pass an empty |
725 // surface first. | 828 // surface first. |
726 gfx::ScopedJavaSurface empty_surface; | 829 gfx::ScopedJavaSurface empty_surface; |
727 player_.SetVideoSurface(empty_surface.Pass()); | 830 player_.SetVideoSurface(empty_surface.Pass()); |
728 // Next, pass a new non-empty surface. | 831 // Next, pass a new non-empty surface. |
729 CreateNextTextureAndSetVideoSurface(); | 832 CreateNextTextureAndSetVideoSurface(); |
730 | 833 |
731 // Wait for the decoder job to finish decoding and be reset pending a browser | 834 // Wait for the decoder job to finish decoding and be reset pending a browser |
732 // seek. | 835 // seek. |
733 while (GetMediaDecoderJob(false) && GetMediaDecoderJob(false)->is_decoding()) | 836 while (GetMediaDecoderJob(false)) |
734 message_loop_.RunUntilIdle(); | 837 message_loop_.RunUntilIdle(); |
735 EXPECT_FALSE(GetMediaDecoderJob(false)); | |
736 | 838 |
737 // Only one browser seek should have been initiated. No further data request | 839 // Only one browser seek should have been initiated. No further data request |
738 // should have been processed on |message_loop_| before surface change event | 840 // should have been processed on |message_loop_| before surface change event |
739 // became pending, above. | 841 // became pending, above. |
740 EXPECT_EQ(1, demuxer_->num_browser_seek_requests()); | 842 EXPECT_EQ(1, demuxer_->num_browser_seek_requests()); |
741 EXPECT_EQ(1, demuxer_->num_data_requests()); | 843 EXPECT_EQ(1, demuxer_->num_data_requests()); |
742 | 844 |
743 // Simulate browser seek is done and confirm player requests more data for new | 845 // Simulate browser seek is done and confirm player requests more data for new |
744 // video decoder job. | 846 // video decoder job. |
745 player_.OnDemuxerSeekDone(player_.GetCurrentTime()); | 847 player_.OnDemuxerSeekDone(player_.GetCurrentTime()); |
746 EXPECT_TRUE(GetMediaDecoderJob(false)); | 848 EXPECT_TRUE(GetMediaDecoderJob(false)); |
747 EXPECT_EQ(2, demuxer_->num_data_requests()); | 849 EXPECT_EQ(2, demuxer_->num_data_requests()); |
748 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 850 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
749 } | 851 } |
750 | 852 |
751 TEST_F(MediaSourcePlayerTest, AudioOnlyStartAfterSeekFinish) { | 853 TEST_F(MediaSourcePlayerTest, AudioOnlyStartAfterSeekFinish) { |
752 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 854 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
753 | 855 |
754 // Test audio decoder job will not start until pending seek event is handled. | 856 // Test audio decoder job will not start until pending seek event is handled. |
755 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis); | 857 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis); |
756 player_.OnDemuxerConfigsAvailable(configs); | 858 player_.OnDemuxerConfigsAvailable(configs); |
757 EXPECT_FALSE(GetMediaDecoderJob(true)); | 859 EXPECT_FALSE(GetMediaDecoderJob(true)); |
758 EXPECT_EQ(0, demuxer_->num_data_requests()); | |
759 | 860 |
760 // Initiate a seek. Skip requesting element seek of renderer. | 861 // Initiate a seek. Skip requesting element seek of renderer. |
761 // Instead behave as if the renderer has asked us to seek. | 862 // Instead behave as if the renderer has asked us to seek. |
762 player_.SeekTo(base::TimeDelta()); | 863 player_.SeekTo(base::TimeDelta()); |
763 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 864 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
764 | 865 |
765 player_.Start(); | 866 player_.Start(); |
766 EXPECT_FALSE(GetMediaDecoderJob(true)); | 867 EXPECT_FALSE(GetMediaDecoderJob(true)); |
767 EXPECT_EQ(0, demuxer_->num_data_requests()); | 868 EXPECT_EQ(0, demuxer_->num_data_requests()); |
768 | 869 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
800 | 901 |
801 // Reconfirm exactly 1 seek request has been made of demuxer. | 902 // Reconfirm exactly 1 seek request has been made of demuxer. |
802 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 903 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
803 } | 904 } |
804 | 905 |
805 TEST_F(MediaSourcePlayerTest, StartImmediatelyAfterPause) { | 906 TEST_F(MediaSourcePlayerTest, StartImmediatelyAfterPause) { |
806 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 907 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
807 | 908 |
808 // Test that if the decoding job is not fully stopped after Pause(), | 909 // Test that if the decoding job is not fully stopped after Pause(), |
809 // calling Start() will be a noop. | 910 // calling Start() will be a noop. |
810 StartAudioDecoderJob(); | 911 StartAudioDecoderJob(true); |
811 | 912 |
812 MediaDecoderJob* decoder_job = GetMediaDecoderJob(true); | 913 MediaDecoderJob* decoder_job = GetMediaDecoderJob(true); |
813 EXPECT_TRUE(decoder_job); | |
814 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
815 EXPECT_FALSE(GetMediaDecoderJob(true)->is_decoding()); | 914 EXPECT_FALSE(GetMediaDecoderJob(true)->is_decoding()); |
816 | 915 |
817 // Sending data to player. | 916 // Sending data to player. |
818 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | 917 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
819 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); | 918 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
820 | 919 |
821 // Decoder job will not immediately stop after Pause() since it is | 920 // Decoder job will not immediately stop after Pause() since it is |
822 // running on another thread. | 921 // running on another thread. |
823 player_.Pause(true); | 922 player_.Pause(true); |
824 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); | 923 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
825 | 924 |
826 // Nothing happens when calling Start() again. | 925 // Nothing happens when calling Start() again. |
827 player_.Start(); | 926 player_.Start(); |
828 // Verify that Start() will not destroy and recreate the decoder job. | 927 // Verify that Start() will not destroy and recreate the decoder job. |
829 EXPECT_EQ(decoder_job, GetMediaDecoderJob(true)); | 928 EXPECT_EQ(decoder_job, GetMediaDecoderJob(true)); |
830 EXPECT_EQ(1, demuxer_->num_data_requests()); | 929 EXPECT_EQ(1, demuxer_->num_data_requests()); |
831 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); | 930 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
832 message_loop_.Run(); | 931 message_loop_.Run(); |
833 // The decoder job should finish and a new request will be sent. | 932 // The decoder job should finish and a new request will be sent. |
834 EXPECT_EQ(2, demuxer_->num_data_requests()); | 933 EXPECT_EQ(2, demuxer_->num_data_requests()); |
835 EXPECT_FALSE(GetMediaDecoderJob(true)->is_decoding()); | 934 EXPECT_FALSE(GetMediaDecoderJob(true)->is_decoding()); |
836 } | 935 } |
837 | 936 |
838 TEST_F(MediaSourcePlayerTest, DecoderJobsCannotStartWithoutAudio) { | 937 TEST_F(MediaSourcePlayerTest, DecoderJobsCannotStartWithoutAudio) { |
839 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 938 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
840 | 939 |
841 // Test that when Start() is called, video decoder jobs will wait for audio | 940 // Test that when Start() is called, video decoder jobs will wait for audio |
842 // decoder job before start decoding the data. | 941 // decoder job before start decoding the data. |
843 DemuxerConfigs configs = CreateAudioVideoDemuxerConfigs(); | |
844 Start(configs); | |
845 EXPECT_EQ(0, demuxer_->num_data_requests()); | |
846 | |
847 CreateNextTextureAndSetVideoSurface(); | 942 CreateNextTextureAndSetVideoSurface(); |
848 | 943 Start(CreateAudioVideoDemuxerConfigs(), true); |
849 // Player should not seek the demuxer on setting initial surface. | |
850 EXPECT_EQ(0, demuxer_->num_seek_requests()); | |
851 | |
852 MediaDecoderJob* audio_decoder_job = GetMediaDecoderJob(true); | 944 MediaDecoderJob* audio_decoder_job = GetMediaDecoderJob(true); |
853 MediaDecoderJob* video_decoder_job = GetMediaDecoderJob(false); | 945 MediaDecoderJob* video_decoder_job = GetMediaDecoderJob(false); |
854 EXPECT_EQ(2, demuxer_->num_data_requests()); | 946 |
855 EXPECT_FALSE(audio_decoder_job->is_decoding()); | 947 EXPECT_FALSE(audio_decoder_job->is_decoding()); |
856 EXPECT_FALSE(video_decoder_job->is_decoding()); | 948 EXPECT_FALSE(video_decoder_job->is_decoding()); |
857 | 949 |
858 // Sending video data to player, audio decoder should not start. | 950 // Sending video data to player, video decoder should not start. |
859 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 951 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
860 EXPECT_FALSE(video_decoder_job->is_decoding()); | 952 EXPECT_FALSE(video_decoder_job->is_decoding()); |
861 | 953 |
862 // Sending audio data to player, both decoders should start now. | 954 // Sending audio data to player, both decoders should start now. |
863 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | 955 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
864 EXPECT_TRUE(audio_decoder_job->is_decoding()); | 956 EXPECT_TRUE(audio_decoder_job->is_decoding()); |
865 EXPECT_TRUE(video_decoder_job->is_decoding()); | 957 EXPECT_TRUE(video_decoder_job->is_decoding()); |
866 | 958 |
867 // Reconfirm no seek occurred. | 959 // No seeks should have occurred. |
868 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 960 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
869 } | 961 } |
870 | 962 |
871 TEST_F(MediaSourcePlayerTest, StartTimeTicksResetAfterDecoderUnderruns) { | 963 TEST_F(MediaSourcePlayerTest, StartTimeTicksResetAfterDecoderUnderruns) { |
872 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 964 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
873 | 965 |
874 // Test start time ticks will reset after decoder job underruns. | 966 // Test start time ticks will reset after decoder job underruns. |
875 StartAudioDecoderJob(); | 967 StartAudioDecoderJob(true); |
876 EXPECT_TRUE(GetMediaDecoderJob(true)); | 968 |
877 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
878 // For the first couple chunks, the decoder job may return | 969 // For the first couple chunks, the decoder job may return |
879 // DECODE_FORMAT_CHANGED status instead of DECODE_SUCCEEDED status. Decode | 970 // DECODE_FORMAT_CHANGED status instead of DECODE_SUCCEEDED status. Decode |
880 // more frames to guarantee that DECODE_SUCCEEDED will be returned. | 971 // more frames to guarantee that DECODE_SUCCEEDED will be returned. |
881 for (int i = 0; i < 4; ++i) { | 972 for (int i = 0; i < 4; ++i) { |
882 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i)); | 973 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i)); |
883 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); | 974 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
884 message_loop_.Run(); | 975 message_loop_.Run(); |
885 } | 976 } |
886 | 977 |
887 // The decoder job should finish and a new request will be sent. | 978 // The decoder job should finish and a new request will be sent. |
888 EXPECT_EQ(5, demuxer_->num_data_requests()); | 979 EXPECT_EQ(5, demuxer_->num_data_requests()); |
889 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); | 980 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
890 base::TimeTicks previous = StartTimeTicks(); | 981 base::TimeTicks previous = StartTimeTicks(); |
891 | 982 |
892 // Let the decoder timeout and execute the OnDecoderStarved() callback. | 983 // Let the decoder timeout and execute the OnDecoderStarved() callback. |
893 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); | 984 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); |
894 | 985 |
895 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); | 986 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
896 EXPECT_TRUE(StartTimeTicks() != base::TimeTicks()); | 987 EXPECT_TRUE(StartTimeTicks() != base::TimeTicks()); |
897 message_loop_.RunUntilIdle(); | 988 message_loop_.RunUntilIdle(); |
898 | 989 |
899 // Send new data to the decoder so it can finish the currently | 990 // Send new data to the decoder so it can finish the currently |
900 // pending decode. | 991 // pending decode. |
901 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(3)); | 992 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(3)); |
902 while (GetMediaDecoderJob(true)->is_decoding()) | 993 WaitForAudioDecodeDone(); |
903 message_loop_.RunUntilIdle(); | |
904 | 994 |
905 // Verify the start time ticks is cleared at this point because the | 995 // Verify the start time ticks is cleared at this point because the |
906 // player is prefetching. | 996 // player is prefetching. |
907 EXPECT_TRUE(StartTimeTicks() == base::TimeTicks()); | 997 EXPECT_TRUE(StartTimeTicks() == base::TimeTicks()); |
908 | 998 |
909 // Send new data to the decoder so it can finish prefetching. This should | 999 // Send new data to the decoder so it can finish prefetching. This should |
910 // reset the start time ticks. | 1000 // reset the start time ticks. |
911 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(3)); | 1001 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(3)); |
912 EXPECT_TRUE(StartTimeTicks() != base::TimeTicks()); | 1002 EXPECT_TRUE(StartTimeTicks() != base::TimeTicks()); |
913 | 1003 |
914 base::TimeTicks current = StartTimeTicks(); | 1004 base::TimeTicks current = StartTimeTicks(); |
915 EXPECT_LE(100.0, (current - previous).InMillisecondsF()); | 1005 EXPECT_LE(100.0, (current - previous).InMillisecondsF()); |
916 } | 1006 } |
917 | 1007 |
918 TEST_F(MediaSourcePlayerTest, NoRequestForDataAfterInputEOS) { | 1008 TEST_F(MediaSourcePlayerTest, V_SecondAccessUnitIsEOSAndResumePlayAfterSeek) { |
919 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1009 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
920 | 1010 |
921 // Test MediaSourcePlayer will not request for new data after input EOS is | 1011 // Test MediaSourcePlayer can replay video after input EOS is reached. |
922 // reached. | 1012 CreateNextTextureAndSetVideoSurface(); |
923 CreateNextTextureAndSetVideoSurface(); | 1013 StartVideoDecoderJob(true); |
924 StartVideoDecoderJob(); | 1014 |
925 // Player should not seek the demuxer on setting initial surface. | |
926 EXPECT_EQ(0, demuxer_->num_seek_requests()); | |
927 | |
928 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
929 // Send the first input chunk. | 1015 // Send the first input chunk. |
930 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 1016 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
931 message_loop_.Run(); | 1017 message_loop_.Run(); |
1018 | |
1019 VerifyPlaybackCompletesOnEOSDecode(true, false); | |
1020 VerifyCompletedPlaybackResumesOnSeekPlusStart(false, true); | |
1021 } | |
1022 | |
1023 TEST_F(MediaSourcePlayerTest, A_FirstAccessUnitIsEOSAndResumePlayAfterSeek) { | |
1024 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | |
1025 | |
1026 // Test decode of audio EOS buffer without any prior decode. See also | |
1027 // http://b/11696552. | |
1028 // Also tests that seeking+Start() after completing audio playback resumes | |
1029 // playback. | |
1030 Start(CreateAudioDemuxerConfigs(kCodecAAC), true); | |
1031 VerifyPlaybackCompletesOnEOSDecode(true, true); | |
1032 VerifyCompletedPlaybackResumesOnSeekPlusStart(true, false); | |
1033 } | |
1034 | |
1035 TEST_F(MediaSourcePlayerTest, V_FirstAccessUnitAfterSeekIsEOS) { | |
1036 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | |
1037 | |
1038 // Test decode of video EOS buffer, just after seeking, without any prior | |
1039 // decode (other than the simulated |kAborted| resulting from the seek | |
1040 // process.) | |
1041 CreateNextTextureAndSetVideoSurface(); | |
1042 StartVideoDecoderJob(true); | |
1043 SeekPlayerWithAbort(false, base::TimeDelta()); | |
1044 VerifyPlaybackCompletesOnEOSDecode(true, false); | |
1045 } | |
1046 | |
1047 TEST_F(MediaSourcePlayerTest, A_FirstAccessUnitAfterSeekIsEOS) { | |
1048 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | |
1049 | |
1050 // Test decode of audio EOS buffer, just after seeking, without any prior | |
1051 // decode (other than the simulated |kAborted| resulting from the seek | |
1052 // process.) See also http://b/11696552. | |
1053 Start(CreateAudioDemuxerConfigs(kCodecAAC), true); | |
1054 SeekPlayerWithAbort(true, base::TimeDelta()); | |
1055 VerifyPlaybackCompletesOnEOSDecode(true, true); | |
1056 } | |
1057 | |
1058 TEST_F(MediaSourcePlayerTest, AV_PlaybackCompletionAcrossConfigChange) { | |
1059 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | |
1060 | |
1061 // Test that if one stream (audio) has completed decode of EOS and the other | |
1062 // stream (video) processes config change, that subsequent video EOS completes | |
1063 // A/V playback. | |
1064 // Also tests that seeking+Start() after completing playback resumes playback. | |
1065 CreateNextTextureAndSetVideoSurface(); | |
1066 Start(CreateAudioVideoDemuxerConfigs(), true); | |
1067 | |
1068 player_.OnDemuxerDataAvailable(CreateEOSAck(true)); // Audio EOS | |
1069 EXPECT_EQ(0, demuxer_->num_config_requests()); | |
1070 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckWithConfigChanged( | |
1071 false, 0)); // Video |kConfigChanged| as first unit. | |
1072 | |
1073 WaitForAudioVideoDecodeDone(); | |
1074 | |
1075 EXPECT_EQ(1, demuxer_->num_config_requests()); | |
932 EXPECT_EQ(2, demuxer_->num_data_requests()); | 1076 EXPECT_EQ(2, demuxer_->num_data_requests()); |
933 | 1077 player_.OnDemuxerConfigsAvailable(CreateAudioVideoDemuxerConfigs()); |
934 // Send EOS. | 1078 EXPECT_EQ(3, demuxer_->num_data_requests()); |
935 player_.OnDemuxerDataAvailable(CreateEOSAck(false)); | 1079 |
936 message_loop_.Run(); | 1080 // At no time after completing audio EOS decode, above, should the |
937 // No more request for data should be made. | 1081 // audio decoder job resume decoding. Send and decode video EOS. |
1082 VerifyPlaybackCompletesOnEOSDecode(true, false); | |
1083 VerifyCompletedPlaybackResumesOnSeekPlusStart(true, true); | |
1084 } | |
1085 | |
1086 TEST_F(MediaSourcePlayerTest, VA_PlaybackCompletionAcrossConfigChange) { | |
1087 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | |
1088 | |
1089 // Test that if one stream (video) has completed decode of EOS and the other | |
1090 // stream (audio) processes config change, that subsequent audio EOS completes | |
1091 // A/V playback. | |
1092 // Also tests that seeking+Start() after completing playback resumes playback. | |
1093 CreateNextTextureAndSetVideoSurface(); | |
1094 Start(CreateAudioVideoDemuxerConfigs(), true); | |
1095 | |
1096 player_.OnDemuxerDataAvailable(CreateEOSAck(false)); // Video EOS | |
1097 EXPECT_EQ(0, demuxer_->num_config_requests()); | |
1098 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckWithConfigChanged( | |
1099 true, 0)); // Audio |kConfigChanged| as first unit. | |
1100 | |
1101 WaitForAudioVideoDecodeDone(); | |
1102 | |
1103 // TODO(wolenetz/qinmin): Prevent redundant demuxer config request and change | |
1104 // expectation to 1 here. See http://crbug.com/325528. | |
1105 EXPECT_EQ(2, demuxer_->num_config_requests()); | |
938 EXPECT_EQ(2, demuxer_->num_data_requests()); | 1106 EXPECT_EQ(2, demuxer_->num_data_requests()); |
939 | 1107 player_.OnDemuxerConfigsAvailable(CreateAudioVideoDemuxerConfigs()); |
940 // Reconfirm no seek request has occurred. | 1108 EXPECT_EQ(3, demuxer_->num_data_requests()); |
941 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 1109 |
942 } | 1110 // At no time after completing video EOS decode, above, should the |
943 | 1111 // video decoder job resume decoding. Send and decode audio EOS. |
944 TEST_F(MediaSourcePlayerTest, ReplayAfterInputEOS) { | 1112 VerifyPlaybackCompletesOnEOSDecode(true, true); |
945 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1113 VerifyCompletedPlaybackResumesOnSeekPlusStart(true, true); |
946 | 1114 } |
947 // Test MediaSourcePlayer can replay after input EOS is | 1115 |
948 // reached. | 1116 TEST_F(MediaSourcePlayerTest, AV_NoPrefetchForFinishedVideoOnAudioStarvation) { |
949 CreateNextTextureAndSetVideoSurface(); | 1117 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
950 StartVideoDecoderJob(); | 1118 |
951 | 1119 // Test that if one stream (video) has completed decode of EOS, prefetch |
952 // Player should not seek the demuxer on setting initial surface. | 1120 // resulting from player starvation occurs only for the other stream (audio), |
953 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 1121 // and responding to that prefetch with EOS completes A/V playback, even if |
954 | 1122 // another starvation occurs during the latter EOS's decode. |
955 EXPECT_EQ(1, demuxer_->num_data_requests()); | 1123 CreateNextTextureAndSetVideoSurface(); |
956 // Send the first input chunk. | 1124 Start(CreateAudioVideoDemuxerConfigs(), true); |
1125 | |
1126 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | |
1127 player_.OnDemuxerDataAvailable(CreateEOSAck(false)); // Video EOS | |
1128 | |
1129 // Wait until video EOS is processed and more data (assumed to be audio) is | |
1130 // requested. | |
1131 while (demuxer_->num_data_requests() < 3) | |
1132 message_loop_.RunUntilIdle(); | |
1133 WaitForVideoDecodeDone(); | |
1134 EXPECT_EQ(3, demuxer_->num_data_requests()); | |
1135 | |
1136 // Simulate decoder underrun to trigger prefetch while still decoding audio. | |
1137 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(1)); | |
1138 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding() && | |
1139 !GetMediaDecoderJob(false)->is_decoding()); | |
1140 TriggerPlayerStarvation(); | |
1141 | |
1142 // Complete the audio decode that was in progress when simulated player | |
1143 // starvation was triggered. | |
1144 WaitForAudioDecodeDone(); | |
1145 EXPECT_EQ(4, demuxer_->num_data_requests()); | |
1146 | |
1147 player_.OnDemuxerDataAvailable(CreateEOSAck(true)); // Audio EOS | |
1148 EXPECT_FALSE(GetMediaDecoderJob(false)->is_decoding()); | |
1149 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); | |
1150 | |
1151 // Simulate another decoder underrun to trigger prefetch while decoding EOS. | |
1152 TriggerPlayerStarvation(); | |
1153 VerifyPlaybackCompletesOnEOSDecode(false, true /* ignored */); | |
1154 } | |
1155 | |
1156 TEST_F(MediaSourcePlayerTest, V_StarvationDuringEOSDecode) { | |
1157 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | |
1158 | |
1159 // Test that video-only playback completes without further data requested when | |
1160 // starvation occurs during EOS decode. | |
1161 CreateNextTextureAndSetVideoSurface(); | |
1162 StartVideoDecoderJob(true); | |
957 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 1163 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
958 message_loop_.Run(); | 1164 message_loop_.Run(); |
959 EXPECT_EQ(2, demuxer_->num_data_requests()); | 1165 |
960 | 1166 // Simulate decoder underrun to trigger prefetch while decoding EOS. |
961 // Send EOS. | 1167 player_.OnDemuxerDataAvailable(CreateEOSAck(false)); // Video EOS |
962 player_.OnDemuxerDataAvailable(CreateEOSAck(false)); | 1168 EXPECT_TRUE(GetMediaDecoderJob(false)->is_decoding()); |
1169 TriggerPlayerStarvation(); | |
1170 VerifyPlaybackCompletesOnEOSDecode(false, false /* ignored */); | |
1171 } | |
1172 | |
1173 TEST_F(MediaSourcePlayerTest, A_StarvationDuringEOSDecode) { | |
1174 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | |
1175 | |
1176 // Test that audio-only playback completes without further data requested when | |
1177 // starvation occurs during EOS decode. | |
1178 StartAudioDecoderJob(true); | |
1179 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | |
963 message_loop_.Run(); | 1180 message_loop_.Run(); |
964 // No more request for data should be made. | 1181 |
965 EXPECT_EQ(2, demuxer_->num_data_requests()); | 1182 // Simulate decoder underrun to trigger prefetch while decoding EOS. |
966 | 1183 player_.OnDemuxerDataAvailable(CreateEOSAck(true)); // Audio EOS |
967 // Initiate a seek. Skip requesting element seek of renderer. | 1184 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
968 // Instead behave as if the renderer has asked us to seek. | 1185 TriggerPlayerStarvation(); |
969 player_.SeekTo(base::TimeDelta()); | 1186 VerifyPlaybackCompletesOnEOSDecode(false, true /* ignored */); |
970 StartVideoDecoderJob(); | 1187 } |
971 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1188 |
972 player_.OnDemuxerSeekDone(kNoTimestamp()); | 1189 TEST_F(MediaSourcePlayerTest, AV_SeekDuringEOSDecodePreventsCompletion) { |
973 // Seek/Play after EOS should request more data. | 1190 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
974 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1191 |
975 | 1192 // Test that seek supercedes audio+video playback completion on simultaneous |
976 // Reconfirm only 1 seek request has occurred. | 1193 // audio and video EOS decode, if SeekTo() occurs during these EOS decodes. |
977 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1194 VerifySeekDuringEOSDecodePreventsPlaybackCompletion(true, true, true, true); |
978 } | 1195 } |
979 | 1196 |
980 TEST_F(MediaSourcePlayerTest, FirstDataIsEOS) { | 1197 TEST_F(MediaSourcePlayerTest, AV_SeekDuringAudioEOSDecodePreventsCompletion) { |
981 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1198 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
982 | 1199 |
983 // Test decode of EOS buffer without any prior decode. See also | 1200 // Test that seek supercedes audio+video playback completion on simultaneous |
984 // http://b/11696552. | 1201 // audio EOS and video non-EOS decode, if SeekTo() occurs during these |
985 Start(CreateAudioDemuxerConfigs(kCodecAAC)); | 1202 // decodes. |
986 EXPECT_TRUE(GetMediaDecoderJob(true)); | 1203 VerifySeekDuringEOSDecodePreventsPlaybackCompletion(true, true, true, false); |
987 | 1204 } |
988 EXPECT_EQ(1, demuxer_->num_data_requests()); | 1205 |
989 player_.OnDemuxerDataAvailable(CreateEOSAck(true)); | 1206 TEST_F(MediaSourcePlayerTest, AV_SeekDuringVideoEOSDecodePreventsCompletion) { |
990 EXPECT_FALSE(manager_.playback_completed()); | 1207 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
991 | 1208 |
992 message_loop_.Run(); | 1209 // Test that seek supercedes audio+video playback completion on simultaneous |
993 EXPECT_TRUE(manager_.playback_completed()); | 1210 // audio non-EOS and video EOS decode, if SeekTo() occurs during these |
994 EXPECT_EQ(1, demuxer_->num_data_requests()); | 1211 // decodes. |
995 } | 1212 VerifySeekDuringEOSDecodePreventsPlaybackCompletion(true, true, false, true); |
996 | 1213 } |
997 TEST_F(MediaSourcePlayerTest, FirstDataAfterSeekIsEOS) { | 1214 |
998 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1215 TEST_F(MediaSourcePlayerTest, V_SeekDuringEOSDecodePreventsCompletion) { |
999 | 1216 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1000 // Test decode of EOS buffer, just after seeking, without any prior decode | 1217 |
1001 // (other than the simulated |kAborted| resulting from the seek process.) | 1218 // Test that seek supercedes video-only playback completion on EOS decode, if |
1002 // See also http://b/11696552. | 1219 // SeekTo() occurs during EOS decode. |
1003 Start(CreateAudioDemuxerConfigs(kCodecAAC)); | 1220 VerifySeekDuringEOSDecodePreventsPlaybackCompletion(false, true, false, true); |
1004 EXPECT_TRUE(GetMediaDecoderJob(true)); | 1221 } |
1005 | 1222 |
1006 SeekPlayer(true, base::TimeDelta()); | 1223 TEST_F(MediaSourcePlayerTest, A_SeekDuringEOSDecodePreventsCompletion) { |
1007 EXPECT_EQ(2, demuxer_->num_data_requests()); | 1224 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1008 player_.OnDemuxerDataAvailable(CreateEOSAck(true)); | 1225 |
1009 EXPECT_FALSE(manager_.playback_completed()); | 1226 // Test that seek supercedes audio-only playback completion on EOS decode, if |
1010 | 1227 // SeekTo() occurs during EOS decode. |
1011 message_loop_.Run(); | 1228 VerifySeekDuringEOSDecodePreventsPlaybackCompletion(true, false, true, false); |
1012 EXPECT_TRUE(manager_.playback_completed()); | |
1013 EXPECT_EQ(2, demuxer_->num_data_requests()); | |
1014 } | 1229 } |
1015 | 1230 |
1016 TEST_F(MediaSourcePlayerTest, NoRequestForDataAfterAbort) { | 1231 TEST_F(MediaSourcePlayerTest, NoRequestForDataAfterAbort) { |
1017 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1232 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1018 | 1233 |
1019 // Test that the decoder will not request new data after receiving an aborted | 1234 // Test that the decoder will not request new data after receiving an aborted |
1020 // access unit. | 1235 // access unit. |
1021 StartAudioDecoderJob(); | 1236 StartAudioDecoderJob(true); |
1022 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
1023 | 1237 |
1024 // Send an aborted access unit. | 1238 // Send an aborted access unit. |
1025 player_.OnDemuxerDataAvailable(CreateAbortedAck(true)); | 1239 player_.OnDemuxerDataAvailable(CreateAbortedAck(true)); |
1026 | |
1027 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); | 1240 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
1028 // Wait for the decoder job to finish decoding. | 1241 WaitForAudioDecodeDone(); |
1029 while (GetMediaDecoderJob(true)->is_decoding()) | |
1030 message_loop_.RunUntilIdle(); | |
1031 | 1242 |
1032 // No request will be sent for new data. | 1243 // No request will be sent for new data. |
1033 EXPECT_EQ(1, demuxer_->num_data_requests()); | 1244 EXPECT_EQ(1, demuxer_->num_data_requests()); |
1034 | 1245 |
1035 // No seek requests should have occurred. | 1246 // No seek requests should have occurred. |
1036 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 1247 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
1037 } | 1248 } |
1038 | 1249 |
1039 TEST_F(MediaSourcePlayerTest, DemuxerDataArrivesAfterRelease) { | 1250 TEST_F(MediaSourcePlayerTest, DemuxerDataArrivesAfterRelease) { |
1040 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1251 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1041 | 1252 |
1042 // Test that the decoder should not crash if demuxer data arrives after | 1253 // Test that the decoder should not crash if demuxer data arrives after |
1043 // Release(). | 1254 // Release(). |
1044 StartAudioDecoderJob(); | 1255 StartAudioDecoderJob(true); |
1045 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
1046 EXPECT_TRUE(GetMediaDecoderJob(true)); | |
1047 | 1256 |
1048 ReleasePlayer(); | 1257 ReleasePlayer(); |
1049 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | 1258 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
1050 | 1259 |
1051 // The decoder job should have been released. | 1260 // The decoder job should have been released. |
1052 EXPECT_FALSE(player_.IsPlaying()); | 1261 EXPECT_FALSE(player_.IsPlaying()); |
1262 | |
1263 // No further data should have been requested. | |
1053 EXPECT_EQ(1, demuxer_->num_data_requests()); | 1264 EXPECT_EQ(1, demuxer_->num_data_requests()); |
1054 | 1265 |
1055 // No seek requests should have occurred. | 1266 // No seek requests should have occurred. |
1056 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 1267 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
1057 } | 1268 } |
1058 | 1269 |
1059 TEST_F(MediaSourcePlayerTest, BrowserSeek_RegularSeekPendsBrowserSeekDone) { | 1270 TEST_F(MediaSourcePlayerTest, BrowserSeek_RegularSeekPendsBrowserSeekDone) { |
1060 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1271 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1061 | 1272 |
1062 // Test that a browser seek, once started, delays a newly arrived regular | 1273 // Test that a browser seek, once started, delays a newly arrived regular |
1063 // SeekTo() request's demuxer seek until the browser seek is done. | 1274 // SeekTo() request's demuxer seek until the browser seek is done. |
1064 BrowserSeekPlayer(false); | 1275 BrowserSeekPlayer(false); |
1065 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
1066 | 1276 |
1067 // Simulate renderer requesting a regular seek while browser seek in progress. | 1277 // Simulate renderer requesting a regular seek while browser seek in progress. |
1068 player_.SeekTo(base::TimeDelta()); | 1278 player_.SeekTo(base::TimeDelta()); |
1069 EXPECT_FALSE(GetMediaDecoderJob(false)); | 1279 EXPECT_FALSE(GetMediaDecoderJob(false)); |
1070 | 1280 |
1071 // Simulate browser seek is done. Confirm player requests the regular seek, | 1281 // Simulate browser seek is done. Confirm player requests the regular seek, |
1072 // still has no video decoder job configured, and has not requested any | 1282 // still has no video decoder job configured, and has not requested any |
1073 // further data since the surface change event became pending in | 1283 // further data since the surface change event became pending in |
1074 // BrowserSeekPlayer(). | 1284 // BrowserSeekPlayer(). |
1075 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1285 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
(...skipping 10 matching lines...) Expand all Loading... | |
1086 EXPECT_EQ(2, demuxer_->num_data_requests()); | 1296 EXPECT_EQ(2, demuxer_->num_data_requests()); |
1087 EXPECT_EQ(2, demuxer_->num_seek_requests()); | 1297 EXPECT_EQ(2, demuxer_->num_seek_requests()); |
1088 } | 1298 } |
1089 | 1299 |
1090 TEST_F(MediaSourcePlayerTest, NoSeekForInitialReleaseAndStart) { | 1300 TEST_F(MediaSourcePlayerTest, NoSeekForInitialReleaseAndStart) { |
1091 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1301 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1092 | 1302 |
1093 // Test that no seek is requested if player Release() + Start() occurs prior | 1303 // Test that no seek is requested if player Release() + Start() occurs prior |
1094 // to receiving any data. | 1304 // to receiving any data. |
1095 CreateNextTextureAndSetVideoSurface(); | 1305 CreateNextTextureAndSetVideoSurface(); |
1096 StartVideoDecoderJob(); | 1306 StartVideoDecoderJob(true); |
1097 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
1098 EXPECT_TRUE(GetMediaDecoderJob(false)); | |
1099 | |
1100 ReleasePlayer(); | 1307 ReleasePlayer(); |
1101 | 1308 |
1102 // Pass a new non-empty surface. | 1309 // Pass a new non-empty surface. |
1103 CreateNextTextureAndSetVideoSurface(); | 1310 CreateNextTextureAndSetVideoSurface(); |
1104 | 1311 |
1105 player_.Start(); | 1312 player_.Start(); |
1106 | 1313 |
1107 // TODO(wolenetz/qinmin): Multiple in-flight data requests for same stream | 1314 // TODO(wolenetz/qinmin): Multiple in-flight data requests for same stream |
1108 // should be prevented. See http://crbug.com/306314. | 1315 // should be prevented. See http://crbug.com/306314. |
1109 EXPECT_EQ(2, demuxer_->num_data_requests()); | 1316 EXPECT_EQ(2, demuxer_->num_data_requests()); |
1317 EXPECT_TRUE(GetMediaDecoderJob(false)); | |
1110 | 1318 |
1111 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 1319 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
1112 EXPECT_TRUE(GetMediaDecoderJob(false)); | |
1113 } | 1320 } |
1114 | 1321 |
1115 TEST_F(MediaSourcePlayerTest, BrowserSeek_MidStreamReleaseAndStart) { | 1322 TEST_F(MediaSourcePlayerTest, BrowserSeek_MidStreamReleaseAndStart) { |
1116 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1323 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1117 | 1324 |
1118 // Test that one browser seek is requested if player Release() + Start(), with | 1325 // Test that one browser seek is requested if player Release() + Start(), with |
1119 // video data received between Release() and Start(). | 1326 // video data received between Release() and Start(). |
1120 BrowserSeekPlayer(true); | 1327 BrowserSeekPlayer(true); |
1121 EXPECT_EQ(1, demuxer_->num_data_requests()); | 1328 EXPECT_EQ(1, demuxer_->num_data_requests()); |
1122 | 1329 |
1123 // Simulate browser seek is done and confirm player requests more data. | 1330 // Simulate browser seek is done and confirm player requests more data. |
1124 player_.OnDemuxerSeekDone(base::TimeDelta()); | 1331 player_.OnDemuxerSeekDone(base::TimeDelta()); |
1125 EXPECT_TRUE(GetMediaDecoderJob(false)); | 1332 EXPECT_TRUE(GetMediaDecoderJob(false)); |
1126 EXPECT_EQ(2, demuxer_->num_data_requests()); | 1333 EXPECT_EQ(2, demuxer_->num_data_requests()); |
1127 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1334 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1128 } | 1335 } |
1129 | 1336 |
1130 TEST_F(MediaSourcePlayerTest, PrerollAudioAfterSeek) { | 1337 TEST_F(MediaSourcePlayerTest, PrerollAudioAfterSeek) { |
1131 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1338 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1132 | 1339 |
1133 // Test decoder job will preroll the media to the seek position. | 1340 // Test decoder job will preroll the media to the seek position. |
1134 StartAudioDecoderJob(); | 1341 StartAudioDecoderJob(true); |
1135 EXPECT_TRUE(GetMediaDecoderJob(true)); | |
1136 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
1137 | 1342 |
1138 SeekPlayer(true, base::TimeDelta::FromMilliseconds(100)); | 1343 SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100)); |
1139 EXPECT_TRUE(IsPrerolling(true)); | 1344 EXPECT_TRUE(IsPrerolling(true)); |
1140 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); | 1345 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); |
1141 | 1346 |
1142 // Send some data before the seek position. | 1347 // Send some data before the seek position. |
1143 for (int i = 1; i < 4; ++i) { | 1348 for (int i = 1; i < 4; ++i) { |
1144 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i)); | 1349 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i)); |
1145 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); | 1350 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
1146 message_loop_.Run(); | 1351 message_loop_.Run(); |
1147 } | 1352 } |
1148 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF()); | 1353 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF()); |
1149 EXPECT_TRUE(IsPrerolling(true)); | 1354 EXPECT_TRUE(IsPrerolling(true)); |
1150 | 1355 |
1151 // Send data after the seek position. | 1356 // Send data after the seek position. |
1152 DemuxerData data = CreateReadFromDemuxerAckForAudio(3); | 1357 DemuxerData data = CreateReadFromDemuxerAckForAudio(3); |
1153 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100); | 1358 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100); |
1154 player_.OnDemuxerDataAvailable(data); | 1359 player_.OnDemuxerDataAvailable(data); |
1155 message_loop_.Run(); | 1360 message_loop_.Run(); |
1156 EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF()); | 1361 EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF()); |
1157 EXPECT_FALSE(IsPrerolling(true)); | 1362 EXPECT_FALSE(IsPrerolling(true)); |
1158 } | 1363 } |
1159 | 1364 |
1160 TEST_F(MediaSourcePlayerTest, PrerollVideoAfterSeek) { | 1365 TEST_F(MediaSourcePlayerTest, PrerollVideoAfterSeek) { |
1161 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1366 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1162 | 1367 |
1163 // Test decoder job will preroll the media to the seek position. | 1368 // Test decoder job will preroll the media to the seek position. |
1164 CreateNextTextureAndSetVideoSurface(); | 1369 CreateNextTextureAndSetVideoSurface(); |
1165 StartVideoDecoderJob(); | 1370 StartVideoDecoderJob(true); |
1166 EXPECT_TRUE(GetMediaDecoderJob(false)); | |
1167 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
1168 | 1371 |
1169 SeekPlayer(false, base::TimeDelta::FromMilliseconds(100)); | 1372 SeekPlayerWithAbort(false, base::TimeDelta::FromMilliseconds(100)); |
1170 EXPECT_TRUE(IsPrerolling(false)); | 1373 EXPECT_TRUE(IsPrerolling(false)); |
1171 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); | 1374 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); |
1172 | 1375 |
1173 // Send some data before the seek position. | 1376 // Send some data before the seek position. |
1174 DemuxerData data; | 1377 DemuxerData data; |
1175 for (int i = 1; i < 4; ++i) { | 1378 for (int i = 1; i < 4; ++i) { |
1176 data = CreateReadFromDemuxerAckForVideo(); | 1379 data = CreateReadFromDemuxerAckForVideo(); |
1177 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(i * 30); | 1380 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(i * 30); |
1178 player_.OnDemuxerDataAvailable(data); | 1381 player_.OnDemuxerDataAvailable(data); |
1179 EXPECT_TRUE(GetMediaDecoderJob(false)->is_decoding()); | 1382 EXPECT_TRUE(GetMediaDecoderJob(false)->is_decoding()); |
1180 message_loop_.Run(); | 1383 message_loop_.Run(); |
1181 } | 1384 } |
1182 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF()); | 1385 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF()); |
1183 EXPECT_TRUE(IsPrerolling(false)); | 1386 EXPECT_TRUE(IsPrerolling(false)); |
1184 | 1387 |
1185 // Send data at the seek position. | 1388 // Send data at the seek position. |
1186 data = CreateReadFromDemuxerAckForVideo(); | 1389 data = CreateReadFromDemuxerAckForVideo(); |
1187 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100); | 1390 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100); |
1188 player_.OnDemuxerDataAvailable(data); | 1391 player_.OnDemuxerDataAvailable(data); |
1189 message_loop_.Run(); | 1392 message_loop_.Run(); |
1190 | 1393 |
1191 // TODO(wolenetz/qinmin): Player's maintenance of current time for video-only | 1394 // TODO(wolenetz/qinmin): Player's maintenance of current time for video-only |
1192 // streams depends on decoder output, which may be initially inaccurate, and | 1395 // streams depends on decoder output, which may be initially inaccurate, and |
1193 // encoded video test data may also need updating. Verify at least that AU | 1396 // encoded video test data may also need updating. Verify at least that AU |
1194 // timestamp-based preroll logic has determined video preroll has completed. | 1397 // timestamp-based preroll logic has determined video preroll has completed. |
1398 // See http://crbug.com/310823 and http://b/11356652. | |
1195 EXPECT_FALSE(IsPrerolling(false)); | 1399 EXPECT_FALSE(IsPrerolling(false)); |
1196 } | 1400 } |
1197 | 1401 |
1198 TEST_F(MediaSourcePlayerTest, SeekingAfterCompletingPrerollRestartsPreroll) { | 1402 TEST_F(MediaSourcePlayerTest, SeekingAfterCompletingPrerollRestartsPreroll) { |
1199 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1403 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1200 | 1404 |
1201 // Test decoder job will begin prerolling upon seek, when it was not | 1405 // Test decoder job will begin prerolling upon seek, when it was not |
1202 // prerolling prior to the seek. | 1406 // prerolling prior to the seek. |
1203 StartAudioDecoderJob(); | 1407 StartAudioDecoderJob(true); |
1204 MediaDecoderJob* decoder_job = GetMediaDecoderJob(true); | 1408 MediaDecoderJob* decoder_job = GetMediaDecoderJob(true); |
1205 EXPECT_TRUE(decoder_job); | |
1206 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
1207 EXPECT_TRUE(IsPrerolling(true)); | 1409 EXPECT_TRUE(IsPrerolling(true)); |
1208 | 1410 |
1209 // Complete the initial preroll by feeding data to the decoder. | 1411 // Complete the initial preroll by feeding data to the decoder. |
1210 for (int i = 0; i < 4; ++i) { | 1412 for (int i = 0; i < 4; ++i) { |
1211 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i)); | 1413 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i)); |
1212 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); | 1414 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
1213 message_loop_.Run(); | 1415 message_loop_.Run(); |
1214 } | 1416 } |
1215 EXPECT_LT(0.0, player_.GetCurrentTime().InMillisecondsF()); | 1417 EXPECT_LT(0.0, player_.GetCurrentTime().InMillisecondsF()); |
1216 EXPECT_FALSE(IsPrerolling(true)); | 1418 EXPECT_FALSE(IsPrerolling(true)); |
1217 | 1419 |
1218 SeekPlayer(true, base::TimeDelta::FromMilliseconds(500)); | 1420 SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(500)); |
1219 | 1421 |
1220 // Prerolling should have begun again. | 1422 // Prerolling should have begun again. |
1221 EXPECT_TRUE(IsPrerolling(true)); | 1423 EXPECT_TRUE(IsPrerolling(true)); |
1222 EXPECT_EQ(500.0, GetPrerollTimestamp().InMillisecondsF()); | 1424 EXPECT_EQ(500.0, GetPrerollTimestamp().InMillisecondsF()); |
1223 | 1425 |
1224 // Send data at and after the seek position. Prerolling should complete. | 1426 // Send data at and after the seek position. Prerolling should complete. |
1225 for (int i = 0; i < 4; ++i) { | 1427 for (int i = 0; i < 4; ++i) { |
1226 DemuxerData data = CreateReadFromDemuxerAckForAudio(i); | 1428 DemuxerData data = CreateReadFromDemuxerAckForAudio(i); |
1227 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds( | 1429 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds( |
1228 500 + 30 * (i - 1)); | 1430 500 + 30 * (i - 1)); |
1229 player_.OnDemuxerDataAvailable(data); | 1431 player_.OnDemuxerDataAvailable(data); |
1230 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); | 1432 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
1231 message_loop_.Run(); | 1433 message_loop_.Run(); |
1232 } | 1434 } |
1233 EXPECT_LT(500.0, player_.GetCurrentTime().InMillisecondsF()); | 1435 EXPECT_LT(500.0, player_.GetCurrentTime().InMillisecondsF()); |
1234 EXPECT_FALSE(IsPrerolling(true)); | 1436 EXPECT_FALSE(IsPrerolling(true)); |
1235 | 1437 |
1236 // Throughout this test, we should have not re-created the decoder job, so | 1438 // Throughout this test, we should have not re-created the decoder job, so |
1237 // IsPrerolling() transition from false to true was not due to constructor | 1439 // IsPrerolling() transition from false to true was not due to constructor |
1238 // initialization. It was due to BeginPrerolling(). | 1440 // initialization. It was due to BeginPrerolling(). |
1239 EXPECT_EQ(decoder_job, GetMediaDecoderJob(true)); | 1441 EXPECT_EQ(decoder_job, GetMediaDecoderJob(true)); |
1240 } | 1442 } |
1241 | 1443 |
1242 TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossReleaseAndStart) { | 1444 TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossReleaseAndStart) { |
1243 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1445 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1244 | 1446 |
1245 // Test decoder job will resume media prerolling if interrupted by Release() | 1447 // Test decoder job will resume media prerolling if interrupted by Release() |
1246 // and Start(). | 1448 // and Start(). |
1247 StartAudioDecoderJob(); | 1449 StartAudioDecoderJob(true); |
1248 EXPECT_TRUE(GetMediaDecoderJob(true)); | |
1249 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
1250 | 1450 |
1251 SeekPlayer(true, base::TimeDelta::FromMilliseconds(100)); | 1451 SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100)); |
1252 EXPECT_TRUE(IsPrerolling(true)); | 1452 EXPECT_TRUE(IsPrerolling(true)); |
1253 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); | 1453 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); |
1254 | 1454 |
1255 // Send some data before the seek position. | 1455 // Send some data before the seek position. |
1256 // Test uses 'large' number of iterations because decoder job may not get | 1456 // Test uses 'large' number of iterations because decoder job may not get |
1257 // MEDIA_CODEC_OK output status until after a few dequeue output attempts. | 1457 // MEDIA_CODEC_OK output status until after a few dequeue output attempts. |
1258 // This allows decoder status to stabilize prior to AU timestamp reaching | 1458 // This allows decoder status to stabilize prior to AU timestamp reaching |
1259 // the preroll target. | 1459 // the preroll target. |
1260 DemuxerData data; | 1460 DemuxerData data; |
1261 for (int i = 0; i < 10; ++i) { | 1461 for (int i = 0; i < 10; ++i) { |
1262 data = CreateReadFromDemuxerAckForAudio(3); | 1462 data = CreateReadFromDemuxerAckForAudio(3); |
1263 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(i * 10); | 1463 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(i * 10); |
1264 if (i == 1) { | 1464 if (i == 1) { |
1265 // While still prerolling, Release() and Start() the player. | 1465 // While still prerolling, Release() and Start() the player. |
1266 // TODO(qinmin): Simulation of multiple in-flight data requests (one from | 1466 // TODO(qinmin): Simulation of multiple in-flight data requests (one from |
1267 // before Release(), one from after Start()) is not included here, and | 1467 // before Release(), one from after Start()) is not included here, and |
1268 // neither is any data enqueued for later decode if it arrives after | 1468 // neither is any data enqueued for later decode if it arrives after |
1269 // Release() and before Start(). See http://crbug.com/306314. Assumption | 1469 // Release() and before Start(). See http://crbug.com/306314. Assumption |
1270 // for this test, to prevent flakiness until the bug is fixed, is the | 1470 // for this test, to prevent flakiness until the bug is fixed, is the |
1271 // first request's data arrives before Start(). Though that data is not | 1471 // first request's data arrives before Start(). Though that data is not |
1272 // seen by decoder, this assumption allows preroll continuation | 1472 // seen by decoder, this assumption allows preroll continuation |
1273 // verification and prevents multiple in-flight data requests. | 1473 // verification and prevents multiple in-flight data requests. |
1274 ReleasePlayer(); | 1474 ReleasePlayer(); |
1275 player_.OnDemuxerDataAvailable(data); | 1475 player_.OnDemuxerDataAvailable(data); |
1276 message_loop_.RunUntilIdle(); | 1476 message_loop_.RunUntilIdle(); |
1277 EXPECT_FALSE(GetMediaDecoderJob(true)); | 1477 EXPECT_FALSE(GetMediaDecoderJob(true)); |
1278 StartAudioDecoderJob(); | 1478 StartAudioDecoderJob(true); |
1279 EXPECT_TRUE(GetMediaDecoderJob(true)); | |
1280 } else { | 1479 } else { |
1281 player_.OnDemuxerDataAvailable(data); | 1480 player_.OnDemuxerDataAvailable(data); |
1282 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); | 1481 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
1283 message_loop_.Run(); | 1482 message_loop_.Run(); |
1284 } | 1483 } |
1285 EXPECT_TRUE(IsPrerolling(true)); | 1484 EXPECT_TRUE(IsPrerolling(true)); |
1286 } | 1485 } |
1287 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF()); | 1486 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF()); |
1288 EXPECT_TRUE(IsPrerolling(true)); | 1487 EXPECT_TRUE(IsPrerolling(true)); |
1289 | 1488 |
1290 // Send data after the seek position. | 1489 // Send data after the seek position. |
1291 data = CreateReadFromDemuxerAckForAudio(3); | 1490 data = CreateReadFromDemuxerAckForAudio(3); |
1292 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100); | 1491 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100); |
1293 player_.OnDemuxerDataAvailable(data); | 1492 player_.OnDemuxerDataAvailable(data); |
1294 message_loop_.Run(); | 1493 message_loop_.Run(); |
1295 EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF()); | 1494 EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF()); |
1296 EXPECT_FALSE(IsPrerolling(true)); | 1495 EXPECT_FALSE(IsPrerolling(true)); |
1297 } | 1496 } |
1298 | 1497 |
1299 TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossConfigChange) { | 1498 TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossConfigChange) { |
1300 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1499 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1301 | 1500 |
1302 // Test decoder job will resume media prerolling if interrupted by | 1501 // Test decoder job will resume media prerolling if interrupted by |
1303 // |kConfigChanged| and OnDemuxerConfigsAvailable(). | 1502 // |kConfigChanged| and OnDemuxerConfigsAvailable(). |
1304 StartAudioDecoderJob(); | 1503 StartAudioDecoderJob(true); |
1305 EXPECT_TRUE(GetMediaDecoderJob(true)); | |
1306 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
1307 | 1504 |
1308 SeekPlayer(true, base::TimeDelta::FromMilliseconds(100)); | 1505 SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100)); |
1309 EXPECT_TRUE(IsPrerolling(true)); | 1506 EXPECT_TRUE(IsPrerolling(true)); |
1310 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); | 1507 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); |
1311 | 1508 |
1312 // In response to data request, simulate that demuxer signals config change by | 1509 // In response to data request, simulate that demuxer signals config change by |
1313 // sending an AU with |kConfigChanged|. Player should prepare to reconfigure | 1510 // sending an AU with |kConfigChanged|. Player should prepare to reconfigure |
1314 // the audio decoder job, and should request new demuxer configs. | 1511 // the audio decoder job, and should request new demuxer configs. |
1315 DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged(true, 0); | 1512 DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged(true, 0); |
1316 EXPECT_EQ(0, demuxer_->num_config_requests()); | 1513 EXPECT_EQ(0, demuxer_->num_config_requests()); |
1317 player_.OnDemuxerDataAvailable(data); | 1514 player_.OnDemuxerDataAvailable(data); |
1318 EXPECT_EQ(1, demuxer_->num_config_requests()); | 1515 EXPECT_EQ(1, demuxer_->num_config_requests()); |
(...skipping 18 matching lines...) Expand all Loading... | |
1337 EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF()); | 1534 EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF()); |
1338 EXPECT_FALSE(IsPrerolling(true)); | 1535 EXPECT_FALSE(IsPrerolling(true)); |
1339 } | 1536 } |
1340 | 1537 |
1341 TEST_F(MediaSourcePlayerTest, SimultaneousAudioVideoConfigChange) { | 1538 TEST_F(MediaSourcePlayerTest, SimultaneousAudioVideoConfigChange) { |
1342 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1539 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1343 | 1540 |
1344 // Test that the player allows simultaneous audio and video config change, | 1541 // Test that the player allows simultaneous audio and video config change, |
1345 // such as might occur during OnPrefetchDone() if next access unit for both | 1542 // such as might occur during OnPrefetchDone() if next access unit for both |
1346 // audio and video jobs is |kConfigChanged|. | 1543 // audio and video jobs is |kConfigChanged|. |
1347 Start(CreateAudioVideoDemuxerConfigs()); | |
1348 CreateNextTextureAndSetVideoSurface(); | 1544 CreateNextTextureAndSetVideoSurface(); |
1545 Start(CreateAudioVideoDemuxerConfigs(), true); | |
1349 MediaDecoderJob* first_audio_job = GetMediaDecoderJob(true); | 1546 MediaDecoderJob* first_audio_job = GetMediaDecoderJob(true); |
1350 MediaDecoderJob* first_video_job = GetMediaDecoderJob(false); | 1547 MediaDecoderJob* first_video_job = GetMediaDecoderJob(false); |
1351 EXPECT_TRUE(first_audio_job && first_video_job); | |
1352 | 1548 |
1353 // Simulate audio |kConfigChanged| prefetched as standalone access unit. | 1549 // Simulate audio |kConfigChanged| prefetched as standalone access unit. |
1354 player_.OnDemuxerDataAvailable( | 1550 player_.OnDemuxerDataAvailable( |
1355 CreateReadFromDemuxerAckWithConfigChanged(true, 0)); | 1551 CreateReadFromDemuxerAckWithConfigChanged(true, 0)); |
1356 EXPECT_EQ(0, demuxer_->num_config_requests()); // No OnPrefetchDone() yet. | 1552 EXPECT_EQ(0, demuxer_->num_config_requests()); // No OnPrefetchDone() yet. |
1357 | 1553 |
1358 // Simulate video |kConfigChanged| prefetched as standalone access unit. | 1554 // Simulate video |kConfigChanged| prefetched as standalone access unit. |
1359 player_.OnDemuxerDataAvailable( | 1555 player_.OnDemuxerDataAvailable( |
1360 CreateReadFromDemuxerAckWithConfigChanged(false, 0)); | 1556 CreateReadFromDemuxerAckWithConfigChanged(false, 0)); |
1361 EXPECT_EQ(1, demuxer_->num_config_requests()); // OnPrefetchDone() occurred. | 1557 EXPECT_EQ(1, demuxer_->num_config_requests()); // OnPrefetchDone() occurred. |
1362 EXPECT_EQ(2, demuxer_->num_data_requests()); | 1558 EXPECT_EQ(2, demuxer_->num_data_requests()); // No more data requested yet. |
1363 | 1559 |
1364 // No job re-creation should occur until the requested configs arrive. | 1560 // No job re-creation should occur until the requested configs arrive. |
1365 EXPECT_EQ(first_audio_job, GetMediaDecoderJob(true)); | 1561 EXPECT_EQ(first_audio_job, GetMediaDecoderJob(true)); |
1366 EXPECT_EQ(first_video_job, GetMediaDecoderJob(false)); | 1562 EXPECT_EQ(first_video_job, GetMediaDecoderJob(false)); |
1367 | 1563 |
1368 player_.OnDemuxerConfigsAvailable(CreateAudioVideoDemuxerConfigs()); | 1564 player_.OnDemuxerConfigsAvailable(CreateAudioVideoDemuxerConfigs()); |
1369 EXPECT_EQ(4, demuxer_->num_data_requests()); | 1565 EXPECT_EQ(4, demuxer_->num_data_requests()); |
1370 MediaDecoderJob* second_audio_job = GetMediaDecoderJob(true); | 1566 MediaDecoderJob* second_audio_job = GetMediaDecoderJob(true); |
1371 MediaDecoderJob* second_video_job = GetMediaDecoderJob(false); | 1567 MediaDecoderJob* second_video_job = GetMediaDecoderJob(false); |
1372 EXPECT_NE(first_audio_job, second_audio_job); | 1568 EXPECT_NE(first_audio_job, second_audio_job); |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1551 | 1747 |
1552 TEST_F(MediaSourcePlayerTest, ReleaseWithOnPrefetchDoneAlreadyPosted) { | 1748 TEST_F(MediaSourcePlayerTest, ReleaseWithOnPrefetchDoneAlreadyPosted) { |
1553 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1749 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1554 | 1750 |
1555 // Test if OnPrefetchDone() had already been posted before and is executed | 1751 // Test if OnPrefetchDone() had already been posted before and is executed |
1556 // after Release(), then player does not DCHECK. This test is fragile to | 1752 // after Release(), then player does not DCHECK. This test is fragile to |
1557 // change to MediaDecoderJob::Prefetch() implementation; it assumes task | 1753 // change to MediaDecoderJob::Prefetch() implementation; it assumes task |
1558 // is posted to run |prefetch_cb| if the job already HasData(). | 1754 // is posted to run |prefetch_cb| if the job already HasData(). |
1559 // TODO(wolenetz): Remove MSP::set_decode_callback_for_testing() if this test | 1755 // TODO(wolenetz): Remove MSP::set_decode_callback_for_testing() if this test |
1560 // becomes obsolete. See http://crbug.com/304234. | 1756 // becomes obsolete. See http://crbug.com/304234. |
1561 StartAudioDecoderJob(); | 1757 StartAudioDecoderJob(true); |
1562 | 1758 |
1563 // Escape the original prefetch by decoding a single access unit. | 1759 // Escape the original prefetch by decoding a single access unit. |
1564 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | 1760 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
1565 message_loop_.Run(); | 1761 message_loop_.Run(); |
1566 | 1762 |
1567 // Prime the job with a few more access units, so that a later prefetch, | 1763 // Prime the job with a few more access units, so that a later prefetch, |
1568 // triggered by starvation to simulate decoder underrun, can trivially | 1764 // triggered by starvation to simulate decoder underrun, can trivially |
1569 // post task to run OnPrefetchDone(). | 1765 // post task to run OnPrefetchDone(). |
1570 player_.OnDemuxerDataAvailable( | 1766 player_.OnDemuxerDataAvailable( |
1571 CreateReadFromDemuxerAckWithConfigChanged(true, 4)); | 1767 CreateReadFromDemuxerAckWithConfigChanged(true, 4)); |
1572 EXPECT_TRUE(GetMediaDecoderJob(true) && | 1768 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); |
1573 GetMediaDecoderJob(true)->is_decoding()); | |
1574 | 1769 |
1575 // Simulate decoder underrun, so trivial prefetch starts while still decoding. | 1770 // Simulate decoder underrun, so trivial prefetch starts while still decoding. |
1576 // The prefetch and posting of OnPrefetchDone() will not occur until next | 1771 // The prefetch and posting of OnPrefetchDone() will not occur until next |
1577 // MediaDecoderCallBack() occurs. | 1772 // MediaDecoderCallBack() occurs. |
1578 TriggerPlayerStarvation(); | 1773 TriggerPlayerStarvation(); |
1579 | 1774 |
1580 // Upon the next successful decode callback, post a task to call Release() on | 1775 // Upon the next successful decode callback, post a task to call Release() on |
1581 // the |player_|, such that the trivial OnPrefetchDone() task posting also | 1776 // the |player_|, such that the trivial OnPrefetchDone() task posting also |
1582 // occurs and should execute after the Release(). | 1777 // occurs and should execute after the Release(). |
1583 OnNextTestDecodeCallbackPostTaskToReleasePlayer(); | 1778 OnNextTestDecodeCallbackPostTaskToReleasePlayer(); |
1584 | 1779 |
1585 while (GetMediaDecoderJob(true)) | 1780 while (GetMediaDecoderJob(true)) |
1586 message_loop_.RunUntilIdle(); | 1781 message_loop_.RunUntilIdle(); |
1587 EXPECT_TRUE(decoder_callback_hook_executed_); | 1782 EXPECT_TRUE(decoder_callback_hook_executed_); |
1588 EXPECT_EQ(2, demuxer_->num_data_requests()); | 1783 EXPECT_EQ(2, demuxer_->num_data_requests()); |
1589 | 1784 |
1590 // Player should have no decoder job until after Start(). | 1785 // Player should have no decoder job until after Start(). |
1591 StartAudioDecoderJob(); | 1786 StartAudioDecoderJob(true); |
1592 EXPECT_TRUE(GetMediaDecoderJob(true)); | |
1593 } | 1787 } |
1594 | 1788 |
1595 TEST_F(MediaSourcePlayerTest, SeekToThenReleaseThenDemuxerSeekAndDone) { | 1789 TEST_F(MediaSourcePlayerTest, SeekToThenReleaseThenDemuxerSeekAndDone) { |
1596 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1790 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1597 | 1791 |
1598 // Test if Release() occurs after SeekTo(), but the DemuxerSeek IPC request | 1792 // Test if Release() occurs after SeekTo(), but the DemuxerSeek IPC request |
1599 // has not yet been sent, then the seek request is sent after Release(). Also, | 1793 // has not yet been sent, then the seek request is sent after Release(). Also, |
1600 // test if OnDemuxerSeekDone() occurs prior to next Start(), then the player | 1794 // test if OnDemuxerSeekDone() occurs prior to next Start(), then the player |
1601 // will resume correct post-seek preroll upon Start(). | 1795 // will resume correct post-seek preroll upon Start(). |
1602 StartAudioDecoderJobAndSeekToWhileDecoding( | 1796 StartAudioDecoderJobAndSeekToWhileDecoding( |
1603 base::TimeDelta::FromMilliseconds(100)); | 1797 base::TimeDelta::FromMilliseconds(100)); |
1604 ReleasePlayer(); | 1798 ReleasePlayer(); |
1605 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1799 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1606 | 1800 |
1607 player_.OnDemuxerSeekDone(kNoTimestamp()); | 1801 player_.OnDemuxerSeekDone(kNoTimestamp()); |
1608 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); | 1802 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); |
1609 EXPECT_FALSE(GetMediaDecoderJob(true)); | 1803 EXPECT_FALSE(GetMediaDecoderJob(true)); |
1610 EXPECT_FALSE(player_.IsPlaying()); | 1804 EXPECT_FALSE(player_.IsPlaying()); |
1611 | 1805 |
1612 // Player should begin prefetch and resume preroll upon Start(). | 1806 // Player should begin prefetch and resume preroll upon Start(). |
1613 EXPECT_EQ(1, demuxer_->num_data_requests()); | 1807 EXPECT_EQ(1, demuxer_->num_data_requests()); |
1614 StartAudioDecoderJob(); | 1808 StartAudioDecoderJob(true); |
1615 EXPECT_TRUE(GetMediaDecoderJob(true)); | |
1616 EXPECT_TRUE(IsPrerolling(true)); | 1809 EXPECT_TRUE(IsPrerolling(true)); |
1617 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); | 1810 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); |
1618 EXPECT_EQ(2, demuxer_->num_data_requests()); | |
1619 | 1811 |
1620 // No further seek should have been requested since Release(), above. | 1812 // No further seek should have been requested since Release(), above. |
1621 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1813 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1622 } | 1814 } |
1623 | 1815 |
1624 TEST_F(MediaSourcePlayerTest, SeekToThenReleaseThenDemuxerSeekThenStart) { | 1816 TEST_F(MediaSourcePlayerTest, SeekToThenReleaseThenDemuxerSeekThenStart) { |
1625 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1817 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1626 | 1818 |
1627 // Test if Release() occurs after SeekTo(), but the DemuxerSeek IPC request | 1819 // Test if Release() occurs after SeekTo(), but the DemuxerSeek IPC request |
1628 // has not yet been sent, then the seek request is sent after Release(). Also, | 1820 // has not yet been sent, then the seek request is sent after Release(). Also, |
1629 // test if OnDemuxerSeekDone() does not occur until after the next Start(), | 1821 // test if OnDemuxerSeekDone() does not occur until after the next Start(), |
1630 // then the player remains pending seek done until (and resumes correct | 1822 // then the player remains pending seek done until (and resumes correct |
1631 // post-seek preroll after) OnDemuxerSeekDone(). | 1823 // post-seek preroll after) OnDemuxerSeekDone(). |
1632 StartAudioDecoderJobAndSeekToWhileDecoding( | 1824 StartAudioDecoderJobAndSeekToWhileDecoding( |
1633 base::TimeDelta::FromMilliseconds(100)); | 1825 base::TimeDelta::FromMilliseconds(100)); |
1634 ReleasePlayer(); | 1826 ReleasePlayer(); |
1635 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1827 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1636 | 1828 |
1637 // Player should not prefetch upon Start() nor create the decoder job, due to | 1829 // Player should not prefetch upon Start() nor create the decoder job, due to |
1638 // awaiting DemuxerSeekDone. | 1830 // awaiting DemuxerSeekDone. |
1639 StartAudioDecoderJob(); | |
1640 EXPECT_FALSE(GetMediaDecoderJob(true)); | |
1641 EXPECT_EQ(1, demuxer_->num_data_requests()); | 1831 EXPECT_EQ(1, demuxer_->num_data_requests()); |
1832 StartAudioDecoderJob(false); | |
1642 | 1833 |
1643 player_.OnDemuxerSeekDone(kNoTimestamp()); | 1834 player_.OnDemuxerSeekDone(kNoTimestamp()); |
1644 EXPECT_TRUE(GetMediaDecoderJob(true)); | 1835 EXPECT_TRUE(GetMediaDecoderJob(true)); |
1645 EXPECT_TRUE(IsPrerolling(true)); | 1836 EXPECT_TRUE(IsPrerolling(true)); |
1646 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); | 1837 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); |
1647 EXPECT_EQ(2, demuxer_->num_data_requests()); | 1838 EXPECT_EQ(2, demuxer_->num_data_requests()); |
1648 | 1839 |
1649 // No further seek should have been requested since Release(), above. | 1840 // No further seek should have been requested since Release(), above. |
1650 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1841 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1651 } | 1842 } |
1652 | 1843 |
1653 TEST_F(MediaSourcePlayerTest, SeekToThenDemuxerSeekThenReleaseThenSeekDone) { | 1844 TEST_F(MediaSourcePlayerTest, SeekToThenDemuxerSeekThenReleaseThenSeekDone) { |
1654 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1845 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1655 | 1846 |
1656 // Test if Release() occurs after a SeekTo()'s subsequent DemuxerSeek IPC | 1847 // Test if Release() occurs after a SeekTo()'s subsequent DemuxerSeek IPC |
1657 // request and OnDemuxerSeekDone() arrives prior to the next Start(), then the | 1848 // request and OnDemuxerSeekDone() arrives prior to the next Start(), then the |
1658 // player will resume correct post-seek preroll upon Start(). | 1849 // player will resume correct post-seek preroll upon Start(). |
1659 StartAudioDecoderJobAndSeekToWhileDecoding( | 1850 StartAudioDecoderJobAndSeekToWhileDecoding( |
1660 base::TimeDelta::FromMilliseconds(100)); | 1851 base::TimeDelta::FromMilliseconds(100)); |
1661 while (GetMediaDecoderJob(true)->is_decoding()) | 1852 WaitForAudioDecodeDone(); |
1662 message_loop_.RunUntilIdle(); | |
1663 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1853 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1664 | 1854 |
1665 ReleasePlayer(); | 1855 ReleasePlayer(); |
1666 player_.OnDemuxerSeekDone(kNoTimestamp()); | 1856 player_.OnDemuxerSeekDone(kNoTimestamp()); |
1667 EXPECT_FALSE(player_.IsPlaying()); | 1857 EXPECT_FALSE(player_.IsPlaying()); |
1668 EXPECT_FALSE(GetMediaDecoderJob(true)); | 1858 EXPECT_FALSE(GetMediaDecoderJob(true)); |
1669 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); | 1859 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); |
1670 | 1860 |
1671 // Player should begin prefetch and resume preroll upon Start(). | 1861 // Player should begin prefetch and resume preroll upon Start(). |
1672 EXPECT_EQ(1, demuxer_->num_data_requests()); | 1862 EXPECT_EQ(1, demuxer_->num_data_requests()); |
1673 StartAudioDecoderJob(); | 1863 StartAudioDecoderJob(true); |
1674 EXPECT_TRUE(GetMediaDecoderJob(true)); | |
1675 EXPECT_TRUE(IsPrerolling(true)); | 1864 EXPECT_TRUE(IsPrerolling(true)); |
1676 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); | 1865 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); |
1677 EXPECT_EQ(2, demuxer_->num_data_requests()); | |
1678 | 1866 |
1679 // No further seek should have been requested since before Release(), above. | 1867 // No further seek should have been requested since before Release(), above. |
1680 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1868 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1681 } | 1869 } |
1682 | 1870 |
1683 TEST_F(MediaSourcePlayerTest, SeekToThenReleaseThenStart) { | 1871 TEST_F(MediaSourcePlayerTest, SeekToThenReleaseThenStart) { |
1684 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1872 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1685 | 1873 |
1686 // Test if Release() occurs after a SeekTo()'s subsequent DemuxerSeeK IPC | 1874 // Test if Release() occurs after a SeekTo()'s subsequent DemuxerSeeK IPC |
1687 // request OnDemuxerSeekDone() does not occur until after the next Start(), | 1875 // request and OnDemuxerSeekDone() does not occur until after the next |
1688 // then the player remains pending seek done until (and resumes correct | 1876 // Start(), then the player remains pending seek done until (and resumes |
1689 // post-seek preroll after) OnDemuxerSeekDone(). | 1877 // correct post-seek preroll after) OnDemuxerSeekDone(). |
1690 StartAudioDecoderJobAndSeekToWhileDecoding( | 1878 StartAudioDecoderJobAndSeekToWhileDecoding( |
1691 base::TimeDelta::FromMilliseconds(100)); | 1879 base::TimeDelta::FromMilliseconds(100)); |
1692 while (GetMediaDecoderJob(true)->is_decoding()) | 1880 WaitForAudioDecodeDone(); |
1693 message_loop_.RunUntilIdle(); | |
1694 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1881 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1695 | 1882 |
1696 ReleasePlayer(); | 1883 ReleasePlayer(); |
1697 StartAudioDecoderJob(); | |
1698 EXPECT_FALSE(GetMediaDecoderJob(true)); | |
1699 EXPECT_EQ(1, demuxer_->num_data_requests()); | 1884 EXPECT_EQ(1, demuxer_->num_data_requests()); |
1885 StartAudioDecoderJob(false); | |
1700 | 1886 |
1701 player_.OnDemuxerSeekDone(kNoTimestamp()); | 1887 player_.OnDemuxerSeekDone(kNoTimestamp()); |
1702 EXPECT_TRUE(GetMediaDecoderJob(true)); | 1888 EXPECT_TRUE(GetMediaDecoderJob(true)); |
1703 EXPECT_TRUE(IsPrerolling(true)); | 1889 EXPECT_TRUE(IsPrerolling(true)); |
1704 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); | 1890 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); |
1705 EXPECT_EQ(2, demuxer_->num_data_requests()); | 1891 EXPECT_EQ(2, demuxer_->num_data_requests()); |
1706 | 1892 |
1707 // No further seek should have been requested since before Release(), above. | 1893 // No further seek should have been requested since before Release(), above. |
1708 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1894 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1709 } | 1895 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1766 base::TimeDelta expected_preroll_timestamp = player_.GetCurrentTime(); | 1952 base::TimeDelta expected_preroll_timestamp = player_.GetCurrentTime(); |
1767 ReleasePlayer(); | 1953 ReleasePlayer(); |
1768 | 1954 |
1769 player_.OnDemuxerSeekDone(expected_preroll_timestamp); | 1955 player_.OnDemuxerSeekDone(expected_preroll_timestamp); |
1770 EXPECT_FALSE(player_.IsPlaying()); | 1956 EXPECT_FALSE(player_.IsPlaying()); |
1771 EXPECT_FALSE(GetMediaDecoderJob(false)); | 1957 EXPECT_FALSE(GetMediaDecoderJob(false)); |
1772 EXPECT_EQ(expected_preroll_timestamp, GetPrerollTimestamp()); | 1958 EXPECT_EQ(expected_preroll_timestamp, GetPrerollTimestamp()); |
1773 | 1959 |
1774 // Player should begin prefetch and resume preroll upon Start(). | 1960 // Player should begin prefetch and resume preroll upon Start(). |
1775 EXPECT_EQ(1, demuxer_->num_data_requests()); | 1961 EXPECT_EQ(1, demuxer_->num_data_requests()); |
1776 StartVideoDecoderJob(); | |
1777 CreateNextTextureAndSetVideoSurface(); | 1962 CreateNextTextureAndSetVideoSurface(); |
1778 EXPECT_TRUE(GetMediaDecoderJob(false)); | 1963 StartVideoDecoderJob(true); |
1779 EXPECT_TRUE(IsPrerolling(false)); | 1964 EXPECT_TRUE(IsPrerolling(false)); |
1780 EXPECT_EQ(expected_preroll_timestamp, GetPrerollTimestamp()); | 1965 EXPECT_EQ(expected_preroll_timestamp, GetPrerollTimestamp()); |
1781 EXPECT_EQ(expected_preroll_timestamp, player_.GetCurrentTime()); | 1966 EXPECT_EQ(expected_preroll_timestamp, player_.GetCurrentTime()); |
1782 EXPECT_EQ(2, demuxer_->num_data_requests()); | |
1783 | 1967 |
1784 // No further seek should have been requested since BrowserSeekPlayer(). | 1968 // No further seek should have been requested since BrowserSeekPlayer(). |
1785 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1969 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1786 } | 1970 } |
1787 | 1971 |
1788 TEST_F(MediaSourcePlayerTest, BrowserSeek_ThenReleaseThenStart) { | 1972 TEST_F(MediaSourcePlayerTest, BrowserSeek_ThenReleaseThenStart) { |
1789 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1973 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1790 | 1974 |
1791 // Test that Release() after a browser seek's DemuxerSeek IPC request has been | 1975 // Test that Release() after a browser seek's DemuxerSeek IPC request has been |
1792 // sent behaves similar to a regular seek: if OnDemuxerSeekDone() does not | 1976 // sent behaves similar to a regular seek: if OnDemuxerSeekDone() does not |
1793 // occur until after the next Start()+SetVideoSurface(), then the player | 1977 // occur until after the next Start()+SetVideoSurface(), then the player |
1794 // remains pending seek done until (and resumes correct post-seek preroll | 1978 // remains pending seek done until (and resumes correct post-seek preroll |
1795 // after) OnDemuxerSeekDone(). | 1979 // after) OnDemuxerSeekDone(). |
1796 BrowserSeekPlayer(false); | 1980 BrowserSeekPlayer(false); |
1797 base::TimeDelta expected_preroll_timestamp = player_.GetCurrentTime(); | 1981 base::TimeDelta expected_preroll_timestamp = player_.GetCurrentTime(); |
1798 ReleasePlayer(); | 1982 ReleasePlayer(); |
1799 | 1983 |
1800 StartVideoDecoderJob(); | 1984 EXPECT_EQ(1, demuxer_->num_data_requests()); |
1801 CreateNextTextureAndSetVideoSurface(); | 1985 CreateNextTextureAndSetVideoSurface(); |
1802 EXPECT_FALSE(GetMediaDecoderJob(false)); | 1986 StartVideoDecoderJob(false); |
1803 EXPECT_EQ(1, demuxer_->num_data_requests()); | |
1804 | 1987 |
1805 player_.OnDemuxerSeekDone(expected_preroll_timestamp); | 1988 player_.OnDemuxerSeekDone(expected_preroll_timestamp); |
1806 EXPECT_TRUE(GetMediaDecoderJob(false)); | 1989 EXPECT_TRUE(GetMediaDecoderJob(false)); |
1807 EXPECT_TRUE(IsPrerolling(false)); | 1990 EXPECT_TRUE(IsPrerolling(false)); |
1808 EXPECT_EQ(expected_preroll_timestamp, GetPrerollTimestamp()); | 1991 EXPECT_EQ(expected_preroll_timestamp, GetPrerollTimestamp()); |
1809 EXPECT_EQ(expected_preroll_timestamp, player_.GetCurrentTime()); | 1992 EXPECT_EQ(expected_preroll_timestamp, player_.GetCurrentTime()); |
1810 EXPECT_EQ(2, demuxer_->num_data_requests()); | 1993 EXPECT_EQ(2, demuxer_->num_data_requests()); |
1811 | 1994 |
1812 // No further seek should have been requested since BrowserSeekPlayer(). | 1995 // No further seek should have been requested since BrowserSeekPlayer(). |
1813 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1996 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1900 | 2083 |
1901 std::vector<std::string> codec_avc(1, "avc1"); | 2084 std::vector<std::string> codec_avc(1, "avc1"); |
1902 EXPECT_FALSE(IsTypeSupported(invalid_uuid, "L3", kVideoMp4, codec_avc)); | 2085 EXPECT_FALSE(IsTypeSupported(invalid_uuid, "L3", kVideoMp4, codec_avc)); |
1903 EXPECT_FALSE(IsTypeSupported(invalid_uuid, "L1", kVideoMp4, codec_avc)); | 2086 EXPECT_FALSE(IsTypeSupported(invalid_uuid, "L1", kVideoMp4, codec_avc)); |
1904 } | 2087 } |
1905 | 2088 |
1906 // TODO(xhwang): Are these IsTypeSupported tests device specific? | 2089 // TODO(xhwang): Are these IsTypeSupported tests device specific? |
1907 // TODO(xhwang): Add more IsTypeSupported tests. | 2090 // TODO(xhwang): Add more IsTypeSupported tests. |
1908 | 2091 |
1909 } // namespace media | 2092 } // namespace media |
OLD | NEW |