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

Unified Diff: media/filters/audio_renderer_base_unittest.cc

Issue 9295020: Fix ChunkDemuxer seek deadlock (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix copyright year. Created 8 years, 11 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
« no previous file with comments | « media/filters/audio_renderer_base.cc ('k') | media/filters/chunk_demuxer.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « media/filters/audio_renderer_base.cc ('k') | media/filters/chunk_demuxer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698