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

Unified Diff: media/filters/audio_renderer_impl_unittest.cc

Issue 10918022: Move AudioDecoder initialization into AudioRenderer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 3 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
Index: media/filters/audio_renderer_impl_unittest.cc
diff --git a/media/filters/audio_renderer_impl_unittest.cc b/media/filters/audio_renderer_impl_unittest.cc
index 89c870b2be144a022c9f0b626ba750ef536e1a91..b10a981ae9a47cb31662fb91af23138663fc83cf 100644
--- a/media/filters/audio_renderer_impl_unittest.cc
+++ b/media/filters/audio_renderer_impl_unittest.cc
@@ -27,46 +27,58 @@ namespace media {
static uint8 kMutedAudio = 0x00;
static uint8 kPlayingAudio = 0x99;
+ACTION_P(RunPipelineStatusCB1, status) {
+ arg1.Run(status);
+}
+
class AudioRendererImplTest : public ::testing::Test {
public:
- // Give the decoder some non-garbage media properties.
AudioRendererImplTest()
- : renderer_(new AudioRendererImpl(new NiceMock<MockAudioRendererSink>())),
- decoder_(new MockAudioDecoder()) {
+ : demuxer_stream_(new MockDemuxerStream()),
+ decoder_(new MockAudioDecoder()),
+ renderer_(new AudioRendererImpl(
+ new NiceMock<MockAudioRendererSink>())) {
+
+ EXPECT_CALL(*demuxer_stream_, type())
+ .WillRepeatedly(Return(DemuxerStream::AUDIO));
// Queue all reads from the decoder by default.
ON_CALL(*decoder_, Read(_))
.WillByDefault(Invoke(this, &AudioRendererImplTest::SaveReadCallback));
// Set up audio properties.
- SetSupportedAudioDecoderProperties();
+ SetSupportedAudioDecoderProperties(decoder_);
EXPECT_CALL(*decoder_, bits_per_channel())
.Times(AnyNumber());
EXPECT_CALL(*decoder_, channel_layout())
.Times(AnyNumber());
EXPECT_CALL(*decoder_, samples_per_second())
.Times(AnyNumber());
+
+ decoders_.push_back(decoder_);
}
virtual ~AudioRendererImplTest() {
renderer_->Stop(NewExpectedClosure());
}
- void SetSupportedAudioDecoderProperties() {
- ON_CALL(*decoder_, bits_per_channel())
+ void SetSupportedAudioDecoderProperties(
+ const scoped_refptr<MockAudioDecoder>& decoder) {
+ ON_CALL(*decoder, bits_per_channel())
.WillByDefault(Return(16));
- ON_CALL(*decoder_, channel_layout())
+ ON_CALL(*decoder, channel_layout())
.WillByDefault(Return(CHANNEL_LAYOUT_MONO));
- ON_CALL(*decoder_, samples_per_second())
+ ON_CALL(*decoder, samples_per_second())
.WillByDefault(Return(44100));
}
- void SetUnsupportedAudioDecoderProperties() {
- ON_CALL(*decoder_, bits_per_channel())
+ void SetUnsupportedAudioDecoderProperties(
+ const scoped_refptr<MockAudioDecoder>& decoder) {
+ ON_CALL(*decoder, bits_per_channel())
.WillByDefault(Return(3));
- ON_CALL(*decoder_, channel_layout())
+ ON_CALL(*decoder, channel_layout())
.WillByDefault(Return(CHANNEL_LAYOUT_UNSUPPORTED));
- ON_CALL(*decoder_, samples_per_second())
+ ON_CALL(*decoder, samples_per_second())
.WillByDefault(Return(0));
}
@@ -76,6 +88,7 @@ class AudioRendererImplTest : public ::testing::Test {
base::Unretained(this));
}
+ MOCK_METHOD1(OnStatistics, void(const media::PipelineStatistics&));
MOCK_METHOD0(OnUnderflow, void());
MOCK_METHOD0(OnEnded, void());
MOCK_METHOD0(OnDisabled, void());
@@ -87,12 +100,16 @@ class AudioRendererImplTest : public ::testing::Test {
}
void Initialize() {
+ EXPECT_CALL(*decoder_, Initialize(_, _, _))
+ .WillOnce(RunPipelineStatusCB1(PIPELINE_OK));
InitializeWithStatus(PIPELINE_OK);
}
void InitializeWithStatus(PipelineStatus expected) {
renderer_->Initialize(
- decoder_, NewExpectedStatusCB(expected),
+ demuxer_stream_, decoders_, NewExpectedStatusCB(expected),
+ base::Bind(&AudioRendererImplTest::OnStatistics,
+ base::Unretained(this)),
base::Bind(&AudioRendererImplTest::OnUnderflow,
base::Unretained(this)),
base::Bind(&AudioRendererImplTest::OnAudioTimeCallback,
@@ -206,11 +223,14 @@ class AudioRendererImplTest : public ::testing::Test {
}
// Fixture members.
- scoped_refptr<AudioRendererImpl> renderer_;
+ scoped_refptr<MockDemuxerStream> demuxer_stream_;
scoped_refptr<MockAudioDecoder> decoder_;
+ AudioRenderer::AudioDecoderList decoders_;
+ scoped_refptr<AudioRendererImpl> renderer_;
AudioDecoder::ReadCB read_cb_;
base::TimeDelta next_timestamp_;
+
private:
void SaveReadCallback(const AudioDecoder::ReadCB& callback) {
CHECK(read_cb_.is_null()) << "Overlapping reads are not permitted";
@@ -221,15 +241,54 @@ class AudioRendererImplTest : public ::testing::Test {
};
TEST_F(AudioRendererImplTest, Initialize_Failed) {
- SetUnsupportedAudioDecoderProperties();
+ scoped_refptr<StrictMock<MockAudioDecoder> > next_decoder =
+ new StrictMock<MockAudioDecoder>();
+ decoders_.push_back(next_decoder);
+
+ // First decoder reports catastrophic error: |next_decoder| shouldn't get
+ // called.
+ EXPECT_CALL(*decoder_, Initialize(_, _, _))
+ .WillOnce(RunPipelineStatusCB1(PIPELINE_ERROR_DECODE));
+ InitializeWithStatus(PIPELINE_ERROR_DECODE);
+
+ // We should have no reads.
+ EXPECT_TRUE(read_cb_.is_null());
+}
+
+TEST_F(AudioRendererImplTest, Initialize_UnsupportedProperties) {
+ scoped_refptr<StrictMock<MockAudioDecoder> > next_decoder =
+ new StrictMock<MockAudioDecoder>();
+ decoders_.push_back(next_decoder);
+
+ // First decoder succeeds but with unsupported properties: |next_decoder|
+ // shouldn't get called.
+ EXPECT_CALL(*decoder_, Initialize(_, _, _))
+ .WillOnce(RunPipelineStatusCB1(PIPELINE_OK));
+ SetUnsupportedAudioDecoderProperties(decoder_);
+
InitializeWithStatus(PIPELINE_ERROR_INITIALIZATION_FAILED);
// We should have no reads.
EXPECT_TRUE(read_cb_.is_null());
}
-TEST_F(AudioRendererImplTest, Initialize_Successful) {
- Initialize();
+TEST_F(AudioRendererImplTest, Initialize_UseNextDecoder) {
+ scoped_refptr<StrictMock<MockAudioDecoder> > next_decoder =
+ new StrictMock<MockAudioDecoder>();
+ decoders_.push_back(next_decoder);
+
+ // First decoder doesn't support the decoder config: |next_decoder| gets
+ // initialized and queried for properties.
+ EXPECT_CALL(*decoder_, Initialize(_, _, _))
+ .WillOnce(RunPipelineStatusCB1(DECODER_ERROR_NOT_SUPPORTED));
+ EXPECT_CALL(*next_decoder, Initialize(_, _, _))
+ .WillOnce(RunPipelineStatusCB1(PIPELINE_OK));
+ EXPECT_CALL(*next_decoder, bits_per_channel()).Times(AnyNumber());
+ EXPECT_CALL(*next_decoder, channel_layout()).Times(AnyNumber());
+ EXPECT_CALL(*next_decoder, samples_per_second()).Times(AnyNumber());
+ SetSupportedAudioDecoderProperties(next_decoder);
+
+ InitializeWithStatus(PIPELINE_OK);
// We should have no reads.
EXPECT_TRUE(read_cb_.is_null());

Powered by Google App Engine
This is Rietveld 408576698