Add a new API on DRM Framework for streaming

In case of DRM streaming, decrypt session can start just after
receiving the header, and it doesn't need to wait for the entire
content. However, current API of DRM framework only accepts file
handle or URI. With this new API, DRM session can start
without waiting for the entire content.

Changes are made by SEMC and Sony.

Change-Id: I74375fe127df636067f1c300ea91654ba3d1aa3c
This commit is contained in:
Kei Takahashi
2012-01-18 17:10:19 +09:00
committed by Jean-Baptiste Queru
parent cf0bf78c28
commit cba7b32d8f
13 changed files with 172 additions and 0 deletions

View File

@@ -139,6 +139,11 @@ status_t DrmEngineBase::openDecryptSession(
return onOpenDecryptSession(uniqueId, decryptHandle, uri, mime); return onOpenDecryptSession(uniqueId, decryptHandle, uri, mime);
} }
status_t DrmEngineBase::openDecryptSession(int uniqueId, DecryptHandle* decryptHandle,
const DrmBuffer& buf, const String8& mimeType) {
return onOpenDecryptSession(uniqueId, decryptHandle, buf, mimeType);
}
status_t DrmEngineBase::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { status_t DrmEngineBase::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
return onCloseDecryptSession(uniqueId, decryptHandle); return onCloseDecryptSession(uniqueId, decryptHandle);
} }

View File

@@ -652,6 +652,33 @@ DecryptHandle* BpDrmManagerService::openDecryptSession(
return handle; return handle;
} }
DecryptHandle* BpDrmManagerService::openDecryptSession(
int uniqueId, const DrmBuffer& buf, const String8& mimeType) {
ALOGV("Entering BpDrmManagerService::openDecryptSession");
Parcel data, reply;
data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
data.writeInt32(uniqueId);
if (buf.data != NULL && buf.length > 0) {
data.writeInt32(buf.length);
data.write(buf.data, buf.length);
} else {
data.writeInt32(0);
}
data.writeString8(mimeType);
remote()->transact(OPEN_DECRYPT_SESSION_FOR_STREAMING, data, &reply);
DecryptHandle* handle = NULL;
if (0 != reply.dataAvail()) {
handle = new DecryptHandle();
readDecryptHandleFromParcelData(handle, reply);
} else {
ALOGV("no decryptHandle is generated in service side");
}
return handle;
}
status_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { status_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
ALOGV("closeDecryptSession"); ALOGV("closeDecryptSession");
Parcel data, reply; Parcel data, reply;
@@ -1312,6 +1339,30 @@ status_t BnDrmManagerService::onTransact(
return DRM_NO_ERROR; return DRM_NO_ERROR;
} }
case OPEN_DECRYPT_SESSION_FOR_STREAMING:
{
ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FOR_STREAMING");
CHECK_INTERFACE(IDrmManagerService, data, reply);
const int uniqueId = data.readInt32();
const int bufferSize = data.readInt32();
DrmBuffer buf((bufferSize > 0) ? (char *)data.readInplace(bufferSize) : NULL,
bufferSize);
const String8 mimeType(data.readString8());
DecryptHandle* handle = openDecryptSession(uniqueId, buf, mimeType);
if (handle != NULL) {
writeDecryptHandleToParcelData(handle, reply);
clearDecryptHandle(handle);
delete handle;
handle = NULL;
} else {
ALOGV("NULL decryptHandle is returned");
}
return DRM_NO_ERROR;
}
case CLOSE_DECRYPT_SESSION: case CLOSE_DECRYPT_SESSION:
{ {
ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION"); ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");

View File

@@ -484,6 +484,36 @@ DecryptHandle* DrmManager::openDecryptSession(
return handle; return handle;
} }
DecryptHandle* DrmManager::openDecryptSession(
int uniqueId, const DrmBuffer& buf, const String8& mimeType) {
Mutex::Autolock _l(mDecryptLock);
status_t result = DRM_ERROR_CANNOT_HANDLE;
Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList();
DecryptHandle* handle = new DecryptHandle();
if (NULL != handle) {
handle->decryptId = mDecryptSessionId + 1;
for (size_t index = 0; index < plugInIdList.size(); index++) {
String8 plugInId = plugInIdList.itemAt(index);
IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
result = rDrmEngine.openDecryptSession(uniqueId, handle, buf, mimeType);
if (DRM_NO_ERROR == result) {
++mDecryptSessionId;
mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine);
break;
}
}
}
if (DRM_NO_ERROR != result) {
delete handle;
handle = NULL;
ALOGV("DrmManager::openDecryptSession: no capable plug-in found");
}
return handle;
}
status_t DrmManager::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { status_t DrmManager::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
Mutex::Autolock _l(mDecryptLock); Mutex::Autolock _l(mDecryptLock);
status_t result = DRM_ERROR_UNKNOWN; status_t result = DRM_ERROR_UNKNOWN;

View File

@@ -219,6 +219,16 @@ DecryptHandle* DrmManagerService::openDecryptSession(
return NULL; return NULL;
} }
DecryptHandle* DrmManagerService::openDecryptSession(
int uniqueId, const DrmBuffer& buf, const String8& mimeType) {
ALOGV("Entering DrmManagerService::openDecryptSession for streaming");
if (isProtectedCallAllowed()) {
return mDrmManager->openDecryptSession(uniqueId, buf, mimeType);
}
return NULL;
}
status_t DrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { status_t DrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
ALOGV("Entering closeDecryptSession"); ALOGV("Entering closeDecryptSession");
if (!isProtectedCallAllowed()) { if (!isProtectedCallAllowed()) {

View File

@@ -130,6 +130,11 @@ sp<DecryptHandle> DrmManagerClient::openDecryptSession(
mUniqueId, uri, mime); mUniqueId, uri, mime);
} }
sp<DecryptHandle> DrmManagerClient::openDecryptSession(
const DrmBuffer& buf, const String8& mimeType) {
return mDrmManagerClientImpl->openDecryptSession(mUniqueId, buf, mimeType);
}
status_t DrmManagerClient::closeDecryptSession(sp<DecryptHandle> &decryptHandle) { status_t DrmManagerClient::closeDecryptSession(sp<DecryptHandle> &decryptHandle) {
return mDrmManagerClientImpl->closeDecryptSession(mUniqueId, decryptHandle); return mDrmManagerClientImpl->closeDecryptSession(mUniqueId, decryptHandle);
} }

