diff options
Diffstat (limited to 'media/base')
-rw-r--r-- | media/base/android/browser_cdm_factory_android.cc | 10 | ||||
-rw-r--r-- | media/base/android/media_player_android.cc | 1 | ||||
-rw-r--r-- | media/base/browser_cdm.h | 22 | ||||
-rw-r--r-- | media/base/browser_cdm_factory.h | 14 | ||||
-rw-r--r-- | media/base/cdm_promise.cc | 74 | ||||
-rw-r--r-- | media/base/cdm_promise.h | 87 | ||||
-rw-r--r-- | media/base/media_keys.h | 77 |
7 files changed, 244 insertions, 41 deletions
diff --git a/media/base/android/browser_cdm_factory_android.cc b/media/base/android/browser_cdm_factory_android.cc index 71eb0b5..2f438f0 100644 --- a/media/base/android/browser_cdm_factory_android.cc +++ b/media/base/android/browser_cdm_factory_android.cc @@ -14,11 +14,11 @@ namespace media { scoped_ptr<BrowserCdm> CreateBrowserCdm( const std::string& key_system, - const SessionCreatedCB& session_created_cb, - const SessionMessageCB& session_message_cb, - const SessionReadyCB& session_ready_cb, - const SessionClosedCB& session_closed_cb, - const SessionErrorCB& session_error_cb) { + const BrowserCdm::SessionCreatedCB& session_created_cb, + const BrowserCdm::SessionMessageCB& session_message_cb, + const BrowserCdm::SessionReadyCB& session_ready_cb, + const BrowserCdm::SessionClosedCB& session_closed_cb, + const BrowserCdm::SessionErrorCB& session_error_cb) { if (!MediaDrmBridge::IsKeySystemSupported(key_system)) { NOTREACHED() << "Unsupported key system: " << key_system; return scoped_ptr<BrowserCdm>(); diff --git a/media/base/android/media_player_android.cc b/media/base/android/media_player_android.cc index b515d08..3501dcb 100644 --- a/media/base/android/media_player_android.cc +++ b/media/base/android/media_player_android.cc @@ -5,6 +5,7 @@ #include "media/base/android/media_player_android.h" #include "base/logging.h" +#include "media/base/android/media_drm_bridge.h" #include "media/base/android/media_player_manager.h" namespace media { diff --git a/media/base/browser_cdm.h b/media/base/browser_cdm.h index 6e4e5cd..b6b6044 100644 --- a/media/base/browser_cdm.h +++ b/media/base/browser_cdm.h @@ -11,11 +11,29 @@ namespace media { // Interface for browser side CDMs. -class BrowserCdm : public MediaKeys, public PlayerTracker { +class BrowserCdm : public PlayerTracker { public: + // TODO(jrummell): Update this to actually derive from MediaKeys + // (Use web_session_id rather than session_id). + typedef base::Callback< + void(uint32 session_id, const std::string& web_session_id)> + SessionCreatedCB; + + typedef base::Callback<void(uint32 session_id, + const std::vector<uint8>& message, + const GURL& destination_url)> SessionMessageCB; + + typedef base::Callback<void(uint32 session_id)> SessionReadyCB; + + typedef base::Callback<void(uint32 session_id)> SessionClosedCB; + + typedef base::Callback<void(uint32 session_id, + media::MediaKeys::KeyError error_code, + uint32 system_code)> SessionErrorCB; + virtual ~BrowserCdm(); - // MediaKeys implementation. + // MediaKeys-like implementation. virtual bool CreateSession(uint32 session_id, const std::string& content_type, const uint8* init_data, diff --git a/media/base/browser_cdm_factory.h b/media/base/browser_cdm_factory.h index 4e86c8b..e6fa47b 100644 --- a/media/base/browser_cdm_factory.h +++ b/media/base/browser_cdm_factory.h @@ -8,23 +8,21 @@ #include <string> #include "base/memory/scoped_ptr.h" +#include "media/base/browser_cdm.h" #include "media/base/media_export.h" -#include "media/base/media_keys.h" namespace media { -class BrowserCdm; - // Creates a BrowserCdm for |key_system|. Returns NULL if the CDM cannot be // created. // TODO(xhwang): Add ifdef for IPC based CDM. scoped_ptr<BrowserCdm> MEDIA_EXPORT CreateBrowserCdm(const std::string& key_system, - const SessionCreatedCB& session_created_cb, - const SessionMessageCB& session_message_cb, - const SessionReadyCB& session_ready_cb, - const SessionClosedCB& session_closed_cb, - const SessionErrorCB& session_error_cb); + const BrowserCdm::SessionCreatedCB& session_created_cb, + const BrowserCdm::SessionMessageCB& session_message_cb, + const BrowserCdm::SessionReadyCB& session_ready_cb, + const BrowserCdm::SessionClosedCB& session_closed_cb, + const BrowserCdm::SessionErrorCB& session_error_cb); } // namespace media diff --git a/media/base/cdm_promise.cc b/media/base/cdm_promise.cc new file mode 100644 index 0000000..ec5e913 --- /dev/null +++ b/media/base/cdm_promise.cc @@ -0,0 +1,74 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/base/cdm_promise.h" + +#include "base/bind.h" +#include "base/logging.h" + +namespace media { + +CdmPromise::CdmPromise() : is_pending_(true) { +} + +CdmPromise::CdmPromise(PromiseRejectedCB reject_cb) + : reject_cb_(reject_cb), is_pending_(true) { + DCHECK(!reject_cb_.is_null()); +} + +CdmPromise::~CdmPromise() { + DCHECK(!is_pending_); +} + +void CdmPromise::reject(MediaKeys::Exception exception_code, + uint32 system_code, + const std::string& error_message) { + DCHECK(is_pending_); + is_pending_ = false; + reject_cb_.Run(exception_code, system_code, error_message); +} + +template <typename T> +CdmPromiseTemplate<T>::CdmPromiseTemplate( + base::Callback<void(const T&)> resolve_cb, + PromiseRejectedCB reject_cb) + : CdmPromise(reject_cb), resolve_cb_(resolve_cb) { + DCHECK(!resolve_cb_.is_null()); +} + +template <typename T> +CdmPromiseTemplate<T>::~CdmPromiseTemplate() { + DCHECK(!is_pending_); +} + +template <typename T> +void CdmPromiseTemplate<T>::resolve(const T& result) { + DCHECK(is_pending_); + is_pending_ = false; + resolve_cb_.Run(result); +} + +CdmPromiseTemplate<void>::CdmPromiseTemplate(base::Callback<void()> resolve_cb, + PromiseRejectedCB reject_cb) + : CdmPromise(reject_cb), resolve_cb_(resolve_cb) { + DCHECK(!resolve_cb_.is_null()); +} + +CdmPromiseTemplate<void>::CdmPromiseTemplate() { +} + +CdmPromiseTemplate<void>::~CdmPromiseTemplate() { + DCHECK(!is_pending_); +} + +void CdmPromiseTemplate<void>::resolve() { + DCHECK(is_pending_); + is_pending_ = false; + resolve_cb_.Run(); +} + +// Explicit template instantiation for the Promises needed. +template class MEDIA_EXPORT CdmPromiseTemplate<std::string>; + +} // namespace media diff --git a/media/base/cdm_promise.h b/media/base/cdm_promise.h new file mode 100644 index 0000000..ad1d196 --- /dev/null +++ b/media/base/cdm_promise.h @@ -0,0 +1,87 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_BASE_CDM_PROMISE_H_ +#define MEDIA_BASE_CDM_PROMISE_H_ + +#include <string> + +#include "base/basictypes.h" +#include "base/callback.h" +#include "media/base/media_export.h" +#include "media/base/media_keys.h" + +namespace media { + +// Interface for promises being resolved/rejected in response to various +// session actions. These may be called synchronously or asynchronously. +// The promise must be resolved or rejected exactly once. It is expected that +// the caller free the promise once it is resolved/rejected. +// +// This is only the base class, as parameter to resolve() varies. +class MEDIA_EXPORT CdmPromise { + public: + typedef base::Callback<void(MediaKeys::Exception exception_code, + uint32 system_code, + const std::string& error_message)> + PromiseRejectedCB; + + virtual ~CdmPromise(); + + // Used to indicate that the operation failed. |exception_code| must be + // specified. |system_code| is a Key System-specific value for the error + // that occurred, or 0 if there is no associated status code or such status + // codes are not supported by the Key System. |error_message| is optional. + virtual void reject(MediaKeys::Exception exception_code, + uint32 system_code, + const std::string& error_message); + + protected: + CdmPromise(); + CdmPromise(PromiseRejectedCB reject_cb); + + PromiseRejectedCB reject_cb_; + + // Keep track of whether the promise hasn't been resolved or rejected yet. + bool is_pending_; + + DISALLOW_COPY_AND_ASSIGN(CdmPromise); +}; + +template <typename T> +class MEDIA_EXPORT CdmPromiseTemplate : public CdmPromise { + public: + CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb, + PromiseRejectedCB rejected_cb); + virtual ~CdmPromiseTemplate(); + virtual void resolve(const T& result); + + private: + base::Callback<void(const T&)> resolve_cb_; + + DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate); +}; + +// Specialization for no parameter to resolve(). +template <> +class MEDIA_EXPORT CdmPromiseTemplate<void> : public CdmPromise { + public: + CdmPromiseTemplate(base::Callback<void(void)> resolve_cb, + PromiseRejectedCB rejected_cb); + virtual ~CdmPromiseTemplate(); + virtual void resolve(); + + protected: + // Allow subclasses to completely override the implementation. + CdmPromiseTemplate(); + + private: + base::Callback<void(void)> resolve_cb_; + + DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate); +}; + +} // namespace media + +#endif // MEDIA_BASE_CDM_PROMISE_H_ diff --git a/media/base/media_keys.h b/media/base/media_keys.h index 3166063..d581ae4 100644 --- a/media/base/media_keys.h +++ b/media/base/media_keys.h @@ -18,6 +18,12 @@ namespace media { class Decryptor; +template <typename T> +class CdmPromiseTemplate; + +typedef CdmPromiseTemplate<std::string> NewSessionCdmPromise; +typedef CdmPromiseTemplate<void> SimpleCdmPromise; + // Performs media key operations. // // All key operations are called on the renderer thread. Therefore, these calls @@ -27,6 +33,8 @@ class MEDIA_EXPORT MediaKeys { // Reported to UMA, so never reuse a value! // Must be kept in sync with blink::WebMediaPlayerClient::MediaKeyErrorCode // (enforced in webmediaplayer_impl.cc). + // TODO(jrummell): Can this be moved to proxy_decryptor as it should only be + // used by the prefixed EME code? enum KeyError { kUnknownError = 1, kClientError, @@ -38,35 +46,55 @@ class MEDIA_EXPORT MediaKeys { kMaxKeyError // Must be last and greater than any legit value. }; + // Must be a superset of cdm::MediaKeyException. + enum Exception { + NOT_SUPPORTED_ERROR, + INVALID_STATE_ERROR, + INVALID_ACCESS_ERROR, + QUOTA_EXCEEDED_ERROR, + UNKNOWN_ERROR, + CLIENT_ERROR, + OUTPUT_ERROR + }; + + // Type of license required when creating/loading a session. + // Must be consistent with the values specified in the spec: + // https://dvcs.w3.org/hg/html-media/raw-file/default/encrypted-media/encrypted-media.html#extensions + enum SessionType { + TEMPORARY_SESSION, + PERSISTENT_SESSION + }; + const static uint32 kInvalidSessionId = 0; MediaKeys(); virtual ~MediaKeys(); - // Creates a session with the |content_type| and |init_data| provided. - // Returns true if a session is successfully created, false otherwise. + // Creates a session with the |init_data_type|, |init_data| and |session_type| + // provided. // Note: UpdateSession() and ReleaseSession() should only be called after - // SessionCreatedCB is fired. - // TODO(jrummell): Remove return value when prefixed API is removed. - // See http://crbug.com/342510 - virtual bool CreateSession(uint32 session_id, - const std::string& content_type, + // |promise| is resolved. + virtual void CreateSession(const std::string& init_data_type, const uint8* init_data, - int init_data_length) = 0; + int init_data_length, + SessionType session_type, + scoped_ptr<NewSessionCdmPromise> promise) = 0; // Loads a session with the |web_session_id| provided. // Note: UpdateSession() and ReleaseSession() should only be called after - // SessionCreatedCB is fired. - virtual void LoadSession(uint32 session_id, - const std::string& web_session_id) = 0; + // |promise| is resolved. + virtual void LoadSession(const std::string& web_session_id, + scoped_ptr<NewSessionCdmPromise> promise) = 0; - // Updates a session specified by |session_id| with |response|. - virtual void UpdateSession(uint32 session_id, + // Updates a session specified by |web_session_id| with |response|. + virtual void UpdateSession(const std::string& web_session_id, const uint8* response, - int response_length) = 0; + int response_length, + scoped_ptr<SimpleCdmPromise> promise) = 0; - // Releases the session specified by |session_id|. - virtual void ReleaseSession(uint32 session_id) = 0; + // Releases the session specified by |web_session_id|. + virtual void ReleaseSession(const std::string& web_session_id, + scoped_ptr<SimpleCdmPromise> promise) = 0; // Gets the Decryptor object associated with the MediaKeys. Returns NULL if // no Decryptor object is associated. The returned object is only guaranteed @@ -79,21 +107,18 @@ class MEDIA_EXPORT MediaKeys { // Key event callbacks. See the spec for details: // https://dvcs.w3.org/hg/html-media/raw-file/default/encrypted-media/encrypted-media.html#event-summary -typedef base::Callback< - void(uint32 session_id, const std::string& web_session_id)> - SessionCreatedCB; - -typedef base::Callback<void(uint32 session_id, +typedef base::Callback<void(const std::string& web_session_id, const std::vector<uint8>& message, const GURL& destination_url)> SessionMessageCB; -typedef base::Callback<void(uint32 session_id)> SessionReadyCB; +typedef base::Callback<void(const std::string& web_session_id)> SessionReadyCB; -typedef base::Callback<void(uint32 session_id)> SessionClosedCB; +typedef base::Callback<void(const std::string& web_session_id)> SessionClosedCB; -typedef base::Callback<void(uint32 session_id, - media::MediaKeys::KeyError error_code, - uint32 system_code)> SessionErrorCB; +typedef base::Callback<void(const std::string& web_session_id, + MediaKeys::Exception exception_code, + uint32 system_code, + const std::string& error_message)> SessionErrorCB; } // namespace media |