| 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 "media/filters/chunk_demuxer.h" | 5 #include "media/filters/chunk_demuxer.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 984 EXPECT_TRUE(AppendData(bear1->data() + 72737, 28183)); | 984 EXPECT_TRUE(AppendData(bear1->data() + 72737, 28183)); |
| 985 CheckExpectedRanges("{ [0,2736) }"); | 985 CheckExpectedRanges("{ [0,2736) }"); |
| 986 | 986 |
| 987 MarkEndOfStream(PIPELINE_OK); | 987 MarkEndOfStream(PIPELINE_OK); |
| 988 return true; | 988 return true; |
| 989 } | 989 } |
| 990 | 990 |
| 991 void ShutdownDemuxer() { | 991 void ShutdownDemuxer() { |
| 992 if (demuxer_) { | 992 if (demuxer_) { |
| 993 demuxer_->Shutdown(); | 993 demuxer_->Shutdown(); |
| 994 message_loop_.RunUntilIdle(); | 994 base::RunLoop().RunUntilIdle(); |
| 995 } | 995 } |
| 996 } | 996 } |
| 997 | 997 |
| 998 void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64_t timecode) { | 998 void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64_t timecode) { |
| 999 uint8_t data[] = {0x00}; | 999 uint8_t data[] = {0x00}; |
| 1000 cb->AddSimpleBlock(track_num, timecode, 0, data, sizeof(data)); | 1000 cb->AddSimpleBlock(track_num, timecode, 0, data, sizeof(data)); |
| 1001 } | 1001 } |
| 1002 | 1002 |
| 1003 std::unique_ptr<Cluster> GenerateCluster(int timecode, int block_count) { | 1003 std::unique_ptr<Cluster> GenerateCluster(int timecode, int block_count) { |
| 1004 return GenerateCluster(timecode, timecode, block_count); | 1004 return GenerateCluster(timecode, timecode, block_count); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1102 cb.AddBlockGroup(track_number, timecode, block_duration, | 1102 cb.AddBlockGroup(track_number, timecode, block_duration, |
| 1103 kWebMFlagKeyframe, static_cast<bool>(kWebMFlagKeyframe), | 1103 kWebMFlagKeyframe, static_cast<bool>(kWebMFlagKeyframe), |
| 1104 &data[0], data.size()); | 1104 &data[0], data.size()); |
| 1105 } | 1105 } |
| 1106 | 1106 |
| 1107 return cb.Finish(); | 1107 return cb.Finish(); |
| 1108 } | 1108 } |
| 1109 | 1109 |
| 1110 void Read(DemuxerStream::Type type, const DemuxerStream::ReadCB& read_cb) { | 1110 void Read(DemuxerStream::Type type, const DemuxerStream::ReadCB& read_cb) { |
| 1111 demuxer_->GetStream(type)->Read(read_cb); | 1111 demuxer_->GetStream(type)->Read(read_cb); |
| 1112 message_loop_.RunUntilIdle(); | 1112 base::RunLoop().RunUntilIdle(); |
| 1113 } | 1113 } |
| 1114 | 1114 |
| 1115 void ReadAudio(const DemuxerStream::ReadCB& read_cb) { | 1115 void ReadAudio(const DemuxerStream::ReadCB& read_cb) { |
| 1116 Read(DemuxerStream::AUDIO, read_cb); | 1116 Read(DemuxerStream::AUDIO, read_cb); |
| 1117 } | 1117 } |
| 1118 | 1118 |
| 1119 void ReadVideo(const DemuxerStream::ReadCB& read_cb) { | 1119 void ReadVideo(const DemuxerStream::ReadCB& read_cb) { |
| 1120 Read(DemuxerStream::VIDEO, read_cb); | 1120 Read(DemuxerStream::VIDEO, read_cb); |
| 1121 } | 1121 } |
| 1122 | 1122 |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1235 base::RunLoop().RunUntilIdle(); | 1235 base::RunLoop().RunUntilIdle(); |
| 1236 if (*status == DemuxerStream::kOk && !buffer->end_of_stream()) | 1236 if (*status == DemuxerStream::kOk && !buffer->end_of_stream()) |
| 1237 *last_timestamp = buffer->timestamp(); | 1237 *last_timestamp = buffer->timestamp(); |
| 1238 } while (*status == DemuxerStream::kOk && !buffer->end_of_stream()); | 1238 } while (*status == DemuxerStream::kOk && !buffer->end_of_stream()); |
| 1239 } | 1239 } |
| 1240 | 1240 |
| 1241 void ExpectEndOfStream(DemuxerStream::Type type) { | 1241 void ExpectEndOfStream(DemuxerStream::Type type) { |
| 1242 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream())); | 1242 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream())); |
| 1243 demuxer_->GetStream(type)->Read(base::Bind( | 1243 demuxer_->GetStream(type)->Read(base::Bind( |
| 1244 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); | 1244 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); |
| 1245 message_loop_.RunUntilIdle(); | 1245 base::RunLoop().RunUntilIdle(); |
| 1246 } | 1246 } |
| 1247 | 1247 |
| 1248 void ExpectRead(DemuxerStream::Type type, int64_t timestamp_in_ms) { | 1248 void ExpectRead(DemuxerStream::Type type, int64_t timestamp_in_ms) { |
| 1249 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, | 1249 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, |
| 1250 HasTimestamp(timestamp_in_ms))); | 1250 HasTimestamp(timestamp_in_ms))); |
| 1251 demuxer_->GetStream(type)->Read(base::Bind( | 1251 demuxer_->GetStream(type)->Read(base::Bind( |
| 1252 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); | 1252 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); |
| 1253 message_loop_.RunUntilIdle(); | 1253 base::RunLoop().RunUntilIdle(); |
| 1254 } | 1254 } |
| 1255 | 1255 |
| 1256 void ExpectConfigChanged(DemuxerStream::Type type) { | 1256 void ExpectConfigChanged(DemuxerStream::Type type) { |
| 1257 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _)); | 1257 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _)); |
| 1258 demuxer_->GetStream(type)->Read(base::Bind( | 1258 demuxer_->GetStream(type)->Read(base::Bind( |
| 1259 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); | 1259 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); |
| 1260 message_loop_.RunUntilIdle(); | 1260 base::RunLoop().RunUntilIdle(); |
| 1261 } | 1261 } |
| 1262 | 1262 |
| 1263 void CheckExpectedBuffers(DemuxerStream* stream, | 1263 void CheckExpectedBuffers(DemuxerStream* stream, |
| 1264 const std::string& expected) { | 1264 const std::string& expected) { |
| 1265 std::vector<std::string> timestamps = base::SplitString( | 1265 std::vector<std::string> timestamps = base::SplitString( |
| 1266 expected, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); | 1266 expected, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); |
| 1267 std::stringstream ss; | 1267 std::stringstream ss; |
| 1268 for (size_t i = 0; i < timestamps.size(); ++i) { | 1268 for (size_t i = 0; i < timestamps.size(); ++i) { |
| 1269 // Initialize status to kAborted since it's possible for Read() to return | 1269 // Initialize status to kAborted since it's possible for Read() to return |
| 1270 // without calling StoreStatusAndBuffer() if it doesn't have any buffers | 1270 // without calling StoreStatusAndBuffer() if it doesn't have any buffers |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1362 MOCK_METHOD0(DemuxerOpened, void()); | 1362 MOCK_METHOD0(DemuxerOpened, void()); |
| 1363 MOCK_METHOD2(OnEncryptedMediaInitData, | 1363 MOCK_METHOD2(OnEncryptedMediaInitData, |
| 1364 void(EmeInitDataType init_data_type, | 1364 void(EmeInitDataType init_data_type, |
| 1365 const std::vector<uint8_t>& init_data)); | 1365 const std::vector<uint8_t>& init_data)); |
| 1366 | 1366 |
| 1367 MOCK_METHOD1(InitSegmentReceivedMock, void(std::unique_ptr<MediaTracks>&)); | 1367 MOCK_METHOD1(InitSegmentReceivedMock, void(std::unique_ptr<MediaTracks>&)); |
| 1368 | 1368 |
| 1369 void Seek(base::TimeDelta seek_time) { | 1369 void Seek(base::TimeDelta seek_time) { |
| 1370 demuxer_->StartWaitingForSeek(seek_time); | 1370 demuxer_->StartWaitingForSeek(seek_time); |
| 1371 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); | 1371 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); |
| 1372 message_loop_.RunUntilIdle(); | 1372 base::RunLoop().RunUntilIdle(); |
| 1373 } | 1373 } |
| 1374 | 1374 |
| 1375 void MarkEndOfStream(PipelineStatus status) { | 1375 void MarkEndOfStream(PipelineStatus status) { |
| 1376 demuxer_->MarkEndOfStream(status); | 1376 demuxer_->MarkEndOfStream(status); |
| 1377 message_loop_.RunUntilIdle(); | 1377 base::RunLoop().RunUntilIdle(); |
| 1378 } | 1378 } |
| 1379 | 1379 |
| 1380 bool SetTimestampOffset(const std::string& id, | 1380 bool SetTimestampOffset(const std::string& id, |
| 1381 base::TimeDelta timestamp_offset) { | 1381 base::TimeDelta timestamp_offset) { |
| 1382 if (demuxer_->IsParsingMediaSegment(id)) | 1382 if (demuxer_->IsParsingMediaSegment(id)) |
| 1383 return false; | 1383 return false; |
| 1384 | 1384 |
| 1385 timestamp_offset_map_[id] = timestamp_offset; | 1385 timestamp_offset_map_[id] = timestamp_offset; |
| 1386 return true; | 1386 return true; |
| 1387 } | 1387 } |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1719 | 1719 |
| 1720 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); | 1720 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 1721 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 1721 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 1722 | 1722 |
| 1723 bool audio_read_done = false; | 1723 bool audio_read_done = false; |
| 1724 bool video_read_done = false; | 1724 bool video_read_done = false; |
| 1725 bool text_read_done = false; | 1725 bool text_read_done = false; |
| 1726 audio_stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); | 1726 audio_stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); |
| 1727 video_stream->Read(base::Bind(&OnReadDone_EOSExpected, &video_read_done)); | 1727 video_stream->Read(base::Bind(&OnReadDone_EOSExpected, &video_read_done)); |
| 1728 text_stream->Read(base::Bind(&OnReadDone_EOSExpected, &text_read_done)); | 1728 text_stream->Read(base::Bind(&OnReadDone_EOSExpected, &text_read_done)); |
| 1729 message_loop_.RunUntilIdle(); | 1729 base::RunLoop().RunUntilIdle(); |
| 1730 | 1730 |
| 1731 EXPECT_FALSE(audio_read_done); | 1731 EXPECT_FALSE(audio_read_done); |
| 1732 EXPECT_FALSE(video_read_done); | 1732 EXPECT_FALSE(video_read_done); |
| 1733 EXPECT_FALSE(text_read_done); | 1733 EXPECT_FALSE(text_read_done); |
| 1734 | 1734 |
| 1735 ShutdownDemuxer(); | 1735 ShutdownDemuxer(); |
| 1736 | 1736 |
| 1737 EXPECT_TRUE(audio_read_done); | 1737 EXPECT_TRUE(audio_read_done); |
| 1738 EXPECT_TRUE(video_read_done); | 1738 EXPECT_TRUE(video_read_done); |
| 1739 EXPECT_TRUE(text_read_done); | 1739 EXPECT_TRUE(text_read_done); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1750 EXPECT_CALL(*this, Checkpoint(1)); | 1750 EXPECT_CALL(*this, Checkpoint(1)); |
| 1751 | 1751 |
| 1752 Seek(base::TimeDelta::FromMilliseconds(46)); | 1752 Seek(base::TimeDelta::FromMilliseconds(46)); |
| 1753 | 1753 |
| 1754 EXPECT_CALL(*this, Checkpoint(2)); | 1754 EXPECT_CALL(*this, Checkpoint(2)); |
| 1755 | 1755 |
| 1756 Checkpoint(1); | 1756 Checkpoint(1); |
| 1757 | 1757 |
| 1758 ASSERT_TRUE(AppendCluster(kDefaultSecondCluster())); | 1758 ASSERT_TRUE(AppendCluster(kDefaultSecondCluster())); |
| 1759 | 1759 |
| 1760 message_loop_.RunUntilIdle(); | 1760 base::RunLoop().RunUntilIdle(); |
| 1761 | 1761 |
| 1762 Checkpoint(2); | 1762 Checkpoint(2); |
| 1763 } | 1763 } |
| 1764 | 1764 |
| 1765 // Test that parsing errors are handled for clusters appended after init. | 1765 // Test that parsing errors are handled for clusters appended after init. |
| 1766 TEST_F(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) { | 1766 TEST_F(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) { |
| 1767 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 1767 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 1768 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster())); | 1768 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster())); |
| 1769 | 1769 |
| 1770 EXPECT_MEDIA_LOG(StreamParsingFailed()); | 1770 EXPECT_MEDIA_LOG(StreamParsingFailed()); |
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2058 bool video_read_done_1 = false; | 2058 bool video_read_done_1 = false; |
| 2059 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); | 2059 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); |
| 2060 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); | 2060 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); |
| 2061 | 2061 |
| 2062 ReadAudio(base::Bind(&OnReadDone, | 2062 ReadAudio(base::Bind(&OnReadDone, |
| 2063 base::TimeDelta::FromMilliseconds(0), | 2063 base::TimeDelta::FromMilliseconds(0), |
| 2064 &audio_read_done_1)); | 2064 &audio_read_done_1)); |
| 2065 ReadVideo(base::Bind(&OnReadDone, | 2065 ReadVideo(base::Bind(&OnReadDone, |
| 2066 base::TimeDelta::FromMilliseconds(0), | 2066 base::TimeDelta::FromMilliseconds(0), |
| 2067 &video_read_done_1)); | 2067 &video_read_done_1)); |
| 2068 message_loop_.RunUntilIdle(); | 2068 base::RunLoop().RunUntilIdle(); |
| 2069 | 2069 |
| 2070 EXPECT_TRUE(audio_read_done_1); | 2070 EXPECT_TRUE(audio_read_done_1); |
| 2071 EXPECT_TRUE(video_read_done_1); | 2071 EXPECT_TRUE(video_read_done_1); |
| 2072 | 2072 |
| 2073 end_of_stream_helper_1.RequestReads(); | 2073 end_of_stream_helper_1.RequestReads(); |
| 2074 | 2074 |
| 2075 EXPECT_CALL(host_, SetDuration( | 2075 EXPECT_CALL(host_, SetDuration( |
| 2076 base::TimeDelta::FromMilliseconds(kVideoBlockDuration))); | 2076 base::TimeDelta::FromMilliseconds(kVideoBlockDuration))); |
| 2077 MarkEndOfStream(PIPELINE_OK); | 2077 MarkEndOfStream(PIPELINE_OK); |
| 2078 | 2078 |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2351 &video_read_done)); | 2351 &video_read_done)); |
| 2352 | 2352 |
| 2353 // Make sure the reads haven't completed yet. | 2353 // Make sure the reads haven't completed yet. |
| 2354 EXPECT_FALSE(audio_read_done); | 2354 EXPECT_FALSE(audio_read_done); |
| 2355 EXPECT_FALSE(video_read_done); | 2355 EXPECT_FALSE(video_read_done); |
| 2356 | 2356 |
| 2357 // Append data one byte at a time until one or both reads complete. | 2357 // Append data one byte at a time until one or both reads complete. |
| 2358 int i = 0; | 2358 int i = 0; |
| 2359 for (; i < cluster->size() && !(audio_read_done || video_read_done); ++i) { | 2359 for (; i < cluster->size() && !(audio_read_done || video_read_done); ++i) { |
| 2360 ASSERT_TRUE(AppendData(cluster->data() + i, 1)); | 2360 ASSERT_TRUE(AppendData(cluster->data() + i, 1)); |
| 2361 message_loop_.RunUntilIdle(); | 2361 base::RunLoop().RunUntilIdle(); |
| 2362 } | 2362 } |
| 2363 | 2363 |
| 2364 EXPECT_TRUE(audio_read_done || video_read_done); | 2364 EXPECT_TRUE(audio_read_done || video_read_done); |
| 2365 EXPECT_GT(i, 0); | 2365 EXPECT_GT(i, 0); |
| 2366 EXPECT_LT(i, cluster->size()); | 2366 EXPECT_LT(i, cluster->size()); |
| 2367 | 2367 |
| 2368 audio_read_done = false; | 2368 audio_read_done = false; |
| 2369 video_read_done = false; | 2369 video_read_done = false; |
| 2370 ReadAudio(base::Bind(&OnReadDone, | 2370 ReadAudio(base::Bind(&OnReadDone, |
| 2371 base::TimeDelta::FromMilliseconds(23), | 2371 base::TimeDelta::FromMilliseconds(23), |
| 2372 &audio_read_done)); | 2372 &audio_read_done)); |
| 2373 ReadVideo(base::Bind(&OnReadDone, | 2373 ReadVideo(base::Bind(&OnReadDone, |
| 2374 base::TimeDelta::FromMilliseconds(33), | 2374 base::TimeDelta::FromMilliseconds(33), |
| 2375 &video_read_done)); | 2375 &video_read_done)); |
| 2376 | 2376 |
| 2377 // Make sure the reads haven't completed yet. | 2377 // Make sure the reads haven't completed yet. |
| 2378 EXPECT_FALSE(audio_read_done); | 2378 EXPECT_FALSE(audio_read_done); |
| 2379 EXPECT_FALSE(video_read_done); | 2379 EXPECT_FALSE(video_read_done); |
| 2380 | 2380 |
| 2381 // Append the remaining data. | 2381 // Append the remaining data. |
| 2382 ASSERT_LT(i, cluster->size()); | 2382 ASSERT_LT(i, cluster->size()); |
| 2383 ASSERT_TRUE(AppendData(cluster->data() + i, cluster->size() - i)); | 2383 ASSERT_TRUE(AppendData(cluster->data() + i, cluster->size() - i)); |
| 2384 | 2384 |
| 2385 message_loop_.RunUntilIdle(); | 2385 base::RunLoop().RunUntilIdle(); |
| 2386 | 2386 |
| 2387 EXPECT_TRUE(audio_read_done); | 2387 EXPECT_TRUE(audio_read_done); |
| 2388 EXPECT_TRUE(video_read_done); | 2388 EXPECT_TRUE(video_read_done); |
| 2389 } | 2389 } |
| 2390 | 2390 |
| 2391 TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) { | 2391 TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) { |
| 2392 EXPECT_CALL(*this, DemuxerOpened()); | 2392 EXPECT_CALL(*this, DemuxerOpened()); |
| 2393 demuxer_->Initialize( | 2393 demuxer_->Initialize( |
| 2394 &host_, | 2394 &host_, |
| 2395 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED), | 2395 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED), |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2579 | 2579 |
| 2580 // Read() from audio should return normal buffers. | 2580 // Read() from audio should return normal buffers. |
| 2581 GenerateAudioStreamExpectedReads(0, 4); | 2581 GenerateAudioStreamExpectedReads(0, 4); |
| 2582 | 2582 |
| 2583 // Remove the audio id. | 2583 // Remove the audio id. |
| 2584 demuxer_->RemoveId(audio_id); | 2584 demuxer_->RemoveId(audio_id); |
| 2585 | 2585 |
| 2586 // Read() from audio should return "end of stream" buffers. | 2586 // Read() from audio should return "end of stream" buffers. |
| 2587 bool audio_read_done = false; | 2587 bool audio_read_done = false; |
| 2588 ReadAudio(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); | 2588 ReadAudio(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); |
| 2589 message_loop_.RunUntilIdle(); | 2589 base::RunLoop().RunUntilIdle(); |
| 2590 EXPECT_TRUE(audio_read_done); | 2590 EXPECT_TRUE(audio_read_done); |
| 2591 | 2591 |
| 2592 // Read() from video should still return normal buffers. | 2592 // Read() from video should still return normal buffers. |
| 2593 GenerateVideoStreamExpectedReads(0, 4); | 2593 GenerateVideoStreamExpectedReads(0, 4); |
| 2594 } | 2594 } |
| 2595 | 2595 |
| 2596 // Test that removing an ID immediately after adding it does not interfere with | 2596 // Test that removing an ID immediately after adding it does not interfere with |
| 2597 // quota for new IDs in the future. | 2597 // quota for new IDs in the future. |
| 2598 TEST_F(ChunkDemuxerTest, RemoveAndAddId) { | 2598 TEST_F(ChunkDemuxerTest, RemoveAndAddId) { |
| 2599 std::string audio_id_1 = "audio1"; | 2599 std::string audio_id_1 = "audio1"; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2618 bool video_read_done = false; | 2618 bool video_read_done = false; |
| 2619 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); | 2619 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); |
| 2620 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); | 2620 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); |
| 2621 EXPECT_FALSE(audio_read_done); | 2621 EXPECT_FALSE(audio_read_done); |
| 2622 EXPECT_FALSE(video_read_done); | 2622 EXPECT_FALSE(video_read_done); |
| 2623 | 2623 |
| 2624 // Now cancel the pending seek, which should flush the reads with empty | 2624 // Now cancel the pending seek, which should flush the reads with empty |
| 2625 // buffers. | 2625 // buffers. |
| 2626 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0); | 2626 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0); |
| 2627 demuxer_->CancelPendingSeek(seek_time); | 2627 demuxer_->CancelPendingSeek(seek_time); |
| 2628 message_loop_.RunUntilIdle(); | 2628 base::RunLoop().RunUntilIdle(); |
| 2629 EXPECT_TRUE(audio_read_done); | 2629 EXPECT_TRUE(audio_read_done); |
| 2630 EXPECT_TRUE(video_read_done); | 2630 EXPECT_TRUE(video_read_done); |
| 2631 | 2631 |
| 2632 // A seek back to the buffered region should succeed. | 2632 // A seek back to the buffered region should succeed. |
| 2633 Seek(seek_time); | 2633 Seek(seek_time); |
| 2634 GenerateExpectedReads(0, 4); | 2634 GenerateExpectedReads(0, 4); |
| 2635 } | 2635 } |
| 2636 | 2636 |
| 2637 TEST_F(ChunkDemuxerTest, SeekCanceledWhileWaitingForSeek) { | 2637 TEST_F(ChunkDemuxerTest, SeekCanceledWhileWaitingForSeek) { |
| 2638 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 2638 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2702 EXPECT_FALSE(audio_read_done); | 2702 EXPECT_FALSE(audio_read_done); |
| 2703 EXPECT_FALSE(video_read_done); | 2703 EXPECT_FALSE(video_read_done); |
| 2704 | 2704 |
| 2705 ASSERT_TRUE(AppendCluster( | 2705 ASSERT_TRUE(AppendCluster( |
| 2706 audio_id, GenerateSingleStreamCluster(3000, 3092, kAudioTrackNum, | 2706 audio_id, GenerateSingleStreamCluster(3000, 3092, kAudioTrackNum, |
| 2707 kAudioBlockDuration))); | 2707 kAudioBlockDuration))); |
| 2708 ASSERT_TRUE(AppendCluster( | 2708 ASSERT_TRUE(AppendCluster( |
| 2709 video_id, GenerateSingleStreamCluster(3000, 3132, kVideoTrackNum, | 2709 video_id, GenerateSingleStreamCluster(3000, 3132, kVideoTrackNum, |
| 2710 kVideoBlockDuration))); | 2710 kVideoBlockDuration))); |
| 2711 | 2711 |
| 2712 message_loop_.RunUntilIdle(); | 2712 base::RunLoop().RunUntilIdle(); |
| 2713 | 2713 |
| 2714 // Read() should return buffers at 3. | 2714 // Read() should return buffers at 3. |
| 2715 EXPECT_TRUE(audio_read_done); | 2715 EXPECT_TRUE(audio_read_done); |
| 2716 EXPECT_TRUE(video_read_done); | 2716 EXPECT_TRUE(video_read_done); |
| 2717 } | 2717 } |
| 2718 | 2718 |
| 2719 // Test that Seek() completes successfully when EndOfStream | 2719 // Test that Seek() completes successfully when EndOfStream |
| 2720 // is called before data is available for that seek point. | 2720 // is called before data is available for that seek point. |
| 2721 // This scenario might be useful if seeking past the end of stream | 2721 // This scenario might be useful if seeking past the end of stream |
| 2722 // of either audio or video (or both). | 2722 // of either audio or video (or both). |
| 2723 TEST_F(ChunkDemuxerTest, EndOfStreamAfterPastEosSeek) { | 2723 TEST_F(ChunkDemuxerTest, EndOfStreamAfterPastEosSeek) { |
| 2724 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 2724 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 2725 | 2725 |
| 2726 AppendMuxedCluster( | 2726 AppendMuxedCluster( |
| 2727 MuxedStreamInfo(kAudioTrackNum, | 2727 MuxedStreamInfo(kAudioTrackNum, |
| 2728 "0K 10K 20K 30K 40K 50K 60K 70K 80K 90K 100K 110K", 10), | 2728 "0K 10K 20K 30K 40K 50K 60K 70K 80K 90K 100K 110K", 10), |
| 2729 MuxedStreamInfo(kVideoTrackNum, "0K 20K 40K 60K 80K", 20)); | 2729 MuxedStreamInfo(kVideoTrackNum, "0K 20K 40K 60K 80K", 20)); |
| 2730 CheckExpectedRanges("{ [0,100) }"); | 2730 CheckExpectedRanges("{ [0,100) }"); |
| 2731 | 2731 |
| 2732 // Seeking past the end of video. | 2732 // Seeking past the end of video. |
| 2733 // Note: audio data is available for that seek point. | 2733 // Note: audio data is available for that seek point. |
| 2734 bool seek_cb_was_called = false; | 2734 bool seek_cb_was_called = false; |
| 2735 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(110); | 2735 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(110); |
| 2736 demuxer_->StartWaitingForSeek(seek_time); | 2736 demuxer_->StartWaitingForSeek(seek_time); |
| 2737 demuxer_->Seek(seek_time, | 2737 demuxer_->Seek(seek_time, |
| 2738 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); | 2738 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); |
| 2739 message_loop_.RunUntilIdle(); | 2739 base::RunLoop().RunUntilIdle(); |
| 2740 | 2740 |
| 2741 EXPECT_FALSE(seek_cb_was_called); | 2741 EXPECT_FALSE(seek_cb_was_called); |
| 2742 | 2742 |
| 2743 EXPECT_CALL(host_, SetDuration( | 2743 EXPECT_CALL(host_, SetDuration( |
| 2744 base::TimeDelta::FromMilliseconds(120))); | 2744 base::TimeDelta::FromMilliseconds(120))); |
| 2745 MarkEndOfStream(PIPELINE_OK); | 2745 MarkEndOfStream(PIPELINE_OK); |
| 2746 CheckExpectedRanges("{ [0,120) }"); | 2746 CheckExpectedRanges("{ [0,120) }"); |
| 2747 message_loop_.RunUntilIdle(); | 2747 base::RunLoop().RunUntilIdle(); |
| 2748 | 2748 |
| 2749 EXPECT_TRUE(seek_cb_was_called); | 2749 EXPECT_TRUE(seek_cb_was_called); |
| 2750 | 2750 |
| 2751 ShutdownDemuxer(); | 2751 ShutdownDemuxer(); |
| 2752 } | 2752 } |
| 2753 | 2753 |
| 2754 // Test that EndOfStream is ignored if coming during a pending seek | 2754 // Test that EndOfStream is ignored if coming during a pending seek |
| 2755 // whose seek time is before some existing ranges. | 2755 // whose seek time is before some existing ranges. |
| 2756 TEST_F(ChunkDemuxerTest, EndOfStreamDuringPendingSeek) { | 2756 TEST_F(ChunkDemuxerTest, EndOfStreamDuringPendingSeek) { |
| 2757 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 2757 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 2758 | 2758 |
| 2759 AppendMuxedCluster( | 2759 AppendMuxedCluster( |
| 2760 MuxedStreamInfo(kAudioTrackNum, | 2760 MuxedStreamInfo(kAudioTrackNum, |
| 2761 "0K 10K 20K 30K 40K 50K 60K 70K 80K 90K 100K 110K", 10), | 2761 "0K 10K 20K 30K 40K 50K 60K 70K 80K 90K 100K 110K", 10), |
| 2762 MuxedStreamInfo(kVideoTrackNum, "0K 20K 40K 60K 80K", 20)); | 2762 MuxedStreamInfo(kVideoTrackNum, "0K 20K 40K 60K 80K", 20)); |
| 2763 AppendMuxedCluster( | 2763 AppendMuxedCluster( |
| 2764 MuxedStreamInfo(kAudioTrackNum, | 2764 MuxedStreamInfo(kAudioTrackNum, |
| 2765 "200K 210K 220K 230K 240K 250K 260K 270K 280K 290K", 10), | 2765 "200K 210K 220K 230K 240K 250K 260K 270K 280K 290K", 10), |
| 2766 MuxedStreamInfo(kVideoTrackNum, "200K 220K 240K 260K 280K", 20)); | 2766 MuxedStreamInfo(kVideoTrackNum, "200K 220K 240K 260K 280K", 20)); |
| 2767 | 2767 |
| 2768 bool seek_cb_was_called = false; | 2768 bool seek_cb_was_called = false; |
| 2769 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(160); | 2769 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(160); |
| 2770 demuxer_->StartWaitingForSeek(seek_time); | 2770 demuxer_->StartWaitingForSeek(seek_time); |
| 2771 demuxer_->Seek(seek_time, | 2771 demuxer_->Seek(seek_time, |
| 2772 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); | 2772 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); |
| 2773 message_loop_.RunUntilIdle(); | 2773 base::RunLoop().RunUntilIdle(); |
| 2774 | 2774 |
| 2775 EXPECT_FALSE(seek_cb_was_called); | 2775 EXPECT_FALSE(seek_cb_was_called); |
| 2776 | 2776 |
| 2777 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(300))); | 2777 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(300))); |
| 2778 MarkEndOfStream(PIPELINE_OK); | 2778 MarkEndOfStream(PIPELINE_OK); |
| 2779 message_loop_.RunUntilIdle(); | 2779 base::RunLoop().RunUntilIdle(); |
| 2780 | 2780 |
| 2781 EXPECT_FALSE(seek_cb_was_called); | 2781 EXPECT_FALSE(seek_cb_was_called); |
| 2782 | 2782 |
| 2783 demuxer_->UnmarkEndOfStream(); | 2783 demuxer_->UnmarkEndOfStream(); |
| 2784 | 2784 |
| 2785 AppendMuxedCluster( | 2785 AppendMuxedCluster( |
| 2786 MuxedStreamInfo(kAudioTrackNum, "140K 150K 160K 170K", 10), | 2786 MuxedStreamInfo(kAudioTrackNum, "140K 150K 160K 170K", 10), |
| 2787 MuxedStreamInfo(kVideoTrackNum, "140K 145K 150K 155K 160K 165K 170K 175K", | 2787 MuxedStreamInfo(kVideoTrackNum, "140K 145K 150K 155K 160K 165K 170K 175K", |
| 2788 20)); | 2788 20)); |
| 2789 | 2789 |
| 2790 message_loop_.RunUntilIdle(); | 2790 base::RunLoop().RunUntilIdle(); |
| 2791 | 2791 |
| 2792 EXPECT_TRUE(seek_cb_was_called); | 2792 EXPECT_TRUE(seek_cb_was_called); |
| 2793 | 2793 |
| 2794 ShutdownDemuxer(); | 2794 ShutdownDemuxer(); |
| 2795 } | 2795 } |
| 2796 | 2796 |
| 2797 // Test ranges in an audio-only stream. | 2797 // Test ranges in an audio-only stream. |
| 2798 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { | 2798 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { |
| 2799 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); | 2799 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); |
| 2800 | 2800 |
| (...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3728 MarkEndOfStream(PIPELINE_OK); | 3728 MarkEndOfStream(PIPELINE_OK); |
| 3729 } | 3729 } |
| 3730 | 3730 |
| 3731 // Test receiving a Shutdown() call before we get an Initialize() | 3731 // Test receiving a Shutdown() call before we get an Initialize() |
| 3732 // call. This can happen if video element gets destroyed before | 3732 // call. This can happen if video element gets destroyed before |
| 3733 // the pipeline has a chance to initialize the demuxer. | 3733 // the pipeline has a chance to initialize the demuxer. |
| 3734 TEST_F(ChunkDemuxerTest, Shutdown_BeforeInitialize) { | 3734 TEST_F(ChunkDemuxerTest, Shutdown_BeforeInitialize) { |
| 3735 demuxer_->Shutdown(); | 3735 demuxer_->Shutdown(); |
| 3736 demuxer_->Initialize( | 3736 demuxer_->Initialize( |
| 3737 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); | 3737 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); |
| 3738 message_loop_.RunUntilIdle(); | 3738 base::RunLoop().RunUntilIdle(); |
| 3739 } | 3739 } |
| 3740 | 3740 |
| 3741 // Verifies that signaling end of stream while stalled at a gap | 3741 // Verifies that signaling end of stream while stalled at a gap |
| 3742 // boundary does not trigger end of stream buffers to be returned. | 3742 // boundary does not trigger end of stream buffers to be returned. |
| 3743 TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) { | 3743 TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) { |
| 3744 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 3744 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 3745 | 3745 |
| 3746 ASSERT_TRUE(AppendCluster(0, 10)); | 3746 ASSERT_TRUE(AppendCluster(0, 10)); |
| 3747 ASSERT_TRUE(AppendCluster(300, 10)); | 3747 ASSERT_TRUE(AppendCluster(300, 10)); |
| 3748 CheckExpectedRanges("{ [0,132) [300,432) }"); | 3748 CheckExpectedRanges("{ [0,132) [300,432) }"); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 3766 MarkEndOfStream(PIPELINE_OK); | 3766 MarkEndOfStream(PIPELINE_OK); |
| 3767 | 3767 |
| 3768 // Verify that the reads still haven't completed. | 3768 // Verify that the reads still haven't completed. |
| 3769 EXPECT_FALSE(audio_read_done); | 3769 EXPECT_FALSE(audio_read_done); |
| 3770 EXPECT_FALSE(video_read_done); | 3770 EXPECT_FALSE(video_read_done); |
| 3771 | 3771 |
| 3772 demuxer_->UnmarkEndOfStream(); | 3772 demuxer_->UnmarkEndOfStream(); |
| 3773 | 3773 |
| 3774 ASSERT_TRUE(AppendCluster(138, 22)); | 3774 ASSERT_TRUE(AppendCluster(138, 22)); |
| 3775 | 3775 |
| 3776 message_loop_.RunUntilIdle(); | 3776 base::RunLoop().RunUntilIdle(); |
| 3777 | 3777 |
| 3778 CheckExpectedRanges("{ [0,435) }"); | 3778 CheckExpectedRanges("{ [0,435) }"); |
| 3779 | 3779 |
| 3780 // Verify that the reads have completed. | 3780 // Verify that the reads have completed. |
| 3781 EXPECT_TRUE(audio_read_done); | 3781 EXPECT_TRUE(audio_read_done); |
| 3782 EXPECT_TRUE(video_read_done); | 3782 EXPECT_TRUE(video_read_done); |
| 3783 | 3783 |
| 3784 // Read the rest of the buffers. | 3784 // Read the rest of the buffers. |
| 3785 GenerateExpectedReads(161, 171, 20); | 3785 GenerateExpectedReads(161, 171, 20); |
| 3786 | 3786 |
| (...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4339 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT)); | 4339 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT)); |
| 4340 | 4340 |
| 4341 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); | 4341 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 4342 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 4342 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 4343 | 4343 |
| 4344 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(120); | 4344 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(120); |
| 4345 bool seek_cb_was_called = false; | 4345 bool seek_cb_was_called = false; |
| 4346 demuxer_->StartWaitingForSeek(seek_time); | 4346 demuxer_->StartWaitingForSeek(seek_time); |
| 4347 demuxer_->Seek(seek_time, | 4347 demuxer_->Seek(seek_time, |
| 4348 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); | 4348 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); |
| 4349 message_loop_.RunUntilIdle(); | 4349 base::RunLoop().RunUntilIdle(); |
| 4350 | 4350 |
| 4351 EXPECT_FALSE(seek_cb_was_called); | 4351 EXPECT_FALSE(seek_cb_was_called); |
| 4352 | 4352 |
| 4353 bool text_read_done = false; | 4353 bool text_read_done = false; |
| 4354 text_stream->Read(base::Bind(&OnReadDone, | 4354 text_stream->Read(base::Bind(&OnReadDone, |
| 4355 base::TimeDelta::FromMilliseconds(225), | 4355 base::TimeDelta::FromMilliseconds(225), |
| 4356 &text_read_done)); | 4356 &text_read_done)); |
| 4357 | 4357 |
| 4358 // Append audio & video data so the seek completes. | 4358 // Append audio & video data so the seek completes. |
| 4359 AppendMuxedCluster( | 4359 AppendMuxedCluster( |
| 4360 MuxedStreamInfo(kAudioTrackNum, | 4360 MuxedStreamInfo(kAudioTrackNum, |
| 4361 "0K 20K 40K 60K 80K 100K 120K 140K 160K 180K 200K", 20), | 4361 "0K 20K 40K 60K 80K 100K 120K 140K 160K 180K 200K", 20), |
| 4362 MuxedStreamInfo(kVideoTrackNum, "0K 30 60 90 120K 150 180 210", 30)); | 4362 MuxedStreamInfo(kVideoTrackNum, "0K 30 60 90 120K 150 180 210", 30)); |
| 4363 | 4363 |
| 4364 message_loop_.RunUntilIdle(); | 4364 base::RunLoop().RunUntilIdle(); |
| 4365 EXPECT_TRUE(seek_cb_was_called); | 4365 EXPECT_TRUE(seek_cb_was_called); |
| 4366 EXPECT_FALSE(text_read_done); | 4366 EXPECT_FALSE(text_read_done); |
| 4367 | 4367 |
| 4368 // Read some audio & video buffers to further verify seek completion. | 4368 // Read some audio & video buffers to further verify seek completion. |
| 4369 CheckExpectedBuffers(audio_stream, "120K 140K"); | 4369 CheckExpectedBuffers(audio_stream, "120K 140K"); |
| 4370 CheckExpectedBuffers(video_stream, "120K 150"); | 4370 CheckExpectedBuffers(video_stream, "120K 150"); |
| 4371 | 4371 |
| 4372 EXPECT_FALSE(text_read_done); | 4372 EXPECT_FALSE(text_read_done); |
| 4373 | 4373 |
| 4374 // Append text cues that start after the seek point and verify that | 4374 // Append text cues that start after the seek point and verify that |
| 4375 // they are returned by Read() calls. | 4375 // they are returned by Read() calls. |
| 4376 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "220K 240K 260K 280K", 20), | 4376 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "220K 240K 260K 280K", 20), |
| 4377 MuxedStreamInfo(kVideoTrackNum, "240K 270 300 330", 30), | 4377 MuxedStreamInfo(kVideoTrackNum, "240K 270 300 330", 30), |
| 4378 MuxedStreamInfo(kTextTrackNum, "225K 275K 325K")); | 4378 MuxedStreamInfo(kTextTrackNum, "225K 275K 325K")); |
| 4379 | 4379 |
| 4380 message_loop_.RunUntilIdle(); | 4380 base::RunLoop().RunUntilIdle(); |
| 4381 EXPECT_TRUE(text_read_done); | 4381 EXPECT_TRUE(text_read_done); |
| 4382 | 4382 |
| 4383 // NOTE: we start at 275 here because the buffer at 225 was returned | 4383 // NOTE: we start at 275 here because the buffer at 225 was returned |
| 4384 // to the pending read initiated above. | 4384 // to the pending read initiated above. |
| 4385 CheckExpectedBuffers(text_stream, "275K 325K"); | 4385 CheckExpectedBuffers(text_stream, "275K 325K"); |
| 4386 | 4386 |
| 4387 // Verify that audio & video streams continue to return expected values. | 4387 // Verify that audio & video streams continue to return expected values. |
| 4388 CheckExpectedBuffers(audio_stream, "160K 180K"); | 4388 CheckExpectedBuffers(audio_stream, "160K 180K"); |
| 4389 CheckExpectedBuffers(video_stream, "180 210"); | 4389 CheckExpectedBuffers(video_stream, "180 210"); |
| 4390 } | 4390 } |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4705 cluster->size() - video_start)); | 4705 cluster->size() - video_start)); |
| 4706 | 4706 |
| 4707 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }"); | 4707 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }"); |
| 4708 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,91) }"); | 4708 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,91) }"); |
| 4709 CheckExpectedRanges("{ [30,90) }"); | 4709 CheckExpectedRanges("{ [30,90) }"); |
| 4710 CheckExpectedBuffers(audio_stream, "30K 40K 50K 60K 70K 80K"); | 4710 CheckExpectedBuffers(audio_stream, "30K 40K 50K 60K 70K 80K"); |
| 4711 CheckExpectedBuffers(video_stream, "71K 81"); | 4711 CheckExpectedBuffers(video_stream, "71K 81"); |
| 4712 } | 4712 } |
| 4713 | 4713 |
| 4714 } // namespace media | 4714 } // namespace media |
| OLD | NEW |