From a6fc4d3f7a7f32695e019688fea9d176e982d778 Mon Sep 17 00:00:00 2001 From: Henry Fang Date: Thu, 17 Jan 2019 17:50:36 -0800 Subject: [PATCH] Update plugin to use cas@1.1 hal Implement sendSessionEvent and onSessionEvent in ClearKeyCasPlugin and MockCasPlugin Test: manual Bug: 122472761 Change-Id: Iceb3e14f35cf3178b70e43b59fd492255ab205bc --- .../plugins/clearkey/ClearKeyCasPlugin.cpp | 42 ++++++++++++++++++- .../plugins/clearkey/ClearKeyCasPlugin.h | 11 +++++ drm/mediacas/plugins/mock/MockCasPlugin.cpp | 23 ++++++++++ drm/mediacas/plugins/mock/MockCasPlugin.h | 11 ++++- 4 files changed, 84 insertions(+), 3 deletions(-) diff --git a/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.cpp b/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.cpp index 1558e8b8da..27bd631afe 100644 --- a/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.cpp +++ b/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.cpp @@ -65,7 +65,20 @@ status_t ClearKeyCasFactory::createPlugin( *plugin = new ClearKeyCasPlugin(appData, callback); return OK; } -/////////////////////////////////////////////////////////////////////////////// + +status_t ClearKeyCasFactory::createPlugin( + int32_t CA_system_id, + void *appData, + CasPluginCallbackExt callback, + CasPlugin **plugin) { + if (!isSystemIdSupported(CA_system_id)) { + return BAD_VALUE; + } + + *plugin = new ClearKeyCasPlugin(appData, callback); + return OK; +} +//////////////////////////////////////////////////////////////////////////////// bool ClearKeyDescramblerFactory::isSystemIdSupported( int32_t CA_system_id) const { return CA_system_id == sClearKeySystemId; @@ -88,6 +101,12 @@ ClearKeyCasPlugin::ClearKeyCasPlugin( ALOGV("CTOR"); } +ClearKeyCasPlugin::ClearKeyCasPlugin( + void *appData, CasPluginCallbackExt callback) + : mCallbackExt(callback), mAppData(appData) { + ALOGV("CTOR"); +} + ClearKeyCasPlugin::~ClearKeyCasPlugin() { ALOGV("DTOR"); ClearKeySessionLibrary::get()->destroyPlugin(this); @@ -167,8 +186,27 @@ status_t ClearKeyCasPlugin::sendEvent( // Echo the received event to the callback. // Clear key plugin doesn't use any event, echo'ing for testing only. if (mCallback != NULL) { - mCallback((void*)mAppData, event, arg, (uint8_t*)eventData.data(), eventData.size()); + mCallback((void*)mAppData, event, arg, (uint8_t*)eventData.data(), + eventData.size()); + } else if (mCallbackExt != NULL) { + mCallbackExt((void*)mAppData, event, arg, (uint8_t*)eventData.data(), + eventData.size(), NULL); + } + return OK; +} + +status_t ClearKeyCasPlugin::sendSessionEvent( + const CasSessionId &sessionId, int32_t event, + int arg, const CasData &eventData) { + ALOGV("sendSessionEvent: sessionId=%s, event=%d, arg=%d", + sessionIdToString(sessionId).string(), event, arg); + // Echo the received event to the callback. + // Clear key plugin doesn't use any event, echo'ing for testing only. + if (mCallbackExt != NULL) { + mCallbackExt((void*)mAppData, event, arg, (uint8_t*)eventData.data(), + eventData.size(), &sessionId); } + return OK; } diff --git a/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.h b/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.h index 389e1728d7..f48d5b1d13 100644 --- a/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.h +++ b/drm/mediacas/plugins/clearkey/ClearKeyCasPlugin.h @@ -47,6 +47,11 @@ public: void *appData, CasPluginCallback callback, CasPlugin **plugin) override; + virtual status_t createPlugin( + int32_t CA_system_id, + void *appData, + CasPluginCallbackExt callback, + CasPlugin **plugin) override; }; class ClearKeyDescramblerFactory : public DescramblerFactory { @@ -63,6 +68,7 @@ public: class ClearKeyCasPlugin : public CasPlugin { public: ClearKeyCasPlugin(void *appData, CasPluginCallback callback); + ClearKeyCasPlugin(void *appData, CasPluginCallbackExt callback); virtual ~ClearKeyCasPlugin(); virtual status_t setPrivateData( @@ -85,6 +91,10 @@ public: virtual status_t sendEvent( int32_t event, int32_t arg, const CasData &eventData) override; + virtual status_t sendSessionEvent( + const CasSessionId &sessionId, + int32_t event, int32_t arg, const CasData &eventData) override; + virtual status_t provision(const String8 &str) override; virtual status_t refreshEntitlements( @@ -94,6 +104,7 @@ private: Mutex mKeyFetcherLock; std::unique_ptr mKeyFetcher; CasPluginCallback mCallback; + CasPluginCallbackExt mCallbackExt; void* mAppData; }; diff --git a/drm/mediacas/plugins/mock/MockCasPlugin.cpp b/drm/mediacas/plugins/mock/MockCasPlugin.cpp index 8404a83935..2964791413 100644 --- a/drm/mediacas/plugins/mock/MockCasPlugin.cpp +++ b/drm/mediacas/plugins/mock/MockCasPlugin.cpp @@ -60,6 +60,19 @@ status_t MockCasFactory::createPlugin( return OK; } +status_t MockCasFactory::createPlugin( + int32_t CA_system_id, + void* /*appData*/, + CasPluginCallbackExt /*callback*/, + CasPlugin **plugin) { + if (!isSystemIdSupported(CA_system_id)) { + return BAD_VALUE; + } + + *plugin = new MockCasPlugin(); + return OK; +} + /////////////////////////////////////////////////////////////////////////////// bool MockDescramblerFactory::isSystemIdSupported(int32_t CA_system_id) const { @@ -170,6 +183,16 @@ status_t MockCasPlugin::sendEvent( return OK; } +status_t MockCasPlugin::sendSessionEvent( + const CasSessionId &sessionId, int32_t event, + int /*arg*/, const CasData& /*eventData*/) { + ALOGV("sendSessionEvent: sessionId=%s, event=%d", + arrayToString(sessionId).string(), event); + Mutex::Autolock lock(mLock); + + return OK; +} + status_t MockCasPlugin::provision(const String8 &str) { ALOGV("provision: provisionString=%s", str.string()); Mutex::Autolock lock(mLock); diff --git a/drm/mediacas/plugins/mock/MockCasPlugin.h b/drm/mediacas/plugins/mock/MockCasPlugin.h index 81069906ed..74b540cc82 100644 --- a/drm/mediacas/plugins/mock/MockCasPlugin.h +++ b/drm/mediacas/plugins/mock/MockCasPlugin.h @@ -42,6 +42,11 @@ public: void *appData, CasPluginCallback callback, CasPlugin **plugin) override; + virtual status_t createPlugin( + int32_t CA_system_id, + void *appData, + CasPluginCallbackExt callback, + CasPlugin **plugin) override; }; class MockDescramblerFactory : public DescramblerFactory { @@ -80,7 +85,11 @@ public: virtual status_t sendEvent( int32_t event, int32_t arg, const CasData &eventData) override; - virtual status_t provision(const String8 &str) override; + virtual status_t sendSessionEvent( + const CasSessionId &sessionId, + int32_t event, int32_t arg, const CasData &eventData) override; + + virtual status_t provision(const String8 &str) override; virtual status_t refreshEntitlements( int32_t refreshType, const CasData &refreshData) override;