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 c83f4bbc3d7269906d3307827297d7277976322b..2454e65acd12a175dc1607ae06861daeae02e73b 100644 |
| --- a/media/filters/chunk_demuxer_unittest.cc |
| +++ b/media/filters/chunk_demuxer_unittest.cc |
| @@ -6,6 +6,9 @@ |
| #include "base/bind.h" |
| #include "base/message_loop/message_loop.h" |
| +#include "base/strings/string_number_conversions.h" |
| +#include "base/strings/string_split.h" |
| +#include "base/strings/string_util.h" |
| #include "media/base/audio_decoder_config.h" |
| #include "media/base/decoder_buffer.h" |
| #include "media/base/decrypt_config.h" |
| @@ -289,12 +292,6 @@ class ChunkDemuxerTest : public testing::Test { |
| void AppendSingleStreamCluster(const std::string& source_id, int track_number, |
| int timecode, int block_count) { |
| - static const int kVideoTrackNum = 1; |
| - static const int kAudioTrackNum = 2; |
| - |
| - static const int kAudioBlockDuration = 23; |
| - static const int kVideoBlockDuration = 33; |
| - |
| int block_duration = 0; |
| switch(track_number) { |
| case kVideoTrackNum: |
| @@ -311,6 +308,33 @@ class ChunkDemuxerTest : public testing::Test { |
| AppendData(source_id, cluster->data(), cluster->size()); |
| } |
| + void AppendSingleStreamCluster(const std::string& source_id, int track_number, |
| + const std::string& cluster_description) { |
| + std::vector<std::string> timestamps; |
| + base::SplitString(cluster_description, ' ', ×tamps); |
| + |
| + ClusterBuilder cb; |
| + std::vector<uint8> data(10); |
| + for (size_t i = 0; i < timestamps.size(); ++i) { |
| + std::string timestampStr = timestamps[i]; |
|
scherkus (not reviewing)
2013/07/24 22:47:41
unix_hacker for timestampStr
acolwell GONE FROM CHROMIUM
2013/07/25 20:39:33
Done.
|
| + int block_flags = 0; |
| + if (EndsWith(timestampStr, "K", true)) { |
| + block_flags = kWebMFlagKeyframe; |
| + // Remove the "K" off of the token. |
| + timestampStr = timestampStr.substr(0, timestamps[i].length() - 1); |
| + } |
| + int timestamp_in_ms; |
| + CHECK(base::StringToInt(timestampStr, ×tamp_in_ms)); |
| + |
| + if (i == 0) |
| + cb.SetClusterTimecode(timestamp_in_ms); |
| + |
| + cb.AddSimpleBlock(track_number, timestamp_in_ms, block_flags, |
| + &data[0], data.size()); |
| + } |
| + scoped_ptr<Cluster> cluster(cb.Finish()); |
|
scherkus (not reviewing)
2013/07/24 22:47:41
allocate on stack?
acolwell GONE FROM CHROMIUM
2013/07/25 20:39:33
That would actually require changing the ClusterBu
|
| + AppendData(source_id, cluster->data(), cluster->size()); |
| + } |
| void AppendData(const std::string& source_id, |
| const uint8* data, size_t length) { |
| @@ -733,6 +757,26 @@ class ChunkDemuxerTest : public testing::Test { |
| message_loop_.RunUntilIdle(); |
| } |
| + void CheckExpectedBuffers(DemuxerStream* stream, const std::string expected) { |
|
scherkus (not reviewing)
2013/07/24 22:47:41
missing & From std::string
acolwell GONE FROM CHROMIUM
2013/07/25 20:39:33
Done.
|
| + std::vector<std::string> timestamps; |
| + base::SplitString(expected, ' ', ×tamps); |
| + std::stringstream ss; |
| + for (size_t i = 0; i < timestamps.size(); ++i) { |
| + DemuxerStream::Status status; |
| + scoped_refptr<DecoderBuffer> buffer; |
| + stream->Read(base::Bind(&ChunkDemuxerTest::StoreStatusAndBuffer, |
| + base::Unretained(this), &status, &buffer)); |
| + base::MessageLoop::current()->RunUntilIdle(); |
| + if (status != DemuxerStream::kOk || buffer->end_of_stream()) |
| + break; |
| + |
| + if (i > 0) |
| + ss << " "; |
| + ss << buffer->timestamp().InMilliseconds(); |
| + } |
| + EXPECT_EQ(expected, ss.str()); |
| + } |
| + |
| MOCK_METHOD1(Checkpoint, void(int id)); |
| struct BufferTimestamps { |
| @@ -2670,4 +2714,35 @@ TEST_F(ChunkDemuxerTest, RemoveBeforeInitSegment) { |
| base::TimeDelta::FromMilliseconds(1)); |
| } |
| +TEST_F(ChunkDemuxerTest, AppendWindow) { |
| + ASSERT_TRUE(InitDemuxer(false, true)); |
| + DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
| + |
| + // Set the append window to [20,280) |
|
scherkus (not reviewing)
2013/07/24 22:47:41
period
acolwell GONE FROM CHROMIUM
2013/07/25 20:39:33
Done.
|
| + demuxer_->SetAppendWindowStart(kSourceId, |
| + base::TimeDelta::FromMilliseconds(20)); |
| + demuxer_->SetAppendWindowEnd(kSourceId, |
| + base::TimeDelta::FromMilliseconds(280)); |
| + |
| + // Append a cluster that starts before and ends after the append window. |
| + AppendSingleStreamCluster(kSourceId, kVideoTrackNum, |
| + "0K 30 60 90 120K 150 180 210 240K 270 300 330K"); |
| + |
| + // Verify that GOPs that start outside the window are not included |
| + // in the buffer. Also verify that buffers that extend beyond the |
| + // window are not included. |
| + CheckExpectedRanges(kSourceId, "{ [120,300) }"); |
| + CheckExpectedBuffers(stream, "120 150 180 210 240 270"); |
| + |
| + // Extend the append window to [20,650). |
| + demuxer_->SetAppendWindowEnd(kSourceId, |
| + base::TimeDelta::FromMilliseconds(650)); |
| + |
| + // Append more data and verify that adding buffers start at the next |
| + // keyframe. |
| + AppendSingleStreamCluster(kSourceId, kVideoTrackNum, |
| + "360 390 420K 450 480 510 540K 570 600 630K"); |
| + CheckExpectedRanges(kSourceId, "{ [120,300) [420,660) }"); |
| +} |
| + |
| } // namespace media |