Chromium Code Reviews| 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, |