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 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_3.h"
17 #include "camera.h"
18 #include "video_key_info.h"
19
20 namespace OHOS::Camera {
21 HdiCommonV1_3::StreamResultCallback HdiCommonV1_3::streamResultCallback_ = 0;
22
Init()23 void HdiCommonV1_3::Init()
24 {
25 uint32_t mainVer;
26 uint32_t minVer;
27 int32_t ret;
28 if (serviceV1_3 == nullptr) {
29 serviceV1_3 = OHOS::HDI::Camera::V1_3::ICameraHost::Get("camera_service", false);
30 if (serviceV1_3 == nullptr) {
31 printf("Init ICameraHost get failed serviceV1_3 nullptr\n");
32 CAMERA_LOGE("Init ICameraHost get failed serviceV1_3 nullptr");
33 return;
34 }
35 CAMERA_LOGI("V1_3::ICameraHost get success");
36 ret = serviceV1_3->GetVersion(mainVer, minVer);
37 if (ret != 0) {
38 printf("Init GetVersion failed, ret = %d\n", ret);
39 CAMERA_LOGE("Init GetVersion failed, ret = %{public}d", ret);
40 return;
41 }
42 CAMERA_LOGI("V1_3::ICameraHost get version success, %{public}d, %{public}d", mainVer, minVer);
43 }
44
45 hostCallback = new TestCameraHostCallback();
46 ret = serviceV1_3->SetCallback(hostCallback);
47 if (ret != 0) {
48 printf("Init SetCallback failed, ret = %d\n", ret);
49 CAMERA_LOGE("Init SetCallback failed, ret = %{public}d", ret);
50 }
51 }
52
Open(int cameraId)53 void HdiCommonV1_3::Open(int cameraId)
54 {
55 if (cameraDeviceV1_3 == nullptr) {
56 if (serviceV1_3 == nullptr) {
57 printf("Open failed serviceV1_3 nullptr\n");
58 CAMERA_LOGE("Open failed serviceV1_3 nullptr");
59 return;
60 }
61 serviceV1_3->GetCameraIds(cameraIds);
62 if (cameraIds.size() == 0) {
63 printf("Open GetCameraIds failed\n");
64 CAMERA_LOGE("Open GetCameraIds failed");
65 return;
66 }
67 GetCameraMetadata(cameraId);
68 deviceCallback = new OHOS::Camera::HdiCommon::DemoCameraDeviceCallback();
69 if (DEVICE_1 == cameraId) {
70 rc = serviceV1_3->OpenCamera_V1_3(cameraIds[1], deviceCallback, cameraDeviceV1_3);
71 } else {
72 rc = serviceV1_3->OpenCamera_V1_3(cameraIds[0], deviceCallback, cameraDeviceV1_3);
73 }
74 if (rc != HDI::Camera::V1_0::NO_ERROR || cameraDeviceV1_3 == nullptr) {
75 printf("Open OpenCamera_V1_3 failed, rc = %d\n", rc);
76 CAMERA_LOGE("Open OpenCamera_V1_3 failed, rc = %{public}d", rc);
77 } else {
78 CAMERA_LOGI("Open success");
79 }
80 }
81 }
82
OpenSecureCamera(int cameraId)83 void HdiCommonV1_3::OpenSecureCamera(int cameraId)
84 {
85 if (cameraDeviceV1_3 == nullptr) {
86 if (serviceV1_3 == nullptr) {
87 printf("OpenSecureCamera failed serviceV1_3 nullptr\n");
88 CAMERA_LOGE("OpenSecureCamera failed serviceV1_3 nullptr");
89 return;
90 }
91 serviceV1_3->GetCameraIds(cameraIds);
92 if (cameraIds.size() == 0) {
93 printf("OpenSecureCamera GetCameraIds failed\n");
94 CAMERA_LOGE("OpenSecureCamera GetCameraIds failed");
95 return;
96 }
97 GetCameraMetadata(cameraId);
98 deviceCallback = new OHOS::Camera::HdiCommon::DemoCameraDeviceCallback();
99 if (DEVICE_1 == cameraId) {
100 rc = serviceV1_3->OpenSecureCamera(cameraIds[1], deviceCallback, cameraDeviceV1_3);
101 } else {
102 rc = serviceV1_3->OpenSecureCamera(cameraIds[0], deviceCallback, cameraDeviceV1_3);
103 }
104 if (rc != HDI::Camera::V1_0::NO_ERROR || cameraDeviceV1_3 == nullptr) {
105 printf("Open OpenCamera_V1_3 failed, rc = %d\n", rc);
106 CAMERA_LOGE("Open OpenCamera_V1_3 failed, rc = %{public}d", rc);
107 } else {
108 CAMERA_LOGI("OpenSecureCamera success");
109 }
110 }
111 }
112
GetCameraMetadata(int cameraId)113 void HdiCommonV1_3::GetCameraMetadata(int cameraId)
114 {
115 if (DEVICE_1 == cameraId) {
116 rc = serviceV1_3->GetCameraAbility(cameraIds[1], abilityVec);
117 } else {
118 rc = serviceV1_3->GetCameraAbility(cameraIds[0], abilityVec);
119 }
120 if (rc != HDI::Camera::V1_0::NO_ERROR) {
121 printf("GetCameraAbility failed, rc = %d\n", rc);
122 CAMERA_LOGE("GetCameraAbility failed, rc = %{public}d", rc);
123 return;
124 }
125 MetadataUtils::ConvertVecToMetadata(abilityVec, ability);
126 }
127
Close()128 void HdiCommonV1_3::Close()
129 {
130 if (cameraDeviceV1_3 != nullptr) {
131 cameraDeviceV1_3->Close();
132 cameraDeviceV1_3 = nullptr;
133 }
134 }
135
DefaultMeta( std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)136 void HdiCommonV1_3::DefaultMeta(
137 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
138 {
139 infos->v1_0.streamId_ = streamIdMeta;
140 infos->v1_0.width_ = metaWidth;
141 infos->v1_0.height_ = metaHeight;
142 infos->v1_0.format_ = snapshotFormat;
143 infos->v1_0.dataspace_ = UT_DATA_SIZE;
144 infos->v1_0.intent_ = StreamIntent::VIDEO;
145 infos->v1_0.encodeType_ = OHOS::HDI::Camera::V1_0::ENCODE_TYPE_H265;
146 infos->v1_0.tunneledMode_ = UT_TUNNEL_MODE;
147 }
148
DefaultInfosMeta( std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)149 void HdiCommonV1_3::DefaultInfosMeta(
150 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
151 {
152 DefaultMeta(infos);
153 std::shared_ptr<StreamConsumer> consumer_meta = std::make_shared<StreamConsumer>();
154 infos->v1_0.bufferQueue_ = consumer_meta->CreateProducerSeq([this](void* addr, uint32_t size) {
155 DumpImageFile(streamIdMeta, "yuv", addr, size);
156 });
157 infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
158 consumerMap_[StreamIntent::PREVIEW] = consumer_meta;
159 }
160
DefaultInfosProfessionalCapture( std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)161 void HdiCommonV1_3::DefaultInfosProfessionalCapture(
162 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> &infos)
163 {
164 DefaultCapture(infos);
165 std::shared_ptr<StreamConsumer> consumer_capture = std::make_shared<StreamConsumer>();
166 infos->v1_0.bufferQueue_ = consumer_capture->CreateProducerSeq([this](void* addr, uint32_t size) {
167 DumpImageFile(streamIdCapture, "yuv", addr, size);
168 });
169 infos->v1_0.bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
170 consumerMap_[StreamIntent::STILL_CAPTURE] = consumer_capture;
171 }
172
StartProfessionalStream(std::vector<StreamIntent> intents, uint8_t professionalMode)173 void HdiCommonV1_3::StartProfessionalStream(std::vector<StreamIntent> intents, uint8_t professionalMode)
174 {
175 streamOperatorCallbackV1_3 = new OHOS::Camera::HdiCommonV1_3::TestStreamOperatorCallbackV1_3();
176 uint32_t mainVersion = 1;
177 uint32_t minVersion = 0;
178 rc = cameraDeviceV1_3->GetStreamOperator_V1_3(streamOperatorCallbackV1_3, streamOperator_V1_3);
179 if (rc == HDI::Camera::V1_0::NO_ERROR) {
180 rc = streamOperator_V1_3->GetVersion(mainVersion, minVersion);
181 if (rc != HDI::Camera::V1_0::NO_ERROR) {
182 printf("streamOperator_V1_3 get version failed, rc = %d\n", rc);
183 CAMERA_LOGE("streamOperator_V1_3 get version failed, rc = %{public}d", rc);
184 }
185 CAMERA_LOGI("GetStreamOperator success");
186 } else {
187 printf("GetStreamOperator fail, rc = %d\n", rc);
188 CAMERA_LOGE("GetStreamOperator fail, rc = %{public}d", rc);
189 }
190 streamInfoPre = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
191 streamInfoVideo = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
192 streamInfoCapture = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
193 streamInfoAnalyze = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
194 for (auto& streamType : intents) {
195 if (streamType == StreamIntent::PREVIEW) {
196 DefaultInfosPreview(streamInfoPre);
197 streamInfos.push_back(*streamInfoPre);
198 } else if (streamType == StreamIntent::VIDEO) {
199 DefaultInfosVideo(streamInfoVideo);
200 streamInfos.push_back(*streamInfoVideo);
201 } else if (streamType == StreamIntent::ANALYZE) {
202 DefaultInfosAnalyze(streamInfoAnalyze);
203 streamInfos.push_back(*streamInfoAnalyze);
204 } else {
205 DefaultInfosProfessionalCapture(streamInfoCapture);
206 streamInfos.push_back(*streamInfoCapture);
207 }
208 }
209 rc = streamOperator_V1_3->CreateStreams_V1_1(streamInfos);
210 if (rc != HDI::Camera::V1_0::NO_ERROR) {
211 printf("check StartProfessionalStream: CreateStreams_V1_1 fail, rc = %d\n", rc);
212 CAMERA_LOGE("check StartProfessionalStream: CreateStreams_V1_1 fail, rc = %{public}d", rc);
213 }
214 rc = streamOperator_V1_3->CommitStreams_V1_1(
215 static_cast<OHOS::HDI::Camera::V1_1::OperationMode_V1_1>(professionalMode), abilityVec);
216 if (rc != HDI::Camera::V1_0::NO_ERROR) {
217 printf("check StartProfessionalStream: CommitStreams_V1_1 fail, rc = %d\n", rc);
218 CAMERA_LOGE("check StartProfessionalStream: CommitStreams_V1_1 fail, rc = %{public}d", rc);
219 }
220 sleep(1);
221 std::vector<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>().swap(streamInfos);
222 }
223
StartStream(std::vector<StreamIntent> intents, OHOS::HDI::Camera::V1_3::OperationMode mode)224 void HdiCommonV1_3::StartStream(std::vector<StreamIntent> intents, OHOS::HDI::Camera::V1_3::OperationMode mode)
225 {
226 streamOperatorCallbackV1_3 = new OHOS::Camera::HdiCommonV1_3::TestStreamOperatorCallbackV1_3();
227 uint32_t mainVersion = 1;
228 uint32_t minVersion = 0;
229 rc = cameraDeviceV1_3->GetStreamOperator_V1_3(streamOperatorCallbackV1_3, streamOperator_V1_3);
230 if (rc == HDI::Camera::V1_0::NO_ERROR) {
231 rc = streamOperator_V1_3->GetVersion(mainVersion, minVersion);
232 if (rc != HDI::Camera::V1_0::NO_ERROR) {
233 printf("streamOperator_V1_3 get version failed, rc = %d\n", rc);
234 CAMERA_LOGE("streamOperator_V1_3 get version failed, rc = %{public}d", rc);
235 }
236 CAMERA_LOGI("GetStreamOperator success");
237 } else {
238 printf("GetStreamOperator fail, rc = %d\n", rc);
239 CAMERA_LOGE("GetStreamOperator fail, rc = %{public}d", rc);
240 }
241 streamInfoPre = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
242 streamInfoVideo = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
243 streamInfoCapture = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
244 streamInfoAnalyze = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
245 for (auto& intent : intents) {
246 if (intent == StreamIntent::PREVIEW) {
247 DefaultInfosPreview(streamInfoPre);
248 streamInfos.push_back(*streamInfoPre);
249 } else if (intent == StreamIntent::VIDEO) {
250 DefaultInfosVideo(streamInfoVideo);
251 streamInfos.push_back(*streamInfoVideo);
252 } else if (intent == StreamIntent::ANALYZE) {
253 DefaultInfosAnalyze(streamInfoAnalyze);
254 streamInfos.push_back(*streamInfoAnalyze);
255 } else {
256 DefaultInfosCapture(streamInfoCapture);
257 streamInfos.push_back(*streamInfoCapture);
258 }
259 }
260 rc = streamOperator_V1_3->CreateStreams_V1_1(streamInfos);
261 if (rc != HDI::Camera::V1_0::NO_ERROR) {
262 printf("check StartStream: CreateStreams_V1_1 fail, rc = %d\n", rc);
263 CAMERA_LOGE("check StartStream: CreateStreams_V1_1 fail, rc = %{public}d", rc);
264 }
265 rc = streamOperator_V1_3->CommitStreams_V1_1(
266 static_cast<OHOS::HDI::Camera::V1_1::OperationMode_V1_1>(mode), abilityVec);
267 if (rc != HDI::Camera::V1_0::NO_ERROR) {
268 printf("check StartStream: CommitStreams_V1_1 fail, rc = %d\n", rc);
269 CAMERA_LOGE("check StartStream: CommitStreams_V1_1 fail, rc = %{public}d", rc);
270 }
271 sleep(1);
272 std::vector<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>().swap(streamInfos);
273 }
274
StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming)275 void HdiCommonV1_3::StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming)
276 {
277 captureInfo = std::make_shared<CaptureInfo>();
278 captureInfo->streamIds_ = {streamId};
279 captureInfo->captureSetting_ = abilityVec;
280 captureInfo->enableShutterCallback_ = shutterCallback;
281 if (streamOperator_V1_3 == nullptr) {
282 printf("StartCapture failed streamOperator_V1_3 nullptr\n");
283 CAMERA_LOGE("StartCapture failed streamOperator_V1_3 nullptr");
284 return;
285 }
286 rc = (OHOS::HDI::Camera::V1_0::CamRetCode)streamOperator_V1_3->Capture(captureId, *captureInfo, isStreaming);
287 if (rc != HDI::Camera::V1_0::NO_ERROR) {
288 printf("check Capture: Capture fail, rc = %d\n", rc);
289 CAMERA_LOGE("check Capture: Capture fail, rc = %{public}d", rc);
290 }
291 sleep(UT_SLEEP_TIME);
292 }
293
StopStream(std::vector<int>& captureIds, std::vector<int>& streamIds)294 void HdiCommonV1_3::StopStream(std::vector<int>& captureIds, std::vector<int>& streamIds)
295 {
296 if (captureIds.size() > 0) {
297 for (auto &captureId : captureIds) {
298 if (streamOperator_V1_3 == nullptr) {
299 printf("StopStream failed streamOperator_V1_3 nullptr\n");
300 CAMERA_LOGE("StopStream failed streamOperator_V1_3 nullptr");
301 return;
302 }
303 rc = streamOperator_V1_3->CancelCapture(captureId);
304 if (rc != HDI::Camera::V1_0::NO_ERROR) {
305 printf("CancelCapture fail, rc = %d, captureId = %d\n", rc, captureId);
306 CAMERA_LOGE("CancelCapture fail, rc = %{public}d, captureId = %{public}d", rc, captureId);
307 }
308 }
309 }
310 if (streamIds.size() > 0) {
311 if (streamOperator_V1_3 == nullptr) {
312 printf("StopStream failed streamOperator_V1_3 nullptr\n");
313 CAMERA_LOGE("StopStream failed streamOperator_V1_3 nullptr");
314 return;
315 }
316 rc = streamOperator_V1_3->ReleaseStreams(streamIds);
317 if (rc != HDI::Camera::V1_0::NO_ERROR) {
318 printf("check Capture: ReleaseStreams fail, rc = %d\n", rc);
319 CAMERA_LOGE("check Capture: ReleaseStreams fail, rc = %{public}d", rc);
320 }
321 }
322 }
323
OnCaptureStarted( int32_t captureId, const std::vector<int32_t> &streamId)324 int32_t HdiCommonV1_3::TestStreamOperatorCallbackV1_3::OnCaptureStarted(
325 int32_t captureId, const std::vector<int32_t> &streamId)
326 {
327 for (auto it : streamId) {
328 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
329 }
330 return HDI::Camera::V1_0::NO_ERROR;
331 }
332
OnCaptureEnded(int32_t captureId, const std::vector<CaptureEndedInfo> &infos)333 int32_t HdiCommonV1_3::TestStreamOperatorCallbackV1_3::OnCaptureEnded(int32_t captureId,
334 const std::vector<CaptureEndedInfo> &infos)
335 {
336 for (auto it : infos) {
337 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, count: %{public}d", captureId, it.streamId_,
338 it.frameCount_);
339 }
340 return HDI::Camera::V1_0::NO_ERROR;
341 }
342
OnCaptureEndedExt(int32_t captureId, const std::vector<HDI::Camera::V1_3::CaptureEndedInfoExt> &infos)343 int32_t HdiCommonV1_3::TestStreamOperatorCallbackV1_3::OnCaptureEndedExt(int32_t captureId,
344 const std::vector<HDI::Camera::V1_3::CaptureEndedInfoExt> &infos)
345 {
346 for (auto it : infos) {
347 CAMERA_LOGI("OnCaptureEndedExt captureId: %{public}d, streamId: %{public}d", captureId, it.streamId_);
348 }
349 return HDI::Camera::V1_0::NO_ERROR;
350 }
351
OnCaptureError(int32_t captureId, const std::vector<CaptureErrorInfo> &infos)352 int32_t HdiCommonV1_3::TestStreamOperatorCallbackV1_3::OnCaptureError(int32_t captureId,
353 const std::vector<CaptureErrorInfo> &infos)
354 {
355 for (auto it : infos) {
356 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, error: %{public}d", captureId, it.streamId_,
357 it.error_);
358 }
359 return HDI::Camera::V1_0::NO_ERROR;
360 }
361
OnFrameShutter(int32_t captureId, const std::vector<int32_t> &streamIds, uint64_t timestamp)362 int32_t HdiCommonV1_3::TestStreamOperatorCallbackV1_3::OnFrameShutter(int32_t captureId,
363 const std::vector<int32_t> &streamIds, uint64_t timestamp)
364 {
365 (void)timestamp;
366 for (auto it : streamIds) {
367 CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
368 }
369 return HDI::Camera::V1_0::NO_ERROR;
370 }
371
OnCaptureStarted_V1_2(int32_t captureId, const std::vector<HDI::Camera::V1_2::CaptureStartedInfo> &infos)372 int32_t HdiCommonV1_3::TestStreamOperatorCallbackV1_3::OnCaptureStarted_V1_2(int32_t captureId,
373 const std::vector<HDI::Camera::V1_2::CaptureStartedInfo> &infos)
374 {
375 for (auto it : infos) {
376 CAMERA_LOGI("captureId: %{public}d, streamId: %{public}d", captureId, it.streamId_);
377 }
378 return HDI::Camera::V1_0::NO_ERROR;
379 }
380
OnCaptureReady(int32_t captureId, const std::vector<int32_t> &streamIds, uint64_t timestamp)381 int32_t HdiCommonV1_3::TestStreamOperatorCallbackV1_3::OnCaptureReady(int32_t captureId,
382 const std::vector<int32_t> &streamIds, uint64_t timestamp)
383 {
384 (void)timestamp;
385 for (auto it : streamIds) {
386 CAMERA_LOGI("OnCaptureReady captureId: %{public}d, streamId: %{public}d", captureId, it);
387 }
388 return HDI::Camera::V1_0::NO_ERROR;
389 }
390
OnFrameShutterEnd(int32_t captureId, const std::vector<int32_t> &streamIds, uint64_t timestamp)391 int32_t HdiCommonV1_3::TestStreamOperatorCallbackV1_3::OnFrameShutterEnd(int32_t captureId,
392 const std::vector<int32_t> &streamIds, uint64_t timestamp)
393 {
394 (void)timestamp;
395 for (auto it : streamIds) {
396 CAMERA_LOGI("OnFrameShutterEnd captureId: %{public}d, streamId: %{public}d", captureId, it);
397 }
398 return HDI::Camera::V1_0::NO_ERROR;
399 }
400
OnResult(int32_t streamId, const std::vector<uint8_t> &result)401 int32_t HdiCommonV1_3::TestStreamOperatorCallbackV1_3::OnResult(int32_t streamId, const std::vector<uint8_t> &result)
402 {
403 MetadataUtils::ConvertVecToMetadata(result, streamResultMeta);
404 if (HdiCommonV1_3::streamResultCallback_) {
405 HdiCommonV1_3::streamResultCallback_(streamId, streamResultMeta);
406 }
407 return HDI::Camera::V1_0::NO_ERROR;
408 }
409 } // OHOS::Camera