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

Unified Diff: media/filters/chunk_demuxer_unittest.cc

Issue 1564983003: MSE: Log a warning if muxed AV media segment has no A or has no V block (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed previous CR comments 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 | « media/base/stream_parser.h ('k') | media/filters/media_source_state.h » ('j') | 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 cda4eddaba66808c6cf1fa0255337339c6ffbe55..8549f61ea135a5c04df2bb56243fcb4e5baf8b76 100644
--- a/media/filters/chunk_demuxer_unittest.cc
+++ b/media/filters/chunk_demuxer_unittest.cc
@@ -119,6 +119,15 @@ MATCHER_P(HasTimestamp, timestamp_in_ms, "") {
MATCHER(IsEndOfStream, "") { return arg.get() && arg->end_of_stream(); }
+MATCHER_P(SegmentMissingFrames, frame_types_string, "") {
+ return CONTAINS_STRING(arg, "Media segment did not contain any " +
+ std::string(frame_types_string) +
+ " coded frames, mismatching initialization "
+ "segment. Therefore, MSE coded frame "
+ "processing may not interoperably detect "
+ "discontinuities in appended media.");
+}
+
MATCHER(StreamParsingFailed, "") {
return CONTAINS_STRING(arg, "Append: stream parsing failed.");
}
@@ -760,10 +769,6 @@ class ChunkDemuxerTest : public ::testing::Test {
EXPECT_EQ(status, expected_status);
}
- void AppendEmptyCluster(int timecode) {
- AppendCluster(GenerateEmptyCluster(timecode));
- }
-
PipelineStatusCB CreateInitDoneCB(const base::TimeDelta& expected_duration,
PipelineStatus expected_status) {
if (expected_duration != kNoTimestamp())
@@ -932,7 +937,7 @@ class ChunkDemuxerTest : public ::testing::Test {
// seen so far for audio track).
// Last video frame has timestamp 2703 and duration 33 (from TrackEntry
// DefaultDuration for video track).
- CheckExpectedRanges(kSourceId, "{ [0,2736) }");
+ CheckExpectedRanges("{ [0,2736) }");
// Append initialization segment for bear2.
// Note: Offsets here and below are derived from
@@ -947,7 +952,7 @@ class ChunkDemuxerTest : public ::testing::Test {
EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
EXPECT_MEDIA_LOG(GeneratedSplice(20000, 527000));
AppendData(bear2->data() + 55290, 18785);
- CheckExpectedRanges(kSourceId, "{ [0,1027) [1201,2736) }");
+ CheckExpectedRanges("{ [0,1027) [1201,2736) }");
// Append initialization segment for bear1 & fill gap with [779-1197)
// segment.
@@ -956,7 +961,7 @@ class ChunkDemuxerTest : public ::testing::Test {
EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23));
EXPECT_MEDIA_LOG(GeneratedSplice(26000, 779000));
AppendData(bear1->data() + 72737, 28183);
- CheckExpectedRanges(kSourceId, "{ [0,2736) }");
+ CheckExpectedRanges("{ [0,2736) }");
MarkEndOfStream(PIPELINE_OK);
return true;
@@ -1150,12 +1155,16 @@ class ChunkDemuxerTest : public ::testing::Test {
return cb.Finish();
}
+ void CheckExpectedRangesForMediaSource(const std::string& expected) {
+ CheckExpectedRanges(demuxer_->GetBufferedRanges(), expected);
+ }
+
void CheckExpectedRanges(const std::string& expected) {
CheckExpectedRanges(kSourceId, expected);
+ CheckExpectedRangesForMediaSource(expected);
}
- void CheckExpectedRanges(const std::string& id,
- const std::string& expected) {
+ void CheckExpectedRanges(const std::string& id, const std::string& expected) {
CheckExpectedRanges(demuxer_->GetBufferedRanges(id), expected);
}
@@ -1547,7 +1556,7 @@ TEST_F(ChunkDemuxerTest, SingleTextTrackIdChange) {
WebMClusterParser::kDefaultVideoBufferDurationInMs),
MuxedStreamInfo(kAlternateTextTrackNum, "45K"));
- CheckExpectedRanges(kSourceId, "{ [0,92) }");
+ CheckExpectedRanges("{ [0,92) }");
CheckExpectedBuffers(audio_stream, "0K 23K 46K 69K");
CheckExpectedBuffers(video_stream, "0K 30 60K");
CheckExpectedBuffers(text_stream, "10K 45K");
@@ -1577,7 +1586,7 @@ TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) {
WebMClusterParser::kDefaultAudioBufferDurationInMs),
MuxedStreamInfo(kVideoTrackNum, "0 30K", 30),
MuxedStreamInfo(kTextTrackNum, "25K 40K"));
- CheckExpectedRanges(kSourceId, "{ [23,46) }");
+ CheckExpectedRanges("{ [23,46) }");
EXPECT_CALL(*this, InitSegmentReceived());
AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO);
@@ -2086,19 +2095,19 @@ TEST_F(ChunkDemuxerTest, EndOfStreamRangeChanges) {
// Check expected ranges and verify that an empty text track does not
// affect the expected ranges.
- CheckExpectedRanges(kSourceId, "{ [0,46) }");
+ CheckExpectedRanges("{ [0,46) }");
EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(66)));
MarkEndOfStream(PIPELINE_OK);
// Check expected ranges and verify that an empty text track does not
// affect the expected ranges.
- CheckExpectedRanges(kSourceId, "{ [0,66) }");
+ CheckExpectedRanges("{ [0,66) }");
// Unmark end of stream state and verify that the ranges return to
// their pre-"end of stream" values.
demuxer_->UnmarkEndOfStream();
- CheckExpectedRanges(kSourceId, "{ [0,46) }");
+ CheckExpectedRanges("{ [0,46) }");
// Add text track data and verify that the buffered ranges don't change
// since the intersection of all the tracks doesn't change.
@@ -2112,7 +2121,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamRangeChanges) {
// Mark end of stream and verify that text track data is reflected in
// the new range.
MarkEndOfStream(PIPELINE_OK);
- CheckExpectedRanges(kSourceId, "{ [0,200) }");
+ CheckExpectedRanges("{ [0,200) }");
}
// Make sure AppendData() will accept elements that span multiple calls.
@@ -2258,7 +2267,6 @@ TEST_F(ChunkDemuxerTest, WebMFile_AltRefFrames) {
// Verify that we output buffers before the entire cluster has been parsed.
TEST_F(ChunkDemuxerTest, IncrementalClusterParsing) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
- AppendEmptyCluster(0);
scoped_ptr<Cluster> cluster(GenerateCluster(0, 6));
@@ -2641,6 +2649,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamAfterPastEosSeek) {
EXPECT_CALL(host_, SetDuration(
base::TimeDelta::FromMilliseconds(120)));
MarkEndOfStream(PIPELINE_OK);
+ CheckExpectedRanges("{ [0,120) }");
message_loop_.RunUntilIdle();
EXPECT_TRUE(seek_cb_was_called);
@@ -2739,63 +2748,165 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) {
CheckExpectedRanges("{ [0,132) [200,299) }");
}
-TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) {
- ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
+TEST_F(ChunkDemuxerTest, GetBufferedRanges_SeparateStreams) {
+ std::string audio_id = "audio1";
+ std::string video_id = "video1";
+ ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
+
+ // Append audio and video data into separate source ids.
- // Audio: 0 -> 23
- // Video: 0 -> 33
+ // Audio block: 0 -> 23
+ // Video block: 0 -> 33
// Buffered Range: 0 -> 23
// Audio block duration is smaller than video block duration,
// so the buffered ranges should correspond to the audio blocks.
- AppendCluster(GenerateSingleStreamCluster(
- 0, kAudioBlockDuration, kAudioTrackNum, kAudioBlockDuration));
- AppendCluster(GenerateSingleStreamCluster(
- 0, kVideoBlockDuration, kVideoTrackNum, kVideoBlockDuration));
-
- CheckExpectedRanges("{ [0,23) }");
-
- // Audio: 300 -> 400
- // Video: 320 -> 420
- // Buffered Range: 320 -> 400 (end overlap)
- AppendCluster(GenerateSingleStreamCluster(300, 400, kAudioTrackNum, 50));
- AppendCluster(GenerateSingleStreamCluster(320, 420, kVideoTrackNum, 50));
-
- CheckExpectedRanges("{ [0,23) [320,400) }");
-
- // Audio: 520 -> 590
- // Video: 500 -> 570
- // Buffered Range: 520 -> 570 (front overlap)
- AppendCluster(GenerateSingleStreamCluster(520, 590, kAudioTrackNum, 70));
- AppendCluster(GenerateSingleStreamCluster(500, 570, kVideoTrackNum, 70));
+ AppendCluster(audio_id,
+ GenerateSingleStreamCluster(0, 23, kAudioTrackNum, 23));
+ AppendCluster(video_id,
+ GenerateSingleStreamCluster(0, 33, kVideoTrackNum, 33));
+ CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) }");
+ CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) }");
+ CheckExpectedRangesForMediaSource("{ [0,23) }");
+
+ // Audio blocks: 300 -> 400
+ // Video blocks: 320 -> 420
+ // Buffered Range: 320 -> 400 (jagged start and end across SourceBuffers)
+ AppendCluster(audio_id,
+ GenerateSingleStreamCluster(300, 400, kAudioTrackNum, 50));
+ AppendCluster(video_id,
+ GenerateSingleStreamCluster(320, 420, kVideoTrackNum, 50));
+ CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) }");
+ CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) }");
+ CheckExpectedRangesForMediaSource("{ [0,23) [320,400) }");
+
+ // Audio block: 520 -> 590
+ // Video block: 500 -> 570
+ // Buffered Range: 520 -> 570 (jagged start and end across SourceBuffers)
+ AppendCluster(audio_id,
+ GenerateSingleStreamCluster(520, 590, kAudioTrackNum, 70));
+ AppendCluster(video_id,
+ GenerateSingleStreamCluster(500, 570, kVideoTrackNum, 70));
+ CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) [520,590) }");
+ CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) [500,570) }");
+ CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) }");
+
+ // Audio block: 720 -> 750
+ // Video block: 700 -> 770
+ // Buffered Range: 720 -> 750 (complete overlap of audio)
+ AppendCluster(audio_id,
+ GenerateSingleStreamCluster(720, 750, kAudioTrackNum, 30));
+ AppendCluster(video_id,
+ GenerateSingleStreamCluster(700, 770, kVideoTrackNum, 70));
+ CheckExpectedRanges(DemuxerStream::AUDIO,
+ "{ [0,23) [300,400) [520,590) [720,750) }");
+ CheckExpectedRanges(DemuxerStream::VIDEO,
+ "{ [0,33) [320,420) [500,570) [700,770) }");
+ CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) [720,750) }");
+
+ // Audio block: 900 -> 970
+ // Video block: 920 -> 950
+ // Buffered Range: 920 -> 950 (complete overlap of video)
+ AppendCluster(audio_id,
+ GenerateSingleStreamCluster(900, 970, kAudioTrackNum, 70));
+ AppendCluster(video_id,
+ GenerateSingleStreamCluster(920, 950, kVideoTrackNum, 30));
+ CheckExpectedRanges(DemuxerStream::AUDIO,
+ "{ [0,23) [300,400) [520,590) [720,750) [900,970) }");
+ CheckExpectedRanges(DemuxerStream::VIDEO,
+ "{ [0,33) [320,420) [500,570) [700,770) [920,950) }");
+ CheckExpectedRangesForMediaSource(
+ "{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
- CheckExpectedRanges("{ [0,23) [320,400) [520,570) }");
+ // Appending within buffered range should not affect buffered ranges.
+ EXPECT_MEDIA_LOG(GeneratedSplice(40000, 930000));
+ AppendCluster(audio_id,
+ GenerateSingleStreamCluster(930, 950, kAudioTrackNum, 20));
+ AppendCluster(video_id,
+ GenerateSingleStreamCluster(930, 950, kVideoTrackNum, 20));
+ CheckExpectedRanges(DemuxerStream::AUDIO,
+ "{ [0,23) [300,400) [520,590) [720,750) [900,970) }");
+ CheckExpectedRanges(DemuxerStream::VIDEO,
+ "{ [0,33) [320,420) [500,570) [700,770) [920,950) }");
+ CheckExpectedRangesForMediaSource(
+ "{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
+}
- // Audio: 720 -> 750
- // Video: 700 -> 770
- // Buffered Range: 720 -> 750 (complete overlap, audio)
- AppendCluster(GenerateSingleStreamCluster(720, 750, kAudioTrackNum, 30));
- AppendCluster(GenerateSingleStreamCluster(700, 770, kVideoTrackNum, 70));
+TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) {
+ ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
- CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) }");
+ // Audio block: 0 -> 23
+ // Video block: 0 -> 33
+ // Buffered Range: 0 -> 23
+ // Audio block duration is smaller than video block duration,
+ // so the buffered ranges should correspond to the audio blocks.
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0D23K"),
+ MuxedStreamInfo(kVideoTrackNum, "0D33K"));
- // Audio: 900 -> 970
- // Video: 920 -> 950
- // Buffered Range: 920 -> 950 (complete overlap, video)
- AppendCluster(GenerateSingleStreamCluster(900, 970, kAudioTrackNum, 70));
- AppendCluster(GenerateSingleStreamCluster(920, 950, kVideoTrackNum, 30));
+ CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) }");
+ CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) }");
+ CheckExpectedRanges("{ [0,23) }");
- CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
+ // Audio blocks: 300 -> 400
+ // Video blocks: 320 -> 420
+ // Naive Buffered Range: 320 -> 400 (end overlap) **
+ // **Except these are in the same cluster, with same segment start time of
+ // 300, so the added buffered range is 300 -> 400 (still with end overlap)
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "300K 350D50K"),
+ MuxedStreamInfo(kVideoTrackNum, "320K 370D50K"));
+
+ CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) }");
+ CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [300,420) }");
+ CheckExpectedRanges("{ [0,23) [300,400) }");
+
+ // Audio block: 520 -> 590
+ // Video block: 500 -> 570
+ // Naive Buffered Range: 520 -> 570 (front overlap) **
+ // **Except these are in the same cluster, with same segment start time of
+ // 500, so the added buffered range is 500 -> 570
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "520D70K"),
+ MuxedStreamInfo(kVideoTrackNum, "500D70K"));
+
+ CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) [500,590) }");
+ CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [300,420) [500,570) }");
+ CheckExpectedRanges("{ [0,23) [300,400) [500,570) }");
+
+ // Audio block: 720 -> 750
+ // Video block: 700 -> 770
+ // Naive Buffered Range: 720 -> 750 (complete overlap, audio) **
+ // **Except these are in the same cluster, with same segment start time of
+ // 700, so the added buffered range is 700 -> 750
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "720D30K"),
+ MuxedStreamInfo(kVideoTrackNum, "700D70K"));
+
+ CheckExpectedRanges(DemuxerStream::AUDIO,
+ "{ [0,23) [300,400) [500,590) [700,750) }");
+ CheckExpectedRanges(DemuxerStream::VIDEO,
+ "{ [0,33) [300,420) [500,570) [700,770) }");
+ CheckExpectedRanges("{ [0,23) [300,400) [500,570) [700,750) }");
+
+ // Audio block: 900 -> 970
+ // Video block: 920 -> 950
+ // Naive Buffered Range: 920 -> 950 (complete overlap, video) **
+ // **Except these are in the same cluster, with same segment start time of
+ // 900, so the added buffered range is 900 -> 950
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "900D70K"),
+ MuxedStreamInfo(kVideoTrackNum, "920D30K"));
+
+ CheckExpectedRanges(DemuxerStream::AUDIO,
+ "{ [0,23) [300,400) [500,590) [700,750) [900,970) }");
+ CheckExpectedRanges(DemuxerStream::VIDEO,
+ "{ [0,33) [300,420) [500,570) [700,770) [900,950) }");
+ CheckExpectedRanges("{ [0,23) [300,400) [500,570) [700,750) [900,950) }");
// Appending within buffered range should not affect buffered ranges.
EXPECT_MEDIA_LOG(GeneratedSplice(40000, 930000));
AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "930D20K"),
MuxedStreamInfo(kVideoTrackNum, "930D20K"));
- CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
-
- // Appending to single stream outside buffered ranges should not affect
- // buffered ranges.
- AppendCluster(GenerateSingleStreamCluster(1230, 1240, kVideoTrackNum, 10));
- CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
+ CheckExpectedRanges(DemuxerStream::AUDIO,
+ "{ [0,23) [300,400) [500,590) [700,750) [900,970) }");
+ CheckExpectedRanges(DemuxerStream::VIDEO,
+ "{ [0,33) [300,420) [500,570) [700,770) [900,950) }");
+ CheckExpectedRanges("{ [0,23) [300,400) [500,570) [700,750) [900,950) }");
}
TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideoText) {
@@ -2940,18 +3051,6 @@ TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesOutOfRange) {
ExpectEndOfStream(DemuxerStream::VIDEO);
}
-TEST_F(ChunkDemuxerTest, ClusterWithNoBuffers) {
- ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
- // Generate and append an empty cluster beginning at 0.
- AppendEmptyCluster(0);
-
- // Sanity check that data can be appended after this cluster correctly.
- AppendCluster(GenerateCluster(0, 2));
- ExpectRead(DemuxerStream::AUDIO, 0);
- ExpectRead(DemuxerStream::VIDEO, 0);
-}
-
TEST_F(ChunkDemuxerTest, CodecPrefixMatching) {
ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported;
@@ -3374,27 +3473,65 @@ TEST_F(ChunkDemuxerTest, SeekCompleteDuringAbort) {
TEST_F(ChunkDemuxerTest, WebMIsParsingMediaSegmentDetection) {
const uint8_t kBuffer[] = {
- 0x1F, 0x43, 0xB6, 0x75, 0x83, // CLUSTER (size = 3)
- 0xE7, 0x81, 0x01, // Cluster TIMECODE (value = 1)
-
- 0x1F, 0x43, 0xB6, 0x75,
- 0xFF, // CLUSTER (size = unknown; really 3 due to:)
- 0xE7, 0x81, 0x02, // Cluster TIMECODE (value = 2)
- /* e.g. put some blocks here... */
- 0x1A, 0x45, 0xDF, 0xA3,
- 0x8A, // EBMLHEADER (size = 10, not fully appended)
+ // CLUSTER (size = 10)
+ 0x1F, 0x43, 0xB6, 0x75, 0x8A,
+
+ // Cluster TIMECODE (value = 1)
+ 0xE7, 0x81, 0x01,
+
+ // SIMPLEBLOCK (size = 5)
+ 0xA3, 0x85,
+
+ // Audio Track Number
+ 0x80 | (kAudioTrackNum & 0x7F),
+
+ // Timecode (relative to cluster) (value = 0)
+ 0x00, 0x00,
+
+ // Keyframe flag
+ 0x80,
+
+ // Fake block data
+ 0x00,
+
+ // CLUSTER (size = unknown; really 10)
+ 0x1F, 0x43, 0xB6, 0x75, 0xFF,
+
+ // Cluster TIMECODE (value = 2)
+ 0xE7, 0x81, 0x02,
+
+ // SIMPLEBLOCK (size = 5)
+ 0xA3, 0x85,
+
+ // Audio Track Number
+ 0x80 | (kAudioTrackNum & 0x7F),
+
+ // Timecode (relative to cluster) (value = 0)
+ 0x00, 0x00,
+
+ // Keyframe flag
+ 0x80,
+
+ // Fake block data
+ 0x00,
+
+ // EBMLHEADER (size = 10, not fully appended)
+ 0x1A, 0x45, 0xDF, 0xA3, 0x8A,
chcunningham 2016/01/20 00:40:59 Is this part needed?
wolenetz 2016/01/20 00:45:48 Indeed it is. The termination of an "unknown"-size
};
// This array indicates expected return value of IsParsingMediaSegment()
// following each incrementally appended byte in |kBuffer|.
const bool kExpectedReturnValues[] = {
- false, false, false, false, true,
- true, true, false,
+ // First Cluster, explicit size
+ false, false, false, false, true, true, true, true, true, true, true,
+ true, true, true, false,
- false, false, false, false, true,
- true, true, true,
+ // Second Cluster, unknown size
+ false, false, false, false, true, true, true, true, true, true, true,
+ true, true, true, true,
- true, true, true, true, false,
+ // EBMLHEADER
+ true, true, true, true, false,
};
static_assert(arraysize(kBuffer) == arraysize(kExpectedReturnValues),
@@ -3402,8 +3539,9 @@ TEST_F(ChunkDemuxerTest, WebMIsParsingMediaSegmentDetection) {
static_assert(arraysize(kBuffer) == sizeof(kBuffer),
"there should be one byte per index");
- ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
+ ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
+ EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23)).Times(2);
+ EXPECT_MEDIA_LOG(GeneratedSplice(22000, 2000));
for (size_t i = 0; i < sizeof(kBuffer); i++) {
DVLOG(3) << "Appending and testing index " << i;
AppendData(kBuffer + i, 1);
@@ -3422,7 +3560,7 @@ TEST_F(ChunkDemuxerTest, DurationChange) {
kStreamDuration - kVideoBlockDuration,
2));
- CheckExpectedRanges(kSourceId, "{ [201191,201224) }");
+ CheckExpectedRanges("{ [201191,201224) }");
// Add data beginning at the currently set duration and expect a new duration
// to be signaled. Note that the last video block will have a higher end
@@ -3432,7 +3570,7 @@ TEST_F(ChunkDemuxerTest, DurationChange) {
base::TimeDelta::FromMilliseconds(kNewStreamDurationVideo)));
AppendCluster(GenerateCluster(kDefaultDuration().InMilliseconds(), 2));
- CheckExpectedRanges(kSourceId, "{ [201191,201247) }");
+ CheckExpectedRanges("{ [201191,201247) }");
// Add more data to the end of each media type. Note that the last audio block
// will have a higher end timestamp than the last video block.
@@ -3445,7 +3583,7 @@ TEST_F(ChunkDemuxerTest, DurationChange) {
// See that the range has increased appropriately (but not to the full
// duration of 201293, since there is not enough video appended for that).
- CheckExpectedRanges(kSourceId, "{ [201191,201290) }");
+ CheckExpectedRanges("{ [201191,201290) }");
}
TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) {
@@ -3505,7 +3643,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) {
AppendCluster(0, 10);
AppendCluster(300, 10);
- CheckExpectedRanges(kSourceId, "{ [0,132) [300,432) }");
+ CheckExpectedRanges("{ [0,132) [300,432) }");
GenerateExpectedReads(0, 10);
@@ -3535,7 +3673,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) {
message_loop_.RunUntilIdle();
- CheckExpectedRanges(kSourceId, "{ [0,435) }");
+ CheckExpectedRanges("{ [0,435) }");
// Verify that the reads have completed.
EXPECT_TRUE(audio_read_done);
@@ -3622,7 +3760,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_SingleRange_SeekForward) {
demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize);
// Append some data at position 1000ms
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 10);
- CheckExpectedRanges(kSourceId, "{ [1000,1230) }");
+ CheckExpectedRanges("{ [1000,1230) }");
// GC should be able to evict frames in the currently buffered range, since
// those frames are earlier than the seek target position.
@@ -3632,7 +3770,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_SingleRange_SeekForward) {
// Append data to complete seek operation
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5);
- CheckExpectedRanges(kSourceId, "{ [1115,1230) [2000,2115) }");
+ CheckExpectedRanges("{ [1115,1230) [2000,2115) }");
}
TEST_F(ChunkDemuxerTest, GCDuringSeek_SingleRange_SeekBack) {
@@ -3640,7 +3778,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_SingleRange_SeekBack) {
demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize);
// Append some data at position 1000ms
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 10);
- CheckExpectedRanges(kSourceId, "{ [1000,1230) }");
+ CheckExpectedRanges("{ [1000,1230) }");
// GC should be able to evict frames in the currently buffered range, since
// seek target position has no data and so we should allow some frames to be
@@ -3651,7 +3789,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_SingleRange_SeekBack) {
// Append data to complete seek operation
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 5);
- CheckExpectedRanges(kSourceId, "{ [0,115) [1115,1230) }");
+ CheckExpectedRanges("{ [0,115) [1115,1230) }");
}
TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekForward) {
@@ -3660,7 +3798,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekForward) {
// Append some data at position 1000ms then at 2000ms
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 5);
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5);
- CheckExpectedRanges(kSourceId, "{ [1000,1115) [2000,2115) }");
+ CheckExpectedRanges("{ [1000,1115) [2000,2115) }");
// GC should be able to evict frames in the currently buffered ranges, since
// those frames are earlier than the seek target position.
@@ -3670,7 +3808,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekForward) {
// Append data to complete seek operation
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 3000, 5);
- CheckExpectedRanges(kSourceId, "{ [2069,2115) [3000,3115) }");
+ CheckExpectedRanges("{ [2069,2115) [3000,3115) }");
}
TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween1) {
@@ -3679,7 +3817,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween1) {
// Append some data at position 1000ms then at 2000ms
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 5);
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5);
- CheckExpectedRanges(kSourceId, "{ [1000,1115) [2000,2115) }");
+ CheckExpectedRanges("{ [1000,1115) [2000,2115) }");
// GC should be able to evict all frames from the first buffered range, since
// those frames are earlier than the seek target position. But there's only 5
@@ -3695,7 +3833,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween1) {
// Append data to complete seek operation
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1500, 5);
- CheckExpectedRanges(kSourceId, "{ [1500,1615) [2069,2115) }");
+ CheckExpectedRanges("{ [1500,1615) [2069,2115) }");
}
TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween2) {
@@ -3707,7 +3845,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween2) {
// GC algorithm since it tries to preserve more recently appended data).
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5);
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 5);
- CheckExpectedRanges(kSourceId, "{ [1000,1115) [2000,2115) }");
+ CheckExpectedRanges("{ [1000,1115) [2000,2115) }");
// Now try performing garbage collection without announcing seek first, i.e.
// without calling Seek(), the GC algorithm should try to preserve data in the
@@ -3716,7 +3854,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween2) {
EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time, 5 * kBlockSize));
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1500, 5);
- CheckExpectedRanges(kSourceId, "{ [1000,1115) [1500,1615) }");
+ CheckExpectedRanges("{ [1000,1115) [1500,1615) }");
}
TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekBack) {
@@ -3725,7 +3863,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekBack) {
// Append some data at position 1000ms then at 2000ms
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 5);
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5);
- CheckExpectedRanges(kSourceId, "{ [1000,1115) [2000,2115) }");
+ CheckExpectedRanges("{ [1000,1115) [2000,2115) }");
// GC should be able to evict frames in the currently buffered ranges, since
// those frames are earlier than the seek target position.
@@ -3735,7 +3873,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekBack) {
// Append data to complete seek operation
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 5);
- CheckExpectedRanges(kSourceId, "{ [0,115) [2069,2115) }");
+ CheckExpectedRanges("{ [0,115) [2069,2115) }");
}
TEST_F(ChunkDemuxerTest, GCDuringSeek) {
@@ -3752,11 +3890,11 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek) {
// Append data to satisfy the first seek request.
AppendSingleStreamCluster(kSourceId, kAudioTrackNum,
seek_time1.InMilliseconds(), 5);
- CheckExpectedRanges(kSourceId, "{ [1000,1115) }");
+ CheckExpectedRanges("{ [1000,1115) }");
// We are under memory limit, so Evict should be a no-op.
EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time1, 0));
- CheckExpectedRanges(kSourceId, "{ [1000,1115) }");
+ CheckExpectedRanges("{ [1000,1115) }");
// Signal that the second seek is starting.
demuxer_->StartWaitingForSeek(seek_time2);
@@ -3764,13 +3902,13 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek) {
// Append data to satisfy the second seek.
AppendSingleStreamCluster(kSourceId, kAudioTrackNum,
seek_time2.InMilliseconds(), 5);
- CheckExpectedRanges(kSourceId, "{ [500,615) [1000,1115) }");
+ CheckExpectedRanges("{ [500,615) [1000,1115) }");
// We are now over our memory usage limit. We have just seeked to |seek_time2|
// so data around 500ms position should be preserved, while the previous
// append at 1000ms should be removed.
EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time2, 0));
- CheckExpectedRanges(kSourceId, "{ [500,615) }");
+ CheckExpectedRanges("{ [500,615) }");
// Complete the seek.
demuxer_->Seek(seek_time2, NewExpectedStatusCB(PIPELINE_OK));
@@ -3780,7 +3918,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek) {
// and the newly appended range, since this is the most recent append.
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 700, 5);
EXPECT_FALSE(demuxer_->EvictCodedFrames(kSourceId, seek_time2, 0));
- CheckExpectedRanges(kSourceId, "{ [500,615) [700,815) }");
+ CheckExpectedRanges("{ [500,615) [700,815) }");
}
TEST_F(ChunkDemuxerTest, GCKeepPlayhead) {
@@ -3790,26 +3928,26 @@ TEST_F(ChunkDemuxerTest, GCKeepPlayhead) {
// Append data at the start that can be garbage collected:
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10);
- CheckExpectedRanges(kSourceId, "{ [0,230) }");
+ CheckExpectedRanges("{ [0,230) }");
// We expect garbage collection to fail, as we don't want to spontaneously
// create gaps in source buffer stream. Gaps could break playback for many
// clients, who don't bother to check ranges after append.
EXPECT_FALSE(demuxer_->EvictCodedFrames(
kSourceId, base::TimeDelta::FromMilliseconds(0), 0));
- CheckExpectedRanges(kSourceId, "{ [0,230) }");
+ CheckExpectedRanges("{ [0,230) }");
// Increase media_time a bit, this will allow some data to be collected, but
// we are still over memory usage limit.
base::TimeDelta seek_time1 = base::TimeDelta::FromMilliseconds(23*2);
Seek(seek_time1);
EXPECT_FALSE(demuxer_->EvictCodedFrames(kSourceId, seek_time1, 0));
- CheckExpectedRanges(kSourceId, "{ [46,230) }");
+ CheckExpectedRanges("{ [46,230) }");
base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(23*4);
Seek(seek_time2);
EXPECT_FALSE(demuxer_->EvictCodedFrames(kSourceId, seek_time2, 0));
- CheckExpectedRanges(kSourceId, "{ [92,230) }");
+ CheckExpectedRanges("{ [92,230) }");
// media_time has progressed to a point where we can collect enough data to
// be under memory limit, so Evict should return true.
@@ -3819,7 +3957,7 @@ TEST_F(ChunkDemuxerTest, GCKeepPlayhead) {
// Strictly speaking the current playback time is 23*6==138ms, so we could
// release data up to 138ms, but we only release as much data as necessary
// to bring memory usage under the limit, so we release only up to 115ms.
- CheckExpectedRanges(kSourceId, "{ [115,230) }");
+ CheckExpectedRanges("{ [115,230) }");
}
TEST_F(ChunkDemuxerTest, AppendWindow_Video) {
@@ -3838,7 +3976,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Video) {
// Verify that GOPs that start outside the window are not included
// in the buffer. Also verify that buffers that start inside the
// window and extend beyond the end of the window are not included.
- CheckExpectedRanges(kSourceId, "{ [120,270) }");
+ CheckExpectedRanges("{ [120,270) }");
CheckExpectedBuffers(stream, "120K 150 180 210 240K");
// Extend the append window to [50,650).
@@ -3849,7 +3987,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Video) {
EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30));
AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
"360 390 420K 450 480 510 540K 570 600 630K");
- CheckExpectedRanges(kSourceId, "{ [120,270) [420,630) }");
+ CheckExpectedRanges("{ [120,270) [420,630) }");
}
TEST_F(ChunkDemuxerTest, AppendWindow_Audio) {
@@ -3872,7 +4010,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Audio) {
//
// The first 50ms of the range should be truncated since it overlaps
// the start of the append window.
- CheckExpectedRanges(kSourceId, "{ [50,280) }");
+ CheckExpectedRanges("{ [50,280) }");
// The "50P" buffer is the "0" buffer marked for complete discard. The next
// "50" buffer is the "30" buffer marked with 20ms of start discard.
@@ -3886,7 +4024,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Audio) {
AppendSingleStreamCluster(
kSourceId, kAudioTrackNum,
"360K 390K 420K 450K 480K 510K 540K 570K 600K 630K");
- CheckExpectedRanges(kSourceId, "{ [50,280) [360,650) }");
+ CheckExpectedRanges("{ [50,280) [360,650) }");
}
TEST_F(ChunkDemuxerTest, AppendWindow_AudioOverlapStartAndEnd) {
@@ -3902,7 +4040,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioOverlapStartAndEnd) {
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K");
// Verify the append is clipped to the append window.
- CheckExpectedRanges(kSourceId, "{ [10,20) }");
+ CheckExpectedRanges("{ [10,20) }");
}
TEST_F(ChunkDemuxerTest, AppendWindow_WebMFile_AudioOnly) {
@@ -3953,7 +4091,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) {
EXPECT_CALL(*this, InitSegmentReceived());
EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
AppendDataInPieces(buffer->data(), buffer->data_size(), 512);
- CheckExpectedRanges(kSourceId, "{ }");
+ CheckExpectedRanges("{ }");
DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
AudioDecoderConfig config_1 = stream->audio_decoder_config();
@@ -3966,7 +4104,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) {
EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber());
ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1));
AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512);
- CheckExpectedRanges(kSourceId, "{ [2746,5519) }");
+ CheckExpectedRanges("{ [2746,5519) }");
Seek(duration_1);
ExpectConfigChanged(DemuxerStream::AUDIO);
@@ -3995,7 +4133,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Text) {
// Verify that text cues that start outside the window are not included
// in the buffer. Also verify that cues that extend beyond the
// window are not included.
- CheckExpectedRanges(kSourceId, "{ [100,270) }");
+ CheckExpectedRanges("{ [100,270) }");
CheckExpectedBuffers(video_stream, "120K 150 180 210 240K");
CheckExpectedBuffers(text_stream, "100K");
@@ -4047,7 +4185,7 @@ TEST_F(ChunkDemuxerTest, Remove_AudioVideoText) {
base::TimeDelta::FromMilliseconds(300));
// Verify that all the appended data has been removed.
- CheckExpectedRanges(kSourceId, "{ }");
+ CheckExpectedRanges("{ }");
// Append new buffers that are clearly different than the original
// ones and verify that only the new buffers are returned.
@@ -4077,7 +4215,7 @@ TEST_F(ChunkDemuxerTest, Remove_StartAtDuration) {
AppendSingleStreamCluster(kSourceId, kAudioTrackNum,
"0K 20K 40K 60K 80K 100K 120K 140D20K");
- CheckExpectedRanges(kSourceId, "{ [0,160) }");
+ CheckExpectedRanges("{ [0,160) }");
CheckExpectedBuffers(audio_stream, "0K 20K 40K 60K 80K 100K 120K 140K");
demuxer_->Remove(kSourceId,
@@ -4085,7 +4223,7 @@ TEST_F(ChunkDemuxerTest, Remove_StartAtDuration) {
kInfiniteDuration());
Seek(base::TimeDelta());
- CheckExpectedRanges(kSourceId, "{ [0,160) }");
+ CheckExpectedRanges("{ [0,160) }");
CheckExpectedBuffers(audio_stream, "0K 20K 40K 60K 80K 100K 120K 140K");
}
@@ -4153,11 +4291,11 @@ TEST_F(ChunkDemuxerTest, ClusterWithUnknownSize) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
AppendCluster(GenerateCluster(0, 0, 4, true));
- CheckExpectedRanges(kSourceId, "{ [0,46) }");
+ CheckExpectedRanges("{ [0,46) }");
// A new cluster indicates end of the previous cluster with unknown size.
AppendCluster(GenerateCluster(46, 66, 5, true));
- CheckExpectedRanges(kSourceId, "{ [0,115) }");
+ CheckExpectedRanges("{ [0,115) }");
}
TEST_F(ChunkDemuxerTest, CuesBetweenClustersWithUnknownSize) {
@@ -4171,7 +4309,7 @@ TEST_F(ChunkDemuxerTest, CuesBetweenClustersWithUnknownSize) {
data.insert(data.end(), cluster->data(), cluster->data() + cluster->size());
AppendData(&*data.begin(), data.size());
- CheckExpectedRanges(kSourceId, "{ [0,115) }");
+ CheckExpectedRanges("{ [0,115) }");
}
TEST_F(ChunkDemuxerTest, CuesBetweenClusters) {
@@ -4180,7 +4318,7 @@ TEST_F(ChunkDemuxerTest, CuesBetweenClusters) {
AppendCluster(GenerateCluster(0, 0, 4));
AppendData(kCuesHeader, sizeof(kCuesHeader));
AppendCluster(GenerateCluster(46, 66, 5));
- CheckExpectedRanges(kSourceId, "{ [0,115) }");
+ CheckExpectedRanges("{ [0,115) }");
}
TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) {
@@ -4233,4 +4371,34 @@ TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) {
CheckExpectedBuffers(video_stream, "60K 70 80K 90 100K 110 120K 130 140K");
}
+TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioOnly) {
+ ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
+ EXPECT_MEDIA_LOG(SegmentMissingFrames("audio"));
+ AppendCluster(GenerateEmptyCluster(0));
+}
+
+TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_VideoOnly) {
+ ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
+ EXPECT_MEDIA_LOG(SegmentMissingFrames("video"));
+ AppendCluster(GenerateEmptyCluster(0));
+}
+
+TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioVideo) {
+ ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
+ EXPECT_MEDIA_LOG(SegmentMissingFrames("audio"));
+ AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 0, 10);
+}
+
+TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_AudioVideo) {
+ ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
+ EXPECT_MEDIA_LOG(SegmentMissingFrames("video"));
+ AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10);
+}
+
+TEST_F(ChunkDemuxerTest, SegmentMissingAudioVideoFrames) {
+ ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
+ EXPECT_MEDIA_LOG(SegmentMissingFrames("audio or video"));
+ AppendCluster(GenerateEmptyCluster(0));
+}
+
} // namespace media
« no previous file with comments | « media/base/stream_parser.h ('k') | media/filters/media_source_state.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698