Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b215e169 authored by Devin Moore's avatar Devin Moore
Browse files

swcodec check for any installed HIDL version

swcodec will install V1.2 on old devices that require HIDL. On R
devices only either V1.0 or V1.1 will be declared.

So we now check for any HIDL swcodec service to be declared istead of
only checking for V1.2.

Test: m && launch_cvd
Bug: 331224296
Change-Id: Ia178d9978857892453504c18919496256d2ff206
parent 69ea3edb
Loading
Loading
Loading
Loading
+48 −42
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ using ::android::hardware::hidl_string;
using ::android::hardware::Return;
using ::android::sp;
using ::ndk::ScopedAStatus;
namespace c2_hidl_V1_0 = ::android::hardware::media::c2::V1_0;
namespace c2_hidl = ::android::hardware::media::c2::V1_2;
namespace c2_aidl = ::aidl::android::hardware::media::c2;

@@ -734,6 +735,46 @@ bool ionPropertiesDefined() {

} // unnamed namespace

static android::sp<c2_hidl_V1_0::IComponentStore> getDeclaredHidlSwcodec(
        const std::shared_ptr<C2ComponentStore>& store) {
    using ::android::hidl::manager::V1_2::IServiceManager;
    using namespace ::android::hardware::media::c2;

    int platformVersion = android_get_device_api_level();
    // STOPSHIP: Remove code name checking once platform version bumps up to 35.
    std::string codeName = android::base::GetProperty("ro.build.version.codename", "");

    if (codeName == "VanillaIceCream") {
        platformVersion = __ANDROID_API_V__;
    }
    IServiceManager::Transport transport =
            android::hardware::defaultServiceManager1_2()->getTransport(
                    V1_2::IComponentStore::descriptor, "software");
    if (transport == IServiceManager::Transport::HWBINDER) {
        if (platformVersion < __ANDROID_API_S__) {
            LOG(ERROR) << "We don't expect V1.2::IComponentStore to be declared on this device";
        }
        return ::android::sp<V1_2::utils::ComponentStore>::make(store);
    }
    transport = android::hardware::defaultServiceManager1_2()->getTransport(
            V1_1::IComponentStore::descriptor, "software");
    if (transport == IServiceManager::Transport::HWBINDER) {
        if (platformVersion != __ANDROID_API_R__) {
            LOG(ERROR) << "We don't expect V1.1::IComponentStore to be declared on this device";
        }
        return ::android::sp<V1_1::utils::ComponentStore>::make(store);
    }
    transport = android::hardware::defaultServiceManager1_2()->getTransport(
            V1_0::IComponentStore::descriptor, "software");
    if (transport == IServiceManager::Transport::HWBINDER) {
        if (platformVersion != __ANDROID_API_Q__) {
            LOG(ERROR) << "We don't expect V1.0::IComponentStore to be declared on this device";
        }
        return ::android::sp<V1_0::utils::ComponentStore>::make(store);
    }
    return nullptr;
}

extern "C" void RegisterCodecServices() {
    const bool aidlSelected = c2_aidl::utils::IsSelected();
    constexpr int kThreadCount = 64;
@@ -751,33 +792,6 @@ extern "C" void RegisterCodecServices() {

    using namespace ::android::hardware::media::c2;

    int platformVersion = android_get_device_api_level();
    // STOPSHIP: Remove code name checking once platform version bumps up to 35.
    std::string codeName =
        android::base::GetProperty("ro.build.version.codename", "");
    if (codeName == "VanillaIceCream") {
        platformVersion = __ANDROID_API_V__;
    }

    android::sp<V1_0::IComponentStore> hidlStore;
    std::shared_ptr<c2_aidl::IComponentStore> aidlStore;
    const char *hidlVer = "(unknown)";
    if (aidlSelected) {
        aidlStore = ::ndk::SharedRefBase::make<c2_aidl::utils::ComponentStore>(store);
    } else if (platformVersion >= __ANDROID_API_S__) {
        hidlStore = ::android::sp<V1_2::utils::ComponentStore>::make(store);
        hidlVer = "1.2";
    } else if (platformVersion == __ANDROID_API_R__) {
        hidlStore = ::android::sp<V1_1::utils::ComponentStore>::make(store);
        hidlVer = "1.1";
    } else if (platformVersion == __ANDROID_API_Q__) {
        hidlStore = ::android::sp<V1_0::utils::ComponentStore>::make(store);
        hidlVer = "1.0";
    } else {  // platformVersion < __ANDROID_API_Q__
        LOG(ERROR) << "The platform version " << platformVersion <<
                      " is not supported.";
        return;
    }
    if (!ionPropertiesDefined()) {
        using IComponentStore =
            ::android::hardware::media::c2::V1_0::IComponentStore;
@@ -823,10 +837,9 @@ extern "C" void RegisterCodecServices() {
        std::string(c2_aidl::IComponentStore::descriptor) + "/software";
    if (__builtin_available(android __ANDROID_API_S__, *)) {
        if (AServiceManager_isDeclared(aidlServiceName.c_str())) {
            if (!aidlStore) {
                aidlStore = ::ndk::SharedRefBase::make<c2_aidl::utils::ComponentStore>(
            std::shared_ptr<c2_aidl::IComponentStore> aidlStore =
                    ::ndk::SharedRefBase::make<c2_aidl::utils::ComponentStore>(
                            std::make_shared<H2C2ComponentStore>(nullptr));
            }
            binder_exception_t ex = AServiceManager_addService(
                    aidlStore->asBinder().get(), aidlServiceName.c_str());
            if (ex == EX_NONE) {
@@ -837,22 +850,15 @@ extern "C" void RegisterCodecServices() {
        }
    }

    android::sp<V1_0::IComponentStore> hidlStore = getDeclaredHidlSwcodec(store);
    // If the software component store isn't declared in the manifest, we don't
    // need to create the service and register it.
    using ::android::hidl::manager::V1_2::IServiceManager;
    IServiceManager::Transport transport =
            android::hardware::defaultServiceManager1_2()->getTransport(
                    V1_2::utils::ComponentStore::descriptor, "software");
    if (transport == IServiceManager::Transport::HWBINDER) {
        if (!hidlStore) {
            hidlStore = ::android::sp<V1_2::utils::ComponentStore>::make(
                    std::make_shared<H2C2ComponentStore>(nullptr));
            hidlVer = "1.2";
        }
    if (hidlStore) {
        if (hidlStore->registerAsService("software") == android::OK) {
            registered = true;
        } else {
            LOG(ERROR) << "Cannot register software Codec2 v" << hidlVer << " service.";
            LOG(ERROR) << "Cannot register software Codec2 " << hidlStore->descriptor
                       << " service.";
        }
    } else {
        LOG(INFO) << "The HIDL software Codec2 service is deprecated"