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 e07d5248da585f8a2a78ad10f5b1652a8469afdc..976743c42be252cbc7668c37f0271fb2a6c3b826 100644 |
--- a/media/filters/audio_renderer_base_unittest.cc |
+++ b/media/filters/audio_renderer_base_unittest.cc |
@@ -16,6 +16,8 @@ using ::testing::_; |
using ::testing::AnyNumber; |
using ::testing::Invoke; |
using ::testing::Return; |
+using ::testing::ReturnPointee; |
+using ::testing::SaveArg; |
using ::testing::StrictMock; |
namespace media { |
@@ -111,6 +113,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. |
@@ -120,11 +134,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. |
@@ -182,6 +207,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) { |
@@ -326,6 +352,9 @@ TEST_F(AudioRendererBaseTest, Underflow_EndOfStream) { |
EXPECT_CALL(*renderer_, OnRenderEndOfStream()) |
.WillOnce(Invoke(renderer_.get(), &AudioRendererBase::SignalEndOfStream)); |
EXPECT_CALL(host_, NotifyEnded()); |
+ |
+ EXPECT_CALL(host_, GetTime()).WillOnce(Return(base::TimeDelta())); |
+ EXPECT_CALL(host_, SetTime(_)); |
EXPECT_FALSE(ConsumeBufferedData(kDataSize, &muted)); |
EXPECT_FALSE(muted); |
} |
@@ -359,4 +388,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 |