#include <opencv2/opencv.hpp>
#include <condition_variable>
+#include "IInputObserver.h"
#include "ICameraBackend.h"
#include "SingleoInputManager.h"
#include "InputTypes.h"
{
private:
camera_h _camera;
- InputServiceCallbackType _userCb;
- void *_userData;
std::mutex _capture_mutex;
std::condition_variable _capture_event;
bool _isCaptured { false };
+ IInputObserver *_observer;
cv::Mat _cvCaptureImage;
camera_pixel_format_e _defaultPreviewPixelFormat { CAMERA_PIXEL_FORMAT_I420 };
camera_pixel_format_e _defaultCapturePixelFormat { CAMERA_PIXEL_FORMAT_I420 };
CameraApiBackend();
virtual ~CameraApiBackend();
- void setUserCb(const InputServiceCallbackType &userCb, void *user_data) override;
+ void registerObserver(IInputObserver *observer) override;
void configure(const CameraConfig &config) override;
void capture(BaseDataType &out_data) override;
void streamOn() override;
SINGLEO_LOGD("Camera device id(%d) has been activated.", id);
}
-void CameraApiBackend::setUserCb(const InputServiceCallbackType &userCb, void *user_data)
+void CameraApiBackend::registerObserver(IInputObserver *observer)
{
- _userCb = userCb;
- _userData = user_data;
+ _observer = observer;
- SINGLEO_LOGD("CameraApiBackend: user callback has been registered.");
+ SINGLEO_LOGD("CameraApiBackend: service has been registered.");
}
void CameraApiBackend::previewCb(camera_preview_data_s *data, void *user_data)
{
CameraApiBackend *context = static_cast<CameraApiBackend *>(user_data);
- if (!context->_userCb)
+ if (!context->_observer)
return;
if (data->num_of_planes != 3 || data->format != CAMERA_PIXEL_FORMAT_I420) {
data_type.byte_per_pixel = cv_dst.channels();
data_type.ptr = cv_dst.data;
- context->_userCb(data_type, context->_userData);
+ context->_observer->inputFeedCb(data_type);
}
bool CameraApiBackend::previewFormatCb(camera_pixel_format_e format, void *user_data)
#ifndef __ICAMERA_BACKEND_H__
#define __ICAMERA_BACKEND_H__
-#include <functional>
+#include "IService.h"
#include "InputTypes.h"
+#include "IInputObserver.h"
#include "SingleoInputManager.h"
namespace singleo
public:
virtual ~ICameraBackend() {};
- virtual void setUserCb(const InputServiceCallbackType &userCb, void *user_data) = 0;
+ virtual void registerObserver(IInputObserver *observer) = 0;
virtual void configure(const CameraConfig &config) = 0;
virtual void capture(BaseDataType &out_data) = 0;
virtual void streamOn() = 0;
private:
std::unique_ptr<cv::VideoCapture> _video_capture;
cv::Mat _captured_image;
- InputServiceCallbackType _userCb;
- void *_userData;
+ IInputObserver *_observer;
std::unique_ptr<std::thread> _thread_handle;
bool _exit_thread { false };
std::unordered_set<unsigned int> _camera_ids;
OpencvBackend();
virtual ~OpencvBackend();
- void setUserCb(const InputServiceCallbackType &userCb, void *user_data) override;
+ void registerObserver(IInputObserver *observer) override;
void configure(const CameraConfig &config) override;
void capture(BaseDataType &out_data) override;
void streamOn() override;
}
}
-void OpencvBackend::setUserCb(const InputServiceCallbackType &userCb, void *user_data)
+void OpencvBackend::registerObserver(IInputObserver *observer)
{
- _userCb = userCb;
- _userData = user_data;
+ _observer = observer;
- SINGLEO_LOGD("OpencvBackend: user callback has been registered.");
+ SINGLEO_LOGD("OpencvBackend: service has been registered.");
}
void OpencvBackend::setActivateCameraDevice(unsigned int id)
while (!_exit_thread) {
capture(data);
- if (_userCb)
- _userCb(data, _userData);
+ if (_observer)
+ _observer->inputFeedCb(data);
}
}
+++ /dev/null
-/**
- * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __ICAMERA_SERVICE_H__
-#define __ICAMERA_SERVICE_H__
-
-#include "InputTypes.h"
-
-namespace singleo
-{
-namespace input
-{
-class ICameraService
-{
-public:
- virtual ~ICameraService() {};
-
- virtual void setUserCb(const InputServiceCallbackType &userCb, void *user_data) = 0;
- virtual void configure() = 0;
- virtual void capture(BaseDataType &data) = 0;
- virtual void streamOn() = 0;
- virtual void streamOff() = 0;
-};
-
-} // input
-} // singleo
-
-#endif
\ No newline at end of file
--- /dev/null
+/**
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IINPUT_OBSERVER_H__
+#define __IINPUT_OBSERVER_H__
+
+#include "SingleoCommonTypes.h"
+
+namespace singleo
+{
+namespace input
+{
+class IInputObserver
+{
+public:
+ virtual ~IInputObserver() {};
+
+ virtual void inputFeedCb(BaseDataType &data) = 0;
+};
+
+} // input
+} // singleo
+
+#endif
#ifndef __IINPUT_SERVICE_H__
#define __IINPUT_SERVICE_H__
-#include <functional>
+#include "IInputObserver.h"
#include "InputTypes.h"
namespace singleo
public:
virtual ~IInputService() {};
- virtual void setUserCb(const InputServiceCallbackType &userCb, void *user_data) = 0;
+ virtual void registerObserver(IInputObserver *observer) = 0;
virtual void configure(CameraConfig &config) = 0;
virtual void capture(BaseDataType &data) = 0;
virtual void streamOn() = 0;
explicit InputCamera(CameraBackendType backend_type);
virtual ~InputCamera();
- void setUserCb(const InputServiceCallbackType &userCb, void *user_data) override;
+ void registerObserver(IInputObserver *observer) override;
void configure(CameraConfig &config) override;
void capture(BaseDataType &data) override;
void streamOn() override;
unsigned int y_resolution {};
};
-using InputServiceCallbackType = std::function<void(BaseDataType &data, void *user_data)>;
-
} // input
} // singleo
InputCamera::~InputCamera()
{}
-void InputCamera::setUserCb(const std::function<void(BaseDataType &data, void *user_data)> &userCb, void *user_data)
+void InputCamera::registerObserver(IInputObserver *observer)
{
- _input->setUserCb(userCb, user_data);
+ _input->registerObserver(observer);
}
void InputCamera::configure(CameraConfig &config)
#include "IInputService.h"
#include "SingleoInferenceTypes.h"
#include "InputTypes.h"
+#include "IInputObserver.h"
#include "ServiceDataType.h"
#include "DataTypes.h"
#include "AsyncManager.h"
{
namespace autozoom
{
-class AutoZoom : public IService
+class AutoZoom : public IService, public input::IInputObserver
{
private:
std::unique_ptr<TaskManager> _taskManager;
void *_user_data {};
public:
- explicit AutoZoom(input::InputConfigBase &config);
+ AutoZoom();
virtual ~AutoZoom();
- static IService *create(input::InputConfigBase &config)
+ static IService *create()
{
- return new AutoZoom(config);
+ return new AutoZoom();
}
// This function will be called by specific input service internally.
// Ps. caller has to provide captured data with concrete class object as data parameter.
- static void inputServiceCb(BaseDataType &data, void *user_data);
+ void inputFeedCb(BaseDataType &data) override;
+ void configure(input::InputConfigBase &config) override;
void add_input(BaseDataType &input_data) override;
void perform() override;
void performAsync() override;
void registerUserCallback(singleo_user_cb_t user_cb, void *user_data) override;
void unregisterUserCallback() override;
- std::unique_ptr<AsyncManager<ImageDataType, AutoZoomResult> > &getAsyncManager()
- {
- return _async_manager;
- }
-
- std::unique_ptr<IPostprocessor> &getPostprocessor()
- {
- return _postprocessor;
- }
-
- std::unique_ptr<TaskManager> &getTaskManager()
- {
- return _taskManager;
- }
+ void runTaskManager(BaseDataType &input_data);
};
} // autozoom
{
REGISTER_SERVICE(AutoZoom)
-AutoZoom::AutoZoom(InputConfigBase &config)
+AutoZoom::AutoZoom()
{
// In default, we will use Inference service factory for Mediavision to use Mediavision framework
// for inference service. TODO. introduce meta config file approach later.
face_detection_node->setInferenceService(factory->createFaceDetection());
_taskManager = make_unique<TaskManager>();
_taskManager->addNode(face_detection_node);
+ _postprocessor = make_unique<Postprocessor>();
+}
+void AutoZoom::configure(InputConfigBase &config)
+{
// Create InputCamera service if input service type is CAMERA.
if (config._input_feed_type == InputFeedType::CAMERA) {
CameraConfig cameraConfig;
}
_input_service = make_unique<InputCamera>(cameraConfig.backend_type);
- _input_service->setUserCb(inputServiceCb, static_cast<void *>(this));
+ _input_service->registerObserver(this);
_input_service->configure(cameraConfig);
SINGLEO_LOGD("Camera input service has been initialized.");
}
-
- _postprocessor = make_unique<Postprocessor>();
}
AutoZoom::~AutoZoom()
_input_service->streamOff();
}
-void AutoZoom::inputServiceCb(BaseDataType &data, void *user_data)
+void AutoZoom::inputFeedCb(BaseDataType &data)
{
- auto auto_zoom = static_cast<AutoZoom *>(user_data);
-
ImagePreprocessor preprocessor(data);
ImageDataType preprocessed = dynamic_cast<ImageDataType &>(preprocessor.getData());
ImageDataType copied = preprocessed;
copied.ptr = new unsigned char[buffer_size];
memcpy(copied.ptr, preprocessed.ptr, buffer_size);
- if (auto_zoom->_user_cb) {
+ if (_user_cb) {
// if postprocessor isn't in progress, postprocess current camera preview image.
- if (!auto_zoom->getPostprocessor()->isWorking()) {
- ImageDataType zoom_data = dynamic_cast<ImageDataType &>(auto_zoom->getPostprocessor()->getOutput(copied));
+ if (!_postprocessor->isWorking()) {
+ ImageDataType zoom_data = dynamic_cast<ImageDataType &>(_postprocessor->getOutput(copied));
- auto_zoom->_user_cb(zoom_data.ptr, zoom_data.width, zoom_data.height, zoom_data.byte_per_pixel,
- auto_zoom->_user_data);
+ _user_cb(zoom_data.ptr, zoom_data.width, zoom_data.height, zoom_data.byte_per_pixel, _user_data);
} else {
- auto_zoom->_user_cb(copied.ptr, copied.width, copied.height, copied.byte_per_pixel, auto_zoom->_user_data);
+ _user_cb(copied.ptr, copied.width, copied.height, copied.byte_per_pixel, _user_data);
}
}
// Make sure to release copied buffer if incoming queue isn't empty so skipped pushing the buffer.
- if (auto_zoom->getAsyncManager()->pushInput(copied) != SINGLEO_ERROR_NONE)
+ if (_async_manager->pushInput(copied) != SINGLEO_ERROR_NONE)
delete copied.ptr;
}
}
}
+void AutoZoom::runTaskManager(BaseDataType &input_data)
+{
+ _taskManager->addInput(input_data);
+ _taskManager->run();
+
+ updateResult(input_data);
+}
+
void AutoZoom::perform()
{
ImagePreprocessor preprocessor;
auto data = dynamic_pointer_cast<FileDataType>(result);
preprocessor.update(*data);
- _taskManager->addInput(preprocessor.getData());
- _taskManager->run();
- updateResult(preprocessor.getData());
+ runTaskManager(preprocessor.getData());
return;
} else {
ImageDataType input_data;
preprocessor.update(input_data);
}
- _taskManager->addInput(preprocessor.getData());
- _taskManager->run();
- updateResult(preprocessor.getData());
+ runTaskManager(preprocessor.getData());
}
void AutoZoom::performAsync()
_async_manager->registerInvokeCb(this, [this](IService *service, BaseDataType &data) {
auto auto_zoom = static_cast<AutoZoom *>(service);
- auto_zoom->getTaskManager()->addInput(data);
- auto_zoom->getTaskManager()->run();
- auto_zoom->updateResult(data);
+ auto_zoom->runTaskManager(data);
// This buffer was allocated and copied in inputServiceCb callback.
// So make sure to release this buffer here.
#include "singleo_native_capi_internal.h"
#include "SingleoCommonTypes.h"
+#include "InputTypes.h"
#include "IPreprocessor.h"
namespace singleo
virtual ~IService() {};
virtual void add_input(BaseDataType &input_data) = 0;
+ virtual void configure(input::InputConfigBase &config) = 0;
virtual void perform() = 0;
virtual void performAsync() = 0;
virtual void getResultCnt(unsigned int *cnt) = 0;
class ServiceFactory
{
public:
- using createFunc = IService *(*) (input::InputConfigBase &config);
+ using createFunc = IService *(*) ();
static std::map<std::string, createFunc> __service_table;
- static IService *create(const std::string &className, input::InputConfigBase &config)
+ static IService *create(const std::string &className)
{
auto it = __service_table.find(className);
if (it != __service_table.end())
- return it->second(config);
+ return it->second();
return nullptr;
}
async_mode = parser.getAsyncMode();
if (ServiceType::AUTO_ZOOM == parser.getServiceType()) {
- service_handle = ServiceFactory::create("AutoZoom", parser.getConfig(parser.getInputFeedType()));
+ service_handle = ServiceFactory::create("AutoZoom");
if (!service_handle)
throw InvalidOperation("Failed to create AutoZoom service.");
+ service_handle->configure(parser.getConfig(parser.getInputFeedType()));
+
SINGLEO_LOGD("AutoZoom service has been created.");
service_type = ServiceType::AUTO_ZOOM;
} else {