From 3305b99ec3804c740aecd2ab6d1edd5c6137b7c6 Mon Sep 17 00:00:00 2001 From: Jeff Tinker Date: Wed, 14 May 2014 18:39:25 -0700 Subject: Hook up event handling in NDK MediaDrm API Change-Id: I48ac1d3ca5405c5909454c7a553917b31b9a50e5 --- media/ndk/NdkMediaDrm.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 5 deletions(-) (limited to 'media/ndk') diff --git a/media/ndk/NdkMediaDrm.cpp b/media/ndk/NdkMediaDrm.cpp index 5e50418..4967f42 100644 --- a/media/ndk/NdkMediaDrm.cpp +++ b/media/ndk/NdkMediaDrm.cpp @@ -35,10 +35,20 @@ using namespace android; typedef Vector idvec_t; +struct DrmListener: virtual public BnDrmClient +{ +private: + AMediaDrm *mObj; + AMediaDrmEventListener mListener; + +public: + DrmListener(AMediaDrm *obj, AMediaDrmEventListener listener) : mObj(obj), mListener(listener) {} + void notify(DrmPlugin::EventType eventType, int extra, const Parcel *obj); +}; + struct AMediaDrm { sp mDrm; sp mDrmClient; - AMediaDrmEventListener mListener; List mIds; KeyedVector mQueryResults; Vector mKeyRequest; @@ -47,8 +57,57 @@ struct AMediaDrm { String8 mPropertyString; Vector mPropertyByteArray; List > mSecureStops; + sp mListener; }; +void DrmListener::notify(DrmPlugin::EventType eventType, int extra, const Parcel *obj) { + if (!mListener) { + return; + } + + AMediaDrmSessionId sessionId = {NULL, 0}; + int32_t sessionIdSize = obj->readInt32(); + if (sessionIdSize) { + uint8_t *sessionIdData = new uint8_t[sessionIdSize]; + sessionId.ptr = sessionIdData; + sessionId.length = sessionIdSize; + obj->read(sessionIdData, sessionId.length); + } + + int32_t dataSize = obj->readInt32(); + uint8_t *data = NULL; + if (dataSize) { + data = new uint8_t[dataSize]; + obj->read(data, dataSize); + } + + // translate DrmPlugin event types into their NDK equivalents + AMediaDrmEventType ndkEventType; + switch(eventType) { + case DrmPlugin::kDrmPluginEventProvisionRequired: + ndkEventType = EVENT_PROVISION_REQUIRED; + break; + case DrmPlugin::kDrmPluginEventKeyNeeded: + ndkEventType = EVENT_KEY_REQUIRED; + break; + case DrmPlugin::kDrmPluginEventKeyExpired: + ndkEventType = EVENT_KEY_EXPIRED; + break; + case DrmPlugin::kDrmPluginEventVendorDefined: + ndkEventType = EVENT_VENDOR_DEFINED; + break; + default: + ALOGE("Invalid event DrmPlugin::EventType %d, ignored", (int)eventType); + return; + } + + (*mListener)(mObj, sessionId, ndkEventType, extra, data, dataSize); + + delete [] sessionId.ptr; + delete [] data; +} + + extern "C" { static mediadrm_status_t translateStatus(status_t status) { @@ -156,11 +215,15 @@ void AMediaDrm_release(AMediaDrm *mObj) { delete mObj; } -#if 0 -void AMediaDrm_setOnEventListener(AMediaDrm *mObj, AMediaDrmEventListener listener) { - mObj->mListener = listener; +EXPORT +mediadrm_status_t AMediaDrm_setOnEventListener(AMediaDrm *mObj, AMediaDrmEventListener listener) { + if (!mObj || mObj->mDrm == NULL) { + return MEDIADRM_INVALID_OBJECT_ERROR; + } + mObj->mListener = new DrmListener(mObj, listener); + mObj->mDrm->setListener(mObj->mListener); + return MEDIADRM_OK; } -#endif static bool findId(AMediaDrm *mObj, const AMediaDrmByteArray &id, List::iterator &iter) { -- cgit v1.1