Chromium Code Reviews| 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 147 | 147 |
| 148 // Default cluster to append after kDefaultFirstCluster() | 148 // Default cluster to append after kDefaultFirstCluster() |
| 149 // has been appended. This cluster starts with blocks that | 149 // has been appended. This cluster starts with blocks that |
| 150 // have timestamps consistent with the end times of the blocks | 150 // have timestamps consistent with the end times of the blocks |
| 151 // in kDefaultFirstCluster() so that these two clusters represent | 151 // in kDefaultFirstCluster() so that these two clusters represent |
| 152 // a continuous region. | 152 // a continuous region. |
| 153 scoped_ptr<Cluster> kDefaultSecondCluster() { | 153 scoped_ptr<Cluster> kDefaultSecondCluster() { |
| 154 return GenerateCluster(46, 66, 5); | 154 return GenerateCluster(46, 66, 5); |
| 155 } | 155 } |
| 156 | 156 |
| 157 ChunkDemuxerTest() { | 157 ChunkDemuxerTest() |
| 158 : append_window_end_for_next_append_(kInfiniteDuration()) { | |
| 158 CreateNewDemuxer(); | 159 CreateNewDemuxer(); |
| 159 } | 160 } |
| 160 | 161 |
| 161 void CreateNewDemuxer() { | 162 void CreateNewDemuxer() { |
| 162 base::Closure open_cb = | 163 base::Closure open_cb = |
| 163 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); | 164 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); |
| 164 Demuxer::NeedKeyCB need_key_cb = | 165 Demuxer::NeedKeyCB need_key_cb = |
| 165 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); | 166 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); |
| 166 demuxer_.reset(new ChunkDemuxer(open_cb, need_key_cb, | 167 demuxer_.reset(new ChunkDemuxer(open_cb, need_key_cb, |
| 167 base::Bind(&LogFunc))); | 168 base::Bind(&LogFunc))); |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 390 } | 391 } |
| 391 AppendCluster(source_id, cb.Finish()); | 392 AppendCluster(source_id, cb.Finish()); |
| 392 } | 393 } |
| 393 | 394 |
| 394 void AppendData(const std::string& source_id, | 395 void AppendData(const std::string& source_id, |
| 395 const uint8* data, size_t length) { | 396 const uint8* data, size_t length) { |
| 396 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()); | 397 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()); |
| 397 | 398 |
| 398 // TODO(wolenetz): Test timestamp offset updating once "sequence" append | 399 // TODO(wolenetz): Test timestamp offset updating once "sequence" append |
| 399 // mode processing is implemented. See http://crbug.com/249422. | 400 // mode processing is implemented. See http://crbug.com/249422. |
| 400 demuxer_->AppendData(source_id, data, length, NULL); | 401 demuxer_->AppendData(source_id, data, length, |
| 402 append_window_start_for_next_append_, | |
| 403 append_window_end_for_next_append_, | |
| 404 ×tamp_offset_map_[source_id]); | |
| 401 } | 405 } |
| 402 | 406 |
| 403 void AppendDataInPieces(const uint8* data, size_t length) { | 407 void AppendDataInPieces(const uint8* data, size_t length) { |
| 404 AppendDataInPieces(data, length, 7); | 408 AppendDataInPieces(data, length, 7); |
| 405 } | 409 } |
| 406 | 410 |
| 407 void AppendDataInPieces(const uint8* data, size_t length, size_t piece_size) { | 411 void AppendDataInPieces(const uint8* data, size_t length, size_t piece_size) { |
| 408 const uint8* start = data; | 412 const uint8* start = data; |
| 409 const uint8* end = data + length; | 413 const uint8* end = data + length; |
| 410 while (start < end) { | 414 while (start < end) { |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 935 demuxer_->StartWaitingForSeek(seek_time); | 939 demuxer_->StartWaitingForSeek(seek_time); |
| 936 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); | 940 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); |
| 937 message_loop_.RunUntilIdle(); | 941 message_loop_.RunUntilIdle(); |
| 938 } | 942 } |
| 939 | 943 |
| 940 void MarkEndOfStream(PipelineStatus status) { | 944 void MarkEndOfStream(PipelineStatus status) { |
| 941 demuxer_->MarkEndOfStream(status); | 945 demuxer_->MarkEndOfStream(status); |
| 942 message_loop_.RunUntilIdle(); | 946 message_loop_.RunUntilIdle(); |
| 943 } | 947 } |
| 944 | 948 |
| 949 bool SetTimestampOffset(const std::string& id, | |
| 950 base::TimeDelta timestamp_offset) { | |
| 951 if (demuxer_->IsParsingMediaSegment(id)) | |
| 952 return false; | |
| 953 | |
| 954 timestamp_offset_map_[id] = timestamp_offset; | |
| 955 return true; | |
| 956 } | |
| 957 | |
| 945 base::MessageLoop message_loop_; | 958 base::MessageLoop message_loop_; |
| 946 MockDemuxerHost host_; | 959 MockDemuxerHost host_; |
| 947 | 960 |
| 948 scoped_ptr<ChunkDemuxer> demuxer_; | 961 scoped_ptr<ChunkDemuxer> demuxer_; |
| 949 | 962 |
| 963 base::TimeDelta append_window_start_for_next_append_; | |
| 964 base::TimeDelta append_window_end_for_next_append_; | |
|
wolenetz
2014/03/11 23:21:34
Note, I didn't see much gain by adding similar map
| |
| 965 | |
| 966 // Map of source id to timestamp offset to use for the next AppendData() | |
| 967 // operation for that source id. | |
| 968 std::map<std::string, base::TimeDelta> timestamp_offset_map_; | |
| 969 | |
| 950 private: | 970 private: |
| 951 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); | 971 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); |
| 952 }; | 972 }; |
| 953 | 973 |
| 954 TEST_F(ChunkDemuxerTest, Init) { | 974 TEST_F(ChunkDemuxerTest, Init) { |
| 955 // Test no streams, audio-only, video-only, and audio & video scenarios. | 975 // Test no streams, audio-only, video-only, and audio & video scenarios. |
| 956 // Audio and video streams can be encrypted or not encrypted. | 976 // Audio and video streams can be encrypted or not encrypted. |
| 957 for (int i = 0; i < 16; i++) { | 977 for (int i = 0; i < 16; i++) { |
| 958 bool has_audio = (i & 0x1) != 0; | 978 bool has_audio = (i & 0x1) != 0; |
| 959 bool has_video = (i & 0x2) != 0; | 979 bool has_video = (i & 0x2) != 0; |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1212 AppendCluster(GenerateCluster(5000, 6)); | 1232 AppendCluster(GenerateCluster(5000, 6)); |
| 1213 GenerateExpectedReads(5000, 6); | 1233 GenerateExpectedReads(5000, 6); |
| 1214 } | 1234 } |
| 1215 | 1235 |
| 1216 // Test the case where AppendData() is called before Init(). | 1236 // Test the case where AppendData() is called before Init(). |
| 1217 TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) { | 1237 TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) { |
| 1218 scoped_ptr<uint8[]> info_tracks; | 1238 scoped_ptr<uint8[]> info_tracks; |
| 1219 int info_tracks_size = 0; | 1239 int info_tracks_size = 0; |
| 1220 CreateInitSegment(HAS_AUDIO | HAS_VIDEO, | 1240 CreateInitSegment(HAS_AUDIO | HAS_VIDEO, |
| 1221 false, false, &info_tracks, &info_tracks_size); | 1241 false, false, &info_tracks, &info_tracks_size); |
| 1222 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size, NULL); | 1242 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size, |
| 1243 append_window_start_for_next_append_, | |
| 1244 append_window_end_for_next_append_, | |
| 1245 ×tamp_offset_map_[kSourceId]); | |
| 1223 } | 1246 } |
| 1224 | 1247 |
| 1225 // Make sure Read() callbacks are dispatched with the proper data. | 1248 // Make sure Read() callbacks are dispatched with the proper data. |
| 1226 TEST_F(ChunkDemuxerTest, Read) { | 1249 TEST_F(ChunkDemuxerTest, Read) { |
| 1227 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 1250 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 1228 | 1251 |
| 1229 AppendCluster(kDefaultFirstCluster()); | 1252 AppendCluster(kDefaultFirstCluster()); |
| 1230 | 1253 |
| 1231 bool audio_read_done = false; | 1254 bool audio_read_done = false; |
| 1232 bool video_read_done = false; | 1255 bool video_read_done = false; |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 1245 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 1268 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 1246 AppendCluster(kDefaultFirstCluster()); | 1269 AppendCluster(kDefaultFirstCluster()); |
| 1247 AppendCluster(GenerateCluster(10, 4)); | 1270 AppendCluster(GenerateCluster(10, 4)); |
| 1248 | 1271 |
| 1249 // Make sure that AppendCluster() does not fail with a cluster that has | 1272 // Make sure that AppendCluster() does not fail with a cluster that has |
| 1250 // overlaps with the previously appended cluster. | 1273 // overlaps with the previously appended cluster. |
| 1251 AppendCluster(GenerateCluster(5, 4)); | 1274 AppendCluster(GenerateCluster(5, 4)); |
| 1252 | 1275 |
| 1253 // Verify that AppendData() can still accept more data. | 1276 // Verify that AppendData() can still accept more data. |
| 1254 scoped_ptr<Cluster> cluster_c(GenerateCluster(45, 2)); | 1277 scoped_ptr<Cluster> cluster_c(GenerateCluster(45, 2)); |
| 1255 demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size(), NULL); | 1278 demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size(), |
| 1279 append_window_start_for_next_append_, | |
| 1280 append_window_end_for_next_append_, | |
| 1281 ×tamp_offset_map_[kSourceId]); | |
| 1256 } | 1282 } |
| 1257 | 1283 |
| 1258 TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) { | 1284 TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) { |
| 1259 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 1285 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 1260 AppendCluster(kDefaultFirstCluster()); | 1286 AppendCluster(kDefaultFirstCluster()); |
| 1261 | 1287 |
| 1262 ClusterBuilder cb; | 1288 ClusterBuilder cb; |
| 1263 | 1289 |
| 1264 // Test the case where block timecodes are not monotonically | 1290 // Test the case where block timecodes are not monotonically |
| 1265 // increasing but stay above the cluster timecode. | 1291 // increasing but stay above the cluster timecode. |
| 1266 cb.SetClusterTimecode(5); | 1292 cb.SetClusterTimecode(5); |
| 1267 AddSimpleBlock(&cb, kAudioTrackNum, 5); | 1293 AddSimpleBlock(&cb, kAudioTrackNum, 5); |
| 1268 AddSimpleBlock(&cb, kVideoTrackNum, 10); | 1294 AddSimpleBlock(&cb, kVideoTrackNum, 10); |
| 1269 AddSimpleBlock(&cb, kAudioTrackNum, 7); | 1295 AddSimpleBlock(&cb, kAudioTrackNum, 7); |
| 1270 AddSimpleBlock(&cb, kVideoTrackNum, 15); | 1296 AddSimpleBlock(&cb, kVideoTrackNum, 15); |
| 1271 | 1297 |
| 1272 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); | 1298 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); |
| 1273 AppendCluster(cb.Finish()); | 1299 AppendCluster(cb.Finish()); |
| 1274 | 1300 |
| 1275 // Verify that AppendData() ignores data after the error. | 1301 // Verify that AppendData() ignores data after the error. |
| 1276 scoped_ptr<Cluster> cluster_b(GenerateCluster(20, 2)); | 1302 scoped_ptr<Cluster> cluster_b(GenerateCluster(20, 2)); |
| 1277 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), NULL); | 1303 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), |
| 1304 append_window_start_for_next_append_, | |
| 1305 append_window_end_for_next_append_, | |
| 1306 ×tamp_offset_map_[kSourceId]); | |
| 1278 } | 1307 } |
| 1279 | 1308 |
| 1280 TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) { | 1309 TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) { |
| 1281 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 1310 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 1282 AppendCluster(kDefaultFirstCluster()); | 1311 AppendCluster(kDefaultFirstCluster()); |
| 1283 | 1312 |
| 1284 ClusterBuilder cb; | 1313 ClusterBuilder cb; |
| 1285 | 1314 |
| 1286 // Test timecodes going backwards and including values less than the cluster | 1315 // Test timecodes going backwards and including values less than the cluster |
| 1287 // timecode. | 1316 // timecode. |
| 1288 cb.SetClusterTimecode(5); | 1317 cb.SetClusterTimecode(5); |
| 1289 AddSimpleBlock(&cb, kAudioTrackNum, 5); | 1318 AddSimpleBlock(&cb, kAudioTrackNum, 5); |
| 1290 AddSimpleBlock(&cb, kVideoTrackNum, 5); | 1319 AddSimpleBlock(&cb, kVideoTrackNum, 5); |
| 1291 AddSimpleBlock(&cb, kAudioTrackNum, 3); | 1320 AddSimpleBlock(&cb, kAudioTrackNum, 3); |
| 1292 AddSimpleBlock(&cb, kVideoTrackNum, 3); | 1321 AddSimpleBlock(&cb, kVideoTrackNum, 3); |
| 1293 | 1322 |
| 1294 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); | 1323 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); |
| 1295 AppendCluster(cb.Finish()); | 1324 AppendCluster(cb.Finish()); |
| 1296 | 1325 |
| 1297 // Verify that AppendData() ignores data after the error. | 1326 // Verify that AppendData() ignores data after the error. |
| 1298 scoped_ptr<Cluster> cluster_b(GenerateCluster(6, 2)); | 1327 scoped_ptr<Cluster> cluster_b(GenerateCluster(6, 2)); |
| 1299 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), NULL); | 1328 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), |
| 1329 append_window_start_for_next_append_, | |
| 1330 append_window_end_for_next_append_, | |
| 1331 ×tamp_offset_map_[kSourceId]); | |
| 1300 } | 1332 } |
| 1301 | 1333 |
| 1302 | 1334 |
| 1303 TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) { | 1335 TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) { |
| 1304 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 1336 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 1305 AppendCluster(kDefaultFirstCluster()); | 1337 AppendCluster(kDefaultFirstCluster()); |
| 1306 | 1338 |
| 1307 ClusterBuilder cb; | 1339 ClusterBuilder cb; |
| 1308 | 1340 |
| 1309 // Test monotonic increasing timestamps on a per stream | 1341 // Test monotonic increasing timestamps on a per stream |
| (...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1746 | 1778 |
| 1747 TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) { | 1779 TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) { |
| 1748 EXPECT_CALL(*this, DemuxerOpened()); | 1780 EXPECT_CALL(*this, DemuxerOpened()); |
| 1749 demuxer_->Initialize( | 1781 demuxer_->Initialize( |
| 1750 &host_, CreateInitDoneCB( | 1782 &host_, CreateInitDoneCB( |
| 1751 kNoTimestamp(), DEMUXER_ERROR_COULD_NOT_OPEN), true); | 1783 kNoTimestamp(), DEMUXER_ERROR_COULD_NOT_OPEN), true); |
| 1752 | 1784 |
| 1753 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); | 1785 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); |
| 1754 | 1786 |
| 1755 uint8 tmp = 0; | 1787 uint8 tmp = 0; |
| 1756 demuxer_->AppendData(kSourceId, &tmp, 1, NULL); | 1788 demuxer_->AppendData(kSourceId, &tmp, 1, |
| 1789 append_window_start_for_next_append_, | |
| 1790 append_window_end_for_next_append_, | |
| 1791 ×tamp_offset_map_[kSourceId]); | |
| 1757 } | 1792 } |
| 1758 | 1793 |
| 1759 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { | 1794 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { |
| 1760 EXPECT_CALL(*this, DemuxerOpened()); | 1795 EXPECT_CALL(*this, DemuxerOpened()); |
| 1761 demuxer_->Initialize( | 1796 demuxer_->Initialize( |
| 1762 &host_, CreateInitDoneCB(kNoTimestamp(), | 1797 &host_, CreateInitDoneCB(kNoTimestamp(), |
| 1763 DEMUXER_ERROR_COULD_NOT_OPEN), true); | 1798 DEMUXER_ERROR_COULD_NOT_OPEN), true); |
| 1764 | 1799 |
| 1765 std::vector<std::string> codecs(1); | 1800 std::vector<std::string> codecs(1); |
| 1766 codecs[0] = "vorbis"; | 1801 codecs[0] = "vorbis"; |
| (...skipping 810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2577 Seek(base::TimeDelta::FromMilliseconds(801)); | 2612 Seek(base::TimeDelta::FromMilliseconds(801)); |
| 2578 | 2613 |
| 2579 // Verify that no config change is signalled. | 2614 // Verify that no config change is signalled. |
| 2580 ExpectRead(DemuxerStream::VIDEO, 801); | 2615 ExpectRead(DemuxerStream::VIDEO, 801); |
| 2581 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); | 2616 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); |
| 2582 } | 2617 } |
| 2583 | 2618 |
| 2584 TEST_F(ChunkDemuxerTest, TimestampPositiveOffset) { | 2619 TEST_F(ChunkDemuxerTest, TimestampPositiveOffset) { |
| 2585 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 2620 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 2586 | 2621 |
| 2587 ASSERT_TRUE(demuxer_->SetTimestampOffset( | 2622 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(30))); |
| 2588 kSourceId, base::TimeDelta::FromSeconds(30))); | |
| 2589 AppendCluster(GenerateCluster(0, 2)); | 2623 AppendCluster(GenerateCluster(0, 2)); |
| 2590 | 2624 |
| 2591 Seek(base::TimeDelta::FromMilliseconds(30000)); | 2625 Seek(base::TimeDelta::FromMilliseconds(30000)); |
| 2592 | 2626 |
| 2593 GenerateExpectedReads(30000, 2); | 2627 GenerateExpectedReads(30000, 2); |
| 2594 } | 2628 } |
| 2595 | 2629 |
| 2596 TEST_F(ChunkDemuxerTest, TimestampNegativeOffset) { | 2630 TEST_F(ChunkDemuxerTest, TimestampNegativeOffset) { |
| 2597 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 2631 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 2598 | 2632 |
| 2599 ASSERT_TRUE(demuxer_->SetTimestampOffset( | 2633 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(-1))); |
| 2600 kSourceId, base::TimeDelta::FromSeconds(-1))); | |
| 2601 AppendCluster(GenerateCluster(1000, 2)); | 2634 AppendCluster(GenerateCluster(1000, 2)); |
| 2602 | 2635 |
| 2603 GenerateExpectedReads(0, 2); | 2636 GenerateExpectedReads(0, 2); |
| 2604 } | 2637 } |
| 2605 | 2638 |
| 2606 TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) { | 2639 TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) { |
| 2607 std::string audio_id = "audio1"; | 2640 std::string audio_id = "audio1"; |
| 2608 std::string video_id = "video1"; | 2641 std::string video_id = "video1"; |
| 2609 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); | 2642 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); |
| 2610 | 2643 |
| 2611 ASSERT_TRUE(demuxer_->SetTimestampOffset( | 2644 ASSERT_TRUE(SetTimestampOffset( |
| 2612 audio_id, base::TimeDelta::FromMilliseconds(-2500))); | 2645 audio_id, base::TimeDelta::FromMilliseconds(-2500))); |
| 2613 ASSERT_TRUE(demuxer_->SetTimestampOffset( | 2646 ASSERT_TRUE(SetTimestampOffset( |
| 2614 video_id, base::TimeDelta::FromMilliseconds(-2500))); | 2647 video_id, base::TimeDelta::FromMilliseconds(-2500))); |
| 2615 AppendCluster(audio_id, GenerateSingleStreamCluster(2500, | 2648 AppendCluster(audio_id, GenerateSingleStreamCluster(2500, |
| 2616 2500 + kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); | 2649 2500 + kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); |
| 2617 AppendCluster(video_id, GenerateSingleStreamCluster(2500, | 2650 AppendCluster(video_id, GenerateSingleStreamCluster(2500, |
| 2618 2500 + kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); | 2651 2500 + kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); |
| 2619 GenerateAudioStreamExpectedReads(0, 4); | 2652 GenerateAudioStreamExpectedReads(0, 4); |
| 2620 GenerateVideoStreamExpectedReads(0, 4); | 2653 GenerateVideoStreamExpectedReads(0, 4); |
| 2621 | 2654 |
| 2622 Seek(base::TimeDelta::FromMilliseconds(27300)); | 2655 Seek(base::TimeDelta::FromMilliseconds(27300)); |
| 2623 | 2656 |
| 2624 ASSERT_TRUE(demuxer_->SetTimestampOffset( | 2657 ASSERT_TRUE(SetTimestampOffset( |
| 2625 audio_id, base::TimeDelta::FromMilliseconds(27300))); | 2658 audio_id, base::TimeDelta::FromMilliseconds(27300))); |
| 2626 ASSERT_TRUE(demuxer_->SetTimestampOffset( | 2659 ASSERT_TRUE(SetTimestampOffset( |
| 2627 video_id, base::TimeDelta::FromMilliseconds(27300))); | 2660 video_id, base::TimeDelta::FromMilliseconds(27300))); |
| 2628 AppendCluster(audio_id, GenerateSingleStreamCluster( | 2661 AppendCluster(audio_id, GenerateSingleStreamCluster( |
| 2629 0, kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); | 2662 0, kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); |
| 2630 AppendCluster(video_id, GenerateSingleStreamCluster( | 2663 AppendCluster(video_id, GenerateSingleStreamCluster( |
| 2631 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); | 2664 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); |
| 2632 GenerateVideoStreamExpectedReads(27300, 4); | 2665 GenerateVideoStreamExpectedReads(27300, 4); |
| 2633 GenerateAudioStreamExpectedReads(27300, 4); | 2666 GenerateAudioStreamExpectedReads(27300, 4); |
| 2634 } | 2667 } |
| 2635 | 2668 |
| 2636 TEST_F(ChunkDemuxerTest, TimestampOffsetMidMediaSegment) { | 2669 TEST_F(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) { |
| 2637 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 2670 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 2638 | 2671 |
| 2639 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2); | 2672 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2); |
| 2640 // Append only part of the cluster data. | 2673 // Append only part of the cluster data. |
| 2641 AppendData(cluster->data(), cluster->size() - 13); | 2674 AppendData(cluster->data(), cluster->size() - 13); |
| 2642 | 2675 |
| 2643 // Setting a timestamp should fail because we're in the middle of a cluster. | 2676 // Confirm we're in the middle of parsing a media segment. |
| 2644 ASSERT_FALSE(demuxer_->SetTimestampOffset( | 2677 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId)); |
| 2645 kSourceId, base::TimeDelta::FromSeconds(25))); | |
| 2646 | 2678 |
| 2647 demuxer_->Abort(kSourceId); | 2679 demuxer_->Abort(kSourceId); |
| 2648 // After Abort(), setting a timestamp should succeed since we're no longer | 2680 // After Abort(), parsing should no longer be in the middle of a media |
| 2649 // in the middle of a cluster | 2681 // segment. |
| 2650 ASSERT_TRUE(demuxer_->SetTimestampOffset( | 2682 ASSERT_FALSE(demuxer_->IsParsingMediaSegment(kSourceId)); |
| 2651 kSourceId, base::TimeDelta::FromSeconds(25))); | |
| 2652 } | 2683 } |
| 2653 | 2684 |
| 2654 TEST_F(ChunkDemuxerTest, WebMParsingMediaSegmentDetection) { | 2685 TEST_F(ChunkDemuxerTest, WebMIsParsingMediaSegmentDetection) { |
| 2655 // TODO(wolenetz): Also test 'unknown' sized clusters. | 2686 // TODO(wolenetz): Also test 'unknown' sized clusters. |
| 2656 // See http://crbug.com/335676. | 2687 // See http://crbug.com/335676. |
| 2657 const uint8 kBuffer[] = { | 2688 const uint8 kBuffer[] = { |
| 2658 0x1F, 0x43, 0xB6, 0x75, 0x83, // CLUSTER (size = 3) | 2689 0x1F, 0x43, 0xB6, 0x75, 0x83, // CLUSTER (size = 3) |
| 2659 0xE7, 0x81, 0x01, // Cluster TIMECODE (value = 1) | 2690 0xE7, 0x81, 0x01, // Cluster TIMECODE (value = 1) |
| 2660 }; | 2691 }; |
| 2661 | 2692 |
| 2662 // Setting timestamp offset or append mode is allowed only while not | 2693 // This array indicates expected return value of IsParsingMediaSegment() |
| 2663 // parsing a media segment. This array indicates whether or not these | 2694 // following each incrementally appended byte in |kBuffer|. |
| 2664 // operations are allowed following each incrementally appended byte in | |
| 2665 // |kBuffer|. | |
| 2666 const bool kExpectedReturnValues[] = { | 2695 const bool kExpectedReturnValues[] = { |
| 2667 true, true, true, true, false, | 2696 false, false, false, false, true, |
| 2668 false, false, true, | 2697 true, true, false, |
| 2669 }; | 2698 }; |
| 2670 | 2699 |
| 2671 COMPILE_ASSERT(arraysize(kBuffer) == arraysize(kExpectedReturnValues), | 2700 COMPILE_ASSERT(arraysize(kBuffer) == arraysize(kExpectedReturnValues), |
| 2672 test_arrays_out_of_sync); | 2701 test_arrays_out_of_sync); |
| 2673 COMPILE_ASSERT(arraysize(kBuffer) == sizeof(kBuffer), not_one_byte_per_index); | 2702 COMPILE_ASSERT(arraysize(kBuffer) == sizeof(kBuffer), not_one_byte_per_index); |
| 2674 | 2703 |
| 2675 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 2704 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 2676 | 2705 |
| 2677 for (size_t i = 0; i < sizeof(kBuffer); i++) { | 2706 for (size_t i = 0; i < sizeof(kBuffer); i++) { |
| 2678 DVLOG(3) << "Appending and testing index " << i; | 2707 DVLOG(3) << "Appending and testing index " << i; |
| 2679 AppendData(kBuffer + i, 1); | 2708 AppendData(kBuffer + i, 1); |
| 2680 bool expected_return_value = kExpectedReturnValues[i]; | 2709 bool expected_return_value = kExpectedReturnValues[i]; |
| 2681 EXPECT_EQ(expected_return_value, demuxer_->SetTimestampOffset( | 2710 EXPECT_EQ(expected_return_value, |
| 2682 kSourceId, base::TimeDelta::FromSeconds(25))); | 2711 demuxer_->IsParsingMediaSegment(kSourceId)); |
| 2683 EXPECT_EQ(expected_return_value, demuxer_->SetSequenceMode( | |
| 2684 kSourceId, true)); | |
| 2685 EXPECT_EQ(expected_return_value, demuxer_->SetSequenceMode( | |
| 2686 kSourceId, false)); | |
| 2687 } | 2712 } |
| 2688 } | 2713 } |
| 2689 | 2714 |
| 2690 TEST_F(ChunkDemuxerTest, SetSequenceModeMidMediaSegment) { | |
| 2691 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | |
| 2692 | |
| 2693 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2); | |
| 2694 // Append only part of the cluster data. | |
| 2695 AppendData(cluster->data(), cluster->size() - 13); | |
| 2696 | |
| 2697 // Setting append mode should fail because we're in the middle of a cluster. | |
| 2698 ASSERT_FALSE(demuxer_->SetSequenceMode(kSourceId, true)); | |
| 2699 ASSERT_FALSE(demuxer_->SetSequenceMode(kSourceId, false)); | |
| 2700 | |
| 2701 demuxer_->Abort(kSourceId); | |
| 2702 // After Abort(), setting append mode should succeed since we're no longer | |
| 2703 // in the middle of a cluster. | |
| 2704 ASSERT_TRUE(demuxer_->SetSequenceMode(kSourceId, true)); | |
| 2705 ASSERT_TRUE(demuxer_->SetSequenceMode(kSourceId, false)); | |
| 2706 } | |
| 2707 | |
| 2708 TEST_F(ChunkDemuxerTest, DurationChange) { | 2715 TEST_F(ChunkDemuxerTest, DurationChange) { |
| 2709 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 2716 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 2710 const int kStreamDuration = kDefaultDuration().InMilliseconds(); | 2717 const int kStreamDuration = kDefaultDuration().InMilliseconds(); |
| 2711 | 2718 |
| 2712 // Add data leading up to the currently set duration. | 2719 // Add data leading up to the currently set duration. |
| 2713 AppendCluster(GenerateCluster(kStreamDuration - kAudioBlockDuration, | 2720 AppendCluster(GenerateCluster(kStreamDuration - kAudioBlockDuration, |
| 2714 kStreamDuration - kVideoBlockDuration, | 2721 kStreamDuration - kVideoBlockDuration, |
| 2715 2)); | 2722 2)); |
| 2716 | 2723 |
| 2717 CheckExpectedRanges(kSourceId, "{ [201191,201224) }"); | 2724 CheckExpectedRanges(kSourceId, "{ [201191,201224) }"); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 2730 kStreamDuration + kVideoBlockDuration, | 2737 kStreamDuration + kVideoBlockDuration, |
| 2731 2)); | 2738 2)); |
| 2732 | 2739 |
| 2733 // See that the range has increased appropriately. | 2740 // See that the range has increased appropriately. |
| 2734 CheckExpectedRanges(kSourceId, "{ [201191,201270) }"); | 2741 CheckExpectedRanges(kSourceId, "{ [201191,201270) }"); |
| 2735 } | 2742 } |
| 2736 | 2743 |
| 2737 TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) { | 2744 TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) { |
| 2738 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 2745 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 2739 | 2746 |
| 2740 ASSERT_TRUE(demuxer_->SetTimestampOffset(kSourceId, kDefaultDuration())); | 2747 ASSERT_TRUE(SetTimestampOffset(kSourceId, kDefaultDuration())); |
| 2741 | 2748 |
| 2742 EXPECT_CALL(host_, SetDuration( | 2749 EXPECT_CALL(host_, SetDuration( |
| 2743 kDefaultDuration() + base::TimeDelta::FromMilliseconds( | 2750 kDefaultDuration() + base::TimeDelta::FromMilliseconds( |
| 2744 kAudioBlockDuration * 2))); | 2751 kAudioBlockDuration * 2))); |
| 2745 AppendCluster(GenerateCluster(0, 4)); | 2752 AppendCluster(GenerateCluster(0, 4)); |
| 2746 } | 2753 } |
| 2747 | 2754 |
| 2748 TEST_F(ChunkDemuxerTest, EndOfStreamTruncateDuration) { | 2755 TEST_F(ChunkDemuxerTest, EndOfStreamTruncateDuration) { |
| 2749 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 2756 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 2750 | 2757 |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2937 | 2944 |
| 2938 demuxer_->Remove(kSourceId, base::TimeDelta::FromMilliseconds(0), | 2945 demuxer_->Remove(kSourceId, base::TimeDelta::FromMilliseconds(0), |
| 2939 base::TimeDelta::FromMilliseconds(1)); | 2946 base::TimeDelta::FromMilliseconds(1)); |
| 2940 } | 2947 } |
| 2941 | 2948 |
| 2942 TEST_F(ChunkDemuxerTest, AppendWindow_Video) { | 2949 TEST_F(ChunkDemuxerTest, AppendWindow_Video) { |
| 2943 ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); | 2950 ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); |
| 2944 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 2951 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 2945 | 2952 |
| 2946 // Set the append window to [20,280). | 2953 // Set the append window to [20,280). |
| 2947 demuxer_->SetAppendWindowStart(kSourceId, | 2954 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20); |
| 2948 base::TimeDelta::FromMilliseconds(20)); | 2955 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280); |
| 2949 demuxer_->SetAppendWindowEnd(kSourceId, | |
| 2950 base::TimeDelta::FromMilliseconds(280)); | |
| 2951 | 2956 |
| 2952 // Append a cluster that starts before and ends after the append window. | 2957 // Append a cluster that starts before and ends after the append window. |
| 2953 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, | 2958 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, |
| 2954 "0K 30 60 90 120K 150 180 210 240K 270 300 330K"); | 2959 "0K 30 60 90 120K 150 180 210 240K 270 300 330K"); |
| 2955 | 2960 |
| 2956 // Verify that GOPs that start outside the window are not included | 2961 // Verify that GOPs that start outside the window are not included |
| 2957 // in the buffer. Also verify that buffers that start inside the | 2962 // in the buffer. Also verify that buffers that start inside the |
| 2958 // window and extend beyond the end of the window are included. | 2963 // window and extend beyond the end of the window are included. |
| 2959 CheckExpectedRanges(kSourceId, "{ [120,300) }"); | 2964 CheckExpectedRanges(kSourceId, "{ [120,300) }"); |
| 2960 CheckExpectedBuffers(stream, "120 150 180 210 240 270"); | 2965 CheckExpectedBuffers(stream, "120 150 180 210 240 270"); |
| 2961 | 2966 |
| 2962 // Extend the append window to [20,650). | 2967 // Extend the append window to [20,650). |
| 2963 demuxer_->SetAppendWindowEnd(kSourceId, | 2968 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650); |
| 2964 base::TimeDelta::FromMilliseconds(650)); | |
| 2965 | 2969 |
| 2966 // Append more data and verify that adding buffers start at the next | 2970 // Append more data and verify that adding buffers start at the next |
| 2967 // keyframe. | 2971 // keyframe. |
| 2968 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, | 2972 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, |
| 2969 "360 390 420K 450 480 510 540K 570 600 630K"); | 2973 "360 390 420K 450 480 510 540K 570 600 630K"); |
| 2970 CheckExpectedRanges(kSourceId, "{ [120,300) [420,660) }"); | 2974 CheckExpectedRanges(kSourceId, "{ [120,300) [420,660) }"); |
| 2971 } | 2975 } |
| 2972 | 2976 |
| 2973 TEST_F(ChunkDemuxerTest, AppendWindow_Audio) { | 2977 TEST_F(ChunkDemuxerTest, AppendWindow_Audio) { |
| 2974 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); | 2978 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); |
| 2975 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); | 2979 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 2976 | 2980 |
| 2977 // Set the append window to [20,280). | 2981 // Set the append window to [20,280). |
| 2978 demuxer_->SetAppendWindowStart(kSourceId, | 2982 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20); |
| 2979 base::TimeDelta::FromMilliseconds(20)); | 2983 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280); |
| 2980 demuxer_->SetAppendWindowEnd(kSourceId, | |
| 2981 base::TimeDelta::FromMilliseconds(280)); | |
| 2982 | 2984 |
| 2983 // Append a cluster that starts before and ends after the append window. | 2985 // Append a cluster that starts before and ends after the append window. |
| 2984 AppendSingleStreamCluster( | 2986 AppendSingleStreamCluster( |
| 2985 kSourceId, kAudioTrackNum, | 2987 kSourceId, kAudioTrackNum, |
| 2986 "0K 30K 60K 90K 120K 150K 180K 210K 240K 270K 300K 330K"); | 2988 "0K 30K 60K 90K 120K 150K 180K 210K 240K 270K 300K 330K"); |
| 2987 | 2989 |
| 2988 // Verify that frames that start outside the window are not included | 2990 // Verify that frames that start outside the window are not included |
| 2989 // in the buffer. Also verify that buffers that start inside the | 2991 // in the buffer. Also verify that buffers that start inside the |
| 2990 // window and extend beyond the end of the window are included. | 2992 // window and extend beyond the end of the window are included. |
| 2991 CheckExpectedRanges(kSourceId, "{ [30,300) }"); | 2993 CheckExpectedRanges(kSourceId, "{ [30,300) }"); |
| 2992 CheckExpectedBuffers(stream, "30 60 90 120 150 180 210 240 270"); | 2994 CheckExpectedBuffers(stream, "30 60 90 120 150 180 210 240 270"); |
| 2993 | 2995 |
| 2994 // Extend the append window to [20,650). | 2996 // Extend the append window to [20,650). |
| 2995 demuxer_->SetAppendWindowEnd(kSourceId, | 2997 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650); |
| 2996 base::TimeDelta::FromMilliseconds(650)); | |
| 2997 | 2998 |
| 2998 // Append more data and verify that a new range is created. | 2999 // Append more data and verify that a new range is created. |
| 2999 AppendSingleStreamCluster( | 3000 AppendSingleStreamCluster( |
| 3000 kSourceId, kAudioTrackNum, | 3001 kSourceId, kAudioTrackNum, |
| 3001 "360K 390K 420K 450K 480K 510K 540K 570K 600K 630K"); | 3002 "360K 390K 420K 450K 480K 510K 540K 570K 600K 630K"); |
| 3002 CheckExpectedRanges(kSourceId, "{ [30,300) [360,660) }"); | 3003 CheckExpectedRanges(kSourceId, "{ [30,300) [360,660) }"); |
| 3003 } | 3004 } |
| 3004 | 3005 |
| 3005 TEST_F(ChunkDemuxerTest, AppendWindow_Text) { | 3006 TEST_F(ChunkDemuxerTest, AppendWindow_Text) { |
| 3006 DemuxerStream* text_stream = NULL; | 3007 DemuxerStream* text_stream = NULL; |
| 3007 EXPECT_CALL(host_, AddTextStream(_, _)) | 3008 EXPECT_CALL(host_, AddTextStream(_, _)) |
| 3008 .WillOnce(SaveArg<0>(&text_stream)); | 3009 .WillOnce(SaveArg<0>(&text_stream)); |
| 3009 ASSERT_TRUE(InitDemuxer(HAS_VIDEO | HAS_TEXT)); | 3010 ASSERT_TRUE(InitDemuxer(HAS_VIDEO | HAS_TEXT)); |
| 3010 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 3011 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 3011 | 3012 |
| 3012 // Set the append window to [20,280). | 3013 // Set the append window to [20,280). |
| 3013 demuxer_->SetAppendWindowStart(kSourceId, | 3014 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20); |
| 3014 base::TimeDelta::FromMilliseconds(20)); | 3015 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280); |
| 3015 demuxer_->SetAppendWindowEnd(kSourceId, | |
| 3016 base::TimeDelta::FromMilliseconds(280)); | |
| 3017 | 3016 |
| 3018 // Append a cluster that starts before and ends after the append | 3017 // Append a cluster that starts before and ends after the append |
| 3019 // window. | 3018 // window. |
| 3020 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, | 3019 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, |
| 3021 "0K 30 60 90 120K 150 180 210 240K 270 300 330K"); | 3020 "0K 30 60 90 120K 150 180 210 240K 270 300 330K"); |
| 3022 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "0K 100K 200K 300K"); | 3021 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "0K 100K 200K 300K"); |
| 3023 | 3022 |
| 3024 // Verify that text cues that start outside the window are not included | 3023 // Verify that text cues that start outside the window are not included |
| 3025 // in the buffer. Also verify that cues that extend beyond the | 3024 // in the buffer. Also verify that cues that extend beyond the |
| 3026 // window are included. | 3025 // window are included. |
| 3027 CheckExpectedRanges(kSourceId, "{ [120,300) }"); | 3026 CheckExpectedRanges(kSourceId, "{ [120,300) }"); |
| 3028 CheckExpectedBuffers(video_stream, "120 150 180 210 240 270"); | 3027 CheckExpectedBuffers(video_stream, "120 150 180 210 240 270"); |
| 3029 CheckExpectedBuffers(text_stream, "100 200"); | 3028 CheckExpectedBuffers(text_stream, "100 200"); |
| 3030 | 3029 |
| 3031 // Extend the append window to [20,650). | 3030 // Extend the append window to [20,650). |
| 3032 demuxer_->SetAppendWindowEnd(kSourceId, | 3031 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650); |
| 3033 base::TimeDelta::FromMilliseconds(650)); | |
| 3034 | 3032 |
| 3035 // Append more data and verify that a new range is created. | 3033 // Append more data and verify that a new range is created. |
| 3036 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, | 3034 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, |
| 3037 "360 390 420K 450 480 510 540K 570 600 630K"); | 3035 "360 390 420K 450 480 510 540K 570 600 630K"); |
| 3038 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "400K 500K 600K 700K"); | 3036 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "400K 500K 600K 700K"); |
| 3039 CheckExpectedRanges(kSourceId, "{ [120,300) [420,660) }"); | 3037 CheckExpectedRanges(kSourceId, "{ [120,300) [420,660) }"); |
| 3040 | 3038 |
| 3041 // Seek to the new range and verify that the expected buffers are returned. | 3039 // Seek to the new range and verify that the expected buffers are returned. |
| 3042 Seek(base::TimeDelta::FromMilliseconds(420)); | 3040 Seek(base::TimeDelta::FromMilliseconds(420)); |
| 3043 CheckExpectedBuffers(video_stream, "420 450 480 510 540 570 600 630"); | 3041 CheckExpectedBuffers(video_stream, "420 450 480 510 540 570 600 630"); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3144 // NOTE: we start at 175 here because the buffer at 125 was returned | 3142 // NOTE: we start at 175 here because the buffer at 125 was returned |
| 3145 // to the pending read initiated above. | 3143 // to the pending read initiated above. |
| 3146 CheckExpectedBuffers(text_stream, "175 225"); | 3144 CheckExpectedBuffers(text_stream, "175 225"); |
| 3147 | 3145 |
| 3148 // Verify that audio & video streams contiue to return expected values. | 3146 // Verify that audio & video streams contiue to return expected values. |
| 3149 CheckExpectedBuffers(audio_stream, "160 180"); | 3147 CheckExpectedBuffers(audio_stream, "160 180"); |
| 3150 CheckExpectedBuffers(video_stream, "180 210"); | 3148 CheckExpectedBuffers(video_stream, "180 210"); |
| 3151 } | 3149 } |
| 3152 | 3150 |
| 3153 } // namespace media | 3151 } // namespace media |
| OLD | NEW |