Commit dc09721b authored by xhwang@chromium.org's avatar xhwang@chromium.org

Fold DecryptingDemuxerStream::Stop() into the dtor.

BUG=349211
TEST=Existing tests pass.

Review URL: https://codereview.chromium.org/397953007

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@283886 0039d316-1c4b-4281-b951-d872f2087c98
parent 89318cd3
...@@ -132,16 +132,21 @@ class AudioDecoderSelectorTest : public ::testing::Test { ...@@ -132,16 +132,21 @@ class AudioDecoderSelectorTest : public ::testing::Test {
NOTREACHED(); NOTREACHED();
} }
// Fixture members. // Declare |decoder_selector_| after |demuxer_stream_| and |decryptor_| since
scoped_ptr<AudioDecoderSelector> decoder_selector_; // |demuxer_stream_| and |decryptor_| should outlive |decoder_selector_|.
scoped_ptr<StrictMock<MockDemuxerStream> > demuxer_stream_; scoped_ptr<StrictMock<MockDemuxerStream> > demuxer_stream_;
// Use NiceMock since we don't care about most of calls on the decryptor, e.g. // Use NiceMock since we don't care about most of calls on the decryptor, e.g.
// RegisterNewKeyCB(). // RegisterNewKeyCB().
scoped_ptr<NiceMock<MockDecryptor> > decryptor_; scoped_ptr<NiceMock<MockDecryptor> > decryptor_;
scoped_ptr<AudioDecoderSelector> decoder_selector_;
StrictMock<MockAudioDecoder>* decoder_1_; StrictMock<MockAudioDecoder>* decoder_1_;
StrictMock<MockAudioDecoder>* decoder_2_; StrictMock<MockAudioDecoder>* decoder_2_;
ScopedVector<AudioDecoder> all_decoders_; ScopedVector<AudioDecoder> all_decoders_;
scoped_ptr<AudioDecoder> selected_decoder_; scoped_ptr<AudioDecoder> selected_decoder_;
base::MessageLoop message_loop_; base::MessageLoop message_loop_;
private: private:
......
...@@ -116,32 +116,14 @@ void DecoderSelector<StreamType>::Abort() { ...@@ -116,32 +116,14 @@ void DecoderSelector<StreamType>::Abort() {
DVLOG(2) << __FUNCTION__; DVLOG(2) << __FUNCTION__;
DCHECK(task_runner_->BelongsToCurrentThread()); DCHECK(task_runner_->BelongsToCurrentThread());
// This could happen when SelectDecoder() was not called or when // Invalidate all weak pointers so that pending callbacks won't fire.
// |select_decoder_cb_| was already posted but not fired (e.g. in the
// message loop queue).
if (select_decoder_cb_.is_null())
return;
// We must be trying to initialize the |decoder_| or the
// |decrypted_stream_|. Invalid all weak pointers so that all initialization
// callbacks won't fire.
weak_ptr_factory_.InvalidateWeakPtrs(); weak_ptr_factory_.InvalidateWeakPtrs();
if (decoder_) {
// |decrypted_stream_| is either NULL or already initialized. We don't
// need to Stop() |decrypted_stream_| in either case.
decoder_.reset(); decoder_.reset();
ReturnNullDecoder(); decrypted_stream_.reset();
return;
}
if (decrypted_stream_) { if (!select_decoder_cb_.is_null())
decrypted_stream_->Stop();
ReturnNullDecoder(); ReturnNullDecoder();
return;
}
NOTREACHED();
} }
template <DemuxerStream::Type StreamType> template <DemuxerStream::Type StreamType>
......
...@@ -74,9 +74,6 @@ DecoderStream<StreamType>::~DecoderStream() { ...@@ -74,9 +74,6 @@ DecoderStream<StreamType>::~DecoderStream() {
if (!reset_cb_.is_null()) if (!reset_cb_.is_null())
task_runner_->PostTask(FROM_HERE, base::ResetAndReturn(&reset_cb_)); task_runner_->PostTask(FROM_HERE, base::ResetAndReturn(&reset_cb_));
if (decrypting_demuxer_stream_)
decrypting_demuxer_stream_->Stop();
stream_ = NULL; stream_ = NULL;
decoder_.reset(); decoder_.reset();
decrypting_demuxer_stream_.reset(); decrypting_demuxer_stream_.reset();
......
...@@ -74,7 +74,6 @@ void DecryptingDemuxerStream::Reset(const base::Closure& closure) { ...@@ -74,7 +74,6 @@ void DecryptingDemuxerStream::Reset(const base::Closure& closure) {
DVLOG(2) << __FUNCTION__ << " - state: " << state_; DVLOG(2) << __FUNCTION__ << " - state: " << state_;
DCHECK(task_runner_->BelongsToCurrentThread()); DCHECK(task_runner_->BelongsToCurrentThread());
DCHECK(state_ != kUninitialized) << state_; DCHECK(state_ != kUninitialized) << state_;
DCHECK(state_ != kStopped) << state_;
DCHECK(reset_cb_.is_null()); DCHECK(reset_cb_.is_null());
reset_cb_ = BindToCurrentLoop(closure); reset_cb_ = BindToCurrentLoop(closure);
...@@ -110,35 +109,6 @@ void DecryptingDemuxerStream::Reset(const base::Closure& closure) { ...@@ -110,35 +109,6 @@ void DecryptingDemuxerStream::Reset(const base::Closure& closure) {
DoReset(); DoReset();
} }
void DecryptingDemuxerStream::Stop() {
DVLOG(2) << __FUNCTION__ << " - state: " << state_;
DCHECK(task_runner_->BelongsToCurrentThread());
DCHECK(state_ != kUninitialized) << state_;
// Invalidate all weak pointers so that pending callbacks won't be fired into
// this object.
weak_factory_.InvalidateWeakPtrs();
// At this point the render thread is likely paused (in WebMediaPlayerImpl's
// Destroy()), so running |closure| can't wait for anything that requires the
// render thread to process messages to complete (such as PPAPI methods).
if (decryptor_) {
decryptor_->CancelDecrypt(GetDecryptorStreamType());
decryptor_ = NULL;
}
if (!set_decryptor_ready_cb_.is_null())
base::ResetAndReturn(&set_decryptor_ready_cb_).Run(DecryptorReadyCB());
if (!init_cb_.is_null())
base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT);
if (!read_cb_.is_null())
base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
if (!reset_cb_.is_null())
base::ResetAndReturn(&reset_cb_).Run();
pending_buffer_to_decrypt_ = NULL;
state_ = kStopped;
}
AudioDecoderConfig DecryptingDemuxerStream::audio_decoder_config() { AudioDecoderConfig DecryptingDemuxerStream::audio_decoder_config() {
DCHECK(state_ != kUninitialized && state_ != kDecryptorRequested) << state_; DCHECK(state_ != kUninitialized && state_ != kDecryptorRequested) << state_;
CHECK_EQ(demuxer_stream_->type(), AUDIO); CHECK_EQ(demuxer_stream_->type(), AUDIO);
...@@ -170,6 +140,24 @@ VideoRotation DecryptingDemuxerStream::video_rotation() { ...@@ -170,6 +140,24 @@ VideoRotation DecryptingDemuxerStream::video_rotation() {
DecryptingDemuxerStream::~DecryptingDemuxerStream() { DecryptingDemuxerStream::~DecryptingDemuxerStream() {
DVLOG(2) << __FUNCTION__ << " : state_ = " << state_; DVLOG(2) << __FUNCTION__ << " : state_ = " << state_;
DCHECK(task_runner_->BelongsToCurrentThread());
if (state_ == kUninitialized)
return;
if (decryptor_) {
decryptor_->CancelDecrypt(GetDecryptorStreamType());
decryptor_ = NULL;
}
if (!set_decryptor_ready_cb_.is_null())
base::ResetAndReturn(&set_decryptor_ready_cb_).Run(DecryptorReadyCB());
if (!init_cb_.is_null())
base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT);
if (!read_cb_.is_null())
base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
if (!reset_cb_.is_null())
base::ResetAndReturn(&reset_cb_).Run();
pending_buffer_to_decrypt_ = NULL;
} }
void DecryptingDemuxerStream::SetDecryptor(Decryptor* decryptor) { void DecryptingDemuxerStream::SetDecryptor(Decryptor* decryptor) {
......
...@@ -31,6 +31,8 @@ class MEDIA_EXPORT DecryptingDemuxerStream : public DemuxerStream { ...@@ -31,6 +31,8 @@ class MEDIA_EXPORT DecryptingDemuxerStream : public DemuxerStream {
DecryptingDemuxerStream( DecryptingDemuxerStream(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
const SetDecryptorReadyCB& set_decryptor_ready_cb); const SetDecryptorReadyCB& set_decryptor_ready_cb);
// Cancels all pending operations immediately and fires all pending callbacks.
virtual ~DecryptingDemuxerStream(); virtual ~DecryptingDemuxerStream();
void Initialize(DemuxerStream* stream, void Initialize(DemuxerStream* stream,
...@@ -42,13 +44,6 @@ class MEDIA_EXPORT DecryptingDemuxerStream : public DemuxerStream { ...@@ -42,13 +44,6 @@ class MEDIA_EXPORT DecryptingDemuxerStream : public DemuxerStream {
// kUninitialized if |this| hasn't been initialized, or to kIdle otherwise. // kUninitialized if |this| hasn't been initialized, or to kIdle otherwise.
void Reset(const base::Closure& closure); void Reset(const base::Closure& closure);
// Cancels all pending operations immediately and fires all pending callbacks
// and sets the state to kStopped. Does NOT wait for any pending operations.
// Note: During the teardown process, media pipeline will be waiting on the
// render main thread. If a Decryptor depends on the render main thread
// (e.g. PpapiDecryptor), the pending DecryptCB would not be satisfied.
void Stop();
// DemuxerStream implementation. // DemuxerStream implementation.
virtual void Read(const ReadCB& read_cb) OVERRIDE; virtual void Read(const ReadCB& read_cb) OVERRIDE;
virtual AudioDecoderConfig audio_decoder_config() OVERRIDE; virtual AudioDecoderConfig audio_decoder_config() OVERRIDE;
...@@ -69,8 +64,7 @@ class MEDIA_EXPORT DecryptingDemuxerStream : public DemuxerStream { ...@@ -69,8 +64,7 @@ class MEDIA_EXPORT DecryptingDemuxerStream : public DemuxerStream {
kIdle, kIdle,
kPendingDemuxerRead, kPendingDemuxerRead,
kPendingDecrypt, kPendingDecrypt,
kWaitingForKey, kWaitingForKey
kStopped
}; };
// Callback for DecryptorHost::RequestDecryptor(). // Callback for DecryptorHost::RequestDecryptor().
......
...@@ -89,6 +89,13 @@ class DecryptingDemuxerStreamTest : public testing::Test { ...@@ -89,6 +89,13 @@ class DecryptingDemuxerStreamTest : public testing::Test {
decrypted_buffer_(new DecoderBuffer(kFakeBufferSize)) { decrypted_buffer_(new DecoderBuffer(kFakeBufferSize)) {
} }
virtual ~DecryptingDemuxerStreamTest() {
if (is_decryptor_set_)
EXPECT_CALL(*decryptor_, CancelDecrypt(_));
demuxer_stream_.reset();
message_loop_.RunUntilIdle();
}
void InitializeAudioAndExpectStatus(const AudioDecoderConfig& config, void InitializeAudioAndExpectStatus(const AudioDecoderConfig& config,
PipelineStatus status) { PipelineStatus status) {
input_audio_stream_->set_audio_decoder_config(config); input_audio_stream_->set_audio_decoder_config(config);
...@@ -237,15 +244,6 @@ class DecryptingDemuxerStreamTest : public testing::Test { ...@@ -237,15 +244,6 @@ class DecryptingDemuxerStreamTest : public testing::Test {
message_loop_.RunUntilIdle(); message_loop_.RunUntilIdle();
} }
// Stops the |demuxer_stream_| without satisfying/aborting any pending
// operations.
void Stop() {
if (is_decryptor_set_)
EXPECT_CALL(*decryptor_, CancelDecrypt(Decryptor::kAudio));
demuxer_stream_->Stop();
message_loop_.RunUntilIdle();
}
MOCK_METHOD1(RequestDecryptorNotification, void(const DecryptorReadyCB&)); MOCK_METHOD1(RequestDecryptorNotification, void(const DecryptorReadyCB&));
MOCK_METHOD2(BufferReady, void(DemuxerStream::Status, MOCK_METHOD2(BufferReady, void(DemuxerStream::Status,
...@@ -379,8 +377,7 @@ TEST_F(DecryptingDemuxerStreamTest, KeyAdded_DruingPendingDecrypt) { ...@@ -379,8 +377,7 @@ TEST_F(DecryptingDemuxerStreamTest, KeyAdded_DruingPendingDecrypt) {
message_loop_.RunUntilIdle(); message_loop_.RunUntilIdle();
} }
// Test resetting when the DecryptingDemuxerStream is in kDecryptorRequested // Test resetting in kDecryptorRequested state.
// state.
TEST_F(DecryptingDemuxerStreamTest, Reset_DuringDecryptorRequested) { TEST_F(DecryptingDemuxerStreamTest, Reset_DuringDecryptorRequested) {
// One for decryptor request, one for canceling request during Reset(). // One for decryptor request, one for canceling request during Reset().
EXPECT_CALL(*this, RequestDecryptorNotification(_)) EXPECT_CALL(*this, RequestDecryptorNotification(_))
...@@ -392,22 +389,20 @@ TEST_F(DecryptingDemuxerStreamTest, Reset_DuringDecryptorRequested) { ...@@ -392,22 +389,20 @@ TEST_F(DecryptingDemuxerStreamTest, Reset_DuringDecryptorRequested) {
Reset(); Reset();
} }
// Test resetting when the DecryptingDemuxerStream is in kIdle state but has // Test resetting in kIdle state but has not returned any buffer.
// not returned any buffer.
TEST_F(DecryptingDemuxerStreamTest, Reset_DuringIdleAfterInitialization) { TEST_F(DecryptingDemuxerStreamTest, Reset_DuringIdleAfterInitialization) {
Initialize(); Initialize();
Reset(); Reset();
} }
// Test resetting when the DecryptingDemuxerStream is in kIdle state after it // Test resetting in kIdle state after having returned one buffer.
// has returned one buffer.
TEST_F(DecryptingDemuxerStreamTest, Reset_DuringIdleAfterReadOneBuffer) { TEST_F(DecryptingDemuxerStreamTest, Reset_DuringIdleAfterReadOneBuffer) {
Initialize(); Initialize();
EnterNormalReadingState(); EnterNormalReadingState();
Reset(); Reset();
} }
// Test resetting when DecryptingDemuxerStream is in kPendingDemuxerRead state. // Test resetting in kPendingDemuxerRead state.
TEST_F(DecryptingDemuxerStreamTest, Reset_DuringPendingDemuxerRead) { TEST_F(DecryptingDemuxerStreamTest, Reset_DuringPendingDemuxerRead) {
Initialize(); Initialize();
EnterPendingReadState(); EnterPendingReadState();
...@@ -419,7 +414,7 @@ TEST_F(DecryptingDemuxerStreamTest, Reset_DuringPendingDemuxerRead) { ...@@ -419,7 +414,7 @@ TEST_F(DecryptingDemuxerStreamTest, Reset_DuringPendingDemuxerRead) {
message_loop_.RunUntilIdle(); message_loop_.RunUntilIdle();
} }
// Test resetting when the DecryptingDemuxerStream is in kPendingDecrypt state. // Test resetting in kPendingDecrypt state.
TEST_F(DecryptingDemuxerStreamTest, Reset_DuringPendingDecrypt) { TEST_F(DecryptingDemuxerStreamTest, Reset_DuringPendingDecrypt) {
Initialize(); Initialize();
EnterPendingDecryptState(); EnterPendingDecryptState();
...@@ -429,7 +424,7 @@ TEST_F(DecryptingDemuxerStreamTest, Reset_DuringPendingDecrypt) { ...@@ -429,7 +424,7 @@ TEST_F(DecryptingDemuxerStreamTest, Reset_DuringPendingDecrypt) {
Reset(); Reset();
} }
// Test resetting when the DecryptingDemuxerStream is in kWaitingForKey state. // Test resetting in kWaitingForKey state.
TEST_F(DecryptingDemuxerStreamTest, Reset_DuringWaitingForKey) { TEST_F(DecryptingDemuxerStreamTest, Reset_DuringWaitingForKey) {
Initialize(); Initialize();
EnterWaitingForKeyState(); EnterWaitingForKeyState();
...@@ -439,7 +434,7 @@ TEST_F(DecryptingDemuxerStreamTest, Reset_DuringWaitingForKey) { ...@@ -439,7 +434,7 @@ TEST_F(DecryptingDemuxerStreamTest, Reset_DuringWaitingForKey) {
Reset(); Reset();
} }
// Test resetting after the DecryptingDemuxerStream has been reset. // Test resetting after reset.
TEST_F(DecryptingDemuxerStreamTest, Reset_AfterReset) { TEST_F(DecryptingDemuxerStreamTest, Reset_AfterReset) {
Initialize(); Initialize();
EnterNormalReadingState(); EnterNormalReadingState();
...@@ -458,7 +453,7 @@ TEST_F(DecryptingDemuxerStreamTest, DemuxerRead_Aborted) { ...@@ -458,7 +453,7 @@ TEST_F(DecryptingDemuxerStreamTest, DemuxerRead_Aborted) {
ReadAndExpectBufferReadyWith(DemuxerStream::kAborted, NULL); ReadAndExpectBufferReadyWith(DemuxerStream::kAborted, NULL);
} }
// Test resetting when DecryptingDemuxerStream is waiting for an aborted read. // Test resetting when waiting for an aborted read.
TEST_F(DecryptingDemuxerStreamTest, Reset_DuringAbortedDemuxerRead) { TEST_F(DecryptingDemuxerStreamTest, Reset_DuringAbortedDemuxerRead) {
Initialize(); Initialize();
EnterPendingReadState(); EnterPendingReadState();
...@@ -487,8 +482,7 @@ TEST_F(DecryptingDemuxerStreamTest, DemuxerRead_ConfigChanged) { ...@@ -487,8 +482,7 @@ TEST_F(DecryptingDemuxerStreamTest, DemuxerRead_ConfigChanged) {
ReadAndExpectBufferReadyWith(DemuxerStream::kConfigChanged, NULL); ReadAndExpectBufferReadyWith(DemuxerStream::kConfigChanged, NULL);
} }
// Test resetting when DecryptingDemuxerStream is waiting for a config changed // Test resetting when waiting for a config changed read.
// read.
TEST_F(DecryptingDemuxerStreamTest, Reset_DuringConfigChangedDemuxerRead) { TEST_F(DecryptingDemuxerStreamTest, Reset_DuringConfigChangedDemuxerRead) {
Initialize(); Initialize();
EnterPendingReadState(); EnterPendingReadState();
...@@ -501,9 +495,11 @@ TEST_F(DecryptingDemuxerStreamTest, Reset_DuringConfigChangedDemuxerRead) { ...@@ -501,9 +495,11 @@ TEST_F(DecryptingDemuxerStreamTest, Reset_DuringConfigChangedDemuxerRead) {
message_loop_.RunUntilIdle(); message_loop_.RunUntilIdle();
} }
// Test stopping when the DecryptingDemuxerStream is in kDecryptorRequested // The following tests test destruction in various scenarios. The destruction
// state. // happens in DecryptingDemuxerStreamTest's dtor.
TEST_F(DecryptingDemuxerStreamTest, Stop_DuringDecryptorRequested) {
// Test destruction in kDecryptorRequested state.
TEST_F(DecryptingDemuxerStreamTest, Destroy_DuringDecryptorRequested) {
// One for decryptor request, one for canceling request during Reset(). // One for decryptor request, one for canceling request during Reset().
EXPECT_CALL(*this, RequestDecryptorNotification(_)) EXPECT_CALL(*this, RequestDecryptorNotification(_))
.Times(2); .Times(2);
...@@ -511,57 +507,48 @@ TEST_F(DecryptingDemuxerStreamTest, Stop_DuringDecryptorRequested) { ...@@ -511,57 +507,48 @@ TEST_F(DecryptingDemuxerStreamTest, Stop_DuringDecryptorRequested) {
kCodecVorbis, kSampleFormatPlanarF32, CHANNEL_LAYOUT_STEREO, 44100, kCodecVorbis, kSampleFormatPlanarF32, CHANNEL_LAYOUT_STEREO, 44100,
NULL, 0, true); NULL, 0, true);
InitializeAudioAndExpectStatus(input_config, PIPELINE_ERROR_ABORT); InitializeAudioAndExpectStatus(input_config, PIPELINE_ERROR_ABORT);
Stop();
} }
// Test stopping when the DecryptingDemuxerStream is in kIdle state but has // Test destruction in kIdle state but has not returned any buffer.
// not returned any buffer. TEST_F(DecryptingDemuxerStreamTest, Destroy_DuringIdleAfterInitialization) {
TEST_F(DecryptingDemuxerStreamTest, Stop_DuringIdleAfterInitialization) {
Initialize(); Initialize();
Stop();
} }
// Test stopping when the DecryptingDemuxerStream is in kIdle state after it // Test destruction in kIdle state after having returned one buffer.
// has returned one buffer. TEST_F(DecryptingDemuxerStreamTest, Destroy_DuringIdleAfterReadOneBuffer) {
TEST_F(DecryptingDemuxerStreamTest, Stop_DuringIdleAfterReadOneBuffer) {
Initialize(); Initialize();
EnterNormalReadingState(); EnterNormalReadingState();
Stop();
} }
// Test stopping when DecryptingDemuxerStream is in kPendingDemuxerRead state. // Test destruction in kPendingDemuxerRead state.
TEST_F(DecryptingDemuxerStreamTest, Stop_DuringPendingDemuxerRead) { TEST_F(DecryptingDemuxerStreamTest, Destroy_DuringPendingDemuxerRead) {
Initialize(); Initialize();
EnterPendingReadState(); EnterPendingReadState();
EXPECT_CALL(*this, BufferReady(DemuxerStream::kAborted, IsNull())); EXPECT_CALL(*this, BufferReady(DemuxerStream::kAborted, IsNull()));
Stop();
} }
// Test stopping when the DecryptingDemuxerStream is in kPendingDecrypt state. // Test destruction in kPendingDecrypt state.
TEST_F(DecryptingDemuxerStreamTest, Stop_DuringPendingDecrypt) { TEST_F(DecryptingDemuxerStreamTest, Destroy_DuringPendingDecrypt) {
Initialize(); Initialize();
EnterPendingDecryptState(); EnterPendingDecryptState();
EXPECT_CALL(*this, BufferReady(DemuxerStream::kAborted, IsNull())); EXPECT_CALL(*this, BufferReady(DemuxerStream::kAborted, IsNull()));
Stop();
} }
// Test stopping when the DecryptingDemuxerStream is in kWaitingForKey state. // Test destruction in kWaitingForKey state.
TEST_F(DecryptingDemuxerStreamTest, Stop_DuringWaitingForKey) { TEST_F(DecryptingDemuxerStreamTest, Destroy_DuringWaitingForKey) {
Initialize(); Initialize();
EnterWaitingForKeyState(); EnterWaitingForKeyState();
EXPECT_CALL(*this, BufferReady(DemuxerStream::kAborted, IsNull())); EXPECT_CALL(*this, BufferReady(DemuxerStream::kAborted, IsNull()));
Stop();
} }
// Test stopping after the DecryptingDemuxerStream has been reset. // Test destruction after reset.
TEST_F(DecryptingDemuxerStreamTest, Stop_AfterReset) { TEST_F(DecryptingDemuxerStreamTest, Destroy_AfterReset) {
Initialize(); Initialize();
EnterNormalReadingState(); EnterNormalReadingState();
Reset(); Reset();
Stop();
} }
} // namespace media } // namespace media
...@@ -128,16 +128,19 @@ class VideoDecoderSelectorTest : public ::testing::Test { ...@@ -128,16 +128,19 @@ class VideoDecoderSelectorTest : public ::testing::Test {
NOTREACHED(); NOTREACHED();
} }
// Fixture members. // Declare |decoder_selector_| after |demuxer_stream_| and |decryptor_| since
scoped_ptr<VideoDecoderSelector> decoder_selector_; // |demuxer_stream_| and |decryptor_| should outlive |decoder_selector_|.
scoped_ptr<StrictMock<MockDemuxerStream> > demuxer_stream_; scoped_ptr<StrictMock<MockDemuxerStream> > demuxer_stream_;
// Use NiceMock since we don't care about most of calls on the decryptor, e.g. // Use NiceMock since we don't care about most of calls on the decryptor, e.g.
// RegisterNewKeyCB(). // RegisterNewKeyCB().
scoped_ptr<NiceMock<MockDecryptor> > decryptor_; scoped_ptr<NiceMock<MockDecryptor> > decryptor_;
scoped_ptr<VideoDecoderSelector> decoder_selector_;
StrictMock<MockVideoDecoder>* decoder_1_; StrictMock<MockVideoDecoder>* decoder_1_;
StrictMock<MockVideoDecoder>* decoder_2_; StrictMock<MockVideoDecoder>* decoder_2_;
ScopedVector<VideoDecoder> all_decoders_; ScopedVector<VideoDecoder> all_decoders_;
scoped_ptr<VideoDecoder> selected_decoder_; scoped_ptr<VideoDecoder> selected_decoder_;
base::MessageLoop message_loop_; base::MessageLoop message_loop_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment