libaifw_api_vision_xr_adapter using dlopen 91/315491/4
authorhongyanting <yanting.hong@samsung.com>
Fri, 29 Nov 2024 07:17:21 +0000 (15:17 +0800)
committerBot Blink <blinkbot@samsung.com>
Fri, 6 Dec 2024 10:05:22 +0000 (10:05 +0000)
Change-Id: Ia6dc44cf9f277a68803cca3628453a39ef723ee7
Signed-off-by: hongyanting <yanting.hong@samsung.com>
tizen_src/build/BUILD.gn
tizen_src/chromium_impl/webai/content/ai_processor_video_impl.cc
tizen_src/chromium_impl/webai/content/ai_processor_video_impl.h
tizen_src/chromium_impl/webai/content/ai_video_frame_buffer.h
tizen_src/chromium_impl/webai/content/dlibwrapper.cc [new file with mode: 0644]
tizen_src/chromium_impl/webai/content/dlibwrapper.h [new file with mode: 0644]
tizen_src/chromium_impl/webai/tizen_ai.gni

index b1edd242456be3f8e64290b399b43c7053531b01..d23d4711e76da91d17d7e2d33bc6955403edb15c 100644 (file)
@@ -6,12 +6,6 @@ import("//tizen_src/build/config/linux/pkg_config.gni")
 import("//tizen_src/build/config/tizen_features.gni")
 
 
