Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(375)

Side by Side Diff: media/filters/chunk_demuxer_unittest.cc

Issue 23702007: Render inband text tracks in the media pipeline (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: incorporate aaron's comments (11/04) Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698