• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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