From: Inki Dae Date: Wed, 17 Apr 2024 02:41:24 +0000 (+0900) Subject: input/camera_api: activate user-desired camera device X-Git-Tag: accepted/tizen/unified/20240903.110722~69 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0cfa1df3a41acc64452c6f6006ed4e524a31c28a;p=platform%2Fcore%2Fapi%2Fsingleo.git input/camera_api: activate user-desired camera device Activate user-desired camera device by adding updateAvailableCameraDevices and setActivateCameraDevice functions. With this patch, Camera API backend collects valid camera device list and activates user-desired camera device with config.device_id which is passed by user. Change-Id: I8d44a2da1513957ee350497d328fd3c342284817 Signed-off-by: Inki Dae --- diff --git a/input/backends/camera_api/include/CameraApiBackend.h b/input/backends/camera_api/include/CameraApiBackend.h index 9add7e3..21ffbc7 100644 --- a/input/backends/camera_api/include/CameraApiBackend.h +++ b/input/backends/camera_api/include/CameraApiBackend.h @@ -46,7 +46,17 @@ private: camera_pixel_format_e _defaultPixelFormat { CAMERA_PIXEL_FORMAT_I420 }; std::vector _validPixelFormat; std::vector _validResolution; + std::unordered_set _camera_ids; + camera_device_e _active_camera_id {}; + std::map _cameraDeviceIdTable = { + { 0, CAMERA_DEVICE_CAMERA0 }, { 1, CAMERA_DEVICE_CAMERA1 }, { 2, CAMERA_DEVICE_CAMERA2 }, + { 3, CAMERA_DEVICE_CAMERA3 }, { 4, CAMERA_DEVICE_CAMERA4 }, { 5, CAMERA_DEVICE_CAMERA5 }, + { 6, CAMERA_DEVICE_CAMERA6 }, { 7, CAMERA_DEVICE_CAMERA7 }, { 8, CAMERA_DEVICE_CAMERA8 }, + { 9, CAMERA_DEVICE_CAMERA9 } + }; + void updateAvailableCameraDevices(); + void setActivateCameraDevice(unsigned int id); void threadLoop(); static void previewCb(camera_preview_data_s *data, void *user_data); static bool previewFormatCb(camera_pixel_format_e format, void *user_data); diff --git a/input/backends/camera_api/src/CameraApiBackend.cpp b/input/backends/camera_api/src/CameraApiBackend.cpp index f2eac38..7eb03af 100644 --- a/input/backends/camera_api/src/CameraApiBackend.cpp +++ b/input/backends/camera_api/src/CameraApiBackend.cpp @@ -30,7 +30,10 @@ REGISTER_CAMERA_BACKEND(CameraApiBackend) CameraApiBackend::CameraApiBackend(const CameraConfig &config) { - int ret = camera_create(CAMERA_DEVICE_CAMERA0, &_camera); + updateAvailableCameraDevices(); + setActivateCameraDevice(config.device_id); + + int ret = camera_create(_active_camera_id, &_camera); if (ret != CAMERA_ERROR_NONE) { SINGLEO_LOGE("CameraApiBackend: camera_create failed. ret: %d", ret); throw InvalidOperation("CameraApiBackend: camera_create failed."); @@ -42,6 +45,33 @@ CameraApiBackend::~CameraApiBackend() camera_destroy(_camera); } +void CameraApiBackend::updateAvailableCameraDevices() +{ + for (unsigned int idx = 0; idx < _cameraDeviceIdTable.size(); ++idx) { + camera_h camera; + + if (camera_create(_cameraDeviceIdTable[idx], &camera) == CAMERA_ERROR_NONE) { + // Update valid camera device ids. + _camera_ids.insert(idx); + camera_destroy(camera); + + SINGLEO_LOGD("camera device id %d is valid.", idx); + } + } +} + +void CameraApiBackend::setActivateCameraDevice(unsigned int id) +{ + if (_camera_ids.count(id) == 0) { + SINGLEO_LOGE("A given camera device id(%d) isn't supported.", id); + throw InvalidOperation("A given camera device id not supported."); + } + + _active_camera_id = _cameraDeviceIdTable[id]; + + SINGLEO_LOGD("Camera device id(%d) has been activated.", id); +} + void CameraApiBackend::setUserCb(const InputServiceCallbackType &userCb, void *user_data) { _userCb = userCb;