diff options
| -rw-r--r-- | include/ndk/NdkMediaDrm.h | 44 | ||||
| -rw-r--r-- | media/ndk/NdkMediaDrm.cpp | 163 | 
2 files changed, 123 insertions, 84 deletions
diff --git a/include/ndk/NdkMediaDrm.h b/include/ndk/NdkMediaDrm.h index 04c371c..964e56f 100644 --- a/include/ndk/NdkMediaDrm.h +++ b/include/ndk/NdkMediaDrm.h @@ -77,7 +77,7 @@ typedef enum AMediaDrmEventType {      EVENT_VENDOR_DEFINED = 4  } AMediaDrmEventType; -typedef void (*AMediaDrmEventListener)(AMediaDrm *, const AMediaDrmSessionId &sessionId, +typedef void (*AMediaDrmEventListener)(AMediaDrm *, const AMediaDrmSessionId *sessionId,          AMediaDrmEventType eventType, int extra, const uint8_t *data, size_t dataSize); @@ -115,13 +115,13 @@ media_status_t AMediaDrm_setOnEventListener(AMediaDrm *, AMediaDrmEventListener   * returns MEDIADRM_NOT_PROVISIONED_ERROR if provisioning is needed   * returns MEDIADRM_RESOURCE_BUSY_ERROR if required resources are in use   */ -media_status_t AMediaDrm_openSession(AMediaDrm *, AMediaDrmSessionId &sessionId); +media_status_t AMediaDrm_openSession(AMediaDrm *, AMediaDrmSessionId *sessionId);  /**   * Close a session on the MediaDrm object that was previously opened   * with AMediaDrm_openSession.   */ -media_status_t AMediaDrm_closeSession(AMediaDrm *, const AMediaDrmSessionId &sessionId); +media_status_t AMediaDrm_closeSession(AMediaDrm *, const AMediaDrmSessionId *sessionId);  typedef enum AMediaDrmKeyType {      /** @@ -198,10 +198,10 @@ typedef struct AMediaDrmKeyValuePair {   * returns MEDIADRM_NOT_PROVISIONED_ERROR if reprovisioning is needed, due to a   * problem with the device certificate.  */ -media_status_t AMediaDrm_getKeyRequest(AMediaDrm *, const AMediaDrmScope &scope, +media_status_t AMediaDrm_getKeyRequest(AMediaDrm *, const AMediaDrmScope *scope,          const uint8_t *init, size_t initSize, const char *mimeType, AMediaDrmKeyType keyType,          const AMediaDrmKeyValue *optionalParameters, size_t numOptionalParameters, -        const uint8_t *&keyRequest, size_t &keyRequestSize); +        const uint8_t **keyRequest, size_t *keyRequestSize);  /**   * A key response is received from the license server by the app, then it is @@ -220,8 +220,8 @@ media_status_t AMediaDrm_getKeyRequest(AMediaDrm *, const AMediaDrmScope &scope,   * responseSize should be set to the size of the response in bytes   */ -media_status_t AMediaDrm_provideKeyResponse(AMediaDrm *, const AMediaDrmScope &scope, -        const uint8_t *response, size_t responseSize, AMediaDrmKeySetId &keySetId); +media_status_t AMediaDrm_provideKeyResponse(AMediaDrm *, const AMediaDrmScope *scope, +        const uint8_t *response, size_t responseSize, AMediaDrmKeySetId *keySetId);  /**   * Restore persisted offline keys into a new session.  keySetId identifies the @@ -230,15 +230,15 @@ media_status_t AMediaDrm_provideKeyResponse(AMediaDrm *, const AMediaDrmScope &s   * sessionId is the session ID for the DRM session   * keySetId identifies the saved key set to restore   */ -media_status_t AMediaDrm_restoreKeys(AMediaDrm *, const AMediaDrmSessionId &sessionId, -        const AMediaDrmKeySetId &keySetId); +media_status_t AMediaDrm_restoreKeys(AMediaDrm *, const AMediaDrmSessionId *sessionId, +        const AMediaDrmKeySetId *keySetId);  /**   * Remove the current keys from a session.   *   * keySetId identifies keys to remove   */ -media_status_t AMediaDrm_removeKeys(AMediaDrm *, const AMediaDrmSessionId &keySetId); +media_status_t AMediaDrm_removeKeys(AMediaDrm *, const AMediaDrmSessionId *keySetId);  /**   * Request an informative description of the key status for the session.  The status is @@ -253,8 +253,8 @@ media_status_t AMediaDrm_removeKeys(AMediaDrm *, const AMediaDrmSessionId &keySe   * to be returned is greater than *numPairs, MEDIADRM_SHORT_BUFFER will be returned   * and numPairs will be set to the number of pairs available.   */ -media_status_t AMediaDrm_queryKeyStatus(AMediaDrm *, const AMediaDrmSessionId &sessionId, -        AMediaDrmKeyValue *keyValuePairs, size_t &numPairs); +media_status_t AMediaDrm_queryKeyStatus(AMediaDrm *, const AMediaDrmSessionId *sessionId, +        AMediaDrmKeyValue *keyValuePairs, size_t *numPairs);  /** @@ -272,8 +272,8 @@ media_status_t AMediaDrm_queryKeyStatus(AMediaDrm *, const AMediaDrmSessionId &s   *       the provisioning request should be sent to.  It will remain accessible until   *       the next call to getProvisionRequest.   */ -media_status_t AMediaDrm_getProvisionRequest(AMediaDrm *, const uint8_t *&provisionRequest, -        size_t &provisionRequestSize, const char *&serverUrl); +media_status_t AMediaDrm_getProvisionRequest(AMediaDrm *, const uint8_t **provisionRequest, +        size_t *provisionRequestSize, const char **serverUrl);  /** @@ -313,7 +313,7 @@ media_status_t AMediaDrm_provideProvisionResponse(AMediaDrm *,   * number required.   */  media_status_t AMediaDrm_getSecureStops(AMediaDrm *, -        AMediaDrmSecureStop *secureStops, size_t &numSecureStops); +        AMediaDrmSecureStop *secureStops, size_t *numSecureStops);  /**   * Process the SecureStop server response message ssRelease.  After authenticating @@ -322,7 +322,7 @@ media_status_t AMediaDrm_getSecureStops(AMediaDrm *,   * ssRelease is the server response indicating which secure stops to release   */  media_status_t AMediaDrm_releaseSecureStops(AMediaDrm *, -        const AMediaDrmSecureStop &ssRelease); +        const AMediaDrmSecureStop *ssRelease);  /**   * String property name: identifies the maker of the DRM engine plugin @@ -355,7 +355,7 @@ const char *PROPERTY_ALGORITHMS = "algorithms";   * will remain valid until the next call to AMediaDrm_getPropertyString.   */  media_status_t AMediaDrm_getPropertyString(AMediaDrm *, const char *propertyName, -        const char *&propertyValue); +        const char **propertyValue);  /**   * Byte array property name: the device unique identifier is established during @@ -370,7 +370,7 @@ const char *PROPERTY_DEVICE_UNIQUE_ID = "deviceUniqueId";   * will remain valid until the next call to AMediaDrm_getPropertyByteArray.   */  media_status_t AMediaDrm_getPropertyByteArray(AMediaDrm *, const char *propertyName, -        AMediaDrmByteArray &propertyValue); +        AMediaDrmByteArray *propertyValue);  /**   * Set a DRM engine plugin String property value. @@ -409,7 +409,7 @@ media_status_t AMediaDrm_setPropertyByteArray(AMediaDrm *, const char *propertyN   * to use is identified by the 16 byte keyId.  The key must have been loaded into   * the session using provideKeyResponse.   */ -media_status_t AMediaDrm_encrypt(AMediaDrm *, const AMediaDrmSessionId &sessionId, +media_status_t AMediaDrm_encrypt(AMediaDrm *, const AMediaDrmSessionId *sessionId,          const char *cipherAlgorithm, uint8_t *keyId, uint8_t *iv,          const uint8_t *input, uint8_t *output, size_t dataSize); @@ -420,7 +420,7 @@ media_status_t AMediaDrm_encrypt(AMediaDrm *, const AMediaDrmSessionId &sessionI   * to use is identified by the 16 byte keyId.  The key must have been loaded into   * the session using provideKeyResponse.   */ -media_status_t AMediaDrm_decrypt(AMediaDrm *, const AMediaDrmSessionId &sessionId, +media_status_t AMediaDrm_decrypt(AMediaDrm *, const AMediaDrmSessionId *sessionId,          const char *cipherAlgorithm, uint8_t *keyId, uint8_t *iv,          const uint8_t *input, uint8_t *output, size_t dataSize); @@ -433,7 +433,7 @@ media_status_t AMediaDrm_decrypt(AMediaDrm *, const AMediaDrmSessionId &sessionI   * by the 16 byte keyId.  The key must have been loaded into the session using   * provideKeyResponse.   */ -media_status_t AMediaDrm_sign(AMediaDrm *, const AMediaDrmSessionId &sessionId, +media_status_t AMediaDrm_sign(AMediaDrm *, const AMediaDrmSessionId *sessionId,          const char *macAlgorithm, uint8_t *keyId, uint8_t *message, size_t messageSize,          uint8_t *signature, size_t *signatureSize); @@ -444,7 +444,7 @@ media_status_t AMediaDrm_sign(AMediaDrm *, const AMediaDrmSessionId &sessionId,   * use is identified by the 16 byte keyId.  The key must have been loaded into the   * session using provideKeyResponse.   */ -media_status_t AMediaDrm_verify(AMediaDrm *, const AMediaDrmSessionId &sessionId, +media_status_t AMediaDrm_verify(AMediaDrm *, const AMediaDrmSessionId *sessionId,          const char *macAlgorithm, uint8_t *keyId, const uint8_t *message, size_t messageSize,          const uint8_t *signature, size_t signatureSize); diff --git a/media/ndk/NdkMediaDrm.cpp b/media/ndk/NdkMediaDrm.cpp index f982275..a0cbb70 100644 --- a/media/ndk/NdkMediaDrm.cpp +++ b/media/ndk/NdkMediaDrm.cpp @@ -101,7 +101,7 @@ void DrmListener::notify(DrmPlugin::EventType eventType, int extra, const Parcel              return;      } -    (*mListener)(mObj, sessionId, ndkEventType, extra, data, dataSize); +    (*mListener)(mObj, &sessionId, ndkEventType, extra, data, dataSize);      delete [] sessionId.ptr;      delete [] data; @@ -236,29 +236,35 @@ static bool findId(AMediaDrm *mObj, const AMediaDrmByteArray &id, List<idvec_t>:  }  EXPORT -media_status_t AMediaDrm_openSession(AMediaDrm *mObj, AMediaDrmSessionId &sessionId) { +media_status_t AMediaDrm_openSession(AMediaDrm *mObj, AMediaDrmSessionId *sessionId) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } +    if (!sessionId) { +        return AMEDIA_ERROR_INVALID_PARAMETER; +    }      Vector<uint8_t> session;      status_t status = mObj->mDrm->openSession(session);      if (status == OK) {          mObj->mIds.push_front(session);          List<idvec_t>::iterator iter = mObj->mIds.begin(); -        sessionId.ptr = iter->array(); -        sessionId.length = iter->size(); +        sessionId->ptr = iter->array(); +        sessionId->length = iter->size();      }      return AMEDIA_OK;  }  EXPORT -media_status_t AMediaDrm_closeSession(AMediaDrm *mObj, const AMediaDrmSessionId &sessionId) { +media_status_t AMediaDrm_closeSession(AMediaDrm *mObj, const AMediaDrmSessionId *sessionId) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } +    if (!sessionId) { +        return AMEDIA_ERROR_INVALID_PARAMETER; +    }      List<idvec_t>::iterator iter; -    if (!findId(mObj, sessionId, iter)) { +    if (!findId(mObj, *sessionId, iter)) {          return AMEDIA_DRM_SESSION_NOT_OPENED;      }      mObj->mDrm->closeSession(*iter); @@ -267,20 +273,20 @@ media_status_t AMediaDrm_closeSession(AMediaDrm *mObj, const AMediaDrmSessionId  }  EXPORT -media_status_t AMediaDrm_getKeyRequest(AMediaDrm *mObj, const AMediaDrmScope &scope, +media_status_t AMediaDrm_getKeyRequest(AMediaDrm *mObj, const AMediaDrmScope *scope,          const uint8_t *init, size_t initSize, const char *mimeType, AMediaDrmKeyType keyType,          const AMediaDrmKeyValue *optionalParameters, size_t numOptionalParameters, -        const uint8_t *&keyRequest, size_t &keyRequestSize) { +        const uint8_t **keyRequest, size_t *keyRequestSize) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } -    if (!mimeType) { +    if (!mimeType || !scope || !keyRequest || !keyRequestSize) {          return AMEDIA_ERROR_INVALID_PARAMETER;      }      List<idvec_t>::iterator iter; -    if (!findId(mObj, scope, iter)) { +    if (!findId(mObj, *scope, iter)) {          return AMEDIA_DRM_SESSION_NOT_OPENED;      } @@ -311,25 +317,25 @@ media_status_t AMediaDrm_getKeyRequest(AMediaDrm *mObj, const AMediaDrmScope &sc      if (status != OK) {          return translateStatus(status);      } else { -        keyRequest = mObj->mKeyRequest.array(); -        keyRequestSize = mObj->mKeyRequest.size(); +        *keyRequest = mObj->mKeyRequest.array(); +        *keyRequestSize = mObj->mKeyRequest.size();      }      return AMEDIA_OK;  }  EXPORT -media_status_t AMediaDrm_provideKeyResponse(AMediaDrm *mObj, const AMediaDrmScope &scope, -        const uint8_t *response, size_t responseSize, AMediaDrmKeySetId &keySetId) { +media_status_t AMediaDrm_provideKeyResponse(AMediaDrm *mObj, const AMediaDrmScope *scope, +        const uint8_t *response, size_t responseSize, AMediaDrmKeySetId *keySetId) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } -    if (!response || !responseSize) { +    if (!scope || !response || !responseSize || !keySetId) {          return AMEDIA_ERROR_INVALID_PARAMETER;      }      List<idvec_t>::iterator iter; -    if (!findId(mObj, scope, iter)) { +    if (!findId(mObj, *scope, iter)) {          return AMEDIA_DRM_SESSION_NOT_OPENED;      }      Vector<uint8_t> mdResponse; @@ -340,41 +346,47 @@ media_status_t AMediaDrm_provideKeyResponse(AMediaDrm *mObj, const AMediaDrmScop      if (status == OK) {          mObj->mIds.push_front(mdKeySetId);          List<idvec_t>::iterator iter = mObj->mIds.begin(); -        keySetId.ptr = iter->array(); -        keySetId.length = iter->size(); +        keySetId->ptr = iter->array(); +        keySetId->length = iter->size();      } else { -        keySetId.ptr = NULL; -        keySetId.length = 0; +        keySetId->ptr = NULL; +        keySetId->length = 0;      }      return AMEDIA_OK;  }  EXPORT -media_status_t AMediaDrm_restoreKeys(AMediaDrm *mObj, const AMediaDrmSessionId &sessionId, -        const AMediaDrmKeySetId &keySetId) { +media_status_t AMediaDrm_restoreKeys(AMediaDrm *mObj, const AMediaDrmSessionId *sessionId, +        const AMediaDrmKeySetId *keySetId) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } +    if (!sessionId || !keySetId) { +        return AMEDIA_ERROR_INVALID_PARAMETER; +    }      List<idvec_t>::iterator iter; -    if (!findId(mObj, sessionId, iter)) { +    if (!findId(mObj, *sessionId, iter)) {          return AMEDIA_DRM_SESSION_NOT_OPENED;      }      Vector<uint8_t> keySet; -    keySet.appendArray(keySetId.ptr, keySetId.length); +    keySet.appendArray(keySetId->ptr, keySetId->length);      return translateStatus(mObj->mDrm->restoreKeys(*iter, keySet));  }  EXPORT -media_status_t AMediaDrm_removeKeys(AMediaDrm *mObj, const AMediaDrmSessionId &keySetId) { +media_status_t AMediaDrm_removeKeys(AMediaDrm *mObj, const AMediaDrmSessionId *keySetId) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } +    if (!keySetId) { +        return AMEDIA_ERROR_INVALID_PARAMETER; +    }      List<idvec_t>::iterator iter;      status_t status; -    if (!findId(mObj, keySetId, iter)) { +    if (!findId(mObj, *keySetId, iter)) {          Vector<uint8_t> keySet; -        keySet.appendArray(keySetId.ptr, keySetId.length); +        keySet.appendArray(keySetId->ptr, keySetId->length);          status = mObj->mDrm->removeKeys(keySet);      } else {          status = mObj->mDrm->removeKeys(*iter); @@ -384,25 +396,28 @@ media_status_t AMediaDrm_removeKeys(AMediaDrm *mObj, const AMediaDrmSessionId &k  }  EXPORT -media_status_t AMediaDrm_queryKeyStatus(AMediaDrm *mObj, const AMediaDrmSessionId &sessionId, -        AMediaDrmKeyValue *keyValuePairs, size_t &numPairs) { +media_status_t AMediaDrm_queryKeyStatus(AMediaDrm *mObj, const AMediaDrmSessionId *sessionId, +        AMediaDrmKeyValue *keyValuePairs, size_t *numPairs) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } +    if (!sessionId || !numPairs) { +        return AMEDIA_ERROR_INVALID_PARAMETER; +    }      List<idvec_t>::iterator iter; -    if (!findId(mObj, sessionId, iter)) { +    if (!findId(mObj, *sessionId, iter)) {          return AMEDIA_DRM_SESSION_NOT_OPENED;      }      status_t status = mObj->mDrm->queryKeyStatus(*iter, mObj->mQueryResults);      if (status != OK) { -        numPairs = 0; +        *numPairs = 0;          return translateStatus(status);      } -    if (mObj->mQueryResults.size() > numPairs) { -        numPairs = mObj->mQueryResults.size(); +    if (mObj->mQueryResults.size() > *numPairs) { +        *numPairs = mObj->mQueryResults.size();          return AMEDIA_DRM_SHORT_BUFFER;      } @@ -410,17 +425,17 @@ media_status_t AMediaDrm_queryKeyStatus(AMediaDrm *mObj, const AMediaDrmSessionI          keyValuePairs[i].mKey = mObj->mQueryResults.keyAt(i).string();          keyValuePairs[i].mValue = mObj->mQueryResults.keyAt(i).string();      } -    numPairs = mObj->mQueryResults.size(); +    *numPairs = mObj->mQueryResults.size();      return AMEDIA_OK;  }  EXPORT -media_status_t AMediaDrm_getProvisionRequest(AMediaDrm *mObj, const uint8_t *&provisionRequest, -        size_t &provisionRequestSize, const char *&serverUrl) { +media_status_t AMediaDrm_getProvisionRequest(AMediaDrm *mObj, const uint8_t **provisionRequest, +        size_t *provisionRequestSize, const char **serverUrl) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } -    if (!provisionRequestSize || !serverUrl) { +    if (!provisionRequest || !provisionRequestSize || !*provisionRequestSize || !serverUrl) {          return AMEDIA_ERROR_INVALID_PARAMETER;      } @@ -429,9 +444,9 @@ media_status_t AMediaDrm_getProvisionRequest(AMediaDrm *mObj, const uint8_t *&pr      if (status != OK) {          return translateStatus(status);      } else { -        provisionRequest = mObj->mProvisionRequest.array(); -        provisionRequestSize = mObj->mProvisionRequest.size(); -        serverUrl = mObj->mProvisionUrl.string(); +        *provisionRequest = mObj->mProvisionRequest.array(); +        *provisionRequestSize = mObj->mProvisionRequest.size(); +        *serverUrl = mObj->mProvisionUrl.string();      }      return AMEDIA_OK;  } @@ -455,17 +470,20 @@ media_status_t AMediaDrm_provideProvisionResponse(AMediaDrm *mObj,  EXPORT  media_status_t AMediaDrm_getSecureStops(AMediaDrm *mObj, -        AMediaDrmSecureStop *secureStops, size_t &numSecureStops) { +        AMediaDrmSecureStop *secureStops, size_t *numSecureStops) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } +    if (!numSecureStops) { +        return AMEDIA_ERROR_INVALID_PARAMETER; +    }      status_t status = mObj->mDrm->getSecureStops(mObj->mSecureStops);      if (status != OK) { -        numSecureStops = 0; +        *numSecureStops = 0;          return translateStatus(status);      } -    if (numSecureStops < mObj->mSecureStops.size()) { +    if (*numSecureStops < mObj->mSecureStops.size()) {          return AMEDIA_DRM_SHORT_BUFFER;      }      List<Vector<uint8_t> >::iterator iter = mObj->mSecureStops.begin(); @@ -476,59 +494,68 @@ media_status_t AMediaDrm_getSecureStops(AMediaDrm *mObj,          ++iter;          ++i;      } -    numSecureStops = mObj->mSecureStops.size(); +    *numSecureStops = mObj->mSecureStops.size();      return AMEDIA_OK;  }  EXPORT  media_status_t AMediaDrm_releaseSecureStops(AMediaDrm *mObj, -        const AMediaDrmSecureStop &ssRelease) { +        const AMediaDrmSecureStop *ssRelease) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } +    if (!ssRelease) { +        return AMEDIA_ERROR_INVALID_PARAMETER; +    }      Vector<uint8_t> release; -    release.appendArray(ssRelease.ptr, ssRelease.length); +    release.appendArray(ssRelease->ptr, ssRelease->length);      return translateStatus(mObj->mDrm->releaseSecureStops(release));  }  EXPORT  media_status_t AMediaDrm_getPropertyString(AMediaDrm *mObj, const char *propertyName, -        const char *&propertyValue) { +        const char **propertyValue) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } +    if (!propertyName || !propertyValue) { +        return AMEDIA_ERROR_INVALID_PARAMETER; +    }      status_t status = mObj->mDrm->getPropertyString(String8(propertyName),              mObj->mPropertyString);      if (status == OK) { -        propertyValue = mObj->mPropertyString.string(); +        *propertyValue = mObj->mPropertyString.string();      } else { -        propertyValue = NULL; +        *propertyValue = NULL;      }      return translateStatus(status);  }  EXPORT  media_status_t AMediaDrm_getPropertyByteArray(AMediaDrm *mObj, -        const char *propertyName, AMediaDrmByteArray &propertyValue) { +        const char *propertyName, AMediaDrmByteArray *propertyValue) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } +    if (!propertyName || !propertyValue) { +        return AMEDIA_ERROR_INVALID_PARAMETER; +    }      status_t status = mObj->mDrm->getPropertyByteArray(String8(propertyName),              mObj->mPropertyByteArray);      if (status == OK) { -        propertyValue.ptr = mObj->mPropertyByteArray.array(); -        propertyValue.length = mObj->mPropertyByteArray.size(); +        propertyValue->ptr = mObj->mPropertyByteArray.array(); +        propertyValue->length = mObj->mPropertyByteArray.size();      } else { -        propertyValue.ptr = NULL; -        propertyValue.length = 0; +        propertyValue->ptr = NULL; +        propertyValue->length = 0;      }      return translateStatus(status);  } @@ -598,31 +625,40 @@ static media_status_t encrypt_decrypt_common(AMediaDrm *mObj,  }  EXPORT -media_status_t AMediaDrm_encrypt(AMediaDrm *mObj, const AMediaDrmSessionId &sessionId, +media_status_t AMediaDrm_encrypt(AMediaDrm *mObj, const AMediaDrmSessionId *sessionId,          const char *cipherAlgorithm, uint8_t *keyId, uint8_t *iv,          const uint8_t *input, uint8_t *output, size_t dataSize) { -    return encrypt_decrypt_common(mObj, sessionId, cipherAlgorithm, keyId, iv, +    if (!sessionId) { +        return AMEDIA_ERROR_INVALID_PARAMETER; +    } +    return encrypt_decrypt_common(mObj, *sessionId, cipherAlgorithm, keyId, iv,              input, output, dataSize, true);  }  EXPORT -media_status_t AMediaDrm_decrypt(AMediaDrm *mObj, const AMediaDrmSessionId &sessionId, +media_status_t AMediaDrm_decrypt(AMediaDrm *mObj, const AMediaDrmSessionId *sessionId,          const char *cipherAlgorithm, uint8_t *keyId, uint8_t *iv,          const uint8_t *input, uint8_t *output, size_t dataSize) { -    return encrypt_decrypt_common(mObj, sessionId, cipherAlgorithm, keyId, iv, +    if (!sessionId) { +        return AMEDIA_ERROR_INVALID_PARAMETER; +    } +    return encrypt_decrypt_common(mObj, *sessionId, cipherAlgorithm, keyId, iv,              input, output, dataSize, false);  }  EXPORT -media_status_t AMediaDrm_sign(AMediaDrm *mObj, const AMediaDrmSessionId &sessionId, +media_status_t AMediaDrm_sign(AMediaDrm *mObj, const AMediaDrmSessionId *sessionId,          const char *macAlgorithm, uint8_t *keyId, uint8_t *message, size_t messageSize,          uint8_t *signature, size_t *signatureSize) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } +    if (!sessionId) { +        return AMEDIA_ERROR_INVALID_PARAMETER; +    }      List<idvec_t>::iterator iter; -    if (!findId(mObj, sessionId, iter)) { +    if (!findId(mObj, *sessionId, iter)) {          return AMEDIA_DRM_SESSION_NOT_OPENED;      } @@ -650,15 +686,18 @@ media_status_t AMediaDrm_sign(AMediaDrm *mObj, const AMediaDrmSessionId &session  }  EXPORT -media_status_t AMediaDrm_verify(AMediaDrm *mObj, const AMediaDrmSessionId &sessionId, +media_status_t AMediaDrm_verify(AMediaDrm *mObj, const AMediaDrmSessionId *sessionId,          const char *macAlgorithm, uint8_t *keyId, const uint8_t *message, size_t messageSize,          const uint8_t *signature, size_t signatureSize) {      if (!mObj || mObj->mDrm == NULL) {          return AMEDIA_ERROR_INVALID_OBJECT;      } +    if (!sessionId) { +        return AMEDIA_ERROR_INVALID_PARAMETER; +    }      List<idvec_t>::iterator iter; -    if (!findId(mObj, sessionId, iter)) { +    if (!findId(mObj, *sessionId, iter)) {          return AMEDIA_DRM_SESSION_NOT_OPENED;      }  | 
