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 <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "base/strings/string_split.h" | 10 #include "base/strings/string_split.h" |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 | 152 |
153 ChunkDemuxerTest() { | 153 ChunkDemuxerTest() { |
154 CreateNewDemuxer(); | 154 CreateNewDemuxer(); |
155 } | 155 } |
156 | 156 |
157 void CreateNewDemuxer() { | 157 void CreateNewDemuxer() { |
158 base::Closure open_cb = | 158 base::Closure open_cb = |
159 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); | 159 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); |
160 Demuxer::NeedKeyCB need_key_cb = | 160 Demuxer::NeedKeyCB need_key_cb = |
161 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); | 161 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); |
162 AddTextTrackCB add_text_track_cb = | 162 demuxer_.reset(new ChunkDemuxer(open_cb, need_key_cb, LogCB())); |
163 base::Bind(&ChunkDemuxerTest::OnTextTrack, base::Unretained(this)); | |
164 demuxer_.reset(new ChunkDemuxer(open_cb, need_key_cb, | |
165 add_text_track_cb, LogCB())); | |
166 } | 163 } |
167 | 164 |
168 virtual ~ChunkDemuxerTest() { | 165 virtual ~ChunkDemuxerTest() { |
169 ShutdownDemuxer(); | 166 ShutdownDemuxer(); |
170 } | 167 } |
171 | 168 |
172 void CreateInitSegment(bool has_audio, bool has_video, | 169 void CreateInitSegment(bool has_audio, bool has_video, |
173 bool is_audio_encrypted, bool is_video_encrypted, | 170 bool is_audio_encrypted, bool is_video_encrypted, |
174 scoped_ptr<uint8[]>* buffer, | 171 scoped_ptr<uint8[]>* buffer, |
175 int* size) { | 172 int* size) { |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 bool is_audio_encrypted, bool is_video_encrypted) { | 423 bool is_audio_encrypted, bool is_video_encrypted) { |
427 PipelineStatus expected_status = | 424 PipelineStatus expected_status = |
428 (has_audio || has_video) ? PIPELINE_OK : DEMUXER_ERROR_COULD_NOT_OPEN; | 425 (has_audio || has_video) ? PIPELINE_OK : DEMUXER_ERROR_COULD_NOT_OPEN; |
429 | 426 |
430 base::TimeDelta expected_duration = kNoTimestamp(); | 427 base::TimeDelta expected_duration = kNoTimestamp(); |
431 if (expected_status == PIPELINE_OK) | 428 if (expected_status == PIPELINE_OK) |
432 expected_duration = kDefaultDuration(); | 429 expected_duration = kDefaultDuration(); |
433 | 430 |
434 EXPECT_CALL(*this, DemuxerOpened()); | 431 EXPECT_CALL(*this, DemuxerOpened()); |
435 demuxer_->Initialize( | 432 demuxer_->Initialize( |
436 &host_, CreateInitDoneCB(expected_duration, expected_status)); | 433 &host_, CreateInitDoneCB(expected_duration, expected_status), true); |
437 | 434 |
438 if (AddId(kSourceId, has_audio, has_video) != ChunkDemuxer::kOk) | 435 if (AddId(kSourceId, has_audio, has_video) != ChunkDemuxer::kOk) |
439 return false; | 436 return false; |
440 | 437 |
441 AppendInitSegmentWithEncryptedInfo( | 438 AppendInitSegmentWithEncryptedInfo( |
442 kSourceId, has_audio, has_video, | 439 kSourceId, has_audio, has_video, |
443 is_audio_encrypted, is_video_encrypted); | 440 is_audio_encrypted, is_video_encrypted); |
444 return true; | 441 return true; |
445 } | 442 } |
446 | 443 |
447 bool InitDemuxerAudioAndVideoSources(const std::string& audio_id, | 444 bool InitDemuxerAudioAndVideoSources(const std::string& audio_id, |
448 const std::string& video_id) { | 445 const std::string& video_id) { |
449 EXPECT_CALL(*this, DemuxerOpened()); | 446 EXPECT_CALL(*this, DemuxerOpened()); |
450 demuxer_->Initialize( | 447 demuxer_->Initialize( |
451 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); | 448 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); |
452 | 449 |
453 if (AddId(audio_id, true, false) != ChunkDemuxer::kOk) | 450 if (AddId(audio_id, true, false) != ChunkDemuxer::kOk) |
454 return false; | 451 return false; |
455 if (AddId(video_id, false, true) != ChunkDemuxer::kOk) | 452 if (AddId(video_id, false, true) != ChunkDemuxer::kOk) |
456 return false; | 453 return false; |
457 | 454 |
458 AppendInitSegmentWithSourceId(audio_id, true, false); | 455 AppendInitSegmentWithSourceId(audio_id, true, false); |
459 AppendInitSegmentWithSourceId(video_id, false, true); | 456 AppendInitSegmentWithSourceId(video_id, false, true); |
460 return true; | 457 return true; |
461 } | 458 } |
(...skipping 15 matching lines...) Expand all Loading... |
477 // time ranges. | 474 // time ranges. |
478 // bear-320x240.webm : [0-524) [779-2737) | 475 // bear-320x240.webm : [0-524) [779-2737) |
479 // bear-640x360.webm : [527-759) | 476 // bear-640x360.webm : [527-759) |
480 bool InitDemuxerWithConfigChangeData() { | 477 bool InitDemuxerWithConfigChangeData() { |
481 scoped_refptr<DecoderBuffer> bear1 = ReadTestDataFile("bear-320x240.webm"); | 478 scoped_refptr<DecoderBuffer> bear1 = ReadTestDataFile("bear-320x240.webm"); |
482 scoped_refptr<DecoderBuffer> bear2 = ReadTestDataFile("bear-640x360.webm"); | 479 scoped_refptr<DecoderBuffer> bear2 = ReadTestDataFile("bear-640x360.webm"); |
483 | 480 |
484 EXPECT_CALL(*this, DemuxerOpened()); | 481 EXPECT_CALL(*this, DemuxerOpened()); |
485 demuxer_->Initialize( | 482 demuxer_->Initialize( |
486 &host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), | 483 &host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), |
487 PIPELINE_OK)); | 484 PIPELINE_OK), true); |
488 | 485 |
489 if (AddId(kSourceId, true, true) != ChunkDemuxer::kOk) | 486 if (AddId(kSourceId, true, true) != ChunkDemuxer::kOk) |
490 return false; | 487 return false; |
491 | 488 |
492 // Append the whole bear1 file. | 489 // Append the whole bear1 file. |
493 AppendData(bear1->data(), bear1->data_size()); | 490 AppendData(bear1->data(), bear1->data_size()); |
494 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); | 491 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); |
495 | 492 |
496 // Append initialization segment for bear2. | 493 // Append initialization segment for bear2. |
497 // Note: Offsets here and below are derived from | 494 // Note: Offsets here and below are derived from |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 const base::TimeDelta& duration) { | 800 const base::TimeDelta& duration) { |
804 return ParseWebMFile(filename, timestamps, duration, true, true); | 801 return ParseWebMFile(filename, timestamps, duration, true, true); |
805 } | 802 } |
806 | 803 |
807 bool ParseWebMFile(const std::string& filename, | 804 bool ParseWebMFile(const std::string& filename, |
808 const BufferTimestamps* timestamps, | 805 const BufferTimestamps* timestamps, |
809 const base::TimeDelta& duration, | 806 const base::TimeDelta& duration, |
810 bool has_audio, bool has_video) { | 807 bool has_audio, bool has_video) { |
811 EXPECT_CALL(*this, DemuxerOpened()); | 808 EXPECT_CALL(*this, DemuxerOpened()); |
812 demuxer_->Initialize( | 809 demuxer_->Initialize( |
813 &host_, CreateInitDoneCB(duration, PIPELINE_OK)); | 810 &host_, CreateInitDoneCB(duration, PIPELINE_OK), true); |
814 | 811 |
815 if (AddId(kSourceId, has_audio, has_video) != ChunkDemuxer::kOk) | 812 if (AddId(kSourceId, has_audio, has_video) != ChunkDemuxer::kOk) |
816 return false; | 813 return false; |
817 | 814 |
818 // Read a WebM file into memory and send the data to the demuxer. | 815 // Read a WebM file into memory and send the data to the demuxer. |
819 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename); | 816 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename); |
820 AppendDataInPieces(buffer->data(), buffer->data_size(), 512); | 817 AppendDataInPieces(buffer->data(), buffer->data_size(), 512); |
821 | 818 |
822 // Verify that the timestamps on the first few packets match what we | 819 // Verify that the timestamps on the first few packets match what we |
823 // expect. | 820 // expect. |
(...skipping 30 matching lines...) Expand all Loading... |
854 // (http://code.google.com/p/googletest/issues/detail?id=395) or when we use | 851 // (http://code.google.com/p/googletest/issues/detail?id=395) or when we use |
855 // std::string instead of scoped_ptr<uint8[]> (http://crbug.com/130689). | 852 // std::string instead of scoped_ptr<uint8[]> (http://crbug.com/130689). |
856 MOCK_METHOD3(NeedKeyMock, void(const std::string& type, | 853 MOCK_METHOD3(NeedKeyMock, void(const std::string& type, |
857 const uint8* init_data, int init_data_size)); | 854 const uint8* init_data, int init_data_size)); |
858 void DemuxerNeedKey(const std::string& type, | 855 void DemuxerNeedKey(const std::string& type, |
859 const std::vector<uint8>& init_data) { | 856 const std::vector<uint8>& init_data) { |
860 const uint8* init_data_ptr = init_data.empty() ? NULL : &init_data[0]; | 857 const uint8* init_data_ptr = init_data.empty() ? NULL : &init_data[0]; |
861 NeedKeyMock(type, init_data_ptr, init_data.size()); | 858 NeedKeyMock(type, init_data_ptr, init_data.size()); |
862 } | 859 } |
863 | 860 |
864 scoped_ptr<TextTrack> OnTextTrack(TextKind kind, | |
865 const std::string& label, | |
866 const std::string& language) { | |
867 return scoped_ptr<TextTrack>(); | |
868 } | |
869 | |
870 void Seek(base::TimeDelta seek_time) { | 861 void Seek(base::TimeDelta seek_time) { |
871 demuxer_->StartWaitingForSeek(seek_time); | 862 demuxer_->StartWaitingForSeek(seek_time); |
872 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); | 863 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); |
873 message_loop_.RunUntilIdle(); | 864 message_loop_.RunUntilIdle(); |
874 } | 865 } |
875 | 866 |
876 void MarkEndOfStream(PipelineStatus status) { | 867 void MarkEndOfStream(PipelineStatus status) { |
877 demuxer_->MarkEndOfStream(status); | 868 demuxer_->MarkEndOfStream(status); |
878 message_loop_.RunUntilIdle(); | 869 message_loop_.RunUntilIdle(); |
879 } | 870 } |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
946 demuxer_.reset(); | 937 demuxer_.reset(); |
947 } | 938 } |
948 } | 939 } |
949 | 940 |
950 // Make sure that the demuxer reports an error if Shutdown() | 941 // Make sure that the demuxer reports an error if Shutdown() |
951 // is called before all the initialization segments are appended. | 942 // is called before all the initialization segments are appended. |
952 TEST_F(ChunkDemuxerTest, ShutdownBeforeAllInitSegmentsAppended) { | 943 TEST_F(ChunkDemuxerTest, ShutdownBeforeAllInitSegmentsAppended) { |
953 EXPECT_CALL(*this, DemuxerOpened()); | 944 EXPECT_CALL(*this, DemuxerOpened()); |
954 demuxer_->Initialize( | 945 demuxer_->Initialize( |
955 &host_, CreateInitDoneCB( | 946 &host_, CreateInitDoneCB( |
956 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN)); | 947 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true); |
957 | 948 |
958 EXPECT_EQ(AddId("audio", true, false), ChunkDemuxer::kOk); | 949 EXPECT_EQ(AddId("audio", true, false), ChunkDemuxer::kOk); |
959 EXPECT_EQ(AddId("video", false, true), ChunkDemuxer::kOk); | 950 EXPECT_EQ(AddId("video", false, true), ChunkDemuxer::kOk); |
960 | 951 |
961 AppendInitSegmentWithSourceId("audio", true, false); | 952 AppendInitSegmentWithSourceId("audio", true, false); |
962 } | 953 } |
963 | 954 |
964 // Test that Seek() completes successfully when the first cluster | 955 // Test that Seek() completes successfully when the first cluster |
965 // arrives. | 956 // arrives. |
966 TEST_F(ChunkDemuxerTest, AppendDataAfterSeek) { | 957 TEST_F(ChunkDemuxerTest, AppendDataAfterSeek) { |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1132 | 1123 |
1133 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); | 1124 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); |
1134 AppendCluster(cb.Finish()); | 1125 AppendCluster(cb.Finish()); |
1135 } | 1126 } |
1136 | 1127 |
1137 // Test the case where a cluster is passed to AppendCluster() before | 1128 // Test the case where a cluster is passed to AppendCluster() before |
1138 // INFO & TRACKS data. | 1129 // INFO & TRACKS data. |
1139 TEST_F(ChunkDemuxerTest, ClusterBeforeInitSegment) { | 1130 TEST_F(ChunkDemuxerTest, ClusterBeforeInitSegment) { |
1140 EXPECT_CALL(*this, DemuxerOpened()); | 1131 EXPECT_CALL(*this, DemuxerOpened()); |
1141 demuxer_->Initialize( | 1132 demuxer_->Initialize( |
1142 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); | 1133 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); |
1143 | 1134 |
1144 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); | 1135 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); |
1145 | 1136 |
1146 AppendCluster(GenerateCluster(0, 1)); | 1137 AppendCluster(GenerateCluster(0, 1)); |
1147 } | 1138 } |
1148 | 1139 |
1149 // Test cases where we get an MarkEndOfStream() call during initialization. | 1140 // Test cases where we get an MarkEndOfStream() call during initialization. |
1150 TEST_F(ChunkDemuxerTest, EOSDuringInit) { | 1141 TEST_F(ChunkDemuxerTest, EOSDuringInit) { |
1151 EXPECT_CALL(*this, DemuxerOpened()); | 1142 EXPECT_CALL(*this, DemuxerOpened()); |
1152 demuxer_->Initialize( | 1143 demuxer_->Initialize( |
1153 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); | 1144 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); |
1154 MarkEndOfStream(PIPELINE_OK); | 1145 MarkEndOfStream(PIPELINE_OK); |
1155 } | 1146 } |
1156 | 1147 |
1157 TEST_F(ChunkDemuxerTest, EndOfStreamWithNoAppend) { | 1148 TEST_F(ChunkDemuxerTest, EndOfStreamWithNoAppend) { |
1158 EXPECT_CALL(*this, DemuxerOpened()); | 1149 EXPECT_CALL(*this, DemuxerOpened()); |
1159 demuxer_->Initialize( | 1150 demuxer_->Initialize( |
1160 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); | 1151 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); |
1161 | 1152 |
1162 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); | 1153 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); |
1163 | 1154 |
1164 CheckExpectedRanges("{ }"); | 1155 CheckExpectedRanges("{ }"); |
1165 MarkEndOfStream(PIPELINE_OK); | 1156 MarkEndOfStream(PIPELINE_OK); |
1166 ShutdownDemuxer(); | 1157 ShutdownDemuxer(); |
1167 CheckExpectedRanges("{ }"); | 1158 CheckExpectedRanges("{ }"); |
1168 demuxer_->RemoveId(kSourceId); | 1159 demuxer_->RemoveId(kSourceId); |
1169 demuxer_.reset(); | 1160 demuxer_.reset(); |
1170 } | 1161 } |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1349 | 1340 |
1350 // Make sure video can reach end of stream. | 1341 // Make sure video can reach end of stream. |
1351 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); | 1342 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); |
1352 ASSERT_EQ(status, DemuxerStream::kOk); | 1343 ASSERT_EQ(status, DemuxerStream::kOk); |
1353 } | 1344 } |
1354 | 1345 |
1355 // Make sure AppendData() will accept elements that span multiple calls. | 1346 // Make sure AppendData() will accept elements that span multiple calls. |
1356 TEST_F(ChunkDemuxerTest, AppendingInPieces) { | 1347 TEST_F(ChunkDemuxerTest, AppendingInPieces) { |
1357 EXPECT_CALL(*this, DemuxerOpened()); | 1348 EXPECT_CALL(*this, DemuxerOpened()); |
1358 demuxer_->Initialize( | 1349 demuxer_->Initialize( |
1359 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); | 1350 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); |
1360 | 1351 |
1361 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); | 1352 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); |
1362 | 1353 |
1363 scoped_ptr<uint8[]> info_tracks; | 1354 scoped_ptr<uint8[]> info_tracks; |
1364 int info_tracks_size = 0; | 1355 int info_tracks_size = 0; |
1365 CreateInitSegment(true, true, false, false, &info_tracks, &info_tracks_size); | 1356 CreateInitSegment(true, true, false, false, &info_tracks, &info_tracks_size); |
1366 | 1357 |
1367 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); | 1358 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); |
1368 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster()); | 1359 scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster()); |
1369 | 1360 |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1517 message_loop_.RunUntilIdle(); | 1508 message_loop_.RunUntilIdle(); |
1518 | 1509 |
1519 EXPECT_TRUE(audio_read_done); | 1510 EXPECT_TRUE(audio_read_done); |
1520 EXPECT_TRUE(video_read_done); | 1511 EXPECT_TRUE(video_read_done); |
1521 } | 1512 } |
1522 | 1513 |
1523 TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) { | 1514 TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) { |
1524 EXPECT_CALL(*this, DemuxerOpened()); | 1515 EXPECT_CALL(*this, DemuxerOpened()); |
1525 demuxer_->Initialize( | 1516 demuxer_->Initialize( |
1526 &host_, CreateInitDoneCB( | 1517 &host_, CreateInitDoneCB( |
1527 kNoTimestamp(), DEMUXER_ERROR_COULD_NOT_OPEN)); | 1518 kNoTimestamp(), DEMUXER_ERROR_COULD_NOT_OPEN), true); |
1528 | 1519 |
1529 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); | 1520 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); |
1530 | 1521 |
1531 uint8 tmp = 0; | 1522 uint8 tmp = 0; |
1532 demuxer_->AppendData(kSourceId, &tmp, 1); | 1523 demuxer_->AppendData(kSourceId, &tmp, 1); |
1533 } | 1524 } |
1534 | 1525 |
1535 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { | 1526 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { |
1536 EXPECT_CALL(*this, DemuxerOpened()); | 1527 EXPECT_CALL(*this, DemuxerOpened()); |
1537 demuxer_->Initialize( | 1528 demuxer_->Initialize( |
1538 &host_, CreateInitDoneCB(kNoTimestamp(), | 1529 &host_, CreateInitDoneCB(kNoTimestamp(), |
1539 DEMUXER_ERROR_COULD_NOT_OPEN)); | 1530 DEMUXER_ERROR_COULD_NOT_OPEN), true); |
1540 | 1531 |
1541 std::vector<std::string> codecs(1); | 1532 std::vector<std::string> codecs(1); |
1542 codecs[0] = "vorbis"; | 1533 codecs[0] = "vorbis"; |
1543 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs), | 1534 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs), |
1544 ChunkDemuxer::kOk); | 1535 ChunkDemuxer::kOk); |
1545 | 1536 |
1546 AppendInitSegment(true, true); | 1537 AppendInitSegment(true, true); |
1547 } | 1538 } |
1548 | 1539 |
1549 TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { | 1540 TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { |
1550 EXPECT_CALL(*this, DemuxerOpened()); | 1541 EXPECT_CALL(*this, DemuxerOpened()); |
1551 demuxer_->Initialize( | 1542 demuxer_->Initialize( |
1552 &host_, CreateInitDoneCB(kNoTimestamp(), | 1543 &host_, CreateInitDoneCB(kNoTimestamp(), |
1553 DEMUXER_ERROR_COULD_NOT_OPEN)); | 1544 DEMUXER_ERROR_COULD_NOT_OPEN), true); |
1554 | 1545 |
1555 std::vector<std::string> codecs(1); | 1546 std::vector<std::string> codecs(1); |
1556 codecs[0] = "vp8"; | 1547 codecs[0] = "vp8"; |
1557 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), | 1548 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), |
1558 ChunkDemuxer::kOk); | 1549 ChunkDemuxer::kOk); |
1559 | 1550 |
1560 AppendInitSegment(true, true); | 1551 AppendInitSegment(true, true); |
1561 } | 1552 } |
1562 | 1553 |
1563 TEST_F(ChunkDemuxerTest, MultipleHeaders) { | 1554 TEST_F(ChunkDemuxerTest, MultipleHeaders) { |
(...skipping 19 matching lines...) Expand all Loading... |
1583 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); | 1574 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); |
1584 GenerateAudioStreamExpectedReads(0, 4); | 1575 GenerateAudioStreamExpectedReads(0, 4); |
1585 AppendCluster(video_id, | 1576 AppendCluster(video_id, |
1586 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); | 1577 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); |
1587 GenerateVideoStreamExpectedReads(0, 4); | 1578 GenerateVideoStreamExpectedReads(0, 4); |
1588 } | 1579 } |
1589 | 1580 |
1590 TEST_F(ChunkDemuxerTest, AddIdFailures) { | 1581 TEST_F(ChunkDemuxerTest, AddIdFailures) { |
1591 EXPECT_CALL(*this, DemuxerOpened()); | 1582 EXPECT_CALL(*this, DemuxerOpened()); |
1592 demuxer_->Initialize( | 1583 demuxer_->Initialize( |
1593 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); | 1584 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); |
1594 | 1585 |
1595 std::string audio_id = "audio1"; | 1586 std::string audio_id = "audio1"; |
1596 std::string video_id = "video1"; | 1587 std::string video_id = "video1"; |
1597 | 1588 |
1598 ASSERT_EQ(AddId(audio_id, true, false), ChunkDemuxer::kOk); | 1589 ASSERT_EQ(AddId(audio_id, true, false), ChunkDemuxer::kOk); |
1599 | 1590 |
1600 // Adding an id with audio/video should fail because we already added audio. | 1591 // Adding an id with audio/video should fail because we already added audio. |
1601 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit); | 1592 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit); |
1602 | 1593 |
1603 AppendInitSegmentWithSourceId(audio_id, true, false); | 1594 AppendInitSegmentWithSourceId(audio_id, true, false); |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1822 | 1813 |
1823 EXPECT_TRUE(seek_cb_was_called); | 1814 EXPECT_TRUE(seek_cb_was_called); |
1824 | 1815 |
1825 ShutdownDemuxer(); | 1816 ShutdownDemuxer(); |
1826 } | 1817 } |
1827 | 1818 |
1828 // Test ranges in an audio-only stream. | 1819 // Test ranges in an audio-only stream. |
1829 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { | 1820 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { |
1830 EXPECT_CALL(*this, DemuxerOpened()); | 1821 EXPECT_CALL(*this, DemuxerOpened()); |
1831 demuxer_->Initialize( | 1822 demuxer_->Initialize( |
1832 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); | 1823 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); |
1833 | 1824 |
1834 ASSERT_EQ(AddId(kSourceId, true, false), ChunkDemuxer::kOk); | 1825 ASSERT_EQ(AddId(kSourceId, true, false), ChunkDemuxer::kOk); |
1835 AppendInitSegment(true, false); | 1826 AppendInitSegment(true, false); |
1836 | 1827 |
1837 // Test a simple cluster. | 1828 // Test a simple cluster. |
1838 AppendCluster( | 1829 AppendCluster( |
1839 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); | 1830 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); |
1840 | 1831 |
1841 CheckExpectedRanges("{ [0,92) }"); | 1832 CheckExpectedRanges("{ [0,92) }"); |
1842 | 1833 |
1843 // Append a disjoint cluster to check for two separate ranges. | 1834 // Append a disjoint cluster to check for two separate ranges. |
1844 AppendCluster(GenerateSingleStreamCluster( | 1835 AppendCluster(GenerateSingleStreamCluster( |
1845 150, 219, kAudioTrackNum, kAudioBlockDuration)); | 1836 150, 219, kAudioTrackNum, kAudioBlockDuration)); |
1846 | 1837 |
1847 CheckExpectedRanges("{ [0,92) [150,219) }"); | 1838 CheckExpectedRanges("{ [0,92) [150,219) }"); |
1848 } | 1839 } |
1849 | 1840 |
1850 // Test ranges in a video-only stream. | 1841 // Test ranges in a video-only stream. |
1851 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { | 1842 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { |
1852 EXPECT_CALL(*this, DemuxerOpened()); | 1843 EXPECT_CALL(*this, DemuxerOpened()); |
1853 demuxer_->Initialize( | 1844 demuxer_->Initialize( |
1854 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); | 1845 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); |
1855 | 1846 |
1856 ASSERT_EQ(AddId(kSourceId, false, true), ChunkDemuxer::kOk); | 1847 ASSERT_EQ(AddId(kSourceId, false, true), ChunkDemuxer::kOk); |
1857 AppendInitSegment(false, true); | 1848 AppendInitSegment(false, true); |
1858 | 1849 |
1859 // Test a simple cluster. | 1850 // Test a simple cluster. |
1860 AppendCluster( | 1851 AppendCluster( |
1861 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); | 1852 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); |
1862 | 1853 |
1863 CheckExpectedRanges("{ [0,132) }"); | 1854 CheckExpectedRanges("{ [0,132) }"); |
1864 | 1855 |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2086 EXPECT_EQ(DemuxerStream::kOk, status); | 2077 EXPECT_EQ(DemuxerStream::kOk, status); |
2087 EXPECT_EQ(kLastAudioTimestamp, last_timestamp); | 2078 EXPECT_EQ(kLastAudioTimestamp, last_timestamp); |
2088 | 2079 |
2089 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); | 2080 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); |
2090 EXPECT_EQ(DemuxerStream::kOk, status); | 2081 EXPECT_EQ(DemuxerStream::kOk, status); |
2091 EXPECT_EQ(kLastVideoTimestamp, last_timestamp); | 2082 EXPECT_EQ(kLastVideoTimestamp, last_timestamp); |
2092 } | 2083 } |
2093 | 2084 |
2094 TEST_F(ChunkDemuxerTest, GetBufferedRangesBeforeInitSegment) { | 2085 TEST_F(ChunkDemuxerTest, GetBufferedRangesBeforeInitSegment) { |
2095 EXPECT_CALL(*this, DemuxerOpened()); | 2086 EXPECT_CALL(*this, DemuxerOpened()); |
2096 demuxer_->Initialize(&host_, CreateInitDoneCB(PIPELINE_OK)); | 2087 demuxer_->Initialize(&host_, CreateInitDoneCB(PIPELINE_OK), true); |
2097 ASSERT_EQ(AddId("audio", true, false), ChunkDemuxer::kOk); | 2088 ASSERT_EQ(AddId("audio", true, false), ChunkDemuxer::kOk); |
2098 ASSERT_EQ(AddId("video", false, true), ChunkDemuxer::kOk); | 2089 ASSERT_EQ(AddId("video", false, true), ChunkDemuxer::kOk); |
2099 | 2090 |
2100 CheckExpectedRanges("audio", "{ }"); | 2091 CheckExpectedRanges("audio", "{ }"); |
2101 CheckExpectedRanges("video", "{ }"); | 2092 CheckExpectedRanges("video", "{ }"); |
2102 } | 2093 } |
2103 | 2094 |
2104 // Test that Seek() completes successfully when the first cluster | 2095 // Test that Seek() completes successfully when the first cluster |
2105 // arrives. | 2096 // arrives. |
2106 TEST_F(ChunkDemuxerTest, EndOfStreamDuringSeek) { | 2097 TEST_F(ChunkDemuxerTest, EndOfStreamDuringSeek) { |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2410 AppendCluster(kDefaultSecondCluster()); | 2401 AppendCluster(kDefaultSecondCluster()); |
2411 MarkEndOfStream(PIPELINE_OK); | 2402 MarkEndOfStream(PIPELINE_OK); |
2412 } | 2403 } |
2413 | 2404 |
2414 // Test receiving a Shutdown() call before we get an Initialize() | 2405 // Test receiving a Shutdown() call before we get an Initialize() |
2415 // call. This can happen if video element gets destroyed before | 2406 // call. This can happen if video element gets destroyed before |
2416 // the pipeline has a chance to initialize the demuxer. | 2407 // the pipeline has a chance to initialize the demuxer. |
2417 TEST_F(ChunkDemuxerTest, ShutdownBeforeInitialize) { | 2408 TEST_F(ChunkDemuxerTest, ShutdownBeforeInitialize) { |
2418 demuxer_->Shutdown(); | 2409 demuxer_->Shutdown(); |
2419 demuxer_->Initialize( | 2410 demuxer_->Initialize( |
2420 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN)); | 2411 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); |
2421 message_loop_.RunUntilIdle(); | 2412 message_loop_.RunUntilIdle(); |
2422 } | 2413 } |
2423 | 2414 |
2424 TEST_F(ChunkDemuxerTest, ReadAfterAudioDisabled) { | 2415 TEST_F(ChunkDemuxerTest, ReadAfterAudioDisabled) { |
2425 ASSERT_TRUE(InitDemuxer(true, true)); | 2416 ASSERT_TRUE(InitDemuxer(true, true)); |
2426 AppendCluster(kDefaultFirstCluster()); | 2417 AppendCluster(kDefaultFirstCluster()); |
2427 | 2418 |
2428 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); | 2419 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
2429 ASSERT_TRUE(stream); | 2420 ASSERT_TRUE(stream); |
2430 | 2421 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2559 // NOTE: The current GC algorithm tries to preserve the GOP at the | 2550 // NOTE: The current GC algorithm tries to preserve the GOP at the |
2560 // current position as well as the last appended GOP. This is | 2551 // current position as well as the last appended GOP. This is |
2561 // why there are 2 ranges in the expectations. | 2552 // why there are 2 ranges in the expectations. |
2562 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 700, 5); | 2553 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 700, 5); |
2563 CheckExpectedRanges(kSourceId, "{ [500,592) [792,815) }"); | 2554 CheckExpectedRanges(kSourceId, "{ [500,592) [792,815) }"); |
2564 } | 2555 } |
2565 | 2556 |
2566 TEST_F(ChunkDemuxerTest, RemoveBeforeInitSegment) { | 2557 TEST_F(ChunkDemuxerTest, RemoveBeforeInitSegment) { |
2567 EXPECT_CALL(*this, DemuxerOpened()); | 2558 EXPECT_CALL(*this, DemuxerOpened()); |
2568 demuxer_->Initialize( | 2559 demuxer_->Initialize( |
2569 &host_, CreateInitDoneCB(kNoTimestamp(), PIPELINE_OK)); | 2560 &host_, CreateInitDoneCB(kNoTimestamp(), PIPELINE_OK), true); |
2570 | 2561 |
2571 EXPECT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, true, true)); | 2562 EXPECT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, true, true)); |
2572 | 2563 |
2573 demuxer_->Remove(kSourceId, base::TimeDelta::FromMilliseconds(0), | 2564 demuxer_->Remove(kSourceId, base::TimeDelta::FromMilliseconds(0), |
2574 base::TimeDelta::FromMilliseconds(1)); | 2565 base::TimeDelta::FromMilliseconds(1)); |
2575 } | 2566 } |
2576 | 2567 |
2577 TEST_F(ChunkDemuxerTest, AppendWindow) { | 2568 TEST_F(ChunkDemuxerTest, AppendWindow) { |
2578 ASSERT_TRUE(InitDemuxer(false, true)); | 2569 ASSERT_TRUE(InitDemuxer(false, true)); |
2579 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 2570 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
(...skipping 27 matching lines...) Expand all Loading... |
2607 | 2598 |
2608 TEST_F(ChunkDemuxerTest, StartWaitingForSeekAfterParseError) { | 2599 TEST_F(ChunkDemuxerTest, StartWaitingForSeekAfterParseError) { |
2609 ASSERT_TRUE(InitDemuxer(true, true)); | 2600 ASSERT_TRUE(InitDemuxer(true, true)); |
2610 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); | 2601 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); |
2611 AppendGarbage(); | 2602 AppendGarbage(); |
2612 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(50); | 2603 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(50); |
2613 demuxer_->StartWaitingForSeek(seek_time); | 2604 demuxer_->StartWaitingForSeek(seek_time); |
2614 } | 2605 } |
2615 | 2606 |
2616 } // namespace media | 2607 } // namespace media |
OLD | NEW |