Index: media/filters/chunk_demuxer_unittest.cc |
diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc |
index 2e4983d10d910535f5a956e6d1d1bd4675855e9e..d46c36c648b7c7fdbe38cdef025b91adc75dfbe1 100644 |
--- a/media/filters/chunk_demuxer_unittest.cc |
+++ b/media/filters/chunk_demuxer_unittest.cc |
@@ -18,8 +18,8 @@ |
#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" |
@@ -116,6 +116,13 @@ 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"); |
+} |
+ |
static void OnReadDone(const base::TimeDelta& expected_time, |
bool* called, |
DemuxerStream::Status status, |
@@ -181,9 +188,12 @@ class ChunkDemuxerTest : public ::testing::Test { |
base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); |
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)); |
+ demuxer_.reset(new ChunkDemuxer( |
+ open_cb, encrypted_media_init_data_cb, |
+ scoped_refptr<MockMediaLog>(new MockMediaLog()), true)); |
+ |
+ // BIG TODO start here: use strick mock media log and verify the new media |
+ // logs (and any pre-existing ones...) |
} |
virtual ~ChunkDemuxerTest() { |
@@ -441,6 +451,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) { |
@@ -459,6 +474,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) || is_last_block); |
chcunningham
2016/01/07 22:23:56
I *think* you're trying to assert that
(explicit
wolenetz
2016/01/07 22:37:09
Correct.
wolenetz
2016/01/16 01:23:35
Fixed already in landed prereq CL https://coderevi
|
+ 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 || |
@@ -642,10 +668,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()) |
@@ -774,7 +796,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 |
@@ -787,14 +809,14 @@ class ChunkDemuxerTest : public ::testing::Test { |
// Append a media segment that goes from [0.527000, 1.014000). |
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. |
EXPECT_CALL(*this, InitSegmentReceived()); |
AppendData(bear1->data(), 4370); |
AppendData(bear1->data() + 72737, 28183); |
- CheckExpectedRanges(kSourceId, "{ [0,2736) }"); |
+ CheckExpectedRanges("{ [0,2736) }"); |
MarkEndOfStream(PIPELINE_OK); |
return true; |
@@ -992,8 +1014,7 @@ class ChunkDemuxerTest : public ::testing::Test { |
CheckExpectedRanges(kSourceId, 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); |
} |
@@ -1374,7 +1395,7 @@ TEST_F(ChunkDemuxerTest, SingleTextTrackIdChange) { |
MuxedStreamInfo(kAudioTrackNum, "0K 23K"), |
MuxedStreamInfo(kVideoTrackNum, "0K 30"), |
MuxedStreamInfo(kTextTrackNum, "10K")); |
- CheckExpectedRanges(kSourceId, "{ [0,46) }"); |
+ CheckExpectedRanges("{ [0,46) }"); |
scoped_ptr<uint8_t[]> info_tracks; |
int info_tracks_size = 0; |
@@ -1393,7 +1414,7 @@ TEST_F(ChunkDemuxerTest, SingleTextTrackIdChange) { |
MuxedStreamInfo(kVideoTrackNum, "60K"), |
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"); |
@@ -1422,7 +1443,7 @@ TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) { |
MuxedStreamInfo(kAudioTrackNum, "23K"), |
MuxedStreamInfo(kVideoTrackNum, "0 30K"), |
MuxedStreamInfo(kTextTrackNum, "25K 40K")); |
- CheckExpectedRanges(kSourceId, "{ [23,46) }"); |
+ CheckExpectedRanges("{ [23,46) }"); |
EXPECT_CALL(*this, InitSegmentReceived()); |
AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO); |
@@ -1430,7 +1451,7 @@ TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) { |
MuxedStreamInfo(kAudioTrackNum, "46K 69K"), |
MuxedStreamInfo(kVideoTrackNum, "60 90K"), |
MuxedStreamInfo(kTextTrackNum, "80K 90K")); |
- CheckExpectedRanges(kSourceId, "{ [23,92) }"); |
+ CheckExpectedRanges("{ [23,92) }"); |
CheckExpectedBuffers(audio_stream, "23K 46K 69K"); |
CheckExpectedBuffers(video_stream, "30K 90K"); |
@@ -1919,19 +1940,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. |
@@ -1940,12 +1961,12 @@ TEST_F(ChunkDemuxerTest, EndOfStreamRangeChanges) { |
MuxedStreamInfo(kVideoTrackNum, "0K 33"), |
MuxedStreamInfo(kAudioTrackNum, "0K 23K"), |
MuxedStreamInfo(kTextTrackNum, "0K 100K")); |
- CheckExpectedRanges(kSourceId, "{ [0,46) }"); |
+ CheckExpectedRanges("{ [0,46) }"); |
// 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. |
@@ -2078,7 +2099,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)); |
@@ -2399,8 +2419,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"), |
+ MuxedStreamInfo(kVideoTrackNum, "0K 20K 40K 60K 80K")); |
+ CheckExpectedRanges("{ [0,100) }"); |
// Seeking past the end of video. |
// Note: audio data is available for that seek point. |
@@ -2416,6 +2439,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); |
@@ -2428,10 +2452,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"), |
+ MuxedStreamInfo(kVideoTrackNum, "0K 20K 40K 60K 80K")); |
+ AppendMuxedCluster( |
+ MuxedStreamInfo(kAudioTrackNum, |
+ "200K 210K 220K 230K 240K 250K 260K 270K 280K 290K"), |
+ MuxedStreamInfo(kVideoTrackNum, "200K 220K 240K 260K 280K")); |
bool seek_cb_was_called = false; |
base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(160); |
@@ -2450,8 +2478,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"), |
+ MuxedStreamInfo(kVideoTrackNum, |
+ "140K 145K 150K 155K 160K 165K 170K 175K")); |
message_loop_.RunUntilIdle(); |
@@ -2514,53 +2544,74 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { |
// 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)); |
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0D23K"), |
+ MuxedStreamInfo(kVideoTrackNum, "0D33K")); |
+ CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) }"); |
+ CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) }"); |
CheckExpectedRanges("{ [0,23) }"); |
// Audio: 300 -> 400 |
// Video: 320 -> 420 |
chcunningham
2016/01/07 22:23:57
This is Video: 300 -> 420 now.
wolenetz
2016/01/07 22:37:09
I suppose the comment format isn't clear. The A/V
wolenetz
2016/01/16 01:23:35
Done.
|
- // Buffered Range: 320 -> 400 (end overlap) |
- AppendCluster(GenerateSingleStreamCluster(300, 400, kAudioTrackNum, 50)); |
- AppendCluster(GenerateSingleStreamCluster(320, 420, kVideoTrackNum, 50)); |
+ // 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("{ [0,23) [320,400) }"); |
+ CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) }"); |
+ CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [300,420) }"); |
+ CheckExpectedRanges("{ [0,23) [300,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)); |
+ // 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 |
chcunningham
2016/01/07 22:23:57
Is this due to the fudgy start stuff?
wolenetz
2016/01/07 22:37:09
While it seems similar, the fudgy start stuff is m
|
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "520D70K"), |
+ MuxedStreamInfo(kVideoTrackNum, "500D70K")); |
- CheckExpectedRanges("{ [0,23) [320,400) [520,570) }"); |
+ 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: 720 -> 750 |
// Video: 700 -> 770 |
- // Buffered Range: 720 -> 750 (complete overlap, audio) |
- AppendCluster(GenerateSingleStreamCluster(720, 750, kAudioTrackNum, 30)); |
- AppendCluster(GenerateSingleStreamCluster(700, 770, kVideoTrackNum, 70)); |
- |
- CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) }"); |
+ // 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 |
chcunningham
2016/01/07 22:23:57
Do we now need to add a test where we have 2 Sourc
wolenetz
2016/01/07 22:37:09
SGTM.
wolenetz
2016/01/16 01:23:35
Done.
|
+ 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: 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("{ [0,23) [320,400) [520,570) [720,750) [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. |
- AppendCluster(GenerateSingleStreamCluster(930, 950, kAudioTrackNum, 20)); |
- CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); |
+ AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "930D20K"), |
+ MuxedStreamInfo(kVideoTrackNum, "930D20K")); |
- // 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) { |
@@ -2714,12 +2765,8 @@ 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); |
+ EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); |
+ AppendCluster(GenerateEmptyCluster(0)); |
} |
TEST_F(ChunkDemuxerTest, CodecPrefixMatching) { |
@@ -3136,27 +3183,59 @@ 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, |
+ 0x1F, |
+ 0x43, |
+ 0xB6, |
+ 0x75, |
+ 0x8A, // CLUSTER (size = 10) |
+ 0xE7, |
+ 0x81, |
+ 0x01, // Cluster TIMECODE (value = 1) |
+ |
chcunningham
2016/01/07 22:23:56
This space seems kinda random?
wolenetz
2016/01/07 22:37:09
Yep. Per my PTAL PS1 comment, git cl format did ba
wolenetz
2016/01/16 01:23:35
Done.
|
+ 0xA3, |
+ 0x85, // SIMPLEBLOCK (size = 5) |
+ 0x80 | (kAudioTrackNum & 0x7F), // Audio Track Number |
+ 0x00, |
+ 0x00, // Timecode (relative to cluster) (value = 0) |
+ 0x80, // Keyframe flag |
+ 0x00, // Fake block data |
+ |
+ 0x1F, |
+ 0x43, |
+ 0xB6, |
+ 0x75, |
+ 0xFF, // CLUSTER (size = unknown; really 10 due to:) |
+ 0xE7, |
+ 0x81, |
+ 0x02, // Cluster TIMECODE (value = 2) |
+ |
chcunningham
2016/01/07 22:23:56
ditto
wolenetz
2016/01/07 22:37:09
ditto
wolenetz
2016/01/16 01:23:35
Done.
|
+ 0xA3, |
+ 0x85, // SIMPLEBLOCK (size = 5) |
+ 0x80 | (kAudioTrackNum & 0x7F), // Audio Track Number |
+ 0x00, |
+ 0x00, // Timecode (relative to cluster) (value = 0) |
+ 0x80, // Keyframe flag |
+ 0x00, // Fake block data |
+ |
chcunningham
2016/01/07 22:23:57
ditto
wolenetz
2016/01/07 22:37:09
ditto
wolenetz
2016/01/16 01:23:35
Done.
|
+ 0x1A, |
+ 0x45, |
+ 0xDF, |
+ 0xA3, |
0x8A, // EBMLHEADER (size = 10, not fully appended) |
}; |
// 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, |
+ false, false, false, false, true, true, true, true, |
+ |
+ true, true, true, true, true, true, false, |
- false, false, false, false, true, |
- true, true, true, |
+ false, false, false, false, true, true, true, true, |
- true, true, true, true, false, |
+ true, true, true, true, true, true, true, |
+ |
+ true, true, true, true, false, |
}; |
static_assert(arraysize(kBuffer) == arraysize(kExpectedReturnValues), |
@@ -3164,7 +3243,7 @@ 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)); |
for (size_t i = 0; i < sizeof(kBuffer); i++) { |
DVLOG(3) << "Appending and testing index " << i; |
@@ -3184,7 +3263,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 |
@@ -3194,7 +3273,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. |
@@ -3207,7 +3286,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) { |
@@ -3267,7 +3346,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); |
@@ -3297,7 +3376,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); |
@@ -3349,8 +3428,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"), |
+ MuxedStreamInfo(kVideoTrackNum, "0K 33K 66K 99K 132K")); |
// We should be right at buffer limit, should pass |
EXPECT_TRUE(demuxer_->EvictCodedFrames( |
@@ -3363,10 +3444,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"), |
+ MuxedStreamInfo(kVideoTrackNum, "1000K 1033K 1066K 1099K 1132K")); |
// We should delete first append, and be exactly at buffer limit |
EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time, 0)); |
@@ -3381,7 +3463,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. |
@@ -3391,7 +3473,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) { |
@@ -3399,7 +3481,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 |
@@ -3410,7 +3492,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) { |
@@ -3419,7 +3501,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. |
@@ -3429,7 +3511,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) { |
@@ -3438,7 +3520,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 |
@@ -3454,7 +3536,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) { |
@@ -3466,7 +3548,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 |
@@ -3475,7 +3557,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) { |
@@ -3484,7 +3566,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. |
@@ -3494,7 +3576,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) { |
@@ -3511,11 +3593,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); |
@@ -3523,13 +3605,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)); |
@@ -3539,7 +3621,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) { |
@@ -3549,26 +3631,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. |
@@ -3578,7 +3660,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) { |
@@ -3596,7 +3678,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). |
@@ -3606,7 +3688,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Video) { |
// key frame. |
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) { |
@@ -3628,7 +3710,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. |
@@ -3641,7 +3723,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) { |
@@ -3655,7 +3737,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) { |
@@ -3702,7 +3784,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) { |
ReadTestDataFile("bear-320x240-audio-only.webm"); |
EXPECT_CALL(*this, InitSegmentReceived()); |
AppendDataInPieces(buffer->data(), buffer->data_size(), 512); |
- CheckExpectedRanges(kSourceId, "{ }"); |
+ CheckExpectedRanges("{ }"); |
DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
AudioDecoderConfig config_1 = stream->audio_decoder_config(); |
@@ -3714,7 +3796,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); |
@@ -3743,7 +3825,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"); |
@@ -3755,7 +3837,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Text) { |
MuxedStreamInfo(kVideoTrackNum, |
"360 390 420K 450 480 510 540K 570 600 630K"), |
MuxedStreamInfo(kTextTrackNum, "400K 500K 600K 700K" )); |
- CheckExpectedRanges(kSourceId, "{ [100,270) [400,630) }"); |
+ CheckExpectedRanges("{ [100,270) [400,630) }"); |
// Seek to the new range and verify that the expected buffers are returned. |
Seek(base::TimeDelta::FromMilliseconds(420)); |
@@ -3794,7 +3876,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. |
@@ -3824,7 +3906,7 @@ TEST_F(ChunkDemuxerTest, Remove_StartAtDuration) { |
AppendSingleStreamCluster(kSourceId, kAudioTrackNum, |
"0K 20K 40K 60K 80K 100K 120K 140K"); |
- CheckExpectedRanges(kSourceId, "{ [0,160) }"); |
+ CheckExpectedRanges("{ [0,160) }"); |
CheckExpectedBuffers(audio_stream, "0K 20K 40K 60K 80K 100K 120K 140K"); |
demuxer_->Remove(kSourceId, |
@@ -3832,7 +3914,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"); |
} |
@@ -3901,11 +3983,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) { |
@@ -3919,7 +4001,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) { |
@@ -3928,7 +4010,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) { |
@@ -3982,4 +4064,29 @@ TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) { |
CheckExpectedBuffers(video_stream, "60K 70 80K 90 100K 110 120K 130 140K"); |
} |
+TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioOnly) { |
chcunningham
2016/01/07 22:23:57
These are work-in-progress I think?
wolenetz
2016/01/07 22:37:09
Correct. I need to add strict medialog expectation
wolenetz
2016/01/16 01:23:35
Done.
|
+ ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); |
+ AppendCluster(GenerateEmptyCluster(0)); |
+} |
+ |
+TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_VideoOnly) { |
+ ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); |
+ AppendCluster(GenerateEmptyCluster(0)); |
+} |
+ |
+TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioVideo) { |
+ ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
+ AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 0, 10); |
+} |
+ |
+TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_AudioVideo) { |
+ ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
+ AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10); |
+} |
+ |
+TEST_F(ChunkDemuxerTest, SegmentMissingAudioVideoFrames) { |
+ ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
+ AppendCluster(GenerateEmptyCluster(0)); |
+} |
+ |
} // namespace media |