chore: Change line width to 140 in C++
This commit is contained in:
		| @@ -22,8 +22,7 @@ inline std::string getEglErrorIfAny() { | ||||
|  | ||||
| class OpenGLError : public std::runtime_error { | ||||
| public: | ||||
|   explicit OpenGLError(const std::string&& message) | ||||
|       : std::runtime_error(message + getEglErrorIfAny()) {} | ||||
|   explicit OpenGLError(const std::string&& message) : std::runtime_error(message + getEglErrorIfAny()) {} | ||||
|  | ||||
|   static inline void checkIfError(const std::string&& message) { | ||||
|     auto error = getEglErrorIfAny(); | ||||
|   | ||||
| @@ -17,9 +17,7 @@ | ||||
|  | ||||
| namespace vision { | ||||
|  | ||||
| std::unique_ptr<OpenGLRenderer> | ||||
| OpenGLRenderer::CreateWithWindowSurface(std::shared_ptr<OpenGLContext> context, | ||||
|                                         ANativeWindow* surface) { | ||||
| std::unique_ptr<OpenGLRenderer> OpenGLRenderer::CreateWithWindowSurface(std::shared_ptr<OpenGLContext> context, ANativeWindow* surface) { | ||||
|   return std::unique_ptr<OpenGLRenderer>(new OpenGLRenderer(std::move(context), surface)); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -24,8 +24,7 @@ public: | ||||
|    * Note: The `surface` is considered moved, and the OpenGL context will release it when it is | ||||
|    * being deleted. | ||||
|    */ | ||||
|   static std::unique_ptr<OpenGLRenderer> | ||||
|   CreateWithWindowSurface(std::shared_ptr<OpenGLContext> context, ANativeWindow* surface); | ||||
|   static std::unique_ptr<OpenGLRenderer> CreateWithWindowSurface(std::shared_ptr<OpenGLContext> context, ANativeWindow* surface); | ||||
|   /** | ||||
|    * Destroy the OpenGL Context. This needs to be called on the same thread that `use()` was called. | ||||
|    */ | ||||
|   | ||||
| @@ -19,13 +19,11 @@ | ||||
|  | ||||
| namespace vision { | ||||
|  | ||||
| jni::local_ref<VideoPipeline::jhybriddata> | ||||
| VideoPipeline::initHybrid(jni::alias_ref<jhybridobject> jThis, int width, int height) { | ||||
| jni::local_ref<VideoPipeline::jhybriddata> VideoPipeline::initHybrid(jni::alias_ref<jhybridobject> jThis, int width, int height) { | ||||
|   return makeCxxInstance(jThis, width, height); | ||||
| } | ||||
|  | ||||
| VideoPipeline::VideoPipeline(jni::alias_ref<jhybridobject> jThis, int width, int height) | ||||
|     : _javaPart(jni::make_global(jThis)) { | ||||
| VideoPipeline::VideoPipeline(jni::alias_ref<jhybridobject> jThis, int width, int height) : _javaPart(jni::make_global(jThis)) { | ||||
|   _width = width; | ||||
|   _height = height; | ||||
|   _context = OpenGLContext::CreateWithOffscreenSurface(); | ||||
| @@ -108,14 +106,10 @@ void VideoPipeline::onFrame(jni::alias_ref<jni::JArrayFloat> transformMatrixPara | ||||
| void VideoPipeline::registerNatives() { | ||||
|   registerHybrid({ | ||||
|       makeNativeMethod("initHybrid", VideoPipeline::initHybrid), | ||||
|       makeNativeMethod("setFrameProcessorOutputSurface", | ||||
|                        VideoPipeline::setFrameProcessorOutputSurface), | ||||
|       makeNativeMethod("removeFrameProcessorOutputSurface", | ||||
|                        VideoPipeline::removeFrameProcessorOutputSurface), | ||||
|       makeNativeMethod("setRecordingSessionOutputSurface", | ||||
|                        VideoPipeline::setRecordingSessionOutputSurface), | ||||
|       makeNativeMethod("removeRecordingSessionOutputSurface", | ||||
|                        VideoPipeline::removeRecordingSessionOutputSurface), | ||||
|       makeNativeMethod("setFrameProcessorOutputSurface", VideoPipeline::setFrameProcessorOutputSurface), | ||||
|       makeNativeMethod("removeFrameProcessorOutputSurface", VideoPipeline::removeFrameProcessorOutputSurface), | ||||
|       makeNativeMethod("setRecordingSessionOutputSurface", VideoPipeline::setRecordingSessionOutputSurface), | ||||
|       makeNativeMethod("removeRecordingSessionOutputSurface", VideoPipeline::removeRecordingSessionOutputSurface), | ||||
|       makeNativeMethod("getInputTextureId", VideoPipeline::getInputTextureId), | ||||
|       makeNativeMethod("onBeforeFrame", VideoPipeline::onBeforeFrame), | ||||
|       makeNativeMethod("onFrame", VideoPipeline::onFrame), | ||||
|   | ||||
| @@ -21,8 +21,7 @@ using namespace facebook; | ||||
| class VideoPipeline : public jni::HybridClass<VideoPipeline> { | ||||
| public: | ||||
|   static auto constexpr kJavaDescriptor = "Lcom/mrousavy/camera/core/VideoPipeline;"; | ||||
|   static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis, int width, | ||||
|                                                 int height); | ||||
|   static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis, int width, int height); | ||||
|   static void registerNatives(); | ||||
|  | ||||
| public: | ||||
|   | ||||
| @@ -16,8 +16,7 @@ namespace vision { | ||||
|  | ||||
| using namespace facebook; | ||||
|  | ||||
| FrameHostObject::FrameHostObject(const jni::alias_ref<JFrame::javaobject>& frame) | ||||
|     : frame(make_global(frame)) {} | ||||
| FrameHostObject::FrameHostObject(const jni::alias_ref<JFrame::javaobject>& frame) : frame(make_global(frame)) {} | ||||
|  | ||||
| FrameHostObject::~FrameHostObject() { | ||||
|   // Hermes' Garbage Collector (Hades GC) calls destructors on a separate Thread | ||||
| @@ -51,29 +50,25 @@ jsi::Value FrameHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID& pr | ||||
|   auto name = propName.utf8(runtime); | ||||
|  | ||||
|   if (name == "incrementRefCount") { | ||||
|     jsi::HostFunctionType incrementRefCount = [=](jsi::Runtime& runtime, const jsi::Value& thisArg, | ||||
|                                                   const jsi::Value* args, | ||||
|     jsi::HostFunctionType incrementRefCount = [=](jsi::Runtime& runtime, const jsi::Value& thisArg, const jsi::Value* args, | ||||
|                                                   size_t count) -> jsi::Value { | ||||
|       // Increment retain count by one. | ||||
|       this->frame->incrementRefCount(); | ||||
|       return jsi::Value::undefined(); | ||||
|     }; | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "incrementRefCount"), 0, incrementRefCount); | ||||
|     return jsi::Function::createFromHostFunction(runtime, jsi::PropNameID::forUtf8(runtime, "incrementRefCount"), 0, incrementRefCount); | ||||
|   } | ||||
|   if (name == "decrementRefCount") { | ||||
|     auto decrementRefCount = [=](jsi::Runtime& runtime, const jsi::Value& thisArg, | ||||
|                                  const jsi::Value* args, size_t count) -> jsi::Value { | ||||
|     auto decrementRefCount = [=](jsi::Runtime& runtime, const jsi::Value& thisArg, const jsi::Value* args, size_t count) -> jsi::Value { | ||||
|       // Decrement retain count by one. If the retain count is zero, the Frame gets closed. | ||||
|       this->frame->decrementRefCount(); | ||||
|       return jsi::Value::undefined(); | ||||
|     }; | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "decrementRefCount"), 0, decrementRefCount); | ||||
|     return jsi::Function::createFromHostFunction(runtime, jsi::PropNameID::forUtf8(runtime, "decrementRefCount"), 0, decrementRefCount); | ||||
|   } | ||||
|   if (name == "toString") { | ||||
|     jsi::HostFunctionType toString = [=](jsi::Runtime& runtime, const jsi::Value& thisArg, | ||||
|                                          const jsi::Value* args, size_t count) -> jsi::Value { | ||||
|     jsi::HostFunctionType toString = [=](jsi::Runtime& runtime, const jsi::Value& thisArg, const jsi::Value* args, | ||||
|                                          size_t count) -> jsi::Value { | ||||
|       if (!this->frame) { | ||||
|         return jsi::String::createFromUtf8(runtime, "[closed frame]"); | ||||
|       } | ||||
| @@ -82,16 +77,14 @@ jsi::Value FrameHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID& pr | ||||
|       auto str = std::to_string(width) + " x " + std::to_string(height) + " Frame"; | ||||
|       return jsi::String::createFromUtf8(runtime, str); | ||||
|     }; | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "toString"), 0, toString); | ||||
|     return jsi::Function::createFromHostFunction(runtime, jsi::PropNameID::forUtf8(runtime, "toString"), 0, toString); | ||||
|   } | ||||
|   if (name == "toArrayBuffer") { | ||||
|     jsi::HostFunctionType toArrayBuffer = [=](jsi::Runtime& runtime, const jsi::Value& thisArg, | ||||
|                                               const jsi::Value* args, size_t count) -> jsi::Value { | ||||
|     jsi::HostFunctionType toArrayBuffer = [=](jsi::Runtime& runtime, const jsi::Value& thisArg, const jsi::Value* args, | ||||
|                                               size_t count) -> jsi::Value { | ||||
|       auto buffer = this->frame->toByteBuffer(); | ||||
|       if (!buffer->isDirect()) { | ||||
|         throw std::runtime_error( | ||||
|             "Failed to get byte content of Frame - array is not direct ByteBuffer!"); | ||||
|         throw std::runtime_error("Failed to get byte content of Frame - array is not direct ByteBuffer!"); | ||||
|       } | ||||
|       auto size = buffer->getDirectSize(); | ||||
|  | ||||
| @@ -102,10 +95,8 @@ jsi::Value FrameHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID& pr | ||||
|       } | ||||
|  | ||||
|       // Get from global JS cache | ||||
|       auto arrayBufferCache = | ||||
|           runtime.global().getPropertyAsObject(runtime, ARRAYBUFFER_CACHE_PROP_NAME); | ||||
|       auto arrayBuffer = vision::getTypedArray(runtime, arrayBufferCache) | ||||
|                              .get<vision::TypedArrayKind::Uint8ClampedArray>(runtime); | ||||
|       auto arrayBufferCache = runtime.global().getPropertyAsObject(runtime, ARRAYBUFFER_CACHE_PROP_NAME); | ||||
|       auto arrayBuffer = vision::getTypedArray(runtime, arrayBufferCache).get<vision::TypedArrayKind::Uint8ClampedArray>(runtime); | ||||
|       if (arrayBuffer.size(runtime) != size) { | ||||
|         arrayBuffer = vision::TypedArray<vision::TypedArrayKind::Uint8ClampedArray>(runtime, size); | ||||
|         runtime.global().setProperty(runtime, ARRAYBUFFER_CACHE_PROP_NAME, arrayBuffer); | ||||
| @@ -117,8 +108,7 @@ jsi::Value FrameHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID& pr | ||||
|  | ||||
|       return arrayBuffer; | ||||
|     }; | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "toArrayBuffer"), 0, toArrayBuffer); | ||||
|     return jsi::Function::createFromHostFunction(runtime, jsi::PropNameID::forUtf8(runtime, "toArrayBuffer"), 0, toArrayBuffer); | ||||
|   } | ||||
|  | ||||
|   if (name == "isValid") { | ||||
|   | ||||
| @@ -12,32 +12,27 @@ namespace vision { | ||||
|  | ||||
| using namespace facebook; | ||||
|  | ||||
| std::vector<jsi::PropNameID> | ||||
| FrameProcessorPluginHostObject::getPropertyNames(jsi::Runtime& runtime) { | ||||
| std::vector<jsi::PropNameID> FrameProcessorPluginHostObject::getPropertyNames(jsi::Runtime& runtime) { | ||||
|   std::vector<jsi::PropNameID> result; | ||||
|   result.push_back(jsi::PropNameID::forUtf8(runtime, std::string("call"))); | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| jsi::Value FrameProcessorPluginHostObject::get(jsi::Runtime& runtime, | ||||
|                                                const jsi::PropNameID& propName) { | ||||
| jsi::Value FrameProcessorPluginHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID& propName) { | ||||
|   auto name = propName.utf8(runtime); | ||||
|  | ||||
|   if (name == "call") { | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "call"), 2, | ||||
|         [=](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, | ||||
|             size_t count) -> jsi::Value { | ||||
|         [=](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, size_t count) -> jsi::Value { | ||||
|           // Frame is first argument | ||||
|           auto frameHostObject = | ||||
|               arguments[0].asObject(runtime).asHostObject<FrameHostObject>(runtime); | ||||
|           auto frameHostObject = arguments[0].asObject(runtime).asHostObject<FrameHostObject>(runtime); | ||||
|           auto frame = frameHostObject->frame; | ||||
|  | ||||
|           // Options are second argument (possibly undefined) | ||||
|           local_ref<JMap<jstring, jobject>> options = nullptr; | ||||
|           if (count > 1) { | ||||
|             options = | ||||
|                 JSIJNIConversion::convertJSIObjectToJNIMap(runtime, arguments[1].asObject(runtime)); | ||||
|             options = JSIJNIConversion::convertJSIObjectToJNIMap(runtime, arguments[1].asObject(runtime)); | ||||
|           } | ||||
|  | ||||
|           // Call actual plugin | ||||
|   | ||||
| @@ -16,8 +16,7 @@ using namespace facebook; | ||||
|  | ||||
| class FrameProcessorPluginHostObject : public jsi::HostObject { | ||||
| public: | ||||
|   explicit FrameProcessorPluginHostObject(jni::alias_ref<JFrameProcessorPlugin::javaobject> plugin) | ||||
|       : _plugin(make_global(plugin)) {} | ||||
|   explicit FrameProcessorPluginHostObject(jni::alias_ref<JFrameProcessorPlugin::javaobject> plugin) : _plugin(make_global(plugin)) {} | ||||
|   ~FrameProcessorPluginHostObject() {} | ||||
|  | ||||
| public: | ||||
|   | ||||
| @@ -20,8 +20,7 @@ namespace vision { | ||||
|  | ||||
| using namespace facebook; | ||||
|  | ||||
| jni::local_ref<jni::JMap<jstring, jobject>> | ||||
| JSIJNIConversion::convertJSIObjectToJNIMap(jsi::Runtime& runtime, const jsi::Object& object) { | ||||
| jni::local_ref<jni::JMap<jstring, jobject>> JSIJNIConversion::convertJSIObjectToJNIMap(jsi::Runtime& runtime, const jsi::Object& object) { | ||||
|   auto propertyNames = object.getPropertyNames(runtime); | ||||
|   auto size = propertyNames.size(runtime); | ||||
|   auto hashMap = jni::JHashMap<jstring, jobject>::create(); | ||||
| @@ -67,16 +66,14 @@ JSIJNIConversion::convertJSIObjectToJNIMap(jsi::Runtime& runtime, const jsi::Obj | ||||
|       } | ||||
|     } else { | ||||
|       auto stringRepresentation = value.toString(runtime).utf8(runtime); | ||||
|       throw std::runtime_error("Failed to convert jsi::Value to JNI value - unsupported type!" + | ||||
|                                stringRepresentation); | ||||
|       throw std::runtime_error("Failed to convert jsi::Value to JNI value - unsupported type!" + stringRepresentation); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return hashMap; | ||||
| } | ||||
|  | ||||
| jsi::Value JSIJNIConversion::convertJNIObjectToJSIValue(jsi::Runtime& runtime, | ||||
|                                                         const jni::local_ref<jobject>& object) { | ||||
| jsi::Value JSIJNIConversion::convertJNIObjectToJSIValue(jsi::Runtime& runtime, const jni::local_ref<jobject>& object) { | ||||
|   if (object == nullptr) { | ||||
|     // null | ||||
|  | ||||
| @@ -84,22 +81,19 @@ jsi::Value JSIJNIConversion::convertJNIObjectToJSIValue(jsi::Runtime& runtime, | ||||
|   } else if (object->isInstanceOf(jni::JBoolean::javaClassStatic())) { | ||||
|     // Boolean | ||||
|  | ||||
|     static const auto getBooleanFunc = | ||||
|         jni::findClassLocal("java/lang/Boolean")->getMethod<jboolean()>("booleanValue"); | ||||
|     static const auto getBooleanFunc = jni::findClassLocal("java/lang/Boolean")->getMethod<jboolean()>("booleanValue"); | ||||
|     auto boolean = getBooleanFunc(object.get()); | ||||
|     return jsi::Value(boolean == true); | ||||
|   } else if (object->isInstanceOf(jni::JDouble::javaClassStatic())) { | ||||
|     // Double | ||||
|  | ||||
|     static const auto getDoubleFunc = | ||||
|         jni::findClassLocal("java/lang/Double")->getMethod<jdouble()>("doubleValue"); | ||||
|     static const auto getDoubleFunc = jni::findClassLocal("java/lang/Double")->getMethod<jdouble()>("doubleValue"); | ||||
|     auto d = getDoubleFunc(object.get()); | ||||
|     return jsi::Value(d); | ||||
|   } else if (object->isInstanceOf(jni::JInteger::javaClassStatic())) { | ||||
|     // Integer | ||||
|  | ||||
|     static const auto getIntegerFunc = | ||||
|         jni::findClassLocal("java/lang/Integer")->getMethod<jint()>("intValue"); | ||||
|     static const auto getIntegerFunc = jni::findClassLocal("java/lang/Integer")->getMethod<jint()>("intValue"); | ||||
|     auto i = getIntegerFunc(object.get()); | ||||
|     return jsi::Value(i); | ||||
|   } else if (object->isInstanceOf(jni::JString::javaClassStatic())) { | ||||
|   | ||||
| @@ -14,11 +14,9 @@ namespace JSIJNIConversion { | ||||
|  | ||||
|   using namespace facebook; | ||||
|  | ||||
|   jni::local_ref<jni::JMap<jstring, jobject>> convertJSIObjectToJNIMap(jsi::Runtime& runtime, | ||||
|                                                                        const jsi::Object& object); | ||||
|   jni::local_ref<jni::JMap<jstring, jobject>> convertJSIObjectToJNIMap(jsi::Runtime& runtime, const jsi::Object& object); | ||||
|  | ||||
|   jsi::Value convertJNIObjectToJSIValue(jsi::Runtime& runtime, | ||||
|                                         const jni::local_ref<jobject>& object); | ||||
|   jsi::Value convertJNIObjectToJSIValue(jsi::Runtime& runtime, const jni::local_ref<jobject>& object); | ||||
|  | ||||
| } // namespace JSIJNIConversion | ||||
|  | ||||
|   | ||||
| @@ -27,8 +27,7 @@ namespace vision { | ||||
|  | ||||
| using namespace facebook; | ||||
|  | ||||
| VisionCameraProxy::VisionCameraProxy( | ||||
|     const jni::alias_ref<JVisionCameraProxy::javaobject>& javaProxy) { | ||||
| VisionCameraProxy::VisionCameraProxy(const jni::alias_ref<JVisionCameraProxy::javaobject>& javaProxy) { | ||||
|   _javaProxy = make_global(javaProxy); | ||||
| } | ||||
|  | ||||
| @@ -42,8 +41,7 @@ std::vector<jsi::PropNameID> VisionCameraProxy::getPropertyNames(jsi::Runtime& r | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| void VisionCameraProxy::setFrameProcessor(int viewTag, jsi::Runtime& runtime, | ||||
|                                           const jsi::Object& object) { | ||||
| void VisionCameraProxy::setFrameProcessor(int viewTag, jsi::Runtime& runtime, const jsi::Object& object) { | ||||
|   _javaProxy->cthis()->setFrameProcessor(viewTag, runtime, object); | ||||
| } | ||||
|  | ||||
| @@ -51,9 +49,7 @@ void VisionCameraProxy::removeFrameProcessor(int viewTag) { | ||||
|   _javaProxy->cthis()->removeFrameProcessor(viewTag); | ||||
| } | ||||
|  | ||||
| jsi::Value VisionCameraProxy::getFrameProcessorPlugin(jsi::Runtime& runtime, | ||||
|                                                       const std::string& name, | ||||
|                                                       const jsi::Object& jsOptions) { | ||||
| jsi::Value VisionCameraProxy::getFrameProcessorPlugin(jsi::Runtime& runtime, const std::string& name, const jsi::Object& jsOptions) { | ||||
|   auto options = JSIJNIConversion::convertJSIObjectToJNIMap(runtime, jsOptions); | ||||
|  | ||||
|   auto plugin = _javaProxy->cthis()->getFrameProcessorPlugin(name, options); | ||||
| @@ -68,8 +64,7 @@ jsi::Value VisionCameraProxy::get(jsi::Runtime& runtime, const jsi::PropNameID& | ||||
|   if (name == "setFrameProcessor") { | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "setFrameProcessor"), 1, | ||||
|         [this](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, | ||||
|                size_t count) -> jsi::Value { | ||||
|         [this](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, size_t count) -> jsi::Value { | ||||
|           auto viewTag = arguments[0].asNumber(); | ||||
|           auto object = arguments[1].asObject(runtime); | ||||
|           this->setFrameProcessor(static_cast<int>(viewTag), runtime, object); | ||||
| @@ -79,8 +74,7 @@ jsi::Value VisionCameraProxy::get(jsi::Runtime& runtime, const jsi::PropNameID& | ||||
|   if (name == "removeFrameProcessor") { | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "removeFrameProcessor"), 1, | ||||
|         [this](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, | ||||
|                size_t count) -> jsi::Value { | ||||
|         [this](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, size_t count) -> jsi::Value { | ||||
|           auto viewTag = arguments[0].asNumber(); | ||||
|           this->removeFrameProcessor(static_cast<int>(viewTag)); | ||||
|           return jsi::Value::undefined(); | ||||
| @@ -89,8 +83,7 @@ jsi::Value VisionCameraProxy::get(jsi::Runtime& runtime, const jsi::PropNameID& | ||||
|   if (name == "getFrameProcessorPlugin") { | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "getFrameProcessorPlugin"), 1, | ||||
|         [this](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, | ||||
|                size_t count) -> jsi::Value { | ||||
|         [this](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, size_t count) -> jsi::Value { | ||||
|           if (count < 1 || !arguments[0].isString()) { | ||||
|             throw jsi::JSError(runtime, "First argument needs to be a string (pluginName)!"); | ||||
|           } | ||||
| @@ -104,13 +97,11 @@ jsi::Value VisionCameraProxy::get(jsi::Runtime& runtime, const jsi::PropNameID& | ||||
|   return jsi::Value::undefined(); | ||||
| } | ||||
|  | ||||
| void VisionCameraInstaller::install(jni::alias_ref<jni::JClass>, | ||||
|                                     jni::alias_ref<JVisionCameraProxy::javaobject> proxy) { | ||||
| void VisionCameraInstaller::install(jni::alias_ref<jni::JClass>, jni::alias_ref<JVisionCameraProxy::javaobject> proxy) { | ||||
|   // global.VisionCameraProxy | ||||
|   auto visionCameraProxy = std::make_shared<VisionCameraProxy>(proxy); | ||||
|   jsi::Runtime& runtime = *proxy->cthis()->getJSRuntime(); | ||||
|   runtime.global().setProperty(runtime, "VisionCameraProxy", | ||||
|                                jsi::Object::createFromHostObject(runtime, visionCameraProxy)); | ||||
|   runtime.global().setProperty(runtime, "VisionCameraProxy", jsi::Object::createFromHostObject(runtime, visionCameraProxy)); | ||||
| } | ||||
|  | ||||
| } // namespace vision | ||||
|   | ||||
| @@ -28,8 +28,7 @@ public: | ||||
| private: | ||||
|   void setFrameProcessor(int viewTag, jsi::Runtime& runtime, const jsi::Object& frameProcessor); | ||||
|   void removeFrameProcessor(int viewTag); | ||||
|   jsi::Value getFrameProcessorPlugin(jsi::Runtime& runtime, const std::string& name, | ||||
|                                      const jsi::Object& options); | ||||
|   jsi::Value getFrameProcessorPlugin(jsi::Runtime& runtime, const std::string& name, const jsi::Object& options); | ||||
|  | ||||
| private: | ||||
|   jni::global_ref<JVisionCameraProxy::javaobject> _javaProxy; | ||||
| @@ -38,14 +37,11 @@ private: | ||||
|  | ||||
| class VisionCameraInstaller : public jni::JavaClass<VisionCameraInstaller> { | ||||
| public: | ||||
|   static auto constexpr kJavaDescriptor = | ||||
|       "Lcom/mrousavy/camera/frameprocessor/VisionCameraInstaller;"; | ||||
|   static auto constexpr kJavaDescriptor = "Lcom/mrousavy/camera/frameprocessor/VisionCameraInstaller;"; | ||||
|   static void registerNatives() { | ||||
|     javaClassStatic()->registerNatives( | ||||
|         {makeNativeMethod("install", VisionCameraInstaller::install)}); | ||||
|     javaClassStatic()->registerNatives({makeNativeMethod("install", VisionCameraInstaller::install)}); | ||||
|   } | ||||
|   static void install(jni::alias_ref<jni::JClass> clazz, | ||||
|                       jni::alias_ref<JVisionCameraProxy::javaobject> proxy); | ||||
|   static void install(jni::alias_ref<jni::JClass> clazz, jni::alias_ref<JVisionCameraProxy::javaobject> proxy); | ||||
| }; | ||||
|  | ||||
| } // namespace vision | ||||
|   | ||||
| @@ -22,8 +22,7 @@ void JFrameProcessor::registerNatives() { | ||||
|  | ||||
| using TSelf = jni::local_ref<JFrameProcessor::javaobject>; | ||||
|  | ||||
| JFrameProcessor::JFrameProcessor(std::shared_ptr<RNWorklet::JsiWorklet> worklet, | ||||
|                                  std::shared_ptr<RNWorklet::JsiWorkletContext> context) { | ||||
| JFrameProcessor::JFrameProcessor(std::shared_ptr<RNWorklet::JsiWorklet> worklet, std::shared_ptr<RNWorklet::JsiWorkletContext> context) { | ||||
|   _workletContext = std::move(context); | ||||
|   _workletInvoker = std::make_shared<RNWorklet::WorkletInvoker>(worklet); | ||||
| } | ||||
| @@ -33,8 +32,7 @@ TSelf JFrameProcessor::create(const std::shared_ptr<RNWorklet::JsiWorklet>& work | ||||
|   return JFrameProcessor::newObjectCxxArgs(worklet, context); | ||||
| } | ||||
|  | ||||
| void JFrameProcessor::callWithFrameHostObject( | ||||
|     const std::shared_ptr<FrameHostObject>& frameHostObject) const { | ||||
| void JFrameProcessor::callWithFrameHostObject(const std::shared_ptr<FrameHostObject>& frameHostObject) const { | ||||
|   // Call the Frame Processor on the Worklet Runtime | ||||
|   jsi::Runtime& runtime = _workletContext->getWorkletRuntime(); | ||||
|  | ||||
| @@ -50,11 +48,8 @@ void JFrameProcessor::callWithFrameHostObject( | ||||
|     const std::string& message = jsError.getMessage(); | ||||
|  | ||||
|     _workletContext->invokeOnJsThread([message](jsi::Runtime& jsRuntime) { | ||||
|       auto logFn = jsRuntime.global() | ||||
|                        .getPropertyAsObject(jsRuntime, "console") | ||||
|                        .getPropertyAsFunction(jsRuntime, "error"); | ||||
|       logFn.call(jsRuntime, jsi::String::createFromUtf8( | ||||
|                                 jsRuntime, "Frame Processor threw an error: " + message)); | ||||
|       auto logFn = jsRuntime.global().getPropertyAsObject(jsRuntime, "console").getPropertyAsFunction(jsRuntime, "error"); | ||||
|       logFn.call(jsRuntime, jsi::String::createFromUtf8(jsRuntime, "Frame Processor threw an error: " + message)); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -25,9 +25,8 @@ struct JFrameProcessor : public jni::HybridClass<JFrameProcessor> { | ||||
| public: | ||||
|   static auto constexpr kJavaDescriptor = "Lcom/mrousavy/camera/frameprocessor/FrameProcessor;"; | ||||
|   static void registerNatives(); | ||||
|   static jni::local_ref<JFrameProcessor::javaobject> | ||||
|   create(const std::shared_ptr<RNWorklet::JsiWorklet>& worklet, | ||||
|          const std::shared_ptr<RNWorklet::JsiWorkletContext>& context); | ||||
|   static jni::local_ref<JFrameProcessor::javaobject> create(const std::shared_ptr<RNWorklet::JsiWorklet>& worklet, | ||||
|                                                             const std::shared_ptr<RNWorklet::JsiWorkletContext>& context); | ||||
|  | ||||
| public: | ||||
|   /** | ||||
| @@ -37,8 +36,7 @@ public: | ||||
|  | ||||
| private: | ||||
|   // Private constructor. Use `create(..)` to create new instances. | ||||
|   explicit JFrameProcessor(std::shared_ptr<RNWorklet::JsiWorklet> worklet, | ||||
|                            std::shared_ptr<RNWorklet::JsiWorkletContext> context); | ||||
|   explicit JFrameProcessor(std::shared_ptr<RNWorklet::JsiWorklet> worklet, std::shared_ptr<RNWorklet::JsiWorkletContext> context); | ||||
|  | ||||
| private: | ||||
|   void callWithFrameHostObject(const std::shared_ptr<FrameHostObject>& frameHostObject) const; | ||||
|   | ||||
| @@ -14,9 +14,8 @@ using namespace jni; | ||||
|  | ||||
| using TCallback = jobject(alias_ref<JFrame::javaobject>, alias_ref<JMap<jstring, jobject>> params); | ||||
|  | ||||
| local_ref<jobject> | ||||
| JFrameProcessorPlugin::callback(const alias_ref<JFrame::javaobject>& frame, | ||||
|                                 const alias_ref<JMap<jstring, jobject>>& params) const { | ||||
| local_ref<jobject> JFrameProcessorPlugin::callback(const alias_ref<JFrame::javaobject>& frame, | ||||
|                                                    const alias_ref<JMap<jstring, jobject>>& params) const { | ||||
|   auto callbackMethod = getClass()->getMethod<TCallback>("callback"); | ||||
|  | ||||
|   auto result = callbackMethod(self(), frame, params); | ||||
|   | ||||
| @@ -16,15 +16,13 @@ using namespace facebook; | ||||
| using namespace jni; | ||||
|  | ||||
| struct JFrameProcessorPlugin : public JavaClass<JFrameProcessorPlugin> { | ||||
|   static constexpr auto kJavaDescriptor = | ||||
|       "Lcom/mrousavy/camera/frameprocessor/FrameProcessorPlugin;"; | ||||
|   static constexpr auto kJavaDescriptor = "Lcom/mrousavy/camera/frameprocessor/FrameProcessorPlugin;"; | ||||
|  | ||||
| public: | ||||
|   /** | ||||
|    * Call the plugin. | ||||
|    */ | ||||
|   local_ref<jobject> callback(const alias_ref<JFrame::javaobject>& frame, | ||||
|                               const alias_ref<JMap<jstring, jobject>>& params) const; | ||||
|   local_ref<jobject> callback(const alias_ref<JFrame::javaobject>& frame, const alias_ref<JMap<jstring, jobject>>& params) const; | ||||
| }; | ||||
|  | ||||
| } // namespace vision | ||||
|   | ||||
| @@ -25,10 +25,9 @@ using TJSCallInvokerHolder = jni::alias_ref<facebook::react::CallInvokerHolder:: | ||||
| using TScheduler = jni::alias_ref<JVisionCameraScheduler::javaobject>; | ||||
| using TOptions = jni::local_ref<JMap<jstring, jobject>>; | ||||
|  | ||||
| JVisionCameraProxy::JVisionCameraProxy( | ||||
|     const jni::alias_ref<JVisionCameraProxy::jhybridobject>& javaThis, jsi::Runtime* runtime, | ||||
|     const std::shared_ptr<facebook::react::CallInvoker>& callInvoker, | ||||
|     const jni::global_ref<JVisionCameraScheduler::javaobject>& scheduler) { | ||||
| JVisionCameraProxy::JVisionCameraProxy(const jni::alias_ref<JVisionCameraProxy::jhybridobject>& javaThis, jsi::Runtime* runtime, | ||||
|                                        const std::shared_ptr<facebook::react::CallInvoker>& callInvoker, | ||||
|                                        const jni::global_ref<JVisionCameraScheduler::javaobject>& scheduler) { | ||||
|   _javaPart = make_global(javaThis); | ||||
|   _runtime = runtime; | ||||
|  | ||||
| @@ -43,8 +42,7 @@ JVisionCameraProxy::JVisionCameraProxy( | ||||
|     // Run on Frame Processor Worklet Runtime | ||||
|     scheduler->cthis()->dispatchAsync([f = std::move(f)]() { f(); }); | ||||
|   }; | ||||
|   _workletContext = std::make_shared<RNWorklet::JsiWorkletContext>("VisionCamera", runtime, runOnJS, | ||||
|                                                                    runOnWorklet); | ||||
|   _workletContext = std::make_shared<RNWorklet::JsiWorkletContext>("VisionCamera", runtime, runOnJS, runOnWorklet); | ||||
|   __android_log_write(ANDROID_LOG_INFO, TAG, "Worklet Context created!"); | ||||
| #else | ||||
|   __android_log_write(ANDROID_LOG_INFO, TAG, "Frame Processors are disabled!"); | ||||
| @@ -60,13 +58,10 @@ JVisionCameraProxy::~JVisionCameraProxy() { | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void JVisionCameraProxy::setFrameProcessor(int viewTag, jsi::Runtime& runtime, | ||||
|                                            const jsi::Object& frameProcessorObject) { | ||||
| void JVisionCameraProxy::setFrameProcessor(int viewTag, jsi::Runtime& runtime, const jsi::Object& frameProcessorObject) { | ||||
| #if VISION_CAMERA_ENABLE_FRAME_PROCESSORS | ||||
|   auto frameProcessorType = | ||||
|       frameProcessorObject.getProperty(runtime, "type").asString(runtime).utf8(runtime); | ||||
|   auto worklet = std::make_shared<RNWorklet::JsiWorklet>( | ||||
|       runtime, frameProcessorObject.getProperty(runtime, "frameProcessor")); | ||||
|   auto frameProcessorType = frameProcessorObject.getProperty(runtime, "type").asString(runtime).utf8(runtime); | ||||
|   auto worklet = std::make_shared<RNWorklet::JsiWorklet>(runtime, frameProcessorObject.getProperty(runtime, "frameProcessor")); | ||||
|  | ||||
|   jni::local_ref<JFrameProcessor::javaobject> frameProcessor; | ||||
|   if (frameProcessorType == "frame-processor") { | ||||
| @@ -75,9 +70,7 @@ void JVisionCameraProxy::setFrameProcessor(int viewTag, jsi::Runtime& runtime, | ||||
|     throw std::runtime_error("Unknown FrameProcessor.type passed! Received: " + frameProcessorType); | ||||
|   } | ||||
|  | ||||
|   auto setFrameProcessorMethod = | ||||
|       javaClassLocal()->getMethod<void(int, alias_ref<JFrameProcessor::javaobject>)>( | ||||
|           "setFrameProcessor"); | ||||
|   auto setFrameProcessorMethod = javaClassLocal()->getMethod<void(int, alias_ref<JFrameProcessor::javaobject>)>("setFrameProcessor"); | ||||
|   setFrameProcessorMethod(_javaPart, viewTag, frameProcessor); | ||||
| #else | ||||
|   throw std::runtime_error("system/frame-processors-unavailable: Frame Processors are disabled!"); | ||||
| @@ -89,11 +82,9 @@ void JVisionCameraProxy::removeFrameProcessor(int viewTag) { | ||||
|   removeFrameProcessorMethod(_javaPart, viewTag); | ||||
| } | ||||
|  | ||||
| local_ref<JFrameProcessorPlugin::javaobject> | ||||
| JVisionCameraProxy::getFrameProcessorPlugin(const std::string& name, TOptions options) { | ||||
| local_ref<JFrameProcessorPlugin::javaobject> JVisionCameraProxy::getFrameProcessorPlugin(const std::string& name, TOptions options) { | ||||
|   auto getFrameProcessorPluginMethod = | ||||
|       javaClassLocal()->getMethod<JFrameProcessorPlugin(local_ref<jstring>, TOptions)>( | ||||
|           "getFrameProcessorPlugin"); | ||||
|       javaClassLocal()->getMethod<JFrameProcessorPlugin(local_ref<jstring>, TOptions)>("getFrameProcessorPlugin"); | ||||
|   return getFrameProcessorPluginMethod(_javaPart, make_jstring(name), std::move(options)); | ||||
| } | ||||
|  | ||||
| @@ -101,8 +92,7 @@ void JVisionCameraProxy::registerNatives() { | ||||
|   registerHybrid({makeNativeMethod("initHybrid", JVisionCameraProxy::initHybrid)}); | ||||
| } | ||||
|  | ||||
| TSelf JVisionCameraProxy::initHybrid(alias_ref<jhybridobject> jThis, jlong jsRuntimePointer, | ||||
|                                      TJSCallInvokerHolder jsCallInvokerHolder, | ||||
| TSelf JVisionCameraProxy::initHybrid(alias_ref<jhybridobject> jThis, jlong jsRuntimePointer, TJSCallInvokerHolder jsCallInvokerHolder, | ||||
|                                      const TScheduler& scheduler) { | ||||
|   __android_log_write(ANDROID_LOG_INFO, TAG, "Initializing VisionCameraProxy..."); | ||||
|  | ||||
|   | ||||
| @@ -30,8 +30,8 @@ public: | ||||
|  | ||||
|   void setFrameProcessor(int viewTag, jsi::Runtime& runtime, const jsi::Object& frameProcessor); | ||||
|   void removeFrameProcessor(int viewTag); | ||||
|   jni::local_ref<JFrameProcessorPlugin::javaobject> | ||||
|   getFrameProcessorPlugin(const std::string& name, jni::local_ref<JMap<jstring, jobject>> options); | ||||
|   jni::local_ref<JFrameProcessorPlugin::javaobject> getFrameProcessorPlugin(const std::string& name, | ||||
|                                                                             jni::local_ref<JMap<jstring, jobject>> options); | ||||
|  | ||||
|   jsi::Runtime* getJSRuntime() { | ||||
|     return _runtime; | ||||
| @@ -48,14 +48,12 @@ private: | ||||
|   static auto constexpr TAG = "VisionCameraProxy"; | ||||
|   static auto constexpr kJavaDescriptor = "Lcom/mrousavy/camera/frameprocessor/VisionCameraProxy;"; | ||||
|  | ||||
|   explicit JVisionCameraProxy(const jni::alias_ref<JVisionCameraProxy::jhybridobject>& javaThis, | ||||
|                               jsi::Runtime* jsRuntime, | ||||
|   explicit JVisionCameraProxy(const jni::alias_ref<JVisionCameraProxy::jhybridobject>& javaThis, jsi::Runtime* jsRuntime, | ||||
|                               const std::shared_ptr<facebook::react::CallInvoker>& jsCallInvoker, | ||||
|                               const jni::global_ref<JVisionCameraScheduler::javaobject>& scheduler); | ||||
|   static jni::local_ref<jhybriddata> | ||||
|   initHybrid(jni::alias_ref<jhybridobject> javaThis, jlong jsRuntimePointer, | ||||
|              jni::alias_ref<facebook::react::CallInvokerHolder::javaobject> jsCallInvokerHolder, | ||||
|              const jni::alias_ref<JVisionCameraScheduler::javaobject>& scheduler); | ||||
|   static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> javaThis, jlong jsRuntimePointer, | ||||
|                                                 jni::alias_ref<facebook::react::CallInvokerHolder::javaobject> jsCallInvokerHolder, | ||||
|                                                 const jni::alias_ref<JVisionCameraScheduler::javaobject>& scheduler); | ||||
| }; | ||||
|  | ||||
| } // namespace vision | ||||
|   | ||||
| @@ -25,8 +25,7 @@ using namespace facebook; | ||||
|  */ | ||||
| class JVisionCameraScheduler : public jni::HybridClass<JVisionCameraScheduler> { | ||||
| public: | ||||
|   static auto constexpr kJavaDescriptor = | ||||
|       "Lcom/mrousavy/camera/frameprocessor/VisionCameraScheduler;"; | ||||
|   static auto constexpr kJavaDescriptor = "Lcom/mrousavy/camera/frameprocessor/VisionCameraScheduler;"; | ||||
|   static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis); | ||||
|   static void registerNatives(); | ||||
|  | ||||
| @@ -39,8 +38,7 @@ private: | ||||
|   std::queue<std::function<void()>> _jobs; | ||||
|   std::mutex _mutex; | ||||
|  | ||||
|   explicit JVisionCameraScheduler(jni::alias_ref<JVisionCameraScheduler::jhybridobject> jThis) | ||||
|       : _javaPart(jni::make_global(jThis)) {} | ||||
|   explicit JVisionCameraScheduler(jni::alias_ref<JVisionCameraScheduler::jhybridobject> jThis) : _javaPart(jni::make_global(jThis)) {} | ||||
|  | ||||
|   // Schedules a call to `trigger` on the VisionCamera FP Thread | ||||
|   void scheduleTrigger(); | ||||
|   | ||||
| @@ -6,7 +6,7 @@ Standard: c++14 | ||||
|  | ||||
| # Indentation | ||||
| IndentWidth: 2 | ||||
| ColumnLimit: 100 | ||||
| ColumnLimit: 140 | ||||
|  | ||||
| # Includes | ||||
| SortIncludes: true | ||||
|   | ||||
| @@ -81,16 +81,14 @@ void invalidateArrayBufferCache(jsi::Runtime& runtime) { | ||||
| TypedArrayKind getTypedArrayKindForName(const std::string& name); | ||||
|  | ||||
| TypedArrayBase::TypedArrayBase(jsi::Runtime& runtime, size_t size, TypedArrayKind kind) | ||||
|     : TypedArrayBase( | ||||
|           runtime, runtime.global() | ||||
|                        .getProperty(runtime, propNameIDCache.getConstructorNameProp(runtime, kind)) | ||||
|                        .asObject(runtime) | ||||
|                        .asFunction(runtime) | ||||
|                        .callAsConstructor(runtime, {static_cast<double>(size)}) | ||||
|                        .asObject(runtime)) {} | ||||
|     : TypedArrayBase(runtime, runtime.global() | ||||
|                                   .getProperty(runtime, propNameIDCache.getConstructorNameProp(runtime, kind)) | ||||
|                                   .asObject(runtime) | ||||
|                                   .asFunction(runtime) | ||||
|                                   .callAsConstructor(runtime, {static_cast<double>(size)}) | ||||
|                                   .asObject(runtime)) {} | ||||
|  | ||||
| TypedArrayBase::TypedArrayBase(jsi::Runtime& runtime, const jsi::Object& obj) | ||||
|     : jsi::Object(jsi::Value(runtime, obj).asObject(runtime)) {} | ||||
| TypedArrayBase::TypedArrayBase(jsi::Runtime& runtime, const jsi::Object& obj) : jsi::Object(jsi::Value(runtime, obj).asObject(runtime)) {} | ||||
|  | ||||
| TypedArrayKind TypedArrayBase::getKind(jsi::Runtime& runtime) const { | ||||
|   auto constructorName = this->getProperty(runtime, propNameIDCache.get(runtime, Prop::Constructor)) | ||||
| @@ -174,13 +172,11 @@ std::vector<uint8_t> arrayBufferToVector(jsi::Runtime& runtime, jsi::Object& jsO | ||||
|   auto jsArrayBuffer = jsObj.getArrayBuffer(runtime); | ||||
|  | ||||
|   uint8_t* dataBlock = jsArrayBuffer.data(runtime); | ||||
|   size_t blockSize = | ||||
|       jsArrayBuffer.getProperty(runtime, propNameIDCache.get(runtime, Prop::ByteLength)).asNumber(); | ||||
|   size_t blockSize = jsArrayBuffer.getProperty(runtime, propNameIDCache.get(runtime, Prop::ByteLength)).asNumber(); | ||||
|   return std::vector<uint8_t>(dataBlock, dataBlock + blockSize); | ||||
| } | ||||
|  | ||||
| void arrayBufferUpdate(jsi::Runtime& runtime, jsi::ArrayBuffer& buffer, std::vector<uint8_t> data, | ||||
|                        size_t offset) { | ||||
| void arrayBufferUpdate(jsi::Runtime& runtime, jsi::ArrayBuffer& buffer, std::vector<uint8_t> data, size_t offset) { | ||||
|   uint8_t* dataBlock = buffer.data(runtime); | ||||
|   size_t blockSize = buffer.size(runtime); | ||||
|   if (data.size() > blockSize) { | ||||
| @@ -189,28 +185,22 @@ void arrayBufferUpdate(jsi::Runtime& runtime, jsi::ArrayBuffer& buffer, std::vec | ||||
|   std::copy(data.begin(), data.end(), dataBlock + offset); | ||||
| } | ||||
|  | ||||
| template <TypedArrayKind T> | ||||
| TypedArray<T>::TypedArray(jsi::Runtime& runtime, size_t size) : TypedArrayBase(runtime, size, T) {} | ||||
| template <TypedArrayKind T> TypedArray<T>::TypedArray(jsi::Runtime& runtime, size_t size) : TypedArrayBase(runtime, size, T) {} | ||||
|  | ||||
| template <TypedArrayKind T> | ||||
| TypedArray<T>::TypedArray(jsi::Runtime& runtime, std::vector<ContentType<T>> data) | ||||
|     : TypedArrayBase(runtime, data.size(), T) { | ||||
| TypedArray<T>::TypedArray(jsi::Runtime& runtime, std::vector<ContentType<T>> data) : TypedArrayBase(runtime, data.size(), T) { | ||||
|   update(runtime, data); | ||||
| } | ||||
|  | ||||
| template <TypedArrayKind T> | ||||
| TypedArray<T>::TypedArray(TypedArrayBase&& base) : TypedArrayBase(std::move(base)) {} | ||||
| template <TypedArrayKind T> TypedArray<T>::TypedArray(TypedArrayBase&& base) : TypedArrayBase(std::move(base)) {} | ||||
|  | ||||
| template <TypedArrayKind T> | ||||
| std::vector<ContentType<T>> TypedArray<T>::toVector(jsi::Runtime& runtime) { | ||||
|   auto start = | ||||
|       reinterpret_cast<ContentType<T>*>(getBuffer(runtime).data(runtime) + byteOffset(runtime)); | ||||
| template <TypedArrayKind T> std::vector<ContentType<T>> TypedArray<T>::toVector(jsi::Runtime& runtime) { | ||||
|   auto start = reinterpret_cast<ContentType<T>*>(getBuffer(runtime).data(runtime) + byteOffset(runtime)); | ||||
|   auto end = start + size(runtime); | ||||
|   return std::vector<ContentType<T>>(start, end); | ||||
| } | ||||
|  | ||||
| template <TypedArrayKind T> | ||||
| void TypedArray<T>::update(jsi::Runtime& runtime, const std::vector<ContentType<T>>& data) { | ||||
| template <TypedArrayKind T> void TypedArray<T>::update(jsi::Runtime& runtime, const std::vector<ContentType<T>>& data) { | ||||
|   if (data.size() != size(runtime)) { | ||||
|     throw jsi::JSError(runtime, "TypedArray can only be updated with a vector of the same size"); | ||||
|   } | ||||
| @@ -218,8 +208,7 @@ void TypedArray<T>::update(jsi::Runtime& runtime, const std::vector<ContentType< | ||||
|   std::copy(data.begin(), data.end(), reinterpret_cast<ContentType<T>*>(rawData)); | ||||
| } | ||||
|  | ||||
| template <TypedArrayKind T> | ||||
| void TypedArray<T>::updateUnsafe(jsi::Runtime& runtime, ContentType<T>* data, size_t length) { | ||||
| template <TypedArrayKind T> void TypedArray<T>::updateUnsafe(jsi::Runtime& runtime, ContentType<T>* data, size_t length) { | ||||
|   if (length != size(runtime)) { | ||||
|     throw jsi::JSError(runtime, "TypedArray can only be updated with an array of the same size"); | ||||
|   } | ||||
| @@ -231,8 +220,7 @@ template <TypedArrayKind T> uint8_t* TypedArray<T>::data(jsi::Runtime& runtime) | ||||
|   return getBuffer(runtime).data(runtime) + byteOffset(runtime); | ||||
| } | ||||
|  | ||||
| const jsi::PropNameID& PropNameIDCache::getConstructorNameProp(jsi::Runtime& runtime, | ||||
|                                                                TypedArrayKind kind) { | ||||
| const jsi::PropNameID& PropNameIDCache::getConstructorNameProp(jsi::Runtime& runtime, TypedArrayKind kind) { | ||||
|   switch (kind) { | ||||
|     case TypedArrayKind::Int8Array: | ||||
|       return get(runtime, Prop::Int8Array); | ||||
| @@ -256,9 +244,7 @@ const jsi::PropNameID& PropNameIDCache::getConstructorNameProp(jsi::Runtime& run | ||||
| } | ||||
|  | ||||
| jsi::PropNameID PropNameIDCache::createProp(jsi::Runtime& runtime, Prop prop) { | ||||
|   auto create = [&](const std::string& propName) { | ||||
|     return jsi::PropNameID::forUtf8(runtime, propName); | ||||
|   }; | ||||
|   auto create = [&](const std::string& propName) { return jsi::PropNameID::forUtf8(runtime, propName); }; | ||||
|   switch (prop) { | ||||
|     case Prop::Buffer: | ||||
|       return create("buffer"); | ||||
|   | ||||
| @@ -97,8 +97,7 @@ bool isTypedArray(jsi::Runtime& runtime, const jsi::Object& jsObj); | ||||
| TypedArrayBase getTypedArray(jsi::Runtime& runtime, const jsi::Object& jsObj); | ||||
|  | ||||
| std::vector<uint8_t> arrayBufferToVector(jsi::Runtime& runtime, jsi::Object& jsObj); | ||||
| void arrayBufferUpdate(jsi::Runtime& runtime, jsi::ArrayBuffer& buffer, std::vector<uint8_t> data, | ||||
|                        size_t offset); | ||||
| void arrayBufferUpdate(jsi::Runtime& runtime, jsi::ArrayBuffer& buffer, std::vector<uint8_t> data, size_t offset); | ||||
|  | ||||
| template <TypedArrayKind T> class TypedArray : public TypedArrayBase { | ||||
| public: | ||||
|   | ||||
| @@ -14,22 +14,12 @@ | ||||
| @interface RCT_EXTERN_REMAP_MODULE (CameraView, CameraViewManager, RCTViewManager) | ||||
|  | ||||
| // Module Functions | ||||
| RCT_EXTERN_METHOD(getCameraPermissionStatus | ||||
|                   : (RCTPromiseResolveBlock)resolve reject | ||||
|                   : (RCTPromiseRejectBlock)reject); | ||||
| RCT_EXTERN_METHOD(getMicrophonePermissionStatus | ||||
|                   : (RCTPromiseResolveBlock)resolve reject | ||||
|                   : (RCTPromiseRejectBlock)reject); | ||||
| RCT_EXTERN_METHOD(requestCameraPermission | ||||
|                   : (RCTPromiseResolveBlock)resolve reject | ||||
|                   : (RCTPromiseRejectBlock)reject); | ||||
| RCT_EXTERN_METHOD(requestMicrophonePermission | ||||
|                   : (RCTPromiseResolveBlock)resolve reject | ||||
|                   : (RCTPromiseRejectBlock)reject); | ||||
| RCT_EXTERN_METHOD(getCameraPermissionStatus : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject); | ||||
| RCT_EXTERN_METHOD(getMicrophonePermissionStatus : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject); | ||||
| RCT_EXTERN_METHOD(requestCameraPermission : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject); | ||||
| RCT_EXTERN_METHOD(requestMicrophonePermission : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject); | ||||
|  | ||||
| RCT_EXTERN_METHOD(getAvailableCameraDevices | ||||
|                   : (RCTPromiseResolveBlock)resolve reject | ||||
|                   : (RCTPromiseRejectBlock)reject); | ||||
| RCT_EXTERN_METHOD(getAvailableCameraDevices : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject); | ||||
|  | ||||
| // Camera View Properties | ||||
| RCT_EXPORT_VIEW_PROPERTY(isActive, BOOL); | ||||
| @@ -73,10 +63,7 @@ RCT_EXTERN_METHOD(resumeRecording | ||||
|                   : (nonnull NSNumber*)node resolve | ||||
|                   : (RCTPromiseResolveBlock)resolve reject | ||||
|                   : (RCTPromiseRejectBlock)reject); | ||||
| RCT_EXTERN_METHOD(stopRecording | ||||
|                   : (nonnull NSNumber*)node resolve | ||||
|                   : (RCTPromiseResolveBlock)resolve reject | ||||
|                   : (RCTPromiseRejectBlock)reject); | ||||
| RCT_EXTERN_METHOD(stopRecording : (nonnull NSNumber*)node resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject); | ||||
| RCT_EXTERN_METHOD(takePhoto | ||||
|                   : (nonnull NSNumber*)node options | ||||
|                   : (NSDictionary*)options resolve | ||||
|   | ||||
| @@ -14,8 +14,7 @@ | ||||
|  | ||||
| @interface Frame : NSObject | ||||
|  | ||||
| - (instancetype _Nonnull)initWithBuffer:(CMSampleBufferRef _Nonnull)buffer | ||||
|                             orientation:(UIImageOrientation)orientation; | ||||
| - (instancetype _Nonnull)initWithBuffer:(CMSampleBufferRef _Nonnull)buffer orientation:(UIImageOrientation)orientation; | ||||
|  | ||||
| @property(nonatomic, readonly) CMSampleBufferRef _Nonnull buffer; | ||||
| @property(nonatomic, readonly) UIImageOrientation orientation; | ||||
|   | ||||
| @@ -15,8 +15,7 @@ | ||||
|   UIImageOrientation orientation; | ||||
| } | ||||
|  | ||||
| - (instancetype)initWithBuffer:(CMSampleBufferRef _Nonnull)buffer | ||||
|                    orientation:(UIImageOrientation)orientation { | ||||
| - (instancetype)initWithBuffer:(CMSampleBufferRef _Nonnull)buffer orientation:(UIImageOrientation)orientation { | ||||
|   self = [super init]; | ||||
|   if (self) { | ||||
|     _buffer = buffer; | ||||
|   | ||||
| @@ -46,12 +46,10 @@ jsi::Value FrameHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID& pr | ||||
|       auto width = CVPixelBufferGetWidth(imageBuffer); | ||||
|       auto height = CVPixelBufferGetHeight(imageBuffer); | ||||
|  | ||||
|       NSMutableString* string = | ||||
|           [NSMutableString stringWithFormat:@"%lu x %lu Frame", width, height]; | ||||
|       NSMutableString* string = [NSMutableString stringWithFormat:@"%lu x %lu Frame", width, height]; | ||||
|       return jsi::String::createFromUtf8(runtime, string.UTF8String); | ||||
|     }; | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "toString"), 0, toString); | ||||
|     return jsi::Function::createFromHostFunction(runtime, jsi::PropNameID::forUtf8(runtime, "toString"), 0, toString); | ||||
|   } | ||||
|   if (name == "incrementRefCount") { | ||||
|     auto incrementRefCount = JSI_HOST_FUNCTION_LAMBDA { | ||||
| @@ -59,8 +57,7 @@ jsi::Value FrameHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID& pr | ||||
|       CFRetain(frame.buffer); | ||||
|       return jsi::Value::undefined(); | ||||
|     }; | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "incrementRefCount"), 0, incrementRefCount); | ||||
|     return jsi::Function::createFromHostFunction(runtime, jsi::PropNameID::forUtf8(runtime, "incrementRefCount"), 0, incrementRefCount); | ||||
|   } | ||||
|   if (name == "decrementRefCount") { | ||||
|     auto decrementRefCount = JSI_HOST_FUNCTION_LAMBDA { | ||||
| @@ -69,8 +66,7 @@ jsi::Value FrameHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID& pr | ||||
|       CFRelease(frame.buffer); | ||||
|       return jsi::Value::undefined(); | ||||
|     }; | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "decrementRefCount"), 0, decrementRefCount); | ||||
|     return jsi::Function::createFromHostFunction(runtime, jsi::PropNameID::forUtf8(runtime, "decrementRefCount"), 0, decrementRefCount); | ||||
|   } | ||||
|   if (name == "toArrayBuffer") { | ||||
|     auto toArrayBuffer = JSI_HOST_FUNCTION_LAMBDA { | ||||
| @@ -82,19 +78,15 @@ jsi::Value FrameHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID& pr | ||||
|  | ||||
|       static constexpr auto ARRAYBUFFER_CACHE_PROP_NAME = "__frameArrayBufferCache"; | ||||
|       if (!runtime.global().hasProperty(runtime, ARRAYBUFFER_CACHE_PROP_NAME)) { | ||||
|         vision::TypedArray<vision::TypedArrayKind::Uint8ClampedArray> arrayBuffer(runtime, | ||||
|                                                                                   arraySize); | ||||
|         vision::TypedArray<vision::TypedArrayKind::Uint8ClampedArray> arrayBuffer(runtime, arraySize); | ||||
|         runtime.global().setProperty(runtime, ARRAYBUFFER_CACHE_PROP_NAME, arrayBuffer); | ||||
|       } | ||||
|  | ||||
|       auto arrayBufferCache = | ||||
|           runtime.global().getPropertyAsObject(runtime, ARRAYBUFFER_CACHE_PROP_NAME); | ||||
|       auto arrayBuffer = vision::getTypedArray(runtime, arrayBufferCache) | ||||
|                              .get<vision::TypedArrayKind::Uint8ClampedArray>(runtime); | ||||
|       auto arrayBufferCache = runtime.global().getPropertyAsObject(runtime, ARRAYBUFFER_CACHE_PROP_NAME); | ||||
|       auto arrayBuffer = vision::getTypedArray(runtime, arrayBufferCache).get<vision::TypedArrayKind::Uint8ClampedArray>(runtime); | ||||
|  | ||||
|       if (arrayBuffer.size(runtime) != arraySize) { | ||||
|         arrayBuffer = | ||||
|             vision::TypedArray<vision::TypedArrayKind::Uint8ClampedArray>(runtime, arraySize); | ||||
|         arrayBuffer = vision::TypedArray<vision::TypedArrayKind::Uint8ClampedArray>(runtime, arraySize); | ||||
|         runtime.global().setProperty(runtime, ARRAYBUFFER_CACHE_PROP_NAME, arrayBuffer); | ||||
|       } | ||||
|  | ||||
| @@ -105,13 +97,11 @@ jsi::Value FrameHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID& pr | ||||
|  | ||||
|       return arrayBuffer; | ||||
|     }; | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "toArrayBuffer"), 0, toArrayBuffer); | ||||
|     return jsi::Function::createFromHostFunction(runtime, jsi::PropNameID::forUtf8(runtime, "toArrayBuffer"), 0, toArrayBuffer); | ||||
|   } | ||||
|  | ||||
|   if (name == "isValid") { | ||||
|     auto isValid = frame != nil && frame.buffer != nil && CFGetRetainCount(frame.buffer) > 0 && | ||||
|                    CMSampleBufferIsValid(frame.buffer); | ||||
|     auto isValid = frame != nil && frame.buffer != nil && CFGetRetainCount(frame.buffer) > 0 && CMSampleBufferIsValid(frame.buffer); | ||||
|     return jsi::Value(isValid); | ||||
|   } | ||||
|   if (name == "width") { | ||||
|   | ||||
| @@ -46,11 +46,8 @@ using namespace facebook; | ||||
|     auto message = jsError.getMessage(); | ||||
|  | ||||
|     _workletContext->invokeOnJsThread([message](jsi::Runtime& jsRuntime) { | ||||
|       auto logFn = jsRuntime.global() | ||||
|                        .getPropertyAsObject(jsRuntime, "console") | ||||
|                        .getPropertyAsFunction(jsRuntime, "error"); | ||||
|       logFn.call(jsRuntime, jsi::String::createFromUtf8( | ||||
|                                 jsRuntime, "Frame Processor threw an error: " + message)); | ||||
|       auto logFn = jsRuntime.global().getPropertyAsObject(jsRuntime, "console").getPropertyAsFunction(jsRuntime, "error"); | ||||
|       logFn.call(jsRuntime, jsi::String::createFromUtf8(jsRuntime, "Frame Processor threw an error: " + message)); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -12,10 +12,8 @@ | ||||
| @implementation FrameProcessorPlugin | ||||
|  | ||||
| - (id _Nullable)callback:(Frame* _Nonnull)frame withArguments:(NSDictionary* _Nullable)arguments { | ||||
|   [NSException | ||||
|        raise:NSInternalInconsistencyException | ||||
|       format: | ||||
|           @"Frame Processor Plugin does not override the `callback(frame:withArguments:)` method!"]; | ||||
|   [NSException raise:NSInternalInconsistencyException | ||||
|               format:@"Frame Processor Plugin does not override the `callback(frame:withArguments:)` method!"]; | ||||
|   return nil; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -17,8 +17,7 @@ using namespace facebook; | ||||
|  | ||||
| class FrameProcessorPluginHostObject : public jsi::HostObject { | ||||
| public: | ||||
|   explicit FrameProcessorPluginHostObject(FrameProcessorPlugin* plugin, | ||||
|                                           std::shared_ptr<react::CallInvoker> callInvoker) | ||||
|   explicit FrameProcessorPluginHostObject(FrameProcessorPlugin* plugin, std::shared_ptr<react::CallInvoker> callInvoker) | ||||
|       : _plugin(plugin), _callInvoker(callInvoker) {} | ||||
|   ~FrameProcessorPluginHostObject() {} | ||||
|  | ||||
|   | ||||
| @@ -14,33 +14,28 @@ | ||||
|  | ||||
| using namespace facebook; | ||||
|  | ||||
| std::vector<jsi::PropNameID> | ||||
| FrameProcessorPluginHostObject::getPropertyNames(jsi::Runtime& runtime) { | ||||
| std::vector<jsi::PropNameID> FrameProcessorPluginHostObject::getPropertyNames(jsi::Runtime& runtime) { | ||||
|   std::vector<jsi::PropNameID> result; | ||||
|   result.push_back(jsi::PropNameID::forUtf8(runtime, std::string("call"))); | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| jsi::Value FrameProcessorPluginHostObject::get(jsi::Runtime& runtime, | ||||
|                                                const jsi::PropNameID& propName) { | ||||
| jsi::Value FrameProcessorPluginHostObject::get(jsi::Runtime& runtime, const jsi::PropNameID& propName) { | ||||
|   auto name = propName.utf8(runtime); | ||||
|  | ||||
|   if (name == "call") { | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "call"), 2, | ||||
|         [=](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, | ||||
|             size_t count) -> jsi::Value { | ||||
|         [=](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, size_t count) -> jsi::Value { | ||||
|           // Frame is first argument | ||||
|           auto frameHostObject = | ||||
|               arguments[0].asObject(runtime).asHostObject<FrameHostObject>(runtime); | ||||
|           auto frameHostObject = arguments[0].asObject(runtime).asHostObject<FrameHostObject>(runtime); | ||||
|           Frame* frame = frameHostObject->frame; | ||||
|  | ||||
|           // Options are second argument (possibly undefined) | ||||
|           NSDictionary* options = nil; | ||||
|           if (count > 1) { | ||||
|             auto optionsObject = arguments[1].asObject(runtime); | ||||
|             options = JSINSObjectConversion::convertJSIObjectToNSDictionary(runtime, optionsObject, | ||||
|                                                                             _callInvoker); | ||||
|             options = JSINSObjectConversion::convertJSIObjectToNSDictionary(runtime, optionsObject, _callInvoker); | ||||
|           } | ||||
|  | ||||
|           // Call actual Frame Processor Plugin | ||||
|   | ||||
| @@ -14,13 +14,10 @@ | ||||
|  | ||||
| @interface FrameProcessorPluginRegistry : NSObject | ||||
|  | ||||
| typedef FrameProcessorPlugin* _Nonnull (^PluginInitializerFunction)( | ||||
|     NSDictionary* _Nullable options); | ||||
| typedef FrameProcessorPlugin* _Nonnull (^PluginInitializerFunction)(NSDictionary* _Nullable options); | ||||
|  | ||||
| + (void)addFrameProcessorPlugin:(NSString* _Nonnull)name | ||||
|                 withInitializer:(PluginInitializerFunction _Nonnull)pluginInitializer; | ||||
| + (void)addFrameProcessorPlugin:(NSString* _Nonnull)name withInitializer:(PluginInitializerFunction _Nonnull)pluginInitializer; | ||||
|  | ||||
| + (FrameProcessorPlugin* _Nullable)getPlugin:(NSString* _Nonnull)name | ||||
|                                  withOptions:(NSDictionary* _Nullable)options; | ||||
| + (FrameProcessorPlugin* _Nullable)getPlugin:(NSString* _Nonnull)name withOptions:(NSDictionary* _Nullable)options; | ||||
|  | ||||
| @end | ||||
|   | ||||
| @@ -19,10 +19,8 @@ | ||||
|   return plugins; | ||||
| } | ||||
|  | ||||
| + (void)addFrameProcessorPlugin:(NSString*)name | ||||
|                 withInitializer:(PluginInitializerFunction)pluginInitializer { | ||||
|   BOOL alreadyExists = | ||||
|       [[FrameProcessorPluginRegistry frameProcessorPlugins] valueForKey:name] != nil; | ||||
| + (void)addFrameProcessorPlugin:(NSString*)name withInitializer:(PluginInitializerFunction)pluginInitializer { | ||||
|   BOOL alreadyExists = [[FrameProcessorPluginRegistry frameProcessorPlugins] valueForKey:name] != nil; | ||||
|   NSAssert(!alreadyExists, | ||||
|            @"Tried to add a Frame Processor Plugin with a name that already exists! Either choose " | ||||
|            @"unique names, or " | ||||
| @@ -32,10 +30,8 @@ | ||||
|   [[FrameProcessorPluginRegistry frameProcessorPlugins] setValue:pluginInitializer forKey:name]; | ||||
| } | ||||
|  | ||||
| + (FrameProcessorPlugin*)getPlugin:(NSString* _Nonnull)name | ||||
|                        withOptions:(NSDictionary* _Nullable)options { | ||||
|   PluginInitializerFunction initializer = | ||||
|       [[FrameProcessorPluginRegistry frameProcessorPlugins] objectForKey:name]; | ||||
| + (FrameProcessorPlugin*)getPlugin:(NSString* _Nonnull)name withOptions:(NSDictionary* _Nullable)options { | ||||
|   PluginInitializerFunction initializer = [[FrameProcessorPluginRegistry frameProcessorPlugins] objectForKey:name]; | ||||
|   if (initializer == nil) { | ||||
|     return nil; | ||||
|   } | ||||
|   | ||||
| @@ -39,27 +39,23 @@ jsi::Value convertObjCObjectToJSIValue(jsi::Runtime& runtime, id value); | ||||
| NSString* convertJSIStringToNSString(jsi::Runtime& runtime, const jsi::String& value); | ||||
|  | ||||
| // any... -> NSArray | ||||
| NSArray* convertJSICStyleArrayToNSArray(jsi::Runtime& runtime, const jsi::Value* array, | ||||
|                                         size_t length, std::shared_ptr<CallInvoker> jsInvoker); | ||||
| NSArray* convertJSICStyleArrayToNSArray(jsi::Runtime& runtime, const jsi::Value* array, size_t length, | ||||
|                                         std::shared_ptr<CallInvoker> jsInvoker); | ||||
|  | ||||
| // NSArray -> any... | ||||
| jsi::Value* convertNSArrayToJSICStyleArray(jsi::Runtime& runtime, NSArray* array); | ||||
|  | ||||
| // [] -> NSArray | ||||
| NSArray* convertJSIArrayToNSArray(jsi::Runtime& runtime, const jsi::Array& value, | ||||
|                                   std::shared_ptr<CallInvoker> jsInvoker); | ||||
| NSArray* convertJSIArrayToNSArray(jsi::Runtime& runtime, const jsi::Array& value, std::shared_ptr<CallInvoker> jsInvoker); | ||||
|  | ||||
| // {} -> NSDictionary | ||||
| NSDictionary* convertJSIObjectToNSDictionary(jsi::Runtime& runtime, const jsi::Object& value, | ||||
|                                              std::shared_ptr<CallInvoker> jsInvoker); | ||||
| NSDictionary* convertJSIObjectToNSDictionary(jsi::Runtime& runtime, const jsi::Object& value, std::shared_ptr<CallInvoker> jsInvoker); | ||||
|  | ||||
| // any -> id | ||||
| id convertJSIValueToObjCObject(jsi::Runtime& runtime, const jsi::Value& value, | ||||
|                                std::shared_ptr<CallInvoker> jsInvoker); | ||||
| id convertJSIValueToObjCObject(jsi::Runtime& runtime, const jsi::Value& value, std::shared_ptr<CallInvoker> jsInvoker); | ||||
|  | ||||
| // (any...) => any -> (void)(id, id) | ||||
| RCTResponseSenderBlock convertJSIFunctionToCallback(jsi::Runtime& runtime, | ||||
|                                                     const jsi::Function& value, | ||||
| RCTResponseSenderBlock convertJSIFunctionToCallback(jsi::Runtime& runtime, const jsi::Function& value, | ||||
|                                                     std::shared_ptr<CallInvoker> jsInvoker); | ||||
|  | ||||
| } // namespace JSINSObjectConversion | ||||
|   | ||||
| @@ -85,8 +85,8 @@ NSString* convertJSIStringToNSString(jsi::Runtime& runtime, const jsi::String& v | ||||
|   return [NSString stringWithUTF8String:value.utf8(runtime).c_str()]; | ||||
| } | ||||
|  | ||||
| NSArray* convertJSICStyleArrayToNSArray(jsi::Runtime& runtime, const jsi::Value* array, | ||||
|                                         size_t length, std::shared_ptr<CallInvoker> jsInvoker) { | ||||
| NSArray* convertJSICStyleArrayToNSArray(jsi::Runtime& runtime, const jsi::Value* array, size_t length, | ||||
|                                         std::shared_ptr<CallInvoker> jsInvoker) { | ||||
|   if (length < 1) | ||||
|     return @[]; | ||||
|   NSMutableArray* result = [NSMutableArray new]; | ||||
| @@ -105,21 +105,17 @@ jsi::Value* convertNSArrayToJSICStyleArray(jsi::Runtime& runtime, NSArray* array | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| NSArray* convertJSIArrayToNSArray(jsi::Runtime& runtime, const jsi::Array& value, | ||||
|                                   std::shared_ptr<CallInvoker> jsInvoker) { | ||||
| NSArray* convertJSIArrayToNSArray(jsi::Runtime& runtime, const jsi::Array& value, std::shared_ptr<CallInvoker> jsInvoker) { | ||||
|   size_t size = value.size(runtime); | ||||
|   NSMutableArray* result = [NSMutableArray new]; | ||||
|   for (size_t i = 0; i < size; i++) { | ||||
|     // Insert kCFNull when it's `undefined` value to preserve the indices. | ||||
|     [result | ||||
|         addObject:convertJSIValueToObjCObject(runtime, value.getValueAtIndex(runtime, i), jsInvoker) | ||||
|                       ?: (id)kCFNull]; | ||||
|     [result addObject:convertJSIValueToObjCObject(runtime, value.getValueAtIndex(runtime, i), jsInvoker) ?: (id)kCFNull]; | ||||
|   } | ||||
|   return [result copy]; | ||||
| } | ||||
|  | ||||
| NSDictionary* convertJSIObjectToNSDictionary(jsi::Runtime& runtime, const jsi::Object& value, | ||||
|                                              std::shared_ptr<CallInvoker> jsInvoker) { | ||||
| NSDictionary* convertJSIObjectToNSDictionary(jsi::Runtime& runtime, const jsi::Object& value, std::shared_ptr<CallInvoker> jsInvoker) { | ||||
|   jsi::Array propertyNames = value.getPropertyNames(runtime); | ||||
|   size_t size = propertyNames.size(runtime); | ||||
|   NSMutableDictionary* result = [NSMutableDictionary new]; | ||||
| @@ -134,8 +130,7 @@ NSDictionary* convertJSIObjectToNSDictionary(jsi::Runtime& runtime, const jsi::O | ||||
|   return [result copy]; | ||||
| } | ||||
|  | ||||
| id convertJSIValueToObjCObject(jsi::Runtime& runtime, const jsi::Value& value, | ||||
|                                std::shared_ptr<CallInvoker> jsInvoker) { | ||||
| id convertJSIValueToObjCObject(jsi::Runtime& runtime, const jsi::Value& value, std::shared_ptr<CallInvoker> jsInvoker) { | ||||
|   if (value.isUndefined() || value.isNull()) { | ||||
|     return nil; | ||||
|   } | ||||
| @@ -169,8 +164,7 @@ id convertJSIValueToObjCObject(jsi::Runtime& runtime, const jsi::Value& value, | ||||
|   throw std::runtime_error("Unsupported jsi::jsi::Value kind"); | ||||
| } | ||||
|  | ||||
| RCTResponseSenderBlock convertJSIFunctionToCallback(jsi::Runtime& runtime, | ||||
|                                                     const jsi::Function& value, | ||||
| RCTResponseSenderBlock convertJSIFunctionToCallback(jsi::Runtime& runtime, const jsi::Function& value, | ||||
|                                                     std::shared_ptr<CallInvoker> jsInvoker) { | ||||
|   auto weakWrapper = CallbackWrapper::createWeak(value.getFunction(runtime), runtime, jsInvoker); | ||||
|   RCTBlockGuard* blockGuard = [[RCTBlockGuard alloc] initWithCleanup:^() { | ||||
| @@ -198,8 +192,7 @@ RCTResponseSenderBlock convertJSIFunctionToCallback(jsi::Runtime& runtime, | ||||
|       } | ||||
|  | ||||
|       const jsi::Value* args = convertNSArrayToJSICStyleArray(strongWrapper2->runtime(), responses); | ||||
|       strongWrapper2->callback().call(strongWrapper2->runtime(), args, | ||||
|                                       static_cast<size_t>(responses.count)); | ||||
|       strongWrapper2->callback().call(strongWrapper2->runtime(), args, static_cast<size_t>(responses.count)); | ||||
|       strongWrapper2->destroy(); | ||||
|       delete[] args; | ||||
|  | ||||
|   | ||||
| @@ -20,8 +20,7 @@ using namespace facebook; | ||||
|  | ||||
| class VisionCameraProxy : public jsi::HostObject { | ||||
| public: | ||||
|   explicit VisionCameraProxy(jsi::Runtime& runtime, | ||||
|                              std::shared_ptr<react::CallInvoker> callInvoker); | ||||
|   explicit VisionCameraProxy(jsi::Runtime& runtime, std::shared_ptr<react::CallInvoker> callInvoker); | ||||
|   ~VisionCameraProxy(); | ||||
|  | ||||
| public: | ||||
| @@ -31,8 +30,7 @@ public: | ||||
| private: | ||||
|   void setFrameProcessor(jsi::Runtime& runtime, int viewTag, const jsi::Object& frameProcessor); | ||||
|   void removeFrameProcessor(jsi::Runtime& runtime, int viewTag); | ||||
|   jsi::Value getFrameProcessorPlugin(jsi::Runtime& runtime, std::string name, | ||||
|                                      const jsi::Object& options); | ||||
|   jsi::Value getFrameProcessorPlugin(jsi::Runtime& runtime, std::string name, const jsi::Object& options); | ||||
|  | ||||
| private: | ||||
|   std::shared_ptr<RNWorklet::JsiWorkletContext> _workletContext; | ||||
|   | ||||
| @@ -37,8 +37,7 @@ __attribute__((objc_runtime_name("_TtC12VisionCamera10CameraView"))) | ||||
|  | ||||
| using namespace facebook; | ||||
|  | ||||
| VisionCameraProxy::VisionCameraProxy(jsi::Runtime& runtime, | ||||
|                                      std::shared_ptr<react::CallInvoker> callInvoker) { | ||||
| VisionCameraProxy::VisionCameraProxy(jsi::Runtime& runtime, std::shared_ptr<react::CallInvoker> callInvoker) { | ||||
|   _callInvoker = callInvoker; | ||||
|  | ||||
|   NSLog(@"VisionCameraProxy: Creating Worklet Context..."); | ||||
| @@ -51,8 +50,7 @@ VisionCameraProxy::VisionCameraProxy(jsi::Runtime& runtime, | ||||
|     dispatch_async(CameraQueues.videoQueue, [f = std::move(f)]() { f(); }); | ||||
|   }; | ||||
|  | ||||
|   _workletContext = std::make_shared<RNWorklet::JsiWorkletContext>("VisionCamera", &runtime, | ||||
|                                                                    runOnJS, runOnWorklet); | ||||
|   _workletContext = std::make_shared<RNWorklet::JsiWorkletContext>("VisionCamera", &runtime, runOnJS, runOnWorklet); | ||||
|   NSLog(@"VisionCameraProxy: Worklet Context Created!"); | ||||
| } | ||||
|  | ||||
| @@ -71,23 +69,18 @@ std::vector<jsi::PropNameID> VisionCameraProxy::getPropertyNames(jsi::Runtime& r | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| void VisionCameraProxy::setFrameProcessor(jsi::Runtime& runtime, int viewTag, | ||||
|                                           const jsi::Object& object) { | ||||
| void VisionCameraProxy::setFrameProcessor(jsi::Runtime& runtime, int viewTag, const jsi::Object& object) { | ||||
|   auto frameProcessorType = object.getProperty(runtime, "type").asString(runtime).utf8(runtime); | ||||
|   auto worklet = std::make_shared<RNWorklet::JsiWorklet>( | ||||
|       runtime, object.getProperty(runtime, "frameProcessor")); | ||||
|   auto worklet = std::make_shared<RNWorklet::JsiWorklet>(runtime, object.getProperty(runtime, "frameProcessor")); | ||||
|  | ||||
|   RCTExecuteOnMainQueue(^{ | ||||
|     auto currentBridge = [RCTBridge currentBridge]; | ||||
|     auto anonymousView = | ||||
|         [currentBridge.uiManager viewForReactTag:[NSNumber numberWithDouble:viewTag]]; | ||||
|     auto anonymousView = [currentBridge.uiManager viewForReactTag:[NSNumber numberWithDouble:viewTag]]; | ||||
|     auto view = static_cast<CameraView*>(anonymousView); | ||||
|     if (frameProcessorType == "frame-processor") { | ||||
|       view.frameProcessor = [[FrameProcessor alloc] initWithWorklet:worklet | ||||
|                                                             context:_workletContext]; | ||||
|       view.frameProcessor = [[FrameProcessor alloc] initWithWorklet:worklet context:_workletContext]; | ||||
|     } else { | ||||
|       throw std::runtime_error("Unknown FrameProcessor.type passed! Received: " + | ||||
|                                frameProcessorType); | ||||
|       throw std::runtime_error("Unknown FrameProcessor.type passed! Received: " + frameProcessorType); | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| @@ -95,20 +88,16 @@ void VisionCameraProxy::setFrameProcessor(jsi::Runtime& runtime, int viewTag, | ||||
| void VisionCameraProxy::removeFrameProcessor(jsi::Runtime& runtime, int viewTag) { | ||||
|   RCTExecuteOnMainQueue(^{ | ||||
|     auto currentBridge = [RCTBridge currentBridge]; | ||||
|     auto anonymousView = | ||||
|         [currentBridge.uiManager viewForReactTag:[NSNumber numberWithDouble:viewTag]]; | ||||
|     auto anonymousView = [currentBridge.uiManager viewForReactTag:[NSNumber numberWithDouble:viewTag]]; | ||||
|     auto view = static_cast<CameraView*>(anonymousView); | ||||
|     view.frameProcessor = nil; | ||||
|   }); | ||||
| } | ||||
|  | ||||
| jsi::Value VisionCameraProxy::getFrameProcessorPlugin(jsi::Runtime& runtime, std::string name, | ||||
|                                                       const jsi::Object& options) { | ||||
| jsi::Value VisionCameraProxy::getFrameProcessorPlugin(jsi::Runtime& runtime, std::string name, const jsi::Object& options) { | ||||
|   NSString* key = [NSString stringWithUTF8String:name.c_str()]; | ||||
|   NSDictionary* optionsObjc = | ||||
|       JSINSObjectConversion::convertJSIObjectToNSDictionary(runtime, options, _callInvoker); | ||||
|   FrameProcessorPlugin* plugin = [FrameProcessorPluginRegistry getPlugin:key | ||||
|                                                              withOptions:optionsObjc]; | ||||
|   NSDictionary* optionsObjc = JSINSObjectConversion::convertJSIObjectToNSDictionary(runtime, options, _callInvoker); | ||||
|   FrameProcessorPlugin* plugin = [FrameProcessorPluginRegistry getPlugin:key withOptions:optionsObjc]; | ||||
|   if (plugin == nil) { | ||||
|     return jsi::Value::undefined(); | ||||
|   } | ||||
| @@ -123,8 +112,7 @@ jsi::Value VisionCameraProxy::get(jsi::Runtime& runtime, const jsi::PropNameID& | ||||
|   if (name == "setFrameProcessor") { | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "setFrameProcessor"), 1, | ||||
|         [this](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, | ||||
|                size_t count) -> jsi::Value { | ||||
|         [this](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, size_t count) -> jsi::Value { | ||||
|           auto viewTag = arguments[0].asNumber(); | ||||
|           auto object = arguments[1].asObject(runtime); | ||||
|           this->setFrameProcessor(runtime, static_cast<int>(viewTag), object); | ||||
| @@ -134,8 +122,7 @@ jsi::Value VisionCameraProxy::get(jsi::Runtime& runtime, const jsi::PropNameID& | ||||
|   if (name == "removeFrameProcessor") { | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "removeFrameProcessor"), 1, | ||||
|         [this](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, | ||||
|                size_t count) -> jsi::Value { | ||||
|         [this](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, size_t count) -> jsi::Value { | ||||
|           auto viewTag = arguments[0].asNumber(); | ||||
|           this->removeFrameProcessor(runtime, static_cast<int>(viewTag)); | ||||
|           return jsi::Value::undefined(); | ||||
| @@ -144,8 +131,7 @@ jsi::Value VisionCameraProxy::get(jsi::Runtime& runtime, const jsi::PropNameID& | ||||
|   if (name == "getFrameProcessorPlugin") { | ||||
|     return jsi::Function::createFromHostFunction( | ||||
|         runtime, jsi::PropNameID::forUtf8(runtime, "getFrameProcessorPlugin"), 1, | ||||
|         [this](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, | ||||
|                size_t count) -> jsi::Value { | ||||
|         [this](jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, size_t count) -> jsi::Value { | ||||
|           if (count < 1 || !arguments[0].isString()) { | ||||
|             throw jsi::JSError(runtime, "First argument needs to be a string (pluginName)!"); | ||||
|           } | ||||
| @@ -170,8 +156,7 @@ jsi::Value VisionCameraProxy::get(jsi::Runtime& runtime, const jsi::PropNameID& | ||||
|  | ||||
|   // global.VisionCameraProxy | ||||
|   auto visionCameraProxy = std::make_shared<VisionCameraProxy>(runtime, bridge.jsCallInvoker); | ||||
|   runtime.global().setProperty(runtime, "VisionCameraProxy", | ||||
|                                jsi::Object::createFromHostObject(runtime, visionCameraProxy)); | ||||
|   runtime.global().setProperty(runtime, "VisionCameraProxy", jsi::Object::createFromHostObject(runtime, visionCameraProxy)); | ||||
|  | ||||
|   return YES; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user