Loading camera/CameraBase.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -60,6 +60,13 @@ status_t CameraStatus::writeToParcel(android::Parcel* parcel) const { if (res != OK) return res; res = parcel->writeInt32(status); if (res != OK) return res; std::vector<String16> unavailablePhysicalIds16; for (auto& id8 : unavailablePhysicalIds) { unavailablePhysicalIds16.push_back(String16(id8)); } res = parcel->writeString16Vector(unavailablePhysicalIds16); return res; } Loading @@ -70,6 +77,14 @@ status_t CameraStatus::readFromParcel(const android::Parcel* parcel) { cameraId = String8(tempCameraId); res = parcel->readInt32(&status); if (res != OK) return res; std::vector<String16> unavailablePhysicalIds16; res = parcel->readString16Vector(&unavailablePhysicalIds16); if (res != OK) return res; for (auto& id16 : unavailablePhysicalIds16) { unavailablePhysicalIds.push_back(String8(id16)); } return res; } Loading camera/aidl/android/hardware/ICameraServiceListener.aidl +6 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,12 @@ interface ICameraServiceListener oneway void onStatusChanged(int status, String cameraId); /** * Notify registered client about status changes for a physical camera backing * a logical camera. */ oneway void onPhysicalCameraStatusChanged(int status, String cameraId, String physicalCameraId); /** * The torch mode status of a camera. * Loading camera/cameraserver/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ cc_binary { "android.hardware.camera.common@1.0", "android.hardware.camera.provider@2.4", "android.hardware.camera.provider@2.5", "android.hardware.camera.provider@2.6", "android.hardware.camera.device@1.0", "android.hardware.camera.device@3.2", "android.hardware.camera.device@3.4", Loading camera/include/camera/CameraBase.h +7 −1 Original line number Diff line number Diff line Loading @@ -80,10 +80,16 @@ struct CameraStatus : public android::Parcelable { */ int32_t status; /** * Unavailable physical camera names for a multi-camera device */ std::vector<String8> unavailablePhysicalIds; virtual status_t writeToParcel(android::Parcel* parcel) const; virtual status_t readFromParcel(const android::Parcel* parcel); CameraStatus(String8 id, int32_t s) : cameraId(id), status(s) {} CameraStatus(String8 id, int32_t s, const std::vector<String8>& unavailSubIds) : cameraId(id), status(s), unavailablePhysicalIds(unavailSubIds) {} CameraStatus() : status(ICameraServiceListener::STATUS_PRESENT) {} }; Loading camera/ndk/impl/ACameraManager.cpp +132 −6 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ namespace android { namespace acam { // Static member definitions const char* CameraManagerGlobal::kCameraIdKey = "CameraId"; const char* CameraManagerGlobal::kPhysicalCameraIdKey = "PhysicalCameraId"; const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp"; const char* CameraManagerGlobal::kContextKey = "CallbackContext"; Mutex CameraManagerGlobal::sLock; Loading Loading @@ -220,7 +221,7 @@ void CameraManagerGlobal::registerAvailabilityCallback( if (pair.second) { for (auto& pair : mDeviceStatusMap) { const String8& cameraId = pair.first; int32_t status = pair.second.status; int32_t status = pair.second.getStatus(); // Don't send initial callbacks for camera ids which don't support // camera2 if (!pair.second.supportsHAL3) { Loading Loading @@ -264,9 +265,9 @@ void CameraManagerGlobal::getCameraIdList(std::vector<String8>* cameraIds) { // Needed to make sure we're connected to cameraservice getCameraServiceLocked(); for(auto& deviceStatus : mDeviceStatusMap) { if (deviceStatus.second.status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT || deviceStatus.second.status == hardware::ICameraServiceListener::STATUS_ENUMERATING) { int32_t status = deviceStatus.second.getStatus(); if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT || status == hardware::ICameraServiceListener::STATUS_ENUMERATING) { continue; } if (!deviceStatus.second.supportsHAL3) { Loading Loading @@ -341,6 +342,39 @@ void CameraManagerGlobal::CallbackHandler::onMessageReceived( (*cb)(context); break; } case kWhatSendSinglePhysicalCameraCallback: { ACameraManager_PhysicalCameraAvailabilityCallback cb; void* context; AString cameraId; AString physicalCameraId; bool found = msg->findPointer(kCallbackFpKey, (void**) &cb); if (!found) { ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__); return; } if (cb == nullptr) { // Physical camera callback is null return; } found = msg->findPointer(kContextKey, &context); if (!found) { ALOGE("%s: Cannot find callback context!", __FUNCTION__); return; } found = msg->findString(kCameraIdKey, &cameraId); if (!found) { ALOGE("%s: Cannot find camera ID!", __FUNCTION__); return; } found = msg->findString(kPhysicalCameraIdKey, &physicalCameraId); if (!found) { ALOGE("%s: Cannot find physical camera ID!", __FUNCTION__); return; } (*cb)(context, cameraId.c_str(), physicalCameraId.c_str()); break; } default: ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what()); break; Loading Loading @@ -368,6 +402,17 @@ binder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged( return binder::Status::ok(); } binder::Status CameraManagerGlobal::CameraServiceListener::onPhysicalCameraStatusChanged( int32_t status, const String16& cameraId, const String16& physicalCameraId) { sp<CameraManagerGlobal> cm = mCameraManager.promote(); if (cm != nullptr) { cm->onStatusChanged(status, String8(cameraId), String8(physicalCameraId)); } else { ALOGE("Cannot deliver physical camera status change. Global camera manager died"); } return binder::Status::ok(); } void CameraManagerGlobal::onCameraAccessPrioritiesChanged() { Mutex::Autolock _l(mLock); for (auto cb : mCallbacks) { Loading Loading @@ -397,7 +442,7 @@ void CameraManagerGlobal::onStatusChangedLocked( bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0); int32_t oldStatus = firstStatus ? status : // first status mDeviceStatusMap[cameraId].status; mDeviceStatusMap[cameraId].getStatus(); if (!firstStatus && isStatusAvailable(status) == isStatusAvailable(oldStatus)) { Loading @@ -406,8 +451,14 @@ void CameraManagerGlobal::onStatusChangedLocked( } bool supportsHAL3 = supportsCamera2ApiLocked(cameraId); if (firstStatus) { mDeviceStatusMap.emplace(std::piecewise_construct, std::forward_as_tuple(cameraId), std::forward_as_tuple(status, supportsHAL3)); } else { mDeviceStatusMap[cameraId].updateStatus(status); } // Iterate through all registered callbacks mDeviceStatusMap[cameraId] = StatusAndHAL3Support(status, supportsHAL3); if (supportsHAL3) { for (auto cb : mCallbacks) { sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler); Loading @@ -424,6 +475,81 @@ void CameraManagerGlobal::onStatusChangedLocked( } } void CameraManagerGlobal::onStatusChanged( int32_t status, const String8& cameraId, const String8& physicalCameraId) { Mutex::Autolock _l(mLock); onStatusChangedLocked(status, cameraId, physicalCameraId); } void CameraManagerGlobal::onStatusChangedLocked( int32_t status, const String8& cameraId, const String8& physicalCameraId) { if (!validStatus(status)) { ALOGE("%s: Invalid status %d", __FUNCTION__, status); return; } auto logicalStatus = mDeviceStatusMap.find(cameraId); if (logicalStatus == mDeviceStatusMap.end()) { ALOGE("%s: Physical camera id %s status change on a non-present id %s", __FUNCTION__, physicalCameraId.c_str(), cameraId.c_str()); return; } int32_t logicalCamStatus = mDeviceStatusMap[cameraId].getStatus(); if (logicalCamStatus != hardware::ICameraServiceListener::STATUS_PRESENT && logicalCamStatus != hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE) { ALOGE("%s: Physical camera id %s status %d change for an invalid logical camera state %d", __FUNCTION__, physicalCameraId.string(), status, logicalCamStatus); return; } bool supportsHAL3 = supportsCamera2ApiLocked(cameraId); bool updated = false; if (status == hardware::ICameraServiceListener::STATUS_PRESENT) { updated = mDeviceStatusMap[cameraId].removeUnavailablePhysicalId(physicalCameraId); } else { updated = mDeviceStatusMap[cameraId].addUnavailablePhysicalId(physicalCameraId); } // Iterate through all registered callbacks if (supportsHAL3 && updated) { for (auto cb : mCallbacks) { sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler); ACameraManager_PhysicalCameraAvailabilityCallback cbFp = isStatusAvailable(status) ? cb.mPhysicalCamAvailable : cb.mPhysicalCamUnavailable; msg->setPointer(kCallbackFpKey, (void *) cbFp); msg->setPointer(kContextKey, cb.mContext); msg->setString(kCameraIdKey, AString(cameraId)); msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId)); msg->post(); } } } int32_t CameraManagerGlobal::StatusAndHAL3Support::getStatus() { std::lock_guard<std::mutex> lock(mLock); return status; } void CameraManagerGlobal::StatusAndHAL3Support::updateStatus(int32_t newStatus) { std::lock_guard<std::mutex> lock(mLock); status = newStatus; } bool CameraManagerGlobal::StatusAndHAL3Support::addUnavailablePhysicalId( const String8& physicalCameraId) { std::lock_guard<std::mutex> lock(mLock); auto result = unavailablePhysicalIds.insert(physicalCameraId); return result.second; } bool CameraManagerGlobal::StatusAndHAL3Support::removeUnavailablePhysicalId( const String8& physicalCameraId) { std::lock_guard<std::mutex> lock(mLock); auto count = unavailablePhysicalIds.erase(physicalCameraId); return count > 0; } } // namespace acam } // namespace android Loading Loading
camera/CameraBase.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -60,6 +60,13 @@ status_t CameraStatus::writeToParcel(android::Parcel* parcel) const { if (res != OK) return res; res = parcel->writeInt32(status); if (res != OK) return res; std::vector<String16> unavailablePhysicalIds16; for (auto& id8 : unavailablePhysicalIds) { unavailablePhysicalIds16.push_back(String16(id8)); } res = parcel->writeString16Vector(unavailablePhysicalIds16); return res; } Loading @@ -70,6 +77,14 @@ status_t CameraStatus::readFromParcel(const android::Parcel* parcel) { cameraId = String8(tempCameraId); res = parcel->readInt32(&status); if (res != OK) return res; std::vector<String16> unavailablePhysicalIds16; res = parcel->readString16Vector(&unavailablePhysicalIds16); if (res != OK) return res; for (auto& id16 : unavailablePhysicalIds16) { unavailablePhysicalIds.push_back(String8(id16)); } return res; } Loading
camera/aidl/android/hardware/ICameraServiceListener.aidl +6 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,12 @@ interface ICameraServiceListener oneway void onStatusChanged(int status, String cameraId); /** * Notify registered client about status changes for a physical camera backing * a logical camera. */ oneway void onPhysicalCameraStatusChanged(int status, String cameraId, String physicalCameraId); /** * The torch mode status of a camera. * Loading
camera/cameraserver/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ cc_binary { "android.hardware.camera.common@1.0", "android.hardware.camera.provider@2.4", "android.hardware.camera.provider@2.5", "android.hardware.camera.provider@2.6", "android.hardware.camera.device@1.0", "android.hardware.camera.device@3.2", "android.hardware.camera.device@3.4", Loading
camera/include/camera/CameraBase.h +7 −1 Original line number Diff line number Diff line Loading @@ -80,10 +80,16 @@ struct CameraStatus : public android::Parcelable { */ int32_t status; /** * Unavailable physical camera names for a multi-camera device */ std::vector<String8> unavailablePhysicalIds; virtual status_t writeToParcel(android::Parcel* parcel) const; virtual status_t readFromParcel(const android::Parcel* parcel); CameraStatus(String8 id, int32_t s) : cameraId(id), status(s) {} CameraStatus(String8 id, int32_t s, const std::vector<String8>& unavailSubIds) : cameraId(id), status(s), unavailablePhysicalIds(unavailSubIds) {} CameraStatus() : status(ICameraServiceListener::STATUS_PRESENT) {} }; Loading
camera/ndk/impl/ACameraManager.cpp +132 −6 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ namespace android { namespace acam { // Static member definitions const char* CameraManagerGlobal::kCameraIdKey = "CameraId"; const char* CameraManagerGlobal::kPhysicalCameraIdKey = "PhysicalCameraId"; const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp"; const char* CameraManagerGlobal::kContextKey = "CallbackContext"; Mutex CameraManagerGlobal::sLock; Loading Loading @@ -220,7 +221,7 @@ void CameraManagerGlobal::registerAvailabilityCallback( if (pair.second) { for (auto& pair : mDeviceStatusMap) { const String8& cameraId = pair.first; int32_t status = pair.second.status; int32_t status = pair.second.getStatus(); // Don't send initial callbacks for camera ids which don't support // camera2 if (!pair.second.supportsHAL3) { Loading Loading @@ -264,9 +265,9 @@ void CameraManagerGlobal::getCameraIdList(std::vector<String8>* cameraIds) { // Needed to make sure we're connected to cameraservice getCameraServiceLocked(); for(auto& deviceStatus : mDeviceStatusMap) { if (deviceStatus.second.status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT || deviceStatus.second.status == hardware::ICameraServiceListener::STATUS_ENUMERATING) { int32_t status = deviceStatus.second.getStatus(); if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT || status == hardware::ICameraServiceListener::STATUS_ENUMERATING) { continue; } if (!deviceStatus.second.supportsHAL3) { Loading Loading @@ -341,6 +342,39 @@ void CameraManagerGlobal::CallbackHandler::onMessageReceived( (*cb)(context); break; } case kWhatSendSinglePhysicalCameraCallback: { ACameraManager_PhysicalCameraAvailabilityCallback cb; void* context; AString cameraId; AString physicalCameraId; bool found = msg->findPointer(kCallbackFpKey, (void**) &cb); if (!found) { ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__); return; } if (cb == nullptr) { // Physical camera callback is null return; } found = msg->findPointer(kContextKey, &context); if (!found) { ALOGE("%s: Cannot find callback context!", __FUNCTION__); return; } found = msg->findString(kCameraIdKey, &cameraId); if (!found) { ALOGE("%s: Cannot find camera ID!", __FUNCTION__); return; } found = msg->findString(kPhysicalCameraIdKey, &physicalCameraId); if (!found) { ALOGE("%s: Cannot find physical camera ID!", __FUNCTION__); return; } (*cb)(context, cameraId.c_str(), physicalCameraId.c_str()); break; } default: ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what()); break; Loading Loading @@ -368,6 +402,17 @@ binder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged( return binder::Status::ok(); } binder::Status CameraManagerGlobal::CameraServiceListener::onPhysicalCameraStatusChanged( int32_t status, const String16& cameraId, const String16& physicalCameraId) { sp<CameraManagerGlobal> cm = mCameraManager.promote(); if (cm != nullptr) { cm->onStatusChanged(status, String8(cameraId), String8(physicalCameraId)); } else { ALOGE("Cannot deliver physical camera status change. Global camera manager died"); } return binder::Status::ok(); } void CameraManagerGlobal::onCameraAccessPrioritiesChanged() { Mutex::Autolock _l(mLock); for (auto cb : mCallbacks) { Loading Loading @@ -397,7 +442,7 @@ void CameraManagerGlobal::onStatusChangedLocked( bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0); int32_t oldStatus = firstStatus ? status : // first status mDeviceStatusMap[cameraId].status; mDeviceStatusMap[cameraId].getStatus(); if (!firstStatus && isStatusAvailable(status) == isStatusAvailable(oldStatus)) { Loading @@ -406,8 +451,14 @@ void CameraManagerGlobal::onStatusChangedLocked( } bool supportsHAL3 = supportsCamera2ApiLocked(cameraId); if (firstStatus) { mDeviceStatusMap.emplace(std::piecewise_construct, std::forward_as_tuple(cameraId), std::forward_as_tuple(status, supportsHAL3)); } else { mDeviceStatusMap[cameraId].updateStatus(status); } // Iterate through all registered callbacks mDeviceStatusMap[cameraId] = StatusAndHAL3Support(status, supportsHAL3); if (supportsHAL3) { for (auto cb : mCallbacks) { sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler); Loading @@ -424,6 +475,81 @@ void CameraManagerGlobal::onStatusChangedLocked( } } void CameraManagerGlobal::onStatusChanged( int32_t status, const String8& cameraId, const String8& physicalCameraId) { Mutex::Autolock _l(mLock); onStatusChangedLocked(status, cameraId, physicalCameraId); } void CameraManagerGlobal::onStatusChangedLocked( int32_t status, const String8& cameraId, const String8& physicalCameraId) { if (!validStatus(status)) { ALOGE("%s: Invalid status %d", __FUNCTION__, status); return; } auto logicalStatus = mDeviceStatusMap.find(cameraId); if (logicalStatus == mDeviceStatusMap.end()) { ALOGE("%s: Physical camera id %s status change on a non-present id %s", __FUNCTION__, physicalCameraId.c_str(), cameraId.c_str()); return; } int32_t logicalCamStatus = mDeviceStatusMap[cameraId].getStatus(); if (logicalCamStatus != hardware::ICameraServiceListener::STATUS_PRESENT && logicalCamStatus != hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE) { ALOGE("%s: Physical camera id %s status %d change for an invalid logical camera state %d", __FUNCTION__, physicalCameraId.string(), status, logicalCamStatus); return; } bool supportsHAL3 = supportsCamera2ApiLocked(cameraId); bool updated = false; if (status == hardware::ICameraServiceListener::STATUS_PRESENT) { updated = mDeviceStatusMap[cameraId].removeUnavailablePhysicalId(physicalCameraId); } else { updated = mDeviceStatusMap[cameraId].addUnavailablePhysicalId(physicalCameraId); } // Iterate through all registered callbacks if (supportsHAL3 && updated) { for (auto cb : mCallbacks) { sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler); ACameraManager_PhysicalCameraAvailabilityCallback cbFp = isStatusAvailable(status) ? cb.mPhysicalCamAvailable : cb.mPhysicalCamUnavailable; msg->setPointer(kCallbackFpKey, (void *) cbFp); msg->setPointer(kContextKey, cb.mContext); msg->setString(kCameraIdKey, AString(cameraId)); msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId)); msg->post(); } } } int32_t CameraManagerGlobal::StatusAndHAL3Support::getStatus() { std::lock_guard<std::mutex> lock(mLock); return status; } void CameraManagerGlobal::StatusAndHAL3Support::updateStatus(int32_t newStatus) { std::lock_guard<std::mutex> lock(mLock); status = newStatus; } bool CameraManagerGlobal::StatusAndHAL3Support::addUnavailablePhysicalId( const String8& physicalCameraId) { std::lock_guard<std::mutex> lock(mLock); auto result = unavailablePhysicalIds.insert(physicalCameraId); return result.second; } bool CameraManagerGlobal::StatusAndHAL3Support::removeUnavailablePhysicalId( const String8& physicalCameraId) { std::lock_guard<std::mutex> lock(mLock); auto count = unavailablePhysicalIds.erase(physicalCameraId); return count > 0; } } // namespace acam } // namespace android Loading