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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
155 // has been appended. This cluster starts with blocks that | 155 // has been appended. This cluster starts with blocks that |
156 // have timestamps consistent with the end times of the blocks | 156 // have timestamps consistent with the end times of the blocks |
157 // in kDefaultFirstCluster() so that these two clusters represent | 157 // in kDefaultFirstCluster() so that these two clusters represent |
158 // a continuous region. | 158 // a continuous region. |
159 scoped_ptr<Cluster> kDefaultSecondCluster() { | 159 scoped_ptr<Cluster> kDefaultSecondCluster() { |
160 return GenerateCluster(46, 66, 5); | 160 return GenerateCluster(46, 66, 5); |
161 } | 161 } |
162 | 162 |
163 ChunkDemuxerTest() | 163 ChunkDemuxerTest() |
164 : append_window_end_for_next_append_(kInfiniteDuration()) { | 164 : append_window_end_for_next_append_(kInfiniteDuration()) { |
165 init_segment_received_cb_ = | |
166 base::Bind(&ChunkDemuxerTest::InitSegmentReceived, | |
167 base::Unretained(this)); | |
165 CreateNewDemuxer(); | 168 CreateNewDemuxer(); |
166 } | 169 } |
167 | 170 |
168 void CreateNewDemuxer() { | 171 void CreateNewDemuxer() { |
169 base::Closure open_cb = | 172 base::Closure open_cb = |
170 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); | 173 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); |
171 Demuxer::NeedKeyCB need_key_cb = | 174 Demuxer::NeedKeyCB need_key_cb = |
172 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); | 175 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); |
173 demuxer_.reset( | 176 demuxer_.reset( |
174 new ChunkDemuxer(open_cb, need_key_cb, base::Bind(&LogFunc), true)); | 177 new ChunkDemuxer(open_cb, need_key_cb, base::Bind(&LogFunc), true)); |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
566 AppendCluster(kSourceId, GenerateCluster(block_queue, false)); | 569 AppendCluster(kSourceId, GenerateCluster(block_queue, false)); |
567 } | 570 } |
568 | 571 |
569 void AppendData(const std::string& source_id, | 572 void AppendData(const std::string& source_id, |
570 const uint8* data, size_t length) { | 573 const uint8* data, size_t length) { |
571 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()); | 574 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()); |
572 | 575 |
573 demuxer_->AppendData(source_id, data, length, | 576 demuxer_->AppendData(source_id, data, length, |
574 append_window_start_for_next_append_, | 577 append_window_start_for_next_append_, |
575 append_window_end_for_next_append_, | 578 append_window_end_for_next_append_, |
576 ×tamp_offset_map_[source_id]); | 579 ×tamp_offset_map_[source_id], |
580 init_segment_received_cb_); | |
577 } | 581 } |
578 | 582 |
579 void AppendDataInPieces(const uint8* data, size_t length) { | 583 void AppendDataInPieces(const uint8* data, size_t length) { |
580 AppendDataInPieces(data, length, 7); | 584 AppendDataInPieces(data, length, 7); |
581 } | 585 } |
582 | 586 |
583 void AppendDataInPieces(const uint8* data, size_t length, size_t piece_size) { | 587 void AppendDataInPieces(const uint8* data, size_t length, size_t piece_size) { |
584 const uint8* start = data; | 588 const uint8* start = data; |
585 const uint8* end = data + length; | 589 const uint8* end = data + length; |
586 while (start < end) { | 590 while (start < end) { |
587 size_t append_size = std::min(piece_size, | 591 size_t append_size = std::min(piece_size, |
588 static_cast<size_t>(end - start)); | 592 static_cast<size_t>(end - start)); |
589 AppendData(start, append_size); | 593 AppendData(start, append_size); |
590 start += append_size; | 594 start += append_size; |
591 } | 595 } |
592 } | 596 } |
593 | 597 |
594 void AppendInitSegment(int stream_flags) { | 598 void AppendInitSegment(int stream_flags, bool expect_init_segment_received) { |
595 AppendInitSegmentWithSourceId(kSourceId, stream_flags); | 599 AppendInitSegmentWithSourceId(kSourceId, stream_flags, |
600 expect_init_segment_received); | |
596 } | 601 } |
597 | 602 |
598 void AppendInitSegmentWithSourceId(const std::string& source_id, | 603 void AppendInitSegmentWithSourceId(const std::string& source_id, |
599 int stream_flags) { | 604 int stream_flags, |
600 AppendInitSegmentWithEncryptedInfo(source_id, stream_flags, false, false); | 605 bool expect_init_segment_received) { |
606 AppendInitSegmentWithEncryptedInfo(source_id, stream_flags, | |
607 expect_init_segment_received, | |
608 false, false); | |
601 } | 609 } |
602 | 610 |
603 void AppendInitSegmentWithEncryptedInfo(const std::string& source_id, | 611 void AppendInitSegmentWithEncryptedInfo(const std::string& source_id, |
604 int stream_flags, | 612 int stream_flags, |
613 bool expect_init_segment_received, | |
605 bool is_audio_encrypted, | 614 bool is_audio_encrypted, |
606 bool is_video_encrypted) { | 615 bool is_video_encrypted) { |
616 DCHECK(!expect_init_segment_received || stream_flags > 0) | |
617 << "Do not expect an init segment received when there are no tracks"; | |
607 scoped_ptr<uint8[]> info_tracks; | 618 scoped_ptr<uint8[]> info_tracks; |
608 int info_tracks_size = 0; | 619 int info_tracks_size = 0; |
609 CreateInitSegment(stream_flags, | 620 CreateInitSegment(stream_flags, |
610 is_audio_encrypted, is_video_encrypted, | 621 is_audio_encrypted, is_video_encrypted, |
611 &info_tracks, &info_tracks_size); | 622 &info_tracks, &info_tracks_size); |
623 if (expect_init_segment_received) | |
624 EXPECT_CALL(*this, InitSegmentReceived()); | |
612 AppendData(source_id, info_tracks.get(), info_tracks_size); | 625 AppendData(source_id, info_tracks.get(), info_tracks_size); |
613 } | 626 } |
614 | 627 |
615 void AppendGarbage() { | 628 void AppendGarbage() { |
616 // Fill up an array with gibberish. | 629 // Fill up an array with gibberish. |
617 int garbage_cluster_size = 10; | 630 int garbage_cluster_size = 10; |
618 scoped_ptr<uint8[]> garbage_cluster(new uint8[garbage_cluster_size]); | 631 scoped_ptr<uint8[]> garbage_cluster(new uint8[garbage_cluster_size]); |
619 for (int i = 0; i < garbage_cluster_size; ++i) | 632 for (int i = 0; i < garbage_cluster_size; ++i) |
620 garbage_cluster[i] = i; | 633 garbage_cluster[i] = i; |
621 AppendData(garbage_cluster.get(), garbage_cluster_size); | 634 AppendData(garbage_cluster.get(), garbage_cluster_size); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
657 int stream_flags, bool is_audio_encrypted, bool is_video_encrypted) { | 670 int stream_flags, bool is_audio_encrypted, bool is_video_encrypted) { |
658 | 671 |
659 PipelineStatus expected_status = | 672 PipelineStatus expected_status = |
660 (stream_flags != 0) ? PIPELINE_OK : DEMUXER_ERROR_COULD_NOT_OPEN; | 673 (stream_flags != 0) ? PIPELINE_OK : DEMUXER_ERROR_COULD_NOT_OPEN; |
661 | 674 |
662 base::TimeDelta expected_duration = kNoTimestamp(); | 675 base::TimeDelta expected_duration = kNoTimestamp(); |
663 if (expected_status == PIPELINE_OK) | 676 if (expected_status == PIPELINE_OK) |
664 expected_duration = kDefaultDuration(); | 677 expected_duration = kDefaultDuration(); |
665 | 678 |
666 EXPECT_CALL(*this, DemuxerOpened()); | 679 EXPECT_CALL(*this, DemuxerOpened()); |
680 | |
681 // Adding expectation prior to CreateInitDoneCB() here because InSequence | |
682 // tests require init segment received before duration set. Also, only | |
683 // expect an init segment received callback if there is actually a track in | |
684 // it. | |
685 if (stream_flags != 0) | |
686 EXPECT_CALL(*this, InitSegmentReceived()); | |
687 | |
667 demuxer_->Initialize( | 688 demuxer_->Initialize( |
668 &host_, CreateInitDoneCB(expected_duration, expected_status), true); | 689 &host_, CreateInitDoneCB(expected_duration, expected_status), true); |
669 | 690 |
670 if (AddId(kSourceId, stream_flags) != ChunkDemuxer::kOk) | 691 if (AddId(kSourceId, stream_flags) != ChunkDemuxer::kOk) |
671 return false; | 692 return false; |
672 | 693 |
673 AppendInitSegmentWithEncryptedInfo( | 694 AppendInitSegmentWithEncryptedInfo( |
674 kSourceId, stream_flags, | 695 kSourceId, stream_flags, false, |
675 is_audio_encrypted, is_video_encrypted); | 696 is_audio_encrypted, is_video_encrypted); |
676 return true; | 697 return true; |
677 } | 698 } |
678 | 699 |
679 bool InitDemuxerAudioAndVideoSourcesText(const std::string& audio_id, | 700 bool InitDemuxerAudioAndVideoSourcesText(const std::string& audio_id, |
680 const std::string& video_id, | 701 const std::string& video_id, |
681 bool has_text) { | 702 bool has_text) { |
682 EXPECT_CALL(*this, DemuxerOpened()); | 703 EXPECT_CALL(*this, DemuxerOpened()); |
683 demuxer_->Initialize( | 704 demuxer_->Initialize( |
684 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); | 705 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); |
685 | 706 |
686 if (AddId(audio_id, HAS_AUDIO) != ChunkDemuxer::kOk) | 707 if (AddId(audio_id, HAS_AUDIO) != ChunkDemuxer::kOk) |
687 return false; | 708 return false; |
688 if (AddId(video_id, HAS_VIDEO) != ChunkDemuxer::kOk) | 709 if (AddId(video_id, HAS_VIDEO) != ChunkDemuxer::kOk) |
689 return false; | 710 return false; |
690 | 711 |
691 int audio_flags = HAS_AUDIO; | 712 int audio_flags = HAS_AUDIO; |
692 int video_flags = HAS_VIDEO; | 713 int video_flags = HAS_VIDEO; |
693 | 714 |
694 if (has_text) { | 715 if (has_text) { |
695 audio_flags |= HAS_TEXT; | 716 audio_flags |= HAS_TEXT; |
696 video_flags |= HAS_TEXT; | 717 video_flags |= HAS_TEXT; |
697 } | 718 } |
698 | 719 |
699 AppendInitSegmentWithSourceId(audio_id, audio_flags); | 720 AppendInitSegmentWithSourceId(audio_id, audio_flags, true); |
700 AppendInitSegmentWithSourceId(video_id, video_flags); | 721 AppendInitSegmentWithSourceId(video_id, video_flags, true); |
701 return true; | 722 return true; |
702 } | 723 } |
703 | 724 |
704 bool InitDemuxerAudioAndVideoSources(const std::string& audio_id, | 725 bool InitDemuxerAudioAndVideoSources(const std::string& audio_id, |
705 const std::string& video_id) { | 726 const std::string& video_id) { |
706 return InitDemuxerAudioAndVideoSourcesText(audio_id, video_id, false); | 727 return InitDemuxerAudioAndVideoSourcesText(audio_id, video_id, false); |
707 } | 728 } |
708 | 729 |
709 // Initializes the demuxer with data from 2 files with different | 730 // Initializes the demuxer with data from 2 files with different |
710 // decoder configurations. This is used to test the decoder config change | 731 // decoder configurations. This is used to test the decoder config change |
(...skipping 11 matching lines...) Expand all Loading... | |
722 // The resulting audio stream returns data from each file for the following | 743 // The resulting audio stream returns data from each file for the following |
723 // time ranges. | 744 // time ranges. |
724 // bear-320x240.webm : [0-524) [779-2736) | 745 // bear-320x240.webm : [0-524) [779-2736) |
725 // bear-640x360.webm : [527-759) | 746 // bear-640x360.webm : [527-759) |
726 bool InitDemuxerWithConfigChangeData() { | 747 bool InitDemuxerWithConfigChangeData() { |
727 scoped_refptr<DecoderBuffer> bear1 = ReadTestDataFile("bear-320x240.webm"); | 748 scoped_refptr<DecoderBuffer> bear1 = ReadTestDataFile("bear-320x240.webm"); |
728 scoped_refptr<DecoderBuffer> bear2 = ReadTestDataFile("bear-640x360.webm"); | 749 scoped_refptr<DecoderBuffer> bear2 = ReadTestDataFile("bear-640x360.webm"); |
729 | 750 |
730 EXPECT_CALL(*this, DemuxerOpened()); | 751 EXPECT_CALL(*this, DemuxerOpened()); |
731 | 752 |
753 // Adding expectation prior to CreateInitDoneCB() here because InSequence | |
754 // tests require init segment received before duration set. | |
755 EXPECT_CALL(*this, InitSegmentReceived()); | |
732 demuxer_->Initialize( | 756 demuxer_->Initialize( |
733 &host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), | 757 &host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), |
734 PIPELINE_OK), true); | 758 PIPELINE_OK), true); |
735 | 759 |
736 if (AddId(kSourceId, HAS_AUDIO | HAS_VIDEO) != ChunkDemuxer::kOk) | 760 if (AddId(kSourceId, HAS_AUDIO | HAS_VIDEO) != ChunkDemuxer::kOk) |
737 return false; | 761 return false; |
738 | 762 |
739 // Append the whole bear1 file. | 763 // Append the whole bear1 file. |
740 // TODO(wolenetz/acolwell): Remove this extra SetDuration expectation once | 764 // TODO(wolenetz/acolwell): Remove this extra SetDuration expectation once |
741 // the files are fixed to have the correct duration in their init segments, | 765 // the files are fixed to have the correct duration in their init segments, |
742 // and the CreateInitDoneCB() call, above, is fixed to used that duration. | 766 // and the CreateInitDoneCB() call, above, is fixed to used that duration. |
743 // See http://crbug.com/354284. | 767 // See http://crbug.com/354284. |
744 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746))); | 768 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746))); |
745 AppendData(bear1->data(), bear1->data_size()); | 769 AppendData(bear1->data(), bear1->data_size()); |
746 // Last audio frame has timestamp 2721 and duration 24 (estimated from max | 770 // Last audio frame has timestamp 2721 and duration 24 (estimated from max |
747 // seen so far for audio track). | 771 // seen so far for audio track). |
748 // Last video frame has timestamp 2703 and duration 33 (from TrackEntry | 772 // Last video frame has timestamp 2703 and duration 33 (from TrackEntry |
749 // DefaultDuration for video track). | 773 // DefaultDuration for video track). |
750 CheckExpectedRanges(kSourceId, "{ [0,2736) }"); | 774 CheckExpectedRanges(kSourceId, "{ [0,2736) }"); |
751 | 775 |
752 // Append initialization segment for bear2. | 776 // Append initialization segment for bear2. |
753 // Note: Offsets here and below are derived from | 777 // Note: Offsets here and below are derived from |
754 // media/test/data/bear-640x360-manifest.js and | 778 // media/test/data/bear-640x360-manifest.js and |
755 // media/test/data/bear-320x240-manifest.js which were | 779 // media/test/data/bear-320x240-manifest.js which were |
756 // generated from media/test/data/bear-640x360.webm and | 780 // generated from media/test/data/bear-640x360.webm and |
757 // media/test/data/bear-320x240.webm respectively. | 781 // media/test/data/bear-320x240.webm respectively. |
782 EXPECT_CALL(*this, InitSegmentReceived()); | |
758 AppendData(bear2->data(), 4340); | 783 AppendData(bear2->data(), 4340); |
759 | 784 |
760 // Append a media segment that goes from [0.527000, 1.014000). | 785 // Append a media segment that goes from [0.527000, 1.014000). |
761 AppendData(bear2->data() + 55290, 18785); | 786 AppendData(bear2->data() + 55290, 18785); |
762 CheckExpectedRanges(kSourceId, "{ [0,1027) [1201,2736) }"); | 787 CheckExpectedRanges(kSourceId, "{ [0,1027) [1201,2736) }"); |
763 | 788 |
764 // Append initialization segment for bear1 & fill gap with [779-1197) | 789 // Append initialization segment for bear1 & fill gap with [779-1197) |
765 // segment. | 790 // segment. |
791 EXPECT_CALL(*this, InitSegmentReceived()); | |
766 AppendData(bear1->data(), 4370); | 792 AppendData(bear1->data(), 4370); |
767 AppendData(bear1->data() + 72737, 28183); | 793 AppendData(bear1->data() + 72737, 28183); |
768 CheckExpectedRanges(kSourceId, "{ [0,2736) }"); | 794 CheckExpectedRanges(kSourceId, "{ [0,2736) }"); |
769 | 795 |
770 MarkEndOfStream(PIPELINE_OK); | 796 MarkEndOfStream(PIPELINE_OK); |
771 return true; | 797 return true; |
772 } | 798 } |
773 | 799 |
774 void ShutdownDemuxer() { | 800 void ShutdownDemuxer() { |
775 if (demuxer_) { | 801 if (demuxer_) { |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1080 int stream_flags) { | 1106 int stream_flags) { |
1081 EXPECT_CALL(*this, DemuxerOpened()); | 1107 EXPECT_CALL(*this, DemuxerOpened()); |
1082 demuxer_->Initialize( | 1108 demuxer_->Initialize( |
1083 &host_, CreateInitDoneCB(duration, PIPELINE_OK), true); | 1109 &host_, CreateInitDoneCB(duration, PIPELINE_OK), true); |
1084 | 1110 |
1085 if (AddId(kSourceId, stream_flags) != ChunkDemuxer::kOk) | 1111 if (AddId(kSourceId, stream_flags) != ChunkDemuxer::kOk) |
1086 return false; | 1112 return false; |
1087 | 1113 |
1088 // Read a WebM file into memory and send the data to the demuxer. | 1114 // Read a WebM file into memory and send the data to the demuxer. |
1089 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename); | 1115 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename); |
1116 EXPECT_CALL(*this, InitSegmentReceived()); | |
1090 AppendDataInPieces(buffer->data(), buffer->data_size(), 512); | 1117 AppendDataInPieces(buffer->data(), buffer->data_size(), 512); |
1091 | 1118 |
1092 // Verify that the timestamps on the first few packets match what we | 1119 // Verify that the timestamps on the first few packets match what we |
1093 // expect. | 1120 // expect. |
1094 for (size_t i = 0; | 1121 for (size_t i = 0; |
1095 (timestamps[i].audio_time_ms != kSkip || | 1122 (timestamps[i].audio_time_ms != kSkip || |
1096 timestamps[i].video_time_ms != kSkip); | 1123 timestamps[i].video_time_ms != kSkip); |
1097 i++) { | 1124 i++) { |
1098 bool audio_read_done = false; | 1125 bool audio_read_done = false; |
1099 bool video_read_done = false; | 1126 bool video_read_done = false; |
(...skipping 24 matching lines...) Expand all Loading... | |
1124 // (http://code.google.com/p/googletest/issues/detail?id=395) or when we use | 1151 // (http://code.google.com/p/googletest/issues/detail?id=395) or when we use |
1125 // std::string instead of scoped_ptr<uint8[]> (http://crbug.com/130689). | 1152 // std::string instead of scoped_ptr<uint8[]> (http://crbug.com/130689). |
1126 MOCK_METHOD3(NeedKeyMock, void(const std::string& type, | 1153 MOCK_METHOD3(NeedKeyMock, void(const std::string& type, |
1127 const uint8* init_data, int init_data_size)); | 1154 const uint8* init_data, int init_data_size)); |
1128 void DemuxerNeedKey(const std::string& type, | 1155 void DemuxerNeedKey(const std::string& type, |
1129 const std::vector<uint8>& init_data) { | 1156 const std::vector<uint8>& init_data) { |
1130 const uint8* init_data_ptr = init_data.empty() ? NULL : &init_data[0]; | 1157 const uint8* init_data_ptr = init_data.empty() ? NULL : &init_data[0]; |
1131 NeedKeyMock(type, init_data_ptr, init_data.size()); | 1158 NeedKeyMock(type, init_data_ptr, init_data.size()); |
1132 } | 1159 } |
1133 | 1160 |
1161 MOCK_METHOD0(InitSegmentReceived, void(void)); | |
1162 | |
1134 void Seek(base::TimeDelta seek_time) { | 1163 void Seek(base::TimeDelta seek_time) { |
1135 demuxer_->StartWaitingForSeek(seek_time); | 1164 demuxer_->StartWaitingForSeek(seek_time); |
1136 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); | 1165 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); |
1137 message_loop_.RunUntilIdle(); | 1166 message_loop_.RunUntilIdle(); |
1138 } | 1167 } |
1139 | 1168 |
1140 void MarkEndOfStream(PipelineStatus status) { | 1169 void MarkEndOfStream(PipelineStatus status) { |
1141 demuxer_->MarkEndOfStream(status); | 1170 demuxer_->MarkEndOfStream(status); |
1142 message_loop_.RunUntilIdle(); | 1171 message_loop_.RunUntilIdle(); |
1143 } | 1172 } |
1144 | 1173 |
1145 bool SetTimestampOffset(const std::string& id, | 1174 bool SetTimestampOffset(const std::string& id, |
1146 base::TimeDelta timestamp_offset) { | 1175 base::TimeDelta timestamp_offset) { |
1147 if (demuxer_->IsParsingMediaSegment(id)) | 1176 if (demuxer_->IsParsingMediaSegment(id)) |
1148 return false; | 1177 return false; |
1149 | 1178 |
1150 timestamp_offset_map_[id] = timestamp_offset; | 1179 timestamp_offset_map_[id] = timestamp_offset; |
1151 return true; | 1180 return true; |
1152 } | 1181 } |
1153 | 1182 |
1154 base::MessageLoop message_loop_; | 1183 base::MessageLoop message_loop_; |
1155 MockDemuxerHost host_; | 1184 MockDemuxerHost host_; |
1156 | 1185 |
1157 scoped_ptr<ChunkDemuxer> demuxer_; | 1186 scoped_ptr<ChunkDemuxer> demuxer_; |
1187 ChunkDemuxer::InitSegmentReceivedCB init_segment_received_cb_; | |
1158 | 1188 |
1159 base::TimeDelta append_window_start_for_next_append_; | 1189 base::TimeDelta append_window_start_for_next_append_; |
1160 base::TimeDelta append_window_end_for_next_append_; | 1190 base::TimeDelta append_window_end_for_next_append_; |
1161 | 1191 |
1162 // Map of source id to timestamp offset to use for the next AppendData() | 1192 // Map of source id to timestamp offset to use for the next AppendData() |
1163 // operation for that source id. | 1193 // operation for that source id. |
1164 std::map<std::string, base::TimeDelta> timestamp_offset_map_; | 1194 std::map<std::string, base::TimeDelta> timestamp_offset_map_; |
1165 | 1195 |
1166 private: | 1196 private: |
1167 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); | 1197 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1330 MuxedStreamInfo(kAudioTrackNum, "0K 23K"), | 1360 MuxedStreamInfo(kAudioTrackNum, "0K 23K"), |
1331 MuxedStreamInfo(kVideoTrackNum, "0K 30"), | 1361 MuxedStreamInfo(kVideoTrackNum, "0K 30"), |
1332 MuxedStreamInfo(kTextTrackNum, "10K")); | 1362 MuxedStreamInfo(kTextTrackNum, "10K")); |
1333 CheckExpectedRanges(kSourceId, "{ [0,46) }"); | 1363 CheckExpectedRanges(kSourceId, "{ [0,46) }"); |
1334 | 1364 |
1335 scoped_ptr<uint8[]> info_tracks; | 1365 scoped_ptr<uint8[]> info_tracks; |
1336 int info_tracks_size = 0; | 1366 int info_tracks_size = 0; |
1337 CreateInitSegmentWithAlternateTextTrackNum(HAS_TEXT | HAS_AUDIO | HAS_VIDEO, | 1367 CreateInitSegmentWithAlternateTextTrackNum(HAS_TEXT | HAS_AUDIO | HAS_VIDEO, |
1338 false, false, | 1368 false, false, |
1339 &info_tracks, &info_tracks_size); | 1369 &info_tracks, &info_tracks_size); |
1370 EXPECT_CALL(*this, InitSegmentReceived()); | |
1340 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size, | 1371 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size, |
1341 append_window_start_for_next_append_, | 1372 append_window_start_for_next_append_, |
1342 append_window_end_for_next_append_, | 1373 append_window_end_for_next_append_, |
1343 ×tamp_offset_map_[kSourceId]); | 1374 ×tamp_offset_map_[kSourceId], |
1375 init_segment_received_cb_); | |
1344 | 1376 |
1345 AppendMuxedCluster( | 1377 AppendMuxedCluster( |
1346 MuxedStreamInfo(kAudioTrackNum, "46K 69K"), | 1378 MuxedStreamInfo(kAudioTrackNum, "46K 69K"), |
1347 MuxedStreamInfo(kVideoTrackNum, "60K"), | 1379 MuxedStreamInfo(kVideoTrackNum, "60K"), |
1348 MuxedStreamInfo(kAlternateTextTrackNum, "45K")); | 1380 MuxedStreamInfo(kAlternateTextTrackNum, "45K")); |
1349 | 1381 |
1350 CheckExpectedRanges(kSourceId, "{ [0,92) }"); | 1382 CheckExpectedRanges(kSourceId, "{ [0,92) }"); |
1351 CheckExpectedBuffers(audio_stream, "0 23 46 69"); | 1383 CheckExpectedBuffers(audio_stream, "0 23 46 69"); |
1352 CheckExpectedBuffers(video_stream, "0 30 60"); | 1384 CheckExpectedBuffers(video_stream, "0 30 60"); |
1353 CheckExpectedBuffers(text_stream, "10 45"); | 1385 CheckExpectedBuffers(text_stream, "10 45"); |
(...skipping 17 matching lines...) Expand all Loading... | |
1371 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); | 1403 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
1372 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 1404 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
1373 ASSERT_TRUE(audio_stream && video_stream && text_stream); | 1405 ASSERT_TRUE(audio_stream && video_stream && text_stream); |
1374 | 1406 |
1375 AppendMuxedCluster( | 1407 AppendMuxedCluster( |
1376 MuxedStreamInfo(kAudioTrackNum, "23K"), | 1408 MuxedStreamInfo(kAudioTrackNum, "23K"), |
1377 MuxedStreamInfo(kVideoTrackNum, "0 30K"), | 1409 MuxedStreamInfo(kVideoTrackNum, "0 30K"), |
1378 MuxedStreamInfo(kTextTrackNum, "25K 40K")); | 1410 MuxedStreamInfo(kTextTrackNum, "25K 40K")); |
1379 CheckExpectedRanges(kSourceId, "{ [23,46) }"); | 1411 CheckExpectedRanges(kSourceId, "{ [23,46) }"); |
1380 | 1412 |
1381 AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO); | 1413 AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO, true); |
1382 AppendMuxedCluster( | 1414 AppendMuxedCluster( |
1383 MuxedStreamInfo(kAudioTrackNum, "46K 69K"), | 1415 MuxedStreamInfo(kAudioTrackNum, "46K 69K"), |
1384 MuxedStreamInfo(kVideoTrackNum, "60 90K"), | 1416 MuxedStreamInfo(kVideoTrackNum, "60 90K"), |
1385 MuxedStreamInfo(kTextTrackNum, "80K 90K")); | 1417 MuxedStreamInfo(kTextTrackNum, "80K 90K")); |
1386 CheckExpectedRanges(kSourceId, "{ [23,92) }"); | 1418 CheckExpectedRanges(kSourceId, "{ [23,92) }"); |
1387 | 1419 |
1388 CheckExpectedBuffers(audio_stream, "23 46 69"); | 1420 CheckExpectedBuffers(audio_stream, "23 46 69"); |
1389 CheckExpectedBuffers(video_stream, "30 90"); | 1421 CheckExpectedBuffers(video_stream, "30 90"); |
1390 CheckExpectedBuffers(text_stream, "25 40 80 90"); | 1422 CheckExpectedBuffers(text_stream, "25 40 80 90"); |
1391 } | 1423 } |
1392 | 1424 |
1393 // Make sure that the demuxer reports an error if Shutdown() | 1425 // Make sure that the demuxer reports an error if Shutdown() |
1394 // is called before all the initialization segments are appended. | 1426 // is called before all the initialization segments are appended. |
1395 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) { | 1427 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) { |
1396 EXPECT_CALL(*this, DemuxerOpened()); | 1428 EXPECT_CALL(*this, DemuxerOpened()); |
1397 demuxer_->Initialize( | 1429 demuxer_->Initialize( |
1398 &host_, CreateInitDoneCB( | 1430 &host_, CreateInitDoneCB( |
1399 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true); | 1431 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true); |
1400 | 1432 |
1401 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk); | 1433 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk); |
1402 EXPECT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk); | 1434 EXPECT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk); |
1403 | 1435 |
1404 AppendInitSegmentWithSourceId("audio", HAS_AUDIO); | 1436 AppendInitSegmentWithSourceId("audio", HAS_AUDIO, true); |
1405 | 1437 |
1406 ShutdownDemuxer(); | 1438 ShutdownDemuxer(); |
1407 } | 1439 } |
1408 | 1440 |
1409 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) { | 1441 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) { |
1410 EXPECT_CALL(*this, DemuxerOpened()); | 1442 EXPECT_CALL(*this, DemuxerOpened()); |
1411 demuxer_->Initialize( | 1443 demuxer_->Initialize( |
1412 &host_, CreateInitDoneCB( | 1444 &host_, CreateInitDoneCB( |
1413 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true); | 1445 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true); |
1414 | 1446 |
1415 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk); | 1447 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk); |
1416 EXPECT_EQ(AddId("video_and_text", HAS_VIDEO), ChunkDemuxer::kOk); | 1448 EXPECT_EQ(AddId("video_and_text", HAS_VIDEO), ChunkDemuxer::kOk); |
1417 | 1449 |
1418 EXPECT_CALL(host_, AddTextStream(_, _)) | 1450 EXPECT_CALL(host_, AddTextStream(_, _)) |
1419 .Times(Exactly(1)); | 1451 .Times(Exactly(1)); |
1420 | 1452 |
1421 AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT); | 1453 AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT, true); |
1422 | 1454 |
1423 ShutdownDemuxer(); | 1455 ShutdownDemuxer(); |
1424 } | 1456 } |
1425 | 1457 |
1426 // Verifies that all streams waiting for data receive an end of stream | 1458 // Verifies that all streams waiting for data receive an end of stream |
1427 // buffer when Shutdown() is called. | 1459 // buffer when Shutdown() is called. |
1428 TEST_F(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) { | 1460 TEST_F(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) { |
1429 DemuxerStream* text_stream = NULL; | 1461 DemuxerStream* text_stream = NULL; |
1430 EXPECT_CALL(host_, AddTextStream(_, _)) | 1462 EXPECT_CALL(host_, AddTextStream(_, _)) |
1431 .WillOnce(SaveArg<0>(&text_stream)); | 1463 .WillOnce(SaveArg<0>(&text_stream)); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1519 | 1551 |
1520 // Test the case where AppendData() is called before Init(). | 1552 // Test the case where AppendData() is called before Init(). |
1521 TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) { | 1553 TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) { |
1522 scoped_ptr<uint8[]> info_tracks; | 1554 scoped_ptr<uint8[]> info_tracks; |
1523 int info_tracks_size = 0; | 1555 int info_tracks_size = 0; |
1524 CreateInitSegment(HAS_AUDIO | HAS_VIDEO, | 1556 CreateInitSegment(HAS_AUDIO | HAS_VIDEO, |
1525 false, false, &info_tracks, &info_tracks_size); | 1557 false, false, &info_tracks, &info_tracks_size); |
1526 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size, | 1558 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size, |
1527 append_window_start_for_next_append_, | 1559 append_window_start_for_next_append_, |
1528 append_window_end_for_next_append_, | 1560 append_window_end_for_next_append_, |
1529 ×tamp_offset_map_[kSourceId]); | 1561 ×tamp_offset_map_[kSourceId], |
1562 init_segment_received_cb_); | |
1530 } | 1563 } |
1531 | 1564 |
1532 // Make sure Read() callbacks are dispatched with the proper data. | 1565 // Make sure Read() callbacks are dispatched with the proper data. |
1533 TEST_F(ChunkDemuxerTest, Read) { | 1566 TEST_F(ChunkDemuxerTest, Read) { |
1534 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 1567 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
1535 | 1568 |
1536 AppendCluster(kDefaultFirstCluster()); | 1569 AppendCluster(kDefaultFirstCluster()); |
1537 | 1570 |
1538 bool audio_read_done = false; | 1571 bool audio_read_done = false; |
1539 bool video_read_done = false; | 1572 bool video_read_done = false; |
(...skipping 15 matching lines...) Expand all Loading... | |
1555 | 1588 |
1556 // Make sure that AppendCluster() does not fail with a cluster that has | 1589 // Make sure that AppendCluster() does not fail with a cluster that has |
1557 // overlaps with the previously appended cluster. | 1590 // overlaps with the previously appended cluster. |
1558 AppendCluster(GenerateCluster(5, 4)); | 1591 AppendCluster(GenerateCluster(5, 4)); |
1559 | 1592 |
1560 // Verify that AppendData() can still accept more data. | 1593 // Verify that AppendData() can still accept more data. |
1561 scoped_ptr<Cluster> cluster_c(GenerateCluster(45, 2)); | 1594 scoped_ptr<Cluster> cluster_c(GenerateCluster(45, 2)); |
1562 demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size(), | 1595 demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size(), |
1563 append_window_start_for_next_append_, | 1596 append_window_start_for_next_append_, |
1564 append_window_end_for_next_append_, | 1597 append_window_end_for_next_append_, |
1565 ×tamp_offset_map_[kSourceId]); | 1598 ×tamp_offset_map_[kSourceId], |
1599 init_segment_received_cb_); | |
1566 } | 1600 } |
1567 | 1601 |
1568 TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) { | 1602 TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) { |
1569 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 1603 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
1570 AppendCluster(kDefaultFirstCluster()); | 1604 AppendCluster(kDefaultFirstCluster()); |
1571 | 1605 |
1572 ClusterBuilder cb; | 1606 ClusterBuilder cb; |
1573 | 1607 |
1574 // Test the case where block timecodes are not monotonically | 1608 // Test the case where block timecodes are not monotonically |
1575 // increasing but stay above the cluster timecode. | 1609 // increasing but stay above the cluster timecode. |
1576 cb.SetClusterTimecode(5); | 1610 cb.SetClusterTimecode(5); |
1577 AddSimpleBlock(&cb, kAudioTrackNum, 5); | 1611 AddSimpleBlock(&cb, kAudioTrackNum, 5); |
1578 AddSimpleBlock(&cb, kVideoTrackNum, 10); | 1612 AddSimpleBlock(&cb, kVideoTrackNum, 10); |
1579 AddSimpleBlock(&cb, kAudioTrackNum, 7); | 1613 AddSimpleBlock(&cb, kAudioTrackNum, 7); |
1580 AddSimpleBlock(&cb, kVideoTrackNum, 15); | 1614 AddSimpleBlock(&cb, kVideoTrackNum, 15); |
1581 | 1615 |
1582 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); | 1616 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); |
1583 AppendCluster(cb.Finish()); | 1617 AppendCluster(cb.Finish()); |
1584 | 1618 |
1585 // Verify that AppendData() ignores data after the error. | 1619 // Verify that AppendData() ignores data after the error. |
1586 scoped_ptr<Cluster> cluster_b(GenerateCluster(20, 2)); | 1620 scoped_ptr<Cluster> cluster_b(GenerateCluster(20, 2)); |
1587 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), | 1621 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), |
1588 append_window_start_for_next_append_, | 1622 append_window_start_for_next_append_, |
1589 append_window_end_for_next_append_, | 1623 append_window_end_for_next_append_, |
1590 ×tamp_offset_map_[kSourceId]); | 1624 ×tamp_offset_map_[kSourceId], |
1625 init_segment_received_cb_); | |
1591 } | 1626 } |
1592 | 1627 |
1593 TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) { | 1628 TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) { |
1594 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 1629 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
1595 AppendCluster(kDefaultFirstCluster()); | 1630 AppendCluster(kDefaultFirstCluster()); |
1596 | 1631 |
1597 ClusterBuilder cb; | 1632 ClusterBuilder cb; |
1598 | 1633 |
1599 // Test timecodes going backwards and including values less than the cluster | 1634 // Test timecodes going backwards and including values less than the cluster |
1600 // timecode. | 1635 // timecode. |
1601 cb.SetClusterTimecode(5); | 1636 cb.SetClusterTimecode(5); |
1602 AddSimpleBlock(&cb, kAudioTrackNum, 5); | 1637 AddSimpleBlock(&cb, kAudioTrackNum, 5); |
1603 AddSimpleBlock(&cb, kVideoTrackNum, 5); | 1638 AddSimpleBlock(&cb, kVideoTrackNum, 5); |
1604 AddSimpleBlock(&cb, kAudioTrackNum, 3); | 1639 AddSimpleBlock(&cb, kAudioTrackNum, 3); |
1605 AddSimpleBlock(&cb, kVideoTrackNum, 3); | 1640 AddSimpleBlock(&cb, kVideoTrackNum, 3); |
1606 | 1641 |
1607 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); | 1642 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); |
1608 AppendCluster(cb.Finish()); | 1643 AppendCluster(cb.Finish()); |
1609 | 1644 |
1610 // Verify that AppendData() ignores data after the error. | 1645 // Verify that AppendData() ignores data after the error. |
1611 scoped_ptr<Cluster> cluster_b(GenerateCluster(6, 2)); | 1646 scoped_ptr<Cluster> cluster_b(GenerateCluster(6, 2)); |
1612 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), | 1647 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), |
1613 append_window_start_for_next_append_, | 1648 append_window_start_for_next_append_, |
1614 append_window_end_for_next_append_, | 1649 append_window_end_for_next_append_, |
1615 ×tamp_offset_map_[kSourceId]); | 1650 ×tamp_offset_map_[kSourceId], |
1651 init_segment_received_cb_); | |
1616 } | 1652 } |
1617 | 1653 |
1618 | 1654 |
1619 TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) { | 1655 TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) { |
1620 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 1656 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
1621 AppendCluster(kDefaultFirstCluster()); | 1657 AppendCluster(kDefaultFirstCluster()); |
1622 | 1658 |
1623 ClusterBuilder cb; | 1659 ClusterBuilder cb; |
1624 | 1660 |
1625 // Test monotonic increasing timestamps on a per stream | 1661 // Test monotonic increasing timestamps on a per stream |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1916 uint8* dst = buffer.get(); | 1952 uint8* dst = buffer.get(); |
1917 memcpy(dst, info_tracks.get(), info_tracks_size); | 1953 memcpy(dst, info_tracks.get(), info_tracks_size); |
1918 dst += info_tracks_size; | 1954 dst += info_tracks_size; |
1919 | 1955 |
1920 memcpy(dst, cluster_a->data(), cluster_a->size()); | 1956 memcpy(dst, cluster_a->data(), cluster_a->size()); |
1921 dst += cluster_a->size(); | 1957 dst += cluster_a->size(); |
1922 | 1958 |
1923 memcpy(dst, cluster_b->data(), cluster_b->size()); | 1959 memcpy(dst, cluster_b->data(), cluster_b->size()); |
1924 dst += cluster_b->size(); | 1960 dst += cluster_b->size(); |
1925 | 1961 |
1962 EXPECT_CALL(*this, InitSegmentReceived()); | |
1926 AppendDataInPieces(buffer.get(), buffer_size); | 1963 AppendDataInPieces(buffer.get(), buffer_size); |
1927 | 1964 |
1928 GenerateExpectedReads(0, 9); | 1965 GenerateExpectedReads(0, 9); |
1929 } | 1966 } |
1930 | 1967 |
1931 TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) { | 1968 TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) { |
1932 struct BufferTimestamps buffer_timestamps[] = { | 1969 struct BufferTimestamps buffer_timestamps[] = { |
1933 {0, 0}, | 1970 {0, 0}, |
1934 {33, 3}, | 1971 {33, 3}, |
1935 {67, 6}, | 1972 {67, 6}, |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2074 demuxer_->Initialize( | 2111 demuxer_->Initialize( |
2075 &host_, CreateInitDoneCB( | 2112 &host_, CreateInitDoneCB( |
2076 kNoTimestamp(), DEMUXER_ERROR_COULD_NOT_OPEN), true); | 2113 kNoTimestamp(), DEMUXER_ERROR_COULD_NOT_OPEN), true); |
2077 | 2114 |
2078 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); | 2115 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); |
2079 | 2116 |
2080 uint8 tmp = 0; | 2117 uint8 tmp = 0; |
2081 demuxer_->AppendData(kSourceId, &tmp, 1, | 2118 demuxer_->AppendData(kSourceId, &tmp, 1, |
2082 append_window_start_for_next_append_, | 2119 append_window_start_for_next_append_, |
2083 append_window_end_for_next_append_, | 2120 append_window_end_for_next_append_, |
2084 ×tamp_offset_map_[kSourceId]); | 2121 ×tamp_offset_map_[kSourceId], |
2122 init_segment_received_cb_); | |
2085 } | 2123 } |
2086 | 2124 |
2087 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { | 2125 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { |
2088 EXPECT_CALL(*this, DemuxerOpened()); | 2126 EXPECT_CALL(*this, DemuxerOpened()); |
2089 demuxer_->Initialize( | 2127 demuxer_->Initialize( |
2090 &host_, CreateInitDoneCB(kNoTimestamp(), | 2128 &host_, CreateInitDoneCB(kNoTimestamp(), |
2091 DEMUXER_ERROR_COULD_NOT_OPEN), true); | 2129 DEMUXER_ERROR_COULD_NOT_OPEN), true); |
2092 | 2130 |
2093 std::vector<std::string> codecs(1); | 2131 std::vector<std::string> codecs(1); |
2094 codecs[0] = "vorbis"; | 2132 codecs[0] = "vorbis"; |
2095 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs), | 2133 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs), |
2096 ChunkDemuxer::kOk); | 2134 ChunkDemuxer::kOk); |
2097 | 2135 |
2098 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); | 2136 AppendInitSegment(HAS_AUDIO | HAS_VIDEO, false); |
2099 } | 2137 } |
2100 | 2138 |
2101 TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { | 2139 TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { |
2102 EXPECT_CALL(*this, DemuxerOpened()); | 2140 EXPECT_CALL(*this, DemuxerOpened()); |
2103 demuxer_->Initialize( | 2141 demuxer_->Initialize( |
2104 &host_, CreateInitDoneCB(kNoTimestamp(), | 2142 &host_, CreateInitDoneCB(kNoTimestamp(), |
2105 DEMUXER_ERROR_COULD_NOT_OPEN), true); | 2143 DEMUXER_ERROR_COULD_NOT_OPEN), true); |
2106 | 2144 |
2107 std::vector<std::string> codecs(1); | 2145 std::vector<std::string> codecs(1); |
2108 codecs[0] = "vp8"; | 2146 codecs[0] = "vp8"; |
2109 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), | 2147 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), |
2110 ChunkDemuxer::kOk); | 2148 ChunkDemuxer::kOk); |
2111 | 2149 |
2112 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); | 2150 AppendInitSegment(HAS_AUDIO | HAS_VIDEO, false); |
2113 } | 2151 } |
2114 | 2152 |
2115 TEST_F(ChunkDemuxerTest, MultipleHeaders) { | 2153 TEST_F(ChunkDemuxerTest, MultipleHeaders) { |
2116 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 2154 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
2117 | 2155 |
2118 AppendCluster(kDefaultFirstCluster()); | 2156 AppendCluster(kDefaultFirstCluster()); |
2119 | 2157 |
2120 // Append another identical initialization segment. | 2158 // Append another identical initialization segment. |
2121 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); | 2159 AppendInitSegment(HAS_AUDIO | HAS_VIDEO, true); |
acolwell GONE FROM CHROMIUM
2014/09/10 18:02:38
nit: I'm not sure this bool param is helping all t
wolenetz
2014/09/11 22:40:37
Done.
| |
2122 | 2160 |
2123 AppendCluster(kDefaultSecondCluster()); | 2161 AppendCluster(kDefaultSecondCluster()); |
2124 | 2162 |
2125 GenerateExpectedReads(0, 9); | 2163 GenerateExpectedReads(0, 9); |
2126 } | 2164 } |
2127 | 2165 |
2128 TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideo) { | 2166 TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideo) { |
2129 std::string audio_id = "audio1"; | 2167 std::string audio_id = "audio1"; |
2130 std::string video_id = "video1"; | 2168 std::string video_id = "video1"; |
2131 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); | 2169 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2165 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); | 2203 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); |
2166 | 2204 |
2167 std::string audio_id = "audio1"; | 2205 std::string audio_id = "audio1"; |
2168 std::string video_id = "video1"; | 2206 std::string video_id = "video1"; |
2169 | 2207 |
2170 ASSERT_EQ(AddId(audio_id, HAS_AUDIO), ChunkDemuxer::kOk); | 2208 ASSERT_EQ(AddId(audio_id, HAS_AUDIO), ChunkDemuxer::kOk); |
2171 | 2209 |
2172 // Adding an id with audio/video should fail because we already added audio. | 2210 // Adding an id with audio/video should fail because we already added audio. |
2173 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit); | 2211 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit); |
2174 | 2212 |
2175 AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO); | 2213 AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO, true); |
2176 | 2214 |
2177 // Adding an id after append should fail. | 2215 // Adding an id after append should fail. |
2178 ASSERT_EQ(AddId(video_id, HAS_VIDEO), ChunkDemuxer::kReachedIdLimit); | 2216 ASSERT_EQ(AddId(video_id, HAS_VIDEO), ChunkDemuxer::kReachedIdLimit); |
2179 } | 2217 } |
2180 | 2218 |
2181 // Test that Read() calls after a RemoveId() return "end of stream" buffers. | 2219 // Test that Read() calls after a RemoveId() return "end of stream" buffers. |
2182 TEST_F(ChunkDemuxerTest, RemoveId) { | 2220 TEST_F(ChunkDemuxerTest, RemoveId) { |
2183 std::string audio_id = "audio1"; | 2221 std::string audio_id = "audio1"; |
2184 std::string video_id = "video1"; | 2222 std::string video_id = "video1"; |
2185 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); | 2223 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2397 ShutdownDemuxer(); | 2435 ShutdownDemuxer(); |
2398 } | 2436 } |
2399 | 2437 |
2400 // Test ranges in an audio-only stream. | 2438 // Test ranges in an audio-only stream. |
2401 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { | 2439 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { |
2402 EXPECT_CALL(*this, DemuxerOpened()); | 2440 EXPECT_CALL(*this, DemuxerOpened()); |
2403 demuxer_->Initialize( | 2441 demuxer_->Initialize( |
2404 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); | 2442 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); |
2405 | 2443 |
2406 ASSERT_EQ(AddId(kSourceId, HAS_AUDIO), ChunkDemuxer::kOk); | 2444 ASSERT_EQ(AddId(kSourceId, HAS_AUDIO), ChunkDemuxer::kOk); |
2407 AppendInitSegment(HAS_AUDIO); | 2445 AppendInitSegment(HAS_AUDIO, true); |
2408 | 2446 |
2409 // Test a simple cluster. | 2447 // Test a simple cluster. |
2410 AppendCluster( | 2448 AppendCluster( |
2411 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); | 2449 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); |
2412 | 2450 |
2413 CheckExpectedRanges("{ [0,92) }"); | 2451 CheckExpectedRanges("{ [0,92) }"); |
2414 | 2452 |
2415 // Append a disjoint cluster to check for two separate ranges. | 2453 // Append a disjoint cluster to check for two separate ranges. |
2416 AppendCluster(GenerateSingleStreamCluster( | 2454 AppendCluster(GenerateSingleStreamCluster( |
2417 150, 219, kAudioTrackNum, kAudioBlockDuration)); | 2455 150, 219, kAudioTrackNum, kAudioBlockDuration)); |
2418 | 2456 |
2419 CheckExpectedRanges("{ [0,92) [150,219) }"); | 2457 CheckExpectedRanges("{ [0,92) [150,219) }"); |
2420 } | 2458 } |
2421 | 2459 |
2422 // Test ranges in a video-only stream. | 2460 // Test ranges in a video-only stream. |
2423 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { | 2461 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { |
2424 EXPECT_CALL(*this, DemuxerOpened()); | 2462 EXPECT_CALL(*this, DemuxerOpened()); |
2425 demuxer_->Initialize( | 2463 demuxer_->Initialize( |
2426 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); | 2464 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); |
2427 | 2465 |
2428 ASSERT_EQ(AddId(kSourceId, HAS_VIDEO), ChunkDemuxer::kOk); | 2466 ASSERT_EQ(AddId(kSourceId, HAS_VIDEO), ChunkDemuxer::kOk); |
2429 AppendInitSegment(HAS_VIDEO); | 2467 AppendInitSegment(HAS_VIDEO, true); |
2430 | 2468 |
2431 // Test a simple cluster. | 2469 // Test a simple cluster. |
2432 AppendCluster( | 2470 AppendCluster( |
2433 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); | 2471 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); |
2434 | 2472 |
2435 CheckExpectedRanges("{ [0,132) }"); | 2473 CheckExpectedRanges("{ [0,132) }"); |
2436 | 2474 |
2437 // Append a disjoint cluster to check for two separate ranges. | 2475 // Append a disjoint cluster to check for two separate ranges. |
2438 AppendCluster(GenerateSingleStreamCluster( | 2476 AppendCluster(GenerateSingleStreamCluster( |
2439 200, 299, kVideoTrackNum, kVideoBlockDuration)); | 2477 200, 299, kVideoTrackNum, kVideoBlockDuration)); |
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2997 // Audio: first PES: | 3035 // Audio: first PES: |
2998 // PTS: 126000 (0x0001ec30) [= 90 kHz-Timestamp: 0:00:01.4000] | 3036 // PTS: 126000 (0x0001ec30) [= 90 kHz-Timestamp: 0:00:01.4000] |
2999 // DTS: 123910 (0x0001e406) [= 90 kHz-Timestamp: 0:00:01.3767] | 3037 // DTS: 123910 (0x0001e406) [= 90 kHz-Timestamp: 0:00:01.3767] |
3000 // Video: last PES: | 3038 // Video: last PES: |
3001 // PTS: 370155 (0x0005a5eb) [= 90 kHz-Timestamp: 0:00:04.1128] | 3039 // PTS: 370155 (0x0005a5eb) [= 90 kHz-Timestamp: 0:00:04.1128] |
3002 // DTS: 367152 (0x00059a30) [= 90 kHz-Timestamp: 0:00:04.0794] | 3040 // DTS: 367152 (0x00059a30) [= 90 kHz-Timestamp: 0:00:04.0794] |
3003 // Audio: last PES: | 3041 // Audio: last PES: |
3004 // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309] | 3042 // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309] |
3005 | 3043 |
3006 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts"); | 3044 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts"); |
3045 EXPECT_CALL(*this, InitSegmentReceived()); | |
3007 AppendData(kSourceId, buffer->data(), buffer->data_size()); | 3046 AppendData(kSourceId, buffer->data(), buffer->data_size()); |
3008 | 3047 |
3009 // Confirm we're in the middle of parsing a media segment. | 3048 // Confirm we're in the middle of parsing a media segment. |
3010 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId)); | 3049 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId)); |
3011 | 3050 |
3012 // Abort on the Mpeg2 TS parser triggers the emission of the last video | 3051 // Abort on the Mpeg2 TS parser triggers the emission of the last video |
3013 // buffer which is pending in the stream parser. | 3052 // buffer which is pending in the stream parser. |
3014 Ranges<base::TimeDelta> range_before_abort = | 3053 Ranges<base::TimeDelta> range_before_abort = |
3015 demuxer_->GetBufferedRanges(kSourceId); | 3054 demuxer_->GetBufferedRanges(kSourceId); |
3016 demuxer_->Abort(kSourceId, | 3055 demuxer_->Abort(kSourceId, |
(...skipping 23 matching lines...) Expand all Loading... | |
3040 // Audio: first PES: | 3079 // Audio: first PES: |
3041 // PTS: 126000 (0x0001ec30) [= 90 kHz-Timestamp: 0:00:01.4000] | 3080 // PTS: 126000 (0x0001ec30) [= 90 kHz-Timestamp: 0:00:01.4000] |
3042 // DTS: 123910 (0x0001e406) [= 90 kHz-Timestamp: 0:00:01.3767] | 3081 // DTS: 123910 (0x0001e406) [= 90 kHz-Timestamp: 0:00:01.3767] |
3043 // Video: last PES: | 3082 // Video: last PES: |
3044 // PTS: 370155 (0x0005a5eb) [= 90 kHz-Timestamp: 0:00:04.1128] | 3083 // PTS: 370155 (0x0005a5eb) [= 90 kHz-Timestamp: 0:00:04.1128] |
3045 // DTS: 367152 (0x00059a30) [= 90 kHz-Timestamp: 0:00:04.0794] | 3084 // DTS: 367152 (0x00059a30) [= 90 kHz-Timestamp: 0:00:04.0794] |
3046 // Audio: last PES: | 3085 // Audio: last PES: |
3047 // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309] | 3086 // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309] |
3048 | 3087 |
3049 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts"); | 3088 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts"); |
3089 EXPECT_CALL(*this, InitSegmentReceived()); | |
3050 AppendData(kSourceId, buffer->data(), buffer->data_size()); | 3090 AppendData(kSourceId, buffer->data(), buffer->data_size()); |
3051 | 3091 |
3052 // Confirm we're in the middle of parsing a media segment. | 3092 // Confirm we're in the middle of parsing a media segment. |
3053 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId)); | 3093 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId)); |
3054 | 3094 |
3055 // Seek to a time corresponding to buffers that will be emitted during the | 3095 // Seek to a time corresponding to buffers that will be emitted during the |
3056 // abort. | 3096 // abort. |
3057 Seek(base::TimeDelta::FromMilliseconds(4110)); | 3097 Seek(base::TimeDelta::FromMilliseconds(4110)); |
3058 | 3098 |
3059 // Abort on the Mpeg2 TS parser triggers the emission of the last video | 3099 // Abort on the Mpeg2 TS parser triggers the emission of the last video |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3399 | 3439 |
3400 // Set the append window to [50,150). | 3440 // Set the append window to [50,150). |
3401 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50); | 3441 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50); |
3402 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(150); | 3442 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(150); |
3403 | 3443 |
3404 // Read a WebM file into memory and send the data to the demuxer. The chunk | 3444 // Read a WebM file into memory and send the data to the demuxer. The chunk |
3405 // size has been chosen carefully to ensure the preroll buffer used by the | 3445 // size has been chosen carefully to ensure the preroll buffer used by the |
3406 // partial append window trim must come from a previous Append() call. | 3446 // partial append window trim must come from a previous Append() call. |
3407 scoped_refptr<DecoderBuffer> buffer = | 3447 scoped_refptr<DecoderBuffer> buffer = |
3408 ReadTestDataFile("bear-320x240-audio-only.webm"); | 3448 ReadTestDataFile("bear-320x240-audio-only.webm"); |
3449 EXPECT_CALL(*this, InitSegmentReceived()); | |
3409 AppendDataInPieces(buffer->data(), buffer->data_size(), 128); | 3450 AppendDataInPieces(buffer->data(), buffer->data_size(), 128); |
3410 | 3451 |
3411 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); | 3452 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
3412 CheckExpectedBuffers(stream, "50P 50 62 86 109 122 125 128"); | 3453 CheckExpectedBuffers(stream, "50P 50 62 86 109 122 125 128"); |
3413 } | 3454 } |
3414 | 3455 |
3415 TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) { | 3456 TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) { |
3416 EXPECT_CALL(*this, DemuxerOpened()); | 3457 EXPECT_CALL(*this, DemuxerOpened()); |
3417 demuxer_->Initialize( | 3458 demuxer_->Initialize( |
3418 &host_, | 3459 &host_, |
3419 CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK), | 3460 CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK), |
3420 true); | 3461 true); |
3421 ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO)); | 3462 ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO)); |
3422 | 3463 |
3423 // Set the append window such that the first file is completely before the | 3464 // Set the append window such that the first file is completely before the |
3424 // append window. | 3465 // append window. |
3425 // TODO(wolenetz/acolwell): Update this duration once the files are fixed to | 3466 // TODO(wolenetz/acolwell): Update this duration once the files are fixed to |
3426 // have the correct duration in their init segments, and the | 3467 // have the correct duration in their init segments, and the |
3427 // CreateInitDoneCB() call, above, is fixed to used that duration. See | 3468 // CreateInitDoneCB() call, above, is fixed to used that duration. See |
3428 // http://crbug.com/354284. | 3469 // http://crbug.com/354284. |
3429 const base::TimeDelta duration_1 = base::TimeDelta::FromMilliseconds(2746); | 3470 const base::TimeDelta duration_1 = base::TimeDelta::FromMilliseconds(2746); |
3430 append_window_start_for_next_append_ = duration_1; | 3471 append_window_start_for_next_append_ = duration_1; |
3431 | 3472 |
3432 // Read a WebM file into memory and append the data. | 3473 // Read a WebM file into memory and append the data. |
3433 scoped_refptr<DecoderBuffer> buffer = | 3474 scoped_refptr<DecoderBuffer> buffer = |
3434 ReadTestDataFile("bear-320x240-audio-only.webm"); | 3475 ReadTestDataFile("bear-320x240-audio-only.webm"); |
3476 EXPECT_CALL(*this, InitSegmentReceived()); | |
3435 AppendDataInPieces(buffer->data(), buffer->data_size(), 512); | 3477 AppendDataInPieces(buffer->data(), buffer->data_size(), 512); |
3436 CheckExpectedRanges(kSourceId, "{ }"); | 3478 CheckExpectedRanges(kSourceId, "{ }"); |
3437 | 3479 |
3438 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); | 3480 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
3439 AudioDecoderConfig config_1 = stream->audio_decoder_config(); | 3481 AudioDecoderConfig config_1 = stream->audio_decoder_config(); |
3440 | 3482 |
3441 // Read a second WebM with a different config in and append the data. | 3483 // Read a second WebM with a different config in and append the data. |
3442 scoped_refptr<DecoderBuffer> buffer2 = | 3484 scoped_refptr<DecoderBuffer> buffer2 = |
3443 ReadTestDataFile("bear-320x240-audio-only-48khz.webm"); | 3485 ReadTestDataFile("bear-320x240-audio-only-48khz.webm"); |
3486 EXPECT_CALL(*this, InitSegmentReceived()); | |
3444 EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber()); | 3487 EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber()); |
3445 ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1)); | 3488 ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1)); |
3446 AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512); | 3489 AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512); |
3447 CheckExpectedRanges(kSourceId, "{ [2746,5519) }"); | 3490 CheckExpectedRanges(kSourceId, "{ [2746,5519) }"); |
3448 | 3491 |
3449 Seek(duration_1); | 3492 Seek(duration_1); |
3450 ExpectConfigChanged(DemuxerStream::AUDIO); | 3493 ExpectConfigChanged(DemuxerStream::AUDIO); |
3451 ASSERT_FALSE(config_1.Matches(stream->audio_decoder_config())); | 3494 ASSERT_FALSE(config_1.Matches(stream->audio_decoder_config())); |
3452 CheckExpectedBuffers(stream, "2746 2767 2789 2810"); | 3495 CheckExpectedBuffers(stream, "2746 2767 2789 2810"); |
3453 } | 3496 } |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3655 TEST_F(ChunkDemuxerTest, CuesBetweenClusters) { | 3698 TEST_F(ChunkDemuxerTest, CuesBetweenClusters) { |
3656 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 3699 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
3657 | 3700 |
3658 AppendCluster(GenerateCluster(0, 0, 4)); | 3701 AppendCluster(GenerateCluster(0, 0, 4)); |
3659 AppendData(kCuesHeader, sizeof(kCuesHeader)); | 3702 AppendData(kCuesHeader, sizeof(kCuesHeader)); |
3660 AppendCluster(GenerateCluster(46, 66, 5)); | 3703 AppendCluster(GenerateCluster(46, 66, 5)); |
3661 CheckExpectedRanges(kSourceId, "{ [0,115) }"); | 3704 CheckExpectedRanges(kSourceId, "{ [0,115) }"); |
3662 } | 3705 } |
3663 | 3706 |
3664 } // namespace media | 3707 } // namespace media |
OLD | NEW |