1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file expected 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 "hdi_common_v1_2.h"
17 #include "camera.h"
18 #include "video_key_info.h"
19
20 namespace OHOS::Camera {
21 OHOS::HDI::Camera::V1_0::FlashlightStatus HdiCommonV1_2::statusCallback =
22 static_cast<OHOS::HDI::Camera::V1_0::FlashlightStatus>(0);
23
Init()24 void HdiCommonV1_2::Init()
25 {
26 uint32_t mainVer;
27 uint32_t minVer;
28 int32_t ret;
29 if (serviceV1_2 == nullptr) {
30 serviceV1_2 = OHOS::HDI::Camera::V1_2::ICameraHost::Get("camera_service", false);
31 if (serviceV1_2 == nullptr) {
32 printf("Init ICameraHost get failed serviceV1_2 nullptr\n");
33 CAMERA_LOGE("Init ICameraHost get failed serviceV1_2 nullptr");
34 return;
35 }
36 CAMERA_LOGI("V1_2::ICameraHost get success");
37 ret = serviceV1_2->GetVersion(mainVer, minVer);
38 if (ret != 0) {
39 printf("Init GetVersion failed, ret = %d\n", ret);
40 CAMERA_LOGE("Init GetVersion failed, ret = %{public}d", ret);
41 return;
42 }
43 CAMERA_LOGI("V1_2::ICameraHost get version success, %{public}d, %{public}d", mainVer, minVer);
44 service = static_cast<OHOS::HDI::Camera::V1_0::ICameraHost *>(serviceV1_2.GetRefPtr());
45 }
46
47 hostCallback = new TestCameraHostCallback();
48 ret = service->SetCallback(hostCallback);
49 if (ret != 0) {
50 printf("Init SetCallback failed, ret = %d\n", ret);
51 CAMERA_LOGE("Init SetCallback failed, ret = %{public}d", ret);
52 }
53 }
54
DefferredImageTestInit()55 int32_t HdiCommonV1_2::DefferredImageTestInit()
56 {
57 constexpr const char* serviceName = "camera_image_process_service";
58 constexpr const int userId = 100;
59 int ret = 0;
60
61 // get ImageProcessService
62 imageProcessService_ = OHOS::HDI::Camera::V1_2::ImageProcessServiceProxy::Get(serviceName, false);
63 if (imageProcessService_ == nullptr) {
64 CAMERA_LOGE("ImageProcessServiceProxy::Get Fail, imageProcessService is nullptr");
65 printf("ImageProcessServiceProxy::Get Fail, imageProcessService is nullptr\n");
66 return -1;
67 }
68 imageProcessCallback_ = new OHOS::Camera::HdiCommonV1_2::TestImageProcessCallback();
69 if (imageProcessCallback_ == nullptr) {
70 CAMERA_LOGE("DefferredImageTestInit imageProcessCallback_ get failed imageProcessCallback_ nullptr");
71 printf("DefferredImageTestInit imageProcessCallback_ get failed imageProcessCallback_ nullptr\n");
72 return -1;
73 }
74 ret = imageProcessService_->CreateImageProcessSession(userId, imageProcessCallback_, imageProcessSession_);
75 if (ret != 0) {
76 CAMERA_LOGE("CreateImageProcessSession failed, ret = %{public}d", ret);
77 printf("CreateImageProcessSession failed, ret = %d\n", ret);
78 return -1;
79 }
80 if (imageProcessSession_ == nullptr) {
81 CAMERA_LOGE("CreateImageProcessSession Fail, imageProcessSession is nullptr: %{public}d", ret);
82 printf("CreateImageProcessSession Fail, imageProcessSession is nullptr: %d\r\n", ret);
83 return -1;
84 }
85 std::shared_ptr<CameraSetting> meta = std::make_shared<CameraSetting>(itemCapacity, dataCapacity);
86 int32_t cameraUserId = 100;
87 meta->addEntry(OHOS_CAMERA_USER_ID, &cameraUserId, dataCount);
88 std::vector<uint8_t> metaVec;
89 MetadataUtils::ConvertMetadataToVec(meta, metaVec);
90 cameraDevice->UpdateSettings(metaVec);
91 return 0;
92 }
93
Open(int cameraId)94 void HdiCommonV1_2::Open(int cameraId)
95 {
96 if (cameraDevice == nullptr) {
97 if (service == nullptr) {
98 printf("Open failed service nullptr\n");
99 CAMERA_LOGE("Open failed service nullptr");
100 return;
101 }
102 service->GetCameraIds(cameraIds);
103 if (cameraIds.size() == 0) {
104 printf("Open GetCameraIds failed\n");
105 CAMERA_LOGE("Open GetCameraIds failed");
106 return;
107 }
108 GetCameraMetadata(cameraId);
109 deviceCallback = new OHOS::Camera::HdiCommon::DemoCameraDeviceCallback();
110 if (serviceV1_2 == nullptr) {
111 printf("Open failed serviceV1_2 nullptr\n");
112 CAMERA_LOGE("Open failed serviceV1_2 nullptr");
113 return;
114 }
115 if (DEVICE_1 == cameraId) {
116 rc = serviceV1_2->OpenCamera_V1_1(cameraIds[1], deviceCallback, cameraDeviceV1_1);
117 } else {
118 rc = serviceV1_2->OpenCamera_V1_1(cameraIds[0], deviceCallback, cameraDeviceV1_1);
119 }
120 if (rc != HDI::Camera::V1_0::NO_ERROR || cameraDeviceV1_1 == nullptr) {
121 printf("Open OpenCamera_V1_1 failed, rc = %d\n", rc);
122 CAMERA_LOGE("Open OpenCamera_V1_1 failed, rc = %{public}d", rc);
123 return;
124 }
125 cameraDevice = static_cast<OHOS::HDI::Camera::V1_0::ICameraDevice *>(cameraDeviceV1_1.GetRefPtr());
126 CAMERA_LOGI("OpenCamera V1_2 success");
127 }
128 }
129
OpenCameraV1_2(int cameraId)130 void HdiCommonV1_2::OpenCameraV1_2(int cameraId)
131 {
132 if (cameraDevice == nullptr) {
133 if (service == nullptr) {
134 printf("OpenCameraV1_2 failed service nullptr\n");
135 CAMERA_LOGE("OpenCameraV1_2 failed service nullptr");
136 return;
137 }
138 service->GetCameraIds(cameraIds);
139 if (cameraIds.size() == 0) {
140 printf("OpenCameraV1_2 GetCameraIds failed\n");
141 CAMERA_LOGE("OpenCameraV1_2 GetCameraIds failed");
142 return;
143 }
144 GetCameraMetadata(cameraId);
145 deviceCallback = new OHOS::Camera::HdiCommon::DemoCameraDeviceCallback();
146 if (serviceV1_2 == nullptr) {
147 printf("OpenCameraV1_2 failed serviceV1_2 nullptr\n");
148 CAMERA_LOGE("OpenCameraV1_2 failed serviceV1_2 nullptr");
149 return;
150 }
151 if (cameraId == DEVICE_1) {
152 rc = serviceV1_2->OpenCamera_V1_2(cameraIds[1], deviceCallback, cameraDeviceV1_2);
153 } else {
154 rc = serviceV1_2->OpenCamera_V1_2(cameraIds[0], deviceCallback, cameraDeviceV1_2);
155 }
156 if (rc != HDI::Camera::V1_0::NO_ERROR || cameraDeviceV1_2 == nullptr) {
157 printf("OpenCameraV1_2 failed, rc = %d\n", rc);
158 CAMERA_LOGE("OpenCameraV1_2 failed, rc = %{public}d", rc);
159 return;
160 }
161 cameraDevice = static_cast<OHOS::HDI::Camera::V1_0::ICameraDevice *>(cameraDeviceV1_2.GetRefPtr());
162 CAMERA_LOGI("OpenCamera V1_2 success");
163 }
164 }
165
GetCameraMetadata(int cameraId)166 void HdiCommonV1_2::GetCameraMetadata(int cameraId)
167 {
168 if (DEVICE_1 == cameraId) {
169 rc = service->GetCameraAbility(cameraIds[1], abilityVec);
170 } else {
171 rc = service->GetCameraAbility(cameraIds[0], abilityVec);
172 }
173 if (rc != HDI::Camera::V1_0::NO_ERROR) {
174 printf("GetCameraAbility failed, rc = %d\n", rc);
175 CAMERA_LOGE("GetCameraAbility failed, rc = %{public}d", rc);
176 return;
177 }
178 MetadataUtils::ConvertVecToMetadata(abilityVec, ability);
179 }
180
DefaultSketch( std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)181 void HdiCommonV1_2::DefaultSketch(
182 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
183 {
184 infos->v1_0.streamId_ = streamIdSketch;
185 infos->v1_0.width_ = sketchWidth;
186 infos->v1_0.height_ = sketchHeight;
187 infos->v1_0.format_ = previewFormat;
188 infos->v1_0.dataspace_ = UT_DATA_SIZE;
189 infos->v1_0.intent_ = StreamIntent::PREVIEW;
190 infos->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
191 }
192
DefaultInfosSketch( std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)193 void HdiCommonV1_2::DefaultInfosSketch(
194 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
195 {
196 DefaultSketch(infos);
197 std::shared_ptr<StreamConsumer> consumer_pre = std::make_shared<StreamConsumer>();
198 infos->v1_0.bufferQueue_ = consumer_pre->CreateProducerSeq([this](void* addr, uint32_t size) {
199 DumpImageFile(streamIdSketch, "yuv", addr, size);
200 });
201 infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
202 consumerMap_[StreamIntent::PREVIEW] = consumer_pre;
203 }
204
DefaultInfosPreviewV1_2( std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)205 void HdiCommonV1_2::DefaultInfosPreviewV1_2(
206 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
207 {
208 DefaultPreview(infos);
209 std::shared_ptr<StreamConsumer> consumer_pre = std::make_shared<StreamConsumer>();
210 infos->v1_0.bufferQueue_ = consumer_pre->CreateProducerSeq([this](void* addr, uint32_t size) {
211 DumpImageFile(streamIdPreview, "yuv", addr, size);
212 });
213 infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
214 }
215
StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming)216 void HdiCommonV1_2::StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming)
217 {
218 captureInfo = std::make_shared<CaptureInfo>();
219 captureInfo->streamIds_ = {streamId};
220 captureInfo->captureSetting_ = abilityVec;
221 captureInfo->enableShutterCallback_ = shutterCallback;
222 if (streamOperator_V1_2 != nullptr) {
223 rc = (OHOS::HDI::Camera::V1_2::CamRetCode)streamOperator_V1_2->Capture(captureId, *captureInfo, isStreaming);
224 } else if (streamOperator_V1_1 != nullptr) {
225 rc = (OHOS::HDI::Camera::V1_2::CamRetCode)streamOperator_V1_1->Capture(captureId, *captureInfo, isStreaming);
226 } else {
227 rc = (OHOS::HDI::Camera::V1_2::CamRetCode)streamOperator->Capture(captureId, *captureInfo, isStreaming);
228 }
229
230 if (rc != HDI::Camera::V1_0::NO_ERROR) {
231 printf("check Capture: Capture fail, rc = %d\n", rc);
232 CAMERA_LOGE("check Capture: Capture fail, rc = %{public}d", rc);
233 }
234 sleep(UT_SLEEP_TIME);
235 }
236
StopStream(std::vector<int>& captureIds, std::vector<int>& streamIds)237 void HdiCommonV1_2::StopStream(std::vector<int>& captureIds, std::vector<int>& streamIds)
238 {
239 if (captureIds.size() > 0) {
240 for (auto &captureId : captureIds) {
241 if (streamOperator_V1_2 != nullptr) {
242 rc = streamOperator_V1_2->CancelCapture(captureId);
243 } else if (streamOperator_V1_1 != nullptr) {
244 rc = streamOperator_V1_1->CancelCapture(captureId);
245 } else {
246 rc = streamOperator->CancelCapture(captureId);
247 }
248 if (rc != HDI::Camera::V1_0::NO_ERROR) {
249 printf("CancelCapture fail, rc = %d, captureId = %d\n", rc, captureId);
250 CAMERA_LOGE("CancelCapture fail, rc = %{public}d, captureId = %{public}d", rc, captureId);
251 }
252 }
253 }
254 if (streamIds.size() > 0) {
255 if (streamOperator_V1_2 != nullptr) {
256 rc = streamOperator_V1_2->ReleaseStreams(streamIds);
257 } else if (streamOperator_V1_1 != nullptr) {
258 rc = streamOperator_V1_1->ReleaseStreams(streamIds);
259 } else {
260 rc = streamOperator->ReleaseStreams(streamIds);
261 }
262 if (rc != HDI::Camera::V1_0::NO_ERROR) {
263 printf("check Capture: ReleaseStreams fail, rc = %d\n", rc);
264 CAMERA_LOGE("check Capture: ReleaseStreams fail, rc = %{public}d", rc);
265 }
266 }
267 }
268
OnCaptureStarted( int32_t captureId, const std::vector<int32_t> &streamId)269 int32_t HdiCommonV1_2::TestStreamOperatorCallbackV1_2::OnCaptureStarted(
270 int32_t captureId, const std::vector<int32_t> &streamId)
271 {
272 for (auto it : streamId) {
273 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
274 }
275 return HDI::Camera::V1_0::NO_ERROR;
276 }
277
OnCaptureEnded(int32_t captureId, const std::vector<CaptureEndedInfo> &infos)278 int32_t HdiCommonV1_2::TestStreamOperatorCallbackV1_2::OnCaptureEnded(int32_t captureId,
279 const std::vector<CaptureEndedInfo> &infos)
280 {
281 for (auto it : infos) {
282 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, count: %{public}d", captureId, it.streamId_,
283 it.frameCount_);
284 }
285 return HDI::Camera::V1_0::NO_ERROR;
286 }
287
OnCaptureError(int32_t captureId, const std::vector<CaptureErrorInfo> &infos)288 int32_t HdiCommonV1_2::TestStreamOperatorCallbackV1_2::OnCaptureError(int32_t captureId,
289 const std::vector<CaptureErrorInfo> &infos)
290 {
291 for (auto it : infos) {
292 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, error: %{public}d", captureId, it.streamId_,
293 it.error_);
294 }
295 return HDI::Camera::V1_0::NO_ERROR;
296 }
297
OnFrameShutter(int32_t captureId, const std::vector<int32_t> &streamIds, uint64_t timestamp)298 int32_t HdiCommonV1_2::TestStreamOperatorCallbackV1_2::OnFrameShutter(int32_t captureId,
299 const std::vector<int32_t> &streamIds, uint64_t timestamp)
300 {
301 (void)timestamp;
302 for (auto it : streamIds) {
303 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
304 }
305 return HDI::Camera::V1_0::NO_ERROR;
306 }
307
OnCaptureStarted_V1_2(int32_t captureId, const std::vector<HDI::Camera::V1_2::CaptureStartedInfo> &infos)308 int32_t HdiCommonV1_2::TestStreamOperatorCallbackV1_2::OnCaptureStarted_V1_2(int32_t captureId,
309 const std::vector<HDI::Camera::V1_2::CaptureStartedInfo> &infos)
310 {
311 for (auto it : infos) {
312 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it.streamId_);
313 }
314 return HDI::Camera::V1_0::NO_ERROR;
315 }
316
OnCameraStatus(const std::string& cameraId, CameraStatus status)317 int32_t HdiCommonV1_2::TestCameraHostCallbackV1_2::OnCameraStatus(const std::string& cameraId, CameraStatus status)
318 {
319 CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), status);
320 return HDI::Camera::V1_0::NO_ERROR;
321 }
322
OnFlashlightStatus( const std::string& cameraId, FlashlightStatus status)323 int32_t HdiCommonV1_2::TestCameraHostCallbackV1_2::OnFlashlightStatus(
324 const std::string& cameraId, FlashlightStatus status)
325 {
326 CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), status);
327 return HDI::Camera::V1_0::NO_ERROR;
328 }
329
OnCameraEvent(const std::string& cameraId, CameraEvent event)330 int32_t HdiCommonV1_2::TestCameraHostCallbackV1_2::OnCameraEvent(const std::string& cameraId, CameraEvent event)
331 {
332 CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), event);
333 return HDI::Camera::V1_0::NO_ERROR;
334 }
335
OnFlashlightStatus_V1_2(FlashlightStatus status)336 int32_t HdiCommonV1_2::TestCameraHostCallbackV1_2::OnFlashlightStatus_V1_2(FlashlightStatus status)
337 {
338 CAMERA_LOGE("status: %{public}d", status);
339 HdiCommonV1_2::statusCallback = status;
340 return HDI::Camera::V1_0::NO_ERROR;
341 }
342
OnProcessDone(const std::string& imageId, const OHOS::HDI::Camera::V1_2::ImageBufferInfo& buffer)343 int32_t HdiCommonV1_2::TestImageProcessCallback::OnProcessDone(const std::string& imageId,
344 const OHOS::HDI::Camera::V1_2::ImageBufferInfo& buffer)
345 {
346 CAMERA_LOGI("imageId: %{public}s", imageId.c_str());
347 coutProcessDone_++;
348 curImageId_ = imageId;
349 curImageBufferInfo_ = buffer;
350 isDone_ = true;
351 return 0;
352 }
353
OnStatusChanged(OHOS::HDI::Camera::V1_2::SessionStatus status)354 int32_t HdiCommonV1_2::TestImageProcessCallback::OnStatusChanged(OHOS::HDI::Camera::V1_2::SessionStatus status)
355 {
356 CAMERA_LOGI("status: %{public}d", status);
357 curStatus_ = status;
358 coutStatusChanged_++;
359 return 0;
360 }
361
OnError(const std::string& imageId, OHOS::HDI::Camera::V1_2::ErrorCode errorCode)362 int32_t HdiCommonV1_2::TestImageProcessCallback::OnError(const std::string& imageId,
363 OHOS::HDI::Camera::V1_2::ErrorCode errorCode)
364 {
365 CAMERA_LOGI("imageId: %{public}s, errorCode: %{public}d", imageId.c_str(), errorCode);
366 curImageId_ = imageId;
367 curErrorCode_ = errorCode;
368 countError_++;
369 return 0;
370 }
371 } // OHOS::Camera