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

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

Issue 10558011: Fix ChunkDemuxer so it properly outputs buffered ranges. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address more CR comments and added an end of stream test case. Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | media/filters/source_buffer_stream.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "media/base/audio_decoder_config.h" 6 #include "media/base/audio_decoder_config.h"
7 #include "media/base/decoder_buffer.h" 7 #include "media/base/decoder_buffer.h"
8 #include "media/base/mock_callback.h" 8 #include "media/base/mock_callback.h"
9 #include "media/base/mock_demuxer_host.h" 9 #include "media/base/mock_demuxer_host.h"
10 #include "media/base/test_data_util.h" 10 #include "media/base/test_data_util.h"
(...skipping 28 matching lines...) Expand all
39 static const int kVideoTrackEntryHeaderSize = kVideoTrackSizeOffset + 39 static const int kVideoTrackEntryHeaderSize = kVideoTrackSizeOffset +
40 kVideoTrackSizeWidth; 40 kVideoTrackSizeWidth;
41 41
42 static const int kVideoTrackNum = 1; 42 static const int kVideoTrackNum = 1;
43 static const int kAudioTrackNum = 2; 43 static const int kAudioTrackNum = 2;
44 44
45 static const int kAudioBlockDuration = 23; 45 static const int kAudioBlockDuration = 23;
46 static const int kVideoBlockDuration = 33; 46 static const int kVideoBlockDuration = 33;
47 47
48 static const char* kSourceId = "SourceId"; 48 static const char* kSourceId = "SourceId";
49 static const char* kDefaultFirstClusterRange = "{ [0,46) }";
49 50
50 base::TimeDelta kDefaultDuration() { 51 base::TimeDelta kDefaultDuration() {
51 return base::TimeDelta::FromMilliseconds(201224); 52 return base::TimeDelta::FromMilliseconds(201224);
52 } 53 }
53 54
54 // Write an integer into buffer in the form of vint that spans 8 bytes. 55 // Write an integer into buffer in the form of vint that spans 8 bytes.
55 // The data pointed by |buffer| should be at least 8 bytes long. 56 // The data pointed by |buffer| should be at least 8 bytes long.
56 // |number| should be in the range 0 <= number < 0x00FFFFFFFFFFFFFF. 57 // |number| should be in the range 0 <= number < 0x00FFFFFFFFFFFFFF.
57 static void WriteInt64(uint8* buffer, int64 number) { 58 static void WriteInt64(uint8* buffer, int64 number) {
58 DCHECK(number >= 0 && number < GG_LONGLONG(0x00FFFFFFFFFFFFFF)); 59 DCHECK(number >= 0 && number < GG_LONGLONG(0x00FFFFFFFFFFFFFF));
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 const uint8* start = data; 250 const uint8* start = data;
250 const uint8* end = data + length; 251 const uint8* end = data + length;
251 while (start < end) { 252 while (start < end) {
252 int64 old_buffered_bytes = buffered_bytes_; 253 int64 old_buffered_bytes = buffered_bytes_;
253 size_t append_size = std::min(piece_size, 254 size_t append_size = std::min(piece_size,
254 static_cast<size_t>(end - start)); 255 static_cast<size_t>(end - start));
255 if (!AppendData(start, append_size)) 256 if (!AppendData(start, append_size))
256 return false; 257 return false;
257 start += append_size; 258 start += append_size;
258 259
259 EXPECT_GT(buffered_bytes_, old_buffered_bytes); 260 EXPECT_GE(buffered_bytes_, old_buffered_bytes);
260 } 261 }
261 return true; 262 return true;
262 } 263 }
263 264
264 bool AppendInitSegment(bool has_audio, bool has_video, 265 bool AppendInitSegment(bool has_audio, bool has_video,
265 bool video_content_encoded) { 266 bool video_content_encoded) {
266 return AppendInitSegment(kSourceId, has_audio, has_video, 267 return AppendInitSegment(kSourceId, has_audio, has_video,
267 video_content_encoded); 268 video_content_encoded);
268 } 269 }
269 270
270 bool AppendInitSegment(const std::string& source_id, 271 bool AppendInitSegment(const std::string& source_id,
271 bool has_audio, bool has_video, 272 bool has_audio, bool has_video,
272 bool video_content_encoded) { 273 bool video_content_encoded) {
273 scoped_array<uint8> info_tracks; 274 scoped_array<uint8> info_tracks;
274 int info_tracks_size = 0; 275 int info_tracks_size = 0;
275 CreateInitSegment(has_audio, has_video, video_content_encoded, 276 CreateInitSegment(has_audio, has_video, video_content_encoded,
276 &info_tracks, &info_tracks_size); 277 &info_tracks, &info_tracks_size);
277 return AppendData(source_id, info_tracks.get(), info_tracks_size); 278 return AppendData(source_id, info_tracks.get(), info_tracks_size);
278 } 279 }
279 280
280 void InitDoneCalled(PipelineStatus expected_status, 281 void InitDoneCalled(PipelineStatus expected_status,
281 PipelineStatus status) { 282 PipelineStatus status) {
282 EXPECT_EQ(status, expected_status); 283 EXPECT_EQ(status, expected_status);
283 } 284 }
284 285
285 PipelineStatusCB CreateInitDoneCB(const base::TimeDelta& expected_duration, 286 PipelineStatusCB CreateInitDoneCB(const base::TimeDelta& expected_duration,
286 PipelineStatus expected_status) { 287 PipelineStatus expected_status) {
287 if (expected_status == PIPELINE_OK) 288 if (expected_status == PIPELINE_OK) {
289 if (expected_duration != kInfiniteDuration())
290 EXPECT_CALL(host_, SetTotalBytes(_));
288 EXPECT_CALL(host_, SetDuration(expected_duration)); 291 EXPECT_CALL(host_, SetDuration(expected_duration));
292 }
289 293
290 return base::Bind(&ChunkDemuxerTest::InitDoneCalled, 294 return base::Bind(&ChunkDemuxerTest::InitDoneCalled,
291 base::Unretained(this), 295 base::Unretained(this),
292 expected_status); 296 expected_status);
293 } 297 }
294 298
295 bool InitDemuxer(bool has_audio, bool has_video, 299 bool InitDemuxer(bool has_audio, bool has_video,
296 bool video_content_encoded) { 300 bool video_content_encoded) {
297 PipelineStatus expected_status = 301 PipelineStatus expected_status =
298 (has_audio || has_video) ? PIPELINE_OK : DEMUXER_ERROR_COULD_NOT_OPEN; 302 (has_audio || has_video) ? PIPELINE_OK : DEMUXER_ERROR_COULD_NOT_OPEN;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 cb.AddBlockGroup(kVideoTrackNum, video_timecode, kVideoBlockDuration, 392 cb.AddBlockGroup(kVideoTrackNum, video_timecode, kVideoBlockDuration,
389 video_flag, data.get(), size); 393 video_flag, data.get(), size);
390 cb.AddBlockGroup(kAudioTrackNum, audio_timecode, kAudioBlockDuration, 394 cb.AddBlockGroup(kAudioTrackNum, audio_timecode, kAudioBlockDuration,
391 kWebMFlagKeyframe, data.get(), size); 395 kWebMFlagKeyframe, data.get(), size);
392 } 396 }
393 397
394 return cb.Finish(); 398 return cb.Finish();
395 } 399 }
396 400
397 scoped_ptr<Cluster> GenerateSingleStreamCluster(int timecode, 401 scoped_ptr<Cluster> GenerateSingleStreamCluster(int timecode,
398 int block_count, 402 int end_timecode,
399 int track_number, 403 int track_number,
400 int block_duration) { 404 int block_duration) {
401 CHECK_GT(block_count, 0); 405 CHECK_GT(end_timecode, timecode);
402 406
403 int size = 10; 407 int size = 10;
404 scoped_array<uint8> data(new uint8[size]); 408 scoped_array<uint8> data(new uint8[size]);
405 409
406 ClusterBuilder cb; 410 ClusterBuilder cb;
407 cb.SetClusterTimecode(timecode); 411 cb.SetClusterTimecode(timecode);
408 412
409 // Create simple blocks for everything except the last block. 413 // Create simple blocks for everything except the last block.
410 for (int i = 0; i < block_count - 1; i++) { 414 for (int i = 0; timecode < (end_timecode - block_duration); i++) {
411 cb.AddSimpleBlock(track_number, timecode, kWebMFlagKeyframe, 415 cb.AddSimpleBlock(track_number, timecode, kWebMFlagKeyframe,
412 data.get(), size); 416 data.get(), size);
413 timecode += block_duration; 417 timecode += block_duration;
414 } 418 }
415 419
416 // Make the last block a BlockGroup so that it doesn't get delayed by the 420 // Make the last block a BlockGroup so that it doesn't get delayed by the
417 // block duration calculation logic. 421 // block duration calculation logic.
418 cb.AddBlockGroup(track_number, timecode, block_duration, 422 cb.AddBlockGroup(track_number, timecode, block_duration,
419 kWebMFlagKeyframe, data.get(), size); 423 kWebMFlagKeyframe, data.get(), size);
420 return cb.Finish(); 424 return cb.Finish();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 DemuxerStream* stream, int block_duration) { 460 DemuxerStream* stream, int block_duration) {
457 CHECK_GT(block_count, 0); 461 CHECK_GT(block_count, 0);
458 int stream_timecode = timecode; 462 int stream_timecode = timecode;
459 463
460 for (int i = 0; i < block_count; i++) { 464 for (int i = 0; i < block_count; i++) {
461 ExpectRead(stream, stream_timecode); 465 ExpectRead(stream, stream_timecode);
462 stream_timecode += block_duration; 466 stream_timecode += block_duration;
463 } 467 }
464 } 468 }
465 469
466 std::pair<base::TimeDelta, base::TimeDelta> CreateRange( 470 void CheckExpectedRanges(const std::string& expected) {
467 int start_time, int block_count, int block_duration) { 471 CheckExpectedRanges(kSourceId, expected);
468 return std::make_pair(base::TimeDelta::FromMilliseconds(start_time),
469 base::TimeDelta::FromMilliseconds(start_time +
470 (block_count * block_duration)));
471 } 472 }
472 473
473 void CheckExpectedRanges(const ChunkDemuxer::Ranges& expected_times) { 474 void CheckExpectedRanges(const std::string& id,
474 ChunkDemuxer::Ranges actual_times; 475 const std::string& expected) {
475 demuxer_->GetBufferedRanges(kSourceId, &actual_times); 476 Ranges<base::TimeDelta> r = demuxer_->GetBufferedRanges(id);
476 EXPECT_EQ(expected_times.size(), actual_times.size());
477 477
478 for (ChunkDemuxer::Ranges::const_iterator actual_itr = 478 std::stringstream ss;
479 actual_times.begin(), expected_itr = expected_times.begin(); 479 ss << "{ ";
480 actual_itr != actual_times.end() && 480 for (size_t i = 0; i < r.size(); ++i) {
481 expected_itr != expected_times.end(); 481 ss << "[" << r.start(i).InMilliseconds() << ","
482 actual_itr++, expected_itr++) { 482 << r.end(i).InMilliseconds() << ") ";
483 EXPECT_EQ(expected_itr->first, actual_itr->first);
484 EXPECT_EQ(expected_itr->second, actual_itr->second);
485 } 483 }
484 ss << "}";
485 EXPECT_EQ(ss.str(), expected);
486 } 486 }
487 487
488 MOCK_METHOD1(ReadDone, void(const scoped_refptr<DecoderBuffer>&)); 488 MOCK_METHOD1(ReadDone, void(const scoped_refptr<DecoderBuffer>&));
489 489
490 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { 490 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) {
491 EXPECT_CALL(*this, ReadDone(HasTimestamp(timestamp_in_ms))); 491 EXPECT_CALL(*this, ReadDone(HasTimestamp(timestamp_in_ms)));
492 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, 492 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone,
493 base::Unretained(this))); 493 base::Unretained(this)));
494 } 494 }
495 495
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
866 } 866 }
867 867
868 // Test cases where we get an EndOfStream() call during initialization. 868 // Test cases where we get an EndOfStream() call during initialization.
869 TEST_F(ChunkDemuxerTest, TestEOSDuringInit) { 869 TEST_F(ChunkDemuxerTest, TestEOSDuringInit) {
870 EXPECT_CALL(*client_, DemuxerOpened(_)); 870 EXPECT_CALL(*client_, DemuxerOpened(_));
871 demuxer_->Initialize( 871 demuxer_->Initialize(
872 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 872 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
873 demuxer_->EndOfStream(PIPELINE_OK); 873 demuxer_->EndOfStream(PIPELINE_OK);
874 } 874 }
875 875
876 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoAppend) {
877 ASSERT_TRUE(InitDemuxer(true, true, false));
878
879 CheckExpectedRanges("{ }");
880 demuxer_->EndOfStream(PIPELINE_OK);
881 CheckExpectedRanges("{ }");
882 }
883
876 TEST_F(ChunkDemuxerTest, TestDecodeErrorEndOfStream) { 884 TEST_F(ChunkDemuxerTest, TestDecodeErrorEndOfStream) {
877 ASSERT_TRUE(InitDemuxer(true, true, false)); 885 ASSERT_TRUE(InitDemuxer(true, true, false));
878 886
879 scoped_ptr<Cluster> cluster(kDefaultFirstCluster()); 887 scoped_ptr<Cluster> cluster(kDefaultFirstCluster());
880 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 888 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
889 CheckExpectedRanges(kDefaultFirstClusterRange);
881 890
882 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 891 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
883 demuxer_->EndOfStream(PIPELINE_ERROR_DECODE); 892 demuxer_->EndOfStream(PIPELINE_ERROR_DECODE);
893 CheckExpectedRanges(kDefaultFirstClusterRange);
884 } 894 }
885 895
886 TEST_F(ChunkDemuxerTest, TestNetworkErrorEndOfStream) { 896 TEST_F(ChunkDemuxerTest, TestNetworkErrorEndOfStream) {
887 ASSERT_TRUE(InitDemuxer(true, true, false)); 897 ASSERT_TRUE(InitDemuxer(true, true, false));
888 898
889 scoped_ptr<Cluster> cluster(kDefaultFirstCluster()); 899 scoped_ptr<Cluster> cluster(kDefaultFirstCluster());
890 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 900 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
901 CheckExpectedRanges(kDefaultFirstClusterRange);
891 902
892 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK)); 903 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK));
893 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK); 904 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK);
894 } 905 }
895 906
896 // Helper class to reduce duplicate code when testing end of stream 907 // Helper class to reduce duplicate code when testing end of stream
897 // Read() behavior. 908 // Read() behavior.
898 class EndOfStreamHelper { 909 class EndOfStreamHelper {
899 public: 910 public:
900 explicit EndOfStreamHelper(const scoped_refptr<Demuxer> demuxer) 911 explicit EndOfStreamHelper(const scoped_refptr<Demuxer> demuxer)
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
1275 std::string audio_id = "audio1"; 1286 std::string audio_id = "audio1";
1276 std::string video_id = "video1"; 1287 std::string video_id = "video1";
1277 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 1288 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1278 1289
1279 scoped_refptr<DemuxerStream> audio = 1290 scoped_refptr<DemuxerStream> audio =
1280 demuxer_->GetStream(DemuxerStream::AUDIO); 1291 demuxer_->GetStream(DemuxerStream::AUDIO);
1281 scoped_refptr<DemuxerStream> video = 1292 scoped_refptr<DemuxerStream> video =
1282 demuxer_->GetStream(DemuxerStream::VIDEO); 1293 demuxer_->GetStream(DemuxerStream::VIDEO);
1283 1294
1284 scoped_ptr<Cluster> cluster_a( 1295 scoped_ptr<Cluster> cluster_a(
1285 GenerateSingleStreamCluster(0, 4, kAudioTrackNum, kAudioBlockDuration)); 1296 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration));
1286 1297
1287 scoped_ptr<Cluster> cluster_v( 1298 scoped_ptr<Cluster> cluster_v(
1288 GenerateSingleStreamCluster(0, 4, kVideoTrackNum, kVideoBlockDuration)); 1299 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration));
1289 1300
1290 // Append audio and video data into separate source ids. 1301 // Append audio and video data into separate source ids.
1291 ASSERT_TRUE(AppendData(audio_id, cluster_a->data(), cluster_a->size())); 1302 ASSERT_TRUE(AppendData(audio_id, cluster_a->data(), cluster_a->size()));
1292 GenerateExpectedReads(0, 4, audio, kAudioBlockDuration); 1303 GenerateExpectedReads(0, 4, audio, kAudioBlockDuration);
1293 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size())); 1304 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size()));
1294 GenerateExpectedReads(0, 4, video, kVideoBlockDuration); 1305 GenerateExpectedReads(0, 4, video, kVideoBlockDuration);
1295 } 1306 }
1296 1307
1297 TEST_F(ChunkDemuxerTest, TestAddIdFailures) { 1308 TEST_F(ChunkDemuxerTest, TestAddIdFailures) {
1298 EXPECT_CALL(*client_, DemuxerOpened(_)); 1309 EXPECT_CALL(*client_, DemuxerOpened(_));
(...skipping 14 matching lines...) Expand all
1313 ASSERT_EQ(AddId(video_id, false, true), ChunkDemuxer::kReachedIdLimit); 1324 ASSERT_EQ(AddId(video_id, false, true), ChunkDemuxer::kReachedIdLimit);
1314 } 1325 }
1315 1326
1316 // Test that Read() calls after a RemoveId() return "end of stream" buffers. 1327 // Test that Read() calls after a RemoveId() return "end of stream" buffers.
1317 TEST_F(ChunkDemuxerTest, TestRemoveId) { 1328 TEST_F(ChunkDemuxerTest, TestRemoveId) {
1318 std::string audio_id = "audio1"; 1329 std::string audio_id = "audio1";
1319 std::string video_id = "video1"; 1330 std::string video_id = "video1";
1320 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 1331 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1321 1332
1322 scoped_ptr<Cluster> cluster_a( 1333 scoped_ptr<Cluster> cluster_a(
1323 GenerateSingleStreamCluster(0, 4, kAudioTrackNum, kAudioBlockDuration)); 1334 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration));
1324 1335
1325 scoped_ptr<Cluster> cluster_v( 1336 scoped_ptr<Cluster> cluster_v(
1326 GenerateSingleStreamCluster(0, 4, kVideoTrackNum, kVideoBlockDuration)); 1337 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration));
1327 1338
1328 // Append audio and video data into separate source ids. 1339 // Append audio and video data into separate source ids.
1329 ASSERT_TRUE(AppendData(audio_id, cluster_a->data(), cluster_a->size())); 1340 ASSERT_TRUE(AppendData(audio_id, cluster_a->data(), cluster_a->size()));
1330 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size())); 1341 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size()));
1331 1342
1332 // Read() from audio should return normal buffers. 1343 // Read() from audio should return normal buffers.
1333 scoped_refptr<DemuxerStream> audio = 1344 scoped_refptr<DemuxerStream> audio =
1334 demuxer_->GetStream(DemuxerStream::AUDIO); 1345 demuxer_->GetStream(DemuxerStream::AUDIO);
1335 GenerateExpectedReads(0, 4, audio, kAudioBlockDuration); 1346 GenerateExpectedReads(0, 4, audio, kAudioBlockDuration);
1336 1347
(...skipping 12 matching lines...) Expand all
1349 GenerateExpectedReads(0, 4, video, kVideoBlockDuration); 1360 GenerateExpectedReads(0, 4, video, kVideoBlockDuration);
1350 } 1361 }
1351 1362
1352 // Test that Seek() successfully seeks to all source IDs. 1363 // Test that Seek() successfully seeks to all source IDs.
1353 TEST_F(ChunkDemuxerTest, TestSeekAudioAndVideoSources) { 1364 TEST_F(ChunkDemuxerTest, TestSeekAudioAndVideoSources) {
1354 std::string audio_id = "audio1"; 1365 std::string audio_id = "audio1";
1355 std::string video_id = "video1"; 1366 std::string video_id = "video1";
1356 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 1367 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1357 1368
1358 scoped_ptr<Cluster> cluster_a1( 1369 scoped_ptr<Cluster> cluster_a1(
1359 GenerateSingleStreamCluster(0, 4, kAudioTrackNum, kAudioBlockDuration)); 1370 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration));
1360 1371
1361 scoped_ptr<Cluster> cluster_v1( 1372 scoped_ptr<Cluster> cluster_v1(
1362 GenerateSingleStreamCluster(0, 4, kVideoTrackNum, kVideoBlockDuration)); 1373 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration));
1363 1374
1364 ASSERT_TRUE(AppendData(audio_id, cluster_a1->data(), cluster_a1->size())); 1375 ASSERT_TRUE(AppendData(audio_id, cluster_a1->data(), cluster_a1->size()));
1365 ASSERT_TRUE(AppendData(video_id, cluster_v1->data(), cluster_v1->size())); 1376 ASSERT_TRUE(AppendData(video_id, cluster_v1->data(), cluster_v1->size()));
1366 1377
1367 // Read() should return buffers at 0. 1378 // Read() should return buffers at 0.
1368 bool audio_read_done = false; 1379 bool audio_read_done = false;
1369 bool video_read_done = false; 1380 bool video_read_done = false;
1370 scoped_refptr<DemuxerStream> audio = 1381 scoped_refptr<DemuxerStream> audio =
1371 demuxer_->GetStream(DemuxerStream::AUDIO); 1382 demuxer_->GetStream(DemuxerStream::AUDIO);
1372 scoped_refptr<DemuxerStream> video = 1383 scoped_refptr<DemuxerStream> video =
(...skipping 20 matching lines...) Expand all
1393 &audio_read_done)); 1404 &audio_read_done));
1394 video->Read(base::Bind(&OnReadDone, 1405 video->Read(base::Bind(&OnReadDone,
1395 base::TimeDelta::FromSeconds(3), 1406 base::TimeDelta::FromSeconds(3),
1396 &video_read_done)); 1407 &video_read_done));
1397 1408
1398 // Read()s should not return until after data is appended at the Seek point. 1409 // Read()s should not return until after data is appended at the Seek point.
1399 EXPECT_FALSE(audio_read_done); 1410 EXPECT_FALSE(audio_read_done);
1400 EXPECT_FALSE(video_read_done); 1411 EXPECT_FALSE(video_read_done);
1401 1412
1402 scoped_ptr<Cluster> cluster_a2( 1413 scoped_ptr<Cluster> cluster_a2(
1403 GenerateSingleStreamCluster(3000, 4, kAudioTrackNum, 1414 GenerateSingleStreamCluster(3000, 3092, kAudioTrackNum,
1404 kAudioBlockDuration)); 1415 kAudioBlockDuration));
1405 1416
1406 scoped_ptr<Cluster> cluster_v2( 1417 scoped_ptr<Cluster> cluster_v2(
1407 GenerateSingleStreamCluster(3000, 4, kVideoTrackNum, 1418 GenerateSingleStreamCluster(3000, 3132, kVideoTrackNum,
1408 kVideoBlockDuration)); 1419 kVideoBlockDuration));
1409 1420
1410 ASSERT_TRUE(AppendData(audio_id, cluster_a2->data(), cluster_a2->size())); 1421 ASSERT_TRUE(AppendData(audio_id, cluster_a2->data(), cluster_a2->size()));
1411 ASSERT_TRUE(AppendData(video_id, cluster_v2->data(), cluster_v2->size())); 1422 ASSERT_TRUE(AppendData(video_id, cluster_v2->data(), cluster_v2->size()));
1412 1423
1413 // Read() should return buffers at 3. 1424 // Read() should return buffers at 3.
1414 EXPECT_TRUE(audio_read_done); 1425 EXPECT_TRUE(audio_read_done);
1415 EXPECT_TRUE(video_read_done); 1426 EXPECT_TRUE(video_read_done);
1416 } 1427 }
1417 1428
1418 // Test ranges in an audio-only stream. 1429 // Test ranges in an audio-only stream.
1419 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { 1430 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) {
1420 EXPECT_CALL(*client_, DemuxerOpened(_)); 1431 EXPECT_CALL(*client_, DemuxerOpened(_));
1421 demuxer_->Initialize( 1432 demuxer_->Initialize(
1422 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); 1433 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK));
1423 1434
1424 ASSERT_EQ(AddId(kSourceId, true, false), ChunkDemuxer::kOk); 1435 ASSERT_EQ(AddId(kSourceId, true, false), ChunkDemuxer::kOk);
1425 ASSERT_TRUE(AppendInitSegment(true, false, false)); 1436 ASSERT_TRUE(AppendInitSegment(true, false, false));
1426 1437
1427 // Test a simple cluster. 1438 // Test a simple cluster.
1428 scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 4, 1439 scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 92,
1429 kAudioTrackNum, kAudioBlockDuration)); 1440 kAudioTrackNum, kAudioBlockDuration));
1430 ChunkDemuxer::Ranges expected;
1431 expected.push_back(CreateRange(0, 4, kAudioBlockDuration));
1432
1433 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size())); 1441 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size()));
1434 1442
1435 CheckExpectedRanges(expected); 1443 CheckExpectedRanges("{ [0,92) }");
1436 1444
1437 // Append a disjoint cluster to check for two separate ranges. 1445 // Append a disjoint cluster to check for two separate ranges.
1438 scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(150, 3, 1446 scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(150, 219,
1439 kAudioTrackNum, kAudioBlockDuration)); 1447 kAudioTrackNum, kAudioBlockDuration));
1440 expected.push_back(CreateRange(150, 3, kAudioBlockDuration));
1441 1448
1442 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size())); 1449 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size()));
1443 1450
1444 CheckExpectedRanges(expected); 1451 CheckExpectedRanges("{ [0,92) [150,219) }");
1445 } 1452 }
1446 1453
1447 // Test ranges in a video-only stream. 1454 // Test ranges in a video-only stream.
1448 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { 1455 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) {
1449 EXPECT_CALL(*client_, DemuxerOpened(_)); 1456 EXPECT_CALL(*client_, DemuxerOpened(_));
1450 demuxer_->Initialize( 1457 demuxer_->Initialize(
1451 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); 1458 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK));
1452 1459
1453 ASSERT_EQ(AddId(kSourceId, false, true), ChunkDemuxer::kOk); 1460 ASSERT_EQ(AddId(kSourceId, false, true), ChunkDemuxer::kOk);
1454 ASSERT_TRUE(AppendInitSegment(false, true, false)); 1461 ASSERT_TRUE(AppendInitSegment(false, true, false));
1455 1462
1456 // Test a simple cluster. 1463 // Test a simple cluster.
1457 scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 4, 1464 scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 132,
1458 kVideoTrackNum, kVideoBlockDuration)); 1465 kVideoTrackNum, kVideoBlockDuration));
1459 ChunkDemuxer::Ranges expected;
1460 expected.push_back(CreateRange(0, 4, kVideoBlockDuration));
1461 1466
1462 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size())); 1467 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size()));
1463 1468
1464 CheckExpectedRanges(expected); 1469 CheckExpectedRanges("{ [0,132) }");
1465 1470
1466 // Append a disjoint cluster to check for two separate ranges. 1471 // Append a disjoint cluster to check for two separate ranges.
1467 scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(150, 3, 1472 scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(150, 249,
1468 kVideoTrackNum, kVideoBlockDuration)); 1473 kVideoTrackNum, kVideoBlockDuration));
1469 expected.push_back(CreateRange(150, 3, kVideoBlockDuration));
1470 1474
1471 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size())); 1475 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size()));
1472 1476
1473 CheckExpectedRanges(expected); 1477 CheckExpectedRanges("{ [0,132) [150,249) }");
1474 } 1478 }
1475 1479
1476 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { 1480 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) {
1477 ASSERT_TRUE(InitDemuxer(true, true, false)); 1481 ASSERT_TRUE(InitDemuxer(true, true, false));
1478 1482
1479 // Audio: 0 -> 23 1483 // Audio: 0 -> 23
1480 // Video: 0 -> 33 1484 // Video: 0 -> 33
1481 // Buffered Range: 0 -> 23 1485 // Buffered Range: 0 -> 23
1482 // Audio block duration is smaller than video block duration, 1486 // Audio block duration is smaller than video block duration,
1483 // so the buffered ranges should correspond to the audio blocks. 1487 // so the buffered ranges should correspond to the audio blocks.
1484 scoped_ptr<Cluster> cluster_a0( 1488 scoped_ptr<Cluster> cluster_a0(
1485 GenerateSingleStreamCluster(0, 1, kAudioTrackNum, kAudioBlockDuration)); 1489 GenerateSingleStreamCluster(0, kAudioBlockDuration, kAudioTrackNum,
1490 kAudioBlockDuration));
1486 1491
1487 scoped_ptr<Cluster> cluster_v0( 1492 scoped_ptr<Cluster> cluster_v0(
1488 GenerateSingleStreamCluster(0, 1, kVideoTrackNum, kVideoBlockDuration)); 1493 GenerateSingleStreamCluster(0, kVideoBlockDuration, kVideoTrackNum,
1489 1494 kVideoBlockDuration));
1490 ChunkDemuxer::Ranges expected;
1491 expected.push_back(CreateRange(0, 1, kAudioBlockDuration));
1492 1495
1493 ASSERT_TRUE(AppendData(cluster_a0->data(), cluster_a0->size())); 1496 ASSERT_TRUE(AppendData(cluster_a0->data(), cluster_a0->size()));
1494 ASSERT_TRUE(AppendData(cluster_v0->data(), cluster_v0->size())); 1497 ASSERT_TRUE(AppendData(cluster_v0->data(), cluster_v0->size()));
1495 1498
1496 CheckExpectedRanges(expected); 1499 CheckExpectedRanges("{ [0,23) }");
1497 1500
1498 // Audio: 100 -> 150 1501 // Audio: 100 -> 150
1499 // Video: 120 -> 170 1502 // Video: 120 -> 170
1500 // Buffered Range: 120 -> 150 (end overlap) 1503 // Buffered Range: 120 -> 150 (end overlap)
1501 scoped_ptr<Cluster> cluster_a1( 1504 scoped_ptr<Cluster> cluster_a1(
1502 GenerateSingleStreamCluster(100, 1, kAudioTrackNum, 50)); 1505 GenerateSingleStreamCluster(100, 150, kAudioTrackNum, 50));
1503 1506
1504 scoped_ptr<Cluster> cluster_v1( 1507 scoped_ptr<Cluster> cluster_v1(
1505 GenerateSingleStreamCluster(120, 1, kVideoTrackNum, 50)); 1508 GenerateSingleStreamCluster(120, 170, kVideoTrackNum, 50));
1506
1507 expected.push_back(CreateRange(120, 1, 30));
1508 1509
1509 ASSERT_TRUE(AppendData(cluster_a1->data(), cluster_a1->size())); 1510 ASSERT_TRUE(AppendData(cluster_a1->data(), cluster_a1->size()));
1510 ASSERT_TRUE(AppendData(cluster_v1->data(), cluster_v1->size())); 1511 ASSERT_TRUE(AppendData(cluster_v1->data(), cluster_v1->size()));
1511 1512
1512 CheckExpectedRanges(expected); 1513 CheckExpectedRanges("{ [0,23) [120,150) }");
1513 1514
1514 // Audio: 220 -> 290 1515 // Audio: 220 -> 290
1515 // Video: 200 -> 270 1516 // Video: 200 -> 270
1516 // Buffered Range: 220 -> 270 (front overlap) 1517 // Buffered Range: 220 -> 270 (front overlap)
1517 scoped_ptr<Cluster> cluster_a2( 1518 scoped_ptr<Cluster> cluster_a2(
1518 GenerateSingleStreamCluster(220, 1, kAudioTrackNum, 70)); 1519 GenerateSingleStreamCluster(220, 290, kAudioTrackNum, 70));
1519 1520
1520 scoped_ptr<Cluster> cluster_v2( 1521 scoped_ptr<Cluster> cluster_v2(
1521 GenerateSingleStreamCluster(200, 1, kVideoTrackNum, 70)); 1522 GenerateSingleStreamCluster(200, 270, kVideoTrackNum, 70));
1522
1523 expected.push_back(CreateRange(220, 1, 50));
1524 1523
1525 ASSERT_TRUE(AppendData(cluster_a2->data(), cluster_a2->size())); 1524 ASSERT_TRUE(AppendData(cluster_a2->data(), cluster_a2->size()));
1526 ASSERT_TRUE(AppendData(cluster_v2->data(), cluster_v2->size())); 1525 ASSERT_TRUE(AppendData(cluster_v2->data(), cluster_v2->size()));
1527 1526
1528 CheckExpectedRanges(expected); 1527 CheckExpectedRanges("{ [0,23) [120,150) [220,270) }");
1529 1528
1530 // Audio: 320 -> 350 1529 // Audio: 320 -> 350
1531 // Video: 300 -> 370 1530 // Video: 300 -> 370
1532 // Buffered Range: 320 -> 350 (complete overlap, audio) 1531 // Buffered Range: 320 -> 350 (complete overlap, audio)
1533 scoped_ptr<Cluster> cluster_a3( 1532 scoped_ptr<Cluster> cluster_a3(
1534 GenerateSingleStreamCluster(320, 1, kAudioTrackNum, 30)); 1533 GenerateSingleStreamCluster(320, 350, kAudioTrackNum, 30));
1535 1534
1536 scoped_ptr<Cluster> cluster_v3( 1535 scoped_ptr<Cluster> cluster_v3(
1537 GenerateSingleStreamCluster(300, 1, kVideoTrackNum, 70)); 1536 GenerateSingleStreamCluster(300, 370, kVideoTrackNum, 70));
1538
1539 expected.push_back(CreateRange(320, 1, 30));
1540 1537
1541 ASSERT_TRUE(AppendData(cluster_a3->data(), cluster_a3->size())); 1538 ASSERT_TRUE(AppendData(cluster_a3->data(), cluster_a3->size()));
1542 ASSERT_TRUE(AppendData(cluster_v3->data(), cluster_v3->size())); 1539 ASSERT_TRUE(AppendData(cluster_v3->data(), cluster_v3->size()));
1543 1540
1544 CheckExpectedRanges(expected); 1541 CheckExpectedRanges("{ [0,23) [120,150) [220,270) [320,350) }");
1545 1542
1546 // Audio: 400 -> 470 1543 // Audio: 400 -> 470
1547 // Video: 420 -> 450 1544 // Video: 420 -> 450
1548 // Buffered Range: 420 -> 450 (complete overlap, video) 1545 // Buffered Range: 420 -> 450 (complete overlap, video)
1549 scoped_ptr<Cluster> cluster_a4( 1546 scoped_ptr<Cluster> cluster_a4(
1550 GenerateSingleStreamCluster(400, 1, kAudioTrackNum, 70)); 1547 GenerateSingleStreamCluster(400, 470, kAudioTrackNum, 70));
1551 1548
1552 scoped_ptr<Cluster> cluster_v4( 1549 scoped_ptr<Cluster> cluster_v4(
1553 GenerateSingleStreamCluster(420, 1, kVideoTrackNum, 30)); 1550 GenerateSingleStreamCluster(420, 450, kVideoTrackNum, 30));
1554
1555 expected.push_back(CreateRange(420, 1, 30));
1556 1551
1557 ASSERT_TRUE(AppendData(cluster_a4->data(), cluster_a4->size())); 1552 ASSERT_TRUE(AppendData(cluster_a4->data(), cluster_a4->size()));
1558 ASSERT_TRUE(AppendData(cluster_v4->data(), cluster_v4->size())); 1553 ASSERT_TRUE(AppendData(cluster_v4->data(), cluster_v4->size()));
1559 1554
1560 CheckExpectedRanges(expected); 1555 CheckExpectedRanges("{ [0,23) [120,150) [220,270) [320,350) [420,450) }");
1561 1556
1562 // Appending within buffered range should not affect buffered ranges. 1557 // Appending within buffered range should not affect buffered ranges.
1563 scoped_ptr<Cluster> cluster_a5( 1558 scoped_ptr<Cluster> cluster_a5(
1564 GenerateSingleStreamCluster(430, 1, kAudioTrackNum, 20)); 1559 GenerateSingleStreamCluster(430, 450, kAudioTrackNum, 20));
1565 ASSERT_TRUE(AppendData(cluster_a5->data(), cluster_a5->size())); 1560 ASSERT_TRUE(AppendData(cluster_a5->data(), cluster_a5->size()));
1566 CheckExpectedRanges(expected); 1561 CheckExpectedRanges("{ [0,23) [120,150) [220,270) [320,350) [420,450) }");
1567 1562
1568 // Appending to single stream outside buffered ranges should not affect 1563 // Appending to single stream outside buffered ranges should not affect
1569 // buffered ranges. 1564 // buffered ranges.
1570 scoped_ptr<Cluster> cluster_v5( 1565 scoped_ptr<Cluster> cluster_v5(
1571 GenerateSingleStreamCluster(530, 1, kVideoTrackNum, 10)); 1566 GenerateSingleStreamCluster(530, 540, kVideoTrackNum, 10));
1572 ASSERT_TRUE(AppendData(cluster_v5->data(), cluster_v5->size())); 1567 ASSERT_TRUE(AppendData(cluster_v5->data(), cluster_v5->size()));
1573 CheckExpectedRanges(expected); 1568 CheckExpectedRanges("{ [0,23) [120,150) [220,270) [320,350) [420,450) }");
1574 } 1569 }
1575 1570
1576 // Once EndOfStream() is called, GetBufferedRanges should not cut off any 1571 // Once EndOfStream() is called, GetBufferedRanges should not cut off any
1577 // over-hanging tails at the end of the ranges as this is likely due to block 1572 // over-hanging tails at the end of the ranges as this is likely due to block
1578 // duration differences. 1573 // duration differences.
1579 TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) { 1574 TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) {
1580 ASSERT_TRUE(InitDemuxer(true, true, false)); 1575 ASSERT_TRUE(InitDemuxer(true, true, false));
1581 1576
1582 scoped_ptr<Cluster> cluster_a( 1577 scoped_ptr<Cluster> cluster_a(
1583 GenerateSingleStreamCluster(0, 1, kAudioTrackNum, 90)); 1578 GenerateSingleStreamCluster(0, 90, kAudioTrackNum, 90));
1584 scoped_ptr<Cluster> cluster_v( 1579 scoped_ptr<Cluster> cluster_v(
1585 GenerateSingleStreamCluster(0, 1, kVideoTrackNum, 100)); 1580 GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 100));
1586 ChunkDemuxer::Ranges expected;
1587 expected.push_back(CreateRange(0, 1, 100));
1588 1581
1589 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 1582 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
1590 ASSERT_TRUE(AppendData(cluster_v->data(), cluster_v->size())); 1583 ASSERT_TRUE(AppendData(cluster_v->data(), cluster_v->size()));
1591 1584
1585 CheckExpectedRanges("{ [0,90) }");
1586
1592 demuxer_->EndOfStream(PIPELINE_OK); 1587 demuxer_->EndOfStream(PIPELINE_OK);
1593 CheckExpectedRanges(expected); 1588
1589 CheckExpectedRanges("{ [0,100) }");
1594 } 1590 }
1595 1591
1596 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodes) { 1592 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodes) {
1597 ASSERT_TRUE(InitDemuxer(true, true, false)); 1593 ASSERT_TRUE(InitDemuxer(true, true, false));
1598 1594
1599 scoped_refptr<DemuxerStream> audio = 1595 scoped_refptr<DemuxerStream> audio =
1600 demuxer_->GetStream(DemuxerStream::AUDIO); 1596 demuxer_->GetStream(DemuxerStream::AUDIO);
1601 scoped_refptr<DemuxerStream> video = 1597 scoped_refptr<DemuxerStream> video =
1602 demuxer_->GetStream(DemuxerStream::VIDEO); 1598 demuxer_->GetStream(DemuxerStream::VIDEO);
1603 1599
(...skipping 21 matching lines...) Expand all
1625 1621
1626 TEST_F(ChunkDemuxerTest, TestCodecPrefixMatching) { 1622 TEST_F(ChunkDemuxerTest, TestCodecPrefixMatching) {
1627 std::vector<std::string> codecs; 1623 std::vector<std::string> codecs;
1628 codecs.push_back("avc1.4D4041"); 1624 codecs.push_back("avc1.4D4041");
1629 codecs.push_back("mp4a.40.2"); 1625 codecs.push_back("mp4a.40.2");
1630 1626
1631 EXPECT_EQ(ChunkDemuxer::kOk, 1627 EXPECT_EQ(ChunkDemuxer::kOk,
1632 demuxer_->AddId("source_id", "video/mp4", codecs)); 1628 demuxer_->AddId("source_id", "video/mp4", codecs));
1633 } 1629 }
1634 1630
1631 TEST_F(ChunkDemuxerTest, TestEndOfStreamFailures) {
1632 std::string audio_id = "audio";
1633 std::string video_id = "video";
1634
1635 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1636
1637 scoped_ptr<Cluster> cluster_a1(
1638 GenerateSingleStreamCluster(0, 15, kAudioTrackNum, 15));
1639 scoped_ptr<Cluster> cluster_v1(
1640 GenerateSingleStreamCluster(0, 5, kVideoTrackNum, 5));
1641 scoped_ptr<Cluster> cluster_v2(
1642 GenerateSingleStreamCluster(5, 10, kVideoTrackNum, 5));
1643 scoped_ptr<Cluster> cluster_v3(
1644 GenerateSingleStreamCluster(10, 20, kVideoTrackNum, 10));
1645
1646 ASSERT_TRUE(AppendData(audio_id, cluster_a1->data(), cluster_a1->size()));
1647 ASSERT_TRUE(AppendData(video_id, cluster_v1->data(), cluster_v1->size()));
1648 ASSERT_TRUE(AppendData(video_id, cluster_v3->data(), cluster_v3->size()));
1649
1650 CheckExpectedRanges(audio_id, "{ [0,15) }");
1651 CheckExpectedRanges(video_id, "{ [0,5) [10,20) }");
1652
1653 // Make sure that end of stream fails because there is a gap between
1654 // the current position(0) and the end of the appended data.
1655 ASSERT_FALSE(demuxer_->EndOfStream(PIPELINE_OK));
1656
1657 // Seek to an time that is inside the last ranges for both streams
1658 // and verify that the EndOfStream() is successful.
1659 demuxer_->StartWaitingForSeek();
1660 demuxer_->Seek(base::TimeDelta::FromMilliseconds(10),
1661 NewExpectedStatusCB(PIPELINE_OK));
1662
1663 ASSERT_TRUE(demuxer_->EndOfStream(PIPELINE_OK));
1664
1665 // Seek back to 0 and verify that EndOfStream() fails again.
1666 demuxer_->StartWaitingForSeek();
1667 demuxer_->Seek(base::TimeDelta::FromMilliseconds(0),
1668 NewExpectedStatusCB(PIPELINE_OK));
1669
1670 ASSERT_FALSE(demuxer_->EndOfStream(PIPELINE_OK));
1671
1672 // Append the missing range and verify that EndOfStream() succeeds now.
1673 ASSERT_TRUE(AppendData(video_id, cluster_v2->data(), cluster_v2->size()));
1674
1675 CheckExpectedRanges(audio_id, "{ [0,15) }");
1676 CheckExpectedRanges(video_id, "{ [0,20) }");
1677
1678 ASSERT_TRUE(demuxer_->EndOfStream(PIPELINE_OK));
1679 }
1680
1635 } // namespace media 1681 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | media/filters/source_buffer_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698