1 /*
2 * Copyright (c) 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 <cstdint>
17 #include <memory>
18 #include <string>
19 #include "camera_error.h"
20 #include "camera_utils.h"
21
22 namespace OHOS {
23 namespace CameraStandard {
MallocCString(const std::string & origin)24 char *MallocCString(const std::string &origin)
25 {
26 auto len = origin.length() + 1;
27 char *res = static_cast<char *>(malloc(sizeof(char) * len));
28 if (res == nullptr) {
29 return nullptr;
30 }
31 return std::char_traits<char>::copy(res, origin.c_str(), len);
32 }
33
VectorProfileToCArrCJProfile(std::vector<Profile> profile,int32_t * errCode)34 CArrCJProfile VectorProfileToCArrCJProfile(std::vector<Profile> profile, int32_t *errCode)
35 {
36 CArrCJProfile result = CArrCJProfile{0};
37 result.size = static_cast<int64_t>(profile.size());
38 if (profile.size() == 0) {
39 return result;
40 }
41 result.head = static_cast<CJProfile *>(malloc(sizeof(CJProfile) * profile.size()));
42 if (result.head == nullptr) {
43 *errCode = CameraError::CAMERA_SERVICE_ERROR;
44 return result;
45 }
46 for (size_t i = 0; i < profile.size(); i++) {
47 result.head[i].format = profile[i].GetCameraFormat();
48 Size t = profile[i].GetSize();
49 result.head[i].width = t.width;
50 result.head[i].height = t.height;
51 }
52 return result;
53 }
54
VectorVideoProfileToCArrCJVideoProfile(std::vector<VideoProfile> profile,int32_t * errCode)55 CArrCJVideoProfile VectorVideoProfileToCArrCJVideoProfile(std::vector<VideoProfile> profile, int32_t *errCode)
56 {
57 CArrCJVideoProfile result = CArrCJVideoProfile{0};
58 result.size = static_cast<int64_t>(profile.size());
59 if (profile.size() == 0) {
60 return result;
61 }
62 result.head = static_cast<CJVideoProfile *>(malloc(sizeof(CJVideoProfile) * profile.size()));
63 if (result.head == nullptr) {
64 *errCode = CameraError::CAMERA_SERVICE_ERROR;
65 return result;
66 }
67 for (size_t i = 0; i < profile.size(); i++) {
68 result.head[i].format = profile[i].GetCameraFormat();
69 Size t = profile[i].GetSize();
70 result.head[i].width = t.width;
71 result.head[i].height = t.height;
72 std::vector<int32_t> vpi_framerates = profile[i].GetFrameRates();
73 result.head[i].frameRateRange.min = vpi_framerates[0];
74 result.head[i].frameRateRange.max = vpi_framerates[1];
75 }
76 return result;
77 }
78
CameraOutputCapabilityToCJCameraOutputCapability(sptr<CameraOutputCapability> cameraOutputCapability,int32_t * errCode)79 CJCameraOutputCapability CameraOutputCapabilityToCJCameraOutputCapability(
80 sptr<CameraOutputCapability> cameraOutputCapability, int32_t *errCode)
81 {
82 CJCameraOutputCapability result =
83 CJCameraOutputCapability{CArrCJProfile{0}, CArrCJProfile{0}, CArrCJVideoProfile{0}, CArrI32{0}};
84 if (cameraOutputCapability == nullptr) {
85 return result;
86 }
87 std::vector<Profile> photoProfiles_ = cameraOutputCapability->GetPhotoProfiles();
88 std::vector<Profile> previewProfiles_ = cameraOutputCapability->GetPreviewProfiles();
89 std::vector<VideoProfile> videoProfiles_ = cameraOutputCapability->GetVideoProfiles();
90 std::vector<MetadataObjectType> metadataObjectType_ = cameraOutputCapability->GetSupportedMetadataObjectType();
91
92 result.photoProfiles = VectorProfileToCArrCJProfile(photoProfiles_, errCode);
93 if (*errCode != CameraError::NO_ERROR) {
94 return CJCameraOutputCapability{CArrCJProfile{0}, CArrCJProfile{0}, CArrCJVideoProfile{0}, CArrI32{0}};
95 }
96
97 result.previewProfiles = VectorProfileToCArrCJProfile(previewProfiles_, errCode);
98 if (*errCode != CameraError::NO_ERROR) {
99 free(result.photoProfiles.head);
100 return CJCameraOutputCapability{CArrCJProfile{0}, CArrCJProfile{0}, CArrCJVideoProfile{0}, CArrI32{0}};
101 }
102
103 result.videoProfiles = VectorVideoProfileToCArrCJVideoProfile(videoProfiles_, errCode);
104 if (*errCode != CameraError::NO_ERROR) {
105 free(result.photoProfiles.head);
106 free(result.previewProfiles.head);
107 return CJCameraOutputCapability{CArrCJProfile{0}, CArrCJProfile{0}, CArrCJVideoProfile{0}, CArrI32{0}};
108 }
109
110 result.supportedMetadataObjectTypes.size = static_cast<int64_t>(metadataObjectType_.size());
111 if (metadataObjectType_.size() == 0) {
112 return result;
113 }
114 result.supportedMetadataObjectTypes.head =
115 static_cast<int32_t *>(malloc(sizeof(int32_t) * metadataObjectType_.size()));
116 if (result.supportedMetadataObjectTypes.head == nullptr) {
117 *errCode = CameraError::CAMERA_SERVICE_ERROR;
118 free(result.photoProfiles.head);
119 free(result.previewProfiles.head);
120 free(result.videoProfiles.head);
121 return CJCameraOutputCapability{CArrCJProfile{0}, CArrCJProfile{0}, CArrCJVideoProfile{0}, CArrI32{0}};
122 }
123 for (size_t i = 0; i < metadataObjectType_.size(); i++) {
124 result.supportedMetadataObjectTypes.head[i] = static_cast<int32_t>(metadataObjectType_[i]);
125 }
126 return result;
127 }
128
CameraDeviceToCJCameraDevice(CameraDevice & cameraDevice)129 CJCameraDevice CameraDeviceToCJCameraDevice(CameraDevice &cameraDevice)
130 {
131 char *cameraId = MallocCString(cameraDevice.GetID());
132 int32_t cameraPosition = cameraDevice.GetPosition();
133 int32_t cameraType = cameraDevice.GetCameraType();
134 int32_t connectionType = cameraDevice.GetConnectionType();
135 uint32_t cameraOrientation = cameraDevice.GetCameraOrientation();
136 return CJCameraDevice{cameraId, cameraPosition, cameraType, connectionType, cameraOrientation};
137 }
138
CameraStatusInfoToCJCameraStatusInfo(const CameraStatusInfo & cameraStatusInfo)139 CJCameraStatusInfo CameraStatusInfoToCJCameraStatusInfo(const CameraStatusInfo &cameraStatusInfo)
140 {
141 CJCameraDevice cjCameraDevice = CameraDeviceToCJCameraDevice(*(cameraStatusInfo.cameraDevice));
142 int32_t status = cameraStatusInfo.cameraStatus;
143 return CJCameraStatusInfo{cjCameraDevice, status};
144 }
145
CameraDeviceVetorToCArrCJCameraDevice(const std::vector<sptr<CameraDevice>> cameras)146 CArrCJCameraDevice CameraDeviceVetorToCArrCJCameraDevice(const std::vector<sptr<CameraDevice>> cameras)
147 {
148 int64_t size = static_cast<int64_t>(cameras.size());
149 if (size <= 0) {
150 return CArrCJCameraDevice{0};
151 }
152 CJCameraDevice *head = static_cast<CJCameraDevice *>(malloc(sizeof(CJCameraDevice) * size));
153 if (head == nullptr) {
154 return CArrCJCameraDevice{0};
155 }
156 for (int64_t i = 0; i < size; i++) {
157 head[i] = CameraDeviceToCJCameraDevice(*(cameras[i]));
158 }
159 return CArrCJCameraDevice{head, size};
160 }
161
FoldStatusInfoToCJFoldStatusInfo(const FoldStatusInfo & foldStatusInfo)162 CJFoldStatusInfo FoldStatusInfoToCJFoldStatusInfo(const FoldStatusInfo &foldStatusInfo)
163 {
164 return CJFoldStatusInfo{CameraDeviceVetorToCArrCJCameraDevice(foldStatusInfo.supportedCameras),
165 foldStatusInfo.foldStatus};
166 }
167
TorchStatusInfoToCJTorchStatusInfo(const TorchStatusInfo & torchStatusInfo)168 CJTorchStatusInfo TorchStatusInfoToCJTorchStatusInfo(const TorchStatusInfo &torchStatusInfo)
169 {
170 return CJTorchStatusInfo{torchStatusInfo.isTorchAvailable, torchStatusInfo.isTorchActive,
171 torchStatusInfo.torchLevel};
172 }
173
ErrorCallBackToCJErrorCallBack(const int32_t errorType,const int32_t errorMsg)174 CJErrorCallback ErrorCallBackToCJErrorCallBack(const int32_t errorType, const int32_t errorMsg)
175 {
176 return CJErrorCallback{errorType, errorMsg};
177 }
178
MetadataObjectToCJMetadataObject(MetadataObject metaObject)179 CJMetadataObject MetadataObjectToCJMetadataObject(MetadataObject metaObject)
180 {
181 Rect rect = metaObject.GetBoundingBox();
182 CJRect cjRect = CJRect{rect.topLeftX, rect.topLeftY, rect.width, rect.height};
183 return CJMetadataObject{static_cast<int32_t>(metaObject.GetType()), metaObject.GetTimestamp(), cjRect};
184 }
185
MetadataObjectsToCArrCJMetadataObject(std::vector<sptr<MetadataObject>> metaObjects)186 CArrCJMetadataObject MetadataObjectsToCArrCJMetadataObject(std::vector<sptr<MetadataObject>> metaObjects)
187 {
188 int64_t size = static_cast<int64_t>(metaObjects.size());
189 if (size <= 0) {
190 return CArrCJMetadataObject{0};
191 }
192 CJMetadataObject *head = static_cast<CJMetadataObject *>(malloc(sizeof(CJMetadataObject) * size));
193 if (head == nullptr) {
194 return CArrCJMetadataObject{0};
195 }
196 for (int64_t i = 0; i < size; i++) {
197 head[i] = MetadataObjectToCJMetadataObject(*(metaObjects[i]));
198 }
199 return CArrCJMetadataObject{head, size};
200 }
201 } // namespace CameraStandard
202 } // namespace OHOS