input/opencv: list up valid fps and use it 81/314281/1
authorInki Dae <inki.dae@samsung.com>
Wed, 10 Jul 2024 01:05:42 +0000 (10:05 +0900)
committerInki Dae <inki.dae@samsung.com>
Wed, 10 Jul 2024 01:05:42 +0000 (10:05 +0900)
List up valid fps through OpenCV and use user-given config value
instead of fixed one. OpenCV cannot list up valid fps itself
So this patch uses a local fps table - which includes only well-known fps
values - to check if each fps in the table is valid or not, and to update
only valid fps.

Change-Id: If6fc2ebf2f9c79e5b99126dd4000b1bbcb700b9b
Signed-off-by: Inki Dae <inki.dae@samsung.com>
input/backends/opencv/include/OpencvBackend.h
input/backends/opencv/src/OpencvBackend.cpp

index 63cea5579453ab07ad78ff6e96a688e5f7aaf5e7..1a964442e888d96ccb461d2ec953041663d7135b 100644 (file)
@@ -38,11 +38,13 @@ private:
        std::unique_ptr<std::thread> _thread_handle;
        bool _exit_thread { false };
        std::unordered_set<unsigned int> _camera_ids;
+       std::vector<int> _validFps;
        unsigned int _active_camera_id {};
        static bool _registered;
 
        void updateAvailableCameraDevices();
        void setActiveCameraDevice(unsigned int id);
+       void updateAvailableFPS();
        void threadLoop();
 
 public:
index 020379a5be81d49e9000b5d5b3be5f85052556fd..00a8297554edb9fe33d1533010c8e5a5621e838d 100644 (file)
@@ -54,6 +54,23 @@ void OpencvBackend::updateAvailableCameraDevices()
        }
 }
 
+void OpencvBackend::updateAvailableFPS()
+{
+       // Opencv cannot list up valid FPS values itself
+       // so use well-known fps values to check if each fps is valid or not.
+       vector<int> testFPS = { 15, 30, 60, 120 };
+
+       for (auto &fps : testFPS) {
+               _video_capture->set(cv::CAP_PROP_FPS, fps);
+
+               auto actualFPS = _video_capture->get(cv::CAP_PROP_FPS);
+               if (static_cast<int>(actualFPS) == fps) {
+                       SINGLEO_LOGD("%d FPS is supported.", fps);
+                       _validFps.push_back(fps);
+               }
+       }
+}
+
 void OpencvBackend::registerObserver(IInputObserver *observer)
 {
        _observer = observer;
@@ -80,6 +97,18 @@ void OpencvBackend::configure(const CameraConfig &config)
                SINGLEO_LOGE("Failed to open camera device(%d).", _active_camera_id);
                throw InvalidOperation("Failed to open WebCap device.");
        }
+
+       // Listup valid FPS values.
+       updateAvailableFPS();
+
+       auto fps_it = find(_validFps.begin(), _validFps.end(), config.fps);
+       if (fps_it == _validFps.end()) {
+               SINGLEO_LOGE("OpencvBackend: fps(%d) is not supported.", config.fps);
+               throw InvalidOperation("OpencvBackend: fps is not supported.");
+       }
+
+       _video_capture->set(cv::CAP_PROP_FPS, config.fps);
+       SINGLEO_LOGD("%d FPS has been set.", config.fps);
 }
 
 void OpencvBackend::capture(BaseDataType &out_data)