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

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

Issue 2491043003: MediaResource refactoring to support multiple streams (Closed)
Patch Set: rebase Created 3 years, 10 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
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 "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 992 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 kWebMFlagKeyframe); 1003 kWebMFlagKeyframe);
1004 } else { 1004 } else {
1005 cb.AddBlockGroup(track_number, timecode, block_duration, 1005 cb.AddBlockGroup(track_number, timecode, block_duration,
1006 kWebMFlagKeyframe, static_cast<bool>(kWebMFlagKeyframe), 1006 kWebMFlagKeyframe, static_cast<bool>(kWebMFlagKeyframe),
1007 &data[0], data.size()); 1007 &data[0], data.size());
1008 } 1008 }
1009 1009
1010 return cb.Finish(); 1010 return cb.Finish();
1011 } 1011 }
1012 1012
1013 DemuxerStream* GetStream(DemuxerStream::Type type) {
1014 std::vector<DemuxerStream*> streams = demuxer_->GetStreams();
1015 for (const auto& s : streams) {
1016 if (s->type() == type)
1017 return s;
1018 }
1019 return nullptr;
1020 }
1021
1013 void Read(DemuxerStream::Type type, const DemuxerStream::ReadCB& read_cb) { 1022 void Read(DemuxerStream::Type type, const DemuxerStream::ReadCB& read_cb) {
1014 demuxer_->GetStream(type)->Read(read_cb); 1023 GetStream(type)->Read(read_cb);
1015 base::RunLoop().RunUntilIdle(); 1024 base::RunLoop().RunUntilIdle();
1016 } 1025 }
1017 1026
1018 void ReadAudio(const DemuxerStream::ReadCB& read_cb) { 1027 void ReadAudio(const DemuxerStream::ReadCB& read_cb) {
1019 Read(DemuxerStream::AUDIO, read_cb); 1028 Read(DemuxerStream::AUDIO, read_cb);
1020 } 1029 }
1021 1030
1022 void ReadVideo(const DemuxerStream::ReadCB& read_cb) { 1031 void ReadVideo(const DemuxerStream::ReadCB& read_cb) {
1023 Read(DemuxerStream::VIDEO, read_cb); 1032 Read(DemuxerStream::VIDEO, read_cb);
1024 } 1033 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1090 CheckExpectedRangesForMediaSource(expected); 1099 CheckExpectedRangesForMediaSource(expected);
1091 } 1100 }
1092 1101
1093 void CheckExpectedRanges(const std::string& id, const std::string& expected) { 1102 void CheckExpectedRanges(const std::string& id, const std::string& expected) {
1094 CheckExpectedRanges(demuxer_->GetBufferedRanges(id), expected); 1103 CheckExpectedRanges(demuxer_->GetBufferedRanges(id), expected);
1095 } 1104 }
1096 1105
1097 void CheckExpectedRanges(DemuxerStream::Type type, 1106 void CheckExpectedRanges(DemuxerStream::Type type,
1098 const std::string& expected) { 1107 const std::string& expected) {
1099 ChunkDemuxerStream* stream = 1108 ChunkDemuxerStream* stream =
1100 static_cast<ChunkDemuxerStream*>(demuxer_->GetStream(type)); 1109 static_cast<ChunkDemuxerStream*>(GetStream(type));
1101 CheckExpectedRanges(stream->GetBufferedRanges(kDefaultDuration()), 1110 CheckExpectedRanges(stream->GetBufferedRanges(kDefaultDuration()),
1102 expected); 1111 expected);
1103 } 1112 }
1104 1113
1105 void CheckExpectedRanges(const Ranges<base::TimeDelta>& r, 1114 void CheckExpectedRanges(const Ranges<base::TimeDelta>& r,
1106 const std::string& expected) { 1115 const std::string& expected) {
1107 std::stringstream ss; 1116 std::stringstream ss;
1108 ss << "{ "; 1117 ss << "{ ";
1109 for (size_t i = 0; i < r.size(); ++i) { 1118 for (size_t i = 0; i < r.size(); ++i) {
1110 ss << "[" << r.start(i).InMilliseconds() << "," 1119 ss << "[" << r.start(i).InMilliseconds() << ","
(...skipping 10 matching lines...) Expand all
1121 scoped_refptr<DecoderBuffer>* buffer_out, 1130 scoped_refptr<DecoderBuffer>* buffer_out,
1122 DemuxerStream::Status status, 1131 DemuxerStream::Status status,
1123 const scoped_refptr<DecoderBuffer>& buffer) { 1132 const scoped_refptr<DecoderBuffer>& buffer) {
1124 *status_out = status; 1133 *status_out = status;
1125 *buffer_out = buffer; 1134 *buffer_out = buffer;
1126 } 1135 }
1127 1136
1128 void ReadUntilNotOkOrEndOfStream(DemuxerStream::Type type, 1137 void ReadUntilNotOkOrEndOfStream(DemuxerStream::Type type,
1129 DemuxerStream::Status* status, 1138 DemuxerStream::Status* status,
1130 base::TimeDelta* last_timestamp) { 1139 base::TimeDelta* last_timestamp) {
1131 DemuxerStream* stream = demuxer_->GetStream(type); 1140 DemuxerStream* stream = GetStream(type);
1132 scoped_refptr<DecoderBuffer> buffer; 1141 scoped_refptr<DecoderBuffer> buffer;
1133 1142
1134 *last_timestamp = kNoTimestamp; 1143 *last_timestamp = kNoTimestamp;
1135 do { 1144 do {
1136 stream->Read(base::Bind(&ChunkDemuxerTest::StoreStatusAndBuffer, 1145 stream->Read(base::Bind(&ChunkDemuxerTest::StoreStatusAndBuffer,
1137 base::Unretained(this), status, &buffer)); 1146 base::Unretained(this), status, &buffer));
1138 base::RunLoop().RunUntilIdle(); 1147 base::RunLoop().RunUntilIdle();
1139 if (*status == DemuxerStream::kOk && !buffer->end_of_stream()) 1148 if (*status == DemuxerStream::kOk && !buffer->end_of_stream())
1140 *last_timestamp = buffer->timestamp(); 1149 *last_timestamp = buffer->timestamp();
1141 } while (*status == DemuxerStream::kOk && !buffer->end_of_stream()); 1150 } while (*status == DemuxerStream::kOk && !buffer->end_of_stream());
1142 } 1151 }
1143 1152
1144 void ExpectEndOfStream(DemuxerStream::Type type) { 1153 void ExpectEndOfStream(DemuxerStream::Type type) {
1145 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream())); 1154 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream()));
1146 demuxer_->GetStream(type)->Read(base::Bind( 1155 GetStream(type)->Read(
1147 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); 1156 base::Bind(&ChunkDemuxerTest::ReadDone, base::Unretained(this)));
1148 base::RunLoop().RunUntilIdle(); 1157 base::RunLoop().RunUntilIdle();
1149 } 1158 }
1150 1159
1151 void ExpectRead(DemuxerStream::Type type, int64_t timestamp_in_ms) { 1160 void ExpectRead(DemuxerStream::Type type, int64_t timestamp_in_ms) {
1152 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, 1161 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk,
1153 HasTimestamp(timestamp_in_ms))); 1162 HasTimestamp(timestamp_in_ms)));
1154 demuxer_->GetStream(type)->Read(base::Bind( 1163 GetStream(type)->Read(
1155 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); 1164 base::Bind(&ChunkDemuxerTest::ReadDone, base::Unretained(this)));
1156 base::RunLoop().RunUntilIdle(); 1165 base::RunLoop().RunUntilIdle();
1157 } 1166 }
1158 1167
1159 void ExpectConfigChanged(DemuxerStream::Type type) { 1168 void ExpectConfigChanged(DemuxerStream::Type type) {
1160 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _)); 1169 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _));
1161 demuxer_->GetStream(type)->Read(base::Bind( 1170 GetStream(type)->Read(
1162 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); 1171 base::Bind(&ChunkDemuxerTest::ReadDone, base::Unretained(this)));
1163 base::RunLoop().RunUntilIdle(); 1172 base::RunLoop().RunUntilIdle();
1164 } 1173 }
1165 1174
1166 void CheckExpectedBuffers(DemuxerStream* stream, 1175 void CheckExpectedBuffers(DemuxerStream* stream,
1167 const std::string& expected) { 1176 const std::string& expected) {
1168 std::vector<std::string> timestamps = base::SplitString( 1177 std::vector<std::string> timestamps = base::SplitString(
1169 expected, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); 1178 expected, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
1170 std::stringstream ss; 1179 std::stringstream ss;
1171 for (size_t i = 0; i < timestamps.size(); ++i) { 1180 for (size_t i = 0; i < timestamps.size(); ++i) {
1172 // Initialize status to kAborted since it's possible for Read() to return 1181 // Initialize status to kAborted since it's possible for Read() to return
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 stream_flags |= HAS_VIDEO; 1359 stream_flags |= HAS_VIDEO;
1351 1360
1352 if (has_audio || has_video) { 1361 if (has_audio || has_video) {
1353 ASSERT_TRUE(InitDemuxerWithEncryptionInfo( 1362 ASSERT_TRUE(InitDemuxerWithEncryptionInfo(
1354 stream_flags, is_audio_encrypted, is_video_encrypted)); 1363 stream_flags, is_audio_encrypted, is_video_encrypted));
1355 } else { 1364 } else {
1356 ASSERT_FALSE(InitDemuxerWithEncryptionInfo( 1365 ASSERT_FALSE(InitDemuxerWithEncryptionInfo(
1357 stream_flags, is_audio_encrypted, is_video_encrypted)); 1366 stream_flags, is_audio_encrypted, is_video_encrypted));
1358 } 1367 }
1359 1368
1360 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 1369 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
1361 if (has_audio) { 1370 if (has_audio) {
1362 ASSERT_TRUE(audio_stream); 1371 ASSERT_TRUE(audio_stream);
1363 1372
1364 const AudioDecoderConfig& config = audio_stream->audio_decoder_config(); 1373 const AudioDecoderConfig& config = audio_stream->audio_decoder_config();
1365 EXPECT_EQ(kCodecVorbis, config.codec()); 1374 EXPECT_EQ(kCodecVorbis, config.codec());
1366 EXPECT_EQ(32, config.bits_per_channel()); 1375 EXPECT_EQ(32, config.bits_per_channel());
1367 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout()); 1376 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout());
1368 EXPECT_EQ(44100, config.samples_per_second()); 1377 EXPECT_EQ(44100, config.samples_per_second());
1369 EXPECT_GT(config.extra_data().size(), 0u); 1378 EXPECT_GT(config.extra_data().size(), 0u);
1370 EXPECT_EQ(kSampleFormatPlanarF32, config.sample_format()); 1379 EXPECT_EQ(kSampleFormatPlanarF32, config.sample_format());
1371 EXPECT_EQ(is_audio_encrypted, 1380 EXPECT_EQ(is_audio_encrypted,
1372 audio_stream->audio_decoder_config().is_encrypted()); 1381 audio_stream->audio_decoder_config().is_encrypted());
1373 EXPECT_TRUE(static_cast<ChunkDemuxerStream*>(audio_stream) 1382 EXPECT_TRUE(static_cast<ChunkDemuxerStream*>(audio_stream)
1374 ->supports_partial_append_window_trimming()); 1383 ->supports_partial_append_window_trimming());
1375 } else { 1384 } else {
1376 EXPECT_FALSE(audio_stream); 1385 EXPECT_FALSE(audio_stream);
1377 } 1386 }
1378 1387
1379 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 1388 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
1380 if (has_video) { 1389 if (has_video) {
1381 EXPECT_TRUE(video_stream); 1390 EXPECT_TRUE(video_stream);
1382 EXPECT_EQ(is_video_encrypted, 1391 EXPECT_EQ(is_video_encrypted,
1383 video_stream->video_decoder_config().is_encrypted()); 1392 video_stream->video_decoder_config().is_encrypted());
1384 EXPECT_FALSE(static_cast<ChunkDemuxerStream*>(video_stream) 1393 EXPECT_FALSE(static_cast<ChunkDemuxerStream*>(video_stream)
1385 ->supports_partial_append_window_trimming()); 1394 ->supports_partial_append_window_trimming());
1386 } else { 1395 } else {
1387 EXPECT_FALSE(video_stream); 1396 EXPECT_FALSE(video_stream);
1388 } 1397 }
1389 1398
(...skipping 29 matching lines...) Expand all
1419 stream_flags |= HAS_VIDEO; 1428 stream_flags |= HAS_VIDEO;
1420 1429
1421 ASSERT_TRUE(InitDemuxerWithEncryptionInfo( 1430 ASSERT_TRUE(InitDemuxerWithEncryptionInfo(
1422 stream_flags, is_audio_encrypted, is_video_encrypted)); 1431 stream_flags, is_audio_encrypted, is_video_encrypted));
1423 ASSERT_TRUE(text_stream); 1432 ASSERT_TRUE(text_stream);
1424 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); 1433 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type());
1425 EXPECT_EQ(kTextSubtitles, text_config.kind()); 1434 EXPECT_EQ(kTextSubtitles, text_config.kind());
1426 EXPECT_FALSE(static_cast<ChunkDemuxerStream*>(text_stream) 1435 EXPECT_FALSE(static_cast<ChunkDemuxerStream*>(text_stream)
1427 ->supports_partial_append_window_trimming()); 1436 ->supports_partial_append_window_trimming());
1428 1437
1429 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 1438 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
1430 if (has_audio) { 1439 if (has_audio) {
1431 ASSERT_TRUE(audio_stream); 1440 ASSERT_TRUE(audio_stream);
1432 1441
1433 const AudioDecoderConfig& config = audio_stream->audio_decoder_config(); 1442 const AudioDecoderConfig& config = audio_stream->audio_decoder_config();
1434 EXPECT_EQ(kCodecVorbis, config.codec()); 1443 EXPECT_EQ(kCodecVorbis, config.codec());
1435 EXPECT_EQ(32, config.bits_per_channel()); 1444 EXPECT_EQ(32, config.bits_per_channel());
1436 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout()); 1445 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout());
1437 EXPECT_EQ(44100, config.samples_per_second()); 1446 EXPECT_EQ(44100, config.samples_per_second());
1438 EXPECT_GT(config.extra_data().size(), 0u); 1447 EXPECT_GT(config.extra_data().size(), 0u);
1439 EXPECT_EQ(kSampleFormatPlanarF32, config.sample_format()); 1448 EXPECT_EQ(kSampleFormatPlanarF32, config.sample_format());
1440 EXPECT_EQ(is_audio_encrypted, 1449 EXPECT_EQ(is_audio_encrypted,
1441 audio_stream->audio_decoder_config().is_encrypted()); 1450 audio_stream->audio_decoder_config().is_encrypted());
1442 EXPECT_TRUE(static_cast<ChunkDemuxerStream*>(audio_stream) 1451 EXPECT_TRUE(static_cast<ChunkDemuxerStream*>(audio_stream)
1443 ->supports_partial_append_window_trimming()); 1452 ->supports_partial_append_window_trimming());
1444 } else { 1453 } else {
1445 EXPECT_FALSE(audio_stream); 1454 EXPECT_FALSE(audio_stream);
1446 } 1455 }
1447 1456
1448 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 1457 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
1449 if (has_video) { 1458 if (has_video) {
1450 EXPECT_TRUE(video_stream); 1459 EXPECT_TRUE(video_stream);
1451 EXPECT_EQ(is_video_encrypted, 1460 EXPECT_EQ(is_video_encrypted,
1452 video_stream->video_decoder_config().is_encrypted()); 1461 video_stream->video_decoder_config().is_encrypted());
1453 EXPECT_FALSE(static_cast<ChunkDemuxerStream*>(video_stream) 1462 EXPECT_FALSE(static_cast<ChunkDemuxerStream*>(video_stream)
1454 ->supports_partial_append_window_trimming()); 1463 ->supports_partial_append_window_trimming());
1455 } else { 1464 } else {
1456 EXPECT_FALSE(video_stream); 1465 EXPECT_FALSE(video_stream);
1457 } 1466 }
1458 1467
1459 ShutdownDemuxer(); 1468 ShutdownDemuxer();
1460 demuxer_.reset(); 1469 demuxer_.reset();
1461 } 1470 }
1462 } 1471 }
1463 1472
1464 TEST_F(ChunkDemuxerTest, SingleTextTrackIdChange) { 1473 TEST_F(ChunkDemuxerTest, SingleTextTrackIdChange) {
1465 // Test with 1 video stream, 1 audio, and 1 text stream. Send a second init 1474 // Test with 1 video stream, 1 audio, and 1 text stream. Send a second init
1466 // segment in which the text track ID changes. Verify appended buffers before 1475 // segment in which the text track ID changes. Verify appended buffers before
1467 // and after the second init segment map to the same underlying track buffers. 1476 // and after the second init segment map to the same underlying track buffers.
1468 CreateNewDemuxer(); 1477 CreateNewDemuxer();
1469 DemuxerStream* text_stream = NULL; 1478 DemuxerStream* text_stream = NULL;
1470 TextTrackConfig text_config; 1479 TextTrackConfig text_config;
1471 EXPECT_CALL(host_, AddTextStream(_, _)) 1480 EXPECT_CALL(host_, AddTextStream(_, _))
1472 .WillOnce(DoAll(SaveArg<0>(&text_stream), 1481 .WillOnce(DoAll(SaveArg<0>(&text_stream),
1473 SaveArg<1>(&text_config))); 1482 SaveArg<1>(&text_config)));
1474 ASSERT_TRUE(InitDemuxerWithEncryptionInfo( 1483 ASSERT_TRUE(InitDemuxerWithEncryptionInfo(
1475 HAS_TEXT | HAS_AUDIO | HAS_VIDEO, false, false)); 1484 HAS_TEXT | HAS_AUDIO | HAS_VIDEO, false, false));
1476 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 1485 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
1477 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 1486 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
1478 ASSERT_TRUE(audio_stream); 1487 ASSERT_TRUE(audio_stream);
1479 ASSERT_TRUE(video_stream); 1488 ASSERT_TRUE(video_stream);
1480 ASSERT_TRUE(text_stream); 1489 ASSERT_TRUE(text_stream);
1481 1490
1482 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23), 1491 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23),
1483 MuxedStreamInfo(kVideoTrackNum, "0K 30", 30), 1492 MuxedStreamInfo(kVideoTrackNum, "0K 30", 30),
1484 MuxedStreamInfo(kTextTrackNum, "10K")); 1493 MuxedStreamInfo(kTextTrackNum, "10K"));
1485 CheckExpectedRanges("{ [0,46) }"); 1494 CheckExpectedRanges("{ [0,46) }");
1486 1495
1487 std::unique_ptr<uint8_t[]> info_tracks; 1496 std::unique_ptr<uint8_t[]> info_tracks;
(...skipping 21 matching lines...) Expand all
1509 ShutdownDemuxer(); 1518 ShutdownDemuxer();
1510 } 1519 }
1511 1520
1512 TEST_F(ChunkDemuxerTest, AudioVideoTrackIdsChange) { 1521 TEST_F(ChunkDemuxerTest, AudioVideoTrackIdsChange) {
1513 // Test with 1 audio and 1 video stream. Send a second init segment in which 1522 // Test with 1 audio and 1 video stream. Send a second init segment in which
1514 // the audio and video track IDs change. Verify that appended buffers before 1523 // the audio and video track IDs change. Verify that appended buffers before
1515 // and after the second init segment map to the same underlying track buffers. 1524 // and after the second init segment map to the same underlying track buffers.
1516 CreateNewDemuxer(); 1525 CreateNewDemuxer();
1517 ASSERT_TRUE( 1526 ASSERT_TRUE(
1518 InitDemuxerWithEncryptionInfo(HAS_AUDIO | HAS_VIDEO, false, false)); 1527 InitDemuxerWithEncryptionInfo(HAS_AUDIO | HAS_VIDEO, false, false));
1519 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 1528 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
1520 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 1529 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
1521 ASSERT_TRUE(audio_stream); 1530 ASSERT_TRUE(audio_stream);
1522 ASSERT_TRUE(video_stream); 1531 ASSERT_TRUE(video_stream);
1523 1532
1524 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23), 1533 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23),
1525 MuxedStreamInfo(kVideoTrackNum, "0K 30", 30)); 1534 MuxedStreamInfo(kVideoTrackNum, "0K 30", 30));
1526 CheckExpectedRanges("{ [0,46) }"); 1535 CheckExpectedRanges("{ [0,46) }");
1527 1536
1528 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 1537 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
1529 ASSERT_TRUE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO | 1538 ASSERT_TRUE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO |
1530 USE_ALTERNATE_AUDIO_TRACK_ID | 1539 USE_ALTERNATE_AUDIO_TRACK_ID |
(...skipping 13 matching lines...) Expand all
1544 // algorithm correctly sets the needs random access point flag to true for all 1553 // algorithm correctly sets the needs random access point flag to true for all
1545 // track buffers. Note that the first initialization segment is insufficient 1554 // track buffers. Note that the first initialization segment is insufficient
1546 // to fully test this since needs random access point flag initializes to 1555 // to fully test this since needs random access point flag initializes to
1547 // true. 1556 // true.
1548 CreateNewDemuxer(); 1557 CreateNewDemuxer();
1549 DemuxerStream* text_stream = NULL; 1558 DemuxerStream* text_stream = NULL;
1550 EXPECT_CALL(host_, AddTextStream(_, _)) 1559 EXPECT_CALL(host_, AddTextStream(_, _))
1551 .WillOnce(SaveArg<0>(&text_stream)); 1560 .WillOnce(SaveArg<0>(&text_stream));
1552 ASSERT_TRUE(InitDemuxerWithEncryptionInfo( 1561 ASSERT_TRUE(InitDemuxerWithEncryptionInfo(
1553 HAS_TEXT | HAS_AUDIO | HAS_VIDEO, false, false)); 1562 HAS_TEXT | HAS_AUDIO | HAS_VIDEO, false, false));
1554 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 1563 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
1555 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 1564 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
1556 ASSERT_TRUE(audio_stream && video_stream && text_stream); 1565 ASSERT_TRUE(audio_stream && video_stream && text_stream);
1557 1566
1558 AppendMuxedCluster( 1567 AppendMuxedCluster(
1559 MuxedStreamInfo(kAudioTrackNum, "23K", 1568 MuxedStreamInfo(kAudioTrackNum, "23K",
1560 WebMClusterParser::kDefaultAudioBufferDurationInMs), 1569 WebMClusterParser::kDefaultAudioBufferDurationInMs),
1561 MuxedStreamInfo(kVideoTrackNum, "0 30K", 30), 1570 MuxedStreamInfo(kVideoTrackNum, "0 30K", 30),
1562 MuxedStreamInfo(kTextTrackNum, "25K 40K")); 1571 MuxedStreamInfo(kTextTrackNum, "25K 40K"));
1563 CheckExpectedRanges("{ [23,46) }"); 1572 CheckExpectedRanges("{ [23,46) }");
1564 1573
1565 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 1574 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1611 } 1620 }
1612 1621
1613 // Verifies that all streams waiting for data receive an end of stream 1622 // Verifies that all streams waiting for data receive an end of stream
1614 // buffer when Shutdown() is called. 1623 // buffer when Shutdown() is called.
1615 TEST_F(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) { 1624 TEST_F(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) {
1616 DemuxerStream* text_stream = NULL; 1625 DemuxerStream* text_stream = NULL;
1617 EXPECT_CALL(host_, AddTextStream(_, _)) 1626 EXPECT_CALL(host_, AddTextStream(_, _))
1618 .WillOnce(SaveArg<0>(&text_stream)); 1627 .WillOnce(SaveArg<0>(&text_stream));
1619 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT)); 1628 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
1620 1629
1621 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 1630 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
1622 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 1631 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
1623 1632
1624 bool audio_read_done = false; 1633 bool audio_read_done = false;
1625 bool video_read_done = false; 1634 bool video_read_done = false;
1626 bool text_read_done = false; 1635 bool text_read_done = false;
1627 audio_stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); 1636 audio_stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done));
1628 video_stream->Read(base::Bind(&OnReadDone_EOSExpected, &video_read_done)); 1637 video_stream->Read(base::Bind(&OnReadDone_EOSExpected, &video_read_done));
1629 text_stream->Read(base::Bind(&OnReadDone_EOSExpected, &text_read_done)); 1638 text_stream->Read(base::Bind(&OnReadDone_EOSExpected, &text_read_done));
1630 base::RunLoop().RunUntilIdle(); 1639 base::RunLoop().RunUntilIdle();
1631 1640
1632 EXPECT_FALSE(audio_read_done); 1641 EXPECT_FALSE(audio_read_done);
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1732 ReadVideo(base::Bind(&OnReadDone, 1741 ReadVideo(base::Bind(&OnReadDone,
1733 base::TimeDelta::FromMilliseconds(0), 1742 base::TimeDelta::FromMilliseconds(0),
1734 &video_read_done)); 1743 &video_read_done));
1735 1744
1736 EXPECT_TRUE(audio_read_done); 1745 EXPECT_TRUE(audio_read_done);
1737 EXPECT_TRUE(video_read_done); 1746 EXPECT_TRUE(video_read_done);
1738 } 1747 }
1739 1748
1740 TEST_F(ChunkDemuxerTest, OutOfOrderClusters) { 1749 TEST_F(ChunkDemuxerTest, OutOfOrderClusters) {
1741 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1750 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1742 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 1751 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
1743 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 1752 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
1744 1753
1745 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster())); 1754 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1746 CheckExpectedBuffers(audio_stream, "0K 23K"); 1755 CheckExpectedBuffers(audio_stream, "0K 23K");
1747 CheckExpectedBuffers(video_stream, "0K 33"); 1756 CheckExpectedBuffers(video_stream, "0K 33");
1748 // Note: splice trimming changes durations. These are verified in lower level 1757 // Note: splice trimming changes durations. These are verified in lower level
1749 // tests. See SourceBufferStreamTest.Audio_SpliceTrimmingForOverlap. 1758 // tests. See SourceBufferStreamTest.Audio_SpliceTrimmingForOverlap.
1750 EXPECT_MEDIA_LOG(TrimmedSpliceOverlap(10000, 0, 13000)); 1759 EXPECT_MEDIA_LOG(TrimmedSpliceOverlap(10000, 0, 13000));
1751 ASSERT_TRUE(AppendCluster(GenerateCluster(10, 4))); 1760 ASSERT_TRUE(AppendCluster(GenerateCluster(10, 4)));
1752 Seek(base::TimeDelta()); 1761 Seek(base::TimeDelta());
1753 CheckExpectedBuffers(audio_stream, "0K 10K 33K"); 1762 CheckExpectedBuffers(audio_stream, "0K 10K 33K");
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1924 : demuxer_(demuxer), 1933 : demuxer_(demuxer),
1925 audio_read_done_(false), 1934 audio_read_done_(false),
1926 video_read_done_(false) { 1935 video_read_done_(false) {
1927 } 1936 }
1928 1937
1929 // Request a read on the audio and video streams. 1938 // Request a read on the audio and video streams.
1930 void RequestReads() { 1939 void RequestReads() {
1931 EXPECT_FALSE(audio_read_done_); 1940 EXPECT_FALSE(audio_read_done_);
1932 EXPECT_FALSE(video_read_done_); 1941 EXPECT_FALSE(video_read_done_);
1933 1942
1934 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); 1943 std::vector<DemuxerStream*> streams = demuxer_->GetStreams();
1935 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); 1944 EXPECT_EQ(2u, streams.size());
1945
1946 DemuxerStream* audio = nullptr;
1947 DemuxerStream* video = nullptr;
1948
1949 if (streams[0]->type() == DemuxerStream::AUDIO) {
1950 audio = streams[0];
1951 video = streams[1];
1952 } else {
1953 audio = streams[1];
1954 video = streams[0];
1955 }
1956 DCHECK_EQ(DemuxerStream::AUDIO, audio->type());
1957 DCHECK_EQ(DemuxerStream::VIDEO, video->type());
1936 1958
1937 audio->Read(base::Bind(&OnEndOfStreamReadDone, &audio_read_done_)); 1959 audio->Read(base::Bind(&OnEndOfStreamReadDone, &audio_read_done_));
1938 video->Read(base::Bind(&OnEndOfStreamReadDone, &video_read_done_)); 1960 video->Read(base::Bind(&OnEndOfStreamReadDone, &video_read_done_));
1939 base::RunLoop().RunUntilIdle(); 1961 base::RunLoop().RunUntilIdle();
1940 } 1962 }
1941 1963
1942 // Check to see if |audio_read_done_| and |video_read_done_| variables 1964 // Check to see if |audio_read_done_| and |video_read_done_| variables
1943 // match |expected|. 1965 // match |expected|.
1944 void CheckIfReadDonesWereCalled(bool expected) { 1966 void CheckIfReadDonesWereCalled(bool expected) {
1945 base::RunLoop().RunUntilIdle(); 1967 base::RunLoop().RunUntilIdle();
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
2176 {100, 9}, 2198 {100, 9},
2177 {133, 12}, 2199 {133, 12},
2178 {kSkip, kSkip}, 2200 {kSkip, kSkip},
2179 }; 2201 };
2180 2202
2181 ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO); 2203 ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
2182 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)).Times(7); 2204 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)).Times(7);
2183 ASSERT_TRUE(ParseWebMFile("bear-320x240-live.webm", buffer_timestamps, 2205 ASSERT_TRUE(ParseWebMFile("bear-320x240-live.webm", buffer_timestamps,
2184 kInfiniteDuration)); 2206 kInfiniteDuration));
2185 2207
2186 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); 2208 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO);
2187 EXPECT_EQ(DemuxerStream::LIVENESS_LIVE, audio->liveness()); 2209 EXPECT_EQ(DemuxerStream::LIVENESS_LIVE, audio->liveness());
2188 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); 2210 DemuxerStream* video = GetStream(DemuxerStream::VIDEO);
2189 EXPECT_EQ(DemuxerStream::LIVENESS_LIVE, video->liveness()); 2211 EXPECT_EQ(DemuxerStream::LIVENESS_LIVE, video->liveness());
2190 EXPECT_EQ(212949, demuxer_->GetMemoryUsage()); 2212 EXPECT_EQ(212949, demuxer_->GetMemoryUsage());
2191 } 2213 }
2192 2214
2193 TEST_F(ChunkDemuxerTest, WebMFile_AudioOnly) { 2215 TEST_F(ChunkDemuxerTest, WebMFile_AudioOnly) {
2194 struct BufferTimestamps buffer_timestamps[] = { 2216 struct BufferTimestamps buffer_timestamps[] = {
2195 {kSkip, 0}, 2217 {kSkip, 0},
2196 {kSkip, 3}, 2218 {kSkip, 3},
2197 {kSkip, 6}, 2219 {kSkip, 6},
2198 {kSkip, 9}, 2220 {kSkip, 9},
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
2478 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration))); 2500 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
2479 ASSERT_TRUE(AppendCluster(video_id, 2501 ASSERT_TRUE(AppendCluster(video_id,
2480 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, 2502 GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
2481 kVideoBlockDuration))); 2503 kVideoBlockDuration)));
2482 2504
2483 // Read() from audio should return normal buffers. 2505 // Read() from audio should return normal buffers.
2484 GenerateAudioStreamExpectedReads(0, 4); 2506 GenerateAudioStreamExpectedReads(0, 4);
2485 2507
2486 // Audio stream will become inaccessible after |audio_id| is removed, so save 2508 // Audio stream will become inaccessible after |audio_id| is removed, so save
2487 // it here to read from it after RemoveId. 2509 // it here to read from it after RemoveId.
2488 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 2510 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
2489 2511
2490 // Remove the audio id. 2512 // Remove the audio id.
2491 demuxer_->RemoveId(audio_id); 2513 demuxer_->RemoveId(audio_id);
2492 2514
2493 // Read() from audio should return "end of stream" buffers. 2515 // Read() from audio should return "end of stream" buffers.
2494 bool audio_read_done = false; 2516 bool audio_read_done = false;
2495 audio_stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); 2517 audio_stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done));
2496 base::RunLoop().RunUntilIdle(); 2518 base::RunLoop().RunUntilIdle();
2497 EXPECT_TRUE(audio_read_done); 2519 EXPECT_TRUE(audio_read_done);
2498 2520
(...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after
3179 } 3201 }
3180 3202
3181 TEST_F(ChunkDemuxerTest, ConfigChange_Video) { 3203 TEST_F(ChunkDemuxerTest, ConfigChange_Video) {
3182 InSequence s; 3204 InSequence s;
3183 3205
3184 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); 3206 ASSERT_TRUE(InitDemuxerWithConfigChangeData());
3185 3207
3186 DemuxerStream::Status status; 3208 DemuxerStream::Status status;
3187 base::TimeDelta last_timestamp; 3209 base::TimeDelta last_timestamp;
3188 3210
3189 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); 3211 DemuxerStream* video = GetStream(DemuxerStream::VIDEO);
3190 3212
3191 // Fetch initial video config and verify it matches what we expect. 3213 // Fetch initial video config and verify it matches what we expect.
3192 const VideoDecoderConfig& video_config_1 = video->video_decoder_config(); 3214 const VideoDecoderConfig& video_config_1 = video->video_decoder_config();
3193 ASSERT_TRUE(video_config_1.IsValidConfig()); 3215 ASSERT_TRUE(video_config_1.IsValidConfig());
3194 EXPECT_EQ(video_config_1.natural_size().width(), 320); 3216 EXPECT_EQ(video_config_1.natural_size().width(), 320);
3195 EXPECT_EQ(video_config_1.natural_size().height(), 240); 3217 EXPECT_EQ(video_config_1.natural_size().height(), 240);
3196 3218
3197 ExpectRead(DemuxerStream::VIDEO, 0); 3219 ExpectRead(DemuxerStream::VIDEO, 0);
3198 3220
3199 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); 3221 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
(...skipping 26 matching lines...) Expand all
3226 } 3248 }
3227 3249
3228 TEST_F(ChunkDemuxerTest, ConfigChange_Audio) { 3250 TEST_F(ChunkDemuxerTest, ConfigChange_Audio) {
3229 InSequence s; 3251 InSequence s;
3230 3252
3231 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); 3253 ASSERT_TRUE(InitDemuxerWithConfigChangeData());
3232 3254
3233 DemuxerStream::Status status; 3255 DemuxerStream::Status status;
3234 base::TimeDelta last_timestamp; 3256 base::TimeDelta last_timestamp;
3235 3257
3236 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); 3258 DemuxerStream* audio = GetStream(DemuxerStream::AUDIO);
3237 3259
3238 // Fetch initial audio config and verify it matches what we expect. 3260 // Fetch initial audio config and verify it matches what we expect.
3239 const AudioDecoderConfig& audio_config_1 = audio->audio_decoder_config(); 3261 const AudioDecoderConfig& audio_config_1 = audio->audio_decoder_config();
3240 ASSERT_TRUE(audio_config_1.IsValidConfig()); 3262 ASSERT_TRUE(audio_config_1.IsValidConfig());
3241 EXPECT_EQ(audio_config_1.samples_per_second(), 44100); 3263 EXPECT_EQ(audio_config_1.samples_per_second(), 44100);
3242 EXPECT_EQ(audio_config_1.extra_data().size(), 3863u); 3264 EXPECT_EQ(audio_config_1.extra_data().size(), 3863u);
3243 3265
3244 ExpectRead(DemuxerStream::AUDIO, 0); 3266 ExpectRead(DemuxerStream::AUDIO, 0);
3245 3267
3246 // Read until we encounter config 2. 3268 // Read until we encounter config 2.
(...skipping 18 matching lines...) Expand all
3265 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 3287 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
3266 ASSERT_EQ(status, DemuxerStream::kOk); 3288 ASSERT_EQ(status, DemuxerStream::kOk);
3267 EXPECT_EQ(last_timestamp.InMilliseconds(), 2744); 3289 EXPECT_EQ(last_timestamp.InMilliseconds(), 2744);
3268 } 3290 }
3269 3291
3270 TEST_F(ChunkDemuxerTest, ConfigChange_Seek) { 3292 TEST_F(ChunkDemuxerTest, ConfigChange_Seek) {
3271 InSequence s; 3293 InSequence s;
3272 3294
3273 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); 3295 ASSERT_TRUE(InitDemuxerWithConfigChangeData());
3274 3296
3275 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); 3297 DemuxerStream* video = GetStream(DemuxerStream::VIDEO);
3276 3298
3277 // Fetch initial video config and verify it matches what we expect. 3299 // Fetch initial video config and verify it matches what we expect.
3278 const VideoDecoderConfig& video_config_1 = video->video_decoder_config(); 3300 const VideoDecoderConfig& video_config_1 = video->video_decoder_config();
3279 ASSERT_TRUE(video_config_1.IsValidConfig()); 3301 ASSERT_TRUE(video_config_1.IsValidConfig());
3280 EXPECT_EQ(video_config_1.natural_size().width(), 320); 3302 EXPECT_EQ(video_config_1.natural_size().width(), 320);
3281 EXPECT_EQ(video_config_1.natural_size().height(), 240); 3303 EXPECT_EQ(video_config_1.natural_size().height(), 240);
3282 3304
3283 ExpectRead(DemuxerStream::VIDEO, 0); 3305 ExpectRead(DemuxerStream::VIDEO, 0);
3284 3306
3285 // Seek to a location with a different config. 3307 // Seek to a location with a different config.
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after
3978 Seek(seek_time3); 4000 Seek(seek_time3);
3979 EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time3, 0)); 4001 EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time3, 0));
3980 // Strictly speaking the current playback time is 23*6==138ms, so we could 4002 // Strictly speaking the current playback time is 23*6==138ms, so we could
3981 // release data up to 138ms, but we only release as much data as necessary 4003 // release data up to 138ms, but we only release as much data as necessary
3982 // to bring memory usage under the limit, so we release only up to 115ms. 4004 // to bring memory usage under the limit, so we release only up to 115ms.
3983 CheckExpectedRanges("{ [115,230) }"); 4005 CheckExpectedRanges("{ [115,230) }");
3984 } 4006 }
3985 4007
3986 TEST_F(ChunkDemuxerTest, AppendWindow_Video) { 4008 TEST_F(ChunkDemuxerTest, AppendWindow_Video) {
3987 ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); 4009 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
3988 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4010 DemuxerStream* stream = GetStream(DemuxerStream::VIDEO);
3989 4011
3990 // Set the append window to [50,280). 4012 // Set the append window to [50,280).
3991 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50); 4013 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50);
3992 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280); 4014 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
3993 4015
3994 // Append a cluster that starts before and ends after the append window. 4016 // Append a cluster that starts before and ends after the append window.
3995 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30)); 4017 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30));
3996 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 4018 AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
3997 "0K 30 60 90 120K 150 180 210 240K 270 300 330K"); 4019 "0K 30 60 90 120K 150 180 210 240K 270 300 330K");
3998 4020
3999 // Verify that GOPs that start outside the window are not included 4021 // Verify that GOPs that start outside the window are not included
4000 // in the buffer. Also verify that buffers that start inside the 4022 // in the buffer. Also verify that buffers that start inside the
4001 // window and extend beyond the end of the window are not included. 4023 // window and extend beyond the end of the window are not included.
4002 CheckExpectedRanges("{ [120,270) }"); 4024 CheckExpectedRanges("{ [120,270) }");
4003 CheckExpectedBuffers(stream, "120K 150 180 210 240K"); 4025 CheckExpectedBuffers(stream, "120K 150 180 210 240K");
4004 4026
4005 // Extend the append window to [50,650). 4027 // Extend the append window to [50,650).
4006 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650); 4028 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650);
4007 4029
4008 // Append more data and verify that adding buffers start at the next 4030 // Append more data and verify that adding buffers start at the next
4009 // key frame. 4031 // key frame.
4010 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30)); 4032 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30));
4011 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 4033 AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
4012 "360 390 420K 450 480 510 540K 570 600 630K"); 4034 "360 390 420K 450 480 510 540K 570 600 630K");
4013 CheckExpectedRanges("{ [120,270) [420,630) }"); 4035 CheckExpectedRanges("{ [120,270) [420,630) }");
4014 } 4036 }
4015 4037
4016 TEST_F(ChunkDemuxerTest, AppendWindow_Audio) { 4038 TEST_F(ChunkDemuxerTest, AppendWindow_Audio) {
4017 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); 4039 ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
4018 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4040 DemuxerStream* stream = GetStream(DemuxerStream::AUDIO);
4019 4041
4020 // Set the append window to [50,280). 4042 // Set the append window to [50,280).
4021 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50); 4043 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(50);
4022 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280); 4044 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
4023 4045
4024 // Append a cluster that starts before and ends after the append window. 4046 // Append a cluster that starts before and ends after the append window.
4025 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30)); 4047 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30));
4026 AppendSingleStreamCluster( 4048 AppendSingleStreamCluster(
4027 kSourceId, kAudioTrackNum, 4049 kSourceId, kAudioTrackNum,
4028 "0K 30K 60K 90K 120K 150K 180K 210K 240K 270K 300K 330K"); 4050 "0K 30K 60K 90K 120K 150K 180K 210K 240K 270K 300K 330K");
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
4081 // Read a WebM file into memory and send the data to the demuxer. The chunk 4103 // Read a WebM file into memory and send the data to the demuxer. The chunk
4082 // size has been chosen carefully to ensure the preroll buffer used by the 4104 // size has been chosen carefully to ensure the preroll buffer used by the
4083 // partial append window trim must come from a previous Append() call. 4105 // partial append window trim must come from a previous Append() call.
4084 scoped_refptr<DecoderBuffer> buffer = 4106 scoped_refptr<DecoderBuffer> buffer =
4085 ReadTestDataFile("bear-320x240-audio-only.webm"); 4107 ReadTestDataFile("bear-320x240-audio-only.webm");
4086 ExpectInitMediaLogs(HAS_AUDIO); 4108 ExpectInitMediaLogs(HAS_AUDIO);
4087 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 4109 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
4088 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)); 4110 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
4089 ASSERT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 128)); 4111 ASSERT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 128));
4090 4112
4091 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4113 DemuxerStream* stream = GetStream(DemuxerStream::AUDIO);
4092 CheckExpectedBuffers(stream, "50KP 50K 62K 86K 109K 122K 125K 128K"); 4114 CheckExpectedBuffers(stream, "50KP 50K 62K 86K 109K 122K 125K 128K");
4093 } 4115 }
4094 4116
4095 TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) { 4117 TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) {
4096 EXPECT_CALL(*this, DemuxerOpened()); 4118 EXPECT_CALL(*this, DemuxerOpened());
4097 demuxer_->Initialize( 4119 demuxer_->Initialize(
4098 &host_, 4120 &host_,
4099 CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK), 4121 CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK),
4100 true); 4122 true);
4101 ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO)); 4123 ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO));
4102 4124
4103 // Set the append window such that the first file is completely before the 4125 // Set the append window such that the first file is completely before the
4104 // append window. 4126 // append window.
4105 // Expect duration adjustment since actual duration differs slightly from 4127 // Expect duration adjustment since actual duration differs slightly from
4106 // duration in the init segment. 4128 // duration in the init segment.
4107 const base::TimeDelta duration_1 = base::TimeDelta::FromMilliseconds(2746); 4129 const base::TimeDelta duration_1 = base::TimeDelta::FromMilliseconds(2746);
4108 append_window_start_for_next_append_ = duration_1; 4130 append_window_start_for_next_append_ = duration_1;
4109 4131
4110 // Read a WebM file into memory and append the data. 4132 // Read a WebM file into memory and append the data.
4111 scoped_refptr<DecoderBuffer> buffer = 4133 scoped_refptr<DecoderBuffer> buffer =
4112 ReadTestDataFile("bear-320x240-audio-only.webm"); 4134 ReadTestDataFile("bear-320x240-audio-only.webm");
4113 ExpectInitMediaLogs(HAS_AUDIO); 4135 ExpectInitMediaLogs(HAS_AUDIO);
4114 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 4136 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
4115 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)); 4137 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
4116 ASSERT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512)); 4138 ASSERT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
4117 CheckExpectedRanges("{ }"); 4139 CheckExpectedRanges("{ }");
4118 4140
4119 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4141 DemuxerStream* stream = GetStream(DemuxerStream::AUDIO);
4120 AudioDecoderConfig config_1 = stream->audio_decoder_config(); 4142 AudioDecoderConfig config_1 = stream->audio_decoder_config();
4121 4143
4122 // Read a second WebM with a different config in and append the data. 4144 // Read a second WebM with a different config in and append the data.
4123 scoped_refptr<DecoderBuffer> buffer2 = 4145 scoped_refptr<DecoderBuffer> buffer2 =
4124 ReadTestDataFile("bear-320x240-audio-only-48khz.webm"); 4146 ReadTestDataFile("bear-320x240-audio-only-48khz.webm");
4125 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 4147 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
4126 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(21)); 4148 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(21));
4127 EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber()); 4149 EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber());
4128 ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1)); 4150 ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1));
4129 ASSERT_TRUE(AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512)); 4151 ASSERT_TRUE(AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512));
4130 CheckExpectedRanges("{ [2746,5519) }"); 4152 CheckExpectedRanges("{ [2746,5519) }");
4131 4153
4132 Seek(duration_1); 4154 Seek(duration_1);
4133 ExpectConfigChanged(DemuxerStream::AUDIO); 4155 ExpectConfigChanged(DemuxerStream::AUDIO);
4134 ASSERT_FALSE(config_1.Matches(stream->audio_decoder_config())); 4156 ASSERT_FALSE(config_1.Matches(stream->audio_decoder_config()));
4135 CheckExpectedBuffers(stream, "2746K 2767K 2789K 2810K"); 4157 CheckExpectedBuffers(stream, "2746K 2767K 2789K 2810K");
4136 } 4158 }
4137 4159
4138 TEST_F(ChunkDemuxerTest, AppendWindow_Text) { 4160 TEST_F(ChunkDemuxerTest, AppendWindow_Text) {
4139 DemuxerStream* text_stream = NULL; 4161 DemuxerStream* text_stream = NULL;
4140 EXPECT_CALL(host_, AddTextStream(_, _)) 4162 EXPECT_CALL(host_, AddTextStream(_, _))
4141 .WillOnce(SaveArg<0>(&text_stream)); 4163 .WillOnce(SaveArg<0>(&text_stream));
4142 ASSERT_TRUE(InitDemuxer(HAS_VIDEO | HAS_TEXT)); 4164 ASSERT_TRUE(InitDemuxer(HAS_VIDEO | HAS_TEXT));
4143 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4165 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
4144 4166
4145 // Set the append window to [20,280). 4167 // Set the append window to [20,280).
4146 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20); 4168 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20);
4147 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280); 4169 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
4148 4170
4149 // Append a cluster that starts before and ends after the append 4171 // Append a cluster that starts before and ends after the append
4150 // window. 4172 // window.
4151 AppendMuxedCluster( 4173 AppendMuxedCluster(
4152 MuxedStreamInfo(kVideoTrackNum, 4174 MuxedStreamInfo(kVideoTrackNum,
4153 "0K 30 60 90 120K 150 180 210 240K 270 300 330K", 30), 4175 "0K 30 60 90 120K 150 180 210 240K 270 300 330K", 30),
(...skipping 30 matching lines...) Expand all
4184 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(50); 4206 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(50);
4185 demuxer_->StartWaitingForSeek(seek_time); 4207 demuxer_->StartWaitingForSeek(seek_time);
4186 } 4208 }
4187 4209
4188 TEST_F(ChunkDemuxerTest, Remove_AudioVideoText) { 4210 TEST_F(ChunkDemuxerTest, Remove_AudioVideoText) {
4189 DemuxerStream* text_stream = NULL; 4211 DemuxerStream* text_stream = NULL;
4190 EXPECT_CALL(host_, AddTextStream(_, _)) 4212 EXPECT_CALL(host_, AddTextStream(_, _))
4191 .WillOnce(SaveArg<0>(&text_stream)); 4213 .WillOnce(SaveArg<0>(&text_stream));
4192 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT)); 4214 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
4193 4215
4194 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4216 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
4195 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4217 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
4196 4218
4197 AppendMuxedCluster( 4219 AppendMuxedCluster(
4198 MuxedStreamInfo(kAudioTrackNum, "0K 20K 40K 60K 80K 100K 120K 140K", 20), 4220 MuxedStreamInfo(kAudioTrackNum, "0K 20K 40K 60K 80K 100K 120K 140K", 20),
4199 MuxedStreamInfo(kVideoTrackNum, "0K 30 60 90 120K 150 180", 30), 4221 MuxedStreamInfo(kVideoTrackNum, "0K 30 60 90 120K 150 180", 30),
4200 MuxedStreamInfo(kTextTrackNum, "0K 100K 200K")); 4222 MuxedStreamInfo(kTextTrackNum, "0K 100K 200K"));
4201 4223
4202 CheckExpectedBuffers(audio_stream, "0K 20K 40K 60K 80K 100K 120K 140K"); 4224 CheckExpectedBuffers(audio_stream, "0K 20K 40K 60K 80K 100K 120K 140K");
4203 CheckExpectedBuffers(video_stream, "0K 30 60 90 120K 150 180"); 4225 CheckExpectedBuffers(video_stream, "0K 30 60 90 120K 150 180");
4204 CheckExpectedBuffers(text_stream, "0K 100K 200K"); 4226 CheckExpectedBuffers(text_stream, "0K 100K 200K");
4205 4227
(...skipping 12 matching lines...) Expand all
4218 MuxedStreamInfo(kTextTrackNum, "1K 101K 201K")); 4240 MuxedStreamInfo(kTextTrackNum, "1K 101K 201K"));
4219 4241
4220 Seek(base::TimeDelta()); 4242 Seek(base::TimeDelta());
4221 CheckExpectedBuffers(audio_stream, "1K 21K 41K 61K 81K 101K 121K 141K"); 4243 CheckExpectedBuffers(audio_stream, "1K 21K 41K 61K 81K 101K 121K 141K");
4222 CheckExpectedBuffers(video_stream, "1K 31 61 91 121K 151 181"); 4244 CheckExpectedBuffers(video_stream, "1K 31 61 91 121K 151 181");
4223 CheckExpectedBuffers(text_stream, "1K 101K 201K"); 4245 CheckExpectedBuffers(text_stream, "1K 101K 201K");
4224 } 4246 }
4225 4247
4226 TEST_F(ChunkDemuxerTest, Remove_StartAtDuration) { 4248 TEST_F(ChunkDemuxerTest, Remove_StartAtDuration) {
4227 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); 4249 ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
4228 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4250 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
4229 4251
4230 // Set the duration to something small so that the append that 4252 // Set the duration to something small so that the append that
4231 // follows updates the duration to reflect the end of the appended data. 4253 // follows updates the duration to reflect the end of the appended data.
4232 EXPECT_CALL(host_, SetDuration( 4254 EXPECT_CALL(host_, SetDuration(
4233 base::TimeDelta::FromMilliseconds(1))); 4255 base::TimeDelta::FromMilliseconds(1)));
4234 demuxer_->SetDuration(0.001); 4256 demuxer_->SetDuration(0.001);
4235 4257
4236 EXPECT_CALL(host_, SetDuration( 4258 EXPECT_CALL(host_, SetDuration(
4237 base::TimeDelta::FromMilliseconds(160))); 4259 base::TimeDelta::FromMilliseconds(160)));
4238 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 4260 AppendSingleStreamCluster(kSourceId, kAudioTrackNum,
(...skipping 13 matching lines...) Expand all
4252 4274
4253 // Verifies that a Seek() will complete without text cues for 4275 // Verifies that a Seek() will complete without text cues for
4254 // the seek point and will return cues after the seek position 4276 // the seek point and will return cues after the seek position
4255 // when they are eventually appended. 4277 // when they are eventually appended.
4256 TEST_F(ChunkDemuxerTest, SeekCompletesWithoutTextCues) { 4278 TEST_F(ChunkDemuxerTest, SeekCompletesWithoutTextCues) {
4257 DemuxerStream* text_stream = NULL; 4279 DemuxerStream* text_stream = NULL;
4258 EXPECT_CALL(host_, AddTextStream(_, _)) 4280 EXPECT_CALL(host_, AddTextStream(_, _))
4259 .WillOnce(SaveArg<0>(&text_stream)); 4281 .WillOnce(SaveArg<0>(&text_stream));
4260 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT)); 4282 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
4261 4283
4262 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4284 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
4263 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4285 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
4264 4286
4265 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(120); 4287 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(120);
4266 bool seek_cb_was_called = false; 4288 bool seek_cb_was_called = false;
4267 demuxer_->StartWaitingForSeek(seek_time); 4289 demuxer_->StartWaitingForSeek(seek_time);
4268 demuxer_->Seek(seek_time, 4290 demuxer_->Seek(seek_time,
4269 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); 4291 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called));
4270 base::RunLoop().RunUntilIdle(); 4292 base::RunLoop().RunUntilIdle();
4271 4293
4272 EXPECT_FALSE(seek_cb_was_called); 4294 EXPECT_FALSE(seek_cb_was_called);
4273 4295
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
4341 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 0, 4))); 4363 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 0, 4)));
4342 ASSERT_TRUE(AppendData(kCuesHeader, sizeof(kCuesHeader))); 4364 ASSERT_TRUE(AppendData(kCuesHeader, sizeof(kCuesHeader)));
4343 ASSERT_TRUE(AppendCluster(GenerateCluster(46, 66, 5))); 4365 ASSERT_TRUE(AppendCluster(GenerateCluster(46, 66, 5)));
4344 CheckExpectedRanges("{ [0,115) }"); 4366 CheckExpectedRanges("{ [0,115) }");
4345 } 4367 }
4346 4368
4347 TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) { 4369 TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) {
4348 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4370 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4349 demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, 10 * kBlockSize); 4371 demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, 10 * kBlockSize);
4350 demuxer_->SetMemoryLimitsForTest(DemuxerStream::VIDEO, 15 * kBlockSize); 4372 demuxer_->SetMemoryLimitsForTest(DemuxerStream::VIDEO, 15 * kBlockSize);
4351 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4373 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
4352 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4374 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
4353 4375
4354 const char* kAudioStreamInfo = "0K 40K 80K 120K 160K 200K 240K 280K"; 4376 const char* kAudioStreamInfo = "0K 40K 80K 120K 160K 200K 240K 280K";
4355 const char* kVideoStreamInfo = "0K 10 20K 30 40K 50 60K 70 80K 90 100K " 4377 const char* kVideoStreamInfo = "0K 10 20K 30 40K 50 60K 70 80K 90 100K "
4356 "110 120K 130 140K"; 4378 "110 120K 130 140K";
4357 // Append 8 blocks (80 bytes) of data to audio stream and 15 blocks (150 4379 // Append 8 blocks (80 bytes) of data to audio stream and 15 blocks (150
4358 // bytes) to video stream. 4380 // bytes) to video stream.
4359 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, kAudioStreamInfo, 40), 4381 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, kAudioStreamInfo, 40),
4360 MuxedStreamInfo(kVideoTrackNum, kVideoStreamInfo, 10)); 4382 MuxedStreamInfo(kVideoTrackNum, kVideoStreamInfo, 10));
4361 CheckExpectedBuffers(audio_stream, kAudioStreamInfo); 4383 CheckExpectedBuffers(audio_stream, kAudioStreamInfo);
4362 CheckExpectedBuffers(video_stream, kVideoStreamInfo); 4384 CheckExpectedBuffers(video_stream, kVideoStreamInfo);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
4422 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4444 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4423 EXPECT_MEDIA_LOG(SegmentMissingFrames("1")); 4445 EXPECT_MEDIA_LOG(SegmentMissingFrames("1"));
4424 EXPECT_MEDIA_LOG(SegmentMissingFrames("2")); 4446 EXPECT_MEDIA_LOG(SegmentMissingFrames("2"));
4425 ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0))); 4447 ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0)));
4426 } 4448 }
4427 4449
4428 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_FirstSegmentMissingKeyframe) { 4450 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_FirstSegmentMissingKeyframe) {
4429 // Append V:[n n n][n n K] 4451 // Append V:[n n n][n n K]
4430 // Expect V: [K] 4452 // Expect V: [K]
4431 ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); 4453 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4432 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4454 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
4433 4455
4434 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(2); 4456 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(2);
4435 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0 10 20"); 4457 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0 10 20");
4436 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50K"); 4458 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50K");
4437 CheckExpectedRanges("{ [50,60) }"); 4459 CheckExpectedRanges("{ [50,60) }");
4438 CheckExpectedBuffers(video_stream, "50K"); 4460 CheckExpectedBuffers(video_stream, "50K");
4439 } 4461 }
4440 4462
4441 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_SecondSegmentMissingKeyframe) { 4463 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_SecondSegmentMissingKeyframe) {
4442 // Append V:[K n n][n n n] 4464 // Append V:[K n n][n n n]
4443 // Expect V:[K n n][n n n] 4465 // Expect V:[K n n][n n n]
4444 ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); 4466 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4445 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4467 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
4446 4468
4447 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(2); 4469 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(2);
4448 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20"); 4470 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20");
4449 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50"); 4471 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50");
4450 CheckExpectedRanges("{ [0,60) }"); 4472 CheckExpectedRanges("{ [0,60) }");
4451 CheckExpectedBuffers(video_stream, "0K 10 20 30 40 50"); 4473 CheckExpectedBuffers(video_stream, "0K 10 20 30 40 50");
4452 } 4474 }
4453 4475
4454 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_RemoveInterruptsCodedFrameGroup_1) { 4476 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_RemoveInterruptsCodedFrameGroup_1) {
4455 // Append V:[K n n] 4477 // Append V:[K n n]
4456 // Remove ***** 4478 // Remove *****
4457 // Append V: [n n n][n K n] 4479 // Append V: [n n n][n K n]
4458 // Expect: [K n] 4480 // Expect: [K n]
4459 ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); 4481 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4460 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4482 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
4461 4483
4462 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(3); 4484 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(3);
4463 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20"); 4485 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20");
4464 demuxer_->Remove(kSourceId, base::TimeDelta(), 4486 demuxer_->Remove(kSourceId, base::TimeDelta(),
4465 base::TimeDelta::FromMilliseconds(30)); 4487 base::TimeDelta::FromMilliseconds(30));
4466 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50"); 4488 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50");
4467 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "60 70K 80"); 4489 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "60 70K 80");
4468 CheckExpectedRanges("{ [70,90) }"); 4490 CheckExpectedRanges("{ [70,90) }");
4469 CheckExpectedBuffers(video_stream, "70K 80"); 4491 CheckExpectedBuffers(video_stream, "70K 80");
4470 } 4492 }
4471 4493
4472 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_RemoveInterruptsCodedFrameGroup_2) { 4494 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_RemoveInterruptsCodedFrameGroup_2) {
4473 // Append V:[K n n][n n n][n K n] 4495 // Append V:[K n n][n n n][n K n]
4474 // Remove * 4496 // Remove *
4475 // Expect: [K n] 4497 // Expect: [K n]
4476 ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); 4498 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4477 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4499 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
4478 4500
4479 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(3); 4501 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(3);
4480 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20"); 4502 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20");
4481 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50"); 4503 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50");
4482 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "60 70K 80"); 4504 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "60 70K 80");
4483 demuxer_->Remove(kSourceId, base::TimeDelta(), 4505 demuxer_->Remove(kSourceId, base::TimeDelta(),
4484 base::TimeDelta::FromMilliseconds(10)); 4506 base::TimeDelta::FromMilliseconds(10));
4485 CheckExpectedRanges("{ [70,90) }"); 4507 CheckExpectedRanges("{ [70,90) }");
4486 CheckExpectedBuffers(video_stream, "70K 80"); 4508 CheckExpectedBuffers(video_stream, "70K 80");
4487 } 4509 }
4488 4510
4489 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_RemoveInterruptsCodedFrameGroup_3) { 4511 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_RemoveInterruptsCodedFrameGroup_3) {
4490 // Append V:[K n n][n n n][n K n] 4512 // Append V:[K n n][n n n][n K n]
4491 // Remove * 4513 // Remove *
4492 // Expect: [K n n..n n] [K n] 4514 // Expect: [K n n..n n] [K n]
4493 ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); 4515 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4494 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4516 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
4495 4517
4496 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(3); 4518 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(3);
4497 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20"); 4519 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20");
4498 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50"); 4520 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50");
4499 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "60 70K 80"); 4521 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "60 70K 80");
4500 demuxer_->Remove(kSourceId, base::TimeDelta::FromMilliseconds(50), 4522 demuxer_->Remove(kSourceId, base::TimeDelta::FromMilliseconds(50),
4501 base::TimeDelta::FromMilliseconds(60)); 4523 base::TimeDelta::FromMilliseconds(60));
4502 CheckExpectedRanges("{ [0,50) [70,90) }"); 4524 CheckExpectedRanges("{ [0,50) [70,90) }");
4503 CheckExpectedBuffers(video_stream, "0K 10 20 30 40"); 4525 CheckExpectedBuffers(video_stream, "0K 10 20 30 40");
4504 Seek(base::TimeDelta::FromMilliseconds(70)); 4526 Seek(base::TimeDelta::FromMilliseconds(70));
4505 CheckExpectedBuffers(video_stream, "70K 80"); 4527 CheckExpectedBuffers(video_stream, "70K 80");
4506 } 4528 }
4507 4529
4508 TEST_F(ChunkDemuxerTest, 4530 TEST_F(ChunkDemuxerTest,
4509 RelaxedKeyframe_RemoveInterruptsMuxedCodedFrameGroup_1) { 4531 RelaxedKeyframe_RemoveInterruptsMuxedCodedFrameGroup_1) {
4510 // Append muxed: 4532 // Append muxed:
4511 // A:[K K K] 4533 // A:[K K K]
4512 // V:[K n n] 4534 // V:[K n n]
4513 // Remove ***** 4535 // Remove *****
4514 // Append muxed: 4536 // Append muxed:
4515 // A: [K K K][K K K] 4537 // A: [K K K][K K K]
4516 // V: [n n n][n K n] 4538 // V: [n n n][n K n]
4517 // Expect: 4539 // Expect:
4518 // A: [K K K][K K K] 4540 // A: [K K K][K K K]
4519 // V [K n] 4541 // V [K n]
4520 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4542 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4521 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4543 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
4522 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4544 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
4523 4545
4524 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 10K 20D10K"), 4546 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 10K 20D10K"),
4525 MuxedStreamInfo(kVideoTrackNum, "0K 10 20", 10)); 4547 MuxedStreamInfo(kVideoTrackNum, "0K 10 20", 10));
4526 demuxer_->Remove(kSourceId, base::TimeDelta(), 4548 demuxer_->Remove(kSourceId, base::TimeDelta(),
4527 base::TimeDelta::FromMilliseconds(30)); 4549 base::TimeDelta::FromMilliseconds(30));
4528 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "30K 40K 50D10K"), 4550 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "30K 40K 50D10K"),
4529 MuxedStreamInfo(kVideoTrackNum, "30 40 50", 10)); 4551 MuxedStreamInfo(kVideoTrackNum, "30 40 50", 10));
4530 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "60K 70K 80D10K"), 4552 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "60K 70K 80D10K"),
4531 MuxedStreamInfo(kVideoTrackNum, "60 70K 80", 10)); 4553 MuxedStreamInfo(kVideoTrackNum, "60 70K 80", 10));
4532 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }"); 4554 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }");
(...skipping 12 matching lines...) Expand all
4545 // Remove ***** 4567 // Remove *****
4546 // Append muxed: 4568 // Append muxed:
4547 // A: [K K K][K K K] 4569 // A: [K K K][K K K]
4548 // V: [n n n][n K n] 4570 // V: [n n n][n K n]
4549 // Expect: 4571 // Expect:
4550 // A: [K K K][K K K] 4572 // A: [K K K][K K K]
4551 // V [................K n] (As would occur if there really were a 4573 // V [................K n] (As would occur if there really were a
4552 // jagged cluster start and not badly muxed clusters as used to 4574 // jagged cluster start and not badly muxed clusters as used to
4553 // simulate a jagged start in this test.) 4575 // simulate a jagged start in this test.)
4554 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4576 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4555 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4577 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
4556 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4578 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
4557 4579
4558 EXPECT_MEDIA_LOG(SegmentMissingFrames("1")); 4580 EXPECT_MEDIA_LOG(SegmentMissingFrames("1"));
4559 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 10K 20D10K"), 4581 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 10K 20D10K"),
4560 MuxedStreamInfo(kVideoTrackNum, "")); 4582 MuxedStreamInfo(kVideoTrackNum, ""));
4561 demuxer_->Remove(kSourceId, base::TimeDelta(), 4583 demuxer_->Remove(kSourceId, base::TimeDelta(),
4562 base::TimeDelta::FromMilliseconds(30)); 4584 base::TimeDelta::FromMilliseconds(30));
4563 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "30K 40K 50D10K"), 4585 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "30K 40K 50D10K"),
4564 MuxedStreamInfo(kVideoTrackNum, "30 40 50", 10)); 4586 MuxedStreamInfo(kVideoTrackNum, "30 40 50", 10));
4565 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "60K 70K 80D10K"), 4587 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "60K 70K 80D10K"),
4566 MuxedStreamInfo(kVideoTrackNum, "60 70K 80", 10)); 4588 MuxedStreamInfo(kVideoTrackNum, "60 70K 80", 10));
(...skipping 10 matching lines...) Expand all
4577 // A:[K K K 4599 // A:[K K K
4578 // V:(Nothing yet. This is a jagged start, not simulated.) 4600 // V:(Nothing yet. This is a jagged start, not simulated.)
4579 // Remove ***** 4601 // Remove *****
4580 // Append muxed: 4602 // Append muxed:
4581 // A: K K K K K K] 4603 // A: K K K K K K]
4582 // V: n n n n K n] 4604 // V: n n n n K n]
4583 // Expect: 4605 // Expect:
4584 // A: [K K K K K K] 4606 // A: [K K K K K K]
4585 // V [..............K n] 4607 // V [..............K n]
4586 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4608 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4587 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4609 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
4588 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4610 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
4589 4611
4590 std::vector<MuxedStreamInfo> msi(2); 4612 std::vector<MuxedStreamInfo> msi(2);
4591 msi[0] = 4613 msi[0] =
4592 MuxedStreamInfo(kAudioTrackNum, "0K 10K 20K 30K 40K 50K 60K 70K 80D10K"); 4614 MuxedStreamInfo(kAudioTrackNum, "0K 10K 20K 30K 40K 50K 60K 70K 80D10K");
4593 msi[1] = MuxedStreamInfo(kVideoTrackNum, "31 41 51 61 71K 81", 10); 4615 msi[1] = MuxedStreamInfo(kVideoTrackNum, "31 41 51 61 71K 81", 10);
4594 std::unique_ptr<Cluster> cluster = GenerateMuxedCluster(msi); 4616 std::unique_ptr<Cluster> cluster = GenerateMuxedCluster(msi);
4595 4617
4596 // Append the first part of the cluster, up to the beginning of the first 4618 // Append the first part of the cluster, up to the beginning of the first
4597 // video simpleblock. The result should be just 4 audio blocks and no video 4619 // video simpleblock. The result should be just 4 audio blocks and no video
4598 // blocks are appended. Since the stream parser does not yet have a duration 4620 // blocks are appended. Since the stream parser does not yet have a duration
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
4655 ASSERT_TRUE(event.IsSignaled()); 4677 ASSERT_TRUE(event.IsSignaled());
4656 4678
4657 event.Reset(); 4679 event.Reset();
4658 stream->set_enabled(true, base::TimeDelta()); 4680 stream->set_enabled(true, base::TimeDelta());
4659 base::RunLoop().RunUntilIdle(); 4681 base::RunLoop().RunUntilIdle();
4660 ASSERT_TRUE(event.IsSignaled()); 4682 ASSERT_TRUE(event.IsSignaled());
4661 } 4683 }
4662 4684
4663 TEST_F(ChunkDemuxerTest, StreamStatusNotifications) { 4685 TEST_F(ChunkDemuxerTest, StreamStatusNotifications) {
4664 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4686 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4665 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4687 DemuxerStream* audio_stream = GetStream(DemuxerStream::AUDIO);
4666 EXPECT_NE(nullptr, audio_stream); 4688 EXPECT_NE(nullptr, audio_stream);
4667 CheckStreamStatusNotifications(audio_stream); 4689 CheckStreamStatusNotifications(audio_stream);
4668 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4690 DemuxerStream* video_stream = GetStream(DemuxerStream::VIDEO);
4669 EXPECT_NE(nullptr, video_stream); 4691 EXPECT_NE(nullptr, video_stream);
4670 CheckStreamStatusNotifications(video_stream); 4692 CheckStreamStatusNotifications(video_stream);
4671 } 4693 }
4672 4694
4673 TEST_F(ChunkDemuxerTest, MultipleIds) { 4695 TEST_F(ChunkDemuxerTest, MultipleIds) {
4674 CreateNewDemuxer(); 4696 CreateNewDemuxer();
4675 EXPECT_CALL(*this, DemuxerOpened()); 4697 EXPECT_CALL(*this, DemuxerOpened());
4676 EXPECT_CALL(host_, SetDuration(_)).Times(2); 4698 EXPECT_CALL(host_, SetDuration(_)).Times(2);
4677 demuxer_->Initialize(&host_, CreateInitDoneCB(kNoTimestamp, PIPELINE_OK), 4699 demuxer_->Initialize(&host_, CreateInitDoneCB(kNoTimestamp, PIPELINE_OK),
4678 true); 4700 true);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
4730 EXPECT_EQ(AddId(kId1, "video/webm", "vorbis,vp8"), ChunkDemuxer::kOk); 4752 EXPECT_EQ(AddId(kId1, "video/webm", "vorbis,vp8"), ChunkDemuxer::kOk);
4731 4753
4732 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 4754 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
4733 EXPECT_MEDIA_LOG(FoundStream("video")); 4755 EXPECT_MEDIA_LOG(FoundStream("video"));
4734 EXPECT_MEDIA_LOG(CodecName("video", "vp8")); 4756 EXPECT_MEDIA_LOG(CodecName("video", "vp8"));
4735 EXPECT_MEDIA_LOG(FoundStream("audio")); 4757 EXPECT_MEDIA_LOG(FoundStream("audio"));
4736 EXPECT_MEDIA_LOG(CodecName("audio", "vorbis")); 4758 EXPECT_MEDIA_LOG(CodecName("audio", "vorbis"));
4737 4759
4738 // Append init segment to ensure demuxer streams get created. 4760 // Append init segment to ensure demuxer streams get created.
4739 ASSERT_TRUE(AppendInitSegmentWithSourceId(kId1, HAS_AUDIO | HAS_VIDEO)); 4761 ASSERT_TRUE(AppendInitSegmentWithSourceId(kId1, HAS_AUDIO | HAS_VIDEO));
4740 EXPECT_NE(nullptr, demuxer_->GetStream(DemuxerStream::AUDIO)); 4762 EXPECT_NE(nullptr, GetStream(DemuxerStream::AUDIO));
4741 EXPECT_NE(nullptr, demuxer_->GetStream(DemuxerStream::VIDEO)); 4763 EXPECT_NE(nullptr, GetStream(DemuxerStream::VIDEO));
4742 4764
4743 // Removing the id should remove also the DemuxerStreams. 4765 // Removing the id should remove also the DemuxerStreams.
4744 demuxer_->RemoveId(kId1); 4766 demuxer_->RemoveId(kId1);
4745 EXPECT_EQ(nullptr, demuxer_->GetStream(DemuxerStream::AUDIO)); 4767 EXPECT_EQ(nullptr, GetStream(DemuxerStream::AUDIO));
4746 EXPECT_EQ(nullptr, demuxer_->GetStream(DemuxerStream::VIDEO)); 4768 EXPECT_EQ(nullptr, GetStream(DemuxerStream::VIDEO));
4747 } 4769 }
4748 4770
4749 // TODO(servolk): Add a unit test with multiple audio/video tracks using the 4771 // TODO(servolk): Add a unit test with multiple audio/video tracks using the
4750 // same codec type in a single SourceBufferState, when WebM parser supports 4772 // same codec type in a single SourceBufferState, when WebM parser supports
4751 // multiple tracks. crbug.com/646900 4773 // multiple tracks. crbug.com/646900
4752 4774
4753 class ChunkDemuxerMp4Vp9Test : public ChunkDemuxerTest, 4775 class ChunkDemuxerMp4Vp9Test : public ChunkDemuxerTest,
4754 public WithParamInterface<bool> { 4776 public WithParamInterface<bool> {
4755 public: 4777 public:
4756 void SetUp() override { 4778 void SetUp() override {
(...skipping 22 matching lines...) Expand all
4779 EXPECT_EQ( 4801 EXPECT_EQ(
4780 demuxer_->AddId("source_id", "video/mp4", "vp09.00.01.08.02.01.01.00"), 4802 demuxer_->AddId("source_id", "video/mp4", "vp09.00.01.08.02.01.01.00"),
4781 expected); 4803 expected);
4782 } 4804 }
4783 4805
4784 INSTANTIATE_TEST_CASE_P(EnableDisableMp4Vp9Demuxing, 4806 INSTANTIATE_TEST_CASE_P(EnableDisableMp4Vp9Demuxing,
4785 ChunkDemuxerMp4Vp9Test, 4807 ChunkDemuxerMp4Vp9Test,
4786 ::testing::Bool()); 4808 ::testing::Bool());
4787 4809
4788 } // namespace media 4810 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698