From efbb781c15abf8e085f5ab8d39710bd58ea0b6e4 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Tue, 18 Sep 2012 10:36:32 -0700 Subject: HDCP module binderized Change-Id: I866768b1e3f3b232f1934a35b65f66befc12f3f6 --- include/media/IMediaPlayerService.h | 2 ++ media/libmedia/IMediaPlayerService.cpp | 15 +++++++++++++++ media/libmediaplayerservice/Android.mk | 1 + media/libmediaplayerservice/HDCP.cpp | 18 ++++++++++++++++-- media/libmediaplayerservice/HDCP.h | 3 +++ media/libmediaplayerservice/MediaPlayerService.cpp | 5 +++++ media/libmediaplayerservice/MediaPlayerService.h | 1 + 7 files changed, 43 insertions(+), 2 deletions(-) diff --git a/include/media/IMediaPlayerService.h b/include/media/IMediaPlayerService.h index c4c37b6..6090176 100644 --- a/include/media/IMediaPlayerService.h +++ b/include/media/IMediaPlayerService.h @@ -32,6 +32,7 @@ namespace android { struct ICrypto; +struct IHDCP; class IMediaRecorder; class IOMX; class IRemoteDisplay; @@ -51,6 +52,7 @@ public: virtual sp decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat) = 0; virtual sp getOMX() = 0; virtual sp makeCrypto() = 0; + virtual sp makeHDCP() = 0; // Connects to a remote display. // 'iface' specifies the address of the local interface on which to listen for diff --git a/media/libmedia/IMediaPlayerService.cpp b/media/libmedia/IMediaPlayerService.cpp index c2ec439..c702d76 100644 --- a/media/libmedia/IMediaPlayerService.cpp +++ b/media/libmedia/IMediaPlayerService.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -41,6 +42,7 @@ enum { CREATE_METADATA_RETRIEVER, GET_OMX, MAKE_CRYPTO, + MAKE_HDCP, ENABLE_REMOTE_DISPLAY, ADD_BATTERY_DATA, PULL_BATTERY_DATA, @@ -125,6 +127,13 @@ public: return interface_cast(reply.readStrongBinder()); } + virtual sp makeHDCP() { + Parcel data, reply; + data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); + remote()->transact(MAKE_HDCP, data, &reply); + return interface_cast(reply.readStrongBinder()); + } + virtual status_t enableRemoteDisplay(const char *iface) { Parcel data, reply; data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); @@ -237,6 +246,12 @@ status_t BnMediaPlayerService::onTransact( reply->writeStrongBinder(crypto->asBinder()); return NO_ERROR; } break; + case MAKE_HDCP: { + CHECK_INTERFACE(IMediaPlayerService, data, reply); + sp hdcp = makeHDCP(); + reply->writeStrongBinder(hdcp->asBinder()); + return NO_ERROR; + } break; case ENABLE_REMOTE_DISPLAY: { CHECK_INTERFACE(IMediaPlayerService, data, reply); const char *iface = NULL; diff --git a/media/libmediaplayerservice/Android.mk b/media/libmediaplayerservice/Android.mk index c7227b0..5b5ed71 100644 --- a/media/libmediaplayerservice/Android.mk +++ b/media/libmediaplayerservice/Android.mk @@ -9,6 +9,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ ActivityManager.cpp \ Crypto.cpp \ + HDCP.cpp \ MediaPlayerFactory.cpp \ MediaPlayerService.cpp \ MediaRecorderClient.cpp \ diff --git a/media/libmediaplayerservice/HDCP.cpp b/media/libmediaplayerservice/HDCP.cpp index 6f8a465..e7dea6e 100644 --- a/media/libmediaplayerservice/HDCP.cpp +++ b/media/libmediaplayerservice/HDCP.cpp @@ -36,13 +36,16 @@ HDCP::HDCP() return; } - typedef HDCPModule *(*CreateHDCPModuleFunc)(); + typedef HDCPModule *(*CreateHDCPModuleFunc)( + void *, HDCPModule::ObserverFunc); + CreateHDCPModuleFunc createHDCPModule = (CreateHDCPModuleFunc)dlsym(mLibHandle, "createHDCPModule"); if (createHDCPModule == NULL) { ALOGE("Unable to find symbol 'createHDCPModule'."); - } else if ((mHDCPModule = createHDCPModule()) == NULL) { + } else if ((mHDCPModule = createHDCPModule( + this, &HDCP::ObserveWrapper)) == NULL) { ALOGE("createHDCPModule failed."); } } @@ -97,5 +100,16 @@ status_t HDCP::encrypt( return mHDCPModule->encrypt(inData, size, streamCTR, outInputCTR, outData); } +// static +void HDCP::ObserveWrapper(void *me, int msg, int ext1, int ext2) { + static_cast(me)->observe(msg, ext1, ext2); +} + +void HDCP::observe(int msg, int ext1, int ext2) { + if (mObserver != NULL) { + mObserver->notify(msg, ext1, ext2, NULL /* obj */); + } +} + } // namespace android diff --git a/media/libmediaplayerservice/HDCP.h b/media/libmediaplayerservice/HDCP.h index 2e27689..4ee664d 100644 --- a/media/libmediaplayerservice/HDCP.h +++ b/media/libmediaplayerservice/HDCP.h @@ -39,6 +39,9 @@ private: HDCPModule *mHDCPModule; sp mObserver; + static void ObserveWrapper(void *me, int msg, int ext1, int ext2); + void observe(int msg, int ext1, int ext2); + DISALLOW_EVIL_CONSTRUCTORS(HDCP); }; diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 1be4edf..eaa44e2 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -72,6 +72,7 @@ #include #include "Crypto.h" +#include "HDCP.h" #include "RemoteDisplay.h" namespace { @@ -281,6 +282,10 @@ sp MediaPlayerService::makeCrypto() { return new Crypto; } +sp MediaPlayerService::makeHDCP() { + return new HDCP; +} + sp MediaPlayerService::listenForRemoteDisplay( const sp& client, const String8& iface) { if (!checkPermission("android.permission.CONTROL_WIFI_DISPLAY")) { diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index ca8a96f..6105ce4 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -250,6 +250,7 @@ public: virtual sp decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat); virtual sp getOMX(); virtual sp makeCrypto(); + virtual sp makeHDCP(); virtual sp listenForRemoteDisplay(const sp& client, const String8& iface); -- cgit v1.1