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_, |
+ ×tamp_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_, |
+ ×tamp_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_, |
+ ×tamp_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_, |
+ ×tamp_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_, |
+ ×tamp_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_, |
+ ×tamp_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, |