codec2 hal: add sysprop for HAL selection
Bug: 251850069
Test: run the example service and confirm the selection works
Change-Id: I0875989ab46c937b6749096d0b5f1805ea5eb02e
diff --git a/media/codec2/hal/aidl/Android.bp b/media/codec2/hal/aidl/Android.bp
index a6a6b77..a313250 100644
--- a/media/codec2/hal/aidl/Android.bp
+++ b/media/codec2/hal/aidl/Android.bp
@@ -36,6 +36,7 @@
],
static_libs: [
+ "libPlatformProperties",
"libaidlcommonsupport",
],
@@ -97,6 +98,7 @@
],
static_libs: [
+ "libPlatformProperties",
"libaidlcommonsupport",
],
diff --git a/media/codec2/hal/aidl/ParamTypes.cpp b/media/codec2/hal/aidl/ParamTypes.cpp
index 7026f4c..41e6f50 100644
--- a/media/codec2/hal/aidl/ParamTypes.cpp
+++ b/media/codec2/hal/aidl/ParamTypes.cpp
@@ -18,6 +18,8 @@
#define LOG_TAG "Codec2-AIDL-ParamTypes"
#include <android-base/logging.h>
+#include <android/binder_manager.h>
+#include <android/sysprop/MediaProperties.sysprop.h>
#include <codec2/aidl/ParamTypes.h>
#include <codec2/common/ParamTypes.h>
@@ -157,8 +159,30 @@
namespace c2 {
namespace utils {
-// TODO: read it from aconfig flags
-bool IsEnabled() { return false; }
+bool IsSelected() {
+ // TODO: read from aconfig flags
+ const bool enabled = false;
+
+ if (!enabled) {
+ // Cannot select AIDL if not enabled
+ return false;
+ }
+ using ::android::sysprop::MediaProperties::codec2_hal_selection;
+ using ::android::sysprop::MediaProperties::codec2_hal_selection_values;
+ constexpr codec2_hal_selection_values AIDL = codec2_hal_selection_values::AIDL;
+ constexpr codec2_hal_selection_values HIDL = codec2_hal_selection_values::HIDL;
+ codec2_hal_selection_values selection = codec2_hal_selection().value_or(HIDL);
+ switch (selection) {
+ case AIDL:
+ return true;
+ case HIDL:
+ return false;
+ default:
+ LOG(FATAL) << "Unexpected codec2 HAL selection value: " << (int)selection;
+ }
+
+ return false;
+}
const char* asString(Status status, const char* def) {
return asString(static_cast<c2_status_t>(status.status), def);
diff --git a/media/codec2/hal/aidl/include/codec2/aidl/ParamTypes.h b/media/codec2/hal/aidl/include/codec2/aidl/ParamTypes.h
index 3f82ee3..7c31a06 100644
--- a/media/codec2/hal/aidl/include/codec2/aidl/ParamTypes.h
+++ b/media/codec2/hal/aidl/include/codec2/aidl/ParamTypes.h
@@ -37,8 +37,8 @@
namespace c2 {
namespace utils {
-// Returns true iff AIDL c2 HAL is enabled
-bool IsEnabled();
+// Returns true iff AIDL c2 HAL is selected for the system
+bool IsSelected();
// Make asString() and operator<< work with Status as well as c2_status_t.
C2_DECLARE_AS_STRING_AND_DEFINE_STREAM_OUT(Status);
diff --git a/media/codec2/hal/client/client.cpp b/media/codec2/hal/client/client.cpp
index e3f8b1c..ab6505e 100644
--- a/media/codec2/hal/client/client.cpp
+++ b/media/codec2/hal/client/client.cpp
@@ -1438,35 +1438,35 @@
std::vector<std::string> Codec2Client::CacheServiceNames() {
std::vector<std::string> names;
- if (c2_aidl::utils::IsEnabled()) {
+ if (c2_aidl::utils::IsSelected()) {
// Get AIDL service names
AServiceManager_forEachDeclaredInstance(
AidlBase::descriptor, &names, [](const char *name, void *context) {
std::vector<std::string> *names = (std::vector<std::string> *)context;
names->emplace_back(name);
});
- }
+ } else {
+ // Get HIDL service names
+ using ::android::hardware::media::c2::V1_0::IComponentStore;
+ using ::android::hidl::manager::V1_2::IServiceManager;
+ while (true) {
+ sp<IServiceManager> serviceManager = IServiceManager::getService();
+ CHECK(serviceManager) << "Hardware service manager is not running.";
- // Get HIDL service names
- using ::android::hardware::media::c2::V1_0::IComponentStore;
- using ::android::hidl::manager::V1_2::IServiceManager;
- while (true) {
- sp<IServiceManager> serviceManager = IServiceManager::getService();
- CHECK(serviceManager) << "Hardware service manager is not running.";
-
- Return<void> transResult;
- transResult = serviceManager->listManifestByInterface(
- IComponentStore::descriptor,
- [&names](
- hidl_vec<hidl_string> const& instanceNames) {
- names.insert(names.end(), instanceNames.begin(), instanceNames.end());
- });
- if (transResult.isOk()) {
- break;
+ Return<void> transResult;
+ transResult = serviceManager->listManifestByInterface(
+ IComponentStore::descriptor,
+ [&names](
+ hidl_vec<hidl_string> const& instanceNames) {
+ names.insert(names.end(), instanceNames.begin(), instanceNames.end());
+ });
+ if (transResult.isOk()) {
+ break;
+ }
+ LOG(ERROR) << "Could not retrieve the list of service instances of "
+ << IComponentStore::descriptor
+ << ". Retrying...";
}
- LOG(ERROR) << "Could not retrieve the list of service instances of "
- << IComponentStore::descriptor
- << ". Retrying...";
}
// Sort service names in each category.
std::stable_sort(
@@ -1545,7 +1545,7 @@
std::string const& name = GetServiceNames()[index];
LOG(VERBOSE) << "Creating a Codec2 client to service \"" << name << "\"";
- if (c2_aidl::utils::IsEnabled()) {
+ if (c2_aidl::utils::IsSelected()) {
std::string instanceName =
::android::base::StringPrintf("%s/%s", AidlBase::descriptor, name.c_str());
if (AServiceManager_isDeclared(instanceName.c_str())) {
@@ -1559,20 +1559,23 @@
CHECK(transStatus.isOk()) << "Codec2 AIDL service \"" << name << "\""
"does not have IConfigurable.";
return std::make_shared<Codec2Client>(baseStore, configurable, index);
+ } else {
+ LOG(ERROR) << "Codec2 AIDL service \"" << name << "\" is not declared";
}
+ } else {
+ std::string instanceName = "android.hardware.media.c2/" + name;
+ sp<HidlBase> baseStore = HidlBase::getService(name);
+ CHECK(baseStore) << "Codec2 service \"" << name << "\""
+ " inaccessible for unknown reasons.";
+ LOG(VERBOSE) << "Client to Codec2 service \"" << name << "\" created";
+ Return<sp<c2_hidl::IConfigurable>> transResult = baseStore->getConfigurable();
+ CHECK(transResult.isOk()) << "Codec2 service \"" << name << "\""
+ "does not have IConfigurable.";
+ sp<c2_hidl::IConfigurable> configurable =
+ static_cast<sp<c2_hidl::IConfigurable>>(transResult);
+ return std::make_shared<Codec2Client>(baseStore, configurable, index);
}
-
- std::string instanceName = "android.hardware.media.c2/" + name;
- sp<HidlBase> baseStore = HidlBase::getService(name);
- CHECK(baseStore) << "Codec2 service \"" << name << "\""
- " inaccessible for unknown reasons.";
- LOG(VERBOSE) << "Client to Codec2 service \"" << name << "\" created";
- Return<sp<c2_hidl::IConfigurable>> transResult = baseStore->getConfigurable();
- CHECK(transResult.isOk()) << "Codec2 service \"" << name << "\""
- "does not have IConfigurable.";
- sp<c2_hidl::IConfigurable> configurable =
- static_cast<sp<c2_hidl::IConfigurable>>(transResult);
- return std::make_shared<Codec2Client>(baseStore, configurable, index);
+ return nullptr;
}
c2_status_t Codec2Client::ForAllServices(