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