Loading media/ndk/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,7 @@ cc_library_shared { "android.hardware.graphics.bufferqueue@1.0", "android.hidl.token@1.0-utils", "libandroid_runtime_lazy", "libbase", "libbinder", "libmedia", "libmedia_omx", Loading media/ndk/NdkMediaDrm.cpp +46 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #define LOG_TAG "NdkMediaDrm" #include <inttypes.h> #include <unistd.h> #include <media/NdkMediaDrm.h> Loading @@ -26,6 +27,8 @@ #include <utils/StrongPointer.h> #include <gui/Surface.h> #include <android-base/properties.h> #include <binder/PermissionController.h> #include <media/IDrm.h> #include <media/IDrmClient.h> #include <media/stagefright/MediaErrors.h> Loading Loading @@ -231,6 +234,39 @@ static media_status_t translateStatus(status_t status) { return result; } static bool ShouldGetAppPackageName(void) { // Check what this device's first API level was. int32_t firstApiLevel = android::base::GetIntProperty<int32_t>("ro.product.first_api_level", 0); if (firstApiLevel == 0) { // First API Level is 0 on factory ROMs, but we can assume the current SDK // version is the first if it's a factory ROM. firstApiLevel = android::base::GetIntProperty<int32_t>("ro.build.version.sdk", 0); } return firstApiLevel >= 29; // Android Q } static status_t GetAppPackageName(String8 *packageName) { sp<IServiceManager> serviceManager = defaultServiceManager(); sp<IBinder> binder = serviceManager->getService(String16("permission")); sp<IPermissionController> permissionContol = interface_cast<IPermissionController>(binder); if (permissionContol == NULL) { ALOGE("Failed to get permission service"); return UNKNOWN_ERROR; } Vector<String16> packages; permissionContol->getPackagesForUid(getuid(), packages); if (packages.isEmpty()) { ALOGE("Unable to get package name for current UID"); return UNKNOWN_ERROR; } *packageName = String8(packages[0]); return OK; } static sp<IDrm> CreateDrm() { sp<IServiceManager> sm = defaultServiceManager(); sp<IBinder> binder = sm->getService(String16("media.drm")); Loading @@ -255,8 +291,16 @@ static sp<IDrm> CreateDrmFromUUID(const AMediaUUID uuid) { return NULL; } String8 nullPackageName; status_t err = drm->createPlugin(uuid, nullPackageName); String8 packageName; if (ShouldGetAppPackageName()) { status_t err = GetAppPackageName(&packageName); if (err != OK) { return NULL; } } status_t err = drm->createPlugin(uuid, packageName); if (err != OK) { return NULL; Loading Loading
media/ndk/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,7 @@ cc_library_shared { "android.hardware.graphics.bufferqueue@1.0", "android.hidl.token@1.0-utils", "libandroid_runtime_lazy", "libbase", "libbinder", "libmedia", "libmedia_omx", Loading
media/ndk/NdkMediaDrm.cpp +46 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #define LOG_TAG "NdkMediaDrm" #include <inttypes.h> #include <unistd.h> #include <media/NdkMediaDrm.h> Loading @@ -26,6 +27,8 @@ #include <utils/StrongPointer.h> #include <gui/Surface.h> #include <android-base/properties.h> #include <binder/PermissionController.h> #include <media/IDrm.h> #include <media/IDrmClient.h> #include <media/stagefright/MediaErrors.h> Loading Loading @@ -231,6 +234,39 @@ static media_status_t translateStatus(status_t status) { return result; } static bool ShouldGetAppPackageName(void) { // Check what this device's first API level was. int32_t firstApiLevel = android::base::GetIntProperty<int32_t>("ro.product.first_api_level", 0); if (firstApiLevel == 0) { // First API Level is 0 on factory ROMs, but we can assume the current SDK // version is the first if it's a factory ROM. firstApiLevel = android::base::GetIntProperty<int32_t>("ro.build.version.sdk", 0); } return firstApiLevel >= 29; // Android Q } static status_t GetAppPackageName(String8 *packageName) { sp<IServiceManager> serviceManager = defaultServiceManager(); sp<IBinder> binder = serviceManager->getService(String16("permission")); sp<IPermissionController> permissionContol = interface_cast<IPermissionController>(binder); if (permissionContol == NULL) { ALOGE("Failed to get permission service"); return UNKNOWN_ERROR; } Vector<String16> packages; permissionContol->getPackagesForUid(getuid(), packages); if (packages.isEmpty()) { ALOGE("Unable to get package name for current UID"); return UNKNOWN_ERROR; } *packageName = String8(packages[0]); return OK; } static sp<IDrm> CreateDrm() { sp<IServiceManager> sm = defaultServiceManager(); sp<IBinder> binder = sm->getService(String16("media.drm")); Loading @@ -255,8 +291,16 @@ static sp<IDrm> CreateDrmFromUUID(const AMediaUUID uuid) { return NULL; } String8 nullPackageName; status_t err = drm->createPlugin(uuid, nullPackageName); String8 packageName; if (ShouldGetAppPackageName()) { status_t err = GetAppPackageName(&packageName); if (err != OK) { return NULL; } } status_t err = drm->createPlugin(uuid, packageName); if (err != OK) { return NULL; Loading