Index: media/filters/chunk_demuxer_unittest.cc |
diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc |
index 770f28423be05d6bf4cccd8e9d1c18aa38ff5971..200d0d908a970f62035582c49be5db1d6dbb58c0 100644 |
--- a/media/filters/chunk_demuxer_unittest.cc |
+++ b/media/filters/chunk_demuxer_unittest.cc |
@@ -397,60 +397,107 @@ class ChunkDemuxerTest : public ::testing::Test { |
timecode, end_timecode, track_number, block_duration)); |
} |
- // |cluster_description| - A space delimited string of buffer info that |
- // is used to construct a cluster. Each buffer info is a timestamp in |
- // milliseconds and optionally followed by a 'K' to indicate that a buffer |
- // should be marked as a keyframe. For example "0K 30 60" should constuct |
- // a cluster with 3 blocks: a keyframe with timestamp 0 and 2 non-keyframes |
- // at 30ms and 60ms. |
- void AppendSingleStreamCluster(const std::string& source_id, int track_number, |
- const std::string& cluster_description) { |
+ struct BlockInfo { |
+ int track_number; |
+ int timestamp_in_ms; |
+ int flags; |
+ int duration; |
+ |
+ bool operator< (const BlockInfo& rhs) const { |
+ // We want pop() to return blocks in timestamp increasing order |
wolenetz
2014/07/08 19:33:53
nit: This could become confusing later if BlockInf
acolwell GONE FROM CHROMIUM
2014/07/08 22:00:38
Done.
|
+ // so timestamps with lower values have higher priority. |
+ return timestamp_in_ms > rhs.timestamp_in_ms; |
+ } |
+ }; |
+ |
+ // |track_number| - The track number to place in |
+ // |blocks_description| - A space delimited string of block info that |
+ // is used to populate |blocks|. Each block info has a timestamp in |
+ // milliseconds and optionally followed by a 'K' to indicate that a block |
+ // should be marked as a keyframe. For example "0K 30 60" should populate |
+ // |blocks| with 3 BlockInfo objects: a keyframe with timestamp 0 |and 2 |
wolenetz
2014/07/08 19:33:53
nit: s/|and/and
acolwell GONE FROM CHROMIUM
2014/07/08 22:00:38
Done.
|
+ // non-keyframes at 30ms and 60ms. |
+ void ParseBlockDescription(int track_number, |
+ const std::string blocks_description, |
+ std::vector<BlockInfo>* blocks) { |
std::vector<std::string> timestamps; |
- base::SplitString(cluster_description, ' ', ×tamps); |
+ base::SplitString(blocks_description, ' ', ×tamps); |
- ClusterBuilder cb; |
- std::vector<uint8> data(10); |
for (size_t i = 0; i < timestamps.size(); ++i) { |
std::string timestamp_str = timestamps[i]; |
- int block_flags = 0; |
+ BlockInfo block_info; |
+ |
+ block_info.track_number = track_number; |
+ block_info.flags = 0; |
+ block_info.duration = 0; |
+ |
if (EndsWith(timestamp_str, "K", true)) { |
- block_flags = kWebMFlagKeyframe; |
+ block_info.flags = kWebMFlagKeyframe; |
// Remove the "K" off of the token. |
timestamp_str = timestamp_str.substr(0, timestamps[i].length() - 1); |
} |
- int timestamp_in_ms; |
- CHECK(base::StringToInt(timestamp_str, ×tamp_in_ms)); |
- |
- if (i == 0) |
- cb.SetClusterTimecode(timestamp_in_ms); |
+ CHECK(base::StringToInt(timestamp_str, &block_info.timestamp_in_ms)); |
if (track_number == kTextTrackNum || |
track_number == kAlternateTextTrackNum) { |
- cb.AddBlockGroup(track_number, timestamp_in_ms, kTextBlockDuration, |
- block_flags, &data[0], data.size()); |
+ block_info.duration = kTextBlockDuration; |
+ ASSERT_EQ(block_info.flags, kWebMFlagKeyframe) |
wolenetz
2014/07/08 19:33:53
nit: ASSERT_EQ(expected, actual) per https://code.
acolwell GONE FROM CHROMIUM
2014/07/08 22:00:37
Done.
/me shakes fist at junit.
|
+ << "Text block with timestamp " << block_info.timestamp_in_ms |
+ << " was not marked as a keyframe." |
+ << " All text blocks must be keyframes"; |
+ } |
+ |
+ blocks->push_back(block_info); |
+ } |
+ } |
+ |
+ scoped_ptr<Cluster> GenerateCluster(const std::vector<BlockInfo>& blocks) { |
+ ClusterBuilder cb; |
wolenetz
2014/07/08 19:33:53
nit: Add ASSERT_LT(0, blocks.size()); since we won
acolwell GONE FROM CHROMIUM
2014/07/08 22:00:38
Done.
|
+ |
+ std::vector<uint8> data(10); |
+ for (size_t i = 0; i < blocks.size(); ++i) { |
+ if (i == 0) |
+ cb.SetClusterTimecode(blocks[i].timestamp_in_ms); |
+ |
+ if (blocks[i].duration) { |
+ cb.AddBlockGroup(blocks[i].track_number, blocks[i].timestamp_in_ms, |
+ blocks[i].duration, blocks[i].flags, |
+ &data[0], data.size()); |
} else { |
- cb.AddSimpleBlock(track_number, timestamp_in_ms, block_flags, |
+ cb.AddSimpleBlock(blocks[i].track_number, blocks[i].timestamp_in_ms, |
+ blocks[i].flags, |
&data[0], data.size()); |
} |
} |
- AppendCluster(source_id, cb.Finish()); |
+ |
+ return cb.Finish(); |
+ } |
+ |
+ // |block_description| - The block description used to construct the cluster. |
+ // See the documentation for ParseBlockDescription() for details on the string |
+ // format. |
+ void AppendSingleStreamCluster(const std::string& source_id, int track_number, |
+ const std::string& block_description) { |
+ std::vector<BlockInfo> blocks; |
+ ParseBlockDescription(track_number, block_description, &blocks); |
+ AppendCluster(source_id, GenerateCluster(blocks)); |
} |
struct MuxedStreamInfo { |
MuxedStreamInfo() |
: track_number(0), |
- cluster_description("") |
+ block_description("") |
{} |
- MuxedStreamInfo(int track_num, const char* cluster_desc) |
+ MuxedStreamInfo(int track_num, const char* block_desc) |
: track_number(track_num), |
- cluster_description(cluster_desc) { |
+ block_description(block_desc) { |
} |
int track_number; |
- // The cluster description passed to AppendSingleStreamCluster(). |
+ // The block description passed to ParseBlockDescription(). |
// See the documentation for that method for details on the string format. |
- const char* cluster_description; |
+ const char* block_description; |
wolenetz
2014/07/08 19:33:53
nit: s/block_description/block_descriptions or blo
acolwell GONE FROM CHROMIUM
2014/07/08 22:00:38
Done.
|
}; |
void AppendMuxedCluster(const MuxedStreamInfo& msi_1, |
@@ -472,11 +519,23 @@ class ChunkDemuxerTest : public ::testing::Test { |
} |
void AppendMuxedCluster(const std::vector<MuxedStreamInfo> msi) { |
+ std::priority_queue<BlockInfo> block_queue; |
for (size_t i = 0; i < msi.size(); ++i) { |
- AppendSingleStreamCluster(kSourceId, |
- msi[i].track_number, |
- msi[i].cluster_description); |
+ std::vector<BlockInfo> track_blocks; |
+ ParseBlockDescription(msi[i].track_number, msi[i].block_description, |
+ &track_blocks); |
+ |
+ for (size_t j = 0; j < track_blocks.size(); ++j) |
+ block_queue.push(track_blocks[j]); |
+ } |
+ |
+ std::vector<BlockInfo> blocks(block_queue.size()); |
+ for (size_t i = 0; !block_queue.empty(); ++i) { |
+ blocks[i] = block_queue.top(); |
+ block_queue.pop(); |
} |
+ |
+ AppendCluster(kSourceId, GenerateCluster(blocks)); |
} |
void AppendData(const std::string& source_id, |
@@ -1290,21 +1349,19 @@ TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) { |
AppendMuxedCluster( |
MuxedStreamInfo(kAudioTrackNum, "0 23K"), |
MuxedStreamInfo(kVideoTrackNum, "0 30K"), |
- MuxedStreamInfo(kTextTrackNum, "0 40K")); |
- CheckExpectedRanges(kSourceId, "{ [30,46) }"); |
+ MuxedStreamInfo(kTextTrackNum, "25K 40K")); |
acolwell GONE FROM CHROMIUM
2014/07/08 16:32:00
This was moved to avoid the text keyframe from cau
|
+ CheckExpectedRanges(kSourceId, "{ [23,46) }"); |
wolenetz
2014/07/08 19:33:53
IIUC, this change from 30 to 23 is unrelated to th
acolwell GONE FROM CHROMIUM
2014/07/08 22:00:37
That is correct.
|
AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO); |
AppendMuxedCluster( |
MuxedStreamInfo(kAudioTrackNum, "46 69K"), |
MuxedStreamInfo(kVideoTrackNum, "60 90K"), |
- MuxedStreamInfo(kTextTrackNum, "80 90K")); |
- CheckExpectedRanges(kSourceId, "{ [30,92) }"); |
+ MuxedStreamInfo(kTextTrackNum, "80K 90K")); |
+ CheckExpectedRanges(kSourceId, "{ [23,92) }"); |
CheckExpectedBuffers(audio_stream, "23 69"); |
CheckExpectedBuffers(video_stream, "30 90"); |
- |
- // WebM parser marks all text buffers as keyframes. |
- CheckExpectedBuffers(text_stream, "0 40 80 90"); |
+ CheckExpectedBuffers(text_stream, "25 40 80 90"); |
} |
// Make sure that the demuxer reports an error if Shutdown() |
@@ -2468,7 +2525,6 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) { |
// Append and remove data so that the 2 streams' end ranges do not overlap. |
- EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(246))); |
acolwell GONE FROM CHROMIUM
2014/07/08 16:32:00
This extra call was being triggered because there
|
EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(398))); |
AppendMuxedCluster( |
MuxedStreamInfo(kAudioTrackNum, "200K 223K"), |
@@ -3353,7 +3409,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Text) { |
// Verify that text cues that start outside the window are not included |
// in the buffer. Also verify that cues that extend beyond the |
// window are not included. |
- CheckExpectedRanges(kSourceId, "{ [120,270) }"); |
+ CheckExpectedRanges(kSourceId, "{ [100,270) }"); |
acolwell GONE FROM CHROMIUM
2014/07/08 16:32:00
The text buffer is the first frame within the appe
|
CheckExpectedBuffers(video_stream, "120 150 180 210 240"); |
CheckExpectedBuffers(text_stream, "100"); |
@@ -3365,7 +3421,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Text) { |
MuxedStreamInfo(kVideoTrackNum, |
"360 390 420K 450 480 510 540K 570 600 630K"), |
MuxedStreamInfo(kTextTrackNum, "400K 500K 600K 700K" )); |
- CheckExpectedRanges(kSourceId, "{ [120,270) [420,630) }"); |
+ CheckExpectedRanges(kSourceId, "{ [100,270) [400,630) }"); |
// Seek to the new range and verify that the expected buffers are returned. |
Seek(base::TimeDelta::FromMilliseconds(420)); |