• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "mode/portrait_session_napi.h"
17 #include "ability/camera_ability_napi.h"
18 #include "napi/native_common.h"
19 #include "camera_napi_utils.h"
20 
21 namespace OHOS {
22 namespace CameraStandard {
23 using namespace std;
24 
25 thread_local napi_ref PortraitSessionNapi::sConstructor_ = nullptr;
26 
PortraitSessionNapi()27 PortraitSessionNapi::PortraitSessionNapi() : env_(nullptr)
28 {
29 }
~PortraitSessionNapi()30 PortraitSessionNapi::~PortraitSessionNapi()
31 {
32     MEDIA_DEBUG_LOG("~PortraitSessionNapi is called");
33 }
PortraitSessionNapiDestructor(napi_env env,void * nativeObject,void * finalize_hint)34 void PortraitSessionNapi::PortraitSessionNapiDestructor(napi_env env, void* nativeObject, void* finalize_hint)
35 {
36     MEDIA_DEBUG_LOG("PortraitSessionNapiDestructor is called");
37     PortraitSessionNapi* cameraObj = reinterpret_cast<PortraitSessionNapi*>(nativeObject);
38     if (cameraObj != nullptr) {
39         delete cameraObj;
40     }
41 }
Init(napi_env env,napi_value exports)42 napi_value PortraitSessionNapi::Init(napi_env env, napi_value exports)
43 {
44     MEDIA_DEBUG_LOG("Init is called");
45     napi_status status;
46     napi_value ctorObj;
47     std::vector<napi_property_descriptor> portrait_props = {
48         DECLARE_NAPI_FUNCTION("getSupportedPortraitEffects", GetSupportedPortraitEffects),
49         DECLARE_NAPI_FUNCTION("getPortraitEffect", GetPortraitEffect),
50         DECLARE_NAPI_FUNCTION("setPortraitEffect", SetPortraitEffect),
51     };
52 
53     std::vector<std::vector<napi_property_descriptor>> descriptors = {camera_process_props,
54         flash_props, auto_exposure_props, focus_props, zoom_props, filter_props, beauty_props,
55         color_effect_props, macro_props, color_management_props, portrait_props, aperture_props,
56         camera_output_capability_props, camera_ability_props};
57     std::vector<napi_property_descriptor> portrait_session_props = CameraNapiUtils::GetPropertyDescriptor(descriptors);
58     status = napi_define_class(env, PORTRAIT_SESSION_NAPI_CLASS_NAME, NAPI_AUTO_LENGTH,
59                                PortraitSessionNapiConstructor, nullptr,
60                                portrait_session_props.size(),
61                                portrait_session_props.data(), &ctorObj);
62     if (status == napi_ok) {
63         int32_t refCount = 1;
64         status = napi_create_reference(env, ctorObj, refCount, &sConstructor_);
65         if (status == napi_ok) {
66             status = napi_set_named_property(env, exports, PORTRAIT_SESSION_NAPI_CLASS_NAME, ctorObj);
67             CHECK_ERROR_RETURN_RET(status == napi_ok, exports);
68         }
69     }
70     MEDIA_ERR_LOG("Init call Failed!");
71     return nullptr;
72 }
73 
CreateCameraSession(napi_env env)74 napi_value PortraitSessionNapi::CreateCameraSession(napi_env env)
75 {
76     MEDIA_DEBUG_LOG("CreateCameraSession is called");
77     CAMERA_SYNC_TRACE;
78     napi_status status;
79     napi_value result = nullptr;
80     napi_value constructor;
81     status = napi_get_reference_value(env, sConstructor_, &constructor);
82     if (status == napi_ok) {
83         sCameraSession_ = CameraManager::GetInstance()->CreateCaptureSession(SceneMode::PORTRAIT);
84         if (sCameraSession_ == nullptr) {
85             MEDIA_ERR_LOG("Failed to create Portrait session instance");
86             napi_get_undefined(env, &result);
87             return result;
88         }
89         status = napi_new_instance(env, constructor, 0, nullptr, &result);
90         sCameraSession_ = nullptr;
91         if (status == napi_ok && result != nullptr) {
92             MEDIA_DEBUG_LOG("success to create Portrait session napi instance");
93             return result;
94         } else {
95             MEDIA_ERR_LOG("Failed to create Portrait session napi instance");
96         }
97     }
98     MEDIA_ERR_LOG("Failed to create Portrait session napi instance last");
99     napi_get_undefined(env, &result);
100     return result;
101 }
102 
PortraitSessionNapiConstructor(napi_env env,napi_callback_info info)103 napi_value PortraitSessionNapi::PortraitSessionNapiConstructor(napi_env env, napi_callback_info info)
104 {
105     MEDIA_DEBUG_LOG("PortraitSessionNapiConstructor is called");
106     napi_status status;
107     napi_value result = nullptr;
108     napi_value thisVar = nullptr;
109 
110     napi_get_undefined(env, &result);
111     CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
112 
113     if (status == napi_ok && thisVar != nullptr) {
114         std::unique_ptr<PortraitSessionNapi> obj = std::make_unique<PortraitSessionNapi>();
115         obj->env_ = env;
116         CHECK_ERROR_RETURN_RET_LOG(sCameraSession_ == nullptr, result, "sCameraSession_ is null");
117         obj->portraitSession_ = static_cast<PortraitSession*>(sCameraSession_.GetRefPtr());
118         obj->cameraSession_ = obj->portraitSession_;
119         CHECK_ERROR_RETURN_RET_LOG(obj->portraitSession_ == nullptr, result, "portraitSession_ is null");
120         status = napi_wrap(env, thisVar, reinterpret_cast<void*>(obj.get()),
121             PortraitSessionNapi::PortraitSessionNapiDestructor, nullptr, nullptr);
122         if (status == napi_ok) {
123             obj.release();
124             return thisVar;
125         } else {
126             MEDIA_ERR_LOG("PortraitSessionNapi Failure wrapping js to native napi");
127         }
128     }
129     MEDIA_ERR_LOG("PortraitSessionNapi call Failed!");
130     return result;
131 }
132 
133 
GetSupportedPortraitEffects(napi_env env,napi_callback_info info)134 napi_value PortraitSessionNapi::GetSupportedPortraitEffects(napi_env env, napi_callback_info info)
135 {
136     MEDIA_DEBUG_LOG("GetPortraitEffect is called");
137     napi_status status;
138     napi_value result = nullptr;
139     size_t argc = ARGS_ZERO;
140     napi_value argv[ARGS_ZERO];
141     napi_value thisVar = nullptr;
142 
143     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
144 
145     napi_get_undefined(env, &result);
146     status = napi_create_array(env, &result);
147     CHECK_ERROR_RETURN_RET_LOG(status != napi_ok, result, "napi_create_array call Failed!");
148     PortraitSessionNapi* portraitSessionNapi = nullptr;
149     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&portraitSessionNapi));
150     if (status == napi_ok && portraitSessionNapi != nullptr && portraitSessionNapi->portraitSession_ != nullptr) {
151         std::vector<PortraitEffect> PortraitEffects =
152             portraitSessionNapi->portraitSession_->GetSupportedPortraitEffects();
153         MEDIA_INFO_LOG("PortraitSessionNapi::GetSupportedPortraitEffect len = %{public}zu",
154             PortraitEffects.size());
155         if (!PortraitEffects.empty()) {
156             for (size_t i = 0; i < PortraitEffects.size(); i++) {
157                 PortraitEffect portaitEffect = PortraitEffects[i];
158                 napi_value value;
159                 napi_create_int32(env, portaitEffect, &value);
160                 napi_set_element(env, result, i, value);
161             }
162         }
163     } else {
164         MEDIA_ERR_LOG("GetSupportedPortraitEffect call Failed!");
165     }
166     return result;
167 }
168 
GetPortraitEffect(napi_env env,napi_callback_info info)169 napi_value PortraitSessionNapi::GetPortraitEffect(napi_env env, napi_callback_info info)
170 {
171     MEDIA_DEBUG_LOG("GetPortraitEffect is called");
172     napi_status status;
173     napi_value result = nullptr;
174     size_t argc = ARGS_ZERO;
175     napi_value argv[ARGS_ZERO];
176     napi_value thisVar = nullptr;
177 
178     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
179 
180     napi_get_undefined(env, &result);
181     PortraitSessionNapi* portraitSessionNapi = nullptr;
182     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&portraitSessionNapi));
183     if (status == napi_ok && portraitSessionNapi != nullptr && portraitSessionNapi->portraitSession_ != nullptr) {
184         PortraitEffect portaitEffect = portraitSessionNapi->portraitSession_->GetPortraitEffect();
185         napi_create_int32(env, portaitEffect, &result);
186     } else {
187         MEDIA_ERR_LOG("GetPortraitEffect call Failed!");
188     }
189     return result;
190 }
191 
SetPortraitEffect(napi_env env,napi_callback_info info)192 napi_value PortraitSessionNapi::SetPortraitEffect(napi_env env, napi_callback_info info)
193 {
194     MEDIA_DEBUG_LOG("SetPortraitEffect is called");
195     CAMERA_SYNC_TRACE;
196     napi_status status;
197     napi_value result = nullptr;
198     size_t argc = ARGS_ONE;
199     napi_value argv[ARGS_ONE] = {0};
200     napi_value thisVar = nullptr;
201 
202     CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
203 
204     napi_get_undefined(env, &result);
205     PortraitSessionNapi* portraitSessionNapi = nullptr;
206     status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&portraitSessionNapi));
207     if (status == napi_ok && portraitSessionNapi != nullptr && portraitSessionNapi->portraitSession_ != nullptr) {
208         int32_t value;
209         napi_get_value_int32(env, argv[PARAM0], &value);
210         PortraitEffect portaitEffect = static_cast<PortraitEffect>(value);
211         portraitSessionNapi->portraitSession_->LockForControl();
212         portraitSessionNapi->portraitSession_->
213                 SetPortraitEffect(static_cast<PortraitEffect>(portaitEffect));
214         MEDIA_INFO_LOG("PortraitSessionNapi setPortraitEffect set portaitEffect %{public}d!", portaitEffect);
215         portraitSessionNapi->portraitSession_->UnlockForControl();
216     } else {
217         MEDIA_ERR_LOG("setPortraitEffect call Failed!");
218     }
219     return result;
220 }
221 } // namespace CameraStandard
222 } // namespace OHOS