| 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 0b3b95d794264471d9076e37b9e076a70cadc9c8..7f501f07285039bcf4ba50109929068c56c7527d 100644
|
| --- a/media/filters/source_buffer_stream_unittest.cc
|
| +++ b/media/filters/source_buffer_stream_unittest.cc
|
| @@ -79,19 +79,27 @@ class SourceBufferStreamTest : public testing::Test {
|
| }
|
|
|
| void NewSegmentAppend(const std::string& buffers_to_append) {
|
| - AppendBuffers(buffers_to_append, true, false);
|
| + AppendBuffers(buffers_to_append, true, false, true);
|
| }
|
|
|
| void AppendBuffers(const std::string& buffers_to_append) {
|
| - AppendBuffers(buffers_to_append, false, false);
|
| + AppendBuffers(buffers_to_append, false, false, true);
|
| }
|
|
|
| void NewSegmentAppendOneByOne(const std::string& buffers_to_append) {
|
| - AppendBuffers(buffers_to_append, true, true);
|
| + AppendBuffers(buffers_to_append, true, true, true);
|
| }
|
|
|
| void AppendBuffersOneByOne(const std::string& buffers_to_append) {
|
| - AppendBuffers(buffers_to_append, false, true);
|
| + AppendBuffers(buffers_to_append, false, true, true);
|
| + }
|
| +
|
| + void NewSegmentAppend_ExpectFailure(const std::string& buffers_to_append) {
|
| + AppendBuffers(buffers_to_append, true, false, false);
|
| + }
|
| +
|
| + void AppendBuffers_ExpectFailure(const std::string& buffers_to_append) {
|
| + AppendBuffers(buffers_to_append, false, false, false);
|
| }
|
|
|
| void Seek(int position) {
|
| @@ -188,20 +196,23 @@ class SourceBufferStreamTest : public testing::Test {
|
| void CheckExpectedBuffers(const std::string& expected) {
|
| std::vector<std::string> timestamps;
|
| base::SplitString(expected, ' ', ×tamps);
|
| + std::stringstream ss;
|
| for (size_t i = 0; i < timestamps.size(); i++) {
|
| scoped_refptr<StreamParserBuffer> buffer;
|
| SourceBufferStream::Status status = stream_->GetNextBuffer(&buffer);
|
|
|
| + if (i > 0)
|
| + ss << " ";
|
| +
|
| EXPECT_EQ(SourceBufferStream::kSuccess, status);
|
| if (status != SourceBufferStream::kSuccess)
|
| break;
|
|
|
| - std::stringstream ss;
|
| ss << buffer->GetDecodeTimestamp().InMilliseconds();
|
| if (buffer->IsKeyframe())
|
| ss << "K";
|
| - EXPECT_EQ(timestamps[i], ss.str());
|
| }
|
| + EXPECT_EQ(expected, ss.str());
|
| }
|
|
|
| void CheckNoNextBuffer() {
|
| @@ -273,7 +284,8 @@ class SourceBufferStreamTest : public testing::Test {
|
| }
|
|
|
| void AppendBuffers(const std::string& buffers_to_append,
|
| - bool start_new_segment, bool one_by_one) {
|
| + bool start_new_segment, bool one_by_one,
|
| + bool expect_success) {
|
| std::vector<std::string> timestamps;
|
| base::SplitString(buffers_to_append, ' ', ×tamps);
|
|
|
| @@ -304,7 +316,7 @@ class SourceBufferStreamTest : public testing::Test {
|
| }
|
|
|
| if (!one_by_one) {
|
| - EXPECT_TRUE(stream_->Append(buffers));
|
| + EXPECT_EQ(expect_success, stream_->Append(buffers));
|
| return;
|
| }
|
|
|
| @@ -1835,7 +1847,7 @@ TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenStartOverlap) {
|
| CheckExpectedBuffers(11, 14, &kDataB);
|
|
|
| // Replace the next buffer at position 15 with another start overlap.
|
| - AppendBuffers(15, 2, &kDataA);
|
| + NewSegmentAppend(15, 2, &kDataA);
|
| CheckExpectedBuffers(15, 16, &kDataA);
|
| }
|
|
|
| @@ -2705,6 +2717,76 @@ TEST_F(SourceBufferStreamTest, OverlapSplitAndMergeWhileWaitingForMoreData) {
|
| CheckExpectedBuffers("180K 210");
|
| }
|
|
|
| +// Verify that non-keyframes with the same timestamp in the same
|
| +// append are handled correctly.
|
| +TEST_F(SourceBufferStreamTest, AltRefFrame_SingleAppend) {
|
| + Seek(0);
|
| + NewSegmentAppend("0K 30 30 60 90 120K 150");
|
| + CheckExpectedBuffers("0K 30 30 60 90 120K 150");
|
| +}
|
| +
|
| +// Verify that non-keyframes with the same timestamp can occur
|
| +// in different appends.
|
| +TEST_F(SourceBufferStreamTest, AltRefFrame_TwoAppends) {
|
| + Seek(0);
|
| + NewSegmentAppend("0K 30");
|
| + AppendBuffers("30 60 90 120K 150");
|
| + CheckExpectedBuffers("0K 30 30 60 90 120K 150");
|
| +}
|
| +
|
| +// Verify that a non-keyframe followed by a keyframe with the same timestamp
|
| +// is not allowed.
|
| +TEST_F(SourceBufferStreamTest, AltRefFrame_Invalid_1) {
|
| + Seek(0);
|
| + NewSegmentAppend("0K 30");
|
| + AppendBuffers_ExpectFailure("30K 60");
|
| +}
|
| +
|
| +TEST_F(SourceBufferStreamTest, AltRefFrame_Invalid_2) {
|
| + Seek(0);
|
| + NewSegmentAppend_ExpectFailure("0K 30 30K 60");
|
| +}
|
| +
|
| +// Verify that a keyframe followed by a non-keyframe with the same timestamp
|
| +// is not allowed.
|
| +TEST_F(SourceBufferStreamTest, AltRefFrame_Invalid_3) {
|
| + Seek(0);
|
| + NewSegmentAppend("0K 30K");
|
| + AppendBuffers_ExpectFailure("30 60");
|
| +}
|
| +
|
| +TEST_F(SourceBufferStreamTest, AltRefFrame_Invalid_4) {
|
| + Seek(0);
|
| + NewSegmentAppend_ExpectFailure("0K 30K 30 60");
|
| +}
|
| +
|
| +TEST_F(SourceBufferStreamTest, AltRefFrame_Overlap_1) {
|
| + Seek(0);
|
| + NewSegmentAppend("0K 30 60 60 90 120K 150");
|
| +
|
| + NewSegmentAppend("60K 91 121K 151");
|
| + CheckExpectedBuffers("0K 30 60K 91 121K 151");
|
| +}
|
| +
|
| +TEST_F(SourceBufferStreamTest, AltRefFrame_Overlap_2) {
|
| + Seek(0);
|
| + NewSegmentAppend("0K 30 60 60 90 120K 150");
|
| + NewSegmentAppend("0K 30 61");
|
| + CheckExpectedBuffers("0K 30 61 120K 150");
|
| +}
|
| +
|
| +TEST_F(SourceBufferStreamTest, AltRefFrame_Overlap_3) {
|
| + Seek(0);
|
| + NewSegmentAppend("0K 20 40 60 80 100K 101 102 103K");
|
| + NewSegmentAppend("0K 20 40 60 80 90");
|
| + CheckExpectedBuffers("0K 20 40 60 80 90 100K 101 102 103K");
|
| + AppendBuffers("90 110K 150");
|
| + Seek(0);
|
| + CheckExpectedBuffers("0K 20 40 60 80 90 90 110K 150");
|
| + CheckNoNextBuffer();
|
| + CheckExpectedRangesByTimestamp("{ [0,190) }");
|
| +}
|
| +
|
| // TODO(vrk): Add unit tests where keyframes are unaligned between streams.
|
| // (crbug.com/133557)
|
|
|
|
|