| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <deque> | 9 #include <deque> |
| 10 #include <string> | 10 #include <string> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
| 14 #include "base/location.h" | 14 #include "base/location.h" |
| 15 #include "base/logging.h" | 15 #include "base/logging.h" |
| 16 #include "base/macros.h" | 16 #include "base/macros.h" |
| 17 #include "base/path_service.h" | 17 #include "base/path_service.h" |
| 18 #include "base/run_loop.h" |
| 18 #include "base/single_thread_task_runner.h" | 19 #include "base/single_thread_task_runner.h" |
| 19 #include "base/threading/thread.h" | 20 #include "base/threading/thread.h" |
| 20 #include "base/threading/thread_task_runner_handle.h" | 21 #include "base/threading/thread_task_runner_handle.h" |
| 21 #include "media/base/decrypt_config.h" | 22 #include "media/base/decrypt_config.h" |
| 22 #include "media/base/media_log.h" | 23 #include "media/base/media_log.h" |
| 23 #include "media/base/media_tracks.h" | 24 #include "media/base/media_tracks.h" |
| 24 #include "media/base/mock_demuxer_host.h" | 25 #include "media/base/mock_demuxer_host.h" |
| 25 #include "media/base/test_helpers.h" | 26 #include "media/base/test_helpers.h" |
| 26 #include "media/base/timestamp_constants.h" | 27 #include "media/base/timestamp_constants.h" |
| 27 #include "media/ffmpeg/ffmpeg_common.h" | 28 #include "media/ffmpeg/ffmpeg_common.h" |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 EXPECT_EQ(status, DemuxerStream::kOk); | 168 EXPECT_EQ(status, DemuxerStream::kOk); |
| 168 EXPECT_TRUE(buffer.get() != NULL); | 169 EXPECT_TRUE(buffer.get() != NULL); |
| 169 EXPECT_EQ(read_expectation.size, buffer->data_size()); | 170 EXPECT_EQ(read_expectation.size, buffer->data_size()); |
| 170 EXPECT_EQ(read_expectation.timestamp_us, | 171 EXPECT_EQ(read_expectation.timestamp_us, |
| 171 buffer->timestamp().InMicroseconds()); | 172 buffer->timestamp().InMicroseconds()); |
| 172 EXPECT_EQ(read_expectation.discard_front_padding, | 173 EXPECT_EQ(read_expectation.discard_front_padding, |
| 173 buffer->discard_padding().first); | 174 buffer->discard_padding().first); |
| 174 EXPECT_EQ(read_expectation.is_key_frame, buffer->is_key_frame()); | 175 EXPECT_EQ(read_expectation.is_key_frame, buffer->is_key_frame()); |
| 175 DCHECK_EQ(&message_loop_, base::MessageLoop::current()); | 176 DCHECK_EQ(&message_loop_, base::MessageLoop::current()); |
| 176 OnReadDoneCalled(read_expectation.size, read_expectation.timestamp_us); | 177 OnReadDoneCalled(read_expectation.size, read_expectation.timestamp_us); |
| 177 message_loop_.PostTask(FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); | 178 message_loop_.task_runner()->PostTask( |
| 179 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); |
| 178 } | 180 } |
| 179 | 181 |
| 180 DemuxerStream::ReadCB NewReadCB(const tracked_objects::Location& location, | 182 DemuxerStream::ReadCB NewReadCB(const tracked_objects::Location& location, |
| 181 int size, | 183 int size, |
| 182 int64_t timestamp_us, | 184 int64_t timestamp_us, |
| 183 bool is_key_frame) { | 185 bool is_key_frame) { |
| 184 return NewReadCBWithCheckedDiscard(location, | 186 return NewReadCBWithCheckedDiscard(location, |
| 185 size, | 187 size, |
| 186 timestamp_us, | 188 timestamp_us, |
| 187 base::TimeDelta(), | 189 base::TimeDelta(), |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 | 242 |
| 241 int preferred_seeking_stream_index() const { | 243 int preferred_seeking_stream_index() const { |
| 242 return demuxer_->preferred_stream_for_seeking_.first; | 244 return demuxer_->preferred_stream_for_seeking_.first; |
| 243 } | 245 } |
| 244 | 246 |
| 245 void ReadUntilEndOfStream(DemuxerStream* stream) { | 247 void ReadUntilEndOfStream(DemuxerStream* stream) { |
| 246 bool got_eos_buffer = false; | 248 bool got_eos_buffer = false; |
| 247 const int kMaxBuffers = 170; | 249 const int kMaxBuffers = 170; |
| 248 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { | 250 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { |
| 249 stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); | 251 stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); |
| 250 message_loop_.Run(); | 252 base::RunLoop().Run(); |
| 251 } | 253 } |
| 252 | 254 |
| 253 EXPECT_TRUE(got_eos_buffer); | 255 EXPECT_TRUE(got_eos_buffer); |
| 254 } | 256 } |
| 255 | 257 |
| 256 private: | 258 private: |
| 257 void CreateDataSource(const std::string& name) { | 259 void CreateDataSource(const std::string& name) { |
| 258 CHECK(!data_source_); | 260 CHECK(!data_source_); |
| 259 | 261 |
| 260 base::FilePath file_path; | 262 base::FilePath file_path; |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 | 420 |
| 419 TEST_F(FFmpegDemuxerTest, Read_Audio) { | 421 TEST_F(FFmpegDemuxerTest, Read_Audio) { |
| 420 // We test that on a successful audio packet read. | 422 // We test that on a successful audio packet read. |
| 421 CreateDemuxer("bear-320x240.webm"); | 423 CreateDemuxer("bear-320x240.webm"); |
| 422 InitializeDemuxer(); | 424 InitializeDemuxer(); |
| 423 | 425 |
| 424 // Attempt a read from the audio stream and run the message loop until done. | 426 // Attempt a read from the audio stream and run the message loop until done. |
| 425 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 427 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 426 | 428 |
| 427 audio->Read(NewReadCB(FROM_HERE, 29, 0, true)); | 429 audio->Read(NewReadCB(FROM_HERE, 29, 0, true)); |
| 428 message_loop_.Run(); | 430 base::RunLoop().Run(); |
| 429 | 431 |
| 430 audio->Read(NewReadCB(FROM_HERE, 27, 3000, true)); | 432 audio->Read(NewReadCB(FROM_HERE, 27, 3000, true)); |
| 431 message_loop_.Run(); | 433 base::RunLoop().Run(); |
| 432 | 434 |
| 433 EXPECT_EQ(22084, demuxer_->GetMemoryUsage()); | 435 EXPECT_EQ(22084, demuxer_->GetMemoryUsage()); |
| 434 } | 436 } |
| 435 | 437 |
| 436 TEST_F(FFmpegDemuxerTest, Read_Video) { | 438 TEST_F(FFmpegDemuxerTest, Read_Video) { |
| 437 // We test that on a successful video packet read. | 439 // We test that on a successful video packet read. |
| 438 CreateDemuxer("bear-320x240.webm"); | 440 CreateDemuxer("bear-320x240.webm"); |
| 439 InitializeDemuxer(); | 441 InitializeDemuxer(); |
| 440 | 442 |
| 441 // Attempt a read from the video stream and run the message loop until done. | 443 // Attempt a read from the video stream and run the message loop until done. |
| 442 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 444 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 443 | 445 |
| 444 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); | 446 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); |
| 445 message_loop_.Run(); | 447 base::RunLoop().Run(); |
| 446 | 448 |
| 447 video->Read(NewReadCB(FROM_HERE, 1057, 33000, false)); | 449 video->Read(NewReadCB(FROM_HERE, 1057, 33000, false)); |
| 448 message_loop_.Run(); | 450 base::RunLoop().Run(); |
| 449 | 451 |
| 450 EXPECT_EQ(323, demuxer_->GetMemoryUsage()); | 452 EXPECT_EQ(323, demuxer_->GetMemoryUsage()); |
| 451 } | 453 } |
| 452 | 454 |
| 453 TEST_F(FFmpegDemuxerTest, Read_Text) { | 455 TEST_F(FFmpegDemuxerTest, Read_Text) { |
| 454 // We test that on a successful text packet read. | 456 // We test that on a successful text packet read. |
| 455 CreateDemuxer("bear-vp8-webvtt.webm"); | 457 CreateDemuxer("bear-vp8-webvtt.webm"); |
| 456 DemuxerStream* text_stream = NULL; | 458 DemuxerStream* text_stream = NULL; |
| 457 EXPECT_CALL(host_, AddTextStream(_, _)) | 459 EXPECT_CALL(host_, AddTextStream(_, _)) |
| 458 .WillOnce(SaveArg<0>(&text_stream)); | 460 .WillOnce(SaveArg<0>(&text_stream)); |
| 459 InitializeDemuxerWithText(); | 461 InitializeDemuxerWithText(); |
| 460 ASSERT_TRUE(text_stream); | 462 ASSERT_TRUE(text_stream); |
| 461 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); | 463 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); |
| 462 | 464 |
| 463 text_stream->Read(NewReadCB(FROM_HERE, 31, 0, true)); | 465 text_stream->Read(NewReadCB(FROM_HERE, 31, 0, true)); |
| 464 message_loop_.Run(); | 466 base::RunLoop().Run(); |
| 465 | 467 |
| 466 text_stream->Read(NewReadCB(FROM_HERE, 19, 500000, true)); | 468 text_stream->Read(NewReadCB(FROM_HERE, 19, 500000, true)); |
| 467 message_loop_.Run(); | 469 base::RunLoop().Run(); |
| 468 } | 470 } |
| 469 | 471 |
| 470 TEST_F(FFmpegDemuxerTest, SeekInitialized_NoVideoStartTime) { | 472 TEST_F(FFmpegDemuxerTest, SeekInitialized_NoVideoStartTime) { |
| 471 CreateDemuxer("audio-start-time-only.webm"); | 473 CreateDemuxer("audio-start-time-only.webm"); |
| 472 InitializeDemuxer(); | 474 InitializeDemuxer(); |
| 473 EXPECT_EQ(0, preferred_seeking_stream_index()); | 475 EXPECT_EQ(0, preferred_seeking_stream_index()); |
| 474 } | 476 } |
| 475 | 477 |
| 476 TEST_F(FFmpegDemuxerTest, Read_VideoPositiveStartTime) { | 478 TEST_F(FFmpegDemuxerTest, Read_VideoPositiveStartTime) { |
| 477 const int64_t kTimelineOffsetMs = 1352550896000LL; | 479 const int64_t kTimelineOffsetMs = 1352550896000LL; |
| 478 | 480 |
| 479 // Test the start time is the first timestamp of the video and audio stream. | 481 // Test the start time is the first timestamp of the video and audio stream. |
| 480 CreateDemuxer("nonzero-start-time.webm"); | 482 CreateDemuxer("nonzero-start-time.webm"); |
| 481 InitializeDemuxerWithTimelineOffset( | 483 InitializeDemuxerWithTimelineOffset( |
| 482 base::Time::FromJsTime(kTimelineOffsetMs)); | 484 base::Time::FromJsTime(kTimelineOffsetMs)); |
| 483 | 485 |
| 484 // Attempt a read from the video stream and run the message loop until done. | 486 // Attempt a read from the video stream and run the message loop until done. |
| 485 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 487 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 486 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 488 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 487 | 489 |
| 488 const base::TimeDelta video_start_time = | 490 const base::TimeDelta video_start_time = |
| 489 base::TimeDelta::FromMicroseconds(400000); | 491 base::TimeDelta::FromMicroseconds(400000); |
| 490 const base::TimeDelta audio_start_time = | 492 const base::TimeDelta audio_start_time = |
| 491 base::TimeDelta::FromMicroseconds(396000); | 493 base::TimeDelta::FromMicroseconds(396000); |
| 492 | 494 |
| 493 // Run the test twice with a seek in between. | 495 // Run the test twice with a seek in between. |
| 494 for (int i = 0; i < 2; ++i) { | 496 for (int i = 0; i < 2; ++i) { |
| 495 video->Read(NewReadCB(FROM_HERE, 5636, video_start_time.InMicroseconds(), | 497 video->Read(NewReadCB(FROM_HERE, 5636, video_start_time.InMicroseconds(), |
| 496 true)); | 498 true)); |
| 497 message_loop_.Run(); | 499 base::RunLoop().Run(); |
| 498 audio->Read(NewReadCB(FROM_HERE, 165, audio_start_time.InMicroseconds(), | 500 audio->Read(NewReadCB(FROM_HERE, 165, audio_start_time.InMicroseconds(), |
| 499 true)); | 501 true)); |
| 500 message_loop_.Run(); | 502 base::RunLoop().Run(); |
| 501 | 503 |
| 502 // Verify that the start time is equal to the lowest timestamp (ie the | 504 // Verify that the start time is equal to the lowest timestamp (ie the |
| 503 // audio). | 505 // audio). |
| 504 EXPECT_EQ(audio_start_time, demuxer_->start_time()); | 506 EXPECT_EQ(audio_start_time, demuxer_->start_time()); |
| 505 | 507 |
| 506 // Verify that the timeline offset has not been adjusted by the start time. | 508 // Verify that the timeline offset has not been adjusted by the start time. |
| 507 EXPECT_EQ(kTimelineOffsetMs, demuxer_->GetTimelineOffset().ToJavaTime()); | 509 EXPECT_EQ(kTimelineOffsetMs, demuxer_->GetTimelineOffset().ToJavaTime()); |
| 508 | 510 |
| 509 // Seek back to the beginning and repeat the test. | 511 // Seek back to the beginning and repeat the test. |
| 510 WaitableMessageLoopEvent event; | 512 WaitableMessageLoopEvent event; |
| 511 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); | 513 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); |
| 512 event.RunAndWaitForStatus(PIPELINE_OK); | 514 event.RunAndWaitForStatus(PIPELINE_OK); |
| 513 } | 515 } |
| 514 } | 516 } |
| 515 | 517 |
| 516 TEST_F(FFmpegDemuxerTest, Read_AudioNoStartTime) { | 518 TEST_F(FFmpegDemuxerTest, Read_AudioNoStartTime) { |
| 517 // FFmpeg does not set timestamps when demuxing wave files. Ensure that the | 519 // FFmpeg does not set timestamps when demuxing wave files. Ensure that the |
| 518 // demuxer sets a start time of zero in this case. | 520 // demuxer sets a start time of zero in this case. |
| 519 CreateDemuxer("sfx_s24le.wav"); | 521 CreateDemuxer("sfx_s24le.wav"); |
| 520 InitializeDemuxer(); | 522 InitializeDemuxer(); |
| 521 | 523 |
| 522 // Run the test twice with a seek in between. | 524 // Run the test twice with a seek in between. |
| 523 for (int i = 0; i < 2; ++i) { | 525 for (int i = 0; i < 2; ++i) { |
| 524 demuxer_->GetStream(DemuxerStream::AUDIO) | 526 demuxer_->GetStream(DemuxerStream::AUDIO) |
| 525 ->Read(NewReadCB(FROM_HERE, 4095, 0, true)); | 527 ->Read(NewReadCB(FROM_HERE, 4095, 0, true)); |
| 526 message_loop_.Run(); | 528 base::RunLoop().Run(); |
| 527 EXPECT_EQ(base::TimeDelta(), demuxer_->start_time()); | 529 EXPECT_EQ(base::TimeDelta(), demuxer_->start_time()); |
| 528 | 530 |
| 529 // Seek back to the beginning and repeat the test. | 531 // Seek back to the beginning and repeat the test. |
| 530 WaitableMessageLoopEvent event; | 532 WaitableMessageLoopEvent event; |
| 531 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); | 533 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); |
| 532 event.RunAndWaitForStatus(PIPELINE_OK); | 534 event.RunAndWaitForStatus(PIPELINE_OK); |
| 533 } | 535 } |
| 534 } | 536 } |
| 535 | 537 |
| 536 // TODO(dalecurtis): Test is disabled since FFmpeg does not currently guarantee | 538 // TODO(dalecurtis): Test is disabled since FFmpeg does not currently guarantee |
| 537 // the order of demuxed packets in OGG containers. Re-enable and fix key frame | 539 // the order of demuxed packets in OGG containers. Re-enable and fix key frame |
| 538 // expectations once we decide to either workaround it or attempt a fix | 540 // expectations once we decide to either workaround it or attempt a fix |
| 539 // upstream. See http://crbug.com/387996. | 541 // upstream. See http://crbug.com/387996. |
| 540 TEST_F(FFmpegDemuxerTest, | 542 TEST_F(FFmpegDemuxerTest, |
| 541 DISABLED_Read_AudioNegativeStartTimeAndOggDiscard_Bear) { | 543 DISABLED_Read_AudioNegativeStartTimeAndOggDiscard_Bear) { |
| 542 // Many ogg files have negative starting timestamps, so ensure demuxing and | 544 // Many ogg files have negative starting timestamps, so ensure demuxing and |
| 543 // seeking work correctly with a negative start time. | 545 // seeking work correctly with a negative start time. |
| 544 CreateDemuxer("bear.ogv"); | 546 CreateDemuxer("bear.ogv"); |
| 545 InitializeDemuxer(); | 547 InitializeDemuxer(); |
| 546 | 548 |
| 547 // Attempt a read from the video stream and run the message loop until done. | 549 // Attempt a read from the video stream and run the message loop until done. |
| 548 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 550 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 549 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 551 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 550 | 552 |
| 551 // Run the test twice with a seek in between. | 553 // Run the test twice with a seek in between. |
| 552 for (int i = 0; i < 2; ++i) { | 554 for (int i = 0; i < 2; ++i) { |
| 553 audio->Read( | 555 audio->Read( |
| 554 NewReadCBWithCheckedDiscard(FROM_HERE, 40, 0, kInfiniteDuration(), | 556 NewReadCBWithCheckedDiscard(FROM_HERE, 40, 0, kInfiniteDuration(), |
| 555 true)); | 557 true)); |
| 556 message_loop_.Run(); | 558 base::RunLoop().Run(); |
| 557 audio->Read( | 559 audio->Read( |
| 558 NewReadCBWithCheckedDiscard(FROM_HERE, 41, 2903, kInfiniteDuration(), | 560 NewReadCBWithCheckedDiscard(FROM_HERE, 41, 2903, kInfiniteDuration(), |
| 559 true)); | 561 true)); |
| 560 message_loop_.Run(); | 562 base::RunLoop().Run(); |
| 561 audio->Read(NewReadCBWithCheckedDiscard( | 563 audio->Read(NewReadCBWithCheckedDiscard( |
| 562 FROM_HERE, 173, 5805, base::TimeDelta::FromMicroseconds(10159), true)); | 564 FROM_HERE, 173, 5805, base::TimeDelta::FromMicroseconds(10159), true)); |
| 563 message_loop_.Run(); | 565 base::RunLoop().Run(); |
| 564 | 566 |
| 565 audio->Read(NewReadCB(FROM_HERE, 148, 18866, true)); | 567 audio->Read(NewReadCB(FROM_HERE, 148, 18866, true)); |
| 566 message_loop_.Run(); | 568 base::RunLoop().Run(); |
| 567 EXPECT_EQ(base::TimeDelta::FromMicroseconds(-15964), | 569 EXPECT_EQ(base::TimeDelta::FromMicroseconds(-15964), |
| 568 demuxer_->start_time()); | 570 demuxer_->start_time()); |
| 569 | 571 |
| 570 video->Read(NewReadCB(FROM_HERE, 5751, 0, true)); | 572 video->Read(NewReadCB(FROM_HERE, 5751, 0, true)); |
| 571 message_loop_.Run(); | 573 base::RunLoop().Run(); |
| 572 | 574 |
| 573 video->Read(NewReadCB(FROM_HERE, 846, 33367, true)); | 575 video->Read(NewReadCB(FROM_HERE, 846, 33367, true)); |
| 574 message_loop_.Run(); | 576 base::RunLoop().Run(); |
| 575 | 577 |
| 576 video->Read(NewReadCB(FROM_HERE, 1255, 66733, true)); | 578 video->Read(NewReadCB(FROM_HERE, 1255, 66733, true)); |
| 577 message_loop_.Run(); | 579 base::RunLoop().Run(); |
| 578 | 580 |
| 579 // Seek back to the beginning and repeat the test. | 581 // Seek back to the beginning and repeat the test. |
| 580 WaitableMessageLoopEvent event; | 582 WaitableMessageLoopEvent event; |
| 581 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); | 583 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); |
| 582 event.RunAndWaitForStatus(PIPELINE_OK); | 584 event.RunAndWaitForStatus(PIPELINE_OK); |
| 583 } | 585 } |
| 584 } | 586 } |
| 585 | 587 |
| 586 // Same test above, but using sync2.ogv which has video stream muxed before the | 588 // Same test above, but using sync2.ogv which has video stream muxed before the |
| 587 // audio stream, so seeking based only on start time will fail since ffmpeg is | 589 // audio stream, so seeking based only on start time will fail since ffmpeg is |
| 588 // essentially just seeking based on file position. | 590 // essentially just seeking based on file position. |
| 589 TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOggDiscard_Sync) { | 591 TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOggDiscard_Sync) { |
| 590 // Many ogg files have negative starting timestamps, so ensure demuxing and | 592 // Many ogg files have negative starting timestamps, so ensure demuxing and |
| 591 // seeking work correctly with a negative start time. | 593 // seeking work correctly with a negative start time. |
| 592 CreateDemuxer("sync2.ogv"); | 594 CreateDemuxer("sync2.ogv"); |
| 593 InitializeDemuxer(); | 595 InitializeDemuxer(); |
| 594 | 596 |
| 595 // Attempt a read from the video stream and run the message loop until done. | 597 // Attempt a read from the video stream and run the message loop until done. |
| 596 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 598 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 597 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 599 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 598 | 600 |
| 599 // Run the test twice with a seek in between. | 601 // Run the test twice with a seek in between. |
| 600 for (int i = 0; i < 2; ++i) { | 602 for (int i = 0; i < 2; ++i) { |
| 601 audio->Read(NewReadCBWithCheckedDiscard( | 603 audio->Read(NewReadCBWithCheckedDiscard( |
| 602 FROM_HERE, 1, 0, base::TimeDelta::FromMicroseconds(2902), true)); | 604 FROM_HERE, 1, 0, base::TimeDelta::FromMicroseconds(2902), true)); |
| 603 message_loop_.Run(); | 605 base::RunLoop().Run(); |
| 604 | 606 |
| 605 audio->Read(NewReadCB(FROM_HERE, 1, 2902, true)); | 607 audio->Read(NewReadCB(FROM_HERE, 1, 2902, true)); |
| 606 message_loop_.Run(); | 608 base::RunLoop().Run(); |
| 607 EXPECT_EQ(base::TimeDelta::FromMicroseconds(-2902), | 609 EXPECT_EQ(base::TimeDelta::FromMicroseconds(-2902), |
| 608 demuxer_->start_time()); | 610 demuxer_->start_time()); |
| 609 | 611 |
| 610 // Though the internal start time may be below zero, the exposed media time | 612 // Though the internal start time may be below zero, the exposed media time |
| 611 // must always be greater than zero. | 613 // must always be greater than zero. |
| 612 EXPECT_EQ(base::TimeDelta(), demuxer_->GetStartTime()); | 614 EXPECT_EQ(base::TimeDelta(), demuxer_->GetStartTime()); |
| 613 | 615 |
| 614 video->Read(NewReadCB(FROM_HERE, 9997, 0, true)); | 616 video->Read(NewReadCB(FROM_HERE, 9997, 0, true)); |
| 615 message_loop_.Run(); | 617 base::RunLoop().Run(); |
| 616 | 618 |
| 617 video->Read(NewReadCB(FROM_HERE, 16, 33241, false)); | 619 video->Read(NewReadCB(FROM_HERE, 16, 33241, false)); |
| 618 message_loop_.Run(); | 620 base::RunLoop().Run(); |
| 619 | 621 |
| 620 video->Read(NewReadCB(FROM_HERE, 631, 66482, false)); | 622 video->Read(NewReadCB(FROM_HERE, 631, 66482, false)); |
| 621 message_loop_.Run(); | 623 base::RunLoop().Run(); |
| 622 | 624 |
| 623 // Seek back to the beginning and repeat the test. | 625 // Seek back to the beginning and repeat the test. |
| 624 WaitableMessageLoopEvent event; | 626 WaitableMessageLoopEvent event; |
| 625 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); | 627 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); |
| 626 event.RunAndWaitForStatus(PIPELINE_OK); | 628 event.RunAndWaitForStatus(PIPELINE_OK); |
| 627 } | 629 } |
| 628 } | 630 } |
| 629 | 631 |
| 630 // Similar to the test above, but using an opus clip with a large amount of | 632 // Similar to the test above, but using an opus clip with a large amount of |
| 631 // pre-skip, which ffmpeg encodes as negative timestamps. | 633 // pre-skip, which ffmpeg encodes as negative timestamps. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 643 static const int kTestExpectations[][2] = { | 645 static const int kTestExpectations[][2] = { |
| 644 {635, 0}, {594, 120000}, {597, 240000}, {591, 360000}, | 646 {635, 0}, {594, 120000}, {597, 240000}, {591, 360000}, |
| 645 {582, 480000}, {583, 600000}, {592, 720000}, {567, 840000}, | 647 {582, 480000}, {583, 600000}, {592, 720000}, {567, 840000}, |
| 646 {579, 960000}, {572, 1080000}, {583, 1200000}}; | 648 {579, 960000}, {572, 1080000}, {583, 1200000}}; |
| 647 | 649 |
| 648 // Run the test twice with a seek in between. | 650 // Run the test twice with a seek in between. |
| 649 for (int i = 0; i < 2; ++i) { | 651 for (int i = 0; i < 2; ++i) { |
| 650 for (size_t j = 0; j < arraysize(kTestExpectations); ++j) { | 652 for (size_t j = 0; j < arraysize(kTestExpectations); ++j) { |
| 651 audio->Read(NewReadCB(FROM_HERE, kTestExpectations[j][0], | 653 audio->Read(NewReadCB(FROM_HERE, kTestExpectations[j][0], |
| 652 kTestExpectations[j][1], true)); | 654 kTestExpectations[j][1], true)); |
| 653 message_loop_.Run(); | 655 base::RunLoop().Run(); |
| 654 } | 656 } |
| 655 | 657 |
| 656 // Though the internal start time may be below zero, the exposed media time | 658 // Though the internal start time may be below zero, the exposed media time |
| 657 // must always be greater than zero. | 659 // must always be greater than zero. |
| 658 EXPECT_EQ(base::TimeDelta(), demuxer_->GetStartTime()); | 660 EXPECT_EQ(base::TimeDelta(), demuxer_->GetStartTime()); |
| 659 | 661 |
| 660 video->Read(NewReadCB(FROM_HERE, 16009, 0, true)); | 662 video->Read(NewReadCB(FROM_HERE, 16009, 0, true)); |
| 661 message_loop_.Run(); | 663 base::RunLoop().Run(); |
| 662 | 664 |
| 663 video->Read(NewReadCB(FROM_HERE, 2715, 1000, false)); | 665 video->Read(NewReadCB(FROM_HERE, 2715, 1000, false)); |
| 664 message_loop_.Run(); | 666 base::RunLoop().Run(); |
| 665 | 667 |
| 666 video->Read(NewReadCB(FROM_HERE, 427, 33000, false)); | 668 video->Read(NewReadCB(FROM_HERE, 427, 33000, false)); |
| 667 message_loop_.Run(); | 669 base::RunLoop().Run(); |
| 668 | 670 |
| 669 // Seek back to the beginning and repeat the test. | 671 // Seek back to the beginning and repeat the test. |
| 670 WaitableMessageLoopEvent event; | 672 WaitableMessageLoopEvent event; |
| 671 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); | 673 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); |
| 672 event.RunAndWaitForStatus(PIPELINE_OK); | 674 event.RunAndWaitForStatus(PIPELINE_OK); |
| 673 } | 675 } |
| 674 } | 676 } |
| 675 | 677 |
| 676 // Similar to the test above, but using sfx-opus.ogg, which has a much smaller | 678 // Similar to the test above, but using sfx-opus.ogg, which has a much smaller |
| 677 // amount of discard padding and no |start_time| set on the AVStream. | 679 // amount of discard padding and no |start_time| set on the AVStream. |
| 678 TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOpusSfxDiscard_Sync) { | 680 TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOpusSfxDiscard_Sync) { |
| 679 CreateDemuxer("sfx-opus.ogg"); | 681 CreateDemuxer("sfx-opus.ogg"); |
| 680 InitializeDemuxer(); | 682 InitializeDemuxer(); |
| 681 | 683 |
| 682 // Attempt a read from the video stream and run the message loop until done. | 684 // Attempt a read from the video stream and run the message loop until done. |
| 683 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 685 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 684 EXPECT_EQ(audio->audio_decoder_config().codec_delay(), 312); | 686 EXPECT_EQ(audio->audio_decoder_config().codec_delay(), 312); |
| 685 | 687 |
| 686 // Run the test twice with a seek in between. | 688 // Run the test twice with a seek in between. |
| 687 for (int i = 0; i < 2; ++i) { | 689 for (int i = 0; i < 2; ++i) { |
| 688 audio->Read(NewReadCB(FROM_HERE, 314, 0, true)); | 690 audio->Read(NewReadCB(FROM_HERE, 314, 0, true)); |
| 689 message_loop_.Run(); | 691 base::RunLoop().Run(); |
| 690 | 692 |
| 691 audio->Read(NewReadCB(FROM_HERE, 244, 20000, true)); | 693 audio->Read(NewReadCB(FROM_HERE, 244, 20000, true)); |
| 692 message_loop_.Run(); | 694 base::RunLoop().Run(); |
| 693 | 695 |
| 694 // Though the internal start time may be below zero, the exposed media time | 696 // Though the internal start time may be below zero, the exposed media time |
| 695 // must always be greater than zero. | 697 // must always be greater than zero. |
| 696 EXPECT_EQ(base::TimeDelta(), demuxer_->GetStartTime()); | 698 EXPECT_EQ(base::TimeDelta(), demuxer_->GetStartTime()); |
| 697 | 699 |
| 698 // Seek back to the beginning and repeat the test. | 700 // Seek back to the beginning and repeat the test. |
| 699 WaitableMessageLoopEvent event; | 701 WaitableMessageLoopEvent event; |
| 700 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); | 702 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); |
| 701 event.RunAndWaitForStatus(PIPELINE_OK); | 703 event.RunAndWaitForStatus(PIPELINE_OK); |
| 702 } | 704 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 716 EXPECT_CALL(host_, AddTextStream(_, _)) | 718 EXPECT_CALL(host_, AddTextStream(_, _)) |
| 717 .WillOnce(SaveArg<0>(&text_stream)); | 719 .WillOnce(SaveArg<0>(&text_stream)); |
| 718 InitializeDemuxerWithText(); | 720 InitializeDemuxerWithText(); |
| 719 ASSERT_TRUE(text_stream); | 721 ASSERT_TRUE(text_stream); |
| 720 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); | 722 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); |
| 721 | 723 |
| 722 bool got_eos_buffer = false; | 724 bool got_eos_buffer = false; |
| 723 const int kMaxBuffers = 10; | 725 const int kMaxBuffers = 10; |
| 724 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { | 726 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { |
| 725 text_stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); | 727 text_stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); |
| 726 message_loop_.Run(); | 728 base::RunLoop().Run(); |
| 727 } | 729 } |
| 728 | 730 |
| 729 EXPECT_TRUE(got_eos_buffer); | 731 EXPECT_TRUE(got_eos_buffer); |
| 730 } | 732 } |
| 731 | 733 |
| 732 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration) { | 734 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration) { |
| 733 // Verify that end of stream buffers are created. | 735 // Verify that end of stream buffers are created. |
| 734 CreateDemuxer("bear-320x240.webm"); | 736 CreateDemuxer("bear-320x240.webm"); |
| 735 InitializeDemuxer(); | 737 InitializeDemuxer(); |
| 736 set_duration_known(false); | 738 set_duration_known(false); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 InitializeDemuxer(); | 776 InitializeDemuxer(); |
| 775 | 777 |
| 776 // Get our streams. | 778 // Get our streams. |
| 777 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 779 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 778 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 780 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 779 ASSERT_TRUE(video); | 781 ASSERT_TRUE(video); |
| 780 ASSERT_TRUE(audio); | 782 ASSERT_TRUE(audio); |
| 781 | 783 |
| 782 // Read a video packet and release it. | 784 // Read a video packet and release it. |
| 783 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); | 785 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); |
| 784 message_loop_.Run(); | 786 base::RunLoop().Run(); |
| 785 | 787 |
| 786 // Issue a simple forward seek, which should discard queued packets. | 788 // Issue a simple forward seek, which should discard queued packets. |
| 787 WaitableMessageLoopEvent event; | 789 WaitableMessageLoopEvent event; |
| 788 demuxer_->Seek(base::TimeDelta::FromMicroseconds(1000000), | 790 demuxer_->Seek(base::TimeDelta::FromMicroseconds(1000000), |
| 789 event.GetPipelineStatusCB()); | 791 event.GetPipelineStatusCB()); |
| 790 event.RunAndWaitForStatus(PIPELINE_OK); | 792 event.RunAndWaitForStatus(PIPELINE_OK); |
| 791 | 793 |
| 792 // Audio read #1. | 794 // Audio read #1. |
| 793 audio->Read(NewReadCB(FROM_HERE, 145, 803000, true)); | 795 audio->Read(NewReadCB(FROM_HERE, 145, 803000, true)); |
| 794 message_loop_.Run(); | 796 base::RunLoop().Run(); |
| 795 | 797 |
| 796 // Audio read #2. | 798 // Audio read #2. |
| 797 audio->Read(NewReadCB(FROM_HERE, 148, 826000, true)); | 799 audio->Read(NewReadCB(FROM_HERE, 148, 826000, true)); |
| 798 message_loop_.Run(); | 800 base::RunLoop().Run(); |
| 799 | 801 |
| 800 // Video read #1. | 802 // Video read #1. |
| 801 video->Read(NewReadCB(FROM_HERE, 5425, 801000, true)); | 803 video->Read(NewReadCB(FROM_HERE, 5425, 801000, true)); |
| 802 message_loop_.Run(); | 804 base::RunLoop().Run(); |
| 803 | 805 |
| 804 // Video read #2. | 806 // Video read #2. |
| 805 video->Read(NewReadCB(FROM_HERE, 1906, 834000, false)); | 807 video->Read(NewReadCB(FROM_HERE, 1906, 834000, false)); |
| 806 message_loop_.Run(); | 808 base::RunLoop().Run(); |
| 807 } | 809 } |
| 808 | 810 |
| 809 TEST_F(FFmpegDemuxerTest, SeekText) { | 811 TEST_F(FFmpegDemuxerTest, SeekText) { |
| 810 // We're testing that the demuxer frees all queued packets when it receives | 812 // We're testing that the demuxer frees all queued packets when it receives |
| 811 // a Seek(). | 813 // a Seek(). |
| 812 CreateDemuxer("bear-vp8-webvtt.webm"); | 814 CreateDemuxer("bear-vp8-webvtt.webm"); |
| 813 DemuxerStream* text_stream = NULL; | 815 DemuxerStream* text_stream = NULL; |
| 814 EXPECT_CALL(host_, AddTextStream(_, _)) | 816 EXPECT_CALL(host_, AddTextStream(_, _)) |
| 815 .WillOnce(SaveArg<0>(&text_stream)); | 817 .WillOnce(SaveArg<0>(&text_stream)); |
| 816 InitializeDemuxerWithText(); | 818 InitializeDemuxerWithText(); |
| 817 ASSERT_TRUE(text_stream); | 819 ASSERT_TRUE(text_stream); |
| 818 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); | 820 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); |
| 819 | 821 |
| 820 // Get our streams. | 822 // Get our streams. |
| 821 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 823 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 822 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 824 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 823 ASSERT_TRUE(video); | 825 ASSERT_TRUE(video); |
| 824 ASSERT_TRUE(audio); | 826 ASSERT_TRUE(audio); |
| 825 | 827 |
| 826 // Read a text packet and release it. | 828 // Read a text packet and release it. |
| 827 text_stream->Read(NewReadCB(FROM_HERE, 31, 0, true)); | 829 text_stream->Read(NewReadCB(FROM_HERE, 31, 0, true)); |
| 828 message_loop_.Run(); | 830 base::RunLoop().Run(); |
| 829 | 831 |
| 830 // Issue a simple forward seek, which should discard queued packets. | 832 // Issue a simple forward seek, which should discard queued packets. |
| 831 WaitableMessageLoopEvent event; | 833 WaitableMessageLoopEvent event; |
| 832 demuxer_->Seek(base::TimeDelta::FromMicroseconds(1000000), | 834 demuxer_->Seek(base::TimeDelta::FromMicroseconds(1000000), |
| 833 event.GetPipelineStatusCB()); | 835 event.GetPipelineStatusCB()); |
| 834 event.RunAndWaitForStatus(PIPELINE_OK); | 836 event.RunAndWaitForStatus(PIPELINE_OK); |
| 835 | 837 |
| 836 // Audio read #1. | 838 // Audio read #1. |
| 837 audio->Read(NewReadCB(FROM_HERE, 145, 803000, true)); | 839 audio->Read(NewReadCB(FROM_HERE, 145, 803000, true)); |
| 838 message_loop_.Run(); | 840 base::RunLoop().Run(); |
| 839 | 841 |
| 840 // Audio read #2. | 842 // Audio read #2. |
| 841 audio->Read(NewReadCB(FROM_HERE, 148, 826000, true)); | 843 audio->Read(NewReadCB(FROM_HERE, 148, 826000, true)); |
| 842 message_loop_.Run(); | 844 base::RunLoop().Run(); |
| 843 | 845 |
| 844 // Video read #1. | 846 // Video read #1. |
| 845 video->Read(NewReadCB(FROM_HERE, 5425, 801000, true)); | 847 video->Read(NewReadCB(FROM_HERE, 5425, 801000, true)); |
| 846 message_loop_.Run(); | 848 base::RunLoop().Run(); |
| 847 | 849 |
| 848 // Video read #2. | 850 // Video read #2. |
| 849 video->Read(NewReadCB(FROM_HERE, 1906, 834000, false)); | 851 video->Read(NewReadCB(FROM_HERE, 1906, 834000, false)); |
| 850 message_loop_.Run(); | 852 base::RunLoop().Run(); |
| 851 | 853 |
| 852 // Text read #1. | 854 // Text read #1. |
| 853 text_stream->Read(NewReadCB(FROM_HERE, 19, 500000, true)); | 855 text_stream->Read(NewReadCB(FROM_HERE, 19, 500000, true)); |
| 854 message_loop_.Run(); | 856 base::RunLoop().Run(); |
| 855 | 857 |
| 856 // Text read #2. | 858 // Text read #2. |
| 857 text_stream->Read(NewReadCB(FROM_HERE, 19, 1000000, true)); | 859 text_stream->Read(NewReadCB(FROM_HERE, 19, 1000000, true)); |
| 858 message_loop_.Run(); | 860 base::RunLoop().Run(); |
| 859 } | 861 } |
| 860 | 862 |
| 861 class MockReadCB { | 863 class MockReadCB { |
| 862 public: | 864 public: |
| 863 MockReadCB() {} | 865 MockReadCB() {} |
| 864 ~MockReadCB() {} | 866 ~MockReadCB() {} |
| 865 | 867 |
| 866 MOCK_METHOD2(Run, void(DemuxerStream::Status status, | 868 MOCK_METHOD2(Run, void(DemuxerStream::Status status, |
| 867 const scoped_refptr<DecoderBuffer>& buffer)); | 869 const scoped_refptr<DecoderBuffer>& buffer)); |
| 868 private: | 870 private: |
| (...skipping 11 matching lines...) Expand all Loading... |
| 880 ASSERT_TRUE(audio); | 882 ASSERT_TRUE(audio); |
| 881 | 883 |
| 882 demuxer_->Stop(); | 884 demuxer_->Stop(); |
| 883 | 885 |
| 884 // Reads after being stopped are all EOS buffers. | 886 // Reads after being stopped are all EOS buffers. |
| 885 StrictMock<MockReadCB> callback; | 887 StrictMock<MockReadCB> callback; |
| 886 EXPECT_CALL(callback, Run(DemuxerStream::kOk, IsEndOfStreamBuffer())); | 888 EXPECT_CALL(callback, Run(DemuxerStream::kOk, IsEndOfStreamBuffer())); |
| 887 | 889 |
| 888 // Attempt the read... | 890 // Attempt the read... |
| 889 audio->Read(base::Bind(&MockReadCB::Run, base::Unretained(&callback))); | 891 audio->Read(base::Bind(&MockReadCB::Run, base::Unretained(&callback))); |
| 890 message_loop_.RunUntilIdle(); | 892 base::RunLoop().RunUntilIdle(); |
| 891 | 893 |
| 892 // Don't let the test call Stop() again. | 894 // Don't let the test call Stop() again. |
| 893 demuxer_.reset(); | 895 demuxer_.reset(); |
| 894 } | 896 } |
| 895 | 897 |
| 896 // Verify that seek works properly when the WebM cues data is at the start of | 898 // Verify that seek works properly when the WebM cues data is at the start of |
| 897 // the file instead of at the end. | 899 // the file instead of at the end. |
| 898 TEST_F(FFmpegDemuxerTest, SeekWithCuesBeforeFirstCluster) { | 900 TEST_F(FFmpegDemuxerTest, SeekWithCuesBeforeFirstCluster) { |
| 899 CreateDemuxer("bear-320x240-cues-in-front.webm"); | 901 CreateDemuxer("bear-320x240-cues-in-front.webm"); |
| 900 InitializeDemuxer(); | 902 InitializeDemuxer(); |
| 901 | 903 |
| 902 // Get our streams. | 904 // Get our streams. |
| 903 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 905 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 904 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 906 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 905 ASSERT_TRUE(video); | 907 ASSERT_TRUE(video); |
| 906 ASSERT_TRUE(audio); | 908 ASSERT_TRUE(audio); |
| 907 | 909 |
| 908 // Read a video packet and release it. | 910 // Read a video packet and release it. |
| 909 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); | 911 video->Read(NewReadCB(FROM_HERE, 22084, 0, true)); |
| 910 message_loop_.Run(); | 912 base::RunLoop().Run(); |
| 911 | 913 |
| 912 // Issue a simple forward seek, which should discard queued packets. | 914 // Issue a simple forward seek, which should discard queued packets. |
| 913 WaitableMessageLoopEvent event; | 915 WaitableMessageLoopEvent event; |
| 914 demuxer_->Seek(base::TimeDelta::FromMicroseconds(2500000), | 916 demuxer_->Seek(base::TimeDelta::FromMicroseconds(2500000), |
| 915 event.GetPipelineStatusCB()); | 917 event.GetPipelineStatusCB()); |
| 916 event.RunAndWaitForStatus(PIPELINE_OK); | 918 event.RunAndWaitForStatus(PIPELINE_OK); |
| 917 | 919 |
| 918 // Audio read #1. | 920 // Audio read #1. |
| 919 audio->Read(NewReadCB(FROM_HERE, 40, 2403000, true)); | 921 audio->Read(NewReadCB(FROM_HERE, 40, 2403000, true)); |
| 920 message_loop_.Run(); | 922 base::RunLoop().Run(); |
| 921 | 923 |
| 922 // Audio read #2. | 924 // Audio read #2. |
| 923 audio->Read(NewReadCB(FROM_HERE, 42, 2406000, true)); | 925 audio->Read(NewReadCB(FROM_HERE, 42, 2406000, true)); |
| 924 message_loop_.Run(); | 926 base::RunLoop().Run(); |
| 925 | 927 |
| 926 // Video read #1. | 928 // Video read #1. |
| 927 video->Read(NewReadCB(FROM_HERE, 5276, 2402000, true)); | 929 video->Read(NewReadCB(FROM_HERE, 5276, 2402000, true)); |
| 928 message_loop_.Run(); | 930 base::RunLoop().Run(); |
| 929 | 931 |
| 930 // Video read #2. | 932 // Video read #2. |
| 931 video->Read(NewReadCB(FROM_HERE, 1740, 2436000, false)); | 933 video->Read(NewReadCB(FROM_HERE, 1740, 2436000, false)); |
| 932 message_loop_.Run(); | 934 base::RunLoop().Run(); |
| 933 } | 935 } |
| 934 | 936 |
| 935 #if defined(USE_PROPRIETARY_CODECS) | 937 #if defined(USE_PROPRIETARY_CODECS) |
| 936 // Ensure ID3v1 tag reading is disabled. id3_test.mp3 has an ID3v1 tag with the | 938 // Ensure ID3v1 tag reading is disabled. id3_test.mp3 has an ID3v1 tag with the |
| 937 // field "title" set to "sample for id3 test". | 939 // field "title" set to "sample for id3 test". |
| 938 TEST_F(FFmpegDemuxerTest, NoID3TagData) { | 940 TEST_F(FFmpegDemuxerTest, NoID3TagData) { |
| 939 CreateDemuxer("id3_test.mp3"); | 941 CreateDemuxer("id3_test.mp3"); |
| 940 InitializeDemuxer(); | 942 InitializeDemuxer(); |
| 941 EXPECT_FALSE(av_dict_get(format_context()->metadata, "title", NULL, 0)); | 943 EXPECT_FALSE(av_dict_get(format_context()->metadata, "title", NULL, 0)); |
| 942 } | 944 } |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1235 | 1237 |
| 1236 const MediaTrack& audio_track = *(media_tracks_->tracks()[1]); | 1238 const MediaTrack& audio_track = *(media_tracks_->tracks()[1]); |
| 1237 EXPECT_EQ(audio_track.type(), MediaTrack::Audio); | 1239 EXPECT_EQ(audio_track.type(), MediaTrack::Audio); |
| 1238 EXPECT_EQ(audio_track.bytestream_track_id(), 2); | 1240 EXPECT_EQ(audio_track.bytestream_track_id(), 2); |
| 1239 EXPECT_EQ(audio_track.kind(), "main"); | 1241 EXPECT_EQ(audio_track.kind(), "main"); |
| 1240 EXPECT_EQ(audio_track.label(), ""); | 1242 EXPECT_EQ(audio_track.label(), ""); |
| 1241 EXPECT_EQ(audio_track.language(), ""); | 1243 EXPECT_EQ(audio_track.language(), ""); |
| 1242 } | 1244 } |
| 1243 | 1245 |
| 1244 } // namespace media | 1246 } // namespace media |
| OLD | NEW |