Index: media/base/android/media_drm_bridge.h |
diff --git a/media/base/android/media_drm_bridge.h b/media/base/android/media_drm_bridge.h |
index 20da617a001b03a914357a7b0570737d554edaf0..5566739ff90d48e0172ed3ccc4d5401c524f8e9b 100644 |
--- a/media/base/android/media_drm_bridge.h |
+++ b/media/base/android/media_drm_bridge.h |
@@ -13,6 +13,7 @@ |
#include "base/callback.h" |
#include "base/memory/scoped_ptr.h" |
#include "media/base/browser_cdm.h" |
+#include "media/base/cdm_promise_adapter.h" |
#include "media/base/media_export.h" |
#include "media/cdm/player_tracker_impl.h" |
#include "url/gurl.h" |
@@ -24,7 +25,6 @@ namespace media { |
class MediaPlayerManager; |
// This class provides DRM services for android EME implementation. |
-// TODO(qinmin): implement all the functions in this class. |
class MEDIA_EXPORT MediaDrmBridge : public BrowserCdm { |
public: |
enum SecurityLevel { |
@@ -64,18 +64,19 @@ class MEDIA_EXPORT MediaDrmBridge : public BrowserCdm { |
// Returns a MediaDrmBridge instance if |key_system| is supported, or a NULL |
// pointer otherwise. |
+ // TODO(xhwang): Is it okay not to update session expiration info? |
static scoped_ptr<MediaDrmBridge> Create( |
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 SessionErrorCB& session_error_cb, |
+ const SessionKeysChangeCB& session_keys_change_cb, |
+ const SessionExpirationUpdateCB& session_expiration_update_cb); |
// Returns a MediaDrmBridge instance if |key_system| is supported, or a NULL |
// otherwise. No session callbacks are provided. This is used when we need to |
// use MediaDrmBridge without creating any sessions. |
- static scoped_ptr<MediaDrmBridge> CreateSessionless( |
+ static scoped_ptr<MediaDrmBridge> CreateWithoutSessionSupport( |
const std::string& key_system); |
// Returns true if |security_level| is successfully set, or false otherwise. |
@@ -87,20 +88,34 @@ class MEDIA_EXPORT MediaDrmBridge : public BrowserCdm { |
// object. Calling this function multiples times may cause errors. |
bool SetSecurityLevel(SecurityLevel security_level); |
- // BrowserCdm implementations. |
- virtual bool CreateSession(uint32 session_id, |
- const std::string& content_type, |
- const uint8* init_data, |
- int init_data_length) override; |
- virtual void LoadSession(uint32 session_id, |
- const std::string& web_session_id) override; |
- virtual void UpdateSession(uint32 session_id, |
- const uint8* response, |
- int response_length) override; |
- virtual void ReleaseSession(uint32 session_id) override; |
- virtual int RegisterPlayer(const base::Closure& new_key_cb, |
- const base::Closure& cdm_unset_cb) override; |
- virtual void UnregisterPlayer(int registration_id) override; |
+ // MediaKeys (via BrowserCdm) implementation. |
+ void SetServerCertificate( |
+ const uint8* certificate_data, |
+ int certificate_data_length, |
+ scoped_ptr<media::SimpleCdmPromise> promise) override; |
+ void CreateSessionAndGenerateRequest( |
+ SessionType session_type, |
+ const std::string& init_data_type, |
+ const uint8* init_data, |
+ int init_data_length, |
+ scoped_ptr<media::NewSessionCdmPromise> promise) override; |
+ void LoadSession(SessionType session_type, |
+ const std::string& session_id, |
+ scoped_ptr<media::NewSessionCdmPromise> promise) override; |
+ void UpdateSession(const std::string& session_id, |
+ const uint8* response, |
+ int response_length, |
+ scoped_ptr<media::SimpleCdmPromise> promise) override; |
+ void CloseSession(const std::string& session_id, |
+ scoped_ptr<media::SimpleCdmPromise> promise) override; |
+ void RemoveSession(const std::string& session_id, |
+ scoped_ptr<media::SimpleCdmPromise> promise) override; |
+ CdmContext* GetCdmContext() override; |
+ |
+ // PlayerTracker (via BrowserCdm) implementation. |
+ int RegisterPlayer(const base::Closure& new_key_cb, |
+ const base::Closure& cdm_unset_cb) override; |
+ void UnregisterPlayer(int registration_id) override; |
// Returns a MediaCrypto object if it's already created. Returns a null object |
// otherwise. |
@@ -113,19 +128,51 @@ class MEDIA_EXPORT MediaDrmBridge : public BrowserCdm { |
// Called after a MediaCrypto object is created. |
void OnMediaCryptoReady(JNIEnv* env, jobject j_media_drm); |
- // Callbacks for firing session events. |
- void OnSessionCreated(JNIEnv* env, |
- jobject j_media_drm, |
- jint j_session_id, |
- jstring j_web_session_id); |
+ // Callbacks to resolve the promise for |promise_id|. |
+ void OnPromiseResolved(JNIEnv* env, jobject j_media_drm, jint j_promise_id); |
+ void OnPromiseResolvedWithSession(JNIEnv* env, |
+ jobject j_media_drm, |
+ jint j_promise_id, |
+ jbyteArray j_session_id); |
+ |
+ // Callback to reject the promise for |promise_id| with |error_message|. |
+ // Note: No |system_error| is available from MediaDrm. |
+ // TODO(xhwang): Implement Exception code. |
+ void OnPromiseRejected(JNIEnv* env, |
+ jobject j_media_drm, |
+ jint j_promise_id, |
+ jstring j_error_message); |
+ |
+ // Session event callbacks. |
+ // Note: Session expiration update is not supported by MediaDrm. |
+ |
void OnSessionMessage(JNIEnv* env, |
jobject j_media_drm, |
- jint j_session_id, |
+ jbyteArray j_session_id, |
jbyteArray j_message, |
- jstring j_destination_url); |
- void OnSessionReady(JNIEnv* env, jobject j_media_drm, jint j_session_id); |
- void OnSessionClosed(JNIEnv* env, jobject j_media_drm, jint j_session_id); |
- void OnSessionError(JNIEnv* env, jobject j_media_drm, jint j_session_id); |
+ jstring j_legacy_destination_url); |
+ void OnSessionClosed(JNIEnv* env, |
+ jobject j_media_drm, |
+ jbyteArray j_session_id); |
+ |
+ // Note: Key ID is not available in MediaDrm, so only a generic |j_key_status| |
+ // and |has_additional_usable_key| are returned. |
+ void OnSessionKeysChange(JNIEnv* env, |
+ jobject j_media_drm, |
+ jbyteArray j_session_id, |
+ bool has_additional_usable_key, |
+ jint j_key_status); |
+ |
+ // Called by the CDM when an error occurred in session |j_session_id| |
+ // unrelated to one of the MediaKeys calls that accept a |promise|. |
+ // Note: |
+ // - This method is only for supporting prefixed EME API. |
+ // - This method will be ignored by unprefixed EME. All errors reported |
+ // in this method should probably also be reported by one of other methods. |
+ void OnLegacySessionError(JNIEnv* env, |
+ jobject j_media_drm, |
+ jbyteArray j_session_id, |
+ jstring j_error_message); |
// Reset the device credentials. |
void ResetDeviceCredentials(const ResetCredentialsCB& callback); |
@@ -139,11 +186,10 @@ class MEDIA_EXPORT MediaDrmBridge : public BrowserCdm { |
private: |
MediaDrmBridge(const std::vector<uint8>& scheme_uuid, |
- 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 SessionErrorCB& session_error_cb, |
+ const SessionKeysChangeCB& session_keys_change_cb); |
// Get the security level of the media. |
SecurityLevel GetSecurityLevel(); |
@@ -155,11 +201,10 @@ class MEDIA_EXPORT MediaDrmBridge : public BrowserCdm { |
base::android::ScopedJavaGlobalRef<jobject> j_media_drm_; |
// Callbacks for firing session events. |
- SessionCreatedCB session_created_cb_; |
SessionMessageCB session_message_cb_; |
- SessionReadyCB session_ready_cb_; |
SessionClosedCB session_closed_cb_; |
SessionErrorCB session_error_cb_; |
+ SessionKeysChangeCB session_keys_change_cb_; |
base::Closure media_crypto_ready_cb_; |
@@ -167,6 +212,8 @@ class MEDIA_EXPORT MediaDrmBridge : public BrowserCdm { |
PlayerTrackerImpl player_tracker_; |
+ CdmPromiseAdapter cdm_promise_adapter_; |
+ |
DISALLOW_COPY_AND_ASSIGN(MediaDrmBridge); |
}; |