1 /*
2 * Copyright (c) 2021-2024 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 "input/camera_manager_napi.h"
17
18 #include <cstddef>
19 #include <cstdint>
20 #include <mutex>
21 #include <string>
22 #include <unordered_map>
23 #include <utility>
24 #include <uv.h>
25
26 #include "camera_device.h"
27 #include "camera_error_code.h"
28 #include "camera_log.h"
29 #include "camera_manager.h"
30 #include "camera_napi_const.h"
31 #include "camera_napi_event_emitter.h"
32 #include "camera_napi_object_types.h"
33 #include "camera_napi_param_parser.h"
34 #include "camera_napi_security_utils.h"
35 #include "camera_napi_template_utils.h"
36 #include "camera_napi_utils.h"
37 #include "camera_output_capability.h"
38 #include "camera_xcollie.h"
39 #include "capture_scene_const.h"
40 #include "input/camera_napi.h"
41 #include "input/prelaunch_config.h"
42 #include "js_native_api.h"
43 #include "js_native_api_types.h"
44 #include "mode/aperture_video_session_napi.h"
45 #include "mode/fluorescence_photo_session_napi.h"
46 #include "mode/high_res_photo_session_napi.h"
47 #include "mode/light_painting_session_napi.h"
48 #include "mode/macro_photo_session_napi.h"
49 #include "mode/macro_video_session_napi.h"
50 #include "mode/night_session_napi.h"
51 #include "mode/photo_session_for_sys_napi.h"
52 #include "mode/photo_session_napi.h"
53 #include "mode/portrait_session_napi.h"
54 #include "mode/profession_session_napi.h"
55 #include "mode/quick_shot_photo_session_napi.h"
56 #include "mode/secure_camera_session_napi.h"
57 #include "mode/slow_motion_session_napi.h"
58 #include "mode/time_lapse_photo_session_napi.h"
59 #include "mode/video_session_for_sys_napi.h"
60 #include "mode/video_session_napi.h"
61 #include "napi/native_common.h"
62 #include "refbase.h"
63
64 namespace OHOS {
65 namespace CameraStandard {
66 namespace {
67 thread_local std::unordered_map<std::string, napi_ref> g_napiValueCacheMap {};
CacheNapiValue(napi_env env,const std::string & key,napi_value value)68 void CacheNapiValue(napi_env env, const std::string& key, napi_value value)
69 {
70 napi_ref ref;
71 napi_status status = napi_create_reference(env, value, 0, &ref); // 0 is weakref.
72 if (status == napi_ok) {
73 g_napiValueCacheMap[key] = ref;
74 MEDIA_DEBUG_LOG("CacheNapiValue cache->%{public}s", key.c_str());
75 }
76 }
77
GetCacheNapiValue(napi_env env,const std::string & key)78 napi_value GetCacheNapiValue(napi_env env, const std::string& key)
79 {
80 napi_ref ref;
81 auto it = g_napiValueCacheMap.find(key);
82 if (it == g_napiValueCacheMap.end()) {
83 return nullptr;
84 }
85 ref = it->second;
86 napi_value result;
87 napi_status status = napi_get_reference_value(env, ref, &result);
88 if (status == napi_ok) {
89 MEDIA_DEBUG_LOG("GetCacheNapiValue hit cache->%{public}s", key.c_str());
90 return result;
91 }
92 return nullptr;
93 }
94
CacheSupportedOutputCapability(napi_env env,const std::string & cameraId,int32_t mode,napi_value value)95 void CacheSupportedOutputCapability(napi_env env, const std::string& cameraId, int32_t mode, napi_value value)
96 {
97 std::string key = "OutputCapability:" + cameraId + ":\t" + to_string(mode);
98 CacheNapiValue(env, key, value);
99 MEDIA_DEBUG_LOG("CacheSupportedOutputCapability cache->%{public}s:%{public}d", key.c_str(), mode);
100 }
101
GetCachedSupportedOutputCapability(napi_env env,const std::string & cameraId,int32_t mode)102 napi_value GetCachedSupportedOutputCapability(napi_env env, const std::string& cameraId, int32_t mode)
103 {
104 std::string key = "OutputCapability:" + cameraId + ":\t" + to_string(mode);
105 napi_value result = GetCacheNapiValue(env, key);
106 if (result != nullptr) {
107 MEDIA_DEBUG_LOG("GetCachedSupportedOutputCapability hit cache->%{public}s:%{public}d", key.c_str(), mode);
108 }
109 return result;
110 }
111
CacheSupportedCameras(napi_env env,const std::vector<sptr<CameraDevice>> & cameras,napi_value value)112 void CacheSupportedCameras(napi_env env, const std::vector<sptr<CameraDevice>>& cameras, napi_value value)
113 {
114 std::string key = "SupportedCameras:";
115 for (auto& camera : cameras) {
116 if (camera->GetConnectionType() != CAMERA_CONNECTION_BUILT_IN) {
117 // Exist none built_in camera. Give up cache.
118 MEDIA_DEBUG_LOG("CacheSupportedCameras exist none built_in camera. Give up cache");
119 return;
120 }
121 key.append("\t:");
122 key.append(camera->GetID());
123 }
124 CacheNapiValue(env, key, value);
125 MEDIA_DEBUG_LOG("CacheSupportedCameras cache->%{public}s", key.c_str());
126 }
127
GetCachedSupportedCameras(napi_env env,const std::vector<sptr<CameraDevice>> & cameras)128 napi_value GetCachedSupportedCameras(napi_env env, const std::vector<sptr<CameraDevice>>& cameras)
129 {
130 std::string key = "SupportedCameras:";
131 for (auto& camera : cameras) {
132 if (camera->GetConnectionType() != CAMERA_CONNECTION_BUILT_IN) {
133 // Exist none built_in camera. Give up cache.
134 MEDIA_DEBUG_LOG("GetCachedSupportedCameras exist none built_in camera. Give up cache");
135 return nullptr;
136 }
137 key.append("\t:");
138 key.append(camera->GetID());
139 }
140 napi_value result = GetCacheNapiValue(env, key);
141 if (result != nullptr) {
142 MEDIA_DEBUG_LOG("GetCachedSupportedCameras hit cache->%{public}s", key.c_str());
143 }
144 return result;
145 }
146 } // namespace
147
148 using namespace std;
149 using namespace CameraNapiSecurity;
150 thread_local napi_ref CameraManagerNapi::sConstructor_ = nullptr;
151 thread_local uint32_t CameraManagerNapi::cameraManagerTaskId = CAMERA_MANAGER_TASKID;
152
153 const std::unordered_map<SceneMode, JsSceneMode> g_nativeToNapiSupportedModeForSystem_ = {
154 {SceneMode::CAPTURE, JsSceneMode::JS_CAPTURE},
155 {SceneMode::VIDEO, JsSceneMode::JS_VIDEO},
156 {SceneMode::PORTRAIT, JsSceneMode::JS_PORTRAIT},
157 {SceneMode::NIGHT, JsSceneMode::JS_NIGHT},
158 {SceneMode::CAPTURE_MACRO, JsSceneMode::JS_CAPTURE_MARCO},
159 {SceneMode::VIDEO_MACRO, JsSceneMode::JS_VIDEO_MARCO},
160 {SceneMode::SLOW_MOTION, JsSceneMode::JS_SLOW_MOTION},
161 {SceneMode::PROFESSIONAL_PHOTO, JsSceneMode::JS_PROFESSIONAL_PHOTO},
162 {SceneMode::PROFESSIONAL_VIDEO, JsSceneMode::JS_PROFESSIONAL_VIDEO},
163 {SceneMode::HIGH_RES_PHOTO, JsSceneMode::JS_HIGH_RES_PHOTO},
164 {SceneMode::SECURE, JsSceneMode::JS_SECURE_CAMERA},
165 {SceneMode::QUICK_SHOT_PHOTO, JsSceneMode::JS_QUICK_SHOT_PHOTO},
166 {SceneMode::APERTURE_VIDEO, JsSceneMode::JS_APERTURE_VIDEO},
167 {SceneMode::PANORAMA_PHOTO, JsSceneMode::JS_PANORAMA_PHOTO},
168 {SceneMode::LIGHT_PAINTING, JsSceneMode::JS_LIGHT_PAINTING},
169 {SceneMode::TIMELAPSE_PHOTO, JsSceneMode::JS_TIMELAPSE_PHOTO},
170 {SceneMode::FLUORESCENCE_PHOTO, JsSceneMode::JS_FLUORESCENCE_PHOTO},
171 };
172
173 const std::unordered_map<SceneMode, JsSceneMode> g_nativeToNapiSupportedMode_ = {
174 {SceneMode::CAPTURE, JsSceneMode::JS_CAPTURE},
175 {SceneMode::VIDEO, JsSceneMode::JS_VIDEO},
176 {SceneMode::SECURE, JsSceneMode::JS_SECURE_CAMERA},
177 };
178
CameraManagerCallbackNapi(napi_env env)179 CameraManagerCallbackNapi::CameraManagerCallbackNapi(napi_env env): ListenerBase(env)
180 {}
181
~CameraManagerCallbackNapi()182 CameraManagerCallbackNapi::~CameraManagerCallbackNapi()
183 {
184 }
185
OnCameraStatusCallbackAsync(const CameraStatusInfo & cameraStatusInfo) const186 void CameraManagerCallbackNapi::OnCameraStatusCallbackAsync(const CameraStatusInfo &cameraStatusInfo) const
187 {
188 MEDIA_DEBUG_LOG("OnCameraStatusCallbackAsync is called");
189 uv_loop_s* loop = nullptr;
190 napi_get_uv_event_loop(env_, &loop);
191 if (!loop) {
192 MEDIA_ERR_LOG("failed to get event loop");
193 return;
194 }
195 uv_work_t* work = new(std::nothrow) uv_work_t;
196 if (!work) {
197 MEDIA_ERR_LOG("failed to allocate work");
198 return;
199 }
200 std::unique_ptr<CameraStatusCallbackInfo> callbackInfo =
201 std::make_unique<CameraStatusCallbackInfo>(cameraStatusInfo, shared_from_this());
202 work->data = callbackInfo.get();
203 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t* work) {}, [] (uv_work_t* work, int status) {
204 CameraStatusCallbackInfo* callbackInfo = reinterpret_cast<CameraStatusCallbackInfo *>(work->data);
205 if (callbackInfo) {
206 auto listener = callbackInfo->listener_.lock();
207 if (listener) {
208 listener->OnCameraStatusCallback(callbackInfo->info_);
209 }
210 delete callbackInfo;
211 }
212 delete work;
213 }, uv_qos_user_initiated);
214 if (ret) {
215 MEDIA_ERR_LOG("failed to execute work");
216 delete work;
217 } else {
218 callbackInfo.release();
219 }
220 }
221
OnCameraStatusCallback(const CameraStatusInfo & cameraStatusInfo) const222 void CameraManagerCallbackNapi::OnCameraStatusCallback(const CameraStatusInfo& cameraStatusInfo) const
223 {
224 MEDIA_DEBUG_LOG("OnCameraStatusCallback is called");
225 napi_value result[ARGS_TWO];
226 napi_value retVal;
227 napi_value propValue;
228 napi_value undefinedResult;
229
230 napi_get_undefined(env_, &result[PARAM0]);
231 napi_get_undefined(env_, &result[PARAM1]);
232 napi_get_undefined(env_, &undefinedResult);
233 CAMERA_NAPI_CHECK_NULL_PTR_RETURN_VOID(cameraStatusInfo.cameraDevice, "callback cameraDevice is null");
234 napi_create_object(env_, &result[PARAM1]);
235
236 if (cameraStatusInfo.cameraDevice != nullptr) {
237 napi_value cameraDeviceNapi = CameraNapiObjCameraDevice(*cameraStatusInfo.cameraDevice).GenerateNapiValue(env_);
238 napi_set_named_property(env_, result[PARAM1], "camera", cameraDeviceNapi);
239 } else {
240 MEDIA_ERR_LOG("Camera info is null");
241 napi_set_named_property(env_, result[PARAM1], "camera", undefinedResult);
242 }
243
244 int32_t jsCameraStatus = -1;
245 jsCameraStatus = cameraStatusInfo.cameraStatus;
246 napi_create_int64(env_, jsCameraStatus, &propValue);
247 napi_set_named_property(env_, result[PARAM1], "status", propValue);
248 MEDIA_INFO_LOG("CameraId: %{public}s, CameraStatus: %{public}d", cameraStatusInfo.cameraDevice->GetID().c_str(),
249 cameraStatusInfo.cameraStatus);
250
251 ExecuteCallbackNapiPara callbackNapiPara { .recv = nullptr, .argc = ARGS_TWO, .argv = result, .result = &retVal };
252 ExecuteCallback("cameraStatus", callbackNapiPara);
253 }
254
OnCameraStatusChanged(const CameraStatusInfo & cameraStatusInfo) const255 void CameraManagerCallbackNapi::OnCameraStatusChanged(const CameraStatusInfo &cameraStatusInfo) const
256 {
257 MEDIA_DEBUG_LOG("OnCameraStatusChanged is called, CameraStatus: %{public}d", cameraStatusInfo.cameraStatus);
258 OnCameraStatusCallbackAsync(cameraStatusInfo);
259 }
260
OnFlashlightStatusChanged(const std::string & cameraID,const FlashStatus flashStatus) const261 void CameraManagerCallbackNapi::OnFlashlightStatusChanged(const std::string &cameraID,
262 const FlashStatus flashStatus) const
263 {
264 (void)cameraID;
265 (void)flashStatus;
266 }
267
CameraMuteListenerNapi(napi_env env)268 CameraMuteListenerNapi::CameraMuteListenerNapi(napi_env env): ListenerBase(env)
269 {
270 MEDIA_DEBUG_LOG("CameraMuteListenerNapi is called.");
271 }
272
~CameraMuteListenerNapi()273 CameraMuteListenerNapi::~CameraMuteListenerNapi()
274 {
275 MEDIA_DEBUG_LOG("~CameraMuteListenerNapi is called.");
276 }
277
OnCameraMuteCallbackAsync(bool muteMode) const278 void CameraMuteListenerNapi::OnCameraMuteCallbackAsync(bool muteMode) const
279 {
280 uv_loop_s* loop = nullptr;
281 napi_get_uv_event_loop(env_, &loop);
282 if (!loop) {
283 MEDIA_ERR_LOG("Failed to get event loop");
284 return;
285 }
286 uv_work_t* work = new(std::nothrow) uv_work_t;
287 if (!work) {
288 MEDIA_ERR_LOG("Failed to allocate work");
289 return;
290 }
291 std::unique_ptr<CameraMuteCallbackInfo> callbackInfo =
292 std::make_unique<CameraMuteCallbackInfo>(muteMode, this);
293 work->data = callbackInfo.get();
294 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t* work) {}, [] (uv_work_t* work, int status) {
295 CameraMuteCallbackInfo* callbackInfo = reinterpret_cast<CameraMuteCallbackInfo *>(work->data);
296 if (callbackInfo) {
297 callbackInfo->listener_->OnCameraMuteCallback(callbackInfo->muteMode_);
298 delete callbackInfo;
299 }
300 delete work;
301 }, uv_qos_user_initiated);
302 if (ret) {
303 MEDIA_ERR_LOG("Failed to execute work");
304 delete work;
305 } else {
306 callbackInfo.release();
307 }
308 }
309
OnCameraMuteCallback(bool muteMode) const310 void CameraMuteListenerNapi::OnCameraMuteCallback(bool muteMode) const
311 {
312 MEDIA_DEBUG_LOG("OnCameraMuteCallback is called, muteMode: %{public}d", muteMode);
313 napi_value result[ARGS_TWO];
314 napi_value retVal;
315 napi_get_undefined(env_, &result[PARAM0]);
316 napi_get_undefined(env_, &result[PARAM1]);
317 napi_get_boolean(env_, muteMode, &result[PARAM1]);
318
319 ExecuteCallbackNapiPara callbackNapiPara { .recv = nullptr, .argc = ARGS_TWO, .argv = result, .result = &retVal };
320 ExecuteCallback("cameraMute", callbackNapiPara);
321 }
322
OnCameraMute(bool muteMode) const323 void CameraMuteListenerNapi::OnCameraMute(bool muteMode) const
324 {
325 MEDIA_DEBUG_LOG("OnCameraMute is called, muteMode: %{public}d", muteMode);
326 OnCameraMuteCallbackAsync(muteMode);
327 }
328
TorchListenerNapi(napi_env env)329 TorchListenerNapi::TorchListenerNapi(napi_env env): ListenerBase(env)
330 {
331 MEDIA_DEBUG_LOG("TorchListenerNapi is called.");
332 }
333
~TorchListenerNapi()334 TorchListenerNapi::~TorchListenerNapi()
335 {
336 MEDIA_DEBUG_LOG("~TorchListenerNapi is called.");
337 }
338
OnTorchStatusChangeCallbackAsync(const TorchStatusInfo & torchStatusInfo) const339 void TorchListenerNapi::OnTorchStatusChangeCallbackAsync(const TorchStatusInfo &torchStatusInfo) const
340 {
341 MEDIA_DEBUG_LOG("OnTorchStatusChangeCallbackAsync is called");
342 uv_loop_s* loop = nullptr;
343 napi_get_uv_event_loop(env_, &loop);
344 if (!loop) {
345 MEDIA_ERR_LOG("Failed to get event loop");
346 return;
347 }
348 uv_work_t* work = new(std::nothrow) uv_work_t;
349 if (!work) {
350 MEDIA_ERR_LOG("Failed to allocate work");
351 return;
352 }
353 std::unique_ptr<TorchStatusChangeCallbackInfo> callbackInfo =
354 std::make_unique<TorchStatusChangeCallbackInfo>(torchStatusInfo, this);
355 work->data = callbackInfo.get();
356 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t* work) {}, [] (uv_work_t* work, int status) {
357 TorchStatusChangeCallbackInfo* callbackInfo = reinterpret_cast<TorchStatusChangeCallbackInfo *>(work->data);
358 if (callbackInfo) {
359 callbackInfo->listener_->OnTorchStatusChangeCallback(callbackInfo->info_);
360 delete callbackInfo;
361 }
362 delete work;
363 }, uv_qos_user_initiated);
364 if (ret) {
365 MEDIA_ERR_LOG("Failed to execute work");
366 delete work;
367 } else {
368 callbackInfo.release();
369 }
370 }
371
OnTorchStatusChangeCallback(const TorchStatusInfo & torchStatusInfo) const372 void TorchListenerNapi::OnTorchStatusChangeCallback(const TorchStatusInfo& torchStatusInfo) const
373 {
374 MEDIA_DEBUG_LOG("OnTorchStatusChangeCallback is called");
375 napi_handle_scope scope = nullptr;
376 napi_open_handle_scope(env_, &scope);
377 if (scope == nullptr) {
378 return;
379 }
380 napi_value result[ARGS_TWO];
381 napi_value retVal;
382 napi_value propValue;
383
384 napi_get_undefined(env_, &result[PARAM0]);
385 napi_get_undefined(env_, &result[PARAM1]);
386
387 napi_create_object(env_, &result[PARAM1]);
388
389 napi_get_boolean(env_, torchStatusInfo.isTorchAvailable, &propValue);
390 napi_set_named_property(env_, result[PARAM1], "isTorchAvailable", propValue);
391 napi_get_boolean(env_, torchStatusInfo.isTorchActive, &propValue);
392 napi_set_named_property(env_, result[PARAM1], "isTorchActive", propValue);
393 napi_create_double(env_, torchStatusInfo.torchLevel, &propValue);
394 napi_set_named_property(env_, result[PARAM1], "torchLevel", propValue);
395
396 ExecuteCallbackNapiPara callbackNapiPara { .recv = nullptr, .argc = ARGS_TWO, .argv = result, .result = &retVal };
397 ExecuteCallback("torchStatusChange", callbackNapiPara);
398 napi_close_handle_scope(env_, scope);
399 }
400
OnTorchStatusChange(const TorchStatusInfo & torchStatusInfo) const401 void TorchListenerNapi::OnTorchStatusChange(const TorchStatusInfo &torchStatusInfo) const
402 {
403 MEDIA_DEBUG_LOG("OnTorchStatusChange is called");
404 OnTorchStatusChangeCallbackAsync(torchStatusInfo);
405 }
406
FoldListenerNapi(napi_env env)407 FoldListenerNapi::FoldListenerNapi(napi_env env): ListenerBase(env)
408 {
409 MEDIA_DEBUG_LOG("FoldListenerNapi is called.");
410 }
411
~FoldListenerNapi()412 FoldListenerNapi::~FoldListenerNapi()
413 {
414 MEDIA_DEBUG_LOG("~FoldListenerNapi is called.");
415 }
416
OnFoldStatusChangedCallbackAsync(const FoldStatusInfo & foldStatusInfo) const417 void FoldListenerNapi::OnFoldStatusChangedCallbackAsync(const FoldStatusInfo &foldStatusInfo) const
418 {
419 MEDIA_DEBUG_LOG("OnFoldStatusChangedCallbackAsync is called");
420 uv_loop_s* loop = nullptr;
421 napi_get_uv_event_loop(env_, &loop);
422 if (!loop) {
423 MEDIA_ERR_LOG("Failed to get event loop");
424 return;
425 }
426 uv_work_t* work = new(std::nothrow) uv_work_t;
427 if (!work) {
428 MEDIA_ERR_LOG("Failed to allocate work");
429 return;
430 }
431 std::unique_ptr<FoldStatusChangeCallbackInfo> callbackInfo =
432 std::make_unique<FoldStatusChangeCallbackInfo>(foldStatusInfo, this);
433 work->data = callbackInfo.get();
434 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t* work) {}, [] (uv_work_t* work, int status) {
435 FoldStatusChangeCallbackInfo* callbackInfo = reinterpret_cast<FoldStatusChangeCallbackInfo *>(work->data);
436 if (callbackInfo) {
437 callbackInfo->listener_->OnFoldStatusChangedCallback(callbackInfo->info_);
438 delete callbackInfo;
439 }
440 delete work;
441 }, uv_qos_user_initiated);
442 if (ret) {
443 MEDIA_ERR_LOG("Failed to execute work");
444 delete work;
445 } else {
446 callbackInfo.release();
447 }
448 }
449
OnFoldStatusChangedCallback(const FoldStatusInfo & foldStatusInfo) const450 void FoldListenerNapi::OnFoldStatusChangedCallback(const FoldStatusInfo& foldStatusInfo) const
451 {
452 MEDIA_DEBUG_LOG("OnFoldStatusChangedCallback is called");
453 napi_handle_scope scope = nullptr;
454 napi_open_handle_scope(env_, &scope);
455 if (scope == nullptr) {
456 MEDIA_ERR_LOG("scope is null");
457 return;
458 }
459 napi_value result[ARGS_TWO];
460 napi_value retVal = nullptr;
461 napi_value propValue = nullptr;
462 napi_value errCode;
463
464 napi_create_object(env_, &result[PARAM0]);
465 napi_create_object(env_, &result[PARAM1]);
466 napi_create_int32(env_, foldStatusInfo.foldStatus, &propValue);
467 napi_set_named_property(env_, result[PARAM1], "foldStatus", propValue);
468 if (napi_create_array(env_, &propValue) != napi_ok) {
469 MEDIA_ERR_LOG("Failed to create array napi wrapper object");
470 return;
471 }
472 auto supportedCameras = foldStatusInfo.supportedCameras;
473 if (!supportedCameras.empty()) {
474 napi_create_int32(env_, 0, &errCode);
475 napi_set_named_property(env_, result[PARAM0], "code", errCode);
476 for (size_t i = 0; i < supportedCameras.size(); i++) {
477 if (supportedCameras[i] == nullptr) {
478 MEDIA_ERR_LOG("cameraDevice is null");
479 continue;
480 }
481 napi_value camera = CameraNapiObjCameraDevice(*supportedCameras[i]).GenerateNapiValue(env_);
482 if (napi_set_element(env_, propValue, i, camera) != napi_ok) {
483 MEDIA_ERR_LOG("Failed to create profile napi wrapper object");
484 return;
485 }
486 }
487 } else {
488 MEDIA_ERR_LOG("supportedCameras is empty");
489 napi_create_int32(env_, CameraErrorCode::SERVICE_FATL_ERROR, &errCode);
490 napi_set_named_property(env_, result[PARAM0], "code", errCode);
491 }
492 napi_set_named_property(env_, result[PARAM1], "supportedCameras", propValue);
493 ExecuteCallbackNapiPara callbackNapiPara { .recv = nullptr, .argc = ARGS_TWO, .argv = result, .result = &retVal };
494 ExecuteCallback("foldStatusChange", callbackNapiPara);
495 napi_close_handle_scope(env_, scope);
496 }
497
OnFoldStatusChanged(const FoldStatusInfo & foldStatusInfo) const498 void FoldListenerNapi::OnFoldStatusChanged(const FoldStatusInfo &foldStatusInfo) const
499 {
500 MEDIA_DEBUG_LOG("OnFoldStatusChanged is called");
501 OnFoldStatusChangedCallbackAsync(foldStatusInfo);
502 }
503
504 const std::unordered_map<JsSceneMode, SceneMode> g_jsToFwMode_ = {
505 {JsSceneMode::JS_NORMAL, SceneMode::NORMAL},
506 {JsSceneMode::JS_CAPTURE, SceneMode::CAPTURE},
507 {JsSceneMode::JS_VIDEO, SceneMode::VIDEO},
508 {JsSceneMode::JS_SECURE_CAMERA, SceneMode::SECURE},
509 };
510
511 const std::unordered_map<JsSceneMode, SceneMode> g_jsToFwMode4Sys_ = {
512 {JsSceneMode::JS_NORMAL, SceneMode::NORMAL},
513 {JsSceneMode::JS_CAPTURE, SceneMode::CAPTURE},
514 {JsSceneMode::JS_VIDEO, SceneMode::VIDEO},
515 {JsSceneMode::JS_PORTRAIT, SceneMode::PORTRAIT},
516 {JsSceneMode::JS_NIGHT, SceneMode::NIGHT},
517 {JsSceneMode::JS_SLOW_MOTION, SceneMode::SLOW_MOTION},
518 {JsSceneMode::JS_CAPTURE_MARCO, SceneMode::CAPTURE_MACRO},
519 {JsSceneMode::JS_VIDEO_MARCO, SceneMode::VIDEO_MACRO},
520 {JsSceneMode::JS_PROFESSIONAL_PHOTO, SceneMode::PROFESSIONAL_PHOTO},
521 {JsSceneMode::JS_PROFESSIONAL_VIDEO, SceneMode::PROFESSIONAL_VIDEO},
522 {JsSceneMode::JS_HIGH_RES_PHOTO, SceneMode::HIGH_RES_PHOTO},
523 {JsSceneMode::JS_SECURE_CAMERA, SceneMode::SECURE},
524 {JsSceneMode::JS_QUICK_SHOT_PHOTO, SceneMode::QUICK_SHOT_PHOTO},
525 {JsSceneMode::JS_APERTURE_VIDEO, SceneMode::APERTURE_VIDEO},
526 {JsSceneMode::JS_PANORAMA_PHOTO, SceneMode::PANORAMA_PHOTO},
527 {JsSceneMode::JS_LIGHT_PAINTING, SceneMode::LIGHT_PAINTING},
528 {JsSceneMode::JS_TIMELAPSE_PHOTO, SceneMode::TIMELAPSE_PHOTO},
529 {JsSceneMode::JS_FLUORESCENCE_PHOTO, SceneMode::FLUORESCENCE_PHOTO},
530 };
531
532 static std::unordered_map<JsPolicyType, PolicyType> g_jsToFwPolicyType_ = {
533 {JsPolicyType::JS_PRIVACY, PolicyType::PRIVACY},
534 };
535
536 std::unordered_map<int32_t, std::function<napi_value(napi_env)>> g_sessionFactories4Sys_ = {
__anon7aacd5720a02() 537 {JsSceneMode::JS_CAPTURE, [] (napi_env env) {
538 return PhotoSessionForSysNapi::CreateCameraSession(env); }},
__anon7aacd5720b02() 539 {JsSceneMode::JS_VIDEO, [] (napi_env env) {
540 return VideoSessionForSysNapi::CreateCameraSession(env); }},
__anon7aacd5720c02() 541 {JsSceneMode::JS_PORTRAIT, [] (napi_env env) { return PortraitSessionNapi::CreateCameraSession(env); }},
__anon7aacd5720d02() 542 {JsSceneMode::JS_NIGHT, [] (napi_env env) { return NightSessionNapi::CreateCameraSession(env); }},
__anon7aacd5720e02() 543 {JsSceneMode::JS_SLOW_MOTION, [] (napi_env env) { return SlowMotionSessionNapi::CreateCameraSession(env); }},
__anon7aacd5720f02() 544 {JsSceneMode::JS_PROFESSIONAL_PHOTO, [] (napi_env env) {
545 return ProfessionSessionNapi::CreateCameraSession(env, SceneMode::PROFESSIONAL_PHOTO); }},
__anon7aacd5721002() 546 {JsSceneMode::JS_PROFESSIONAL_VIDEO, [] (napi_env env) {
547 return ProfessionSessionNapi::CreateCameraSession(env, SceneMode::PROFESSIONAL_VIDEO); }},
__anon7aacd5721102() 548 {JsSceneMode::JS_CAPTURE_MARCO, [] (napi_env env) {
549 return MacroPhotoSessionNapi::CreateCameraSession(env); }},
__anon7aacd5721202() 550 {JsSceneMode::JS_VIDEO_MARCO, [] (napi_env env) {
551 return MacroVideoSessionNapi::CreateCameraSession(env); }},
__anon7aacd5721302() 552 {JsSceneMode::JS_HIGH_RES_PHOTO, [] (napi_env env) {
553 return HighResPhotoSessionNapi::CreateCameraSession(env); }},
__anon7aacd5721402() 554 {JsSceneMode::JS_SECURE_CAMERA, [] (napi_env env) {
555 return SecureCameraSessionNapi::CreateCameraSession(env); }},
__anon7aacd5721502() 556 {JsSceneMode::JS_QUICK_SHOT_PHOTO, [] (napi_env env) {
557 return QuickShotPhotoSessionNapi::CreateCameraSession(env); }},
__anon7aacd5721602() 558 {JsSceneMode::JS_APERTURE_VIDEO, [] (napi_env env) {
559 return ApertureVideoSessionNapi::CreateCameraSession(env); }},
__anon7aacd5721702() 560 {JsSceneMode::JS_PANORAMA_PHOTO, [] (napi_env env) {
561 return PanoramaSessionNapi::CreateCameraSession(env); }},
__anon7aacd5721802() 562 {JsSceneMode::JS_LIGHT_PAINTING, [] (napi_env env) {
563 return LightPaintingSessionNapi::CreateCameraSession(env); }},
__anon7aacd5721902() 564 {JsSceneMode::JS_TIMELAPSE_PHOTO, [] (napi_env env) {
565 return TimeLapsePhotoSessionNapi::CreateCameraSession(env); }},
__anon7aacd5721a02() 566 {JsSceneMode::JS_FLUORESCENCE_PHOTO, [] (napi_env env) {
567 return FluorescencePhotoSessionNapi::CreateCameraSession(env); }},
568 };
569
570 std::unordered_map<int32_t, std::function<napi_value(napi_env)>> g_sessionFactories = {
__anon7aacd5721b02() 571 {JsSceneMode::JS_CAPTURE, [] (napi_env env) {
572 return PhotoSessionNapi::CreateCameraSession(env); }},
__anon7aacd5721c02() 573 {JsSceneMode::JS_VIDEO, [] (napi_env env) {
574 return VideoSessionNapi::CreateCameraSession(env); }},
__anon7aacd5721d02() 575 {JsSceneMode::JS_SECURE_CAMERA, [] (napi_env env) {
576 return SecureCameraSessionNapi::CreateCameraSession(env); }},
577 };
578
CameraManagerNapi()579 CameraManagerNapi::CameraManagerNapi() : env_(nullptr)
580 {
581 CAMERA_SYNC_TRACE;
582 }
583
~CameraManagerNapi()584 CameraManagerNapi::~CameraManagerNapi()
585 {
586 MEDIA_DEBUG_LOG("~CameraManagerNapi is called");
587 }
588
589 // Constructor callback
CameraManagerNapiConstructor(napi_env env,napi_callback_info info)590 napi_value CameraManagerNapi::CameraManagerNapiConstructor(napi_env env, napi_callback_info info)
591 {
592 MEDIA_DEBUG_LOG("CameraManagerNapiConstructor is called");
593 napi_status status;
594 napi_value result = nullptr;
595 napi_value thisVar = nullptr;
596
597 napi_get_undefined(env, &result);
598 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
599
600 if (status == napi_ok && thisVar != nullptr) {
601 std::unique_ptr<CameraManagerNapi> obj = std::make_unique<CameraManagerNapi>();
602 obj->env_ = env;
603 obj->cameraManager_ = CameraManager::GetInstance();
604 if (obj->cameraManager_ == nullptr) {
605 MEDIA_ERR_LOG("Failure wrapping js to native napi, obj->cameraManager_ null");
606 return result;
607 }
608 status = napi_wrap(env, thisVar, reinterpret_cast<void*>(obj.get()),
609 CameraManagerNapi::CameraManagerNapiDestructor, nullptr, nullptr);
610 if (status == napi_ok) {
611 obj.release();
612 return thisVar;
613 } else {
614 MEDIA_ERR_LOG("Failure wrapping js to native napi");
615 }
616 }
617 MEDIA_ERR_LOG("CameraManagerNapiConstructor call Failed!");
618 return result;
619 }
620
CameraManagerNapiDestructor(napi_env env,void * nativeObject,void * finalize_hint)621 void CameraManagerNapi::CameraManagerNapiDestructor(napi_env env, void* nativeObject, void* finalize_hint)
622 {
623 MEDIA_DEBUG_LOG("CameraManagerNapiDestructor is called");
624 CameraManagerNapi* camera = reinterpret_cast<CameraManagerNapi*>(nativeObject);
625 if (camera != nullptr) {
626 delete camera;
627 }
628 }
629
Init(napi_env env,napi_value exports)630 napi_value CameraManagerNapi::Init(napi_env env, napi_value exports)
631 {
632 MEDIA_DEBUG_LOG("Init is called");
633 napi_status status;
634 napi_value ctorObj;
635 int32_t refCount = 1;
636
637 napi_property_descriptor camera_mgr_properties[] = {
638 // CameraManager
639 DECLARE_NAPI_FUNCTION("getSupportedCameras", GetSupportedCameras),
640 DECLARE_NAPI_FUNCTION("getSupportedSceneModes", GetSupportedModes),
641 DECLARE_NAPI_FUNCTION("getSupportedOutputCapability", GetSupportedOutputCapability),
642 DECLARE_NAPI_FUNCTION("isCameraMuted", IsCameraMuted),
643 DECLARE_NAPI_FUNCTION("isCameraMuteSupported", IsCameraMuteSupported),
644 DECLARE_NAPI_FUNCTION("muteCamera", MuteCamera),
645 DECLARE_NAPI_FUNCTION("muteCameraPersistent", MuteCameraPersist),
646 DECLARE_NAPI_FUNCTION("prelaunch", PrelaunchCamera),
647 DECLARE_NAPI_FUNCTION("preSwitchCamera", PreSwitchCamera),
648 DECLARE_NAPI_FUNCTION("isPrelaunchSupported", IsPrelaunchSupported),
649 DECLARE_NAPI_FUNCTION("setPrelaunchConfig", SetPrelaunchConfig),
650 DECLARE_NAPI_FUNCTION("createCameraInput", CreateCameraInputInstance),
651 DECLARE_NAPI_FUNCTION("createCaptureSession", CreateCameraSessionInstance),
652 DECLARE_NAPI_FUNCTION("createSession", CreateSessionInstance),
653 DECLARE_NAPI_FUNCTION("createPreviewOutput", CreatePreviewOutputInstance),
654 DECLARE_NAPI_FUNCTION("createDeferredPreviewOutput", CreateDeferredPreviewOutputInstance),
655 DECLARE_NAPI_FUNCTION("createPhotoOutput", CreatePhotoOutputInstance),
656 DECLARE_NAPI_FUNCTION("createVideoOutput", CreateVideoOutputInstance),
657 DECLARE_NAPI_FUNCTION("createMetadataOutput", CreateMetadataOutputInstance),
658 DECLARE_NAPI_FUNCTION("createDepthDataOutput", CreateDepthDataOutputInstance),
659 DECLARE_NAPI_FUNCTION("isTorchSupported", IsTorchSupported),
660 DECLARE_NAPI_FUNCTION("isTorchModeSupported", IsTorchModeSupported),
661 DECLARE_NAPI_FUNCTION("getTorchMode", GetTorchMode),
662 DECLARE_NAPI_FUNCTION("setTorchMode", SetTorchMode),
663 DECLARE_NAPI_FUNCTION("on", On),
664 DECLARE_NAPI_FUNCTION("once", Once),
665 DECLARE_NAPI_FUNCTION("off", Off)
666 };
667
668 status = napi_define_class(env, CAMERA_MANAGER_NAPI_CLASS_NAME, NAPI_AUTO_LENGTH,
669 CameraManagerNapiConstructor, nullptr,
670 sizeof(camera_mgr_properties) / sizeof(camera_mgr_properties[PARAM0]),
671 camera_mgr_properties, &ctorObj);
672 if (status == napi_ok) {
673 if (napi_create_reference(env, ctorObj, refCount, &sConstructor_) == napi_ok) {
674 status = napi_set_named_property(env, exports, CAMERA_MANAGER_NAPI_CLASS_NAME, ctorObj);
675 if (status == napi_ok) {
676 return exports;
677 }
678 }
679 }
680 MEDIA_ERR_LOG("Init call Failed!");
681 return nullptr;
682 }
683
CreateCameraManager(napi_env env)684 napi_value CameraManagerNapi::CreateCameraManager(napi_env env)
685 {
686 MEDIA_INFO_LOG("CreateCameraManager is called");
687 napi_status status;
688 napi_value result = nullptr;
689 napi_value ctor;
690
691 status = napi_get_reference_value(env, sConstructor_, &ctor);
692 if (status == napi_ok) {
693 status = napi_new_instance(env, ctor, 0, nullptr, &result);
694 if (status == napi_ok) {
695 return result;
696 } else {
697 MEDIA_ERR_LOG("New instance could not be obtained");
698 }
699 }
700 napi_get_undefined(env, &result);
701 MEDIA_ERR_LOG("CreateCameraManager call Failed!");
702 return result;
703 }
704
CreateCameraJSArray(napi_env env,std::vector<sptr<CameraDevice>> cameraObjList)705 static napi_value CreateCameraJSArray(napi_env env, std::vector<sptr<CameraDevice>> cameraObjList)
706 {
707 MEDIA_DEBUG_LOG("CreateCameraJSArray is called");
708 napi_value cameraArray = nullptr;
709
710 if (cameraObjList.empty()) {
711 MEDIA_ERR_LOG("cameraObjList is empty");
712 }
713
714 napi_status status = napi_create_array(env, &cameraArray);
715 if (status == napi_ok) {
716 for (size_t i = 0; i < cameraObjList.size(); i++) {
717 if (cameraObjList[i] == nullptr) {
718 continue;
719 }
720 napi_value camera = CameraNapiObjCameraDevice(*cameraObjList[i]).GenerateNapiValue(env);
721 if (camera == nullptr || napi_set_element(env, cameraArray, i, camera) != napi_ok) {
722 MEDIA_ERR_LOG("Failed to create camera napi wrapper object");
723 return nullptr;
724 }
725 }
726 }
727 return cameraArray;
728 }
729
CreateCameraSessionInstance(napi_env env,napi_callback_info info)730 napi_value CameraManagerNapi::CreateCameraSessionInstance(napi_env env, napi_callback_info info)
731 {
732 MEDIA_INFO_LOG("CreateCameraSessionInstance is called");
733 napi_status status;
734 napi_value result = nullptr;
735 size_t argc = ARGS_ZERO;
736 napi_value argv[ARGS_ZERO];
737 napi_value thisVar = nullptr;
738
739 CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
740
741 napi_get_undefined(env, &result);
742
743 CameraManagerNapi* cameraManagerNapi = nullptr;
744 status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
745 if (status != napi_ok || cameraManagerNapi == nullptr) {
746 MEDIA_ERR_LOG("napi_unwrap failure!");
747 return nullptr;
748 }
749 result = CameraSessionNapi::CreateCameraSession(env);
750 return result;
751 }
752
CreateSessionInstance(napi_env env,napi_callback_info info)753 napi_value CameraManagerNapi::CreateSessionInstance(napi_env env, napi_callback_info info)
754 {
755 MEDIA_INFO_LOG("CreateSessionInstance is called");
756 CameraManagerNapi* cameraManagerNapi = nullptr;
757 int32_t jsModeName = -1;
758 CameraNapiParamParser jsParamParser(env, info, cameraManagerNapi, jsModeName);
759 if (!jsParamParser.AssertStatus(INVALID_ARGUMENT, "Create session invalid argument!")) {
760 MEDIA_ERR_LOG("CameraManagerNapi::CreateSessionInstance invalid argument: %{public}d", jsModeName);
761 }
762 MEDIA_INFO_LOG("CameraManagerNapi::CreateSessionInstance mode = %{public}d", jsModeName);
763 napi_value result = nullptr;
764 std::unordered_map<int32_t, std::function<napi_value(napi_env)>> sessionFactories = g_sessionFactories;
765 if (CameraNapiSecurity::CheckSystemApp(env, false)) {
766 sessionFactories = g_sessionFactories4Sys_;
767 }
768 if (sessionFactories.find(jsModeName) != sessionFactories.end()) {
769 result = sessionFactories[jsModeName](env);
770 } else {
771 MEDIA_ERR_LOG("CameraManagerNapi::CreateSessionInstance mode = %{public}d not supported", jsModeName);
772 CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "Invalid js mode");
773 }
774 return result;
775 }
776
ParsePrelaunchConfig(napi_env env,napi_value root,PrelaunchConfig * prelaunchConfig)777 bool ParsePrelaunchConfig(napi_env env, napi_value root, PrelaunchConfig* prelaunchConfig)
778 {
779 napi_value res = nullptr;
780 int32_t intValue;
781 std::string cameraId {};
782 CameraNapiObject cameraInfoObj { { { "cameraId", &cameraId } } };
783 CameraNapiObject cameraDeviceObj { { { "cameraDevice", &cameraInfoObj } } };
784 CameraNapiParamParser paramParser { env, { root }, cameraDeviceObj };
785 if (!paramParser.AssertStatus(INVALID_ARGUMENT, "camera info is invalid.")) {
786 MEDIA_ERR_LOG("ParsePrelaunchConfig get camera device failure!");
787 return false;
788 }
789 prelaunchConfig->cameraDevice_ = CameraManager::GetInstance()->GetCameraDeviceFromId(cameraId);
790 if (prelaunchConfig->cameraDevice_ == nullptr) {
791 MEDIA_ERR_LOG("ParsePrelaunchConfig get camera device failure! cameraId:%{public}s", cameraId.c_str());
792 }
793 if (napi_get_named_property(env, root, "restoreParamType", &res) == napi_ok) {
794 napi_get_value_int32(env, res, &intValue);
795 prelaunchConfig->restoreParamType = static_cast<RestoreParamType>(intValue);
796 MEDIA_INFO_LOG("SetPrelaunchConfig restoreParamType = %{public}d", intValue);
797 }
798
799 if (napi_get_named_property(env, root, "activeTime", &res) == napi_ok) {
800 napi_get_value_int32(env, res, &intValue);
801 prelaunchConfig->activeTime = intValue;
802 MEDIA_INFO_LOG("SetPrelaunchConfig activeTime = %{public}d", intValue);
803 }
804 return true;
805 }
806
ParseSettingParam(napi_env env,napi_value root,EffectParam * effectParam)807 bool ParseSettingParam(napi_env env, napi_value root, EffectParam* effectParam)
808 {
809 napi_value res = nullptr;
810 if (napi_get_named_property(env, root, "settingParam", &res) == napi_ok) {
811 napi_value tempValue = nullptr;
812 int32_t effectValue;
813 if (napi_get_named_property(env, res, "skinSmoothLevel", &tempValue) == napi_ok) {
814 napi_get_value_int32(env, tempValue, &effectValue);
815 effectParam->skinSmoothLevel = effectValue;
816 }
817 if (napi_get_named_property(env, res, "faceSlender", &tempValue) == napi_ok) {
818 napi_get_value_int32(env, tempValue, &effectValue);
819 effectParam->faceSlender = effectValue;
820 }
821
822 if (napi_get_named_property(env, res, "skinTone", &tempValue) == napi_ok) {
823 napi_get_value_int32(env, tempValue, &effectValue);
824 effectParam->skinTone = effectValue;
825 }
826 MEDIA_INFO_LOG("SetPrelaunchConfig effectParam = %{public}d", effectParam->skinSmoothLevel);
827 }
828 return true;
829 }
830
CreatePreviewOutputInstance(napi_env env,napi_callback_info info)831 napi_value CameraManagerNapi::CreatePreviewOutputInstance(napi_env env, napi_callback_info info)
832 {
833 MEDIA_INFO_LOG("CreatePreviewOutputInstance is called");
834 std::string surfaceId;
835 CameraManagerNapi* cameraManagerNapi = nullptr;
836 size_t napiArgsSize = CameraNapiUtils::GetNapiArgs(env, info);
837 MEDIA_INFO_LOG("CameraManagerNapi::CreatePreviewOutputInstance napi args size is %{public}zu", napiArgsSize);
838
839 // Check two parameters
840 if (napiArgsSize == 2) { // 2 parameters condition
841 Profile profile;
842 CameraNapiObject profileSizeObj {{
843 { "width", &profile.size_.width },
844 { "height", &profile.size_.height }
845 }};
846 CameraNapiObject profileNapiOjbect {{
847 { "size", &profileSizeObj },
848 { "format", reinterpret_cast<int32_t*>(&profile.format_) }
849 }};
850 CameraNapiParamParser jsParamParser(env, info, cameraManagerNapi, profileNapiOjbect, surfaceId);
851 if (!jsParamParser.AssertStatus(
852 INVALID_ARGUMENT, "CameraManagerNapi::CreatePreviewOutputInstance 2 args parse error")) {
853 return nullptr;
854 }
855 MEDIA_INFO_LOG("CameraManagerNapi::CreatePreviewOutputInstance ParseProfile "
856 "size.width = %{public}d, size.height = %{public}d, format = %{public}d, surfaceId = %{public}s",
857 profile.size_.width, profile.size_.height, profile.format_, surfaceId.c_str());
858 return PreviewOutputNapi::CreatePreviewOutput(env, profile, surfaceId);
859 }
860
861 // Check one parameters
862 CameraNapiParamParser jsParamParser = CameraNapiParamParser(env, info, cameraManagerNapi, surfaceId);
863 if (!jsParamParser.AssertStatus(
864 INVALID_ARGUMENT, "CameraManagerNapi::CreatePreviewOutputInstance 1 args parse error")) {
865 return nullptr;
866 }
867 MEDIA_INFO_LOG("CameraManagerNapi::CreatePreviewOutputInstance surfaceId : %{public}s", surfaceId.c_str());
868 return PreviewOutputNapi::CreatePreviewOutput(env, surfaceId);
869 }
870
CreateDeferredPreviewOutputInstance(napi_env env,napi_callback_info info)871 napi_value CameraManagerNapi::CreateDeferredPreviewOutputInstance(napi_env env, napi_callback_info info)
872 {
873 MEDIA_INFO_LOG("CreateDeferredPreviewOutputInstance is called");
874 if (!CameraNapiSecurity::CheckSystemApp(env)) {
875 MEDIA_ERR_LOG("SystemApi CreateDeferredPreviewOutputInstance is called!");
876 return nullptr;
877 }
878
879 CameraManagerNapi* cameraManagerNapi = nullptr;
880 Profile profile;
881 CameraNapiObject profileSizeObj {{
882 { "width", &profile.size_.width },
883 { "height", &profile.size_.height }
884 }};
885 CameraNapiObject profileNapiOjbect {{
886 { "size", &profileSizeObj },
887 { "format", reinterpret_cast<int32_t*>(&profile.format_) }
888 }};
889
890 CameraNapiParamParser jsParamParser(env, info, cameraManagerNapi, profileNapiOjbect);
891 if (!jsParamParser.AssertStatus(
892 INVALID_ARGUMENT, "CameraManagerNapi::CreateDeferredPreviewOutput args parse error")) {
893 return nullptr;
894 }
895 MEDIA_INFO_LOG("CameraManagerNapi::CreateDeferredPreviewOutput ParseProfile "
896 "size.width = %{public}d, size.height = %{public}d, format = %{public}d",
897 profile.size_.width, profile.size_.height, profile.format_);
898 return PreviewOutputNapi::CreateDeferredPreviewOutput(env, profile);
899 }
900
CreatePhotoOutputInstance(napi_env env,napi_callback_info info)901 napi_value CameraManagerNapi::CreatePhotoOutputInstance(napi_env env, napi_callback_info info)
902 {
903 MEDIA_INFO_LOG("CreatePhotoOutputInstance is called");
904 std::string surfaceId;
905 CameraManagerNapi* cameraManagerNapi = nullptr;
906 size_t napiArgsSize = CameraNapiUtils::GetNapiArgs(env, info);
907 MEDIA_INFO_LOG("CameraManagerNapi::CreatePhotoOutputInstance napi args size is %{public}zu", napiArgsSize);
908
909 Profile profile;
910 CameraNapiObject profileSizeObj {{
911 { "width", &profile.size_.width },
912 { "height", &profile.size_.height }
913 }};
914 CameraNapiObject profileNapiOjbect {{
915 { "size", &profileSizeObj },
916 { "format", reinterpret_cast<int32_t*>(&profile.format_) }
917 }};
918
919 if (napiArgsSize == 2) { // 2 parameters condition
920 if (!CameraNapiParamParser(env, info, cameraManagerNapi, profileNapiOjbect, surfaceId)
921 .AssertStatus(INVALID_ARGUMENT, "CameraManagerNapi::CreatePhotoOutputInstance 2 args parse error")) {
922 return nullptr;
923 }
924 MEDIA_INFO_LOG("CameraManagerNapi::CreatePhotoOutputInstance ParseProfile "
925 "size.width = %{public}d, size.height = %{public}d, format = %{public}d, surfaceId = %{public}s",
926 profile.size_.width, profile.size_.height, profile.format_, surfaceId.c_str());
927 return PhotoOutputNapi::CreatePhotoOutput(env, profile, surfaceId);
928 } else if (napiArgsSize == 1) { // 1 parameters condition
929 // Check one parameter only profile
930 if (CameraNapiParamParser(env, info, cameraManagerNapi, profileNapiOjbect).IsStatusOk()) {
931 MEDIA_INFO_LOG(
932 "CameraManagerNapi::CreatePhotoOutputInstance ParseProfile "
933 "size.width = %{public}d, size.height = %{public}d, format = %{public}d, surfaceId = %{public}s",
934 profile.size_.width, profile.size_.height, profile.format_, surfaceId.c_str());
935 return PhotoOutputNapi::CreatePhotoOutput(env, profile, "");
936 }
937
938 // Check one parameter only surfaceId
939 if (!CameraNapiParamParser(env, info, cameraManagerNapi, surfaceId)
940 .AssertStatus(INVALID_ARGUMENT, "CameraManagerNapi::CreatePhotoOutputInstance 1 args parse error")) {
941 return nullptr;
942 }
943 MEDIA_INFO_LOG("CameraManagerNapi::CreatePhotoOutputInstance surfaceId : %{public}s", surfaceId.c_str());
944 return PhotoOutputNapi::CreatePhotoOutput(env, surfaceId);
945 }
946
947 MEDIA_WARNING_LOG("CameraManagerNapi::CreatePhotoOutputInstance with none parameter");
948 // Check none parameter
949 if (!CameraNapiParamParser(env, info, cameraManagerNapi)
950 .AssertStatus(INVALID_ARGUMENT, "CameraManagerNapi::CreatePhotoOutputInstance args parse error")) {
951 return nullptr;
952 }
953 return PhotoOutputNapi::CreatePhotoOutput(env, "");
954 }
955
CreateVideoOutputInstance(napi_env env,napi_callback_info info)956 napi_value CameraManagerNapi::CreateVideoOutputInstance(napi_env env, napi_callback_info info)
957 {
958 MEDIA_INFO_LOG("CreateVideoOutputInstance is called");
959 std::string surfaceId;
960 CameraManagerNapi* cameraManagerNapi = nullptr;
961 size_t napiArgsSize = CameraNapiUtils::GetNapiArgs(env, info);
962 MEDIA_INFO_LOG("CameraManagerNapi::CreateVideoOutputInstance napi args size is %{public}zu", napiArgsSize);
963
964 if (napiArgsSize == 2) { // 2 parameters condition
965 VideoProfile videoProfile;
966 videoProfile.framerates_.resize(2); // framerate size is 2
967 CameraNapiObject profileSizeObj {{
968 { "width", &videoProfile.size_.width },
969 { "height", &videoProfile.size_.height }
970 }};
971 CameraNapiObject profileFrameRateObj {{
972 { "min", &videoProfile.framerates_[0] },
973 { "max", &videoProfile.framerates_[1] }
974 }};
975 CameraNapiObject profileNapiOjbect {{
976 { "size", &profileSizeObj },
977 { "frameRateRange", &profileFrameRateObj },
978 { "format", reinterpret_cast<int32_t*>(&videoProfile.format_) }
979 }};
980
981 if (!CameraNapiParamParser(env, info, cameraManagerNapi, profileNapiOjbect, surfaceId)
982 .AssertStatus(INVALID_ARGUMENT, "CameraManagerNapi::CreateVideoOutputInstance 2 args parse error")) {
983 return nullptr;
984 }
985 MEDIA_INFO_LOG(
986 "CameraManagerNapi::CreateVideoOutputInstance ParseVideoProfile "
987 "size.width = %{public}d, size.height = %{public}d, format = %{public}d, frameRateMin = %{public}d, "
988 "frameRateMax = %{public}d, surfaceId = %{public}s",
989 videoProfile.size_.width, videoProfile.size_.height, videoProfile.format_, videoProfile.framerates_[0],
990 videoProfile.framerates_[1], surfaceId.c_str());
991 return VideoOutputNapi::CreateVideoOutput(env, videoProfile, surfaceId);
992 }
993
994 MEDIA_WARNING_LOG("CameraManagerNapi::CreateVideoOutputInstance with only surfaceId");
995 // Check one parameters only surfaceId
996 if (!CameraNapiParamParser(env, info, cameraManagerNapi, surfaceId)
997 .AssertStatus(INVALID_ARGUMENT, "CameraManagerNapi::CreateVideoOutputInstance args parse error")) {
998 return nullptr;
999 }
1000 MEDIA_INFO_LOG("CameraManagerNapi::CreateVideoOutputInstance surfaceId : %{public}s", surfaceId.c_str());
1001 return VideoOutputNapi::CreateVideoOutput(env, surfaceId);
1002 }
1003
CreateDepthDataOutputInstance(napi_env env,napi_callback_info info)1004 napi_value CameraManagerNapi::CreateDepthDataOutputInstance(napi_env env, napi_callback_info info)
1005 {
1006 MEDIA_INFO_LOG("CreateDepthDataOutputInstance is called");
1007 CameraManagerNapi* cameraManagerNapi = nullptr;
1008 size_t napiArgsSize = CameraNapiUtils::GetNapiArgs(env, info);
1009 MEDIA_INFO_LOG("CameraManagerNapi::CreateDepthDataOutputInstance napi args size is %{public}zu", napiArgsSize);
1010
1011 DepthProfile depthProfile;
1012 CameraNapiObject profileSizeObj {{
1013 { "width", &depthProfile.size_.width },
1014 { "height", &depthProfile.size_.height }
1015 }};
1016 CameraNapiObject profileNapiOjbect {{
1017 { "size", &profileSizeObj },
1018 { "dataAccuracy", reinterpret_cast<int32_t*>(&depthProfile.dataAccuracy_) },
1019 { "format", reinterpret_cast<int32_t*>(&depthProfile.format_) }
1020 }};
1021
1022 if (!CameraNapiParamParser(env, info, cameraManagerNapi, profileNapiOjbect)
1023 .AssertStatus(INVALID_ARGUMENT, "CameraManagerNapi::CreateDepthDataOutputInstance 1 args parse error")) {
1024 return nullptr;
1025 }
1026 MEDIA_INFO_LOG(
1027 "CameraManagerNapi::CreateDepthDataOutputInstance ParseDepthProfile "
1028 "size.width = %{public}d, size.height = %{public}d, format = %{public}d, dataAccuracy = %{public}d,",
1029 depthProfile.size_.width, depthProfile.size_.height, depthProfile.format_, depthProfile.dataAccuracy_);
1030 return DepthDataOutputNapi::CreateDepthDataOutput(env, depthProfile);
1031 }
1032
CreateMetadataOutputInstance(napi_env env,napi_callback_info info)1033 napi_value CameraManagerNapi::CreateMetadataOutputInstance(napi_env env, napi_callback_info info)
1034 {
1035 MEDIA_INFO_LOG("CreateMetadataOutputInstance is called");
1036 napi_status status;
1037 napi_value result = nullptr;
1038 size_t argc = ARGS_ONE;
1039 napi_value argv[ARGS_ONE] = {0};
1040 napi_value thisVar = nullptr;
1041
1042 CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1043 if (!CameraNapiUtils::CheckInvalidArgument(env, argc, ARGS_ONE, argv, CREATE_METADATA_OUTPUT_INSTANCE)) {
1044 return result;
1045 }
1046
1047 napi_get_undefined(env, &result);
1048 CameraManagerNapi* cameraManagerNapi = nullptr;
1049 status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
1050 if (status != napi_ok || cameraManagerNapi == nullptr) {
1051 MEDIA_ERR_LOG("napi_unwrap failure!");
1052 return nullptr;
1053 }
1054 std::vector<MetadataObjectType> metadataObjectTypes;
1055 CameraNapiUtils::ParseMetadataObjectTypes(env, argv[PARAM0], metadataObjectTypes);
1056 result = MetadataOutputNapi::CreateMetadataOutput(env, metadataObjectTypes);
1057 return result;
1058 }
1059
GetSupportedCameras(napi_env env,napi_callback_info info)1060 napi_value CameraManagerNapi::GetSupportedCameras(napi_env env, napi_callback_info info)
1061 {
1062 MEDIA_INFO_LOG("GetSupportedCameras is called");
1063 CameraManagerNapi* cameraManagerNapi;
1064 CameraNapiParamParser paramParser(env, info, cameraManagerNapi);
1065 if (!paramParser.AssertStatus(INVALID_ARGUMENT, "invalid argument.")) {
1066 MEDIA_ERR_LOG("CameraManagerNapi::GetSupportedCameras invalid argument");
1067 return nullptr;
1068 }
1069 std::vector<sptr<CameraDevice>> cameraObjList = cameraManagerNapi->cameraManager_->GetSupportedCameras();
1070 napi_value result = GetCachedSupportedCameras(env, cameraObjList);
1071 if (result == nullptr) {
1072 result = CreateCameraJSArray(env, cameraObjList);
1073 CacheSupportedCameras(env, cameraObjList, result);
1074 }
1075 MEDIA_DEBUG_LOG("CameraManagerNapi::GetSupportedCameras size=[%{public}zu]", cameraObjList.size());
1076 return result;
1077 }
1078
CreateSceneModeJSArray(napi_env env,std::vector<SceneMode> nativeArray)1079 static napi_value CreateSceneModeJSArray(napi_env env, std::vector<SceneMode> nativeArray)
1080 {
1081 MEDIA_DEBUG_LOG("CreateSceneModeJSArray is called");
1082 napi_value jsArray = nullptr;
1083 napi_value item = nullptr;
1084
1085 if (nativeArray.empty()) {
1086 MEDIA_ERR_LOG("nativeArray is empty");
1087 }
1088
1089 napi_status status = napi_create_array(env, &jsArray);
1090 std::unordered_map<SceneMode, JsSceneMode> nativeToNapiMap = g_nativeToNapiSupportedMode_;
1091 if (CameraNapiSecurity::CheckSystemApp(env, false)) {
1092 nativeToNapiMap = g_nativeToNapiSupportedModeForSystem_;
1093 }
1094 if (status == napi_ok) {
1095 uint8_t index = 0;
1096 for (size_t i = 0; i < nativeArray.size(); i++) {
1097 auto itr = nativeToNapiMap.find(nativeArray[i]);
1098 if (itr != nativeToNapiMap.end()) {
1099 napi_create_int32(env, itr->second, &item);
1100 napi_set_element(env, jsArray, index, item);
1101 index++;
1102 }
1103 }
1104 }
1105 return jsArray;
1106 }
1107
GetSupportedModes(napi_env env,napi_callback_info info)1108 napi_value CameraManagerNapi::GetSupportedModes(napi_env env, napi_callback_info info)
1109 {
1110 MEDIA_INFO_LOG("GetSupportedModes is called");
1111 CameraManagerNapi* cameraManagerNapi = nullptr;
1112 std::string cameraId {};
1113 CameraNapiObject cameraInfoObj { { { "cameraId", &cameraId } } };
1114 if (!CameraNapiParamParser(env, info, cameraManagerNapi, cameraInfoObj)
1115 .AssertStatus(INVALID_ARGUMENT, "GetSupportedModes args parse error")) {
1116 return nullptr;
1117 }
1118 sptr<CameraDevice> cameraInfo = cameraManagerNapi->cameraManager_->GetCameraDeviceFromId(cameraId);
1119 if (cameraInfo == nullptr) {
1120 MEDIA_ERR_LOG("CameraManagerNapi::GetSupportedModes get camera info fail");
1121 CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "Get camera info fail");
1122 return nullptr;
1123 }
1124
1125 std::vector<SceneMode> modeObjList = cameraManagerNapi->cameraManager_->GetSupportedModes(cameraInfo);
1126 for (auto it = modeObjList.begin(); it != modeObjList.end(); it++) {
1127 if (*it == SCAN) {
1128 modeObjList.erase(it);
1129 break;
1130 }
1131 }
1132 if (modeObjList.empty()) {
1133 modeObjList.emplace_back(CAPTURE);
1134 modeObjList.emplace_back(VIDEO);
1135 }
1136 MEDIA_INFO_LOG("CameraManagerNapi::GetSupportedModes size=[%{public}zu]", modeObjList.size());
1137 return CreateSceneModeJSArray(env, modeObjList);
1138 }
1139
GetSupportedOutputCapabilityAdaptNormalMode(SceneMode fwkMode,sptr<CameraDevice> & cameraInfo,sptr<CameraOutputCapability> & outputCapability)1140 void CameraManagerNapi::GetSupportedOutputCapabilityAdaptNormalMode(
1141 SceneMode fwkMode, sptr<CameraDevice>& cameraInfo, sptr<CameraOutputCapability>& outputCapability)
1142 {
1143 if (fwkMode == SceneMode::NORMAL && cameraInfo->GetPosition() == CAMERA_POSITION_FRONT) {
1144 auto defaultVideoProfiles = cameraInfo->modeVideoProfiles_[SceneMode::NORMAL];
1145 if (!defaultVideoProfiles.empty()) {
1146 MEDIA_INFO_LOG("return align videoProfile size = %{public}zu", defaultVideoProfiles.size());
1147 outputCapability->SetVideoProfiles(defaultVideoProfiles);
1148 }
1149 }
1150 }
1151
GetSupportedOutputCapabilityGetCameraInfo(napi_env env,napi_callback_info info,CameraManagerNapi * & cameraManagerNapi,int32_t & jsSceneMode)1152 sptr<CameraDevice> CameraManagerNapi::GetSupportedOutputCapabilityGetCameraInfo(
1153 napi_env env, napi_callback_info info, CameraManagerNapi*& cameraManagerNapi, int32_t& jsSceneMode)
1154 {
1155 std::string cameraId {};
1156 CameraNapiObject cameraInfoObj { { { "cameraId", &cameraId } } };
1157 size_t napiArgsSize = CameraNapiUtils::GetNapiArgs(env, info);
1158 MEDIA_INFO_LOG("CameraManagerNapi::GetSupportedOutputCapability napi args size is %{public}zu", napiArgsSize);
1159 if (napiArgsSize == ARGS_ONE) {
1160 if (!CameraNapiParamParser(env, info, cameraManagerNapi, cameraInfoObj)
1161 .AssertStatus(INVALID_ARGUMENT, "GetSupportedOutputCapability 1 args parse error")) {
1162 return nullptr;
1163 }
1164 } else if (napiArgsSize == ARGS_TWO) {
1165 if (!CameraNapiParamParser(env, info, cameraManagerNapi, cameraInfoObj, jsSceneMode)
1166 .AssertStatus(INVALID_ARGUMENT, "GetSupportedOutputCapability 2 args parse error")) {
1167 return nullptr;
1168 }
1169 if (jsSceneMode == JsSceneMode::JS_NORMAL) {
1170 CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "invalid js mode");
1171 return nullptr;
1172 }
1173 } else {
1174 CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "Args size error");
1175 return nullptr;
1176 }
1177 return cameraManagerNapi->cameraManager_->GetCameraDeviceFromId(cameraId);
1178 }
1179
GetSupportedOutputCapability(napi_env env,napi_callback_info info)1180 napi_value CameraManagerNapi::GetSupportedOutputCapability(napi_env env, napi_callback_info info)
1181 {
1182 MEDIA_INFO_LOG("GetSupportedOutputCapability is called");
1183 CameraManagerNapi* cameraManagerNapi = nullptr;
1184 int32_t jsSceneMode = JsSceneMode::JS_NORMAL;
1185 sptr<CameraDevice> cameraInfo =
1186 GetSupportedOutputCapabilityGetCameraInfo(env, info, cameraManagerNapi, jsSceneMode);
1187
1188 if (cameraInfo == nullptr) {
1189 MEDIA_ERR_LOG("CameraManagerNapi::GetSupportedOutputCapability get camera info fail");
1190 CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "Get camera info fail");
1191 return nullptr;
1192 }
1193 std::string cameraId = cameraInfo->GetID();
1194 napi_value cachedResult = GetCachedSupportedOutputCapability(env, cameraId, jsSceneMode);
1195 if (cachedResult != nullptr) {
1196 return cachedResult;
1197 }
1198 SceneMode fwkMode = SceneMode::NORMAL;
1199 std::unordered_map<JsSceneMode, SceneMode> jsToFwModeMap = g_jsToFwMode_;
1200 if (CameraNapiSecurity::CheckSystemApp(env, false)) {
1201 jsToFwModeMap = g_jsToFwMode4Sys_;
1202 }
1203 auto itr = jsToFwModeMap.find(static_cast<JsSceneMode>(jsSceneMode));
1204 if (itr != jsToFwModeMap.end()) {
1205 fwkMode = itr->second;
1206 } else {
1207 MEDIA_ERR_LOG("CreateCameraSessionInstance mode = %{public}d not supported", jsSceneMode);
1208 CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "Not support the input mode");
1209 return nullptr;
1210 }
1211 auto outputCapability = cameraManagerNapi->cameraManager_->GetSupportedOutputCapability(cameraInfo, fwkMode);
1212 if (outputCapability == nullptr) {
1213 MEDIA_ERR_LOG("failed to create CreateCameraOutputCapability");
1214 return nullptr;
1215 }
1216 outputCapability->RemoveDuplicatesProfiles();
1217 GetSupportedOutputCapabilityAdaptNormalMode(fwkMode, cameraInfo, outputCapability);
1218 napi_value result = CameraNapiObjCameraOutputCapability(*outputCapability).GenerateNapiValue(env);
1219 if (cameraInfo->GetConnectionType() == CAMERA_CONNECTION_BUILT_IN) {
1220 CacheSupportedOutputCapability(env, cameraId, jsSceneMode, result);
1221 }
1222 return result;
1223 }
1224
IsCameraMuted(napi_env env,napi_callback_info info)1225 napi_value CameraManagerNapi::IsCameraMuted(napi_env env, napi_callback_info info)
1226 {
1227 MEDIA_INFO_LOG("IsCameraMuted is called");
1228 napi_value result = nullptr;
1229 size_t argc = ARGS_ONE;
1230 napi_value argv[ARGS_ONE] = {0};
1231 napi_value thisVar = nullptr;
1232
1233 CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1234 NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 1 parameters maximum");
1235 bool isMuted = CameraManager::GetInstance()->IsCameraMuted();
1236 MEDIA_DEBUG_LOG("IsCameraMuted : %{public}d", isMuted);
1237 napi_get_boolean(env, isMuted, &result);
1238 return result;
1239 }
1240
IsCameraMuteSupported(napi_env env,napi_callback_info info)1241 napi_value CameraManagerNapi::IsCameraMuteSupported(napi_env env, napi_callback_info info)
1242 {
1243 if (!CameraNapiSecurity::CheckSystemApp(env)) {
1244 MEDIA_ERR_LOG("SystemApi IsCameraMuteSupported is called!");
1245 return nullptr;
1246 }
1247 MEDIA_INFO_LOG("IsCameraMuteSupported is called");
1248 napi_value result = nullptr;
1249 size_t argc = ARGS_ONE;
1250 napi_value argv[ARGS_ONE] = {0};
1251 napi_value thisVar = nullptr;
1252
1253 CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1254 NAPI_ASSERT(env, argc <= ARGS_ONE, "requires 1 parameters maximum");
1255
1256 bool isMuteSupported = CameraManager::GetInstance()->IsCameraMuteSupported();
1257 MEDIA_DEBUG_LOG("isMuteSupported: %{public}d", isMuteSupported);
1258 napi_get_boolean(env, isMuteSupported, &result);
1259 return result;
1260 }
1261
MuteCamera(napi_env env,napi_callback_info info)1262 napi_value CameraManagerNapi::MuteCamera(napi_env env, napi_callback_info info)
1263 {
1264 if (!CameraNapiSecurity::CheckSystemApp(env)) {
1265 MEDIA_ERR_LOG("SystemApi MuteCamera is called!");
1266 return nullptr;
1267 }
1268 MEDIA_INFO_LOG("MuteCamera is called");
1269 napi_value result = nullptr;
1270 size_t argc = ARGS_TWO;
1271 napi_value argv[ARGS_TWO] = {0};
1272 napi_value thisVar = nullptr;
1273
1274 CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1275 NAPI_ASSERT(env, argc <= ARGS_TWO, "requires 1 parameters maximum");
1276 bool isSupported;
1277 napi_get_value_bool(env, argv[PARAM0], &isSupported);
1278 CameraManager::GetInstance()->MuteCamera(isSupported);
1279 napi_get_undefined(env, &result);
1280 return result;
1281 }
1282
MuteCameraPersist(napi_env env,napi_callback_info info)1283 napi_value CameraManagerNapi::MuteCameraPersist(napi_env env, napi_callback_info info)
1284 {
1285 if (!CameraNapiSecurity::CheckSystemApp(env)) {
1286 MEDIA_ERR_LOG("SystemApi MuteCameraPersist is called!");
1287 return nullptr;
1288 }
1289 MEDIA_INFO_LOG("MuteCamera is called");
1290 napi_value result = nullptr;
1291 size_t argc = ARGS_TWO;
1292 napi_value argv[ARGS_TWO] = {0};
1293 napi_value thisVar = nullptr;
1294
1295 CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1296 NAPI_ASSERT(env, argc == ARGS_TWO, "requires 2 parameters");
1297 bool muteMode;
1298 int32_t jsPolicyType;
1299 napi_get_value_bool(env, argv[PARAM0], &muteMode);
1300 napi_get_value_int32(env, argv[PARAM1], &jsPolicyType);
1301 NAPI_ASSERT(env, g_jsToFwPolicyType_.count(static_cast<JsPolicyType>(jsPolicyType)) != 0,
1302 "invalid policyType value");
1303 CameraManager::GetInstance()->MuteCameraPersist(g_jsToFwPolicyType_[static_cast<JsPolicyType>(jsPolicyType)],
1304 muteMode);
1305 napi_get_undefined(env, &result);
1306 return result;
1307 }
1308
CreateCameraInputInstance(napi_env env,napi_callback_info info)1309 napi_value CameraManagerNapi::CreateCameraInputInstance(napi_env env, napi_callback_info info)
1310 {
1311 MEDIA_INFO_LOG("CreateCameraInputInstance is called");
1312 CameraManagerNapi* cameraManagerNapi = nullptr;
1313 size_t argSize = CameraNapiUtils::GetNapiArgs(env, info);
1314 sptr<CameraDevice> cameraInfo = nullptr;
1315 if (argSize == ARGS_ONE) {
1316 std::string cameraId {};
1317 CameraNapiObject cameraInfoObj { { { "cameraId", &cameraId } } };
1318 CameraNapiParamParser jsParamParser(env, info, cameraManagerNapi, cameraInfoObj);
1319 if (!jsParamParser.AssertStatus(INVALID_ARGUMENT, "Create cameraInput invalid argument!")) {
1320 MEDIA_ERR_LOG("CameraManagerNapi::CreateCameraInputInstance invalid argument");
1321 return nullptr;
1322 }
1323 cameraInfo = cameraManagerNapi->cameraManager_->GetCameraDeviceFromId(cameraId);
1324 } else if (argSize == ARGS_TWO) {
1325 int32_t cameraPosition;
1326 int32_t cameraType;
1327 CameraNapiParamParser jsParamParser(env, info, cameraManagerNapi, cameraPosition, cameraType);
1328 if (!jsParamParser.AssertStatus(INVALID_ARGUMENT, "Create cameraInput with 2 invalid arguments!")) {
1329 MEDIA_ERR_LOG("CameraManagerNapi::CreateCameraInputInstance 2 invalid arguments");
1330 return nullptr;
1331 }
1332 ProcessCameraInfo(cameraManagerNapi->cameraManager_, static_cast<const CameraPosition>(cameraPosition),
1333 static_cast<const CameraType>(cameraType), cameraInfo);
1334 } else {
1335 CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "invalid argument.");
1336 return nullptr;
1337 }
1338 if (cameraInfo == nullptr) {
1339 MEDIA_ERR_LOG("cameraInfo is null");
1340 CameraNapiUtils::ThrowError(env, SERVICE_FATL_ERROR, "cameraInfo is null.");
1341 return nullptr;
1342 }
1343 sptr<CameraInput> cameraInput = nullptr;
1344 int retCode = cameraManagerNapi->cameraManager_->CreateCameraInput(cameraInfo, &cameraInput);
1345 if (retCode == CAMERA_NO_PERMISSION) {
1346 CameraNapiUtils::ThrowError(env, OPERATION_NOT_ALLOWED, "not allowed, because have no permission.");
1347 return nullptr;
1348 }
1349 if (!CameraNapiUtils::CheckError(env, retCode)) {
1350 return nullptr;
1351 }
1352 return CameraInputNapi::CreateCameraInput(env, cameraInput);
1353 }
1354
ProcessCameraInfo(sptr<CameraManager> & cameraManager,const CameraPosition cameraPosition,const CameraType cameraType,sptr<CameraDevice> & cameraInfo)1355 void CameraManagerNapi::ProcessCameraInfo(sptr<CameraManager>& cameraManager, const CameraPosition cameraPosition,
1356 const CameraType cameraType, sptr<CameraDevice>& cameraInfo)
1357 {
1358 std::vector<sptr<CameraDevice>> cameraObjList = cameraManager->GetSupportedCameras();
1359 MEDIA_DEBUG_LOG("cameraInfo is null, the cameraObjList size is %{public}zu", cameraObjList.size());
1360 for (size_t i = 0; i < cameraObjList.size(); i++) {
1361 sptr<CameraDevice> cameraDevice = cameraObjList[i];
1362 if (cameraDevice == nullptr) {
1363 continue;
1364 }
1365 if (cameraDevice->GetPosition() == cameraPosition &&
1366 cameraDevice->GetCameraType() == cameraType) {
1367 cameraInfo = cameraDevice;
1368 break;
1369 }
1370 }
1371 }
1372
RegisterCameraStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args,bool isOnce)1373 void CameraManagerNapi::RegisterCameraStatusCallbackListener(
1374 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args, bool isOnce)
1375 {
1376 if (cameraManager_ == nullptr) {
1377 MEDIA_ERR_LOG("cameraManager_ is null!");
1378 return;
1379 }
1380 auto cameraManagerCallback =
1381 std::static_pointer_cast<CameraManagerCallbackNapi>(cameraManager_->GetApplicationCallback());
1382 if (cameraManagerCallback == nullptr) {
1383 cameraManagerCallback = make_shared<CameraManagerCallbackNapi>(env);
1384 cameraManager_->SetCallback(cameraManagerCallback);
1385 }
1386 cameraManagerCallback->SaveCallbackReference(eventName, callback, isOnce);
1387 }
1388
UnregisterCameraStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args)1389 void CameraManagerNapi::UnregisterCameraStatusCallbackListener(
1390 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args)
1391 {
1392 if (cameraManager_ == nullptr) {
1393 MEDIA_ERR_LOG("cameraManager_ is null!");
1394 return;
1395 }
1396 auto cameraManagerCallback = std::static_pointer_cast<CameraManagerCallbackNapi>(cameraManager_->
1397 GetApplicationCallback());
1398 if (cameraManagerCallback == nullptr) {
1399 MEDIA_ERR_LOG("cameraManagerCallback is null");
1400 } else {
1401 cameraManagerCallback->RemoveCallbackRef(eventName, callback);
1402 }
1403 }
1404
RegisterCameraMuteCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args,bool isOnce)1405 void CameraManagerNapi::RegisterCameraMuteCallbackListener(
1406 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args, bool isOnce)
1407 {
1408 if (!CameraNapiSecurity::CheckSystemApp(env)) {
1409 MEDIA_ERR_LOG("SystemApi On cameraMute is called!");
1410 return;
1411 }
1412 if (cameraManager_ == nullptr) {
1413 MEDIA_ERR_LOG("cameraManager_ is null!");
1414 return;
1415 }
1416 auto cameraMuteListener =
1417 std::static_pointer_cast<CameraMuteListenerNapi>(cameraManager_->GetCameraMuteListener());
1418 if (cameraMuteListener == nullptr) {
1419 cameraMuteListener = make_shared<CameraMuteListenerNapi>(env);
1420 cameraManager_->RegisterCameraMuteListener(cameraMuteListener);
1421 }
1422 cameraMuteListener->SaveCallbackReference(eventName, callback, isOnce);
1423 }
1424
UnregisterCameraMuteCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args)1425 void CameraManagerNapi::UnregisterCameraMuteCallbackListener(
1426 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args)
1427 {
1428 if (!CameraNapiSecurity::CheckSystemApp(env)) {
1429 MEDIA_ERR_LOG("SystemApi On cameraMute is called!");
1430 return;
1431 }
1432 if (cameraManager_ == nullptr) {
1433 MEDIA_ERR_LOG("cameraManager_ is null!");
1434 return;
1435 }
1436 auto cameraMuteListener =
1437 std::static_pointer_cast<CameraMuteListenerNapi>(cameraManager_->GetCameraMuteListener());
1438 if (cameraMuteListener == nullptr && cameraManager_ == nullptr) {
1439 MEDIA_ERR_LOG("cameraMuteListener is null");
1440 } else {
1441 cameraMuteListener->RemoveCallbackRef(eventName, callback);
1442 }
1443 }
1444
RegisterTorchStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args,bool isOnce)1445 void CameraManagerNapi::RegisterTorchStatusCallbackListener(
1446 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args, bool isOnce)
1447 {
1448 if (cameraManager_ == nullptr) {
1449 MEDIA_ERR_LOG("cameraManager_ is null!");
1450 return;
1451 }
1452 auto torchListener = std::static_pointer_cast<TorchListenerNapi>(cameraManager_->GetTorchListener());
1453 if (torchListener == nullptr) {
1454 torchListener = make_shared<TorchListenerNapi>(env);
1455 cameraManager_->RegisterTorchListener(torchListener);
1456 }
1457 torchListener->SaveCallbackReference(eventName, callback, isOnce);
1458 }
1459
UnregisterTorchStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args)1460 void CameraManagerNapi::UnregisterTorchStatusCallbackListener(
1461 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args)
1462 {
1463 if (cameraManager_ == nullptr) {
1464 MEDIA_ERR_LOG("cameraManager_ is null!");
1465 return;
1466 }
1467 auto torchListener = std::static_pointer_cast<TorchListenerNapi>(cameraManager_->GetTorchListener());
1468 if (torchListener == nullptr) {
1469 MEDIA_ERR_LOG("torchListener is null");
1470 } else {
1471 torchListener->RemoveCallbackRef(eventName, callback);
1472 }
1473 }
1474
RegisterFoldStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args,bool isOnce)1475 void CameraManagerNapi::RegisterFoldStatusCallbackListener(
1476 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args, bool isOnce)
1477 {
1478 if (cameraManager_ == nullptr) {
1479 MEDIA_ERR_LOG("cameraManager_ is null!");
1480 return;
1481 }
1482 auto foldListener = std::static_pointer_cast<FoldListenerNapi>(cameraManager_->GetFoldListener());
1483 if (foldListener == nullptr) {
1484 foldListener = make_shared<FoldListenerNapi>(env);
1485 cameraManager_->RegisterFoldListener(foldListener);
1486 }
1487 foldListener->SaveCallbackReference(eventName, callback, isOnce);
1488 }
1489
UnregisterFoldStatusCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const std::vector<napi_value> & args)1490 void CameraManagerNapi::UnregisterFoldStatusCallbackListener(
1491 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args)
1492 {
1493 if (cameraManager_ == nullptr) {
1494 MEDIA_ERR_LOG("cameraManager_ is null!");
1495 return;
1496 }
1497 auto foldListener = std::static_pointer_cast<FoldListenerNapi>(cameraManager_->GetFoldListener());
1498 if (foldListener == nullptr) {
1499 MEDIA_ERR_LOG("foldListener is null");
1500 } else {
1501 foldListener->RemoveCallbackRef(eventName, callback);
1502 }
1503 }
1504
GetEmitterFunctions()1505 const CameraManagerNapi::EmitterFunctions& CameraManagerNapi::GetEmitterFunctions()
1506 {
1507 static const EmitterFunctions funMap = {
1508 { "cameraStatus", {
1509 &CameraManagerNapi::RegisterCameraStatusCallbackListener,
1510 &CameraManagerNapi::UnregisterCameraStatusCallbackListener } },
1511 { "cameraMute", {
1512 &CameraManagerNapi::RegisterCameraMuteCallbackListener,
1513 &CameraManagerNapi::UnregisterCameraMuteCallbackListener } },
1514 { "torchStatusChange", {
1515 &CameraManagerNapi::RegisterTorchStatusCallbackListener,
1516 &CameraManagerNapi::UnregisterTorchStatusCallbackListener } },
1517 { "foldStatusChange", {
1518 &CameraManagerNapi::RegisterFoldStatusCallbackListener,
1519 &CameraManagerNapi::UnregisterFoldStatusCallbackListener } } };
1520 return funMap;
1521 }
1522
IsPrelaunchSupported(napi_env env,napi_callback_info info)1523 napi_value CameraManagerNapi::IsPrelaunchSupported(napi_env env, napi_callback_info info)
1524 {
1525 MEDIA_INFO_LOG("IsPrelaunchSupported is called");
1526 if (!CameraNapiSecurity::CheckSystemApp(env)) {
1527 MEDIA_ERR_LOG("SystemApi IsPrelaunchSupported is called!");
1528 return nullptr;
1529 }
1530 CameraManagerNapi* cameraManagerNapi = nullptr;
1531 std::string cameraId {};
1532 CameraNapiObject cameraInfoObj { { { "cameraId", &cameraId } } };
1533 CameraNapiParamParser jsParamParser(env, info, cameraManagerNapi, cameraInfoObj);
1534 if (!jsParamParser.AssertStatus(INVALID_ARGUMENT, "invalid argument!")) {
1535 MEDIA_ERR_LOG("CameraManagerNapi::IsPrelaunchSupported invalid argument");
1536 return nullptr;
1537 }
1538 sptr<CameraDevice> cameraInfo = cameraManagerNapi->cameraManager_->GetCameraDeviceFromId(cameraId);
1539 if (cameraInfo != nullptr) {
1540 bool isPrelaunchSupported = cameraManagerNapi->cameraManager_->IsPrelaunchSupported(cameraInfo);
1541 MEDIA_DEBUG_LOG("isPrelaunchSupported: %{public}d", isPrelaunchSupported);
1542 napi_value result;
1543 napi_get_boolean(env, isPrelaunchSupported, &result);
1544 return result;
1545 }
1546 MEDIA_ERR_LOG("CameraManagerNapi::IsPrelaunchSupported cameraInfo is null!");
1547 CameraNapiUtils::ThrowError(env, INVALID_ARGUMENT, "cameraInfo is null.");
1548 return nullptr;
1549 }
1550
PrelaunchCamera(napi_env env,napi_callback_info info)1551 napi_value CameraManagerNapi::PrelaunchCamera(napi_env env, napi_callback_info info)
1552 {
1553 MEDIA_INFO_LOG("PrelaunchCamera is called");
1554 if (!CameraNapiSecurity::CheckSystemApp(env)) {
1555 MEDIA_ERR_LOG("SystemApi PrelaunchCamera is called!");
1556 return nullptr;
1557 }
1558 napi_value result = nullptr;
1559 int32_t retCode = CameraManager::GetInstance()->PrelaunchCamera();
1560 if (!CameraNapiUtils::CheckError(env, retCode)) {
1561 return result;
1562 }
1563 MEDIA_INFO_LOG("PrelaunchCamera");
1564 napi_get_undefined(env, &result);
1565 return result;
1566 }
1567
PreSwitchCamera(napi_env env,napi_callback_info info)1568 napi_value CameraManagerNapi::PreSwitchCamera(napi_env env, napi_callback_info info)
1569 {
1570 MEDIA_INFO_LOG("PreSwitchCamera is called");
1571 if (!CameraNapiSecurity::CheckSystemApp(env)) {
1572 MEDIA_ERR_LOG("SystemApi PreSwitchCamera is called!");
1573 return nullptr;
1574 }
1575 napi_value result = nullptr;
1576 size_t argc = ARGS_ONE;
1577 napi_value argv[ARGS_ONE] = { 0 };
1578 napi_value thisVar = nullptr;
1579 CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1580 NAPI_ASSERT(env, argc < ARGS_TWO, "requires 1 parameters maximum");
1581 char buffer[PATH_MAX];
1582 size_t length;
1583 napi_get_value_string_utf8(env, argv[ARGS_ZERO], buffer, PATH_MAX, &length);
1584 int32_t retCode = CameraManager::GetInstance()->PreSwitchCamera(std::string(buffer));
1585 if (!CameraNapiUtils::CheckError(env, retCode)) {
1586 return result;
1587 }
1588 MEDIA_INFO_LOG("PreSwitchCamera");
1589 napi_get_undefined(env, &result);
1590 return result;
1591 }
1592
SetPrelaunchConfig(napi_env env,napi_callback_info info)1593 napi_value CameraManagerNapi::SetPrelaunchConfig(napi_env env, napi_callback_info info)
1594 {
1595 MEDIA_INFO_LOG("SetPrelaunchConfig is called");
1596 if (!CameraNapiSecurity::CheckSystemApp(env)) {
1597 MEDIA_ERR_LOG("SystemApi SetPrelaunchConfig is called!");
1598 return nullptr;
1599 }
1600
1601 size_t argc = ARGS_ONE;
1602 napi_value argv[ARGS_ONE] = {0};
1603 napi_value thisVar = nullptr;
1604 CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1605 NAPI_ASSERT(env, argc < ARGS_TWO, "requires 1 parameters maximum");
1606 PrelaunchConfig prelaunchConfig;
1607 EffectParam effectParam;
1608 napi_value result = nullptr;
1609
1610 bool isConfigSuccess = ParsePrelaunchConfig(env, argv[PARAM0], &prelaunchConfig);
1611 if (!isConfigSuccess) {
1612 MEDIA_ERR_LOG("SetPrelaunchConfig failed");
1613 return result;
1614 }
1615 ParseSettingParam(env, argv[PARAM0], &effectParam);
1616 std::string cameraId = prelaunchConfig.GetCameraDevice()->GetID();
1617 MEDIA_INFO_LOG("SetPrelaunchConfig cameraId = %{public}s", cameraId.c_str());
1618
1619 int32_t retCode = CameraManager::GetInstance()->SetPrelaunchConfig(cameraId,
1620 static_cast<RestoreParamTypeOhos>(prelaunchConfig.restoreParamType), prelaunchConfig.activeTime, effectParam);
1621 if (!CameraNapiUtils::CheckError(env, retCode)) {
1622 return result;
1623 }
1624 napi_get_undefined(env, &result);
1625 return result;
1626 }
1627
IsTorchSupported(napi_env env,napi_callback_info info)1628 napi_value CameraManagerNapi::IsTorchSupported(napi_env env, napi_callback_info info)
1629 {
1630 MEDIA_INFO_LOG("IsTorchSupported is called");
1631 napi_status status;
1632 napi_value result = nullptr;
1633 size_t argc = ARGS_ZERO;
1634 napi_value argv[ARGS_ZERO];
1635 napi_value thisVar = nullptr;
1636
1637 CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1638
1639 napi_get_undefined(env, &result);
1640 CameraManagerNapi* cameraManagerNapi = nullptr;
1641 status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
1642 if (status == napi_ok && cameraManagerNapi != nullptr) {
1643 bool isTorchSupported = CameraManager::GetInstance()->IsTorchSupported();
1644 MEDIA_DEBUG_LOG("IsTorchSupported : %{public}d", isTorchSupported);
1645 napi_get_boolean(env, isTorchSupported, &result);
1646 } else {
1647 MEDIA_ERR_LOG("IsTorchSupported call Failed!");
1648 }
1649 return result;
1650 }
1651
IsTorchModeSupported(napi_env env,napi_callback_info info)1652 napi_value CameraManagerNapi::IsTorchModeSupported(napi_env env, napi_callback_info info)
1653 {
1654 MEDIA_INFO_LOG("IsTorchModeSupported is called");
1655 napi_status status;
1656 napi_value result = nullptr;
1657 size_t argc = ARGS_ONE;
1658 napi_value argv[ARGS_ONE];
1659 napi_value thisVar = nullptr;
1660
1661 CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1662
1663 napi_get_undefined(env, &result);
1664 CameraManagerNapi* cameraManagerNapi = nullptr;
1665 status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
1666 if (status == napi_ok && cameraManagerNapi != nullptr) {
1667 int32_t mode;
1668 napi_get_value_int32(env, argv[PARAM0], &mode);
1669 MEDIA_INFO_LOG("CameraManagerNapi::IsTorchModeSupported mode = %{public}d", mode);
1670 TorchMode torchMode = (TorchMode)mode;
1671 bool isTorchModeSupported = CameraManager::GetInstance()->IsTorchModeSupported(torchMode);
1672 MEDIA_DEBUG_LOG("IsTorchModeSupported : %{public}d", isTorchModeSupported);
1673 napi_get_boolean(env, isTorchModeSupported, &result);
1674 } else {
1675 MEDIA_ERR_LOG("GetTorchMode call Failed!");
1676 }
1677 return result;
1678 }
1679
GetTorchMode(napi_env env,napi_callback_info info)1680 napi_value CameraManagerNapi::GetTorchMode(napi_env env, napi_callback_info info)
1681 {
1682 MEDIA_INFO_LOG("GetTorchMode is called");
1683 napi_status status;
1684 napi_value result = nullptr;
1685 size_t argc = ARGS_ZERO;
1686 napi_value argv[ARGS_ZERO];
1687 napi_value thisVar = nullptr;
1688
1689 CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1690
1691 napi_get_undefined(env, &result);
1692 CameraManagerNapi* cameraManagerNapi = nullptr;
1693 status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
1694 if (status == napi_ok && cameraManagerNapi != nullptr) {
1695 TorchMode torchMode = CameraManager::GetInstance()->GetTorchMode();
1696 MEDIA_DEBUG_LOG("GetTorchMode : %{public}d", torchMode);
1697 napi_create_int32(env, torchMode, &result);
1698 } else {
1699 MEDIA_ERR_LOG("GetTorchMode call Failed!");
1700 }
1701 return result;
1702 }
1703
SetTorchMode(napi_env env,napi_callback_info info)1704 napi_value CameraManagerNapi::SetTorchMode(napi_env env, napi_callback_info info)
1705 {
1706 MEDIA_INFO_LOG("SetTorchMode is called");
1707 napi_status status;
1708 napi_value result = nullptr;
1709 size_t argc = ARGS_ONE;
1710 napi_value argv[ARGS_ONE];
1711 napi_value thisVar = nullptr;
1712
1713 CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
1714
1715 napi_get_undefined(env, &result);
1716 CameraManagerNapi* cameraManagerNapi = nullptr;
1717 status = napi_unwrap(env, thisVar, reinterpret_cast<void**>(&cameraManagerNapi));
1718 if (status == napi_ok && cameraManagerNapi != nullptr) {
1719 int32_t mode;
1720 napi_get_value_int32(env, argv[PARAM0], &mode);
1721 MEDIA_INFO_LOG("CameraManagerNapi::SetTorchMode mode = %{public}d", mode);
1722 TorchMode torchMode = (TorchMode)mode;
1723 int32_t retCode = CameraManager::GetInstance()->SetTorchMode(torchMode);
1724 if (!CameraNapiUtils::CheckError(env, retCode)) {
1725 MEDIA_DEBUG_LOG("SetTorchMode fail throw error");
1726 }
1727 } else {
1728 MEDIA_ERR_LOG("GetTorchMode call Failed!");
1729 }
1730 return result;
1731 }
1732
On(napi_env env,napi_callback_info info)1733 napi_value CameraManagerNapi::On(napi_env env, napi_callback_info info)
1734 {
1735 return ListenerTemplate<CameraManagerNapi>::On(env, info);
1736 }
1737
Once(napi_env env,napi_callback_info info)1738 napi_value CameraManagerNapi::Once(napi_env env, napi_callback_info info)
1739 {
1740 return ListenerTemplate<CameraManagerNapi>::Once(env, info);
1741 }
1742
Off(napi_env env,napi_callback_info info)1743 napi_value CameraManagerNapi::Off(napi_env env, napi_callback_info info)
1744 {
1745 return ListenerTemplate<CameraManagerNapi>::Off(env, info);
1746 }
1747 } // namespace CameraStandard
1748 } // namespace OHOS
1749