Chromium Code Reviews| 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 4033869a21cb5f367773603bad5e66fe3b49ee5a..1f46d0f4c9728fcfd4e33d11b1e41975409d2616 100644 |
| --- a/media/filters/source_buffer_stream_unittest.cc |
| +++ b/media/filters/source_buffer_stream_unittest.cc |
| @@ -15,10 +15,14 @@ static const int kDefaultKeyframesPerSecond = 6; |
| static const uint8 kDataA = 0x11; |
| static const uint8 kDataB = 0x33; |
| static const int kDataSize = 1; |
| +static const gfx::Size kCodedSize(320, 240); |
| class SourceBufferStreamTest : public testing::Test { |
| protected: |
| SourceBufferStreamTest() { |
| + config_.Initialize(kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, |
| + VideoFrame::YV12, kCodedSize, gfx::Rect(kCodedSize), |
| + kCodedSize, NULL, 0, false); |
| stream_.reset(new SourceBufferStream(config_)); |
| SetStreamInfo(kDefaultFramesPerSecond, kDefaultKeyframesPerSecond); |
| @@ -119,7 +123,10 @@ class SourceBufferStreamTest : public testing::Test { |
| int current_position = starting_position; |
| for (; current_position <= ending_position; current_position++) { |
| scoped_refptr<StreamParserBuffer> buffer; |
| - if (stream_->GetNextBuffer(&buffer) == SourceBufferStream::kNeedBuffer) |
| + SourceBufferStream::Status status = stream_->GetNextBuffer(&buffer); |
| + |
| + EXPECT_NE(status, SourceBufferStream::kConfigChange); |
| + if (status != SourceBufferStream::kSuccess) |
| break; |
| if (expect_keyframe && current_position == starting_position) |
| @@ -146,6 +153,13 @@ class SourceBufferStreamTest : public testing::Test { |
| EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kNeedBuffer); |
| } |
| + void CheckConfig(const VideoDecoderConfig& config) { |
| + const VideoDecoderConfig& actual = stream_->GetCurrentVideoDecoderConfig(); |
| + EXPECT_TRUE(actual.Matches(config)) |
| + << "Expected: " << config.AsHumanReadableString() |
| + << "\nActual: " << actual.AsHumanReadableString(); |
| + } |
| + |
| base::TimeDelta frame_duration() const { return frame_duration_; } |
| scoped_ptr<SourceBufferStream> stream_; |
| @@ -1822,6 +1836,93 @@ TEST_F(SourceBufferStreamTest, DISABLED_GarbageCollection_WaitingForKeyframe) { |
| CheckExpectedRanges("{ [15,15) [20,28) }"); |
| } |
| +TEST_F(SourceBufferStreamTest, ConfigChange_Basic) { |
| + gfx::Size kNewCodedSize(kCodedSize.width() * 2, kCodedSize.height() * 2); |
| + VideoDecoderConfig new_config( |
| + kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, VideoFrame::YV12, kNewCodedSize, |
| + gfx::Rect(kNewCodedSize), kNewCodedSize, NULL, 0); |
| + ASSERT_FALSE(new_config.Matches(config_)); |
| + |
| + Seek(0); |
| + CheckConfig(config_); |
| + |
| + // Append 5 buffers at positions 0 through 4 |
| + NewSegmentAppend(0, 5, &kDataA); |
| + |
| + CheckConfig(config_); |
| + |
| + // Signal a config change. |
| + stream_->UpdateVideoConfig(new_config); |
| + |
| + // Make sure updating the config doesn't change anything since new_config |
| + // should not be associated with the buffer GetNextBuffer() will return. |
| + CheckConfig(config_); |
| + |
| + // Append 5 buffers at positions 5 through 9. |
| + NewSegmentAppend(5, 5, &kDataB); |
| + |
| + // Consume the buffers associated with the initial config. |
| + scoped_refptr<StreamParserBuffer> buffer; |
| + for (int i = 0; i < 5; i++) { |
| + EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess); |
| + CheckConfig(config_); |
| + } |
| + |
| + // Verify the next attempt to get a buffer will signal that a config change |
| + // has happened. |
| + EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); |
| + |
| + // Verify that the new config is now returned. |
| + CheckConfig(new_config); |
| + |
| + // Consume the remaining buffers associated with the new config. |
| + for (int i = 0; i < 5; i++) { |
| + CheckConfig(new_config); |
| + EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess); |
| + } |
| +} |
| + |
| +TEST_F(SourceBufferStreamTest, ConfigChange_Seek) { |
| + scoped_refptr<StreamParserBuffer> buffer; |
| + gfx::Size kNewCodedSize(kCodedSize.width() * 2, kCodedSize.height() * 2); |
| + VideoDecoderConfig new_config( |
| + kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, VideoFrame::YV12, kNewCodedSize, |
| + gfx::Rect(kNewCodedSize), kNewCodedSize, NULL, 0); |
| + |
| + Seek(0); |
| + NewSegmentAppend(0, 5, &kDataA); |
| + stream_->UpdateVideoConfig(new_config); |
| + NewSegmentAppend(5, 5, &kDataB); |
| + |
| + // Seek to the start of the buffers with the new config and make sure a |
| + // config change is signalled. |
| + CheckConfig(config_); |
| + Seek(5); |
| + CheckConfig(config_); |
| + EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); |
| + CheckConfig(new_config); |
| + CheckExpectedBuffers(5, 9, &kDataB); |
| + |
| + |
| + // Seek to the start which has a different config. Don't fetch any buffers and |
| + // seek back to buffers with the current config. Make sure a config change |
| + // isn't signalled in this case. |
| + CheckConfig(new_config); |
| + Seek(0); |
| + Seek(7); |
|
Ami GONE FROM CHROMIUM
2012/08/21 17:08:16
Actually my hope was that you would seek to a targ
acolwell GONE FROM CHROMIUM
2012/08/21 18:18:40
Talked offline. No change needed.
|
| + CheckExpectedBuffers(5, 9, &kDataB); |
| + |
| + |
| + // Seek to the start and make sure a config change is signalled. |
| + CheckConfig(new_config); |
| + Seek(0); |
| + CheckConfig(new_config); |
| + EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); |
| + CheckConfig(config_); |
| + CheckExpectedBuffers(0, 4, &kDataA); |
| +} |
| + |
| + |
| // TODO(vrk): Add unit tests where keyframes are unaligned between streams. |
| // (crbug.com/133557) |