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

Unified Diff: media/filters/chunk_demuxer_unittest.cc

Issue 1581003002: MSE: Strictly verify expected MediaLog events in ChunkDemuxerTests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix the mpeg2ts parser medialog expectation Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/chunk_demuxer_unittest.cc
diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc
index 94698d4d6cc6d39faab7d3ea3bec2251ed5a24c4..29b4988cfc18fd8ef6f69d468f0318aecbf96ca1 100644
--- a/media/filters/chunk_demuxer_unittest.cc
+++ b/media/filters/chunk_demuxer_unittest.cc
@@ -18,12 +18,13 @@
#include "media/base/audio_decoder_config.h"
#include "media/base/decoder_buffer.h"
#include "media/base/decrypt_config.h"
-#include "media/base/media_log.h"
#include "media/base/mock_demuxer_host.h"
+#include "media/base/mock_media_log.h"
#include "media/base/test_data_util.h"
#include "media/base/test_helpers.h"
#include "media/base/timestamp_constants.h"
#include "media/formats/webm/cluster_builder.h"
+#include "media/formats/webm/webm_cluster_parser.h"
#include "media/formats/webm/webm_constants.h"
#include "media/media_features.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -35,6 +36,7 @@ using ::testing::NotNull;
using ::testing::Return;
using ::testing::SaveArg;
using ::testing::SetArgumentPointee;
+using ::testing::StrictMock;
using ::testing::_;
namespace media {
@@ -117,6 +119,85 @@ MATCHER_P(HasTimestamp, timestamp_in_ms, "") {
MATCHER(IsEndOfStream, "") { return arg.get() && arg->end_of_stream(); }
+MATCHER(StreamParsingFailed, "") {
+ return CONTAINS_STRING(arg, "Append: stream parsing failed.");
+}
+
+MATCHER_P(FoundStream, stream_type_string, "") {
+ return CONTAINS_STRING(
+ arg, "found_" + std::string(stream_type_string) + "_stream") &&
+ CONTAINS_STRING(arg, "true");
+}
+
+MATCHER_P2(CodecName, stream_type_string, codec_string, "") {
+ return CONTAINS_STRING(arg,
+ std::string(stream_type_string) + "_codec_name") &&
+ CONTAINS_STRING(arg, std::string(codec_string));
+}
+
+MATCHER_P2(InitSegmentMismatchesMimeType,
+ track_type_string_with_article,
+ mime_missing_track_type_bool,
+ "") {
+ return CONTAINS_STRING(
+ arg, "Initialization segment " +
+ std::string(mime_missing_track_type_bool ? "has "
+ : "does not have ") +
+ std::string(track_type_string_with_article) +
+ " track, but the mimetype " +
+ std::string(mime_missing_track_type_bool ? "does not specify "
+ : "specifies ") +
+ std::string(track_type_string_with_article) + " codec.");
+}
+
+MATCHER_P2(GeneratedSplice, duration_microseconds, time_microseconds, "") {
+ return CONTAINS_STRING(arg, "Generated splice of overlap duration " +
+ base::IntToString(duration_microseconds) +
+ "us into new buffer at " +
+ base::IntToString(time_microseconds) + "us.");
+}
+
+MATCHER_P2(SkippingSpliceAtOrBefore,
+ new_microseconds,
+ existing_microseconds,
+ "") {
+ return CONTAINS_STRING(
+ arg, "Skipping splice frame generation: first new buffer at " +
+ base::IntToString(new_microseconds) +
+ "us begins at or before existing buffer at " +
+ base::IntToString(existing_microseconds) + "us.");
+}
+
+MATCHER_P(SkippingSpliceAlreadySpliced, time_microseconds, "") {
+ return CONTAINS_STRING(
+ arg, "Skipping splice frame generation: overlapped buffers at " +
+ base::IntToString(time_microseconds) +
+ "us are in a previously buffered splice.");
+}
+
+MATCHER_P(WebMSimpleBlockDurationEstimated, estimated_duration_ms, "") {
+ return CONTAINS_STRING(arg, "Estimating WebM block duration to be " +
+ base::IntToString(estimated_duration_ms) +
+ "ms for the last (Simple)Block in the "
+ "Cluster for this Track. Use BlockGroups "
+ "with BlockDurations at the end of each "
+ "Track in a Cluster to avoid estimation.");
+}
+
+MATCHER_P(WebMNegativeTimecodeOffset, timecode_string, "") {
+ return CONTAINS_STRING(arg, "Got a block with negative timecode offset " +
+ std::string(timecode_string));
+}
+
+MATCHER(WebMOutOfOrderTimecode, "") {
+ return CONTAINS_STRING(
+ arg, "Got a block with a timecode before the previous block.");
+}
+
+MATCHER(WebMClusterBeforeFirstInfo, "") {
+ return CONTAINS_STRING(arg, "Found Cluster element before Info.");
+}
xhwang 2016/01/13 19:04:38 I was a bit worried about the maintainability of t
wolenetz 2016/01/15 02:14:48 Acknowledged.
+
static void OnReadDone(const base::TimeDelta& expected_time,
bool* called,
DemuxerStream::Status status,
@@ -170,7 +251,8 @@ class ChunkDemuxerTest : public ::testing::Test {
}
ChunkDemuxerTest()
- : append_window_end_for_next_append_(kInfiniteDuration()) {
+ : media_log_(new StrictMock<MockMediaLog>()),
+ append_window_end_for_next_append_(kInfiniteDuration()) {
init_segment_received_cb_ =
base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
base::Unretained(this));
@@ -183,8 +265,7 @@ class ChunkDemuxerTest : public ::testing::Test {
Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = base::Bind(
&ChunkDemuxerTest::OnEncryptedMediaInitData, base::Unretained(this));
demuxer_.reset(new ChunkDemuxer(open_cb, encrypted_media_init_data_cb,
- scoped_refptr<MediaLog>(new MediaLog()),
- true));
+ media_log_, true));
}
virtual ~ChunkDemuxerTest() {
@@ -444,6 +525,11 @@ class ChunkDemuxerTest : public ::testing::Test {
// should be marked as a key frame. For example "0K 30 60" should populate
// |blocks| with 3 BlockInfo objects: a key frame with timestamp 0 and 2
// non-key-frames at 30ms and 60ms.
+ // Every block will be a SimpleBlock, with the exception that the last block
+ // may have an optional duration delimited with a 'D' and appended to the
+ // block info timestamp, prior to the optional keyframe 'K'. For example "0K
+ // 30 60D10K" indicates that the last block will be a keyframe BlockGroup
+ // with duration 10ms.
void ParseBlockDescriptions(int track_number,
const std::string block_descriptions,
std::vector<BlockInfo>* blocks) {
@@ -462,6 +548,17 @@ class ChunkDemuxerTest : public ::testing::Test {
// Remove the "K" off of the token.
timestamp_str = timestamp_str.substr(0, timestamps[i].length() - 1);
}
+
+ size_t duration_pos = timestamp_str.find('D');
+ const bool explicit_duration = duration_pos != std::string::npos;
+ const bool is_last_block = i == timestamps.size() - 1;
+ CHECK(!explicit_duration || is_last_block);
+ if (explicit_duration) {
+ CHECK(base::StringToInt(timestamp_str.substr(duration_pos + 1),
+ &block_info.duration));
+ timestamp_str = timestamp_str.substr(0, duration_pos);
+ }
+
CHECK(base::StringToInt(timestamp_str, &block_info.timestamp_in_ms));
if (track_number == kTextTrackNum ||
@@ -535,18 +632,30 @@ class ChunkDemuxerTest : public ::testing::Test {
struct MuxedStreamInfo {
MuxedStreamInfo()
: track_number(0),
- block_descriptions("")
- {}
+ block_descriptions(""),
+ last_blocks_estimated_duration(-1) {}
MuxedStreamInfo(int track_num, const char* block_desc)
: track_number(track_num),
- block_descriptions(block_desc) {
- }
+ block_descriptions(block_desc),
+ last_blocks_estimated_duration(-1) {}
+
+ MuxedStreamInfo(int track_num,
+ const char* block_desc,
+ int last_block_duration_estimate)
+ : track_number(track_num),
+ block_descriptions(block_desc),
+ last_blocks_estimated_duration(last_block_duration_estimate) {}
int track_number;
// The block description passed to ParseBlockDescriptions().
// See the documentation for that method for details on the string format.
const char* block_descriptions;
+
+ // If -1, no WebMSimpleBlockDurationEstimated MediaLog expectation is added
+ // when appending the resulting cluster. Otherwise, an expectation (in ms)
+ // is added.
+ int last_blocks_estimated_duration;
};
void AppendMuxedCluster(const MuxedStreamInfo& msi_1,
@@ -574,8 +683,14 @@ class ChunkDemuxerTest : public ::testing::Test {
ParseBlockDescriptions(msi[i].track_number, msi[i].block_descriptions,
&track_blocks);
- for (size_t j = 0; j < track_blocks.size(); ++j)
+ for (size_t j = 0; j < track_blocks.size(); ++j) {
block_queue.push(track_blocks[j]);
+ }
+
+ if (msi[i].last_blocks_estimated_duration != -1) {
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(
+ msi[i].last_blocks_estimated_duration));
+ }
}
AppendCluster(kSourceId, GenerateCluster(block_queue, false));
@@ -672,6 +787,18 @@ class ChunkDemuxerTest : public ::testing::Test {
return InitDemuxerWithEncryptionInfo(stream_flags, false, false);
}
+ void ExpectInitMediaLogs(int stream_flags) {
+ if (stream_flags & HAS_AUDIO) {
+ EXPECT_MEDIA_LOG(FoundStream("audio"));
+ EXPECT_MEDIA_LOG(CodecName("audio", "vorbis"));
+ }
+
+ if (stream_flags & HAS_VIDEO) {
+ EXPECT_MEDIA_LOG(FoundStream("video"));
+ EXPECT_MEDIA_LOG(CodecName("video", "vp8"));
+ }
+ }
+
bool InitDemuxerWithEncryptionInfo(
int stream_flags, bool is_audio_encrypted, bool is_video_encrypted) {
@@ -684,12 +811,32 @@ class ChunkDemuxerTest : public ::testing::Test {
EXPECT_CALL(*this, DemuxerOpened());
- // Adding expectation prior to CreateInitDoneCB() here because InSequence
+ if (is_audio_encrypted || is_video_encrypted) {
+ DCHECK(!is_audio_encrypted || stream_flags & HAS_AUDIO);
+ DCHECK(!is_video_encrypted || stream_flags & HAS_VIDEO);
+
+ int need_key_count =
+ (is_audio_encrypted ? 1 : 0) + (is_video_encrypted ? 1 : 0);
+ EXPECT_CALL(*this, OnEncryptedMediaInitData(
+ EmeInitDataType::WEBM,
+ std::vector<uint8_t>(
+ kEncryptedMediaInitData,
+ kEncryptedMediaInitData +
+ arraysize(kEncryptedMediaInitData))))
+ .Times(Exactly(need_key_count));
+ }
+
+ // Adding expectations prior to CreateInitDoneCB() here because InSequence
// tests require init segment received before duration set. Also, only
// expect an init segment received callback if there is actually a track in
// it.
- if (stream_flags != 0)
+ if (stream_flags != 0) {
+ ExpectInitMediaLogs(stream_flags);
EXPECT_CALL(*this, InitSegmentReceived());
+ } else {
+ // OnNewConfigs() requires at least one audio, video, or text track.
+ EXPECT_MEDIA_LOG(StreamParsingFailed());
+ }
demuxer_->Initialize(
&host_, CreateInitDoneCB(expected_duration, expected_status), true);
@@ -723,8 +870,14 @@ class ChunkDemuxerTest : public ::testing::Test {
video_flags |= HAS_TEXT;
}
+ // Note: Unlike InitDemuxerWithEncryptionInfo, this method is currently
+ // incompatible with InSequence tests. Refactoring of the duration
+ // set expectation to not be added during CreateInitDoneCB() could fix this.
+ ExpectInitMediaLogs(audio_flags);
EXPECT_CALL(*this, InitSegmentReceived());
AppendInitSegmentWithSourceId(audio_id, audio_flags);
+
+ ExpectInitMediaLogs(video_flags);
EXPECT_CALL(*this, InitSegmentReceived());
AppendInitSegmentWithSourceId(video_id, video_flags);
return true;
@@ -760,6 +913,7 @@ class ChunkDemuxerTest : public ::testing::Test {
// Adding expectation prior to CreateInitDoneCB() here because InSequence
// tests require init segment received before duration set.
+ ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
EXPECT_CALL(*this, InitSegmentReceived());
demuxer_->Initialize(
&host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744),
@@ -769,6 +923,7 @@ class ChunkDemuxerTest : public ::testing::Test {
return false;
// Append the whole bear1 file.
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)).Times(7);
// Expect duration adjustment since actual duration differs slightly from
// duration in the init segment.
EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746)));
@@ -789,6 +944,8 @@ class ChunkDemuxerTest : public ::testing::Test {
AppendData(bear2->data(), 4340);
// Append a media segment that goes from [0.527000, 1.014000).
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
+ EXPECT_MEDIA_LOG(GeneratedSplice(20000, 527000));
AppendData(bear2->data() + 55290, 18785);
CheckExpectedRanges(kSourceId, "{ [0,1027) [1201,2736) }");
@@ -796,6 +953,8 @@ class ChunkDemuxerTest : public ::testing::Test {
// segment.
EXPECT_CALL(*this, InitSegmentReceived());
AppendData(bear1->data(), 4370);
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23));
+ EXPECT_MEDIA_LOG(GeneratedSplice(26000, 779000));
AppendData(bear1->data() + 72737, 28183);
CheckExpectedRanges(kSourceId, "{ [0,2736) }");
@@ -1198,6 +1357,8 @@ class ChunkDemuxerTest : public ::testing::Test {
base::MessageLoop message_loop_;
MockDemuxerHost host_;
+ scoped_refptr<StrictMock<MockMediaLog>> media_log_;
+
scoped_ptr<ChunkDemuxer> demuxer_;
ChunkDemuxer::InitSegmentReceivedCB init_segment_received_cb_;
@@ -1213,6 +1374,8 @@ class ChunkDemuxerTest : public ::testing::Test {
};
TEST_F(ChunkDemuxerTest, Init) {
+ InSequence s;
+
// Test no streams, audio-only, video-only, and audio & video scenarios.
// Audio and video streams can be encrypted or not encrypted.
for (int i = 0; i < 16; i++) {
@@ -1229,18 +1392,6 @@ TEST_F(ChunkDemuxerTest, Init) {
CreateNewDemuxer();
- if (is_audio_encrypted || is_video_encrypted) {
- int need_key_count = (is_audio_encrypted ? 1 : 0) +
- (is_video_encrypted ? 1 : 0);
- EXPECT_CALL(*this, OnEncryptedMediaInitData(
- EmeInitDataType::WEBM,
- std::vector<uint8_t>(
- kEncryptedMediaInitData,
- kEncryptedMediaInitData +
- arraysize(kEncryptedMediaInitData))))
- .Times(Exactly(need_key_count));
- }
-
int stream_flags = 0;
if (has_audio)
stream_flags |= HAS_AUDIO;
@@ -1373,11 +1524,10 @@ TEST_F(ChunkDemuxerTest, SingleTextTrackIdChange) {
ASSERT_TRUE(video_stream);
ASSERT_TRUE(text_stream);
- AppendMuxedCluster(
- MuxedStreamInfo(kAudioTrackNum, "0K 23K"),
- MuxedStreamInfo(kVideoTrackNum, "0K 30"),
- MuxedStreamInfo(kTextTrackNum, "10K"));
- CheckExpectedRanges(kSourceId, "{ [0,46) }");
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23),
+ MuxedStreamInfo(kVideoTrackNum, "0K 30", 30),
+ MuxedStreamInfo(kTextTrackNum, "10K"));
+ CheckExpectedRanges("{ [0,46) }");
scoped_ptr<uint8_t[]> info_tracks;
int info_tracks_size = 0;
@@ -1392,8 +1542,9 @@ TEST_F(ChunkDemuxerTest, SingleTextTrackIdChange) {
init_segment_received_cb_);
AppendMuxedCluster(
- MuxedStreamInfo(kAudioTrackNum, "46K 69K"),
- MuxedStreamInfo(kVideoTrackNum, "60K"),
+ MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23),
+ MuxedStreamInfo(kVideoTrackNum, "60K",
+ WebMClusterParser::kDefaultVideoBufferDurationInMs),
MuxedStreamInfo(kAlternateTextTrackNum, "45K"));
CheckExpectedRanges(kSourceId, "{ [0,92) }");
@@ -1422,18 +1573,18 @@ TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) {
ASSERT_TRUE(audio_stream && video_stream && text_stream);
AppendMuxedCluster(
- MuxedStreamInfo(kAudioTrackNum, "23K"),
- MuxedStreamInfo(kVideoTrackNum, "0 30K"),
+ MuxedStreamInfo(kAudioTrackNum, "23K",
+ WebMClusterParser::kDefaultAudioBufferDurationInMs),
+ MuxedStreamInfo(kVideoTrackNum, "0 30K", 30),
MuxedStreamInfo(kTextTrackNum, "25K 40K"));
CheckExpectedRanges(kSourceId, "{ [23,46) }");
EXPECT_CALL(*this, InitSegmentReceived());
AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO);
- AppendMuxedCluster(
- MuxedStreamInfo(kAudioTrackNum, "46K 69K"),
- MuxedStreamInfo(kVideoTrackNum, "60 90K"),
- MuxedStreamInfo(kTextTrackNum, "80K 90K"));
- CheckExpectedRanges(kSourceId, "{ [23,92) }");
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23),
+ MuxedStreamInfo(kVideoTrackNum, "60 90K", 30),
+ MuxedStreamInfo(kTextTrackNum, "80K 90K"));
+ CheckExpectedRanges("{ [23,92) }");
CheckExpectedBuffers(audio_stream, "23K 46K 69K");
CheckExpectedBuffers(video_stream, "30K 90K");
@@ -1451,6 +1602,7 @@ TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) {
EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk);
EXPECT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk);
+ ExpectInitMediaLogs(HAS_AUDIO);
EXPECT_CALL(*this, InitSegmentReceived());
AppendInitSegmentWithSourceId("audio", HAS_AUDIO);
@@ -1469,6 +1621,7 @@ TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) {
EXPECT_CALL(host_, AddTextStream(_, _))
.Times(Exactly(1));
+ ExpectInitMediaLogs(HAS_VIDEO);
EXPECT_CALL(*this, InitSegmentReceived());
AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT);
@@ -1533,6 +1686,7 @@ TEST_F(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
AppendCluster(kDefaultFirstCluster());
+ EXPECT_MEDIA_LOG(StreamParsingFailed());
EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
AppendGarbage();
}
@@ -1604,14 +1758,17 @@ TEST_F(ChunkDemuxerTest, Read) {
TEST_F(ChunkDemuxerTest, OutOfOrderClusters) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
AppendCluster(kDefaultFirstCluster());
+ EXPECT_MEDIA_LOG(GeneratedSplice(13000, 10000));
AppendCluster(GenerateCluster(10, 4));
// Make sure that AppendCluster() does not fail with a cluster that has
// overlaps with the previously appended cluster.
+ EXPECT_MEDIA_LOG(SkippingSpliceAlreadySpliced(0));
AppendCluster(GenerateCluster(5, 4));
// Verify that AppendData() can still accept more data.
scoped_ptr<Cluster> cluster_c(GenerateCluster(45, 2));
+ EXPECT_MEDIA_LOG(GeneratedSplice(6000, 45000));
demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size(),
append_window_start_for_next_append_,
append_window_end_for_next_append_,
@@ -1633,6 +1790,8 @@ TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) {
AddSimpleBlock(&cb, kAudioTrackNum, 7);
AddSimpleBlock(&cb, kVideoTrackNum, 15);
+ EXPECT_MEDIA_LOG(WebMOutOfOrderTimecode());
+ EXPECT_MEDIA_LOG(StreamParsingFailed());
EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
AppendCluster(cb.Finish());
@@ -1659,6 +1818,8 @@ TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) {
AddSimpleBlock(&cb, kAudioTrackNum, 3);
AddSimpleBlock(&cb, kVideoTrackNum, 3);
+ EXPECT_MEDIA_LOG(WebMNegativeTimecodeOffset("-2"));
+ EXPECT_MEDIA_LOG(StreamParsingFailed());
EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
AppendCluster(cb.Finish());
@@ -1680,12 +1841,14 @@ TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) {
// Test monotonic increasing timestamps on a per stream
// basis.
- cb.SetClusterTimecode(5);
+ cb.SetClusterTimecode(4);
AddSimpleBlock(&cb, kAudioTrackNum, 5);
AddSimpleBlock(&cb, kVideoTrackNum, 5);
AddSimpleBlock(&cb, kAudioTrackNum, 4);
AddSimpleBlock(&cb, kVideoTrackNum, 7);
+ EXPECT_MEDIA_LOG(WebMOutOfOrderTimecode());
+ EXPECT_MEDIA_LOG(StreamParsingFailed());
EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
AppendCluster(cb.Finish());
}
@@ -1699,6 +1862,8 @@ TEST_F(ChunkDemuxerTest, ClusterBeforeInitSegment) {
ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
+ EXPECT_MEDIA_LOG(WebMClusterBeforeFirstInfo());
+ EXPECT_MEDIA_LOG(StreamParsingFailed());
AppendCluster(GenerateCluster(0, 1));
}
@@ -1916,9 +2081,8 @@ TEST_F(ChunkDemuxerTest, EndOfStreamRangeChanges) {
.WillOnce(SaveArg<0>(&text_stream));
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
- AppendMuxedCluster(
- MuxedStreamInfo(kVideoTrackNum, "0K 33"),
- MuxedStreamInfo(kAudioTrackNum, "0K 23K"));
+ AppendMuxedCluster(MuxedStreamInfo(kVideoTrackNum, "0K 33", 33),
+ MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23));
// Check expected ranges and verify that an empty text track does not
// affect the expected ranges.
@@ -1938,12 +2102,12 @@ TEST_F(ChunkDemuxerTest, EndOfStreamRangeChanges) {
// Add text track data and verify that the buffered ranges don't change
// since the intersection of all the tracks doesn't change.
+ EXPECT_MEDIA_LOG(SkippingSpliceAtOrBefore(0, 0));
EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(200)));
- AppendMuxedCluster(
- MuxedStreamInfo(kVideoTrackNum, "0K 33"),
- MuxedStreamInfo(kAudioTrackNum, "0K 23K"),
- MuxedStreamInfo(kTextTrackNum, "0K 100K"));
- CheckExpectedRanges(kSourceId, "{ [0,46) }");
+ AppendMuxedCluster(MuxedStreamInfo(kVideoTrackNum, "0K 33", 33),
+ MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23),
+ MuxedStreamInfo(kTextTrackNum, "0K 100K"));
+ CheckExpectedRanges("{ [0,46) }");
// Mark end of stream and verify that text track data is reflected in
// the new range.
@@ -1979,6 +2143,7 @@ TEST_F(ChunkDemuxerTest, AppendingInPieces) {
memcpy(dst, cluster_b->data(), cluster_b->size());
dst += cluster_b->size();
+ ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
EXPECT_CALL(*this, InitSegmentReceived());
AppendDataInPieces(buffer.get(), buffer_size);
@@ -1995,6 +2160,9 @@ TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) {
{kSkip, kSkip},
};
+ ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)).Times(7);
+
// Expect duration adjustment since actual duration differs slightly from
// duration in the init segment.
EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746)));
@@ -2014,6 +2182,8 @@ TEST_F(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) {
{kSkip, kSkip},
};
+ ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)).Times(7);
ASSERT_TRUE(ParseWebMFile("bear-320x240-live.webm", buffer_timestamps,
kInfiniteDuration()));
@@ -2034,6 +2204,9 @@ TEST_F(ChunkDemuxerTest, WebMFile_AudioOnly) {
{kSkip, kSkip},
};
+ ExpectInitMediaLogs(HAS_AUDIO);
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
+
// Expect duration adjustment since actual duration differs slightly from
// duration in the init segment.
EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746)));
@@ -2054,6 +2227,8 @@ TEST_F(ChunkDemuxerTest, WebMFile_VideoOnly) {
{kSkip, kSkip},
};
+ ExpectInitMediaLogs(HAS_VIDEO);
+
// Expect duration adjustment since actual duration differs slightly from
// duration in the init segment.
EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2736)));
@@ -2074,6 +2249,8 @@ TEST_F(ChunkDemuxerTest, WebMFile_AltRefFrames) {
{kSkip, kSkip},
};
+ ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps,
base::TimeDelta::FromMilliseconds(2767)));
}
@@ -2140,6 +2317,7 @@ TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) {
ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
+ EXPECT_MEDIA_LOG(StreamParsingFailed());
uint8_t tmp = 0;
demuxer_->AppendData(kSourceId, &tmp, 1,
append_window_start_for_next_append_,
@@ -2159,6 +2337,9 @@ TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) {
ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs),
ChunkDemuxer::kOk);
+ // Video track is unexpected per mimetype.
+ EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", true));
+ EXPECT_MEDIA_LOG(StreamParsingFailed());
AppendInitSegment(HAS_AUDIO | HAS_VIDEO);
}
@@ -2173,9 +2354,46 @@ TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) {
ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
ChunkDemuxer::kOk);
+ // Audio track is unexpected per mimetype.
+ EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", true));
+ EXPECT_MEDIA_LOG(StreamParsingFailed());
AppendInitSegment(HAS_AUDIO | HAS_VIDEO);
}
+TEST_F(ChunkDemuxerTest, AudioOnlyHeaderWithAVType) {
+ EXPECT_CALL(*this, DemuxerOpened());
+ demuxer_->Initialize(
+ &host_, CreateInitDoneCB(kNoTimestamp(), PIPELINE_ERROR_DECODE), true);
+
+ std::vector<std::string> codecs(2);
+ codecs[0] = "vorbis";
+ codecs[1] = "vp8";
+ ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
+ ChunkDemuxer::kOk);
+
+ // Video track is also expected per mimetype.
+ EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", false));
+ EXPECT_MEDIA_LOG(StreamParsingFailed());
+ AppendInitSegment(HAS_AUDIO);
+}
+
+TEST_F(ChunkDemuxerTest, VideoOnlyHeaderWithAVType) {
+ EXPECT_CALL(*this, DemuxerOpened());
+ demuxer_->Initialize(
+ &host_, CreateInitDoneCB(kNoTimestamp(), PIPELINE_ERROR_DECODE), true);
+
+ std::vector<std::string> codecs(2);
+ codecs[0] = "vorbis";
+ codecs[1] = "vp8";
+ ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
+ ChunkDemuxer::kOk);
+
+ // Audio track is also expected per mimetype.
+ EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", false));
+ EXPECT_MEDIA_LOG(StreamParsingFailed());
+ AppendInitSegment(HAS_VIDEO);
+}
+
TEST_F(ChunkDemuxerTest, MultipleHeaders) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
@@ -2237,6 +2455,7 @@ TEST_F(ChunkDemuxerTest, AddIdFailures) {
// Adding an id with audio/video should fail because we already added audio.
ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit);
+ ExpectInitMediaLogs(HAS_AUDIO);
EXPECT_CALL(*this, InitSegmentReceived());
AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO);
@@ -2402,8 +2621,11 @@ TEST_F(ChunkDemuxerTest, SeekAudioAndVideoSources) {
TEST_F(ChunkDemuxerTest, EndOfStreamAfterPastEosSeek) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
- AppendCluster(GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10));
- AppendCluster(GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 5));
+ AppendMuxedCluster(
+ MuxedStreamInfo(kAudioTrackNum,
+ "0K 10K 20K 30K 40K 50K 60K 70K 80K 90K 100K 110K", 10),
+ MuxedStreamInfo(kVideoTrackNum, "0K 20K 40K 60K 80K", 20));
+ CheckExpectedRanges("{ [0,100) }");
// Seeking past the end of video.
// Note: audio data is available for that seek point.
@@ -2431,10 +2653,14 @@ TEST_F(ChunkDemuxerTest, EndOfStreamAfterPastEosSeek) {
TEST_F(ChunkDemuxerTest, EndOfStreamDuringPendingSeek) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
- AppendCluster(GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10));
- AppendCluster(GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 5));
- AppendCluster(GenerateSingleStreamCluster(200, 300, kAudioTrackNum, 10));
- AppendCluster(GenerateSingleStreamCluster(200, 300, kVideoTrackNum, 5));
+ AppendMuxedCluster(
+ MuxedStreamInfo(kAudioTrackNum,
+ "0K 10K 20K 30K 40K 50K 60K 70K 80K 90K 100K 110K", 10),
+ MuxedStreamInfo(kVideoTrackNum, "0K 20K 40K 60K 80K", 20));
+ AppendMuxedCluster(
+ MuxedStreamInfo(kAudioTrackNum,
+ "200K 210K 220K 230K 240K 250K 260K 270K 280K 290K", 10),
+ MuxedStreamInfo(kVideoTrackNum, "200K 220K 240K 260K 280K", 20));
bool seek_cb_was_called = false;
base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(160);
@@ -2453,8 +2679,10 @@ TEST_F(ChunkDemuxerTest, EndOfStreamDuringPendingSeek) {
demuxer_->UnmarkEndOfStream();
- AppendCluster(GenerateSingleStreamCluster(140, 180, kAudioTrackNum, 10));
- AppendCluster(GenerateSingleStreamCluster(140, 180, kVideoTrackNum, 5));
+ AppendMuxedCluster(
+ MuxedStreamInfo(kAudioTrackNum, "140K 150K 160K 170K", 10),
+ MuxedStreamInfo(kVideoTrackNum, "140K 145K 150K 155K 160K 165K 170K 175K",
+ 20));
message_loop_.RunUntilIdle();
@@ -2470,6 +2698,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) {
&host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
ASSERT_EQ(AddId(kSourceId, HAS_AUDIO), ChunkDemuxer::kOk);
+ ExpectInitMediaLogs(HAS_AUDIO);
EXPECT_CALL(*this, InitSegmentReceived());
AppendInitSegment(HAS_AUDIO);
@@ -2493,6 +2722,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) {
&host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
ASSERT_EQ(AddId(kSourceId, HAS_VIDEO), ChunkDemuxer::kOk);
+ ExpectInitMediaLogs(HAS_VIDEO);
EXPECT_CALL(*this, InitSegmentReceived());
AppendInitSegment(HAS_VIDEO);
@@ -2557,8 +2787,9 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) {
CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
// Appending within buffered range should not affect buffered ranges.
- AppendCluster(GenerateSingleStreamCluster(930, 950, kAudioTrackNum, 20));
- CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
chcunningham 2016/01/14 19:11:23 Did you mean to remove this CheckExpectedRanges?
wolenetz 2016/01/15 02:14:48 Good catch. Fixed.
+ EXPECT_MEDIA_LOG(GeneratedSplice(40000, 930000));
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "930D20K"),
+ MuxedStreamInfo(kVideoTrackNum, "930D20K"));
// Appending to single stream outside buffered ranges should not affect
// buffered ranges.
@@ -2571,19 +2802,17 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideoText) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
// Append audio & video data
- AppendMuxedCluster(
- MuxedStreamInfo(kAudioTrackNum, "0K 23K"),
- MuxedStreamInfo(kVideoTrackNum, "0K 33"));
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23),
+ MuxedStreamInfo(kVideoTrackNum, "0K 33", 33));
// Verify that a text track with no cues does not result in an empty buffered
// range.
CheckExpectedRanges("{ [0,46) }");
// Add some text cues.
- AppendMuxedCluster(
- MuxedStreamInfo(kAudioTrackNum, "100K 123K"),
- MuxedStreamInfo(kVideoTrackNum, "100K 133"),
- MuxedStreamInfo(kTextTrackNum, "100K 200K"));
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "100K 123K", 23),
+ MuxedStreamInfo(kVideoTrackNum, "100K 133", 33),
+ MuxedStreamInfo(kTextTrackNum, "100K 200K"));
// Verify that the text cues are not reflected in the buffered ranges.
CheckExpectedRanges("{ [0,46) [100,146) }");
@@ -2600,9 +2829,8 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideoText) {
TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
- AppendMuxedCluster(
- MuxedStreamInfo(kAudioTrackNum, "0K 23K"),
- MuxedStreamInfo(kVideoTrackNum, "0K 33"));
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23),
+ MuxedStreamInfo(kVideoTrackNum, "0K 33", 33));
CheckExpectedRanges("{ [0,46) }");
@@ -2618,11 +2846,10 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) {
CheckExpectedRanges("{ [0,46) }");
// Append and remove data so that the 2 streams' end ranges do not overlap.
-
EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(398)));
AppendMuxedCluster(
- MuxedStreamInfo(kAudioTrackNum, "200K 223K"),
- MuxedStreamInfo(kVideoTrackNum, "200K 233 266 299 332K 365"));
+ MuxedStreamInfo(kAudioTrackNum, "200K 223K", 23),
+ MuxedStreamInfo(kVideoTrackNum, "200K 233 266 299 332K 365", 33));
// At this point, the per-stream ranges are as follows:
// Audio: [0,46) [200,246)
@@ -2637,9 +2864,8 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) {
// Video: [0,66) [332,398)
CheckExpectedRanges("{ [0,46) }");
- AppendMuxedCluster(
- MuxedStreamInfo(kAudioTrackNum, "200K 223K"),
- MuxedStreamInfo(kVideoTrackNum, "200K 233"));
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "200K 223K", 23),
+ MuxedStreamInfo(kVideoTrackNum, "200K 233", 33));
// At this point, the per-stream ranges are as follows:
// Audio: [0,46) [200,246)
@@ -3053,6 +3279,10 @@ TEST_F(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) {
#if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER)
TEST_F(ChunkDemuxerTest, EmitBuffersDuringAbort) {
EXPECT_CALL(*this, DemuxerOpened());
+ EXPECT_MEDIA_LOG(FoundStream("audio"));
+ EXPECT_MEDIA_LOG(CodecName("audio", "aac"));
+ EXPECT_MEDIA_LOG(FoundStream("video"));
+ EXPECT_MEDIA_LOG(CodecName("video", "h264"));
demuxer_->Initialize(
&host_, CreateInitDoneCB(kInfiniteDuration(), PIPELINE_OK), true);
EXPECT_EQ(ChunkDemuxer::kOk, AddIdForMp2tSource(kSourceId));
@@ -3097,6 +3327,10 @@ TEST_F(ChunkDemuxerTest, EmitBuffersDuringAbort) {
TEST_F(ChunkDemuxerTest, SeekCompleteDuringAbort) {
EXPECT_CALL(*this, DemuxerOpened());
+ EXPECT_MEDIA_LOG(FoundStream("audio"));
+ EXPECT_MEDIA_LOG(CodecName("audio", "aac"));
+ EXPECT_MEDIA_LOG(FoundStream("video"));
+ EXPECT_MEDIA_LOG(CodecName("video", "h264"));
demuxer_->Initialize(
&host_, CreateInitDoneCB(kInfiniteDuration(), PIPELINE_OK), true);
EXPECT_EQ(ChunkDemuxer::kOk, AddIdForMp2tSource(kSourceId));
@@ -3352,8 +3586,10 @@ TEST_F(ChunkDemuxerTest, SetMemoryLimitType) {
base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(1000);
// Append data at the start that can be garbage collected:
- AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10);
- AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 0, 5);
+ AppendMuxedCluster(
+ MuxedStreamInfo(kAudioTrackNum,
+ "0K 23K 46K 69K 92K 115K 138K 161K 184K 207K", 23),
+ MuxedStreamInfo(kVideoTrackNum, "0K 33K 66K 99K 132K", 33));
// We should be right at buffer limit, should pass
EXPECT_TRUE(demuxer_->EvictCodedFrames(
@@ -3366,10 +3602,11 @@ TEST_F(ChunkDemuxerTest, SetMemoryLimitType) {
Seek(seek_time);
// Append data at seek_time.
- AppendSingleStreamCluster(kSourceId, kAudioTrackNum,
- seek_time.InMilliseconds(), 10);
- AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
- seek_time.InMilliseconds(), 5);
+ AppendMuxedCluster(
+ MuxedStreamInfo(
+ kAudioTrackNum,
+ "1000K 1023K 1046K 1069K 1092K 1115K 1138K 1161K 1184K 1207K", 23),
+ MuxedStreamInfo(kVideoTrackNum, "1000K 1033K 1066K 1099K 1132K", 33));
// We should delete first append, and be exactly at buffer limit
EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time, 0));
@@ -3593,6 +3830,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Video) {
append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
// Append a cluster that starts before and ends after the append window.
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30));
AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
"0K 30 60 90 120K 150 180 210 240K 270 300 330K");
@@ -3607,6 +3845,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Video) {
// Append more data and verify that adding buffers start at the next
// key frame.
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30));
AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
"360 390 420K 450 480 510 540K 570 600 630K");
CheckExpectedRanges(kSourceId, "{ [120,270) [420,630) }");
@@ -3621,6 +3860,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Audio) {
append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
// Append a cluster that starts before and ends after the append window.
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30));
AppendSingleStreamCluster(
kSourceId, kAudioTrackNum,
"0K 30K 60K 90K 120K 150K 180K 210K 240K 270K 300K 330K");
@@ -3641,6 +3881,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Audio) {
append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650);
// Append more data and verify that a new range is created.
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30));
AppendSingleStreamCluster(
kSourceId, kAudioTrackNum,
"360K 390K 420K 450K 480K 510K 540K 570K 600K 630K");
@@ -3655,6 +3896,8 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioOverlapStartAndEnd) {
append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(20);
// Append a cluster that starts before and ends after the append window.
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(
+ WebMClusterParser::kDefaultAudioBufferDurationInMs));
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K");
// Verify the append is clipped to the append window.
@@ -3678,7 +3921,9 @@ TEST_F(ChunkDemuxerTest, AppendWindow_WebMFile_AudioOnly) {
// partial append window trim must come from a previous Append() call.
scoped_refptr<DecoderBuffer> buffer =
ReadTestDataFile("bear-320x240-audio-only.webm");
+ ExpectInitMediaLogs(HAS_AUDIO);
EXPECT_CALL(*this, InitSegmentReceived());
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
AppendDataInPieces(buffer->data(), buffer->data_size(), 128);
DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
@@ -3703,7 +3948,9 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) {
// Read a WebM file into memory and append the data.
scoped_refptr<DecoderBuffer> buffer =
ReadTestDataFile("bear-320x240-audio-only.webm");
+ ExpectInitMediaLogs(HAS_AUDIO);
EXPECT_CALL(*this, InitSegmentReceived());
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
AppendDataInPieces(buffer->data(), buffer->data_size(), 512);
CheckExpectedRanges(kSourceId, "{ }");
@@ -3714,6 +3961,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) {
scoped_refptr<DecoderBuffer> buffer2 =
ReadTestDataFile("bear-320x240-audio-only-48khz.webm");
EXPECT_CALL(*this, InitSegmentReceived());
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(21));
EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber());
ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1));
AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512);
@@ -3740,8 +3988,8 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Text) {
// window.
AppendMuxedCluster(
MuxedStreamInfo(kVideoTrackNum,
- "0K 30 60 90 120K 150 180 210 240K 270 300 330K"),
- MuxedStreamInfo(kTextTrackNum, "0K 100K 200K 300K" ));
+ "0K 30 60 90 120K 150 180 210 240K 270 300 330K", 30),
+ MuxedStreamInfo(kTextTrackNum, "0K 100K 200K 300K"));
// Verify that text cues that start outside the window are not included
// in the buffer. Also verify that cues that extend beyond the
@@ -3756,9 +4004,9 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Text) {
// Append more data and verify that a new range is created.
AppendMuxedCluster(
MuxedStreamInfo(kVideoTrackNum,
- "360 390 420K 450 480 510 540K 570 600 630K"),
- MuxedStreamInfo(kTextTrackNum, "400K 500K 600K 700K" ));
- CheckExpectedRanges(kSourceId, "{ [100,270) [400,630) }");
+ "360 390 420K 450 480 510 540K 570 600 630K", 30),
+ MuxedStreamInfo(kTextTrackNum, "400K 500K 600K 700K"));
+ CheckExpectedRanges("{ [100,270) [400,630) }");
// Seek to the new range and verify that the expected buffers are returned.
Seek(base::TimeDelta::FromMilliseconds(420));
@@ -3768,6 +4016,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Text) {
TEST_F(ChunkDemuxerTest, StartWaitingForSeekAfterParseError) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
+ EXPECT_MEDIA_LOG(StreamParsingFailed());
EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
AppendGarbage();
base::TimeDelta seek_time = base::TimeDelta::FromSeconds(50);
@@ -3784,8 +4033,8 @@ TEST_F(ChunkDemuxerTest, Remove_AudioVideoText) {
DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
AppendMuxedCluster(
- MuxedStreamInfo(kAudioTrackNum, "0K 20K 40K 60K 80K 100K 120K 140K"),
- MuxedStreamInfo(kVideoTrackNum, "0K 30 60 90 120K 150 180"),
+ MuxedStreamInfo(kAudioTrackNum, "0K 20K 40K 60K 80K 100K 120K 140K", 20),
+ MuxedStreamInfo(kVideoTrackNum, "0K 30 60 90 120K 150 180", 30),
MuxedStreamInfo(kTextTrackNum, "0K 100K 200K"));
CheckExpectedBuffers(audio_stream, "0K 20K 40K 60K 80K 100K 120K 140K");
@@ -3802,8 +4051,8 @@ TEST_F(ChunkDemuxerTest, Remove_AudioVideoText) {
// Append new buffers that are clearly different than the original
// ones and verify that only the new buffers are returned.
AppendMuxedCluster(
- MuxedStreamInfo(kAudioTrackNum, "1K 21K 41K 61K 81K 101K 121K 141K"),
- MuxedStreamInfo(kVideoTrackNum, "1K 31 61 91 121K 151 181"),
+ MuxedStreamInfo(kAudioTrackNum, "1K 21K 41K 61K 81K 101K 121K 141K", 20),
+ MuxedStreamInfo(kVideoTrackNum, "1K 31 61 91 121K 151 181", 30),
MuxedStreamInfo(kTextTrackNum, "1K 101K 201K"));
Seek(base::TimeDelta());
@@ -3825,7 +4074,7 @@ TEST_F(ChunkDemuxerTest, Remove_StartAtDuration) {
EXPECT_CALL(host_, SetDuration(
base::TimeDelta::FromMilliseconds(160)));
AppendSingleStreamCluster(kSourceId, kAudioTrackNum,
- "0K 20K 40K 60K 80K 100K 120K 140K");
+ "0K 20K 40K 60K 80K 100K 120K 140D20K");
CheckExpectedRanges(kSourceId, "{ [0,160) }");
CheckExpectedBuffers(audio_stream, "0K 20K 40K 60K 80K 100K 120K 140K");
@@ -3868,8 +4117,8 @@ TEST_F(ChunkDemuxerTest, SeekCompletesWithoutTextCues) {
// Append audio & video data so the seek completes.
AppendMuxedCluster(
MuxedStreamInfo(kAudioTrackNum,
- "0K 20K 40K 60K 80K 100K 120K 140K 160K 180K 200K"),
- MuxedStreamInfo(kVideoTrackNum, "0K 30 60 90 120K 150 180 210"));
+ "0K 20K 40K 60K 80K 100K 120K 140K 160K 180K 200K", 20),
+ MuxedStreamInfo(kVideoTrackNum, "0K 30 60 90 120K 150 180 210", 30));
message_loop_.RunUntilIdle();
EXPECT_TRUE(seek_cb_was_called);
@@ -3883,10 +4132,9 @@ TEST_F(ChunkDemuxerTest, SeekCompletesWithoutTextCues) {
// Append text cues that start after the seek point and verify that
// they are returned by Read() calls.
- AppendMuxedCluster(
- MuxedStreamInfo(kAudioTrackNum, "220K 240K 260K 280K"),
- MuxedStreamInfo(kVideoTrackNum, "240K 270 300 330"),
- MuxedStreamInfo(kTextTrackNum, "225K 275K 325K"));
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "220K 240K 260K 280K", 20),
+ MuxedStreamInfo(kVideoTrackNum, "240K 270 300 330", 30),
+ MuxedStreamInfo(kTextTrackNum, "225K 275K 325K"));
message_loop_.RunUntilIdle();
EXPECT_TRUE(text_read_done);
@@ -3946,9 +4194,8 @@ TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) {
"110 120K 130 140K";
// Append 8 blocks (80 bytes) of data to audio stream and 15 blocks (150
// bytes) to video stream.
- AppendMuxedCluster(
- MuxedStreamInfo(kAudioTrackNum, kAudioStreamInfo),
- MuxedStreamInfo(kVideoTrackNum, kVideoStreamInfo));
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, kAudioStreamInfo, 40),
+ MuxedStreamInfo(kVideoTrackNum, kVideoStreamInfo, 10));
CheckExpectedBuffers(audio_stream, kAudioStreamInfo);
CheckExpectedBuffers(video_stream, kVideoStreamInfo);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698