Index: media/filters/source_buffer_stream_unittest.cc |
diff --git a/media/filters/source_buffer_stream_unittest.cc b/media/filters/source_buffer_stream_unittest.cc |
index d830b1f369db57bb086ccb2c9015b383c568c974..1cd9cfa3f67c2050b9c092e4f78d0ef5399f5e87 100644 |
--- a/media/filters/source_buffer_stream_unittest.cc |
+++ b/media/filters/source_buffer_stream_unittest.cc |
@@ -290,8 +290,32 @@ class SourceBufferStreamTest : public testing::Test { |
break; |
ss << buffer->GetDecodeTimestamp().InMilliseconds(); |
- if (buffer->IsKeyframe()) |
+ |
+ // Handle preroll buffers. |
+ if (EndsWith(timestamps[i], "P", true)) { |
+ ASSERT_TRUE(buffer->IsKeyframe()); |
+ scoped_refptr<StreamParserBuffer> preroll_buffer; |
+ preroll_buffer.swap(buffer); |
+ |
+ // When a preroll buffer is encountered we should be able to request one |
+ // more buffer. The first buffer should match the timestamp and config |
+ // of the second buffer, except that its discard_padding() should be its |
+ // duration. |
+ ASSERT_EQ(SourceBufferStream::kSuccess, |
+ stream_->GetNextBuffer(&buffer)); |
+ ASSERT_EQ(buffer->GetConfigId(), preroll_buffer->GetConfigId()); |
+ ASSERT_EQ(buffer->track_id(), preroll_buffer->track_id()); |
+ ASSERT_EQ(buffer->timestamp(), preroll_buffer->timestamp()); |
+ ASSERT_EQ(buffer->GetDecodeTimestamp(), |
+ preroll_buffer->GetDecodeTimestamp()); |
+ ASSERT_EQ(kInfiniteDuration(), preroll_buffer->discard_padding().first); |
+ ASSERT_EQ(base::TimeDelta(), preroll_buffer->discard_padding().second); |
+ ASSERT_TRUE(buffer->IsKeyframe()); |
+ |
+ ss << "P"; |
+ } else if (buffer->IsKeyframe()) { |
ss << "K"; |
+ } |
// Until the last splice frame is seen, indicated by a matching timestamp, |
// all buffers must have the same splice_timestamp(). |
@@ -419,6 +443,7 @@ class SourceBufferStreamTest : public testing::Test { |
BufferQueue buffers; |
for (size_t i = 0; i < timestamps.size(); i++) { |
bool is_keyframe = false; |
+ bool has_preroll = false; |
bool last_splice_frame = false; |
// Handle splice frame starts. |
if (StartsWithASCII(timestamps[i], "S(", true)) { |
@@ -446,6 +471,13 @@ class SourceBufferStreamTest : public testing::Test { |
// Remove the "K" off of the token. |
timestamps[i] = timestamps[i].substr(0, timestamps[i].length() - 1); |
} |
+ // Handle preroll buffers. |
+ if (EndsWith(timestamps[i], "P", true)) { |
+ is_keyframe = true; |
+ has_preroll = true; |
+ // Remove the "P" off of the token. |
+ timestamps[i] = timestamps[i].substr(0, timestamps[i].length() - 1); |
+ } |
int time_in_ms; |
CHECK(base::StringToInt(timestamps[i], &time_in_ms)); |
@@ -461,6 +493,16 @@ class SourceBufferStreamTest : public testing::Test { |
buffer->set_duration(frame_duration_); |
buffer->SetDecodeTimestamp(timestamp); |
+ // Simulate preroll buffers by just generating another buffer and sticking |
+ // it as the preroll. |
+ if (has_preroll) { |
+ scoped_refptr<StreamParserBuffer> preroll_buffer = |
+ StreamParserBuffer::CopyFrom( |
+ &kDataA, kDataSize, is_keyframe, DemuxerStream::AUDIO, 0); |
+ preroll_buffer->set_duration(frame_duration_); |
+ buffer->SetPrerollBuffer(preroll_buffer); |
+ } |
+ |
if (splice_frame) { |
if (!pre_splice_buffers.empty()) { |
// Enforce strictly monotonically increasing timestamps. |
@@ -3749,6 +3791,22 @@ TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoTinySplices) { |
CheckNoNextBuffer(); |
} |
+TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Preroll) { |
+ SetAudioStream(); |
+ Seek(0); |
+ NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K"); |
+ NewSegmentAppend("11P 13K 15K 17K"); |
+ CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11P 13K 15K 17K"); |
+ CheckNoNextBuffer(); |
+} |
+ |
+TEST_F(SourceBufferStreamTest, Audio_PrerollFrame) { |
+ Seek(0); |
+ NewSegmentAppend("0K 3P 6K"); |
+ CheckExpectedBuffers("0K 3P 6K"); |
+ CheckNoNextBuffer(); |
+} |
+ |
// TODO(vrk): Add unit tests where keyframes are unaligned between streams. |
// (crbug.com/133557) |