Merge "camera2 ndk: Don't send onStatusChanged callbacks for devices which don't support camera2." am: b2872d478f

am: 837798c7e3

Change-Id: I24b095f89eb6fa96c3152a5478f480647de9f212
gugelfrei
Jayant Chowdhary 5 years ago committed by android-build-merger
commit b3fc5d6b8e

@ -76,6 +76,10 @@ static bool isCameraServiceDisabled() {
sp<hardware::ICameraService> CameraManagerGlobal::getCameraService() { sp<hardware::ICameraService> CameraManagerGlobal::getCameraService() {
Mutex::Autolock _l(mLock); Mutex::Autolock _l(mLock);
return getCameraServiceLocked();
}
sp<hardware::ICameraService> CameraManagerGlobal::getCameraServiceLocked() {
if (mCameraService.get() == nullptr) { if (mCameraService.get() == nullptr) {
if (isCameraServiceDisabled()) { if (isCameraServiceDisabled()) {
return mCameraService; return mCameraService;
@ -216,8 +220,12 @@ void CameraManagerGlobal::registerAvailabilityCallback(
if (pair.second) { if (pair.second) {
for (auto& pair : mDeviceStatusMap) { for (auto& pair : mDeviceStatusMap) {
const String8& cameraId = pair.first; const String8& cameraId = pair.first;
int32_t status = pair.second; int32_t status = pair.second.status;
// Don't send initial callbacks for camera ids which don't support
// camera2
if (!pair.second.supportsHAL3) {
continue;
}
sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler); sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
ACameraManager_AvailabilityCallback cb = isStatusAvailable(status) ? ACameraManager_AvailabilityCallback cb = isStatusAvailable(status) ?
callback->onCameraAvailable : callback->onCameraUnavailable; callback->onCameraAvailable : callback->onCameraUnavailable;
@ -236,20 +244,32 @@ void CameraManagerGlobal::unregisterAvailabilityCallback(
mCallbacks.erase(cb); mCallbacks.erase(cb);
} }
bool CameraManagerGlobal::supportsCamera2ApiLocked(const String8 &cameraId) {
bool camera2Support = false;
auto cs = getCameraServiceLocked();
binder::Status serviceRet =
cs->supportsCameraApi(String16(cameraId),
hardware::ICameraService::API_VERSION_2, &camera2Support);
if (!serviceRet.isOk()) {
ALOGE("%s: supportsCameraApi2Locked() call failed for cameraId %s",
__FUNCTION__, cameraId.c_str());
return false;
}
return camera2Support;
}
void CameraManagerGlobal::getCameraIdList(std::vector<String8>* cameraIds) { void CameraManagerGlobal::getCameraIdList(std::vector<String8>* cameraIds) {
// Ensure that we have initialized/refreshed the list of available devices // Ensure that we have initialized/refreshed the list of available devices
auto cs = getCameraService();
Mutex::Autolock _l(mLock); Mutex::Autolock _l(mLock);
// Needed to make sure we're connected to cameraservice
getCameraServiceLocked();
for(auto& deviceStatus : mDeviceStatusMap) { for(auto& deviceStatus : mDeviceStatusMap) {
if (deviceStatus.second == hardware::ICameraServiceListener::STATUS_NOT_PRESENT || if (deviceStatus.second.status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT ||
deviceStatus.second == hardware::ICameraServiceListener::STATUS_ENUMERATING) { deviceStatus.second.status ==
hardware::ICameraServiceListener::STATUS_ENUMERATING) {
continue; continue;
} }
bool camera2Support = false; if (!deviceStatus.second.supportsHAL3) {
binder::Status serviceRet = cs->supportsCameraApi(String16(deviceStatus.first),
hardware::ICameraService::API_VERSION_2, &camera2Support);
if (!serviceRet.isOk() || !camera2Support) {
continue; continue;
} }
cameraIds->push_back(deviceStatus.first); cameraIds->push_back(deviceStatus.first);
@ -377,7 +397,7 @@ void CameraManagerGlobal::onStatusChangedLocked(
bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0); bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0);
int32_t oldStatus = firstStatus ? int32_t oldStatus = firstStatus ?
status : // first status status : // first status
mDeviceStatusMap[cameraId]; mDeviceStatusMap[cameraId].status;
if (!firstStatus && if (!firstStatus &&
isStatusAvailable(status) == isStatusAvailable(oldStatus)) { isStatusAvailable(status) == isStatusAvailable(oldStatus)) {
@ -385,16 +405,19 @@ void CameraManagerGlobal::onStatusChangedLocked(
return; return;
} }
bool supportsHAL3 = supportsCamera2ApiLocked(cameraId);
// Iterate through all registered callbacks // Iterate through all registered callbacks
mDeviceStatusMap[cameraId] = status; mDeviceStatusMap[cameraId] = StatusAndHAL3Support(status, supportsHAL3);
for (auto cb : mCallbacks) { if (supportsHAL3) {
sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler); for (auto cb : mCallbacks) {
ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ? sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
cb.mAvailable : cb.mUnavailable; ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ?
msg->setPointer(kCallbackFpKey, (void *) cbFp); cb.mAvailable : cb.mUnavailable;
msg->setPointer(kContextKey, cb.mContext); msg->setPointer(kCallbackFpKey, (void *) cbFp);
msg->setString(kCameraIdKey, AString(cameraId)); msg->setPointer(kContextKey, cb.mContext);
msg->post(); msg->setString(kCameraIdKey, AString(cameraId));
msg->post();
}
} }
if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT) { if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT) {
mDeviceStatusMap.erase(cameraId); mDeviceStatusMap.erase(cameraId);

@ -66,9 +66,9 @@ class CameraManagerGlobal final : public RefBase {
private: private:
sp<hardware::ICameraService> mCameraService; sp<hardware::ICameraService> mCameraService;
const int kCameraServicePollDelay = 500000; // 0.5s const int kCameraServicePollDelay = 500000; // 0.5s
const char* kCameraServiceName = "media.camera"; const char* kCameraServiceName = "media.camera";
Mutex mLock; Mutex mLock;
class DeathNotifier : public IBinder::DeathRecipient { class DeathNotifier : public IBinder::DeathRecipient {
public: public:
@ -156,12 +156,14 @@ class CameraManagerGlobal final : public RefBase {
sp<CallbackHandler> mHandler; sp<CallbackHandler> mHandler;
sp<ALooper> mCbLooper; // Looper thread where callbacks actually happen on sp<ALooper> mCbLooper; // Looper thread where callbacks actually happen on
sp<hardware::ICameraService> getCameraServiceLocked();
void onCameraAccessPrioritiesChanged(); void onCameraAccessPrioritiesChanged();
void onStatusChanged(int32_t status, const String8& cameraId); void onStatusChanged(int32_t status, const String8& cameraId);
void onStatusChangedLocked(int32_t status, const String8& cameraId); void onStatusChangedLocked(int32_t status, const String8& cameraId);
// Utils for status // Utils for status
static bool validStatus(int32_t status); static bool validStatus(int32_t status);
static bool isStatusAvailable(int32_t status); static bool isStatusAvailable(int32_t status);
bool supportsCamera2ApiLocked(const String8 &cameraId);
// The sort logic must match the logic in // The sort logic must match the logic in
// libcameraservice/common/CameraProviderManager.cpp::getAPI1CompatibleCameraDeviceIds // libcameraservice/common/CameraProviderManager.cpp::getAPI1CompatibleCameraDeviceIds
@ -184,8 +186,16 @@ class CameraManagerGlobal final : public RefBase {
} }
}; };
struct StatusAndHAL3Support {
int32_t status = hardware::ICameraServiceListener::STATUS_NOT_PRESENT;
bool supportsHAL3 = false;
StatusAndHAL3Support(int32_t st, bool HAL3support):
status(st), supportsHAL3(HAL3support) { };
StatusAndHAL3Support() = default;
};
// Map camera_id -> status // Map camera_id -> status
std::map<String8, int32_t, CameraIdComparator> mDeviceStatusMap; std::map<String8, StatusAndHAL3Support, CameraIdComparator> mDeviceStatusMap;
// For the singleton instance // For the singleton instance
static Mutex sLock; static Mutex sLock;

Loading…
Cancel
Save