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

Unified Diff: media/filters/chunk_demuxer_unittest.cc

Issue 196173002: MSE: Lift timestampOffset and appendWindow[Start,End] storage to WebSourceBufferImpl (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 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 c8ca5f2b818149620c9f816d455c8cd7c5715c62..475ac39d0a3c2a5748c005324d20b3ce89810c8f 100644
--- a/media/filters/chunk_demuxer_unittest.cc
+++ b/media/filters/chunk_demuxer_unittest.cc
@@ -154,7 +154,8 @@ class ChunkDemuxerTest : public testing::Test {
return GenerateCluster(46, 66, 5);
}
- ChunkDemuxerTest() {
+ ChunkDemuxerTest()
+ : append_window_end_for_next_append_(kInfiniteDuration()) {
CreateNewDemuxer();
}
@@ -397,7 +398,10 @@ class ChunkDemuxerTest : public testing::Test {
// TODO(wolenetz): Test timestamp offset updating once "sequence" append
// mode processing is implemented. See http://crbug.com/249422.
- demuxer_->AppendData(source_id, data, length, NULL);
+ demuxer_->AppendData(source_id, data, length,
+ append_window_start_for_next_append_,
+ append_window_end_for_next_append_,
+ &timestamp_offset_map_[source_id]);
}
void AppendDataInPieces(const uint8* data, size_t length) {
@@ -942,11 +946,27 @@ class ChunkDemuxerTest : public testing::Test {
message_loop_.RunUntilIdle();
}
+ bool SetTimestampOffset(const std::string& id,
+ base::TimeDelta timestamp_offset) {
+ if (demuxer_->IsParsingMediaSegment(id))
+ return false;
+
+ timestamp_offset_map_[id] = timestamp_offset;
+ return true;
+ }
+
base::MessageLoop message_loop_;
MockDemuxerHost host_;
scoped_ptr<ChunkDemuxer> demuxer_;
+ base::TimeDelta append_window_start_for_next_append_;
+ base::TimeDelta append_window_end_for_next_append_;
wolenetz 2014/03/11 23:21:34 Note, I didn't see much gain by adding similar map
+
+ // Map of source id to timestamp offset to use for the next AppendData()
+ // operation for that source id.
+ std::map<std::string, base::TimeDelta> timestamp_offset_map_;
+
private:
DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest);
};
@@ -1219,7 +1239,10 @@ TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) {
int info_tracks_size = 0;
CreateInitSegment(HAS_AUDIO | HAS_VIDEO,
false, false, &info_tracks, &info_tracks_size);
- demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size, NULL);
+ 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]);
}
// Make sure Read() callbacks are dispatched with the proper data.
@@ -1252,7 +1275,10 @@ TEST_F(ChunkDemuxerTest, OutOfOrderClusters) {
// Verify that AppendData() can still accept more data.
scoped_ptr<Cluster> cluster_c(GenerateCluster(45, 2));
- demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size(), NULL);
+ 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]);
}
TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) {
@@ -1274,7 +1300,10 @@ TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) {
// Verify that AppendData() ignores data after the error.
scoped_ptr<Cluster> cluster_b(GenerateCluster(20, 2));
- demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), NULL);
+ 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]);
}
TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) {
@@ -1296,7 +1325,10 @@ TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) {
// Verify that AppendData() ignores data after the error.
scoped_ptr<Cluster> cluster_b(GenerateCluster(6, 2));
- demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), NULL);
+ 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]);
}
@@ -1753,7 +1785,10 @@ TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) {
ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
uint8 tmp = 0;
- demuxer_->AppendData(kSourceId, &tmp, 1, NULL);
+ demuxer_->AppendData(kSourceId, &tmp, 1,
+ append_window_start_for_next_append_,
+ append_window_end_for_next_append_,
+ &timestamp_offset_map_[kSourceId]);
}
TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) {
@@ -2584,8 +2619,7 @@ TEST_F(ChunkDemuxerTest, ConfigChange_Seek) {
TEST_F(ChunkDemuxerTest, TimestampPositiveOffset) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
- ASSERT_TRUE(demuxer_->SetTimestampOffset(
- kSourceId, base::TimeDelta::FromSeconds(30)));
+ ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(30)));
AppendCluster(GenerateCluster(0, 2));
Seek(base::TimeDelta::FromMilliseconds(30000));
@@ -2596,8 +2630,7 @@ TEST_F(ChunkDemuxerTest, TimestampPositiveOffset) {
TEST_F(ChunkDemuxerTest, TimestampNegativeOffset) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
- ASSERT_TRUE(demuxer_->SetTimestampOffset(
- kSourceId, base::TimeDelta::FromSeconds(-1)));
+ ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(-1)));
AppendCluster(GenerateCluster(1000, 2));
GenerateExpectedReads(0, 2);
@@ -2608,9 +2641,9 @@ TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) {
std::string video_id = "video1";
ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
- ASSERT_TRUE(demuxer_->SetTimestampOffset(
+ ASSERT_TRUE(SetTimestampOffset(
audio_id, base::TimeDelta::FromMilliseconds(-2500)));
- ASSERT_TRUE(demuxer_->SetTimestampOffset(
+ ASSERT_TRUE(SetTimestampOffset(
video_id, base::TimeDelta::FromMilliseconds(-2500)));
AppendCluster(audio_id, GenerateSingleStreamCluster(2500,
2500 + kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration));
@@ -2621,9 +2654,9 @@ TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) {
Seek(base::TimeDelta::FromMilliseconds(27300));
- ASSERT_TRUE(demuxer_->SetTimestampOffset(
+ ASSERT_TRUE(SetTimestampOffset(
audio_id, base::TimeDelta::FromMilliseconds(27300)));
- ASSERT_TRUE(demuxer_->SetTimestampOffset(
+ ASSERT_TRUE(SetTimestampOffset(
video_id, base::TimeDelta::FromMilliseconds(27300)));
AppendCluster(audio_id, GenerateSingleStreamCluster(
0, kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration));
@@ -2633,25 +2666,23 @@ TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) {
GenerateAudioStreamExpectedReads(27300, 4);
}
-TEST_F(ChunkDemuxerTest, TimestampOffsetMidMediaSegment) {
+TEST_F(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
scoped_ptr<Cluster> cluster = GenerateCluster(0, 2);
// Append only part of the cluster data.
AppendData(cluster->data(), cluster->size() - 13);
- // Setting a timestamp should fail because we're in the middle of a cluster.
- ASSERT_FALSE(demuxer_->SetTimestampOffset(
- kSourceId, base::TimeDelta::FromSeconds(25)));
+ // Confirm we're in the middle of parsing a media segment.
+ ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId));
demuxer_->Abort(kSourceId);
- // After Abort(), setting a timestamp should succeed since we're no longer
- // in the middle of a cluster
- ASSERT_TRUE(demuxer_->SetTimestampOffset(
- kSourceId, base::TimeDelta::FromSeconds(25)));
+ // After Abort(), parsing should no longer be in the middle of a media
+ // segment.
+ ASSERT_FALSE(demuxer_->IsParsingMediaSegment(kSourceId));
}
-TEST_F(ChunkDemuxerTest, WebMParsingMediaSegmentDetection) {
+TEST_F(ChunkDemuxerTest, WebMIsParsingMediaSegmentDetection) {
// TODO(wolenetz): Also test 'unknown' sized clusters.
// See http://crbug.com/335676.
const uint8 kBuffer[] = {
@@ -2659,13 +2690,11 @@ TEST_F(ChunkDemuxerTest, WebMParsingMediaSegmentDetection) {
0xE7, 0x81, 0x01, // Cluster TIMECODE (value = 1)
};
- // Setting timestamp offset or append mode is allowed only while not
- // parsing a media segment. This array indicates whether or not these
- // operations are allowed following each incrementally appended byte in
- // |kBuffer|.
+ // This array indicates expected return value of IsParsingMediaSegment()
+ // following each incrementally appended byte in |kBuffer|.
const bool kExpectedReturnValues[] = {
- true, true, true, true, false,
- false, false, true,
+ false, false, false, false, true,
+ true, true, false,
};
COMPILE_ASSERT(arraysize(kBuffer) == arraysize(kExpectedReturnValues),
@@ -2678,33 +2707,11 @@ TEST_F(ChunkDemuxerTest, WebMParsingMediaSegmentDetection) {
DVLOG(3) << "Appending and testing index " << i;
AppendData(kBuffer + i, 1);
bool expected_return_value = kExpectedReturnValues[i];
- EXPECT_EQ(expected_return_value, demuxer_->SetTimestampOffset(
- kSourceId, base::TimeDelta::FromSeconds(25)));
- EXPECT_EQ(expected_return_value, demuxer_->SetSequenceMode(
- kSourceId, true));
- EXPECT_EQ(expected_return_value, demuxer_->SetSequenceMode(
- kSourceId, false));
+ EXPECT_EQ(expected_return_value,
+ demuxer_->IsParsingMediaSegment(kSourceId));
}
}
-TEST_F(ChunkDemuxerTest, SetSequenceModeMidMediaSegment) {
- ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
-
- scoped_ptr<Cluster> cluster = GenerateCluster(0, 2);
- // Append only part of the cluster data.
- AppendData(cluster->data(), cluster->size() - 13);
-
- // Setting append mode should fail because we're in the middle of a cluster.
- ASSERT_FALSE(demuxer_->SetSequenceMode(kSourceId, true));
- ASSERT_FALSE(demuxer_->SetSequenceMode(kSourceId, false));
-
- demuxer_->Abort(kSourceId);
- // After Abort(), setting append mode should succeed since we're no longer
- // in the middle of a cluster.
- ASSERT_TRUE(demuxer_->SetSequenceMode(kSourceId, true));
- ASSERT_TRUE(demuxer_->SetSequenceMode(kSourceId, false));
-}
-
TEST_F(ChunkDemuxerTest, DurationChange) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
const int kStreamDuration = kDefaultDuration().InMilliseconds();
@@ -2737,7 +2744,7 @@ TEST_F(ChunkDemuxerTest, DurationChange) {
TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) {
ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
- ASSERT_TRUE(demuxer_->SetTimestampOffset(kSourceId, kDefaultDuration()));
+ ASSERT_TRUE(SetTimestampOffset(kSourceId, kDefaultDuration()));
EXPECT_CALL(host_, SetDuration(
kDefaultDuration() + base::TimeDelta::FromMilliseconds(
@@ -2944,10 +2951,8 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Video) {
DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO);
// Set the append window to [20,280).
- demuxer_->SetAppendWindowStart(kSourceId,
- base::TimeDelta::FromMilliseconds(20));
- demuxer_->SetAppendWindowEnd(kSourceId,
- base::TimeDelta::FromMilliseconds(280));
+ append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20);
+ append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
// Append a cluster that starts before and ends after the append window.
AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
@@ -2960,8 +2965,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Video) {
CheckExpectedBuffers(stream, "120 150 180 210 240 270");
// Extend the append window to [20,650).
- demuxer_->SetAppendWindowEnd(kSourceId,
- base::TimeDelta::FromMilliseconds(650));
+ append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650);
// Append more data and verify that adding buffers start at the next
// keyframe.
@@ -2975,10 +2979,8 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Audio) {
DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
// Set the append window to [20,280).
- demuxer_->SetAppendWindowStart(kSourceId,
- base::TimeDelta::FromMilliseconds(20));
- demuxer_->SetAppendWindowEnd(kSourceId,
- base::TimeDelta::FromMilliseconds(280));
+ append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20);
+ append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
// Append a cluster that starts before and ends after the append window.
AppendSingleStreamCluster(
@@ -2992,8 +2994,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Audio) {
CheckExpectedBuffers(stream, "30 60 90 120 150 180 210 240 270");
// Extend the append window to [20,650).
- demuxer_->SetAppendWindowEnd(kSourceId,
- base::TimeDelta::FromMilliseconds(650));
+ append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650);
// Append more data and verify that a new range is created.
AppendSingleStreamCluster(
@@ -3010,10 +3011,8 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Text) {
DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
// Set the append window to [20,280).
- demuxer_->SetAppendWindowStart(kSourceId,
- base::TimeDelta::FromMilliseconds(20));
- demuxer_->SetAppendWindowEnd(kSourceId,
- base::TimeDelta::FromMilliseconds(280));
+ append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20);
+ append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
// Append a cluster that starts before and ends after the append
// window.
@@ -3029,8 +3028,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Text) {
CheckExpectedBuffers(text_stream, "100 200");
// Extend the append window to [20,650).
- demuxer_->SetAppendWindowEnd(kSourceId,
- base::TimeDelta::FromMilliseconds(650));
+ append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650);
// Append more data and verify that a new range is created.
AppendSingleStreamCluster(kSourceId, kVideoTrackNum,

Powered by Google App Engine
This is Rietveld 408576698