| 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..2bfd7253279043159736234a0a9d716970b4a83f 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,10 @@ bool ContentDecryptorDelegate::DecryptAndDecodeVideo(
|
|
|
| void ContentDecryptorDelegate::OnPromiseResolved(uint32 promise_id) {
|
| scoped_ptr<CdmPromise> promise = TakePromise(promise_id);
|
| - if (promise) {
|
| + DCHECK(promise &&
|
| + promise->resolveParameterType() == media::CdmPromise::VOID_TYPE);
|
| + if (promise &&
|
| + promise->resolveParameterType() == media::CdmPromise::VOID_TYPE) {
|
| SimpleCdmPromise* simple_promise(
|
| static_cast<SimpleCdmPromise*>(promise.get()));
|
| simple_promise->resolve();
|
| @@ -640,13 +674,48 @@ void ContentDecryptorDelegate::OnPromiseResolvedWithSession(
|
| StringVar* web_session_id_string = StringVar::FromPPVar(web_session_id);
|
| DCHECK(web_session_id_string);
|
|
|
| - if (promise) {
|
| + DCHECK(promise &&
|
| + promise->resolveParameterType() == media::CdmPromise::STRING_TYPE);
|
| + if (promise &&
|
| + promise->resolveParameterType() == media::CdmPromise::STRING_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 &&
|
| + promise->resolveParameterType() ==
|
| + media::CdmPromise::KEY_IDS_VECTOR_TYPE);
|
| + if (promise &&
|
| + promise->resolveParameterType() ==
|
| + media::CdmPromise::KEY_IDS_VECTOR_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 +725,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 +763,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;
|
|
|