summaryrefslogtreecommitdiffstats
path: root/media/base
diff options
context:
space:
mode:
Diffstat (limited to 'media/base')
-rw-r--r--media/base/android/browser_cdm_factory_android.cc10
-rw-r--r--media/base/android/media_player_android.cc1
-rw-r--r--media/base/browser_cdm.h22
-rw-r--r--media/base/browser_cdm_factory.h14
-rw-r--r--media/base/cdm_promise.cc74
-rw-r--r--media/base/cdm_promise.h87
-rw-r--r--media/base/media_keys.h77
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