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