Index: media/filters/audio_renderer_base_unittest.cc |
diff --git a/media/filters/audio_renderer_base_unittest.cc b/media/filters/audio_renderer_base_unittest.cc |
index 93fe785d16873fd5a87cf90f7c750ddbe5282860..b0df02c6b81557e9018291a1ab13e30acc408aa4 100644 |
--- a/media/filters/audio_renderer_base_unittest.cc |
+++ b/media/filters/audio_renderer_base_unittest.cc |
@@ -110,6 +110,18 @@ class AudioRendererBaseTest : public ::testing::Test { |
renderer_->SetPlaybackRate(1.0f); |
} |
+ void Seek(base::TimeDelta seek_time) { |
+ next_timestamp_ = seek_time; |
+ |
+ // Seek to trigger prerolling. |
+ EXPECT_CALL(*decoder_, Read(_)); |
+ renderer_->Seek(seek_time, NewSeekCB()); |
+ |
+ // Fill entire buffer to complete prerolling. |
+ EXPECT_CALL(*this, OnSeekComplete(PIPELINE_OK)); |
+ DeliverRemainingAudio(); |
+ } |
+ |
// Delivers |size| bytes with value kPlayingAudio to |renderer_|. |
// |
// There must be a pending read callback. |
@@ -119,11 +131,22 @@ class AudioRendererBaseTest : public ::testing::Test { |
buffer->SetDataSize(size); |
memset(buffer->GetWritableData(), kPlayingAudio, buffer->GetDataSize()); |
+ buffer->SetTimestamp(next_timestamp_); |
+ int64 bps = decoder_->bits_per_channel() * decoder_->samples_per_second(); |
+ buffer->SetDuration(base::TimeDelta::FromMilliseconds(8000 * size / bps)); |
+ next_timestamp_ += buffer->GetDuration(); |
+ |
AudioDecoder::ReadCB read_cb; |
std::swap(read_cb, read_cb_); |
read_cb.Run(buffer); |
} |
+ void AbortPendingRead() { |
+ AudioDecoder::ReadCB read_cb; |
+ std::swap(read_cb, read_cb_); |
+ read_cb.Run(NULL); |
+ } |
+ |
// Delivers an end of stream buffer to |renderer_|. |
// |
// There must be a pending read callback. |
@@ -181,6 +204,7 @@ class AudioRendererBaseTest : public ::testing::Test { |
scoped_refptr<MockAudioDecoder> decoder_; |
StrictMock<MockFilterHost> host_; |
AudioDecoder::ReadCB read_cb_; |
+ base::TimeDelta next_timestamp_; |
private: |
void SaveReadCallback(const AudioDecoder::ReadCB& callback) { |
@@ -354,4 +378,39 @@ TEST_F(AudioRendererBaseTest, Underflow_ResumeFromCallback) { |
EXPECT_FALSE(muted); |
} |
+TEST_F(AudioRendererBaseTest, AbortPendingRead_Preroll) { |
+ Initialize(); |
+ |
+ // Seek to trigger prerolling. |
+ EXPECT_CALL(*decoder_, Read(_)); |
+ renderer_->Seek(base::TimeDelta(), NewSeekCB()); |
+ |
+ // Simulate the decoder aborting the pending read. |
+ EXPECT_CALL(*this, OnSeekComplete(PIPELINE_OK)); |
+ AbortPendingRead(); |
+ |
+ // Seek to trigger another preroll and verify it completes |
+ // normally. |
+ Seek(base::TimeDelta::FromSeconds(1)); |
+ |
+ ASSERT_TRUE(read_cb_.is_null()); |
+} |
+ |
+TEST_F(AudioRendererBaseTest, AbortPendingRead_Pause) { |
+ Initialize(); |
+ |
+ Preroll(); |
+ Play(); |
+ |
+ // Partially drain internal buffer so we get a pending read. |
+ EXPECT_CALL(*decoder_, Read(_)); |
+ EXPECT_TRUE(ConsumeBufferedData(bytes_buffered() / 2, NULL)); |
+ |
+ renderer_->Pause(NewExpectedClosure()); |
+ |
+ AbortPendingRead(); |
+ |
+ Seek(base::TimeDelta::FromSeconds(1)); |
+} |
+ |
} // namespace media |