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

Unified Diff: media/filters/decrypting_audio_decoder_unittest.cc

Issue 141243003: Add AudioBufferStream. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@decoderstream_rebased
Patch Set: fix a couple comments Created 6 years, 10 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/decrypting_audio_decoder_unittest.cc
diff --git a/media/filters/decrypting_audio_decoder_unittest.cc b/media/filters/decrypting_audio_decoder_unittest.cc
index deb917d1acb0e53ee6873a34febbf8319ad77d1d..de672ee99afba20dc309c762da110ffd9009a5d3 100644
--- a/media/filters/decrypting_audio_decoder_unittest.cc
+++ b/media/filters/decrypting_audio_decoder_unittest.cc
@@ -49,7 +49,7 @@ static scoped_refptr<DecoderBuffer> CreateFakeEncryptedBuffer() {
namespace {
ACTION_P(ReturnBuffer, buffer) {
- arg0.Run(buffer.get() ? DemuxerStream::kOk : DemuxerStream::kAborted, buffer);
+ return buffer;
}
ACTION_P(RunCallbackIfNotNull, param) {
@@ -57,8 +57,10 @@ ACTION_P(RunCallbackIfNotNull, param) {
arg0.Run(param);
}
-ACTION_P2(ResetAndRunCallback, callback, param) {
- base::ResetAndReturn(callback).Run(param);
+// Mock action which we use to repeatedly call ReadAndExpectFrameReadyWith() if
+// we get kNotEnoughData from a Decode() call to |decoder_|.
+ACTION_P2(CallExpectFrameReadyMoreData, test, buffer) {
+ test->ReadAndExpectFrameReadyWith(AudioDecoder::kNotEnoughData, buffer);
}
MATCHER(IsEndOfStream, "end of stream") {
@@ -76,14 +78,14 @@ class DecryptingAudioDecoderTest : public testing::Test {
&DecryptingAudioDecoderTest::RequestDecryptorNotification,
base::Unretained(this)))),
decryptor_(new StrictMock<MockDecryptor>()),
- demuxer_(new StrictMock<MockDemuxerStream>(DemuxerStream::AUDIO)),
encrypted_buffer_(CreateFakeEncryptedBuffer()),
decoded_frame_(NULL),
end_of_stream_frame_(AudioBuffer::CreateEOSBuffer()),
- decoded_frame_list_() {
- }
+ decoded_frame_list_() {}
virtual ~DecryptingAudioDecoderTest() {
+ EXPECT_CALL(*this, RequestDecryptorNotification(_))
+ .Times(testing::AnyNumber());
Stop();
}
@@ -99,10 +101,7 @@ class DecryptingAudioDecoderTest : public testing::Test {
channels, kFakeAudioFrameSize, kNoTimestamp(), kNoTimestamp());
decoded_frame_list_.push_back(decoded_frame_);
- demuxer_->set_audio_decoder_config(config);
- decoder_->Initialize(demuxer_.get(), NewExpectedStatusCB(status),
- base::Bind(&MockStatisticsCB::OnStatistics,
- base::Unretained(&statistics_cb_)));
+ decoder_->Initialize(config, NewExpectedStatusCB(status));
message_loop_.RunUntilIdle();
}
@@ -126,18 +125,44 @@ class DecryptingAudioDecoderTest : public testing::Test {
EXPECT_EQ(config_.samples_per_second(), decoder_->samples_per_second());
}
+ void Reinitialize() {
+ ReinitializeConfigChange(config_);
+ }
+
+ void ReinitializeConfigChange(AudioDecoderConfig& new_config) {
+ EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio));
+ EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
+ .WillOnce(RunCallback<1>(true));
+ EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kAudio, _))
+ .WillOnce(SaveArg<1>(&key_added_cb_));
+ decoder_->Initialize(new_config, NewExpectedStatusCB(PIPELINE_OK));
+ }
+
void ReadAndExpectFrameReadyWith(
AudioDecoder::Status status,
const scoped_refptr<AudioBuffer>& audio_frame) {
- if (status != AudioDecoder::kOk)
+
+ if (const scoped_refptr<AudioBuffer>& buffer =
+ decoder_->GetDecodeOutput()) {
+ EXPECT_EQ(audio_frame, buffer);
+ EXPECT_EQ(status, AudioDecoder::kOk);
+ return;
+ }
+
+ if (status == AudioDecoder::kNotEnoughData)
+ // Keep calling again to give it more data if we get kNotEnoughData.
+ EXPECT_CALL(*this, FrameReady(status, scoped_refptr<AudioBuffer>(NULL))).
+ WillRepeatedly(CallExpectFrameReadyMoreData(this, audio_frame));
+ else if (status != AudioDecoder::kOk)
EXPECT_CALL(*this, FrameReady(status, IsNull()));
else if (audio_frame->end_of_stream())
EXPECT_CALL(*this, FrameReady(status, IsEndOfStream()));
else
EXPECT_CALL(*this, FrameReady(status, audio_frame));
- decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady,
- base::Unretained(this)));
+ decoder_->Decode(ProvideDecoderBuffer(),
+ base::Bind(&DecryptingAudioDecoderTest::FrameReady,
+ base::Unretained(this)));
message_loop_.RunUntilIdle();
}
@@ -146,14 +171,13 @@ class DecryptingAudioDecoderTest : public testing::Test {
void EnterNormalDecodingState() {
Decryptor::AudioBuffers end_of_stream_frames_(1, end_of_stream_frame_);
- EXPECT_CALL(*demuxer_, Read(_))
+ EXPECT_CALL(*this, ProvideDecoderBuffer())
.WillOnce(ReturnBuffer(encrypted_buffer_))
.WillRepeatedly(ReturnBuffer(DecoderBuffer::CreateEOSBuffer()));
EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _))
.WillOnce(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_))
.WillRepeatedly(RunCallback<1>(Decryptor::kNeedMoreData,
Decryptor::AudioBuffers()));
- EXPECT_CALL(statistics_cb_, OnStatistics(_));
ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_);
}
@@ -165,42 +189,32 @@ class DecryptingAudioDecoderTest : public testing::Test {
ReadAndExpectFrameReadyWith(AudioDecoder::kOk, end_of_stream_frame_);
}
- // Make the read callback pending by saving and not firing it.
- void EnterPendingReadState() {
- EXPECT_TRUE(pending_demuxer_read_cb_.is_null());
- EXPECT_CALL(*demuxer_, Read(_))
- .WillOnce(SaveArg<0>(&pending_demuxer_read_cb_));
- decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady,
- base::Unretained(this)));
- message_loop_.RunUntilIdle();
- // Make sure the Read() on the decoder triggers a Read() on the demuxer.
- EXPECT_FALSE(pending_demuxer_read_cb_.is_null());
- }
-
// Make the audio decode callback pending by saving and not firing it.
void EnterPendingDecodeState() {
EXPECT_TRUE(pending_audio_decode_cb_.is_null());
- EXPECT_CALL(*demuxer_, Read(_))
+ EXPECT_CALL(*this, ProvideDecoderBuffer())
.WillRepeatedly(ReturnBuffer(encrypted_buffer_));
EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(encrypted_buffer_, _))
.WillOnce(SaveArg<1>(&pending_audio_decode_cb_));
- decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady,
- base::Unretained(this)));
+ decoder_->Decode(ProvideDecoderBuffer(),
+ base::Bind(&DecryptingAudioDecoderTest::FrameReady,
+ base::Unretained(this)));
message_loop_.RunUntilIdle();
- // Make sure the Read() on the decoder triggers a DecryptAndDecode() on the
- // decryptor.
+ // Make sure the Decode() on the decoder triggers a DecryptAndDecode() on
+ // the decryptor.
EXPECT_FALSE(pending_audio_decode_cb_.is_null());
}
void EnterWaitingForKeyState() {
- EXPECT_CALL(*demuxer_, Read(_))
+ EXPECT_CALL(*this, ProvideDecoderBuffer())
.WillRepeatedly(ReturnBuffer(encrypted_buffer_));
EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(encrypted_buffer_, _))
.WillRepeatedly(RunCallback<1>(Decryptor::kNoKey,
Decryptor::AudioBuffers()));
- decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady,
- base::Unretained(this)));
+ decoder_->Decode(ProvideDecoderBuffer(),
+ base::Bind(&DecryptingAudioDecoderTest::FrameReady,
+ base::Unretained(this)));
message_loop_.RunUntilIdle();
}
@@ -244,19 +258,21 @@ class DecryptingAudioDecoderTest : public testing::Test {
MOCK_METHOD2(FrameReady,
void(AudioDecoder::Status, const scoped_refptr<AudioBuffer>&));
+ // Fills the role of the DemuxerStream, returns DecoderBuffers for |decoder_|
+ // to decode.
+ MOCK_METHOD0(ProvideDecoderBuffer,
+ scoped_refptr<DecoderBuffer>(void));
+
base::MessageLoop message_loop_;
scoped_ptr<DecryptingAudioDecoder> decoder_;
scoped_ptr<StrictMock<MockDecryptor> > decryptor_;
- scoped_ptr<StrictMock<MockDemuxerStream> > demuxer_;
- MockStatisticsCB statistics_cb_;
AudioDecoderConfig config_;
- DemuxerStream::ReadCB pending_demuxer_read_cb_;
Decryptor::DecoderInitCB pending_init_cb_;
Decryptor::NewKeyCB key_added_cb_;
Decryptor::AudioDecodeCB pending_audio_decode_cb_;
- // Constant buffer/frames to be returned by the |demuxer_| and |decryptor_|.
+ // Constant buffer/frames, to be used/returned by |decoder_| and |decryptor_|.
scoped_refptr<DecoderBuffer> encrypted_buffer_;
scoped_refptr<AudioBuffer> decoded_frame_;
scoped_refptr<AudioBuffer> end_of_stream_frame_;
@@ -318,7 +334,7 @@ TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_Normal) {
TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_DecodeError) {
Initialize();
- EXPECT_CALL(*demuxer_, Read(_))
+ EXPECT_CALL(*this, ProvideDecoderBuffer())
.WillRepeatedly(ReturnBuffer(encrypted_buffer_));
EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _))
.WillRepeatedly(RunCallback<1>(Decryptor::kError,
@@ -332,17 +348,17 @@ TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_DecodeError) {
TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_NeedMoreData) {
Initialize();
- EXPECT_CALL(*demuxer_, Read(_))
- .Times(2)
+ EXPECT_CALL(*this, ProvideDecoderBuffer())
.WillRepeatedly(ReturnBuffer(encrypted_buffer_));
EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _))
.WillOnce(RunCallback<1>(Decryptor::kNeedMoreData,
Decryptor::AudioBuffers()))
.WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_));
- EXPECT_CALL(statistics_cb_, OnStatistics(_))
- .Times(2);
- ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_);
+ // We expect it to eventually return kOk, with any number of returns of
+ // kNotEnoughData beforehand.
+ EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_));
+ ReadAndExpectFrameReadyWith(AudioDecoder::kNotEnoughData, decoded_frame_);
}
// Test the case where the decryptor returns multiple decoded frames.
@@ -362,11 +378,10 @@ TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_MultipleFrames) {
decoded_frame_list_.push_back(frame_a);
decoded_frame_list_.push_back(frame_b);
- EXPECT_CALL(*demuxer_, Read(_))
- .WillOnce(ReturnBuffer(encrypted_buffer_));
+ EXPECT_CALL(*this, ProvideDecoderBuffer())
+ .WillRepeatedly(ReturnBuffer(encrypted_buffer_));
EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _))
.WillOnce(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_));
- EXPECT_CALL(statistics_cb_, OnStatistics(_));
ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_);
ReadAndExpectFrameReadyWith(AudioDecoder::kOk, frame_a);
@@ -380,63 +395,30 @@ TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_EndOfStream) {
EnterEndOfStreamState();
}
-// Test aborted read on the demuxer stream.
-TEST_F(DecryptingAudioDecoderTest, DemuxerRead_Aborted) {
+// Test reinitializing decode with a new config
+TEST_F(DecryptingAudioDecoderTest, Reinitialize_ConfigChange) {
Initialize();
- // ReturnBuffer() with NULL triggers aborted demuxer read.
- EXPECT_CALL(*demuxer_, Read(_))
- .WillOnce(ReturnBuffer(scoped_refptr<DecoderBuffer>()));
-
- ReadAndExpectFrameReadyWith(AudioDecoder::kAborted, NULL);
-}
-
-// Test config change on the demuxer stream.
-TEST_F(DecryptingAudioDecoderTest, DemuxerRead_ConfigChange) {
- Initialize();
+ EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
+ .Times(AtMost(1))
+ .WillOnce(RunCallback<1>(true));
// The new config is different from the initial config in bits-per-channel,
// channel layout and samples_per_second.
AudioDecoderConfig new_config(kCodecVorbis, kSampleFormatPlanarS16,
- CHANNEL_LAYOUT_5_1, 88200, NULL, 0, false);
+ CHANNEL_LAYOUT_5_1, 88200, NULL, 0, true);
EXPECT_NE(new_config.bits_per_channel(), config_.bits_per_channel());
EXPECT_NE(new_config.channel_layout(), config_.channel_layout());
EXPECT_NE(new_config.samples_per_second(), config_.samples_per_second());
- demuxer_->set_audio_decoder_config(new_config);
- EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio));
- EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
- .WillOnce(RunCallback<1>(true));
- EXPECT_CALL(*demuxer_, Read(_))
- .WillOnce(RunCallback<0>(DemuxerStream::kConfigChanged,
- scoped_refptr<DecoderBuffer>()))
- .WillRepeatedly(ReturnBuffer(encrypted_buffer_));
- EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _))
- .WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_));
- EXPECT_CALL(statistics_cb_, OnStatistics(_));
-
- ReadAndExpectFrameReadyWith(AudioDecoder::kOk, decoded_frame_);
+ ReinitializeConfigChange(new_config);
+ message_loop_.RunUntilIdle();
EXPECT_EQ(new_config.bits_per_channel(), decoder_->bits_per_channel());
EXPECT_EQ(new_config.channel_layout(), decoder_->channel_layout());
EXPECT_EQ(new_config.samples_per_second(), decoder_->samples_per_second());
}
-// Test config change failure.
-TEST_F(DecryptingAudioDecoderTest, DemuxerRead_ConfigChangeFailed) {
- Initialize();
-
- EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio));
- EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
- .WillOnce(RunCallback<1>(false));
- EXPECT_CALL(*demuxer_, Read(_))
- .WillOnce(RunCallback<0>(DemuxerStream::kConfigChanged,
- scoped_refptr<DecoderBuffer>()))
- .WillRepeatedly(ReturnBuffer(encrypted_buffer_));
-
- ReadAndExpectFrameReadyWith(AudioDecoder::kDecodeError, NULL);
-}
-
// Test the case where the a key is added when the decryptor is in
// kWaitingForKey state.
TEST_F(DecryptingAudioDecoderTest, KeyAdded_DuringWaitingForKey) {
@@ -445,7 +427,6 @@ TEST_F(DecryptingAudioDecoderTest, KeyAdded_DuringWaitingForKey) {
EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _))
.WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_));
- EXPECT_CALL(statistics_cb_, OnStatistics(_));
EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_));
key_added_cb_.Run();
message_loop_.RunUntilIdle();
@@ -459,7 +440,6 @@ TEST_F(DecryptingAudioDecoderTest, KeyAdded_DruingPendingDecode) {
EXPECT_CALL(*decryptor_, DecryptAndDecodeAudio(_, _))
.WillRepeatedly(RunCallback<1>(Decryptor::kSuccess, decoded_frame_list_));
- EXPECT_CALL(statistics_cb_, OnStatistics(_));
EXPECT_CALL(*this, FrameReady(AudioDecoder::kOk, decoded_frame_));
// The audio decode callback is returned after the correct decryption key is
// added.
@@ -484,112 +464,6 @@ TEST_F(DecryptingAudioDecoderTest, Reset_DuringIdleAfterDecodedOneFrame) {
Reset();
}
-// Test resetting when the decoder is in kPendingDemuxerRead state and the read
-// callback is returned with kOk.
-TEST_F(DecryptingAudioDecoderTest, Reset_DuringDemuxerRead_Ok) {
rileya (GONE FROM CHROMIUM) 2014/03/04 00:14:27 All of these PendingDemuxerRead tests are no longe
- Initialize();
- EnterPendingReadState();
-
- EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull()));
-
- Reset();
- base::ResetAndReturn(&pending_demuxer_read_cb_).Run(DemuxerStream::kOk,
- encrypted_buffer_);
- message_loop_.RunUntilIdle();
-}
-
-// Test resetting when the decoder is in kPendingDemuxerRead state and the read
-// callback is returned with kAborted.
-TEST_F(DecryptingAudioDecoderTest, Reset_DuringDemuxerRead_Aborted) {
- Initialize();
- EnterPendingReadState();
-
- // Make sure we get a NULL audio frame returned.
- EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull()));
-
- Reset();
- base::ResetAndReturn(&pending_demuxer_read_cb_).Run(DemuxerStream::kAborted,
- NULL);
- message_loop_.RunUntilIdle();
-}
-
-// Test resetting when the decoder is in kPendingDemuxerRead state and the read
-// callback is returned with kConfigChanged.
-TEST_F(DecryptingAudioDecoderTest, Reset_DuringDemuxerRead_ConfigChange) {
- Initialize();
- EnterPendingReadState();
-
- Reset();
-
- // The new config is different from the initial config in bits-per-channel,
- // channel layout and samples_per_second.
- AudioDecoderConfig new_config(kCodecVorbis, kSampleFormatPlanarS16,
- CHANNEL_LAYOUT_5_1, 88200, NULL, 0, false);
- EXPECT_NE(new_config.bits_per_channel(), config_.bits_per_channel());
- EXPECT_NE(new_config.channel_layout(), config_.channel_layout());
- EXPECT_NE(new_config.samples_per_second(), config_.samples_per_second());
-
- // Even during pending reset, the decoder still needs to be initialized with
- // the new config.
- demuxer_->set_audio_decoder_config(new_config);
- EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio));
- EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
- .WillOnce(RunCallback<1>(true));
- EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull()));
-
- base::ResetAndReturn(&pending_demuxer_read_cb_)
- .Run(DemuxerStream::kConfigChanged, NULL);
- message_loop_.RunUntilIdle();
-
- EXPECT_EQ(new_config.bits_per_channel(), decoder_->bits_per_channel());
- EXPECT_EQ(new_config.channel_layout(), decoder_->channel_layout());
- EXPECT_EQ(new_config.samples_per_second(), decoder_->samples_per_second());
-}
-
-// Test resetting when the decoder is in kPendingDemuxerRead state, the read
-// callback is returned with kConfigChanged and the config change fails.
-TEST_F(DecryptingAudioDecoderTest, Reset_DuringDemuxerRead_ConfigChangeFailed) {
- Initialize();
- EnterPendingReadState();
-
- Reset();
-
- // Even during pending reset, the decoder still needs to be initialized with
- // the new config.
- EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio));
- EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
- .WillOnce(RunCallback<1>(false));
- EXPECT_CALL(*this, FrameReady(AudioDecoder::kDecodeError, IsNull()));
-
- base::ResetAndReturn(&pending_demuxer_read_cb_)
- .Run(DemuxerStream::kConfigChanged, NULL);
- message_loop_.RunUntilIdle();
-}
-
-// Test resetting when the decoder is in kPendingConfigChange state.
-TEST_F(DecryptingAudioDecoderTest, Reset_DuringPendingConfigChange) {
- Initialize();
- EnterNormalDecodingState();
-
- EXPECT_CALL(*demuxer_, Read(_))
- .WillOnce(RunCallback<0>(DemuxerStream::kConfigChanged,
- scoped_refptr<DecoderBuffer>()));
- EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio));
- EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
- .WillOnce(SaveArg<1>(&pending_init_cb_));
-
- decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady,
- base::Unretained(this)));
- message_loop_.RunUntilIdle();
- EXPECT_FALSE(pending_init_cb_.is_null());
-
- EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull()));
-
- Reset();
- base::ResetAndReturn(&pending_init_cb_).Run(true);
- message_loop_.RunUntilIdle();
-}
-
// Test resetting when the decoder is in kPendingDecode state.
TEST_F(DecryptingAudioDecoderTest, Reset_DuringPendingDecode) {
Initialize();

Powered by Google App Engine
This is Rietveld 408576698