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