| 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_;
|
| +
|
| + // 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,
|
|
|