1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "camera_host.h" 17094332d3Sopenharmony_ci#include "camera.h" 18094332d3Sopenharmony_ci#include "camera_device.h" 19094332d3Sopenharmony_ci#include "camera_device_callback_wrapper.h" 20094332d3Sopenharmony_ci#include "camera_host_callback_wrapper.h" 21094332d3Sopenharmony_ci#include <dlfcn.h> 22094332d3Sopenharmony_ci 23094332d3Sopenharmony_cinamespace OHOS::Camera { 24094332d3Sopenharmony_cistd::shared_ptr<CameraHost> CameraHost::CreateCameraHost() 25094332d3Sopenharmony_ci{ 26094332d3Sopenharmony_ci std::shared_ptr<CameraHost> cameraHost = std::make_shared<CameraHost>(); 27094332d3Sopenharmony_ci if (cameraHost == nullptr) { 28094332d3Sopenharmony_ci CAMERA_LOGE("new camera host implement failed."); 29094332d3Sopenharmony_ci return nullptr; 30094332d3Sopenharmony_ci } 31094332d3Sopenharmony_ci 32094332d3Sopenharmony_ci CamRetCode rc = cameraHost->Init(); 33094332d3Sopenharmony_ci if (rc != NO_ERROR) { 34094332d3Sopenharmony_ci CAMERA_LOGE("camera host init failed."); 35094332d3Sopenharmony_ci return nullptr; 36094332d3Sopenharmony_ci } 37094332d3Sopenharmony_ci 38094332d3Sopenharmony_ci return cameraHost; 39094332d3Sopenharmony_ci} 40094332d3Sopenharmony_ci 41094332d3Sopenharmony_ciCameraHost::CameraHost() {} 42094332d3Sopenharmony_ci 43094332d3Sopenharmony_ciCameraHost::~CameraHost() 44094332d3Sopenharmony_ci{ 45094332d3Sopenharmony_ci if (host_ != nullptr) { 46094332d3Sopenharmony_ci delete host_; 47094332d3Sopenharmony_ci host_ = nullptr; 48094332d3Sopenharmony_ci } 49094332d3Sopenharmony_ci 50094332d3Sopenharmony_ci if (handler_ != nullptr) { 51094332d3Sopenharmony_ci ::dlclose(handler_); 52094332d3Sopenharmony_ci } 53094332d3Sopenharmony_ci} 54094332d3Sopenharmony_ci 55094332d3Sopenharmony_ciCamRetCode CameraHost::SetCallback(const OHOS::sptr<ICameraHostCallback>& callback) 56094332d3Sopenharmony_ci{ 57094332d3Sopenharmony_ci CameraHostCallbackCIF cb; 58094332d3Sopenharmony_ci BindCameraHostCallback(callback); 59094332d3Sopenharmony_ci 60094332d3Sopenharmony_ci cb.OnCameraStatus = HostCBOnCameraStatus; 61094332d3Sopenharmony_ci cb.OnFlashlightStatus = HostCBOnFlashlightStatus; 62094332d3Sopenharmony_ci 63094332d3Sopenharmony_ci host_->SetCallback(cb); 64094332d3Sopenharmony_ci 65094332d3Sopenharmony_ci return NO_ERROR; 66094332d3Sopenharmony_ci} 67094332d3Sopenharmony_ci 68094332d3Sopenharmony_ciCamRetCode CameraHost::GetCameraIds(std::vector<std::string>& cameraIds) 69094332d3Sopenharmony_ci{ 70094332d3Sopenharmony_ci char** ids = nullptr; 71094332d3Sopenharmony_ci int size = 0; 72094332d3Sopenharmony_ci int ret = host_->GetCameraIds(&ids, &size); 73094332d3Sopenharmony_ci if (ret != NO_ERROR) { 74094332d3Sopenharmony_ci return static_cast<CamRetCode>(ret); 75094332d3Sopenharmony_ci } 76094332d3Sopenharmony_ci for (int i = 0; i < size; i++) { 77094332d3Sopenharmony_ci cameraIds.push_back(ids[i]); 78094332d3Sopenharmony_ci } 79094332d3Sopenharmony_ci 80094332d3Sopenharmony_ci return NO_ERROR; 81094332d3Sopenharmony_ci} 82094332d3Sopenharmony_ci 83094332d3Sopenharmony_ciCamRetCode CameraHost::GetCameraAbility(const std::string& cameraId, std::shared_ptr<CameraAbility>& ability) 84094332d3Sopenharmony_ci{ 85094332d3Sopenharmony_ci CameraAbilityCIF* meta = nullptr; 86094332d3Sopenharmony_ci int ret = host_->GetCameraAbility(cameraId.c_str(), meta); 87094332d3Sopenharmony_ci ability = std::make_shared<CameraAbility>(0, 0); 88094332d3Sopenharmony_ci return static_cast<CamRetCode>(ret); 89094332d3Sopenharmony_ci} 90094332d3Sopenharmony_ci 91094332d3Sopenharmony_ciCamRetCode CameraHost::OpenCamera(const std::string& cameraId, 92094332d3Sopenharmony_ci const OHOS::sptr<ICameraDeviceCallback>& callback, 93094332d3Sopenharmony_ci OHOS::sptr<ICameraDevice>& pDevice) 94094332d3Sopenharmony_ci{ 95094332d3Sopenharmony_ci CameraDeviceCallbackCIF cb; 96094332d3Sopenharmony_ci BindCameraDeviceCallback(callback); 97094332d3Sopenharmony_ci 98094332d3Sopenharmony_ci cb.OnError = DeviceCBOnError; 99094332d3Sopenharmony_ci cb.OnResult = DeviceCBOnResult; 100094332d3Sopenharmony_ci 101094332d3Sopenharmony_ci CameraDeviceCIF* device = nullptr; 102094332d3Sopenharmony_ci const char* id = cameraId.c_str(); 103094332d3Sopenharmony_ci int ret = host_->OpenCamera(id, cb, device); 104094332d3Sopenharmony_ci 105094332d3Sopenharmony_ci auto cd = new CameraDevice; 106094332d3Sopenharmony_ci if (cd == nullptr) { 107094332d3Sopenharmony_ci return INSUFFICIENT_RESOURCES; 108094332d3Sopenharmony_ci } 109094332d3Sopenharmony_ci cd->Init(device); 110094332d3Sopenharmony_ci pDevice = cd; 111094332d3Sopenharmony_ci return static_cast<CamRetCode>(ret); 112094332d3Sopenharmony_ci} 113094332d3Sopenharmony_ci 114094332d3Sopenharmony_ciCamRetCode CameraHost::SetFlashlight(const std::string& cameraId, bool& isEnable) 115094332d3Sopenharmony_ci{ 116094332d3Sopenharmony_ci if (host_ == nullptr) { 117094332d3Sopenharmony_ci return INSUFFICIENT_RESOURCES; 118094332d3Sopenharmony_ci } 119094332d3Sopenharmony_ci 120094332d3Sopenharmony_ci const char* id = cameraId.c_str(); 121094332d3Sopenharmony_ci int ret = host_->SetFlashlight(id, reinterpret_cast<int*>(&isEnable)); 122094332d3Sopenharmony_ci return static_cast<CamRetCode>(ret); 123094332d3Sopenharmony_ci} 124094332d3Sopenharmony_ci 125094332d3Sopenharmony_ciCamRetCode CameraHost::Init() 126094332d3Sopenharmony_ci{ 127094332d3Sopenharmony_ci host_ = new CameraHostCIF(); 128094332d3Sopenharmony_ci if (host_ == nullptr) { 129094332d3Sopenharmony_ci CAMERA_LOGE("%{public}s, create camera host failed.", __FUNCTION__); 130094332d3Sopenharmony_ci return INSUFFICIENT_RESOURCES; 131094332d3Sopenharmony_ci } 132094332d3Sopenharmony_ci 133094332d3Sopenharmony_ci handler_ = ::dlopen(CAMERA_C_HAL_LIB_PATH, RTLD_NOW); 134094332d3Sopenharmony_ci if (handler_ == nullptr) { 135094332d3Sopenharmony_ci CAMERA_LOGE("%{public}s, dlopen %{public}s failed, %{public}s", 136094332d3Sopenharmony_ci __FUNCTION__, CAMERA_C_HAL_LIB_PATH, ::dlerror()); 137094332d3Sopenharmony_ci return INSUFFICIENT_RESOURCES; 138094332d3Sopenharmony_ci } 139094332d3Sopenharmony_ci 140094332d3Sopenharmony_ci host_->SetCallback = reinterpret_cast<HOST_C_FUNC_SETCALLBACK>(::dlsym(handler_, "SetCallback")); 141094332d3Sopenharmony_ci if (host_->SetCallback == nullptr) { 142094332d3Sopenharmony_ci CAMERA_LOGE("%{public}s, can't get symbol of function SetCallback, %{public}s", __FUNCTION__, ::dlerror()); 143094332d3Sopenharmony_ci return INSUFFICIENT_RESOURCES; 144094332d3Sopenharmony_ci } 145094332d3Sopenharmony_ci 146094332d3Sopenharmony_ci host_->GetCameraIds = reinterpret_cast<HOST_C_FUNC_GETCAMERAIDS>(::dlsym(handler_, "GetCameraIds")); 147094332d3Sopenharmony_ci if (host_->GetCameraIds == nullptr) { 148094332d3Sopenharmony_ci CAMERA_LOGE("%{public}s, can't get symbol of function GetCameraIds, %{public}s", __FUNCTION__, ::dlerror()); 149094332d3Sopenharmony_ci return INSUFFICIENT_RESOURCES; 150094332d3Sopenharmony_ci } 151094332d3Sopenharmony_ci 152094332d3Sopenharmony_ci host_->GetCameraAbility = reinterpret_cast<HOST_C_FUNC_GETCAMERAABILITY>(::dlsym(handler_, "GetCameraAbility")); 153094332d3Sopenharmony_ci if (host_->GetCameraAbility == nullptr) { 154094332d3Sopenharmony_ci CAMERA_LOGE("%{public}s, can't get symbol of function GetCameraAbility, %{public}s", __FUNCTION__, ::dlerror()); 155094332d3Sopenharmony_ci return INSUFFICIENT_RESOURCES; 156094332d3Sopenharmony_ci } 157094332d3Sopenharmony_ci 158094332d3Sopenharmony_ci host_->OpenCamera = reinterpret_cast<HOST_C_FUNC_OPENCAMERA>(::dlsym(handler_, "OpenCamera")); 159094332d3Sopenharmony_ci if (host_->OpenCamera == nullptr) { 160094332d3Sopenharmony_ci CAMERA_LOGE("%{public}s, can't get symbol of function OpenCamera, %{public}s", __FUNCTION__, ::dlerror()); 161094332d3Sopenharmony_ci return INSUFFICIENT_RESOURCES; 162094332d3Sopenharmony_ci } 163094332d3Sopenharmony_ci 164094332d3Sopenharmony_ci host_->SetFlashlight = reinterpret_cast<HOST_C_FUNC_SETFLASHLIGHT>(::dlsym(handler_, "SetFlashlight")); 165094332d3Sopenharmony_ci if (host_->SetFlashlight == nullptr) { 166094332d3Sopenharmony_ci CAMERA_LOGE("%{public}s, can't get symbol of function SetFlashlight, %{public}s", __FUNCTION__, ::dlerror()); 167094332d3Sopenharmony_ci return INSUFFICIENT_RESOURCES; 168094332d3Sopenharmony_ci } 169094332d3Sopenharmony_ci 170094332d3Sopenharmony_ci return NO_ERROR; 171094332d3Sopenharmony_ci} 172094332d3Sopenharmony_ci} // namespace OHOS::Camera 173