input/camera_api: activate user-desired camera device 95/309795/2
authorInki Dae <inki.dae@samsung.com>
Wed, 17 Apr 2024 02:41:24 +0000 (11:41 +0900)
committerInki Dae <inki.dae@samsung.com>
Wed, 17 Apr 2024 02:59:08 +0000 (11:59 +0900)
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 <inki.dae@samsung.com>
input/backends/camera_api/include/CameraApiBackend.h
input/backends/camera_api/src/CameraApiBackend.cpp

index 9add7e3608059861ab75ca31e4d78924f882b95c..21ffbc7921e3b11d89f4b1b25c4bb797c0b2ee5d 100644 (file)
@@ -46,7 +46,17 @@ private:
        camera_pixel_format_e _defaultPixelFormat { CAMERA_PIXEL_FORMAT_I420 };
        std::vector<camera_pixel_format_e> _validPixelFormat;
        std::vector<cv::Size> _validResolution;
+       std::unordered_set<unsigned int> _camera_ids;
+       camera_device_e _active_camera_id {};
+       std::map<int, camera_device_e> _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);
index f2eac38ca9f0acf25ddc89d2e0e4ffeaee961517..7eb03af33611ea4c4bb07e2711434aa2428f7d38 100644 (file)
@@ -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;