diff options
-rw-r--r-- | media/base/audio_decoder_config.cc | 22 | ||||
-rw-r--r-- | media/base/audio_decoder_config.h | 21 | ||||
-rw-r--r-- | media/base/decryptor.h | 2 | ||||
-rw-r--r-- | media/base/mock_filters.cc | 6 | ||||
-rw-r--r-- | media/base/mock_filters.h | 8 | ||||
-rw-r--r-- | media/crypto/aes_decryptor.cc | 2 | ||||
-rw-r--r-- | media/crypto/aes_decryptor.h | 2 | ||||
-rw-r--r-- | media/filters/audio_decoder_selector_unittest.cc | 4 | ||||
-rw-r--r-- | media/filters/decrypting_audio_decoder.cc | 40 | ||||
-rw-r--r-- | media/filters/decrypting_audio_decoder_unittest.cc | 14 | ||||
-rw-r--r-- | media/filters/source_buffer_stream.cc | 24 | ||||
-rw-r--r-- | media/filters/source_buffer_stream.h | 2 | ||||
-rw-r--r-- | media/webm/webm_stream_parser.cc | 2 | ||||
-rw-r--r-- | webkit/media/crypto/ppapi_decryptor.cc | 11 | ||||
-rw-r--r-- | webkit/media/crypto/ppapi_decryptor.h | 5 |
15 files changed, 63 insertions, 102 deletions
diff --git a/media/base/audio_decoder_config.cc b/media/base/audio_decoder_config.cc index ee154a0..a4e57c2 100644 --- a/media/base/audio_decoder_config.cc +++ b/media/base/audio_decoder_config.cc @@ -39,7 +39,6 @@ AudioDecoderConfig::AudioDecoderConfig() channel_layout_(CHANNEL_LAYOUT_UNSUPPORTED), samples_per_second_(0), bytes_per_frame_(0), - extra_data_size_(0), is_encrypted_(false) { } @@ -83,17 +82,9 @@ void AudioDecoderConfig::Initialize(AudioCodec codec, codec_ = codec; channel_layout_ = channel_layout; samples_per_second_ = samples_per_second; - extra_data_size_ = extra_data_size; sample_format_ = sample_format; bits_per_channel_ = SampleFormatToBitsPerChannel(sample_format); - - if (extra_data_size_ > 0) { - extra_data_.reset(new uint8[extra_data_size_]); - memcpy(extra_data_.get(), extra_data, extra_data_size_); - } else { - extra_data_.reset(); - } - + extra_data_.assign(extra_data, extra_data + extra_data_size); is_encrypted_ = is_encrypted; int channels = ChannelLayoutToChannelCount(channel_layout_); @@ -124,15 +115,4 @@ bool AudioDecoderConfig::Matches(const AudioDecoderConfig& config) const { (sample_format() == config.sample_format())); } -void AudioDecoderConfig::CopyFrom(const AudioDecoderConfig& audio_config) { - Initialize(audio_config.codec(), - audio_config.sample_format(), - audio_config.channel_layout(), - audio_config.samples_per_second(), - audio_config.extra_data(), - audio_config.extra_data_size(), - audio_config.is_encrypted(), - false); -} - } // namespace media diff --git a/media/base/audio_decoder_config.h b/media/base/audio_decoder_config.h index fa29946..455fea0 100644 --- a/media/base/audio_decoder_config.h +++ b/media/base/audio_decoder_config.h @@ -5,8 +5,9 @@ #ifndef MEDIA_BASE_AUDIO_DECODER_CONFIG_H_ #define MEDIA_BASE_AUDIO_DECODER_CONFIG_H_ +#include <vector> + #include "base/basictypes.h" -#include "base/memory/scoped_ptr.h" #include "media/base/channel_layout.h" #include "media/base/media_export.h" @@ -78,9 +79,6 @@ class MEDIA_EXPORT AudioDecoderConfig { const uint8* extra_data, size_t extra_data_size, bool is_encrypted, bool record_stats); - // Deep copies |audio_config|. - void CopyFrom(const AudioDecoderConfig& audio_config); - // Returns true if this object has appropriate configuration values, false // otherwise. bool IsValidConfig() const; @@ -98,8 +96,10 @@ class MEDIA_EXPORT AudioDecoderConfig { // Optional byte data required to initialize audio decoders such as Vorbis // codebooks. - uint8* extra_data() const { return extra_data_.get(); } - size_t extra_data_size() const { return extra_data_size_; } + const uint8* extra_data() const { + return extra_data_.empty() ? NULL : &extra_data_[0]; + } + size_t extra_data_size() const { return extra_data_.size(); } // Whether the audio stream is potentially encrypted. // Note that in a potentially encrypted audio stream, individual buffers @@ -113,13 +113,12 @@ class MEDIA_EXPORT AudioDecoderConfig { ChannelLayout channel_layout_; int samples_per_second_; int bytes_per_frame_; - - scoped_array<uint8> extra_data_; - size_t extra_data_size_; - + std::vector<uint8> extra_data_; bool is_encrypted_; - DISALLOW_COPY_AND_ASSIGN(AudioDecoderConfig); + // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler + // generated copy constructor and assignment operator. Since the extra data is + // typically small, the performance impact is minimal. }; } // namespace media diff --git a/media/base/decryptor.h b/media/base/decryptor.h index 1a7dc21..6f76627 100644 --- a/media/base/decryptor.h +++ b/media/base/decryptor.h @@ -139,7 +139,7 @@ class MEDIA_EXPORT Decryptor { // Initializes a decoder with the given |config|, executing the |init_cb| // upon completion. - virtual void InitializeAudioDecoder(scoped_ptr<AudioDecoderConfig> config, + virtual void InitializeAudioDecoder(const AudioDecoderConfig& config, const DecoderInitCB& init_cb) = 0; virtual void InitializeVideoDecoder(const VideoDecoderConfig& config, const DecoderInitCB& init_cb) = 0; diff --git a/media/base/mock_filters.cc b/media/base/mock_filters.cc index 291f5b8..b7ed1e1 100644 --- a/media/base/mock_filters.cc +++ b/media/base/mock_filters.cc @@ -44,12 +44,6 @@ MockDecryptor::MockDecryptor() {} MockDecryptor::~MockDecryptor() {} -void MockDecryptor::InitializeAudioDecoder( - scoped_ptr<AudioDecoderConfig> config, - const DecoderInitCB& init_cb) { - InitializeAudioDecoderMock(*config, init_cb); -} - MockStatisticsCB::MockStatisticsCB() {} MockStatisticsCB::~MockStatisticsCB() {} diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h index ace4a6c..463fade 100644 --- a/media/base/mock_filters.h +++ b/media/base/mock_filters.h @@ -209,10 +209,7 @@ class MockDecryptor : public Decryptor { const scoped_refptr<DecoderBuffer>& encrypted, const DecryptCB& decrypt_cb)); MOCK_METHOD1(CancelDecrypt, void(StreamType stream_type)); - // TODO(xhwang): The following method is a workaround of the issue that - // move-only parameters are not supported in mocked methods. Remove when the - // issue is fixed: http://code.google.com/p/googletest/issues/detail?id=395 - MOCK_METHOD2(InitializeAudioDecoderMock, + MOCK_METHOD2(InitializeAudioDecoder, void(const AudioDecoderConfig& config, const DecoderInitCB& init_cb)); MOCK_METHOD2(InitializeVideoDecoder, @@ -227,9 +224,6 @@ class MockDecryptor : public Decryptor { MOCK_METHOD1(ResetDecoder, void(StreamType stream_type)); MOCK_METHOD1(DeinitializeDecoder, void(StreamType stream_type)); - virtual void InitializeAudioDecoder(scoped_ptr<AudioDecoderConfig> config, - const DecoderInitCB& init_cb) OVERRIDE; - private: DISALLOW_COPY_AND_ASSIGN(MockDecryptor); }; diff --git a/media/crypto/aes_decryptor.cc b/media/crypto/aes_decryptor.cc index 4e0feea..4c3d0d7 100644 --- a/media/crypto/aes_decryptor.cc +++ b/media/crypto/aes_decryptor.cc @@ -266,7 +266,7 @@ void AesDecryptor::CancelDecrypt(StreamType stream_type) { // Decrypt() calls the DecryptCB synchronously so there's nothing to cancel. } -void AesDecryptor::InitializeAudioDecoder(scoped_ptr<AudioDecoderConfig> config, +void AesDecryptor::InitializeAudioDecoder(const AudioDecoderConfig& config, const DecoderInitCB& init_cb) { // AesDecryptor does not support audio decoding. init_cb.Run(false); diff --git a/media/crypto/aes_decryptor.h b/media/crypto/aes_decryptor.h index 5a5c821..30d37b4 100644 --- a/media/crypto/aes_decryptor.h +++ b/media/crypto/aes_decryptor.h @@ -51,7 +51,7 @@ class MEDIA_EXPORT AesDecryptor : public Decryptor { const scoped_refptr<DecoderBuffer>& encrypted, const DecryptCB& decrypt_cb) OVERRIDE; virtual void CancelDecrypt(StreamType stream_type) OVERRIDE; - virtual void InitializeAudioDecoder(scoped_ptr<AudioDecoderConfig> config, + virtual void InitializeAudioDecoder(const AudioDecoderConfig& config, const DecoderInitCB& init_cb) OVERRIDE; virtual void InitializeVideoDecoder(const VideoDecoderConfig& config, const DecoderInitCB& init_cb) OVERRIDE; diff --git a/media/filters/audio_decoder_selector_unittest.cc b/media/filters/audio_decoder_selector_unittest.cc index e4b2071..e1f5bc0 100644 --- a/media/filters/audio_decoder_selector_unittest.cc +++ b/media/filters/audio_decoder_selector_unittest.cc @@ -76,10 +76,10 @@ class AudioDecoderSelectorTest : public ::testing::Test { .WillRepeatedly(RunCallback<0>(decryptor_.get())); if (decryptor_capability == kDecryptOnly) { - EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) + EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) .WillRepeatedly(RunCallback<1>(false)); } else { - EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) + EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) .WillRepeatedly(RunCallback<1>(true)); } } diff --git a/media/filters/decrypting_audio_decoder.cc b/media/filters/decrypting_audio_decoder.cc index 4ae6718..983ad47 100644 --- a/media/filters/decrypting_audio_decoder.cc +++ b/media/filters/decrypting_audio_decoder.cc @@ -174,19 +174,19 @@ void DecryptingAudioDecoder::SetDecryptor(Decryptor* decryptor) { const AudioDecoderConfig& input_config = demuxer_stream_->audio_decoder_config(); - scoped_ptr<AudioDecoderConfig> scoped_config(new AudioDecoderConfig()); - scoped_config->Initialize(input_config.codec(), - kSampleFormatS16, - input_config.channel_layout(), - input_config.samples_per_second(), - input_config.extra_data(), - input_config.extra_data_size(), - input_config.is_encrypted(), - false); + AudioDecoderConfig config; + config.Initialize(input_config.codec(), + kSampleFormatS16, + input_config.channel_layout(), + input_config.samples_per_second(), + input_config.extra_data(), + input_config.extra_data_size(), + input_config.is_encrypted(), + false); state_ = kPendingDecoderInit; decryptor_->InitializeAudioDecoder( - scoped_config.Pass(), + config, BindToCurrentLoop(base::Bind( &DecryptingAudioDecoder::FinishInitialization, this))); } @@ -265,20 +265,20 @@ void DecryptingAudioDecoder::DecryptAndDecodeBuffer( const AudioDecoderConfig& input_config = demuxer_stream_->audio_decoder_config(); - scoped_ptr<AudioDecoderConfig> scoped_config(new AudioDecoderConfig()); - scoped_config->Initialize(input_config.codec(), - kSampleFormatS16, - input_config.channel_layout(), - input_config.samples_per_second(), - input_config.extra_data(), - input_config.extra_data_size(), - input_config.is_encrypted(), - false); + AudioDecoderConfig config; + config.Initialize(input_config.codec(), + kSampleFormatS16, + input_config.channel_layout(), + input_config.samples_per_second(), + input_config.extra_data(), + input_config.extra_data_size(), + input_config.is_encrypted(), + false); state_ = kPendingConfigChange; decryptor_->DeinitializeDecoder(Decryptor::kAudio); decryptor_->InitializeAudioDecoder( - scoped_config.Pass(), BindToCurrentLoop(base::Bind( + config, BindToCurrentLoop(base::Bind( &DecryptingAudioDecoder::FinishConfigChange, this))); return; } diff --git a/media/filters/decrypting_audio_decoder_unittest.cc b/media/filters/decrypting_audio_decoder_unittest.cc index 5b70d52..303127d0 100644 --- a/media/filters/decrypting_audio_decoder_unittest.cc +++ b/media/filters/decrypting_audio_decoder_unittest.cc @@ -102,7 +102,7 @@ class DecryptingAudioDecoderTest : public testing::Test { } void Initialize() { - EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) + EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) .Times(AtMost(1)) .WillOnce(RunCallback<1>(true)); EXPECT_CALL(*this, RequestDecryptorNotification(_)) @@ -263,7 +263,7 @@ TEST_F(DecryptingAudioDecoderTest, Initialize_InvalidAudioConfig) { // Ensure decoder handles unsupported audio configs without crashing. TEST_F(DecryptingAudioDecoderTest, Initialize_UnsupportedAudioConfig) { - EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) + EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) .WillOnce(RunCallback<1>(false)); EXPECT_CALL(*this, RequestDecryptorNotification(_)) .WillOnce(RunCallbackIfNotNull(decryptor_.get())); @@ -366,7 +366,7 @@ TEST_F(DecryptingAudioDecoderTest, DemuxerRead_ConfigChange) { EXPECT_CALL(*demuxer_, audio_decoder_config()) .WillRepeatedly(ReturnRef(new_config)); EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio)); - EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) + EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) .WillOnce(RunCallback<1>(true)); EXPECT_CALL(*demuxer_, Read(_)) .WillOnce(RunCallback<0>(DemuxerStream::kConfigChanged, @@ -388,7 +388,7 @@ TEST_F(DecryptingAudioDecoderTest, DemuxerRead_ConfigChangeFailed) { Initialize(); EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio)); - EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) + EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) .WillOnce(RunCallback<1>(false)); EXPECT_CALL(*demuxer_, Read(_)) .WillOnce(RunCallback<0>(DemuxerStream::kConfigChanged, @@ -495,7 +495,7 @@ TEST_F(DecryptingAudioDecoderTest, Reset_DuringDemuxerRead_ConfigChange) { EXPECT_CALL(*demuxer_, audio_decoder_config()) .WillRepeatedly(ReturnRef(new_config)); EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio)); - EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) + EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) .WillOnce(RunCallback<1>(true)); EXPECT_CALL(*this, FrameReady(AudioDecoder::kAborted, IsNull())); @@ -519,7 +519,7 @@ TEST_F(DecryptingAudioDecoderTest, Reset_DuringDemuxerRead_ConfigChangeFailed) { // Even during pending reset, the decoder still needs to be initialized with // the new config. EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio)); - EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) + EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) .WillOnce(RunCallback<1>(false)); EXPECT_CALL(*this, FrameReady(AudioDecoder::kDecodeError, IsNull())); @@ -537,7 +537,7 @@ TEST_F(DecryptingAudioDecoderTest, Reset_DuringPendingConfigChange) { .WillOnce(RunCallback<0>(DemuxerStream::kConfigChanged, scoped_refptr<DecoderBuffer>())); EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio)); - EXPECT_CALL(*decryptor_, InitializeAudioDecoderMock(_, _)) + EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _)) .WillOnce(SaveArg<1>(&pending_init_cb_)); decoder_->Read(base::Bind(&DecryptingAudioDecoderTest::FrameReady, diff --git a/media/filters/source_buffer_stream.cc b/media/filters/source_buffer_stream.cc index c45b44b..c083454 100644 --- a/media/filters/source_buffer_stream.cc +++ b/media/filters/source_buffer_stream.cc @@ -10,7 +10,7 @@ #include "base/bind.h" #include "base/debug/trace_event.h" #include "base/logging.h" -#include "base/stl_util.h" + namespace media { // Helper class representing a range of buffered data. All buffers in a // SourceBufferRange are ordered sequentially in presentation order with no @@ -306,8 +306,7 @@ SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config, memory_limit_(kDefaultAudioMemoryLimit), config_change_pending_(false) { DCHECK(audio_config.IsValidConfig()); - audio_configs_.push_back(new AudioDecoderConfig()); - audio_configs_.back()->CopyFrom(audio_config); + audio_configs_.push_back(audio_config); } SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config, @@ -336,8 +335,6 @@ SourceBufferStream::~SourceBufferStream() { delete ranges_.front(); ranges_.pop_front(); } - - STLDeleteElements(&audio_configs_); } void SourceBufferStream::OnNewMediaSegment( @@ -1042,7 +1039,7 @@ bool SourceBufferStream::IsEndSelected() const { const AudioDecoderConfig& SourceBufferStream::GetCurrentAudioDecoderConfig() { if (config_change_pending_) CompleteConfigChange(); - return *audio_configs_[current_config_index_]; + return audio_configs_[current_config_index_]; } const VideoDecoderConfig& SourceBufferStream::GetCurrentVideoDecoderConfig() { @@ -1062,34 +1059,34 @@ bool SourceBufferStream::UpdateAudioConfig(const AudioDecoderConfig& config) { DCHECK(video_configs_.empty()); DVLOG(3) << "UpdateAudioConfig."; - if (audio_configs_[0]->codec() != config.codec()) { + if (audio_configs_[0].codec() != config.codec()) { MEDIA_LOG(log_cb_) << "Audio codec changes not allowed."; return false; } - if (audio_configs_[0]->samples_per_second() != config.samples_per_second()) { + if (audio_configs_[0].samples_per_second() != config.samples_per_second()) { MEDIA_LOG(log_cb_) << "Audio sample rate changes not allowed."; return false; } - if (audio_configs_[0]->channel_layout() != config.channel_layout()) { + if (audio_configs_[0].channel_layout() != config.channel_layout()) { MEDIA_LOG(log_cb_) << "Audio channel layout changes not allowed."; return false; } - if (audio_configs_[0]->bits_per_channel() != config.bits_per_channel()) { + if (audio_configs_[0].bits_per_channel() != config.bits_per_channel()) { MEDIA_LOG(log_cb_) << "Audio bits per channel changes not allowed."; return false; } - if (audio_configs_[0]->is_encrypted() != config.is_encrypted()) { + if (audio_configs_[0].is_encrypted() != config.is_encrypted()) { MEDIA_LOG(log_cb_) << "Audio encryption changes not allowed."; return false; } // Check to see if the new config matches an existing one. for (size_t i = 0; i < audio_configs_.size(); ++i) { - if (config.Matches(*audio_configs_[i])) { + if (config.Matches(audio_configs_[i])) { append_config_index_ = i; return true; } @@ -1099,8 +1096,7 @@ bool SourceBufferStream::UpdateAudioConfig(const AudioDecoderConfig& config) { append_config_index_ = audio_configs_.size(); DVLOG(2) << "New audio config - index: " << append_config_index_; audio_configs_.resize(audio_configs_.size() + 1); - audio_configs_[append_config_index_] = new AudioDecoderConfig(); - audio_configs_[append_config_index_]->CopyFrom(config); + audio_configs_[append_config_index_] = config; return true; } diff --git a/media/filters/source_buffer_stream.h b/media/filters/source_buffer_stream.h index a1e84f0..5a5562b 100644 --- a/media/filters/source_buffer_stream.h +++ b/media/filters/source_buffer_stream.h @@ -270,7 +270,7 @@ class MEDIA_EXPORT SourceBufferStream { // Holds the audio/video configs for this stream. |current_config_index_| // and |append_config_index_| represent indexes into one of these vectors. - std::vector<AudioDecoderConfig*> audio_configs_; + std::vector<AudioDecoderConfig> audio_configs_; std::vector<VideoDecoderConfig> video_configs_; // True if more data needs to be appended before the Seek() can complete, diff --git a/media/webm/webm_stream_parser.cc b/media/webm/webm_stream_parser.cc index ca7ec30..b60de5d 100644 --- a/media/webm/webm_stream_parser.cc +++ b/media/webm/webm_stream_parser.cc @@ -364,7 +364,7 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) { FireNeedKey(tracks_parser.audio_encryption_key_id()); } else { - audio_config.CopyFrom(config_helper.audio_config()); + audio_config = config_helper.audio_config(); } bool is_video_encrypted = !tracks_parser.video_encryption_key_id().empty(); diff --git a/webkit/media/crypto/ppapi_decryptor.cc b/webkit/media/crypto/ppapi_decryptor.cc index 8e066dc..ac07ba3 100644 --- a/webkit/media/crypto/ppapi_decryptor.cc +++ b/webkit/media/crypto/ppapi_decryptor.cc @@ -141,21 +141,20 @@ void PpapiDecryptor::CancelDecrypt(StreamType stream_type) { } void PpapiDecryptor::InitializeAudioDecoder( - scoped_ptr<media::AudioDecoderConfig> config, + const media::AudioDecoderConfig& config, const DecoderInitCB& init_cb) { if (!render_loop_proxy_->BelongsToCurrentThread()) { render_loop_proxy_->PostTask(FROM_HERE, base::Bind( - &PpapiDecryptor::InitializeAudioDecoder, weak_this_, - base::Passed(&config), init_cb)); + &PpapiDecryptor::InitializeAudioDecoder, weak_this_, config, init_cb)); return; } DVLOG(2) << "InitializeAudioDecoder()"; - DCHECK(config->is_encrypted()); - DCHECK(config->IsValidConfig()); + DCHECK(config.is_encrypted()); + DCHECK(config.IsValidConfig()); audio_decoder_init_cb_ = init_cb; - if (!plugin_cdm_delegate_->InitializeAudioDecoder(*config, base::Bind( + if (!plugin_cdm_delegate_->InitializeAudioDecoder(config, base::Bind( &PpapiDecryptor::OnDecoderInitialized, weak_this_, kAudio))) { base::ResetAndReturn(&audio_decoder_init_cb_).Run(false); return; diff --git a/webkit/media/crypto/ppapi_decryptor.h b/webkit/media/crypto/ppapi_decryptor.h index 75e270c..b57adf5 100644 --- a/webkit/media/crypto/ppapi_decryptor.h +++ b/webkit/media/crypto/ppapi_decryptor.h @@ -57,9 +57,8 @@ class PpapiDecryptor : public media::Decryptor { const scoped_refptr<media::DecoderBuffer>& encrypted, const DecryptCB& decrypt_cb) OVERRIDE; virtual void CancelDecrypt(StreamType stream_type) OVERRIDE; - virtual void InitializeAudioDecoder( - scoped_ptr<media::AudioDecoderConfig> config, - const DecoderInitCB& init_cb) OVERRIDE; + virtual void InitializeAudioDecoder(const media::AudioDecoderConfig& config, + const DecoderInitCB& init_cb) OVERRIDE; virtual void InitializeVideoDecoder(const media::VideoDecoderConfig& config, const DecoderInitCB& init_cb) OVERRIDE; virtual void DecryptAndDecodeAudio( |