summaryrefslogtreecommitdiff
path: root/utils
AgeCommit message (Expand)Author
2024-07-05libtuning: Fix reference imageStefan Klug
2024-07-05libtuning: Backport improvements in MacBeth search reliabilityStefan Klug
2024-06-29utils: libtuning: Correct GBRG Image parsingDaniel Scally
2024-06-14utils: tuning: rkisp1: Add skeletal AGC to the rkisp1 tuning scriptPaul Elder
2024-06-14utils: libtuning: modules: Add skeletal AGC modulePaul Elder
2024-06-13utils: raspberrypi: ctt: Add a maximum gain parameter for LSCDavid Plowman
2024-06-13utils: raspberrypi: ctt: Add option to convert between vc4/pisp targetsNaushir Patuck
2024-06-13utils: raspberrypi: ctt: Update tuning tool for HDRDavid Plowman
2024-06-13utils: raspberrypi: ctt: Changed CTT handling of VC4 and PiSPBen Benson
2024-06-13utils: raspberrypi: ctt: Added CAC support to the CTTBen Benson
2024-06-13utils: raspberrypi: ctt: Adapt tuning tool for both VC4 and PiSPDavid Plowman
2024-06-03update-kernel-headers: Add linux/udmabuf.h to headers to syncHans de Goede
2024-05-31utils: checkstyle.py: Show location of coding style issue within lineLaurent Pinchart
2024-05-31utils: checkstyle.py: Add a check for hex valuesLaurent Pinchart
2024-05-31utils: checkstyle.py: Extend IncludeChecker to cover math.hLaurent Pinchart
2024-05-31utils: checkstyle.py: Refactor IncludeCheckerLaurent Pinchart
2024-05-09libcamera: Drop remaining file name from header comment blocksLaurent Pinchart
2024-05-09libcamera: Drop file name from header comment blocks in templatesLaurent Pinchart
2024-05-08libcamera: Drop file name from header comment blocksLaurent Pinchart
2024-05-08libcamera: controls: Generate enum value-name mapsDaniel Scally
2024-04-20libcamera: Fix output spelling errorUmang Jain
2024-04-19utils: checkstyle.py: Drop period at end of Doxygen one linersLaurent Pinchart
2024-04-19utils: checkstyle.py: Use r'' strings for regular expressionsLaurent Pinchart
2024-04-17ipu3: Use posix basenameKhem Raj
2024-04-13utils: ipc: Fix async main interface functions with no parametersPaul Elder
2024-04-10utils: ipc: Fix event functions with no parametersPaul Elder
2024-03-19utils: tuning: readme: Improve names of dependency packagesPaul Elder
2024-03-15checkstyle: Work around bug in difflibStefan Klug
2024-03-11utils: checkstyle.py: Fix known_trailers sort orderHans de Goede
2024-03-11utils: checkstyle.py: Add Co-developed-by to known_trailersHans de Goede
2024-02-28utils: ipu3: Fix return value check on file outputKieran Bingham
2024-02-27utils: rkisp1: gen-csc-table.py: Don't presume python3 locationLaurent Pinchart
2024-02-27utils: checkstyle.py: Update LogCategoryChecker regexpMilan Zamazal
2024-02-27utils: checkstyle.py: Don't presume python3 locationMilan Zamazal
2024-02-15utils: mojom: Fix build error caused by the mojom tool updateNaushir Patuck
2024-01-25libcamera: signal: Replace object.h inclusion with forward declatationLaurent Pinchart
2024-01-23utils: ipc: extract-docs: Fix escape characters in regexPaul Elder
2024-01-09utils: ipc: Update mojoLaurent Pinchart
2024-01-09utils: ipc: generate.py: Disable attributes checkerLaurent Pinchart
2024-01-09utils: ipc: generate.py: Add bindings directory to Python pathLaurent Pinchart
2024-01-09utils: update-mojo.sh: Commit the mojo updateLaurent Pinchart
2024-01-09utils: update-mojo.sh: Reject a dirty libcamera treeLaurent Pinchart
2024-01-09utils: update-mojo.sh: Change to the libcamera source directoryLaurent Pinchart
2024-01-09utils: update-mojo.sh: Exit immediately on errorLaurent Pinchart
2024-01-09utils: update-mojo.sh: Properly remove old sourcesLaurent Pinchart
2024-01-09hooks: pre-push: Disable interpretation of escape sequencesKieran Bingham
2024-01-09utils: ipc: mojom_libcamera_generator.py: Fix Python warningMilan Zamazal
2024-01-09utils: ipc: Fix deserialization of multiple fd parametersPaul Elder
2024-01-09utils: raspberrypi: ctt: Improve the Macbeth Chart search reliabilityDavid Plowman
2023-11-30libcamera: controls: Use vendor tags for draft controls and propertiesNaushir Patuck
return 0; } std::tuple<CameraDevice *, int> CameraHalManager::open(unsigned int id, const hw_module_t *hardwareModule) { MutexLocker locker(mutex_); if (!callbacks_) { LOG(HAL, Error) << "Can't open camera before callbacks are set"; return { nullptr, -ENODEV }; } CameraDevice *camera = cameraDeviceFromHalId(id); if (!camera) { LOG(HAL, Error) << "Invalid camera id '" << id << "'"; return { nullptr, -ENODEV }; } int ret = camera->open(hardwareModule); if (ret) return { nullptr, ret }; LOG(HAL, Info) << "Open camera '" << id << "'"; return { camera, 0 }; } void CameraHalManager::cameraAdded(std::shared_ptr<Camera> cam) { unsigned int id; bool isCameraExternal = false; bool isCameraNew = false; MutexLocker locker(mutex_); /* * Each camera is assigned a unique integer ID when it is seen for the * first time. If the camera has been seen before, the previous ID is * re-used. * * IDs starts from '0' for internal cameras and '1000' for external * cameras. */ auto iter = cameraIdsMap_.find(cam->id()); if (iter != cameraIdsMap_.end()) { id = iter->second; if (id >= firstExternalCameraId_) isCameraExternal = true; } else { isCameraNew = true; /* * Now check if this is an external camera and assign * its id accordingly. */ if (cameraLocation(cam.get()) == properties::CameraLocationExternal) { isCameraExternal = true; id = nextExternalCameraId_; } else { id = numInternalCameras_; } } /* * The configuration file must be valid, and contain a corresponding * entry for internal cameras. External cameras can be initialized * without configuration file. */ if (!isCameraExternal && !halConfig_.exists()) { LOG(HAL, Error) << "HAL configuration file is mandatory for internal cameras"; return; } const CameraConfigData *cameraConfigData = halConfig_.cameraConfigData(cam->id()); /* * Some cameras whose location is reported by libcamera as external may * actually be internal to the device. This is common with UVC cameras * that are integrated in a laptop. In that case the real location * should be specified in the configuration file. * * If the camera location is external and a configuration entry exists * for it, override its location. */ if (isCameraNew && isCameraExternal) { if (cameraConfigData && cameraConfigData->facing != -1) { isCameraExternal = false; id = numInternalCameras_; } } if (!isCameraExternal && !cameraConfigData) { LOG(HAL, Error) << "HAL configuration entry for internal camera " << cam->id() << " is missing"; return; } /* Create a CameraDevice instance to wrap the libcamera Camera. */ std::unique_ptr<CameraDevice> camera = CameraDevice::create(id, cam); int ret = camera->initialize(cameraConfigData); if (ret) { LOG(HAL, Error) << "Failed to initialize camera: " << cam->id(); return; } if (isCameraNew) { cameraIdsMap_.emplace(cam->id(), id); if (isCameraExternal) nextExternalCameraId_++; else numInternalCameras_++; } cameras_.emplace_back(std::move(camera)); if (callbacks_) callbacks_->camera_device_status_change(callbacks_, id, CAMERA_DEVICE_STATUS_PRESENT); LOG(HAL, Debug) << "Camera ID: " << id << " added successfully."; } void CameraHalManager::cameraRemoved(std::shared_ptr<Camera> cam) { MutexLocker locker(mutex_); auto iter = std::find_if(cameras_.begin(), cameras_.end(), [&cam](const std::unique_ptr<CameraDevice> &camera) { return cam == camera->camera(); }); if (iter == cameras_.end()) return; /* * CAMERA_DEVICE_STATUS_NOT_PRESENT should be set for external cameras * only. */ unsigned int id = (*iter)->id(); if (id >= firstExternalCameraId_) callbacks_->camera_device_status_change(callbacks_, id, CAMERA_DEVICE_STATUS_NOT_PRESENT); /* * \todo Check if the camera is already open and running. * Inform the framework about its absence before deleting its * reference here. */ cameras_.erase(iter); LOG(HAL, Debug) << "Camera ID: " << id << " removed successfully."; } int32_t CameraHalManager::cameraLocation(const Camera *cam) { return cam->properties().get(properties::Location).value_or(-1); } CameraDevice *CameraHalManager::cameraDeviceFromHalId(unsigned int id) { auto iter = std::find_if(cameras_.begin(), cameras_.end(), [id](const std::unique_ptr<CameraDevice> &camera) { return camera->id() == id; }); if (iter == cameras_.end()) return nullptr; return iter->get(); } unsigned int CameraHalManager::numCameras() const { return numInternalCameras_; } int CameraHalManager::getCameraInfo(unsigned int id, struct camera_info *info) { if (!info) return -EINVAL; MutexLocker locker(mutex_); CameraDevice *camera = cameraDeviceFromHalId(id); if (!camera) { LOG(HAL, Error) << "Invalid camera id '" << id << "'"; return -EINVAL; } info->facing = camera->facing(); info->orientation = camera->orientation(); info->device_version = CAMERA_DEVICE_API_VERSION_3_3; info->resource_cost = 0; info->static_camera_characteristics = camera->getStaticMetadata(); info->conflicting_devices = nullptr; info->conflicting_devices_length = 0; return 0; } void CameraHalManager::setCallbacks(const camera_module_callbacks_t *callbacks) { callbacks_ = callbacks; MutexLocker locker(mutex_); /* * Some external cameras may have been identified before the callbacks_ * were set. Iterate all existing external cameras and mark them as * CAMERA_DEVICE_STATUS_PRESENT explicitly. * * Internal cameras are already assumed to be present at module load * time by the Android framework. */ for (const std::unique_ptr<CameraDevice> &camera : cameras_) { unsigned int id = camera->id(); if (id >= firstExternalCameraId_) callbacks_->camera_device_status_change(callbacks_, id, CAMERA_DEVICE_STATUS_PRESENT); } }