| 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 |