Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(974)

Unified Diff: media/filters/source_buffer_stream_unittest.cc

Issue 276573002: Add gapless playback support for AAC playback. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase. Comments. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)
« media/filters/source_buffer_stream.cc ('K') | « media/filters/source_buffer_stream.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698