Load sw C2 codecs from apex
bug: 111407413
test: crosshatch-userdebug builds, verified C2 sw codecs are used in image
decoding and audio playback;
CTS media heavy presubmit:https://atp.googleplex.com/test_runs/32791402 (failures are pre-existing)
Change-Id: I56f1a98d906ecb1b5b56e642b44eb394d58c9318
diff --git a/services/mediacodec/MediaCodecUpdateService.cpp b/services/mediacodec/MediaCodecUpdateService.cpp
index aee890d..0e6892d 100644
--- a/services/mediacodec/MediaCodecUpdateService.cpp
+++ b/services/mediacodec/MediaCodecUpdateService.cpp
@@ -18,14 +18,10 @@
//#define LOG_NDEBUG 0
#include <android/dlext.h>
-#include <android-base/logging.h>
-#include <android-base/strings.h>
-#include <dirent.h>
#include <dlfcn.h>
#include <media/CodecServiceRegistrant.h>
#include <utils/Log.h>
-#include <ziparchive/zip_archive.h>
-#include <cutils/properties.h>
+#include <utils/String8.h>
#include "MediaCodecUpdateService.h"
@@ -47,90 +43,53 @@
}
namespace android {
-namespace media {
-binder::Status MediaCodecUpdateService::loadPlugins(const ::std::string& apkPath) {
- ALOGV("loadPlugins %s", apkPath.c_str());
+void loadFromApex(const char *libDirPath) {
+ ALOGV("loadFromApex: path=%s", libDirPath);
- ZipArchiveHandle zipHandle;
- void *registrantLib = NULL;
- int32_t ret = OpenArchive(apkPath.c_str(), &zipHandle);
+ String8 libPath = String8(libDirPath) + "/libmedia_codecserviceregistrant.so";
- if (ret == 0) {
- char abilist32[PROPERTY_VALUE_MAX];
- property_get("ro.product.cpu.abilist32", abilist32, "armeabi-v7a");
+ android_namespace_t *codecNs = android_create_namespace("codecs",
+ nullptr, // ld_library_path
+ libDirPath,
+ ANDROID_NAMESPACE_TYPE_ISOLATED,
+ nullptr, // permitted_when_isolated_path
+ nullptr); // parent
- auto abis = base::Split(abilist32, ",");
- if (abis.empty()) {
- ALOGW("abilist is empty, trying armeabi-v7a ...");
- abis.push_back("armeabi-v7a");
- }
-
- // TODO: Only try the first entry in abilist32 for now.
- // We probably should try the next if it fails.
- String8 libPathInApk = String8("lib/") + String8(abis[0].c_str());
- String8 defaultLibPath = String8(apkPath.c_str()) + "!/" + libPathInApk;
- String8 libPath = defaultLibPath + "/libmedia_codecserviceregistrant.so";
- String8 zipEntryPath = libPathInApk + "/libmedia_codecserviceregistrant.so";
-
- ZipEntry entry;
- ret = FindEntry(zipHandle, ZipString(zipEntryPath), &entry);
-
- if (ret == 0) {
- android_namespace_t *codecNs = android_create_namespace("codecs",
- nullptr, // ld_library_path
- defaultLibPath.c_str(),
- ANDROID_NAMESPACE_TYPE_ISOLATED,
- nullptr, // permitted_when_isolated_path
- nullptr); // parent
-
- if (codecNs != nullptr) {
- String8 linked_libraries(LINKED_LIBRARIES);
- if (android_link_namespaces(
- codecNs, nullptr, linked_libraries.c_str())) {
- const android_dlextinfo dlextinfo = {
- .flags = ANDROID_DLEXT_USE_NAMESPACE,
- .library_namespace = codecNs,
- };
-
- registrantLib = android_dlopen_ext(
- libPath.string(),
- RTLD_NOW | RTLD_LOCAL, &dlextinfo);
-
- if (registrantLib == NULL) {
- ALOGE("Failed to load lib from archive: %s", dlerror());
- }
- } else {
- ALOGE("Failed to link namespace");
- }
- } else {
- ALOGE("Failed to create codec namespace");
- }
- } else {
- ALOGE("Failed to find entry (ret=%d)", ret);
- }
-
- CloseArchive(zipHandle);
- } else {
- ALOGE("Failed to open archive (ret=%d)", ret);
+ if (codecNs == nullptr) {
+ ALOGE("Failed to create codec namespace");
+ return;
}
- if (registrantLib) {
- RegisterCodecServicesFunc registerCodecServices =
- reinterpret_cast<RegisterCodecServicesFunc>(
- dlsym(registrantLib, "RegisterCodecServices"));
- if (registerCodecServices) {
- registerCodecServices();
- } else {
- LOG(WARNING) << "Cannot register codec services "
- "-- corrupted library.";
- }
- } else {
- LOG(ERROR) << "Cannot find codec service registrant.";
+ String8 linked_libraries(LINKED_LIBRARIES);
+ if (!android_link_namespaces(codecNs, nullptr, linked_libraries.c_str())) {
+ ALOGE("Failed to link namespace");
+ return;
}
- return binder::Status::ok();
+ const android_dlextinfo dlextinfo = {
+ .flags = ANDROID_DLEXT_USE_NAMESPACE,
+ .library_namespace = codecNs,
+ };
+
+ void *registrantLib = android_dlopen_ext(
+ libPath.string(),
+ RTLD_NOW | RTLD_LOCAL, &dlextinfo);
+
+ if (registrantLib == nullptr) {
+ ALOGE("Failed to load lib from archive: %s", dlerror());
+ }
+
+ RegisterCodecServicesFunc registerCodecServices =
+ reinterpret_cast<RegisterCodecServicesFunc>(
+ dlsym(registrantLib, "RegisterCodecServices"));
+
+ if (registerCodecServices == nullptr) {
+ ALOGE("Cannot register codec services -- corrupted library.");
+ return;
+ }
+
+ registerCodecServices();
}
-} // namespace media
} // namespace android
diff --git a/services/mediacodec/MediaCodecUpdateService.h b/services/mediacodec/MediaCodecUpdateService.h
index 7b7cee9..09d6dbe 100644
--- a/services/mediacodec/MediaCodecUpdateService.h
+++ b/services/mediacodec/MediaCodecUpdateService.h
@@ -17,24 +17,10 @@
#ifndef ANDROID_MEDIA_CODEC_UPDATE_SERVICE_H
#define ANDROID_MEDIA_CODEC_UPDATE_SERVICE_H
-#include <binder/BinderService.h>
-#include <android/media/BnMediaUpdateService.h>
-
namespace android {
-namespace media {
-class MediaCodecUpdateService
- : public BinderService<MediaCodecUpdateService>, public BnMediaUpdateService
-{
- friend class BinderService<MediaCodecUpdateService>;
-public:
- MediaCodecUpdateService() : BnMediaUpdateService() { }
- virtual ~MediaCodecUpdateService() { }
- static const char* getServiceName() { return "media.codec.update"; }
- binder::Status loadPlugins(const ::std::string& apkPath);
-};
+void loadFromApex(const char *libDirPath);
-} // namespace media
} // namespace android
#endif // ANDROID_MEDIA_CODEC_UPDATE_SERVICE_H
diff --git a/services/mediacodec/main_swcodecservice.cpp b/services/mediacodec/main_swcodecservice.cpp
index 79fea25..1168825 100644
--- a/services/mediacodec/main_swcodecservice.cpp
+++ b/services/mediacodec/main_swcodecservice.cpp
@@ -20,11 +20,7 @@
// from LOCAL_C_INCLUDES
#include "minijail.h"
-#include <android-base/properties.h>
-#include <binder/ProcessState.h>
-#include <dlfcn.h>
#include <hidl/HidlTransportSupport.h>
-#include <media/CodecServiceRegistrant.h>
#include "MediaCodecUpdateService.h"
@@ -49,32 +45,10 @@
signal(SIGPIPE, SIG_IGN);
SetUpMinijail(kSystemSeccompPolicyPath, kVendorSeccompPolicyPath);
- std::string value = base::GetProperty("ro.build.type", "unknown");
- if (value == "userdebug" || value == "eng") {
- media::MediaCodecUpdateService::instantiate();
- }
-
- android::ProcessState::self()->startThreadPool();
-
::android::hardware::configureRpcThreadpool(64, false);
- // Registration of customized codec services
- void *registrantLib = dlopen(
- "libmedia_codecserviceregistrant.so",
- RTLD_NOW | RTLD_LOCAL);
- if (registrantLib) {
- RegisterCodecServicesFunc registerCodecServices =
- reinterpret_cast<RegisterCodecServicesFunc>(
- dlsym(registrantLib, "RegisterCodecServices"));
- if (registerCodecServices) {
- registerCodecServices();
- } else {
- LOG(WARNING) << "Cannot register codec services "
- "-- corrupted library.";
- }
- } else {
- LOG(ERROR) << "Cannot find codec service registrant.";
- }
+ // codec libs are currently 32-bit only
+ loadFromApex("/apex/com.android.media.swcodec/lib");
::android::hardware::joinRpcThreadpool();
}