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

Unified Diff: media/filters/chunk_demuxer_unittest.cc

Issue 547223003: MSE: Notify Blink SourceBuffer on init segment received (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed nits. Plan is to depend on blink-side CL landing first (https://codereview.chromium.org/55294… Created 6 years, 3 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
Index: media/filters/chunk_demuxer_unittest.cc
diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc
index 4ac5616b72e6b5dda8dd7b7d2e3d3f7d64687565..a410fe00e9227879c89a6ca6285f1d538f2a19a3 100644
--- a/media/filters/chunk_demuxer_unittest.cc
+++ b/media/filters/chunk_demuxer_unittest.cc
@@ -162,6 +162,9 @@ class ChunkDemuxerTest : public ::testing::Test {
ChunkDemuxerTest()
: append_window_end_for_next_append_(kInfiniteDuration()) {
+ init_segment_received_cb_ =
+ base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
+ base::Unretained(this));
CreateNewDemuxer();
}
@@ -573,7 +576,8 @@ class ChunkDemuxerTest : public ::testing::Test {
demuxer_->AppendData(source_id, data, length,
append_window_start_for_next_append_,
append_window_end_for_next_append_,
- &timestamp_offset_map_[source_id]);
+ &timestamp_offset_map_[source_id],
+ init_segment_received_cb_);
}
void AppendDataInPieces(const uint8* data, size_t length) {
@@ -591,24 +595,33 @@ class ChunkDemuxerTest : public ::testing::Test {
}
}
- void AppendInitSegment(int stream_flags) {
- AppendInitSegmentWithSourceId(kSourceId, stream_flags);
+ void AppendInitSegment(int stream_flags, bool expect_init_segment_received) {
+ AppendInitSegmentWithSourceId(kSourceId, stream_flags,
+ expect_init_segment_received);
}
void AppendInitSegmentWithSourceId(const std::string& source_id,
- int stream_flags) {
- AppendInitSegmentWithEncryptedInfo(source_id, stream_flags, false, false);
+ int stream_flags,
+ bool expect_init_segment_received) {
+ AppendInitSegmentWithEncryptedInfo(source_id, stream_flags,
+ expect_init_segment_received,
+ false, false);
}
void AppendInitSegmentWithEncryptedInfo(const std::string& source_id,
int stream_flags,
+ bool expect_init_segment_received,
bool is_audio_encrypted,
bool is_video_encrypted) {
+ DCHECK(!expect_init_segment_received || stream_flags > 0)
+ << "Do not expect an init segment received when there are no tracks";
scoped_ptr<uint8[]> info_tracks;
int info_tracks_size = 0;
CreateInitSegment(stream_flags,
is_audio_encrypted, is_video_encrypted,
&info_tracks, &info_tracks_size);
+ if (expect_init_segment_received)
+ EXPECT_CALL(*this, InitSegmentReceived());
AppendData(source_id, info_tracks.get(), info_tracks_size);
}
@@ -664,6 +677,14 @@ class ChunkDemuxerTest : public ::testing::Test {
expected_duration = kDefaultDuration();
EXPECT_CALL(*this, DemuxerOpened());
+
+ // Adding expectation 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)
+ EXPECT_CALL(*this, InitSegmentReceived());
+
demuxer_->Initialize(
&host_, CreateInitDoneCB(expected_duration, expected_status), true);
@@ -671,7 +692,7 @@ class ChunkDemuxerTest : public ::testing::Test {
return false;
AppendInitSegmentWithEncryptedInfo(
- kSourceId, stream_flags,
+ kSourceId, stream_flags, false,
is_audio_encrypted, is_video_encrypted);
return true;
}
@@ -696,8 +717,8 @@ class ChunkDemuxerTest : public ::testing::Test {
video_flags |= HAS_TEXT;
}
- AppendInitSegmentWithSourceId(audio_id, audio_flags);
- AppendInitSegmentWithSourceId(video_id, video_flags);
+ AppendInitSegmentWithSourceId(audio_id, audio_flags, true);
+ AppendInitSegmentWithSourceId(video_id, video_flags, true);
return true;
}
@@ -729,6 +750,9 @@ class ChunkDemuxerTest : public ::testing::Test {
EXPECT_CALL(*this, DemuxerOpened());
+ // Adding expectation prior to CreateInitDoneCB() here because InSequence
+ // tests require init segment received before duration set.
+ EXPECT_CALL(*this, InitSegmentReceived());
demuxer_->Initialize(
&host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744),
PIPELINE_OK), true);
@@ -755,6 +779,7 @@ class ChunkDemuxerTest : public ::testing::Test {
// media/test/data/bear-320x240-manifest.js which were
// generated from media/test/data/bear-640x360.webm and
// media/test/data/bear-320x240.webm respectively.
+ EXPECT_CALL(*this, InitSegmentReceived());
AppendData(bear2->data(), 4340);
// Append a media segment that goes from [0.527000, 1.014000).
@@ -763,6 +788,7 @@ class ChunkDemuxerTest : public ::testing::Test {
// 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) }");
@@ -1087,6 +1113,7 @@ class ChunkDemuxerTest : public ::testing::Test {
// Read a WebM file into memory and send the data to the demuxer.
scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename);
+ EXPECT_CALL(*this, InitSegmentReceived());
AppendDataInPieces(buffer->data(), buffer->data_size(), 512);
// Verify that the timestamps on the first few packets match what we
@@ -1131,6 +1158,8 @@ class ChunkDemuxerTest : public ::testing::Test {
NeedKeyMock(type, init_data_ptr, init_data.size());
}
+ MOCK_METHOD0(InitSegmentReceived, void(void));
+
void Seek(base::TimeDelta seek_time) {
demuxer_->StartWaitingForSeek(seek_time);
demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK));
@@ -1155,6 +1184,7 @@ class ChunkDemuxerTest : public ::testing::Test {
MockDemuxerHost host_;
scoped_ptr<ChunkDemuxer> demuxer_;
+ ChunkDemuxer::InitSegmentReceivedCB init_segment_received_cb_;
base::TimeDelta append_window_start_for_next_append_;
base::TimeDelta append_window_end_for_next_append_;
@@ -1337,10 +1367,12 @@ TEST_F(ChunkDemuxerTest, SingleTextTrackIdChange) {
CreateInitSegmentWithAlternateTextTrackNum(HAS_TEXT | HAS_AUDIO | HAS_VIDEO,
false, false,
&info_tracks, &info_tracks_size);
+ EXPECT_CALL(*this, InitSegmentReceived());
demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size,
append_window_start_for_next_append_,
append_window_end_for_next_append_,
- &timestamp_offset_map_[kSourceId]);
+ &timestamp_offset_map_[kSourceId],
+ init_segment_received_cb_);
AppendMuxedCluster(
MuxedStreamInfo(kAudioTrackNum, "46K 69K"),
@@ -1378,7 +1410,7 @@ TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) {
MuxedStreamInfo(kTextTrackNum, "25K 40K"));
CheckExpectedRanges(kSourceId, "{ [23,46) }");
- AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO);
+ AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO, true);
AppendMuxedCluster(
MuxedStreamInfo(kAudioTrackNum, "46K 69K"),
MuxedStreamInfo(kVideoTrackNum, "60 90K"),
@@ -1401,7 +1433,7 @@ TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) {
EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk);
EXPECT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk);
- AppendInitSegmentWithSourceId("audio", HAS_AUDIO);
+ AppendInitSegmentWithSourceId("audio", HAS_AUDIO, true);
ShutdownDemuxer();
}
@@ -1418,7 +1450,7 @@ TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) {
EXPECT_CALL(host_, AddTextStream(_, _))
.Times(Exactly(1));
- AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT);
+ AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT, true);
ShutdownDemuxer();
}
@@ -1526,7 +1558,8 @@ TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) {
demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size,
append_window_start_for_next_append_,
append_window_end_for_next_append_,
- &timestamp_offset_map_[kSourceId]);
+ &timestamp_offset_map_[kSourceId],
+ init_segment_received_cb_);
}
// Make sure Read() callbacks are dispatched with the proper data.
@@ -1562,7 +1595,8 @@ TEST_F(ChunkDemuxerTest, OutOfOrderClusters) {
demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size(),
append_window_start_for_next_append_,
append_window_end_for_next_append_,
- &timestamp_offset_map_[kSourceId]);
+ &timestamp_offset_map_[kSourceId],
+ init_segment_received_cb_);
}
TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) {
@@ -1587,7 +1621,8 @@ TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) {
demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(),
append_window_start_for_next_append_,
append_window_end_for_next_append_,
- &timestamp_offset_map_[kSourceId]);
+ &timestamp_offset_map_[kSourceId],
+ init_segment_received_cb_);
}
TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) {
@@ -1612,7 +1647,8 @@ TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) {
demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(),
append_window_start_for_next_append_,
append_window_end_for_next_append_,
- &timestamp_offset_map_[kSourceId]);
+ &timestamp_offset_map_[kSourceId],
+ init_segment_received_cb_);
}
@@ -1923,6 +1959,7 @@ TEST_F(ChunkDemuxerTest, AppendingInPieces) {
memcpy(dst, cluster_b->data(), cluster_b->size());
dst += cluster_b->size();
+ EXPECT_CALL(*this, InitSegmentReceived());
AppendDataInPieces(buffer.get(), buffer_size);
GenerateExpectedReads(0, 9);
@@ -2081,7 +2118,8 @@ TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) {
demuxer_->AppendData(kSourceId, &tmp, 1,
append_window_start_for_next_append_,
append_window_end_for_next_append_,
- &timestamp_offset_map_[kSourceId]);
+ &timestamp_offset_map_[kSourceId],
+ init_segment_received_cb_);
}
TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) {
@@ -2095,7 +2133,7 @@ TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) {
ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs),
ChunkDemuxer::kOk);
- AppendInitSegment(HAS_AUDIO | HAS_VIDEO);
+ AppendInitSegment(HAS_AUDIO | HAS_VIDEO, false);
}
TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) {
@@ -2109,7 +2147,7 @@ TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) {
ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
ChunkDemuxer::kOk);
- AppendInitSegment(HAS_AUDIO | HAS_VIDEO);
+ AppendInitSegment(HAS_AUDIO | HAS_VIDEO, false);
}
TEST_F(ChunkDemuxerTest, MultipleHeaders) {
@@ -2118,7 +2156,7 @@ TEST_F(ChunkDemuxerTest, MultipleHeaders) {
AppendCluster(kDefaultFirstCluster());
// Append another identical initialization segment.
- AppendInitSegment(HAS_AUDIO | HAS_VIDEO);
+ AppendInitSegment(HAS_AUDIO | HAS_VIDEO, true);
acolwell GONE FROM CHROMIUM 2014/09/10 18:02:38 nit: I'm not sure this bool param is helping all t
wolenetz 2014/09/11 22:40:37 Done.
AppendCluster(kDefaultSecondCluster());
@@ -2172,7 +2210,7 @@ TEST_F(ChunkDemuxerTest, AddIdFailures) {
// Adding an id with audio/video should fail because we already added audio.
ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit);
- AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO);
+ AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO, true);
// Adding an id after append should fail.
ASSERT_EQ(AddId(video_id, HAS_VIDEO), ChunkDemuxer::kReachedIdLimit);
@@ -2404,7 +2442,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) {
&host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
ASSERT_EQ(AddId(kSourceId, HAS_AUDIO), ChunkDemuxer::kOk);
- AppendInitSegment(HAS_AUDIO);
+ AppendInitSegment(HAS_AUDIO, true);
// Test a simple cluster.
AppendCluster(
@@ -2426,7 +2464,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) {
&host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
ASSERT_EQ(AddId(kSourceId, HAS_VIDEO), ChunkDemuxer::kOk);
- AppendInitSegment(HAS_VIDEO);
+ AppendInitSegment(HAS_VIDEO, true);
// Test a simple cluster.
AppendCluster(
@@ -3004,6 +3042,7 @@ TEST_F(ChunkDemuxerTest, EmitBuffersDuringAbort) {
// PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309]
scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts");
+ EXPECT_CALL(*this, InitSegmentReceived());
AppendData(kSourceId, buffer->data(), buffer->data_size());
// Confirm we're in the middle of parsing a media segment.
@@ -3047,6 +3086,7 @@ TEST_F(ChunkDemuxerTest, SeekCompleteDuringAbort) {
// PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309]
scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts");
+ EXPECT_CALL(*this, InitSegmentReceived());
AppendData(kSourceId, buffer->data(), buffer->data_size());
// Confirm we're in the middle of parsing a media segment.
@@ -3406,6 +3446,7 @@ 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");
+ EXPECT_CALL(*this, InitSegmentReceived());
AppendDataInPieces(buffer->data(), buffer->data_size(), 128);
DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
@@ -3432,6 +3473,7 @@ 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");
+ EXPECT_CALL(*this, InitSegmentReceived());
AppendDataInPieces(buffer->data(), buffer->data_size(), 512);
CheckExpectedRanges(kSourceId, "{ }");
@@ -3441,6 +3483,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) {
// Read a second WebM with a different config in and append the data.
scoped_refptr<DecoderBuffer> buffer2 =
ReadTestDataFile("bear-320x240-audio-only-48khz.webm");
+ EXPECT_CALL(*this, InitSegmentReceived());
EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber());
ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1));
AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512);

Powered by Google App Engine
This is Rietveld 408576698