|
|
|
@ -29,6 +29,7 @@
|
|
|
|
|
#include <future>
|
|
|
|
|
#include <inttypes.h>
|
|
|
|
|
#include <hardware/camera_common.h>
|
|
|
|
|
#include <android/hidl/manager/1.2/IServiceManager.h>
|
|
|
|
|
#include <hidl/ServiceManagement.h>
|
|
|
|
|
#include <functional>
|
|
|
|
|
#include <camera_metadata_hidden.h>
|
|
|
|
@ -47,10 +48,6 @@ using namespace ::android::hardware::camera::common::V1_0;
|
|
|
|
|
using std::literals::chrono_literals::operator""s;
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
// Hardcoded name for the passthrough HAL implementation, since it can't be discovered via the
|
|
|
|
|
// service manager
|
|
|
|
|
const std::string kLegacyProviderName("legacy/0");
|
|
|
|
|
const std::string kExternalProviderName("external/0");
|
|
|
|
|
const bool kEnableLazyHal(property_get_bool("ro.camera.enableLazyHal", false));
|
|
|
|
|
} // anonymous namespace
|
|
|
|
|
|
|
|
|
@ -62,6 +59,19 @@ CameraProviderManager::sHardwareServiceInteractionProxy{};
|
|
|
|
|
CameraProviderManager::~CameraProviderManager() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
hardware::hidl_vec<hardware::hidl_string>
|
|
|
|
|
CameraProviderManager::HardwareServiceInteractionProxy::listServices() {
|
|
|
|
|
hardware::hidl_vec<hardware::hidl_string> ret;
|
|
|
|
|
auto manager = hardware::defaultServiceManager1_2();
|
|
|
|
|
if (manager != nullptr) {
|
|
|
|
|
manager->listManifestByInterface(provider::V2_4::ICameraProvider::descriptor,
|
|
|
|
|
[&ret](const hardware::hidl_vec<hardware::hidl_string> ®istered) {
|
|
|
|
|
ret = registered;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,
|
|
|
|
|
ServiceInteractionProxy* proxy) {
|
|
|
|
|
std::lock_guard<std::mutex> lock(mInterfaceMutex);
|
|
|
|
@ -84,9 +94,10 @@ status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListe
|
|
|
|
|
return INVALID_OPERATION;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// See if there's a passthrough HAL, but let's not complain if there's not
|
|
|
|
|
addProviderLocked(kLegacyProviderName, /*expected*/ false);
|
|
|
|
|
addProviderLocked(kExternalProviderName, /*expected*/ false);
|
|
|
|
|
|
|
|
|
|
for (const auto& instance : mServiceProxy->listServices()) {
|
|
|
|
|
this->addProviderLocked(instance);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IPCThreadState::self()->flushCommands();
|
|
|
|
|
|
|
|
|
@ -1087,7 +1098,7 @@ bool CameraProviderManager::isHiddenPhysicalCamera(const std::string& cameraId)
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status_t CameraProviderManager::addProviderLocked(const std::string& newProvider, bool expected) {
|
|
|
|
|
status_t CameraProviderManager::addProviderLocked(const std::string& newProvider) {
|
|
|
|
|
for (const auto& providerInfo : mProviders) {
|
|
|
|
|
if (providerInfo->mProviderName == newProvider) {
|
|
|
|
|
ALOGW("%s: Camera provider HAL with name '%s' already registered", __FUNCTION__,
|
|
|
|
@ -1100,13 +1111,9 @@ status_t CameraProviderManager::addProviderLocked(const std::string& newProvider
|
|
|
|
|
interface = mServiceProxy->getService(newProvider);
|
|
|
|
|
|
|
|
|
|
if (interface == nullptr) {
|
|
|
|
|
if (expected) {
|
|
|
|
|
ALOGE("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__,
|
|
|
|
|
newProvider.c_str());
|
|
|
|
|
return BAD_VALUE;
|
|
|
|
|
} else {
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
ALOGE("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__,
|
|
|
|
|
newProvider.c_str());
|
|
|
|
|
return BAD_VALUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sp<ProviderInfo> providerInfo = new ProviderInfo(newProvider, this);
|
|
|
|
|