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 |