View File

@@ -272,6 +272,11 @@ sp<DecryptHandle> DrmManagerClientImpl::openDecryptSession(
return handle; return handle;
} }
sp<DecryptHandle> DrmManagerClientImpl::openDecryptSession(
int uniqueId, const DrmBuffer& buf, const String8& mimeType) {
return getDrmManagerService()->openDecryptSession(uniqueId, buf, mimeType);
}
status_t DrmManagerClientImpl::closeDecryptSession( status_t DrmManagerClientImpl::closeDecryptSession(
int uniqueId, sp<DecryptHandle> &decryptHandle) { int uniqueId, sp<DecryptHandle> &decryptHandle) {
status_t status = DRM_ERROR_UNKNOWN; status_t status = DRM_ERROR_UNKNOWN;

View File

@@ -116,6 +116,9 @@ public:
DecryptHandle* openDecryptSession(int uniqueId, const char* uri, const char* mime); DecryptHandle* openDecryptSession(int uniqueId, const char* uri, const char* mime);
DecryptHandle* openDecryptSession(int uniqueId, const DrmBuffer& buf,
const String8& mimeType);
status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle);
status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle,

View File

@@ -319,6 +319,18 @@ public:
sp<DecryptHandle> openDecryptSession( sp<DecryptHandle> openDecryptSession(
int uniqueId, const char* uri, const char* mime); int uniqueId, const char* uri, const char* mime);
/**
* Open the decrypt session to decrypt the given protected content
*
* @param[in] uniqueId Unique identifier for a session
* @param[in] buf Data to initiate decrypt session
* @param[in] mimeType Mime type of the protected content
* @return
* Handle for the decryption session
*/
sp<DecryptHandle> openDecryptSession(int uniqueId, const DrmBuffer& buf,
const String8& mimeType);
/** /**
* Close the decrypt session for the given handle * Close the decrypt session for the given handle
* *

View File

@@ -104,6 +104,9 @@ public:
DecryptHandle* openDecryptSession( DecryptHandle* openDecryptSession(
int uniqueId, const char* uri, const char* mime); int uniqueId, const char* uri, const char* mime);
DecryptHandle* openDecryptSession(int uniqueId, const DrmBuffer& buf,
const String8& mimeType);
status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle);
status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle,

View File

@@ -70,6 +70,7 @@ public:
GET_ALL_SUPPORT_INFO, GET_ALL_SUPPORT_INFO,
OPEN_DECRYPT_SESSION, OPEN_DECRYPT_SESSION,
OPEN_DECRYPT_SESSION_FROM_URI, OPEN_DECRYPT_SESSION_FROM_URI,
OPEN_DECRYPT_SESSION_FOR_STREAMING,
CLOSE_DECRYPT_SESSION, CLOSE_DECRYPT_SESSION,
INITIALIZE_DECRYPT_UNIT, INITIALIZE_DECRYPT_UNIT,
DECRYPT, DECRYPT,
@@ -146,6 +147,9 @@ public:
virtual DecryptHandle* openDecryptSession( virtual DecryptHandle* openDecryptSession(
int uniqueId, const char* uri, const char* mime) = 0; int uniqueId, const char* uri, const char* mime) = 0;
virtual DecryptHandle* openDecryptSession(
int uniqueId, const DrmBuffer& buf, const String8& mimeType) = 0;
virtual status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) = 0; virtual status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) = 0;
virtual status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, virtual status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle,
@@ -232,6 +236,9 @@ public:
virtual DecryptHandle* openDecryptSession( virtual DecryptHandle* openDecryptSession(
int uniqueId, const char* uri, const char* mime); int uniqueId, const char* uri, const char* mime);
virtual DecryptHandle* openDecryptSession(
int uniqueId, const DrmBuffer& buf, const String8& mimeType);
virtual status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); virtual status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle);
virtual status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, virtual status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle,

View File

@@ -87,6 +87,9 @@ public:
int uniqueId, DecryptHandle* decryptHandle, int uniqueId, DecryptHandle* decryptHandle,
const char* uri, const char* mime); const char* uri, const char* mime);
status_t openDecryptSession(int uniqueId, DecryptHandle* decryptHandle,
const DrmBuffer& buf, const String8& mimeType);
status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle);
status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle,
@@ -432,6 +435,21 @@ protected:
return DRM_ERROR_CANNOT_HANDLE; return DRM_ERROR_CANNOT_HANDLE;
} }
/**
* Open the decrypt session to decrypt the given protected content
*
* @param[in] uniqueId Unique identifier for a session
* @param[in] decryptHandle Handle for the current decryption session
* @param[in] buf Data to initiate decrypt session
* @param[in] mimeType Mime type of the protected content
* @return
* DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success
*/
virtual status_t onOpenDecryptSession(int uniqueId, DecryptHandle* decryptHandle,
const DrmBuffer& buf, const String8& mimeType) {
return DRM_ERROR_CANNOT_HANDLE;
}
/** /**
* Close the decrypt session for the given handle * Close the decrypt session for the given handle
* *

View File

@@ -344,6 +344,19 @@ public:
int uniqueId, DecryptHandle* decryptHandle, int uniqueId, DecryptHandle* decryptHandle,
const char* uri, const char* mime) = 0; const char* uri, const char* mime) = 0;
/**
* Open the decrypt session to decrypt the given protected content
*
* @param[in] uniqueId Unique identifier for a session
* @param[in] decryptHandle Handle for the current decryption session
* @param[in] buf Data to initiate decrypt session
* @param[in] mimeType Mime type of the protected content
* @return
* DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success
*/
virtual status_t openDecryptSession(int uniqueId, DecryptHandle* decryptHandle,
const DrmBuffer& buf, const String8& mimeType) = 0;
/** /**
* Close the decrypt session for the given handle * Close the decrypt session for the given handle
* *

View File

@@ -82,6 +82,16 @@ public:
*/ */
sp<DecryptHandle> openDecryptSession(const char* uri, const char* mime); sp<DecryptHandle> openDecryptSession(const char* uri, const char* mime);
/**
* Open the decrypt session to decrypt the given protected content
*
* @param[in] buf Data to initiate decrypt session
* @param[in] mimeType Mime type of the protected content
* @return
* Handle for the decryption session
*/
sp<DecryptHandle> openDecryptSession(const DrmBuffer& buf, const String8& mimeType);
/** /**
* Close the decrypt session for the given handle * Close the decrypt session for the given handle
* *