Chromium Code Reviews| Index: content/renderer/pepper/content_decryptor_delegate.cc |
| diff --git a/content/renderer/pepper/content_decryptor_delegate.cc b/content/renderer/pepper/content_decryptor_delegate.cc |
| index e1b0b1ba3e5d1100275908abf15dd578ec1b86a9..d5d40abf3b18b9671907507534156a98731f950e 100644 |
| --- a/content/renderer/pepper/content_decryptor_delegate.cc |
| +++ b/content/renderer/pepper/content_decryptor_delegate.cc |
| @@ -20,6 +20,7 @@ |
| #include "media/base/video_decoder_config.h" |
| #include "media/base/video_frame.h" |
| #include "media/base/video_util.h" |
| +#include "ppapi/shared_impl/array_var.h" |
| #include "ppapi/shared_impl/scoped_pp_resource.h" |
| #include "ppapi/shared_impl/var.h" |
| #include "ppapi/shared_impl/var_tracker.h" |
| @@ -29,10 +30,12 @@ |
| using media::CdmPromise; |
| using media::Decryptor; |
| +using media::KeyIdsPromise; |
| using media::MediaKeys; |
| using media::NewSessionCdmPromise; |
| using media::SimpleCdmPromise; |
| using ppapi::ArrayBufferVar; |
| +using ppapi::ArrayVar; |
| using ppapi::PpapiGlobals; |
| using ppapi::ScopedPPResource; |
| using ppapi::StringVar; |
| @@ -330,6 +333,18 @@ void ContentDecryptorDelegate::InstanceCrashed() { |
| SatisfyAllPendingCallbacksOnError(); |
| } |
| +void ContentDecryptorDelegate::SetServerCertificate( |
| + const uint8* certificate, |
| + int certificate_length, |
| + scoped_ptr<media::SimpleCdmPromise> promise) { |
| + uint32_t promise_id = SavePromise(promise.PassAs<CdmPromise>()); |
| + PP_Var certificate_array = |
| + PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar( |
| + certificate_length, certificate); |
| + plugin_decryption_interface_->SetServerCertificate( |
| + pp_instance_, promise_id, certificate_array); |
| +} |
| + |
| void ContentDecryptorDelegate::CreateSession( |
| const std::string& init_data_type, |
| const uint8* init_data, |
| @@ -372,11 +387,27 @@ void ContentDecryptorDelegate::UpdateSession( |
| response_array); |
| } |
| -void ContentDecryptorDelegate::ReleaseSession( |
| +void ContentDecryptorDelegate::CloseSession( |
| + const std::string& web_session_id, |
| + scoped_ptr<SimpleCdmPromise> promise) { |
| + uint32_t promise_id = SavePromise(promise.PassAs<CdmPromise>()); |
| + plugin_decryption_interface_->CloseSession( |
| + pp_instance_, promise_id, StringVar::StringToPPVar(web_session_id)); |
| +} |
| + |
| +void ContentDecryptorDelegate::RemoveSession( |
| const std::string& web_session_id, |
| scoped_ptr<SimpleCdmPromise> promise) { |
| uint32_t promise_id = SavePromise(promise.PassAs<CdmPromise>()); |
| - plugin_decryption_interface_->ReleaseSession( |
| + plugin_decryption_interface_->RemoveSession( |
| + pp_instance_, promise_id, StringVar::StringToPPVar(web_session_id)); |
| +} |
| + |
| +void ContentDecryptorDelegate::GetUsableKeyIds( |
| + const std::string& web_session_id, |
| + scoped_ptr<media::KeyIdsPromise> promise) { |
| + uint32_t promise_id = SavePromise(promise.PassAs<CdmPromise>()); |
| + plugin_decryption_interface_->GetUsableKeyIds( |
| pp_instance_, promise_id, StringVar::StringToPPVar(web_session_id)); |
| } |
| @@ -625,7 +656,8 @@ bool ContentDecryptorDelegate::DecryptAndDecodeVideo( |
| void ContentDecryptorDelegate::OnPromiseResolved(uint32 promise_id) { |
| scoped_ptr<CdmPromise> promise = TakePromise(promise_id); |
| - if (promise) { |
| + DCHECK(promise->Type() == media::CdmPromise::SIMPLE_TYPE); |
|
ddorwin
2014/08/25 22:55:01
promise && ?
If you can't do that, this could cras
jrummell
2014/08/26 00:19:23
Done.
|
| + if (promise && promise->Type() == media::CdmPromise::SIMPLE_TYPE) { |
| SimpleCdmPromise* simple_promise( |
| static_cast<SimpleCdmPromise*>(promise.get())); |
| simple_promise->resolve(); |
| @@ -640,13 +672,42 @@ void ContentDecryptorDelegate::OnPromiseResolvedWithSession( |
| StringVar* web_session_id_string = StringVar::FromPPVar(web_session_id); |
| DCHECK(web_session_id_string); |
| - if (promise) { |
| + DCHECK(promise->Type() == media::CdmPromise::NEW_SESSION_TYPE); |
|
ddorwin
2014/08/25 22:55:01
ditto
jrummell
2014/08/26 00:19:23
Done.
|
| + if (promise && promise->Type() == media::CdmPromise::NEW_SESSION_TYPE) { |
| NewSessionCdmPromise* session_promise( |
| static_cast<NewSessionCdmPromise*>(promise.get())); |
| session_promise->resolve(web_session_id_string->value()); |
| } |
| } |
| +void ContentDecryptorDelegate::OnPromiseResolvedWithKeyIds( |
| + uint32 promise_id, |
| + PP_Var key_ids_array) { |
| + scoped_ptr<CdmPromise> promise = TakePromise(promise_id); |
| + |
| + ArrayVar* key_ids = ArrayVar::FromPPVar(key_ids_array); |
| + media::KeyIdsVector key_ids_vector; |
| + DCHECK(key_ids); |
| + if (key_ids) { |
| + for (size_t i = 0; i < key_ids->GetLength(); ++i) { |
| + ArrayBufferVar* array_buffer = ArrayBufferVar::FromPPVar(key_ids->Get(i)); |
| + DCHECK(array_buffer); |
| + if (array_buffer) { |
| + std::vector<uint8> key_id; |
| + const uint8* data = static_cast<const uint8*>(array_buffer->Map()); |
| + key_id.assign(data, data + array_buffer->ByteLength()); |
| + key_ids_vector.push_back(key_id); |
| + } |
| + } |
| + } |
| + |
| + DCHECK(promise->Type() == media::CdmPromise::KEY_IDS_TYPE); |
|
ddorwin
2014/08/25 22:55:01
ditto
jrummell
2014/08/26 00:19:23
Done.
|
| + if (promise && promise->Type() == media::CdmPromise::KEY_IDS_TYPE) { |
| + KeyIdsPromise* key_ids_promise(static_cast<KeyIdsPromise*>(promise.get())); |
| + key_ids_promise->resolve(key_ids_vector); |
| + } |
| +} |
| + |
| void ContentDecryptorDelegate::OnPromiseRejected( |
| uint32 promise_id, |
| PP_CdmExceptionCode exception_code, |
| @@ -656,6 +717,7 @@ void ContentDecryptorDelegate::OnPromiseRejected( |
| DCHECK(error_description_string); |
| scoped_ptr<CdmPromise> promise = TakePromise(promise_id); |
| + DCHECK(promise); |
| if (promise) { |
| promise->reject(PpExceptionTypeToMediaException(exception_code), |
| system_code, |
| @@ -693,6 +755,18 @@ void ContentDecryptorDelegate::OnSessionMessage(PP_Var web_session_id, |
| web_session_id_string->value(), message_vector, verified_gurl); |
| } |
| +void ContentDecryptorDelegate::OnSessionKeysChange( |
| + PP_Var web_session_id, |
| + PP_Bool has_additional_usable_key) { |
| + // TODO(jrummell): Pass this event on. |
| +} |
| + |
| +void ContentDecryptorDelegate::OnSessionExpirationChange( |
| + PP_Var web_session_id, |
| + PP_Time new_expiry_time) { |
| + // TODO(jrummell): Pass this event on. |
| +} |
| + |
| void ContentDecryptorDelegate::OnSessionReady(PP_Var web_session_id) { |
| if (session_ready_cb_.is_null()) |
| return; |