Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <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> |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 91 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = base::Bind( | 91 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = base::Bind( |
| 92 &FFmpegDemuxerTest::OnEncryptedMediaInitData, base::Unretained(this)); | 92 &FFmpegDemuxerTest::OnEncryptedMediaInitData, base::Unretained(this)); |
| 93 | 93 |
| 94 demuxer_.reset(new FFmpegDemuxer( | 94 demuxer_.reset(new FFmpegDemuxer( |
| 95 message_loop_.task_runner(), data_source_.get(), | 95 message_loop_.task_runner(), data_source_.get(), |
| 96 encrypted_media_init_data_cb, new MediaLog())); | 96 encrypted_media_init_data_cb, new MediaLog())); |
| 97 } | 97 } |
| 98 | 98 |
| 99 MOCK_METHOD1(CheckPoint, void(int v)); | 99 MOCK_METHOD1(CheckPoint, void(int v)); |
| 100 | 100 |
| 101 void InitializeDemuxerWithTimelineOffset(bool enable_text, | 101 void InitializeDemuxer( |
| 102 base::Time timeline_offset) { | 102 bool enable_text = false, |
|
ddorwin
2016/02/19 20:51:10
bools are always a problem because there is no con
servolk
2016/02/19 21:32:01
Acknowledged.
| |
| 103 EXPECT_CALL(host_, SetDuration(_)); | 103 media::PipelineStatus demuxer_init_expected_status = PIPELINE_OK, |
|
ddorwin
2016/02/19 20:51:10
Looking at the uses and considering the bool issue
servolk
2016/02/19 21:32:01
Done.
| |
| 104 base::Time timeline_offset = base::Time()) { | |
| 105 if (demuxer_init_expected_status == PIPELINE_OK) | |
| 106 EXPECT_CALL(host_, SetDuration(_)); | |
| 104 WaitableMessageLoopEvent event; | 107 WaitableMessageLoopEvent event; |
| 105 demuxer_->Initialize(&host_, event.GetPipelineStatusCB(), enable_text); | 108 demuxer_->Initialize(&host_, event.GetPipelineStatusCB(), enable_text); |
| 106 demuxer_->timeline_offset_ = timeline_offset; | 109 demuxer_->timeline_offset_ = timeline_offset; |
| 107 event.RunAndWaitForStatus(PIPELINE_OK); | 110 event.RunAndWaitForStatus(demuxer_init_expected_status); |
| 108 } | |
| 109 | |
| 110 void InitializeDemuxerText(bool enable_text) { | |
| 111 InitializeDemuxerWithTimelineOffset(enable_text, base::Time()); | |
| 112 } | |
| 113 | |
| 114 void InitializeDemuxer() { | |
| 115 InitializeDemuxerText(false); | |
| 116 } | 111 } |
| 117 | 112 |
| 118 MOCK_METHOD2(OnReadDoneCalled, void(int, int64_t)); | 113 MOCK_METHOD2(OnReadDoneCalled, void(int, int64_t)); |
| 119 | 114 |
| 120 struct ReadExpectation { | 115 struct ReadExpectation { |
| 121 ReadExpectation(size_t size, | 116 ReadExpectation(size_t size, |
| 122 int64_t timestamp_us, | 117 int64_t timestamp_us, |
| 123 const base::TimeDelta& discard_front_padding, | 118 const base::TimeDelta& discard_front_padding, |
| 124 bool is_key_frame) | 119 bool is_key_frame) |
| 125 : size(size), | 120 : size(size), |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 350 TEST_F(FFmpegDemuxerTest, Initialize_MultitrackText) { | 345 TEST_F(FFmpegDemuxerTest, Initialize_MultitrackText) { |
| 351 // Open a file containing the following streams: | 346 // Open a file containing the following streams: |
| 352 // Stream #0: Video (VP8) | 347 // Stream #0: Video (VP8) |
| 353 // Stream #1: Audio (Vorbis) | 348 // Stream #1: Audio (Vorbis) |
| 354 // Stream #2: Text (WebVTT) | 349 // Stream #2: Text (WebVTT) |
| 355 | 350 |
| 356 CreateDemuxer("bear-vp8-webvtt.webm"); | 351 CreateDemuxer("bear-vp8-webvtt.webm"); |
| 357 DemuxerStream* text_stream = NULL; | 352 DemuxerStream* text_stream = NULL; |
| 358 EXPECT_CALL(host_, AddTextStream(_, _)) | 353 EXPECT_CALL(host_, AddTextStream(_, _)) |
| 359 .WillOnce(SaveArg<0>(&text_stream)); | 354 .WillOnce(SaveArg<0>(&text_stream)); |
| 360 InitializeDemuxerText(true); | 355 InitializeDemuxer(/*enable_text=*/true); |
|
ddorwin
2016/02/19 20:51:09
InitializeDemuxerWithText();
servolk
2016/02/19 21:32:01
Done.
| |
| 361 ASSERT_TRUE(text_stream); | 356 ASSERT_TRUE(text_stream); |
| 362 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); | 357 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); |
| 363 | 358 |
| 364 // Video stream should be VP8. | 359 // Video stream should be VP8. |
| 365 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 360 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 366 ASSERT_TRUE(stream); | 361 ASSERT_TRUE(stream); |
| 367 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); | 362 EXPECT_EQ(DemuxerStream::VIDEO, stream->type()); |
| 368 EXPECT_EQ(kCodecVP8, stream->video_decoder_config().codec()); | 363 EXPECT_EQ(kCodecVP8, stream->video_decoder_config().codec()); |
| 369 | 364 |
| 370 // Audio stream should be Vorbis. | 365 // Audio stream should be Vorbis. |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 423 | 418 |
| 424 EXPECT_EQ(323, demuxer_->GetMemoryUsage()); | 419 EXPECT_EQ(323, demuxer_->GetMemoryUsage()); |
| 425 } | 420 } |
| 426 | 421 |
| 427 TEST_F(FFmpegDemuxerTest, Read_Text) { | 422 TEST_F(FFmpegDemuxerTest, Read_Text) { |
| 428 // We test that on a successful text packet read. | 423 // We test that on a successful text packet read. |
| 429 CreateDemuxer("bear-vp8-webvtt.webm"); | 424 CreateDemuxer("bear-vp8-webvtt.webm"); |
| 430 DemuxerStream* text_stream = NULL; | 425 DemuxerStream* text_stream = NULL; |
| 431 EXPECT_CALL(host_, AddTextStream(_, _)) | 426 EXPECT_CALL(host_, AddTextStream(_, _)) |
| 432 .WillOnce(SaveArg<0>(&text_stream)); | 427 .WillOnce(SaveArg<0>(&text_stream)); |
| 433 InitializeDemuxerText(true); | 428 InitializeDemuxer(/*enable_text=*/true); |
| 434 ASSERT_TRUE(text_stream); | 429 ASSERT_TRUE(text_stream); |
| 435 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); | 430 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); |
| 436 | 431 |
| 437 text_stream->Read(NewReadCB(FROM_HERE, 31, 0, true)); | 432 text_stream->Read(NewReadCB(FROM_HERE, 31, 0, true)); |
| 438 message_loop_.Run(); | 433 message_loop_.Run(); |
| 439 | 434 |
| 440 text_stream->Read(NewReadCB(FROM_HERE, 19, 500000, true)); | 435 text_stream->Read(NewReadCB(FROM_HERE, 19, 500000, true)); |
| 441 message_loop_.Run(); | 436 message_loop_.Run(); |
| 442 } | 437 } |
| 443 | 438 |
| 444 TEST_F(FFmpegDemuxerTest, SeekInitialized_NoVideoStartTime) { | 439 TEST_F(FFmpegDemuxerTest, SeekInitialized_NoVideoStartTime) { |
| 445 CreateDemuxer("audio-start-time-only.webm"); | 440 CreateDemuxer("audio-start-time-only.webm"); |
| 446 InitializeDemuxer(); | 441 InitializeDemuxer(); |
| 447 EXPECT_EQ(0, preferred_seeking_stream_index()); | 442 EXPECT_EQ(0, preferred_seeking_stream_index()); |
| 448 } | 443 } |
| 449 | 444 |
| 450 TEST_F(FFmpegDemuxerTest, Read_VideoPositiveStartTime) { | 445 TEST_F(FFmpegDemuxerTest, Read_VideoPositiveStartTime) { |
| 451 const int64_t kTimelineOffsetMs = 1352550896000LL; | 446 const int64_t kTimelineOffsetMs = 1352550896000LL; |
| 452 | 447 |
| 453 // Test the start time is the first timestamp of the video and audio stream. | 448 // Test the start time is the first timestamp of the video and audio stream. |
| 454 CreateDemuxer("nonzero-start-time.webm"); | 449 CreateDemuxer("nonzero-start-time.webm"); |
| 455 InitializeDemuxerWithTimelineOffset( | 450 InitializeDemuxer(false, PIPELINE_OK, |
|
ddorwin
2016/02/19 20:51:10
InitializeDemuxer(base::Time::FromJsTime(kTimeline
servolk
2016/02/19 21:32:01
Given that the timeline_offset parameter is used/n
ddorwin
2016/02/24 00:28:00
Acknowledged.
| |
| 456 false, base::Time::FromJsTime(kTimelineOffsetMs)); | 451 base::Time::FromJsTime(kTimelineOffsetMs)); |
| 457 | 452 |
| 458 // Attempt a read from the video stream and run the message loop until done. | 453 // Attempt a read from the video stream and run the message loop until done. |
| 459 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 454 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 460 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 455 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 461 | 456 |
| 462 const base::TimeDelta video_start_time = | 457 const base::TimeDelta video_start_time = |
| 463 base::TimeDelta::FromMicroseconds(400000); | 458 base::TimeDelta::FromMicroseconds(400000); |
| 464 const base::TimeDelta audio_start_time = | 459 const base::TimeDelta audio_start_time = |
| 465 base::TimeDelta::FromMicroseconds(396000); | 460 base::TimeDelta::FromMicroseconds(396000); |
| 466 | 461 |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 682 InitializeDemuxer(); | 677 InitializeDemuxer(); |
| 683 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO)); | 678 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO)); |
| 684 } | 679 } |
| 685 | 680 |
| 686 TEST_F(FFmpegDemuxerTest, Read_EndOfStreamText) { | 681 TEST_F(FFmpegDemuxerTest, Read_EndOfStreamText) { |
| 687 // Verify that end of stream buffers are created. | 682 // Verify that end of stream buffers are created. |
| 688 CreateDemuxer("bear-vp8-webvtt.webm"); | 683 CreateDemuxer("bear-vp8-webvtt.webm"); |
| 689 DemuxerStream* text_stream = NULL; | 684 DemuxerStream* text_stream = NULL; |
| 690 EXPECT_CALL(host_, AddTextStream(_, _)) | 685 EXPECT_CALL(host_, AddTextStream(_, _)) |
| 691 .WillOnce(SaveArg<0>(&text_stream)); | 686 .WillOnce(SaveArg<0>(&text_stream)); |
| 692 InitializeDemuxerText(true); | 687 InitializeDemuxer(/*enable_text=*/true); |
| 693 ASSERT_TRUE(text_stream); | 688 ASSERT_TRUE(text_stream); |
| 694 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); | 689 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); |
| 695 | 690 |
| 696 bool got_eos_buffer = false; | 691 bool got_eos_buffer = false; |
| 697 const int kMaxBuffers = 10; | 692 const int kMaxBuffers = 10; |
| 698 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { | 693 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { |
| 699 text_stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); | 694 text_stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); |
| 700 message_loop_.Run(); | 695 message_loop_.Run(); |
| 701 } | 696 } |
| 702 | 697 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 780 message_loop_.Run(); | 775 message_loop_.Run(); |
| 781 } | 776 } |
| 782 | 777 |
| 783 TEST_F(FFmpegDemuxerTest, SeekText) { | 778 TEST_F(FFmpegDemuxerTest, SeekText) { |
| 784 // We're testing that the demuxer frees all queued packets when it receives | 779 // We're testing that the demuxer frees all queued packets when it receives |
| 785 // a Seek(). | 780 // a Seek(). |
| 786 CreateDemuxer("bear-vp8-webvtt.webm"); | 781 CreateDemuxer("bear-vp8-webvtt.webm"); |
| 787 DemuxerStream* text_stream = NULL; | 782 DemuxerStream* text_stream = NULL; |
| 788 EXPECT_CALL(host_, AddTextStream(_, _)) | 783 EXPECT_CALL(host_, AddTextStream(_, _)) |
| 789 .WillOnce(SaveArg<0>(&text_stream)); | 784 .WillOnce(SaveArg<0>(&text_stream)); |
| 790 InitializeDemuxerText(true); | 785 InitializeDemuxer(/*enable_text=*/true); |
| 791 ASSERT_TRUE(text_stream); | 786 ASSERT_TRUE(text_stream); |
| 792 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); | 787 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); |
| 793 | 788 |
| 794 // Get our streams. | 789 // Get our streams. |
| 795 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 790 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 796 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 791 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 797 ASSERT_TRUE(video); | 792 ASSERT_TRUE(video); |
| 798 ASSERT_TRUE(audio); | 793 ASSERT_TRUE(audio); |
| 799 | 794 |
| 800 // Read a text packet and release it. | 795 // Read a text packet and release it. |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1108 CreateDemuxer("bear-640x360-non_square_pixel-with_pasp.mp4"); | 1103 CreateDemuxer("bear-640x360-non_square_pixel-with_pasp.mp4"); |
| 1109 InitializeDemuxer(); | 1104 InitializeDemuxer(); |
| 1110 | 1105 |
| 1111 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 1106 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 1112 ASSERT_TRUE(stream); | 1107 ASSERT_TRUE(stream); |
| 1113 | 1108 |
| 1114 const VideoDecoderConfig& video_config = stream->video_decoder_config(); | 1109 const VideoDecoderConfig& video_config = stream->video_decoder_config(); |
| 1115 EXPECT_EQ(gfx::Size(639, 360), video_config.natural_size()); | 1110 EXPECT_EQ(gfx::Size(639, 360), video_config.natural_size()); |
| 1116 } | 1111 } |
| 1117 | 1112 |
| 1118 #endif | |
| 1119 | |
| 1120 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) | |
| 1121 TEST_F(FFmpegDemuxerTest, HEVC_in_MP4_container) { | 1113 TEST_F(FFmpegDemuxerTest, HEVC_in_MP4_container) { |
| 1122 CreateDemuxer("bear-hevc-frag.mp4"); | 1114 CreateDemuxer("bear-hevc-frag.mp4"); |
| 1115 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) | |
| 1123 InitializeDemuxer(); | 1116 InitializeDemuxer(); |
| 1124 | 1117 |
| 1125 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 1118 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 1126 ASSERT_TRUE(video); | 1119 ASSERT_TRUE(video); |
| 1127 | 1120 |
| 1128 video->Read(NewReadCB(FROM_HERE, 3569, 66733, true)); | 1121 video->Read(NewReadCB(FROM_HERE, 3569, 66733, true)); |
| 1129 message_loop_.Run(); | 1122 message_loop_.Run(); |
| 1130 | 1123 |
| 1131 video->Read(NewReadCB(FROM_HERE, 1042, 200200, false)); | 1124 video->Read(NewReadCB(FROM_HERE, 1042, 200200, false)); |
| 1132 message_loop_.Run(); | 1125 message_loop_.Run(); |
| 1126 #else | |
| 1127 InitializeDemuxer(false, DEMUXER_ERROR_NO_SUPPORTED_STREAMS); | |
|
ddorwin
2016/02/19 20:51:09
InitializeDemuxerAndExpectUnsupportedFormat()
OR I
servolk
2016/02/19 21:32:01
Done.
| |
| 1128 #endif | |
| 1133 } | 1129 } |
| 1134 #endif | |
| 1135 | 1130 |
| 1136 #if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING) | |
| 1137 TEST_F(FFmpegDemuxerTest, Read_AC3_Audio) { | 1131 TEST_F(FFmpegDemuxerTest, Read_AC3_Audio) { |
| 1138 CreateDemuxer("bear-ac3-only-frag.mp4"); | 1132 CreateDemuxer("bear-ac3-only-frag.mp4"); |
| 1133 #if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING) | |
| 1139 InitializeDemuxer(); | 1134 InitializeDemuxer(); |
| 1140 | 1135 |
| 1141 // Attempt a read from the audio stream and run the message loop until done. | 1136 // Attempt a read from the audio stream and run the message loop until done. |
| 1142 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 1137 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 1143 | 1138 |
| 1144 // Read the first two frames and check that we are getting expected data | 1139 // Read the first two frames and check that we are getting expected data |
| 1145 audio->Read(NewReadCB(FROM_HERE, 834, 0, true)); | 1140 audio->Read(NewReadCB(FROM_HERE, 834, 0, true)); |
| 1146 message_loop_.Run(); | 1141 message_loop_.Run(); |
| 1147 | 1142 |
| 1148 audio->Read(NewReadCB(FROM_HERE, 836, 34830, true)); | 1143 audio->Read(NewReadCB(FROM_HERE, 836, 34830, true)); |
| 1149 message_loop_.Run(); | 1144 message_loop_.Run(); |
| 1145 #else | |
| 1146 InitializeDemuxer(false, DEMUXER_ERROR_NO_SUPPORTED_STREAMS); | |
| 1147 #endif | |
| 1150 } | 1148 } |
| 1151 | 1149 |
| 1152 TEST_F(FFmpegDemuxerTest, Read_EAC3_Audio) { | 1150 TEST_F(FFmpegDemuxerTest, Read_EAC3_Audio) { |
| 1153 CreateDemuxer("bear-eac3-only-frag.mp4"); | 1151 CreateDemuxer("bear-eac3-only-frag.mp4"); |
| 1152 #if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING) | |
| 1154 InitializeDemuxer(); | 1153 InitializeDemuxer(); |
| 1155 | 1154 |
| 1156 // Attempt a read from the audio stream and run the message loop until done. | 1155 // Attempt a read from the audio stream and run the message loop until done. |
| 1157 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 1156 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 1158 | 1157 |
| 1159 // Read the first two frames and check that we are getting expected data | 1158 // Read the first two frames and check that we are getting expected data |
| 1160 audio->Read(NewReadCB(FROM_HERE, 870, 0, true)); | 1159 audio->Read(NewReadCB(FROM_HERE, 870, 0, true)); |
| 1161 message_loop_.Run(); | 1160 message_loop_.Run(); |
| 1162 | 1161 |
| 1163 audio->Read(NewReadCB(FROM_HERE, 872, 34830, true)); | 1162 audio->Read(NewReadCB(FROM_HERE, 872, 34830, true)); |
| 1164 message_loop_.Run(); | 1163 message_loop_.Run(); |
| 1164 #else | |
| 1165 InitializeDemuxer(false, DEMUXER_ERROR_NO_SUPPORTED_STREAMS); | |
| 1166 #endif | |
| 1165 } | 1167 } |
| 1166 #endif // ENABLE_AC3_EAC3_AUDIO_DEMUXING | 1168 |
| 1169 #endif | |
|
ddorwin
2016/02/19 20:51:09
// defined(USE_PROPRIETARY_CODECS)
This is a long
ddorwin
2016/02/19 20:51:10
Is there a reason not to run these tests in all ca
servolk
2016/02/19 21:32:01
Done.
servolk
2016/02/19 21:32:01
Well, some earlier patchsets of this CL (e.g. PS #
ddorwin
2016/02/24 00:28:01
Acknowledged.
| |
| 1167 | 1170 |
| 1168 } // namespace media | 1171 } // namespace media |
| OLD | NEW |