Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(247)

Unified Diff: media/base/android/media_drm_bridge.h

Issue 850183002: media: Support unprefixed EME API on Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase only Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
};

Powered by Google App Engine
This is Rietveld 408576698