diff options
author | Jeff Tinker <jtinker@google.com> | 2016-02-12 08:58:32 -0800 |
---|---|---|
committer | Jeff Tinker <jtinker@google.com> | 2016-02-12 20:23:45 -0800 |
commit | dc614f86a5a61d0b4287796dfa028c637f615d34 (patch) | |
tree | e8fd3df767296dd5e68cee5b1b1d1393ee5f845a /media/jni/android_media_MediaCrypto.cpp | |
parent | 6f1033104d178f8c03857770edf5568947f1af70 (diff) |
Add mediadrm service
Part of media security hardening
This is an intermediate step toward moving
mediadrm to a new service separate from mediaserver.
This first step allows mediadrmservice to run based
on the system property media.mediadrmservice.enable
so it can be selectively enabled on devices that
support using native_handles for secure buffers.
bug: 22990512
Change-Id: I9af073d8383f25657938d07be90c21c0dc6126b7
Diffstat (limited to 'media/jni/android_media_MediaCrypto.cpp')
-rw-r--r-- | media/jni/android_media_MediaCrypto.cpp | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/media/jni/android_media_MediaCrypto.cpp b/media/jni/android_media_MediaCrypto.cpp index e414f4838583..35da84ce82e5 100644 --- a/media/jni/android_media_MediaCrypto.cpp +++ b/media/jni/android_media_MediaCrypto.cpp @@ -25,7 +25,9 @@ #include "JNIHelp.h" #include <binder/IServiceManager.h> +#include <cutils/properties.h> #include <media/ICrypto.h> +#include <media/IMediaDrmService.h> #include <media/IMediaPlayerService.h> #include <media/stagefright/foundation/ADebug.h> @@ -61,19 +63,30 @@ JCrypto::~JCrypto() { // static sp<ICrypto> JCrypto::MakeCrypto() { sp<IServiceManager> sm = defaultServiceManager(); - - sp<IBinder> binder = - sm->getService(String16("media.player")); - - sp<IMediaPlayerService> service = - interface_cast<IMediaPlayerService>(binder); - - if (service == NULL) { - return NULL; + sp<ICrypto> crypto; + + char value[PROPERTY_VALUE_MAX]; + if (property_get("media.mediadrmservice.enable", value, NULL) + && (!strcmp("1", value) || !strcasecmp("true", value))) { + sp<IBinder> binder = + sm->getService(String16("media.drm")); + sp<IMediaDrmService> service = + interface_cast<IMediaDrmService>(binder); + if (service == NULL) { + return NULL; + } + crypto = service->makeCrypto(); + } else { + sp<IBinder> binder = + sm->getService(String16("media.player")); + sp<IMediaPlayerService> service = + interface_cast<IMediaPlayerService>(binder); + if (service == NULL) { + return NULL; + } + crypto = service->makeCrypto(); } - sp<ICrypto> crypto = service->makeCrypto(); - if (crypto == NULL || (crypto->initCheck() != OK && crypto->initCheck() != NO_INIT)) { return NULL; } |