-config("aifw-api") {
-  if (tizen_ai) {
-    libs = [ "aifw_api_vision_xr_adapter" ]
-  }
-}
-
 tizen_pkg_config("libaifw-api") {
   packages = []
   if (tizen_ai) {
index a1eebedaf8923f61f38319cc2fda1e5eff72505c..4faa34c5216d4957b265985551b8c2fc06e10563 100644 (file)
@@ -7,6 +7,7 @@
 #include "base/json/json_writer.h"
 #include "media/base/format_utils.h"
 #include "tizen_src/chromium_impl/webai/common/ai_logger.h"
+#include "webai/content/dlibwrapper.h"
 
 namespace {
 
@@ -34,9 +35,12 @@ std::string AiVideoModelToJsonString(const blink::AiVideoModel& model,
 }  // namespace
 
 namespace content {
-
 void AiProcessorVideoImpl::AdapterDeleter::operator()(xr_adapter_h adapter) {
-  CheckResult(xr_adapter_destroy(adapter), AIFW_RESULT_SUCCESS, false);
+  auto fun = reinterpret_cast<xr_adapter_destroy>(
+      Dlibwapper::Getinstance()->Getxrfwapi("xr_adapter_destroy"));
+  if (fun) {
+    CheckResult(fun(adapter), AIFW_RESULT_SUCCESS, false);
+  }
 }
 
 AiProcessorVideoImpl::AiProcessorVideoImpl(
@@ -45,7 +49,11 @@ AiProcessorVideoImpl::AiProcessorVideoImpl(
   TRACE_EVENT0("webai", "AiProcessorVideoImpl::AiProcessorVideoImpl");
   task_runner_ = base::SequencedTaskRunner::GetCurrentDefault();
   xr_adapter_h handle{};
-  CheckResult(xr_adapter_create(&handle), AIFW_RESULT_SUCCESS, false);
+  auto fun = reinterpret_cast<xr_adapter_create>(
+      Dlibwapper::Getinstance()->Getxrfwapi("xr_adapter_create"));
+  if (fun) {
+    CheckResult(fun(&handle), AIFW_RESULT_SUCCESS, false);
+  }
   adapter_.reset(handle);
   state_ = AdapterState::kStopped;
 }
@@ -96,9 +104,14 @@ void AiProcessorVideoImpl::ProcessVideo(
   }
 
   TRACE_EVENT_BEGIN0("webai", "xr_adapter_submit_packet");
-  CheckResult(xr_adapter_submit_packet(adapter_.get(), input_buffer->packet(),
-                                       output_buffer->packet()),
-              AIFW_RESULT_SUCCESS, false);
+
+  auto fun = reinterpret_cast<xr_adapter_submit_packet>(
+      Dlibwapper::Getinstance()->Getxrfwapi("xr_adapter_submit_packet"));
+  if (fun) {
+    CheckResult(
+        fun(adapter_.get(), input_buffer->packet(), output_buffer->packet()),
+        AIFW_RESULT_SUCCESS, false);
+  }
   TRACE_EVENT_END0("webai", "xr_adapter_submit_packet");
 }
 
@@ -128,18 +141,25 @@ void AiProcessorVideoImpl::Start(const blink::AiConfiguration& configure) {
 
   {
     TRACE_EVENT0("webai", "xr_adapter_set_frame_ready_cb");
-    CheckResult(
-        xr_adapter_set_frame_ready_cb(adapter_.get(), XrFrameReadyCb, this),
-        AIFW_RESULT_SUCCESS, false);
+
+    auto fun = reinterpret_cast<xr_adapter_set_frame_ready_cb>(
+        Dlibwapper::Getinstance()->Getxrfwapi("xr_adapter_set_frame_ready_cb"));
+    if (fun) {
+      CheckResult(fun(adapter_.get(), XrFrameReadyCb, this),
+                  AIFW_RESULT_SUCCESS, false);
+    }
   }
 
   CheckResult(CreateJsonConfiguration(configure), true, false);
-
   {
     TRACE_EVENT0("webai", "xr_adapter_init");
-    CheckResult(xr_adapter_init(adapter_.get(), config_json_.value().c_str(),
-                                config_json_.value().length()),
-                AIFW_RESULT_SUCCESS, false);
+    auto fun = reinterpret_cast<xr_adapter_init>(
+        Dlibwapper::Getinstance()->Getxrfwapi("xr_adapter_init"));
+    if (fun) {
+      CheckResult(fun(adapter_.get(), config_json_.value().c_str(),
+                      config_json_.value().length()),
+                  AIFW_RESULT_SUCCESS, false);
+    }
   }
   cfg_ = configure;
   buffer_pool_ = base::MakeRefCounted<AiVideoFrameBufferPool>();
@@ -153,8 +173,11 @@ void AiProcessorVideoImpl::Stop() {
     AI_LOG(ERROR) << "Invalid state:" << static_cast<int>(state_);
     return;
   }
-
-  CheckResult(xr_adapter_deinit(adapter_.get()), AIFW_RESULT_SUCCESS, true);
+  auto fun = reinterpret_cast<xr_adapter_deinit>(
+      Dlibwapper::Getinstance()->Getxrfwapi("xr_adapter_deinit"));
+  if (fun) {
+    CheckResult(fun(adapter_.get()), AIFW_RESULT_SUCCESS, true);
+  }
 
   // Release all buffers.
   constexpr gfx::Size max_size{4096, 4096};
index e39a29a1329a25f2cb7f1f5e0a95652cafef20d9..f7f5c37df51069c7315c95d24c54b5ed17f04d99 100644 (file)
@@ -15,8 +15,6 @@
 #include "tizen_src/chromium_impl/webai/content/ai_impl_base.h"
 #include "tizen_src/chromium_impl/webai/content/ai_video_frame_buffer.h"
 
-#include <aifw_api/vision/xr_adapter.h>
-
 namespace content {
 
 class AiProcessorVideoImpl;
@@ -73,4 +71,4 @@ class CONTENT_EXPORT AiProcessorVideoImpl final
 
 }  // namespace content
 
-#endif  // WEBAI_CONTENT_AI_PROCESSOR_VIDEO_IMPL_H_
\ No newline at end of file
+#endif  // WEBAI_CONTENT_AI_PROCESSOR_VIDEO_IMPL_H_
index e7585c15d778f21fa87405af4a3cc7b914009c84..ca287316f5ddf8977e8e7a4355b0d5bcf578f1d1 100644 (file)
@@ -19,8 +19,8 @@
 #include "ui/gfx/tbm_buffer_handle.h"
 #include "webai/content/video_processor_helpers.h"
 
-#include <aifw_api/vision/xr_adapter.h>
 #include <media_packet.h>
+#include "webai/content/dlibwrapper.h"
 
 namespace media {
 class VideoFrame;
diff --git a/tizen_src/chromium_impl/webai/content/dlibwrapper.cc b/tizen_src/chromium_impl/webai/content/dlibwrapper.cc
new file mode 100644 (file)
index 0000000..edf5091
--- /dev/null
@@ -0,0 +1,89 @@
+#include "webai/content/dlibwrapper.h"
+#include <dlfcn.h>
+#include "tizen_src/chromium_impl/webai/common/ai_logger.h"
+
+namespace content {
+vector<string> sysnamevec{"xr_adapter_create",
+                          "xr_adapter_destroy",
+                          "xr_adapter_init",
+                          "xr_adapter_deinit",
+                          "xr_adapter_set_frame_ready_cb",
+                          "xr_adapter_submit_packet"};
+#define XRFW_LIBRARY "libaifw_api_vision_xr_adapter.so"
+
+std::shared_ptr<Dlibwapper> Dlibwapper::instance_ = nullptr;
+std::mutex Dlibwapper::mtx_;
+
+Dlibwapper::Dlibwapper() {
+  AI_LOG(INFO) << __func__;
+  initdone_ = Init();
+}
+Dlibwapper::~Dlibwapper() {
+  AI_LOG(INFO) << __func__;
+  bool ret = Close();
+  if (!ret) {
+    AI_LOG(ERROR) << "close failed: " << errmsg_;
+  }
+}
+bool Dlibwapper::Init() {
+  AI_LOG(INFO) << __func__;
+  bool ret = Open();
+  if (!ret) {
+    AI_LOG(ERROR) << "open failed: " << errmsg_;
+    return false;
+  }
+  ret = Loadsymboal();
+  if (!ret) {
+    AI_LOG(ERROR) << "Loadsymboal failed";
+    return false;
+  }
+  return true;
+}
+
+bool Dlibwapper::Open() {
+  AI_LOG(INFO) << __func__;
+  handle_ = dlopen(XRFW_LIBRARY, RTLD_LAZY);
+  if (handle_ != nullptr)
+    return true;
+  errmsg_ = dlerror();
+  return false;
+}
+
+bool Dlibwapper::Close() {
+  AI_LOG(INFO) << __func__;
+  if (handle_ == nullptr)
+    return true;
+
+  int err = dlclose(handle_);
+  if (err != 0) {
+    errmsg_ = dlerror();
+    AI_LOG(ERROR) << "dlclose failed " << errmsg_;
+    return false;
+  }
+  handle_ = nullptr;
+  return true;
+}
+bool Dlibwapper::Loadsymboal() {
+  AI_LOG(INFO) << __func__;
+  for (size_t k = 0; k < sysnamevec.size(); k++) {
+    sys_map_[sysnamevec[k].c_str()] = dlsym(handle_, sysnamevec[k].c_str());
+    if (sys_map_[sysnamevec[k].c_str()] == nullptr) {
+      AI_LOG(ERROR) << "Load sysmboal fail " << sysnamevec[k].c_str();
+      return false;
+    }
+  }
+  return true;
+}
+void* Dlibwapper::Getxrfwapi(const char* name) {
+  AI_LOG(INFO) << __func__;
+  int trycout = 3;
+  while (!initdone_ && trycout--) {
+    initdone_ = Init();
+  }
+  if (!initdone_) {
+    AI_LOG(ERROR) << "init Dlibwapper failed,can not call xrfwapi return";
+    return nullptr;
+  }
+  return sys_map_[name];
+}
+}  // namespace content
diff --git a/tizen_src/chromium_impl/webai/content/dlibwrapper.h b/tizen_src/chromium_impl/webai/content/dlibwrapper.h
new file mode 100644 (file)
index 0000000..fe2573b
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef WEBAI_CONTENT_DLIBWRAPPER__
+#define WEBAI_CONTENT_DLIBWRAPPER__
+#include <media_packet.h>
+#include <memory>
+#include <mutex>
+#include <string>
+#include <unordered_map>
+#include <vector>
+#include "media/base/format_utils.h"
+#include "webai/common/ai_logger.h"
+using namespace std;
+
+typedef void* xr_adapter_h;
+typedef enum {
+  AIFW_RESULT_SUCCESS = 1,
+  AIFW_RESULT_FAIL = 0,
+} aifw_result_e;
+
+typedef enum {
+  XR_ADAPTER_ERROR_NONE,
+  XR_ADAPTER_ERROR_PROCESS_FAIL
+} xr_adapter_error_type_e;
+
+typedef void (*xr_adapter_frame_ready_cb)(media_packet_h packet,
+                                          xr_adapter_error_type_e error,
+                                          void* user_data);
+typedef aifw_result_e (*xr_adapter_create)(xr_adapter_h* handle);
+typedef aifw_result_e (*xr_adapter_destroy)(xr_adapter_h handle);
+typedef aifw_result_e (*xr_adapter_init)(xr_adapter_h handle,
+                                         const char* config,
+                                         const int config_length);
+typedef aifw_result_e (*xr_adapter_deinit)(xr_adapter_h handle);
+typedef aifw_result_e (*xr_adapter_set_frame_ready_cb)(
+    xr_adapter_h handle,
+    xr_adapter_frame_ready_cb frame_ready_cb,
+    void* userdata);
+typedef aifw_result_e (*xr_adapter_submit_packet)(xr_adapter_h handle,
+                                                  media_packet_h input_packet,
+                                                  media_packet_h output_packet);
+
+namespace content {
+class Dlibwapper {
+ public:
+  Dlibwapper();
+  ~Dlibwapper();
+  static std::shared_ptr<Dlibwapper> Getinstance() {
+    AI_LOG(INFO) << __func__;
+    if (!instance_) {
+      lock_guard<std::mutex> guard(mtx_);
+      if (!instance_) {
+        instance_ = std::make_shared<Dlibwapper>();
+      }
+    }
+    return instance_;
+  }
+
+  void* Getxrfwapi(const char* name);
+
+ private:
+  static std::mutex mtx_;
+  static std::shared_ptr<Dlibwapper> instance_;
+
+  bool Init();
+  bool Open();
+  bool Close();
+  bool Loadsymboal();
+  Dlibwapper(const Dlibwapper&) = delete;
+  Dlibwapper& operator=(const Dlibwapper&) = delete;
+  void* handle_;
+  std::string errmsg_;
+  bool initdone_;
+  unordered_map<string, void*> sys_map_;
+};
+}  // namespace content
+#endif  // WEBAI_CONTENT_DLIBWRAPPER__
index ed280700490b9a4b677571687a0b1d108ca9f3eb..b68d01aab7726e552ea937d049bfe1bf81b2d2cc 100644 (file)
@@ -70,6 +70,8 @@ if (tizen_ai) {
     "//tizen_src/chromium_impl/webai/content/ai_processor_video_impl.h",
     "//tizen_src/chromium_impl/webai/content/ai_video_frame_buffer.cc",
     "//tizen_src/chromium_impl/webai/content/ai_video_frame_buffer.h",
+    "//tizen_src/chromium_impl/webai/content/dlibwrapper.cc",
+    "//tizen_src/chromium_impl/webai/content/dlibwrapper.h",
     "//tizen_src/chromium_impl/webai/content/mojo_broker_impl.cc",
     "//tizen_src/chromium_impl/webai/content/mojo_broker_impl.h",
     "//tizen_src/chromium_impl/webai/content/video_processor_helpers.cc",
@@ -77,7 +79,6 @@ if (tizen_ai) {
   ]
 
   tizen_ai_content_browser_configs += [
-    "//tizen_src/build:aifw-api",
     "//tizen_src/build:libaifw-api",
   ]