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

Commit f3aae1b8 authored by Devin Moore's avatar Devin Moore Committed by Gerrit Code Review
Browse files

Merge "swcodec check for any installed HIDL version" into main

parents d9dc7d27 b215e169
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"