summaryrefslogtreecommitdiffstats
path: root/media/cdm
diff options
context:
space:
mode:
authordalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-24 01:10:13 +0000
committerdalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-24 01:10:13 +0000
commit9a5ccfbdffdfbe8c5b17dc58b8ee005cc232837d (patch)
treecd6284a87dcc10f865c23558f30cb570034358dd /media/cdm
parent76f626953b69bc1f82523376033cdeee34e95289 (diff)
downloadchromium_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.cc53
-rw-r--r--media/cdm/ppapi/cdm_adapter.h8
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);
};