-# singleo
-SingleO AI Service Framework
+# SingleO(Single Oriented) AI Service Framework
+
+## Introduction
+
+Existing machine learning frameworks running on the device have so far provided a managed API set that simply executes models and decodes results to deliver them to users. However, with the improvement of embedded hardware performance and development of AI technology, various AI models have been developed and released to meet more complex scenarios on device, and making it very complicated to implement applications to perform this. Therefore, multi-modality on device has become an essential requirement.
+
+To respond to these changes, the **SingleO** AI service framework supports multiple input sources and provides interfaces to easily handle various models. It is designed and implemented to enable input feeding through various input sources such as camera, audio, text, sensor and so on, and also to enable various machine learning frameworks such as media vision, NNStreamer, Mediapipe, and even private external frameworks in a platform-independent manner. In addition, **SingleO** AI service framework has been developed to provide various AI services which are combined with various inputs and even models to users with easy-to-use API set.
+
+## Features
+
+* Platform-independent deployment support for Mediavision, NNStreamer, Mediapipe, and other private external machine learning frameworks
+* Support for various input - such as camera, audio, text, sensor and etc - feeding services
+* Multi-Modality support
+* Provides a unified API set for various AI services
+* Build system support for feature-unit builds
+* Asynchronous behavior API support for optimal performance
+* Postprocessed Camera preview bypass support
+
+## How to use AI Service API
+
+Below example shows how Autozoom Service API is used by application.
+
+```
+#include <string.h>
+#include <memory>
+
+#include "singleo_native_capi_internal.h"
+#include "singleo_error.h"
+
+using namespace std;
+
+struct Context {
+ singleo_service_h handle {};
+};
+
+void user_callback(unsigned char *buffer, unsigned int width, unsigned int height, unsigned int bytes_per_pixel,
+ void *user_data)
+{
+ Context *context = static_cast<Context *>(user_data);
+
+ // 'buffer' contains postprocessed image data for Autozoom service which emulates autozoom camera device using face or object detection service internally
+}
+
+int main()
+{
+ Context context {};
+
+ int ret = singleo_service_create("service=auto_zoom, input_feed=camera, camera_id=0, fps=30, async=1", &context.handle);
+ ...
+ ret = singleo_service_register_user_callback(context.handle, user_callback, &context);
+ ...
+ ret = singleo_service_perform(context.handle);
+ ...
+ ret = singleo_service_unregister_user_callback(context.handle);
+ ...
+ ret = singleo_service_destroy(context.handle);
+ ...
+ return 0;
+}
+```
\ No newline at end of file