| Index: media/base/android/java/src/org/chromium/media/MediaDrmSessionManager.java
|
| diff --git a/media/base/android/java/src/org/chromium/media/MediaDrmSessionManager.java b/media/base/android/java/src/org/chromium/media/MediaDrmSessionManager.java
|
| index 42e6675bd4f98fe5a60845aa0c56c645421f34c4..8bf38f5e19abcec6806e618a4020231a32a21fc7 100644
|
| --- a/media/base/android/java/src/org/chromium/media/MediaDrmSessionManager.java
|
| +++ b/media/base/android/java/src/org/chromium/media/MediaDrmSessionManager.java
|
| @@ -87,6 +87,13 @@ class MediaDrmSessionManager {
|
| return new SessionId(drmId, drmId, null /* keySetId */);
|
| }
|
|
|
| + /**
|
| + * Create session ID used to report session doesn't exist.
|
| + */
|
| + static SessionId createNoExistSessionId() {
|
| + return createTemporarySessionId(new byte[0]);
|
| + }
|
| +
|
| private SessionId(byte[] emeId, byte[] drmId, byte[] keySetId) {
|
| assert emeId != null;
|
| assert drmId != null || keySetId != null;
|
| @@ -165,6 +172,16 @@ class MediaDrmSessionManager {
|
|
|
| return new PersistentInfo(mSessionId.emeId(), mSessionId.keySetId(), mMimeType);
|
| }
|
| +
|
| + private static SessionInfo fromPersistentInfo(PersistentInfo persistentInfo) {
|
| + assert persistentInfo != null;
|
| + assert persistentInfo.emeId() != null;
|
| + assert persistentInfo.keySetId() != null;
|
| +
|
| + SessionId sessionId = new SessionId(
|
| + persistentInfo.emeId(), null /* drmId */, persistentInfo.keySetId());
|
| + return new SessionInfo(sessionId, persistentInfo.mimeType(), MediaDrm.KEY_TYPE_OFFLINE);
|
| + }
|
| }
|
|
|
| // Maps from DRM/EME session ID to SessionInfo. SessionInfo contains
|
| @@ -189,6 +206,20 @@ class MediaDrmSessionManager {
|
| }
|
|
|
| /**
|
| + * Set drm ID. It should only be called for persistent license session
|
| + * without an opened drm session.
|
| + */
|
| + void setDrmId(SessionId sessionId, byte[] drmId) {
|
| + SessionInfo info = get(sessionId);
|
| +
|
| + assert info != null;
|
| + assert info.sessionId().isEqual(sessionId);
|
| +
|
| + sessionId.setDrmId(drmId);
|
| + mDrmSessionInfoMap.put(ByteBuffer.wrap(drmId), info);
|
| + }
|
| +
|
| + /**
|
| * Set key set ID. It should only be called for persistent license session.
|
| */
|
| void setKeySetId(SessionId sessionId, byte[] keySetId, Callback<Boolean> callback) {
|
| @@ -202,6 +233,50 @@ class MediaDrmSessionManager {
|
| }
|
|
|
| /**
|
| + * Mark key as released. It should only be called for persistent license
|
| + * session.
|
| + */
|
| + void markKeyReleased(SessionId sessionId) {
|
| + SessionInfo info = get(sessionId);
|
| +
|
| + assert info != null;
|
| + assert info.keyType() == MediaDrm.KEY_TYPE_OFFLINE;
|
| +
|
| + info.setKeyType(MediaDrm.KEY_TYPE_RELEASE);
|
| + }
|
| +
|
| + /**
|
| + * Load |emeId|'s session data from persistent storage.
|
| + */
|
| + void load(byte[] emeId, final Callback<SessionId> callback) {
|
| + mStorage.loadInfo(emeId, new Callback<PersistentInfo>() {
|
| + @Override
|
| + public void onResult(PersistentInfo persistentInfo) {
|
| + if (persistentInfo == null) {
|
| + callback.onResult(null);
|
| + return;
|
| + }
|
| +
|
| + // Loading same persistent license into different sessions isn't
|
| + // supported.
|
| + assert getSessionIdByEmeId(persistentInfo.emeId()) == null;
|
| +
|
| + SessionInfo info = SessionInfo.fromPersistentInfo(persistentInfo);
|
| + mEmeSessionInfoMap.put(ByteBuffer.wrap(persistentInfo.emeId()), info);
|
| + callback.onResult(info.sessionId());
|
| + }
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * Remove persistent license info from persistent storage.
|
| + */
|
| + void clearPersistentSessionInfo(SessionId sessionId, Callback<Boolean> callback) {
|
| + sessionId.setKeySetId(null);
|
| + mStorage.clearInfo(sessionId.emeId(), callback);
|
| + }
|
| +
|
| + /**
|
| * Remove session and related infomration from memory, but doesn't touch
|
| * persistent storage.
|
| */
|
|
|