1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef METADATA_OUTPUT_NAPI_H_ 17 #define METADATA_OUTPUT_NAPI_H_ 18 19 #include "camera_napi_event_emitter.h" 20 #include "camera_napi_utils.h" 21 #include "input/camera_info.h" 22 #include "input/camera_manager.h" 23 #include "listener_base.h" 24 25 namespace OHOS { 26 namespace CameraStandard { 27 static const char CAMERA_METADATA_OUTPUT_NAPI_CLASS_NAME[] = "MetadataOutput"; 28 29 class MetadataOutputCallback : public MetadataObjectCallback, public ListenerBase, 30 public std::enable_shared_from_this<MetadataOutputCallback> { 31 public: 32 explicit MetadataOutputCallback(napi_env env); 33 virtual ~MetadataOutputCallback() = default; 34 35 void OnMetadataObjectsAvailable(std::vector<sptr<MetadataObject>> metaObjects) const override; 36 private: 37 void OnMetadataObjectsAvailableCallback(const std::vector<sptr<MetadataObject>> metadataObjList) const; 38 napi_value CreateMetadataObjJSArray(napi_env env, const std::vector<sptr<MetadataObject>> metadataObjList) const; 39 void AddMetadataObjExtending(napi_env env, sptr<MetadataObject> metadataObj, napi_value &metadataNapiObj) const; 40 void CreateHumanFaceMetaData(napi_env env, sptr<MetadataObject> metadataObj, napi_value &metadataNapiObj) const; 41 void CreateCatFaceMetaData(napi_env env, sptr<MetadataObject> metadataObj, napi_value &metadataNapiObj) const; 42 void CreateDogFaceMetaData(napi_env env, sptr<MetadataObject> metadataObj, napi_value &metadataNapiObj) const; 43 }; 44 45 class MetadataStateCallbackNapi : public MetadataStateCallback, public ListenerBase, 46 public std::enable_shared_from_this<MetadataStateCallbackNapi> { 47 public: 48 explicit MetadataStateCallbackNapi(napi_env env); 49 virtual ~MetadataStateCallbackNapi() = default; 50 void OnError(const int32_t errorType) const override; 51 52 private: 53 void OnErrorCallback(const int32_t errorType) const; 54 void OnErrorCallbackAsync(const int32_t errorType) const; 55 }; 56 57 struct MetadataOutputCallbackInfo { 58 const std::vector<sptr<MetadataObject>> info_; 59 weak_ptr<const MetadataOutputCallback> listener_; MetadataOutputCallbackInfoMetadataOutputCallbackInfo60 MetadataOutputCallbackInfo(std::vector<sptr<MetadataObject>> metadataObjList, 61 shared_ptr<const MetadataOutputCallback> listener) 62 : info_(metadataObjList), listener_(listener) {} 63 }; 64 65 struct MetadataStateCallbackInfo { 66 int32_t errorType_; 67 weak_ptr<const MetadataStateCallbackNapi> listener_; MetadataStateCallbackInfoMetadataStateCallbackInfo68 MetadataStateCallbackInfo(int32_t errorType, shared_ptr<const MetadataStateCallbackNapi> listener) 69 : errorType_(errorType), listener_(listener) {} 70 }; 71 72 class MetadataOutputNapi : public CameraNapiEventEmitter<MetadataOutputNapi> { 73 public: 74 static napi_value Init(napi_env env, napi_value exports); 75 static napi_value CreateMetadataOutput(napi_env env, std::vector<MetadataObjectType> metadataObjectTypes); 76 static napi_value AddMetadataObjectTypes(napi_env env, napi_callback_info info); 77 static napi_value RemoveMetadataObjectTypes(napi_env env, napi_callback_info info); 78 MetadataOutputNapi(); 79 ~MetadataOutputNapi() override; 80 sptr<MetadataOutput> GetMetadataOutput(); 81 static bool IsMetadataOutput(napi_env env, napi_value obj); 82 static napi_value On(napi_env env, napi_callback_info info); 83 static napi_value Once(napi_env env, napi_callback_info info); 84 static napi_value Off(napi_env env, napi_callback_info info); 85 86 const EmitterFunctions& GetEmitterFunctions() override; 87 88 private: 89 static void MetadataOutputNapiDestructor(napi_env env, void* nativeObject, void* finalize_hint); 90 static napi_value MetadataOutputNapiConstructor(napi_env env, napi_callback_info info); 91 92 static napi_value Start(napi_env env, napi_callback_info info); 93 static napi_value Stop(napi_env env, napi_callback_info info); 94 static napi_value Release(napi_env env, napi_callback_info info); 95 96 void RegisterMetadataObjectsAvailableCallbackListener(const std::string& eventName, napi_env env, 97 napi_value callback, const std::vector<napi_value>& args, bool isOnce); 98 void UnregisterMetadataObjectsAvailableCallbackListener( 99 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args); 100 void RegisterErrorCallbackListener(const std::string& eventName, napi_env env, napi_value callback, 101 const std::vector<napi_value>& args, bool isOnce); 102 void UnregisterErrorCallbackListener( 103 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args); 104 105 static thread_local napi_ref sConstructor_; 106 static thread_local sptr<MetadataOutput> sMetadataOutput_; 107 static thread_local uint32_t metadataOutputTaskId; 108 109 napi_env env_; 110 sptr<MetadataOutput> metadataOutput_; 111 std::shared_ptr<MetadataOutputCallback> metadataOutputCallback_; 112 std::shared_ptr<MetadataStateCallbackNapi> metadataStateCallback_; 113 }; 114 115 struct MetadataOutputAsyncContext : public AsyncContext { MetadataOutputAsyncContextMetadataOutputAsyncContext116 MetadataOutputAsyncContext(std::string funcName, int32_t taskId) : AsyncContext(funcName, taskId) {}; 117 MetadataOutputNapi* objectInfo = nullptr; 118 std::string errorMsg; 119 std::vector<MetadataObjectType> SupportedMetadataObjectTypes; 120 std::vector<MetadataObjectType> setSupportedMetadataObjectTypes; 121 }; 122 } // namespace CameraStandard 123 } // namespace OHOS 124 #endif /* METADATA_OUTPUT_NAPI_H_ */ 125