| Index: webkit/media/crypto/ppapi/cdm_wrapper.cc
|
| diff --git a/webkit/media/crypto/ppapi/cdm_wrapper.cc b/webkit/media/crypto/ppapi/cdm_wrapper.cc
|
| index 9c7fa56775d437efcf6bdfea338ff69bdd5bd86b..7dfcee1558b42f4fa979bb0d32d0c88b7a2bd9e8 100644
|
| --- a/webkit/media/crypto/ppapi/cdm_wrapper.cc
|
| +++ b/webkit/media/crypto/ppapi/cdm_wrapper.cc
|
| @@ -255,15 +255,14 @@ class PpbBuffer : public cdm::Buffer {
|
| DISALLOW_COPY_AND_ASSIGN(PpbBuffer);
|
| };
|
|
|
| -class PpbBufferAllocator : public cdm::Allocator {
|
| +class PpbBufferAllocator {
|
| public:
|
| explicit PpbBufferAllocator(pp::Instance* instance)
|
| : instance_(instance),
|
| next_buffer_id_(1) {}
|
| - virtual ~PpbBufferAllocator() {}
|
| + ~PpbBufferAllocator() {}
|
|
|
| - // cdm::Allocator implementation.
|
| - virtual cdm::Buffer* Allocate(int32_t capacity) OVERRIDE;
|
| + cdm::Buffer* Allocate(int32_t capacity);
|
|
|
| // Releases the buffer with |buffer_id|. A buffer can be recycled after
|
| // it is released.
|
| @@ -474,6 +473,9 @@ class AudioFramesImpl : public cdm::AudioFrames {
|
| DISALLOW_COPY_AND_ASSIGN(AudioFramesImpl);
|
| };
|
|
|
| +// GetCdmHostFunc implementation.
|
| +void* GetCdmHost(int host_interface_version, void* user_data);
|
| +
|
| // A wrapper class for abstracting away PPAPI interaction and threading for a
|
| // Content Decryption Module (CDM).
|
| class CdmWrapper : public pp::Instance,
|
| @@ -517,6 +519,7 @@ class CdmWrapper : public pp::Instance,
|
| const PP_EncryptedBlockInfo& encrypted_block_info) OVERRIDE;
|
|
|
| // cdm::Host implementation.
|
| + virtual cdm::Buffer* Allocate(int32_t capacity) OVERRIDE;
|
| virtual void SetTimer(int64_t delay_ms, void* context) OVERRIDE;
|
| virtual double GetCurrentWallTimeInSeconds() OVERRIDE;
|
| virtual void SendKeyMessage(
|
| @@ -527,6 +530,8 @@ class CdmWrapper : public pp::Instance,
|
| int32_t session_id_length,
|
| cdm::MediaKeyError error_code,
|
| uint32_t system_code) OVERRIDE;
|
| + virtual void GetPrivateData(int32_t* instance,
|
| + GetPrivateInterface* get_interface) OVERRIDE;
|
|
|
| private:
|
| struct SessionInfo {
|
| @@ -542,6 +547,8 @@ class CdmWrapper : public pp::Instance,
|
| typedef linked_ptr<VideoFrameImpl> LinkedVideoFrame;
|
| typedef linked_ptr<AudioFramesImpl> LinkedAudioFrames;
|
|
|
| + bool CreateCdmInstance(const std::string& key_system);
|
| +
|
| void SendUnknownKeyError(const std::string& key_system,
|
| const std::string& session_id);
|
|
|
| @@ -611,7 +618,17 @@ CdmWrapper::CdmWrapper(PP_Instance instance, pp::Module* module)
|
|
|
| CdmWrapper::~CdmWrapper() {
|
| if (cdm_)
|
| - DestroyCdmInstance(cdm_);
|
| + cdm_->Destroy();
|
| +}
|
| +
|
| +bool CdmWrapper::CreateCdmInstance(const std::string& key_system) {
|
| + PP_DCHECK(!cdm_);
|
| + cdm_ = static_cast<cdm::ContentDecryptionModule*>(
|
| + ::CreateCdmInstance(cdm::kCdmInterfaceVersion,
|
| + key_system.data(), key_system.size(),
|
| + GetCdmHost, this));
|
| +
|
| + return (cdm_ != NULL);
|
| }
|
|
|
| void CdmWrapper::GenerateKeyRequest(const std::string& key_system,
|
| @@ -621,18 +638,17 @@ void CdmWrapper::GenerateKeyRequest(const std::string& key_system,
|
| PP_DCHECK(key_system_.empty() || key_system_ == key_system);
|
|
|
| if (!cdm_) {
|
| - cdm_ = CreateCdmInstance(key_system.data(), key_system.size(),
|
| - &allocator_, this);
|
| - PP_DCHECK(cdm_);
|
| - if (!cdm_) {
|
| + if (!CreateCdmInstance(key_system)) {
|
| SendUnknownKeyError(key_system, "");
|
| return;
|
| }
|
| }
|
| + PP_DCHECK(cdm_);
|
|
|
| // Must be set here in case the CDM synchronously calls a cdm::Host method.
|
| // Clear below on error.
|
| - // TODO(ddorwin): Remove this when key_system is added to cdm::Host methods.
|
| + // TODO(ddorwin): Set/clear key_system_ & cdm_ at same time; clear both on
|
| + // error below.
|
| key_system_ = key_system;
|
| cdm::Status status = cdm_->GenerateKeyRequest(
|
| type.data(), type.size(),
|
| @@ -860,6 +876,10 @@ void CdmWrapper::DecryptAndDecode(
|
| }
|
| }
|
|
|
| +cdm::Buffer* CdmWrapper::Allocate(int32_t capacity) {
|
| + return allocator_.Allocate(capacity);
|
| +}
|
| +
|
| void CdmWrapper::SetTimer(int64_t delay_ms, void* context) {
|
| // NOTE: doesn't really need to run on the main thread; could just as well run
|
| // on a helper thread if |cdm_| were thread-friendly and care was taken. We
|
| @@ -902,12 +922,17 @@ void CdmWrapper::SendKeyError(const char* session_id,
|
| system_code);
|
| }
|
|
|
| +void CdmWrapper::GetPrivateData(int32_t* instance,
|
| + cdm::Host::GetPrivateInterface* get_interface) {
|
| + *instance = pp_instance();
|
| + *get_interface = pp::Module::Get()->get_browser_interface();
|
| +}
|
| +
|
| void CdmWrapper::SendUnknownKeyError(const std::string& key_system,
|
| const std::string& session_id) {
|
| SendKeyErrorInternal(key_system, session_id, cdm::kUnknownError, 0);
|
| }
|
|
|
| -
|
| void CdmWrapper::SendKeyAdded(const std::string& key_system,
|
| const std::string& session_id) {
|
| PostOnMain(callback_factory_.NewCallback(
|
| @@ -1117,6 +1142,17 @@ bool CdmWrapper::IsValidVideoFrame(const LinkedVideoFrame& video_frame) {
|
| return true;
|
| }
|
|
|
| +void* GetCdmHost(int host_interface_version, void* user_data) {
|
| + if (!host_interface_version || !user_data)
|
| + return NULL;
|
| +
|
| + if (host_interface_version != cdm::kHostInterfaceVersion)
|
| + return NULL;
|
| +
|
| + CdmWrapper* cdm_wrapper = static_cast<CdmWrapper*>(user_data);
|
| + return static_cast<cdm::Host*>(cdm_wrapper);
|
| +}
|
| +
|
| // This object is the global object representing this plugin library as long
|
| // as it is loaded.
|
| class CdmWrapperModule : public pp::Module {
|
|
|