diff options
author | dalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-24 01:10:13 +0000 |
---|---|---|
committer | dalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-24 01:10:13 +0000 |
commit | 9a5ccfbdffdfbe8c5b17dc58b8ee005cc232837d (patch) | |
tree | cd6284a87dcc10f865c23558f30cb570034358dd /media/cdm | |
parent | 76f626953b69bc1f82523376033cdeee34e95289 (diff) | |
download | chromium_src-9a5ccfbdffdfbe8c5b17dc58b8ee005cc232837d.zip chromium_src-9a5ccfbdffdfbe8c5b17dc58b8ee005cc232837d.tar.gz chromium_src-9a5ccfbdffdfbe8c5b17dc58b8ee005cc232837d.tar.bz2 |
Implement deferred decoder initialization.
BUG=309159
TEST=compile
Review URL: https://codereview.chromium.org/33873002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@230582 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/cdm')
-rw-r--r-- | media/cdm/ppapi/cdm_adapter.cc | 53 | ||||
-rw-r--r-- | media/cdm/ppapi/cdm_adapter.h | 8 |
2 files changed, 55 insertions, 6 deletions
diff --git a/media/cdm/ppapi/cdm_adapter.cc b/media/cdm/ppapi/cdm_adapter.cc index a60f402..d941997 100644 --- a/media/cdm/ppapi/cdm_adapter.cc +++ b/media/cdm/ppapi/cdm_adapter.cc @@ -215,7 +215,11 @@ CdmAdapter::CdmAdapter(PP_Instance instance, pp::Module* module) query_output_protection_in_progress_(false), #endif allocator_(this), - cdm_(NULL) { + cdm_(NULL), + deferred_initialize_audio_decoder_(false), + deferred_audio_decoder_config_id_(0), + deferred_initialize_video_decoder_(false), + deferred_video_decoder_config_id_(0) { callback_factory_.Initialize(this); } @@ -353,6 +357,8 @@ void CdmAdapter::Decrypt(pp::Buffer_Dev encrypted_buffer, void CdmAdapter::InitializeAudioDecoder( const PP_AudioDecoderConfig& decoder_config, pp::Buffer_Dev extra_data_buffer) { + PP_DCHECK(!deferred_initialize_audio_decoder_); + PP_DCHECK(deferred_audio_decoder_config_id_ == 0); cdm::Status status = cdm::kSessionError; if (cdm_) { cdm::AudioDecoderConfig cdm_decoder_config; @@ -367,6 +373,12 @@ void CdmAdapter::InitializeAudioDecoder( status = cdm_->InitializeAudioDecoder(cdm_decoder_config); } + if (status == cdm::kDeferredInitialization) { + deferred_initialize_audio_decoder_ = true; + deferred_audio_decoder_config_id_ = decoder_config.request_id; + return; + } + CallOnMain(callback_factory_.NewCallback( &CdmAdapter::DecoderInitializeDone, PP_DECRYPTORSTREAMTYPE_AUDIO, @@ -377,6 +389,8 @@ void CdmAdapter::InitializeAudioDecoder( void CdmAdapter::InitializeVideoDecoder( const PP_VideoDecoderConfig& decoder_config, pp::Buffer_Dev extra_data_buffer) { + PP_DCHECK(!deferred_initialize_video_decoder_); + PP_DCHECK(deferred_video_decoder_config_id_ == 0); cdm::Status status = cdm::kSessionError; if (cdm_) { cdm::VideoDecoderConfig cdm_decoder_config; @@ -394,6 +408,12 @@ void CdmAdapter::InitializeVideoDecoder( status = cdm_->InitializeVideoDecoder(cdm_decoder_config); } + if (status == cdm::kDeferredInitialization) { + deferred_initialize_video_decoder_ = true; + deferred_video_decoder_config_id_ = decoder_config.request_id; + return; + } + CallOnMain(callback_factory_.NewCallback( &CdmAdapter::DecoderInitializeDone, PP_DECRYPTORSTREAMTYPE_VIDEO, @@ -744,11 +764,6 @@ bool CdmAdapter::IsValidVideoFrame(const LinkedVideoFrame& video_frame) { return true; } -void CdmAdapter::OnDeferredInitializationDone(cdm::StreamType stream_type, - cdm::Status decoder_status) { - PP_NOTREACHED(); -} - void CdmAdapter::SendPlatformChallenge( const char* service_id, uint32_t service_id_length, const char* challenge, uint32_t challenge_length) { @@ -817,6 +832,32 @@ void CdmAdapter::QueryOutputProtectionStatus() { cdm_->OnQueryOutputProtectionStatus(0, 0); } +void CdmAdapter::OnDeferredInitializationDone(cdm::StreamType stream_type, + cdm::Status decoder_status) { + switch (stream_type) { + case cdm::kStreamTypeAudio: + PP_DCHECK(deferred_initialize_audio_decoder_); + CallOnMain( + callback_factory_.NewCallback(&CdmAdapter::DecoderInitializeDone, + PP_DECRYPTORSTREAMTYPE_AUDIO, + deferred_audio_decoder_config_id_, + decoder_status == cdm::kSuccess)); + deferred_initialize_audio_decoder_ = false; + deferred_audio_decoder_config_id_ = 0; + break; + case cdm::kStreamTypeVideo: + PP_DCHECK(deferred_initialize_video_decoder_); + CallOnMain( + callback_factory_.NewCallback(&CdmAdapter::DecoderInitializeDone, + PP_DECRYPTORSTREAMTYPE_VIDEO, + deferred_video_decoder_config_id_, + decoder_status == cdm::kSuccess)); + deferred_initialize_video_decoder_ = false; + deferred_video_decoder_config_id_ = 0; + break; + } +} + #if defined(OS_CHROMEOS) void CdmAdapter::SendPlatformChallengeDone(int32_t result) { challenge_in_progress_ = false; diff --git a/media/cdm/ppapi/cdm_adapter.h b/media/cdm/ppapi/cdm_adapter.h index d5cc9730..441dfe9 100644 --- a/media/cdm/ppapi/cdm_adapter.h +++ b/media/cdm/ppapi/cdm_adapter.h @@ -200,6 +200,14 @@ class CdmAdapter : public pp::Instance, linked_ptr<CdmWrapper> cdm_; std::string key_system_; + // If the CDM returned kDeferredInitialization during InitializeAudioDecoder() + // or InitializeVideoDecoder(), the (Audio|Video)DecoderConfig.request_id is + // saved for the future call to OnDeferredInitializationDone(). + bool deferred_initialize_audio_decoder_; + uint32_t deferred_audio_decoder_config_id_; + bool deferred_initialize_video_decoder_; + uint32_t deferred_video_decoder_config_id_; + DISALLOW_COPY_AND_ASSIGN(CdmAdapter); }; |