@ -72,12 +72,27 @@ public:
mKeysChangeListener = listener ;
}
void notify ( DrmPlugin : : EventType eventType , int extra , const Parcel * obj ) ;
void sendEvent (
DrmPlugin : : EventType eventType ,
const hardware : : hidl_vec < uint8_t > & sessionId ,
const hardware : : hidl_vec < uint8_t > & data ) override ;
void sendExpirationUpdate (
const hardware : : hidl_vec < uint8_t > & sessionId ,
int64_t expiryTimeInMS ) override ;
void sendKeysChange (
const hardware : : hidl_vec < uint8_t > & sessionId ,
const std : : vector < DrmKeyStatus > & keyStatusList ,
bool hasNewUsableKey ) override ;
void sendSessionLostState (
const hardware : : hidl_vec < uint8_t > & ) override { }
} ;
struct AMediaDrm {
sp < IDrm > mDrm ;
sp < IDrmClient > mDrmClient ;
List < idvec_t > mIds ;
KeyedVector < String8 , String8 > mQueryResults ;
Vector < uint8_t > mKeyRequest ;
@ -89,71 +104,52 @@ struct AMediaDrm {
sp < DrmListener > mListener ;
} ;
void DrmListener : : notify ( DrmPlugin : : EventType eventType , int extra , const Parcel * obj ) {
if ( ! mEventListener | | ! mExpirationUpdateListener | | ! mKeysChangeListener ) {
ALOGE ( " No listeners are specified " ) ;
void DrmListener : : sendExpirationUpdate (
const hardware : : hidl_vec < uint8_t > & sessionId ,
int64_t expiryTimeInMS ) {
if ( ! mExpirationUpdateListener ) {
ALOGE ( " No ExpirationUpdateListener specified " ) ;
return ;
}
obj - > setDataPosition ( 0 ) ;
AMediaDrmSessionId sessionId = { NULL , 0 } ;
int32_t sessionIdSize = obj - > readInt32 ( ) ;
if ( sessionIdSize < = 0 ) {
ALOGE ( " Invalid session id size " ) ;
return ;
if ( expiryTimeInMS > = 0 ) {
AMediaDrmSessionId asid = { sessionId . data ( ) , sessionId . size ( ) } ;
( * mExpirationUpdateListener ) ( mObj , & asid , expiryTimeInMS ) ;
} else {
ALOGE ( " expiry time negative, status=% " PRId64 " " , expiryTimeInMS ) ;
}
}
std : : unique_ptr < uint8_t [ ] > sessionIdData ( new uint8_t [ sessionIdSize ] ) ;
sessionId . ptr = sessionIdData . get ( ) ;
sessionId . length = sessionIdSize ;
status_t err = obj - > read ( sessionIdData . get ( ) , sessionId . length ) ;
if ( err ! = OK ) {
ALOGE ( " Failed to read session id, error=%d" , err ) ;
void DrmListener : : sendKeysChange (
const hardware : : hidl_vec < uint8_t > & sessionId ,
const std : : vector < DrmKeyStatus > & keyStatusList ,
bool hasNewUsableKey ) {
if ( ! mKeysChangeListener ) {
ALOGE ( " No KeysChangeListener specified" ) ;
return ;
}
if ( DrmPlugin : : kDrmPluginEventExpirationUpdate = = eventType ) {
int64_t expiryTimeInMS = obj - > readInt64 ( ) ;
if ( expiryTimeInMS > = 0 ) {
( * mExpirationUpdateListener ) ( mObj , & sessionId , expiryTimeInMS ) ;
} else {
ALOGE ( " Failed to read expiry time, status=% " PRId64 " " , expiryTimeInMS ) ;
}
return ;
} else if ( DrmPlugin : : kDrmPluginEventKeysChange = = eventType ) {
int32_t numKeys = 0 ;
err = obj - > readInt32 ( & numKeys ) ;
if ( err ! = OK ) {
ALOGE ( " Failed to read number of keys status, error=%d " , err ) ;
return ;
}
Vector < AMediaDrmKeyStatus > keysStatus ;
std : : vector < std : : unique_ptr < uint8_t [ ] > > dataPointers ;
Vector < AMediaDrmKeyStatus > keysStatus ;
for ( const auto & drmKeyStatus : keyStatusList ) {
AMediaDrmKeyStatus keyStatus ;
keyStatus . keyId . ptr = drmKeyStatus . keyId . data ( ) ;
keyStatus . keyId . length = drmKeyStatus . keyId . size ( ) ;
keyStatus . keyType = static_cast < AMediaDrmKeyStatusType > ( drmKeyStatus . type ) ;
keysStatus . push ( keyStatus ) ;
}
for ( size_t i = 0 ; i < numKeys ; + + i ) {
keyStatus . keyId . ptr = nullptr ;
keyStatus . keyId . length = 0 ;
int32_t idSize = obj - > readInt32 ( ) ;
if ( idSize > 0 ) {
std : : unique_ptr < uint8_t [ ] > data ( new uint8_t [ idSize ] ) ;
err = obj - > read ( data . get ( ) , idSize ) ;
if ( err ! = OK ) {
ALOGE ( " Failed to read key data, error=%d " , err ) ;
return ;
}
keyStatus . keyId . ptr = data . get ( ) ;
keyStatus . keyId . length = idSize ;
dataPointers . push_back ( std : : move ( data ) ) ;
}
keyStatus . keyType = static_cast < AMediaDrmKeyStatusType > ( obj - > readInt32 ( ) ) ;
keysStatus . push ( keyStatus ) ;
}
AMediaDrmSessionId asid = { sessionId . data ( ) , sessionId . size ( ) } ;
int32_t numKeys = keyStatusList . size ( ) ;
( * mKeysChangeListener ) ( mObj , & asid , keysStatus . array ( ) , numKeys , hasNewUsableKey ) ;
return ;
}
bool hasNewUsableKey = obj - > readInt32 ( ) ;
( * mKeysChangeListener ) ( mObj , & sessionId , keysStatus . array ( ) , numKeys , hasNewUsableKey ) ;
void DrmListener : : sendEvent (
DrmPlugin : : EventType eventType ,
const hardware : : hidl_vec < uint8_t > & sessionId ,
const hardware : : hidl_vec < uint8_t > & data ) {
if ( ! mEventListener ) {
ALOGE ( " No EventListener specified " ) ;
return ;
}
@ -177,23 +173,17 @@ void DrmListener::notify(DrmPlugin::EventType eventType, int extra, const Parcel
ndkEventType = EVENT_SESSION_RECLAIMED ;
break ;
default :
ALOGE ( " Invalid event DrmPlugin::EventType %d, ignored " , ( int ) eventType ) ;
ALOGE ( " Invalid event DrmPlugin::EventType %d, ignored " , eventType ) ;
return ;
}
int32_t dataSize = obj - > readInt32 ( ) ;
uint8_t * data = NULL ;
AMediaDrmSessionId asid = { sessionId . data ( ) , sessionId . size ( ) } ;
int32_t dataSize = data . size ( ) ;
const uint8_t * dataPtr = data . data ( ) ;
if ( dataSize > 0 ) {
data = new uint8_t [ dataSize ] ;
err = obj - > read ( data , dataSize ) ;
if ( err = = OK ) {
( * mEventListener ) ( mObj , & sessionId , ndkEventType , extra , data , dataSize ) ;
} else {
ALOGE ( " Failed to read event data, error=%d " , err ) ;
}
delete [ ] data ;
( * mEventListener ) ( mObj , & asid , ndkEventType , 0 , dataPtr , dataSize ) ;
} else {
ALOGE ( " Error reading parcel: invalid event data size=%d" , dataSize ) ;
ALOGE ( " invalid event data size=%d " , dataSize ) ;
}
}