1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file expected in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "hdi_common.h"
17094332d3Sopenharmony_ci#include "camera.h"
18094332d3Sopenharmony_ci#include "video_key_info.h"
19094332d3Sopenharmony_ci
20094332d3Sopenharmony_cinamespace OHOS::Camera {
21094332d3Sopenharmony_ciHdiCommon::ResultCallback HdiCommon::resultCallback_ = 0;
22094332d3Sopenharmony_ci
23094332d3Sopenharmony_ciuint64_t HdiCommon::GetCurrentLocalTimeStamp()
24094332d3Sopenharmony_ci{
25094332d3Sopenharmony_ci    std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp =
26094332d3Sopenharmony_ci        std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
27094332d3Sopenharmony_ci    auto tmp = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
28094332d3Sopenharmony_ci    return static_cast<uint64_t>(tmp.count());
29094332d3Sopenharmony_ci}
30094332d3Sopenharmony_ci
31094332d3Sopenharmony_ciint32_t HdiCommon::DumpImageFile(int streamId, std::string suffix, const void* buffer, int32_t size)
32094332d3Sopenharmony_ci{
33094332d3Sopenharmony_ci    if (imageDataSaveSwitch == SWITCH_OFF) {
34094332d3Sopenharmony_ci        return 0;
35094332d3Sopenharmony_ci    }
36094332d3Sopenharmony_ci    if (streamId < 0) {
37094332d3Sopenharmony_ci        CAMERA_LOGE("ivalid stream id: %{public}d", streamId);
38094332d3Sopenharmony_ci        return -1;
39094332d3Sopenharmony_ci    }
40094332d3Sopenharmony_ci    char mkdirCmd[PATH_MAX] = {0};
41094332d3Sopenharmony_ci    char path[PATH_MAX] = {0};
42094332d3Sopenharmony_ci    int ret = sprintf_s(mkdirCmd, sizeof(mkdirCmd) / sizeof(mkdirCmd[0]),
43094332d3Sopenharmony_ci        "mkdir -p /data/stream-%d", streamId);
44094332d3Sopenharmony_ci    if (ret < 0) {
45094332d3Sopenharmony_ci        return -1;
46094332d3Sopenharmony_ci    }
47094332d3Sopenharmony_ci    system(mkdirCmd);
48094332d3Sopenharmony_ci    ret = sprintf_s(path, sizeof(path) / sizeof(path[0]), "data/stream-%d/%lld.%s",
49094332d3Sopenharmony_ci        streamId, GetCurrentLocalTimeStamp(), suffix.c_str());
50094332d3Sopenharmony_ci    if (ret < 0) {
51094332d3Sopenharmony_ci        return -1;
52094332d3Sopenharmony_ci    }
53094332d3Sopenharmony_ci
54094332d3Sopenharmony_ci    int imgFd = open(path, O_RDWR | O_CREAT, 00766);
55094332d3Sopenharmony_ci    if (imgFd == -1) {
56094332d3Sopenharmony_ci        CAMERA_LOGE("open file failed, errno: %{public}s", strerror(errno));
57094332d3Sopenharmony_ci        return -1;
58094332d3Sopenharmony_ci    }
59094332d3Sopenharmony_ci
60094332d3Sopenharmony_ci    ret = write(imgFd, buffer, size);
61094332d3Sopenharmony_ci    if (ret == -1) {
62094332d3Sopenharmony_ci        CAMERA_LOGE("write file failed, error: %{public}s", strerror(errno));
63094332d3Sopenharmony_ci        close(imgFd);
64094332d3Sopenharmony_ci        return -1;
65094332d3Sopenharmony_ci    }
66094332d3Sopenharmony_ci    close(imgFd);
67094332d3Sopenharmony_ci    return 0;
68094332d3Sopenharmony_ci}
69094332d3Sopenharmony_ci
70094332d3Sopenharmony_civoid HdiCommon::Init()
71094332d3Sopenharmony_ci{
72094332d3Sopenharmony_ci    if (service == nullptr) {
73094332d3Sopenharmony_ci        service = ICameraHost::Get("camera_service", false);
74094332d3Sopenharmony_ci        if (service == nullptr)  {
75094332d3Sopenharmony_ci            printf("ICameraHost get failed\n");
76094332d3Sopenharmony_ci            CAMERA_LOGE("ICameraHost get failed");
77094332d3Sopenharmony_ci            return;
78094332d3Sopenharmony_ci        }
79094332d3Sopenharmony_ci    }
80094332d3Sopenharmony_ci    hostCallback = new TestCameraHostCallback();
81094332d3Sopenharmony_ci    service->SetCallback(hostCallback);
82094332d3Sopenharmony_ci}
83094332d3Sopenharmony_ci
84094332d3Sopenharmony_civoid HdiCommon::GetCameraMetadata()
85094332d3Sopenharmony_ci{
86094332d3Sopenharmony_ci    rc = service->GetCameraAbility(cameraIds.front(), abilityVec);
87094332d3Sopenharmony_ci    if (rc != HDI::Camera::V1_0::NO_ERROR) {
88094332d3Sopenharmony_ci        printf("GetCameraAbility failed, rc = %d\n", rc);
89094332d3Sopenharmony_ci        CAMERA_LOGE("GetCameraAbility failed, rc = %{public}d", rc);
90094332d3Sopenharmony_ci        return;
91094332d3Sopenharmony_ci    }
92094332d3Sopenharmony_ci    MetadataUtils::ConvertVecToMetadata(abilityVec, ability);
93094332d3Sopenharmony_ci
94094332d3Sopenharmony_ci    common_metadata_header_t* data = ability->get();
95094332d3Sopenharmony_ci    camera_metadata_item_t entry;
96094332d3Sopenharmony_ci    int ret = FindCameraMetadataItem(data, OHOS_CONTROL_AE_AVAILABLE_MODES, &entry);
97094332d3Sopenharmony_ci    camera_metadata_item_t connectEntry;
98094332d3Sopenharmony_ci    ret = FindCameraMetadataItem(data, OHOS_ABILITY_CAMERA_CONNECTION_TYPE, &connectEntry);
99094332d3Sopenharmony_ci    if (ret == HDI::Camera::V1_0::NO_ERROR && connectEntry.data.u8 != nullptr && connectEntry.count > 0) {
100094332d3Sopenharmony_ci        uint8_t cameraConnectionType = *(connectEntry.data.u8);
101094332d3Sopenharmony_ci        if (static_cast<int>(cameraConnectionType) == OHOS_CAMERA_CONNECTION_TYPE_USB_PLUGIN) {
102094332d3Sopenharmony_ci            CAMERA_LOGI("get OHOS_ABILITY_CAMERA_CONNECTION_TYPE success, this camera is usb camera.");
103094332d3Sopenharmony_ci            previewWidth = usbCamera_previewWidth;
104094332d3Sopenharmony_ci            previewHeight = usbCamera_previewHeight;
105094332d3Sopenharmony_ci            videoWidth = usbCamera_videoWidth;
106094332d3Sopenharmony_ci            videoHeight = usbCamera_videoHeight;
107094332d3Sopenharmony_ci            captureWidth = usbCamera_captureWidth;
108094332d3Sopenharmony_ci            captureHeight = usbCamera_captureHeight;
109094332d3Sopenharmony_ci            analyzeWidth = usbCamera_analyzeWidth;
110094332d3Sopenharmony_ci            analyzeHeight = usbCamera_analyzeHeight;
111094332d3Sopenharmony_ci            previewFormat = usbCamera_previewFormat;
112094332d3Sopenharmony_ci            videoFormat = usbCamera_videoFormat;
113094332d3Sopenharmony_ci            snapshotFormat = usbCamera_snapshotFormat;
114094332d3Sopenharmony_ci            analyzeFormat = usbCamera_analyzeFormat;
115094332d3Sopenharmony_ci            videoEncodeType = usbCamera_videoEncodeType;
116094332d3Sopenharmony_ci        }
117094332d3Sopenharmony_ci    }
118094332d3Sopenharmony_ci}
119094332d3Sopenharmony_ci
120094332d3Sopenharmony_civoid HdiCommon::Open()
121094332d3Sopenharmony_ci{
122094332d3Sopenharmony_ci    if (cameraDevice == nullptr) {
123094332d3Sopenharmony_ci        service->GetCameraIds(cameraIds);
124094332d3Sopenharmony_ci        if (cameraIds.size() == 0) {
125094332d3Sopenharmony_ci            printf("camera device list empty\n");
126094332d3Sopenharmony_ci            CAMERA_LOGE("camera device list empty");
127094332d3Sopenharmony_ci            return;
128094332d3Sopenharmony_ci        }
129094332d3Sopenharmony_ci        GetCameraMetadata();
130094332d3Sopenharmony_ci        deviceCallback = new OHOS::Camera::HdiCommon::DemoCameraDeviceCallback();
131094332d3Sopenharmony_ci        rc = service->OpenCamera(cameraIds.front(), deviceCallback, cameraDevice);
132094332d3Sopenharmony_ci        if (rc != HDI::Camera::V1_0::NO_ERROR || cameraDevice == nullptr) {
133094332d3Sopenharmony_ci            printf("openCamera failed, rc = %d\n", rc);
134094332d3Sopenharmony_ci            CAMERA_LOGE("openCamera failed, rc = %{public}d", rc);
135094332d3Sopenharmony_ci            return;
136094332d3Sopenharmony_ci        }
137094332d3Sopenharmony_ci        CAMERA_LOGI("OpenCamera success");
138094332d3Sopenharmony_ci    }
139094332d3Sopenharmony_ci}
140094332d3Sopenharmony_ci
141094332d3Sopenharmony_civoid HdiCommon::Close()
142094332d3Sopenharmony_ci{
143094332d3Sopenharmony_ci    if (cameraDevice != nullptr) {
144094332d3Sopenharmony_ci        cameraDevice->Close();
145094332d3Sopenharmony_ci        cameraDevice = nullptr;
146094332d3Sopenharmony_ci    }
147094332d3Sopenharmony_ci}
148094332d3Sopenharmony_ci
149094332d3Sopenharmony_civoid HdiCommon::DefaultPreview(std::shared_ptr<StreamInfo> &infos)
150094332d3Sopenharmony_ci{
151094332d3Sopenharmony_ci    infos->streamId_ = streamIdPreview;
152094332d3Sopenharmony_ci    infos->width_ = previewWidth;
153094332d3Sopenharmony_ci    infos->height_ = previewHeight;
154094332d3Sopenharmony_ci    infos->format_ = previewFormat;
155094332d3Sopenharmony_ci    infos->dataspace_ = UT_DATA_SIZE;
156094332d3Sopenharmony_ci    infos->intent_ = StreamIntent::PREVIEW;
157094332d3Sopenharmony_ci    infos->tunneledMode_ = UT_TUNNEL_MODE;
158094332d3Sopenharmony_ci}
159094332d3Sopenharmony_ci
160094332d3Sopenharmony_civoid HdiCommon::DefaultCapture(std::shared_ptr<StreamInfo> &infos)
161094332d3Sopenharmony_ci{
162094332d3Sopenharmony_ci    infos->streamId_ = streamIdCapture;
163094332d3Sopenharmony_ci    infos->width_ = captureWidth;
164094332d3Sopenharmony_ci    infos->height_ = captureHeight;
165094332d3Sopenharmony_ci    infos->format_ = snapshotFormat;
166094332d3Sopenharmony_ci    infos->dataspace_ = UT_DATA_SIZE;
167094332d3Sopenharmony_ci    infos->intent_ = StreamIntent::STILL_CAPTURE;
168094332d3Sopenharmony_ci    infos->tunneledMode_ = UT_TUNNEL_MODE;
169094332d3Sopenharmony_ci}
170094332d3Sopenharmony_ci
171094332d3Sopenharmony_civoid HdiCommon::DefaultInfosPreview(std::shared_ptr<StreamInfo> &infos)
172094332d3Sopenharmony_ci{
173094332d3Sopenharmony_ci    DefaultPreview(infos);
174094332d3Sopenharmony_ci    std::shared_ptr<OHOS::Camera::HdiCommon::StreamConsumer> consumer_pre =
175094332d3Sopenharmony_ci        std::make_shared<OHOS::Camera::HdiCommon::StreamConsumer>();
176094332d3Sopenharmony_ci    infos->bufferQueue_ = consumer_pre->CreateProducerSeq([this](void* addr, uint32_t size) {
177094332d3Sopenharmony_ci        DumpImageFile(streamIdPreview, "yuv", addr, size);
178094332d3Sopenharmony_ci    });
179094332d3Sopenharmony_ci    infos->bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
180094332d3Sopenharmony_ci    consumerMap_[StreamIntent::PREVIEW] = consumer_pre;
181094332d3Sopenharmony_ci}
182094332d3Sopenharmony_ci
183094332d3Sopenharmony_civoid HdiCommon::DefaultInfosCapture(std::shared_ptr<StreamInfo> &infos)
184094332d3Sopenharmony_ci{
185094332d3Sopenharmony_ci    DefaultCapture(infos);
186094332d3Sopenharmony_ci    std::shared_ptr<OHOS::Camera::HdiCommon::StreamConsumer> consumer_capture =
187094332d3Sopenharmony_ci        std::make_shared<OHOS::Camera::HdiCommon::StreamConsumer>();
188094332d3Sopenharmony_ci    infos->bufferQueue_ = consumer_capture->CreateProducerSeq([this](void* addr, uint32_t size) {
189094332d3Sopenharmony_ci        DumpImageFile(streamIdPreview, "yuv", addr, size);
190094332d3Sopenharmony_ci    });
191094332d3Sopenharmony_ci    infos->bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
192094332d3Sopenharmony_ci    consumerMap_[StreamIntent::PREVIEW] = consumer_capture;
193094332d3Sopenharmony_ci}
194094332d3Sopenharmony_ci
195094332d3Sopenharmony_civoid HdiCommon::DefaultInfosVideo(std::shared_ptr<StreamInfo> &infos)
196094332d3Sopenharmony_ci{
197094332d3Sopenharmony_ci    infos->streamId_ = streamIdVideo;
198094332d3Sopenharmony_ci    infos->width_ = videoWidth;
199094332d3Sopenharmony_ci    infos->height_ = videoHeight;
200094332d3Sopenharmony_ci    infos->format_ = videoFormat;
201094332d3Sopenharmony_ci    infos->dataspace_ = UT_DATA_SIZE;
202094332d3Sopenharmony_ci    infos->intent_ = StreamIntent::VIDEO;
203094332d3Sopenharmony_ci    infos->encodeType_ = static_cast<OHOS::HDI::Camera::V1_0::EncodeType>(videoEncodeType);
204094332d3Sopenharmony_ci    infos->tunneledMode_ = UT_TUNNEL_MODE;
205094332d3Sopenharmony_ci    std::shared_ptr<OHOS::Camera::HdiCommon::StreamConsumer> consumer_video =
206094332d3Sopenharmony_ci        std::make_shared<OHOS::Camera::HdiCommon::StreamConsumer>();
207094332d3Sopenharmony_ci    infos->bufferQueue_ = consumer_video->CreateProducerSeq([this](void* addr, uint32_t size) {
208094332d3Sopenharmony_ci        DumpImageFile(streamIdVideo, "yuv", addr, size);
209094332d3Sopenharmony_ci    });
210094332d3Sopenharmony_ci    infos->bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
211094332d3Sopenharmony_ci    consumerMap_[StreamIntent::VIDEO] = consumer_video;
212094332d3Sopenharmony_ci}
213094332d3Sopenharmony_ci
214094332d3Sopenharmony_civoid HdiCommon::DefaultInfosAnalyze(std::shared_ptr<StreamInfo> &infos)
215094332d3Sopenharmony_ci{
216094332d3Sopenharmony_ci    infos->streamId_ = streamIdAnalyze;
217094332d3Sopenharmony_ci    infos->width_ = analyzeWidth;
218094332d3Sopenharmony_ci    infos->height_ = analyzeHeight;
219094332d3Sopenharmony_ci    infos->format_ = analyzeFormat;
220094332d3Sopenharmony_ci    infos->dataspace_ = UT_DATA_SIZE;
221094332d3Sopenharmony_ci    infos->intent_ = StreamIntent::ANALYZE;
222094332d3Sopenharmony_ci    infos->tunneledMode_ = UT_TUNNEL_MODE;
223094332d3Sopenharmony_ci
224094332d3Sopenharmony_ci    std::shared_ptr<OHOS::Camera::HdiCommon::StreamConsumer> consumer_analyze =
225094332d3Sopenharmony_ci        std::make_shared<OHOS::Camera::HdiCommon::StreamConsumer>();
226094332d3Sopenharmony_ci    infos->bufferQueue_ = consumer_analyze->CreateProducerSeq([this](void* addr, uint32_t size) {
227094332d3Sopenharmony_ci        common_metadata_header_t *data = static_cast<common_metadata_header_t *>(addr);
228094332d3Sopenharmony_ci        camera_metadata_item_t entry = {};
229094332d3Sopenharmony_ci
230094332d3Sopenharmony_ci        int ret = FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_IDS, &entry);
231094332d3Sopenharmony_ci        if (ret == 0) {
232094332d3Sopenharmony_ci            for (size_t i = 0; i < entry.count; i++) {
233094332d3Sopenharmony_ci                int id = entry.data.i32[i];
234094332d3Sopenharmony_ci                CAMERA_LOGI("Face ids : %{public}d", id);
235094332d3Sopenharmony_ci            }
236094332d3Sopenharmony_ci        }
237094332d3Sopenharmony_ci
238094332d3Sopenharmony_ci        ret = FindCameraMetadataItem(data, OHOS_STATISTICS_FACE_RECTANGLES, &entry);
239094332d3Sopenharmony_ci        if (ret == 0) {
240094332d3Sopenharmony_ci            for (size_t i = 0; i < entry.count; i++) {
241094332d3Sopenharmony_ci                int id = entry.data.i32[i];
242094332d3Sopenharmony_ci                CAMERA_LOGI("Face rectangles : %{public}d", id);
243094332d3Sopenharmony_ci            }
244094332d3Sopenharmony_ci        }
245094332d3Sopenharmony_ci    });
246094332d3Sopenharmony_ci    infos->bufferQueue_->producer_->SetQueueSize(UT_DATA_SIZE);
247094332d3Sopenharmony_ci    consumerMap_[StreamIntent::ANALYZE] = consumer_analyze;
248094332d3Sopenharmony_ci}
249094332d3Sopenharmony_ci
250094332d3Sopenharmony_civoid HdiCommon::StartStream(std::vector<StreamIntent> intents)
251094332d3Sopenharmony_ci{
252094332d3Sopenharmony_ci    streamOperatorCallback = new TestStreamOperatorCallback();
253094332d3Sopenharmony_ci    rc = cameraDevice->GetStreamOperator(streamOperatorCallback, streamOperator);
254094332d3Sopenharmony_ci    if (rc != HDI::Camera::V1_0::NO_ERROR) {
255094332d3Sopenharmony_ci        printf("GetStreamOperator fail, rc = %d\n", rc);
256094332d3Sopenharmony_ci        CAMERA_LOGE("GetStreamOperator fail, rc = %{public}d", rc);
257094332d3Sopenharmony_ci        return;
258094332d3Sopenharmony_ci    }
259094332d3Sopenharmony_ci    streamInfoPre = std::make_shared<StreamInfo>();
260094332d3Sopenharmony_ci    streamInfoVideo = std::make_shared<StreamInfo>();
261094332d3Sopenharmony_ci    streamInfoCapture = std::make_shared<StreamInfo>();
262094332d3Sopenharmony_ci    streamInfoAnalyze = std::make_shared<StreamInfo>();
263094332d3Sopenharmony_ci    for (auto& intent : intents) {
264094332d3Sopenharmony_ci        if (intent == StreamIntent::PREVIEW) {
265094332d3Sopenharmony_ci            DefaultInfosPreview(streamInfoPre);
266094332d3Sopenharmony_ci            streamInfos.push_back(*streamInfoPre);
267094332d3Sopenharmony_ci        } else if (intent == StreamIntent::VIDEO) {
268094332d3Sopenharmony_ci            DefaultInfosVideo(streamInfoVideo);
269094332d3Sopenharmony_ci            streamInfos.push_back(*streamInfoVideo);
270094332d3Sopenharmony_ci        } else if (intent == StreamIntent::ANALYZE) {
271094332d3Sopenharmony_ci            DefaultInfosAnalyze(streamInfoAnalyze);
272094332d3Sopenharmony_ci            streamInfos.push_back(*streamInfoAnalyze);
273094332d3Sopenharmony_ci        } else {
274094332d3Sopenharmony_ci            DefaultInfosCapture(streamInfoCapture);
275094332d3Sopenharmony_ci            streamInfos.push_back(*streamInfoCapture);
276094332d3Sopenharmony_ci        }
277094332d3Sopenharmony_ci    }
278094332d3Sopenharmony_ci
279094332d3Sopenharmony_ci    rc = streamOperator->CreateStreams(streamInfos);
280094332d3Sopenharmony_ci    if (rc != HDI::Camera::V1_0::NO_ERROR) {
281094332d3Sopenharmony_ci        printf("check StartStream: CreateStreams fail, rc = %d\n", rc);
282094332d3Sopenharmony_ci        CAMERA_LOGE("check StartStream: CreateStreams fail, rc = %{public}d", rc);
283094332d3Sopenharmony_ci    }
284094332d3Sopenharmony_ci    rc = streamOperator->CommitStreams(OperationMode::NORMAL, abilityVec);
285094332d3Sopenharmony_ci    if (rc != HDI::Camera::V1_0::NO_ERROR) {
286094332d3Sopenharmony_ci        printf("check StartStream: CommitStreams fail, rc = %d\n", rc);
287094332d3Sopenharmony_ci        CAMERA_LOGE("check StartStream: CommitStreams fail, rc = %{public}d", rc);
288094332d3Sopenharmony_ci    }
289094332d3Sopenharmony_ci    sleep(1);
290094332d3Sopenharmony_ci    std::vector<StreamInfo>().swap(streamInfos);
291094332d3Sopenharmony_ci}
292094332d3Sopenharmony_ci
293094332d3Sopenharmony_civoid HdiCommon::StartCapture(int streamId, int captureId, bool shutterCallback, bool isStreaming)
294094332d3Sopenharmony_ci{
295094332d3Sopenharmony_ci    captureInfo = std::make_shared<CaptureInfo>();
296094332d3Sopenharmony_ci    captureInfo->streamIds_ = {streamId};
297094332d3Sopenharmony_ci    captureInfo->captureSetting_ = abilityVec;
298094332d3Sopenharmony_ci    captureInfo->enableShutterCallback_ = shutterCallback;
299094332d3Sopenharmony_ci    rc = streamOperator->Capture(captureId, *captureInfo, isStreaming);
300094332d3Sopenharmony_ci    if (rc != HDI::Camera::V1_0::NO_ERROR) {
301094332d3Sopenharmony_ci        printf("check Capture: Capture fail, rc = %d\n", rc);
302094332d3Sopenharmony_ci        CAMERA_LOGE("check Capture: Capture fail, rc = %{public}d", rc);
303094332d3Sopenharmony_ci    }
304094332d3Sopenharmony_ci    sleep(UT_SLEEP_TIME);
305094332d3Sopenharmony_ci}
306094332d3Sopenharmony_ci
307094332d3Sopenharmony_civoid HdiCommon::StopStream(std::vector<int>& captureIds, std::vector<int>& streamIds)
308094332d3Sopenharmony_ci{
309094332d3Sopenharmony_ci    if (captureIds.size() > 0) {
310094332d3Sopenharmony_ci        for (auto &captureId : captureIds) {
311094332d3Sopenharmony_ci            rc = streamOperator->CancelCapture(captureId);
312094332d3Sopenharmony_ci            if (rc != HDI::Camera::V1_0::NO_ERROR) {
313094332d3Sopenharmony_ci                printf("check CancelCapture fail, rc = %d, captureId = %d\n", rc, captureId);
314094332d3Sopenharmony_ci                CAMERA_LOGE("check CancelCapture fail, rc = %{public}d, captureId = %{public}d", rc, captureId);
315094332d3Sopenharmony_ci            }
316094332d3Sopenharmony_ci        }
317094332d3Sopenharmony_ci    }
318094332d3Sopenharmony_ci    if (streamIds.size() > 0) {
319094332d3Sopenharmony_ci        rc = streamOperator->ReleaseStreams(streamIds);
320094332d3Sopenharmony_ci        if (rc != HDI::Camera::V1_0::NO_ERROR) {
321094332d3Sopenharmony_ci            printf("check Capture: ReleaseStreams fail, rc = %d\n", rc);
322094332d3Sopenharmony_ci            CAMERA_LOGE("check Capture: ReleaseStreams fail, rc = %{public}d", rc);
323094332d3Sopenharmony_ci        }
324094332d3Sopenharmony_ci    }
325094332d3Sopenharmony_ci}
326094332d3Sopenharmony_ci
327094332d3Sopenharmony_civoid HdiCommon::StreamConsumer::CalculateFps(int64_t timestamp, int32_t streamId)
328094332d3Sopenharmony_ci{
329094332d3Sopenharmony_ci    if (isFirstCalculateFps_) {
330094332d3Sopenharmony_ci        if ((timestamp - intervalTimestamp_) >= interval_) {
331094332d3Sopenharmony_ci            int64_t timeInterval = timestamp - intervalTimestamp_;
332094332d3Sopenharmony_ci            if (timeInterval != 0) {
333094332d3Sopenharmony_ci                float fps = (int64_t)(100000000000 * timestampCount_ / timeInterval) / 100.0;
334094332d3Sopenharmony_ci                CAMERA_LOGI("Calculate FPS success, streamId: %{public}d, Fps:%{public}f", streamId, fps);
335094332d3Sopenharmony_ci                interval_ = ONESECOND_OF_MICROSECOND_UNIT;
336094332d3Sopenharmony_ci            } else {
337094332d3Sopenharmony_ci                CAMERA_LOGE("Calculate FPS error timeInerval is 0");
338094332d3Sopenharmony_ci            }
339094332d3Sopenharmony_ci        }
340094332d3Sopenharmony_ci    } else {
341094332d3Sopenharmony_ci        intervalTimestamp_ = timestamp;
342094332d3Sopenharmony_ci        isFirstCalculateFps_ = true;
343094332d3Sopenharmony_ci    }
344094332d3Sopenharmony_ci    if ((timestamp - intervalTimestamp_) >= ONESECOND_OF_MICROSECOND_UNIT * UT_SECOND_TIMES) {
345094332d3Sopenharmony_ci        intervalTimestamp_ = timestamp;
346094332d3Sopenharmony_ci        timestampCount_ = 0;
347094332d3Sopenharmony_ci        interval_ = ONESECOND_OF_MICROSECOND_UNIT;
348094332d3Sopenharmony_ci    }
349094332d3Sopenharmony_ci    timestampCount_++;
350094332d3Sopenharmony_ci}
351094332d3Sopenharmony_ci
352094332d3Sopenharmony_ciOHOS::sptr<OHOS::IBufferProducer> HdiCommon::StreamConsumer::CreateProducer(
353094332d3Sopenharmony_ci    std::function<void(void*, uint32_t)> callback)
354094332d3Sopenharmony_ci{
355094332d3Sopenharmony_ci    consumer_ = OHOS::IConsumerSurface::Create();
356094332d3Sopenharmony_ci    if (consumer_ == nullptr) {
357094332d3Sopenharmony_ci        return nullptr;
358094332d3Sopenharmony_ci    }
359094332d3Sopenharmony_ci    sptr<IBufferConsumerListener> listener = new TestBufferConsumerListener();
360094332d3Sopenharmony_ci    consumer_->RegisterConsumerListener(listener);
361094332d3Sopenharmony_ci    auto producer = consumer_->GetProducer();
362094332d3Sopenharmony_ci    if (producer == nullptr) {
363094332d3Sopenharmony_ci        return nullptr;
364094332d3Sopenharmony_ci    }
365094332d3Sopenharmony_ci
366094332d3Sopenharmony_ci    callback_ = callback;
367094332d3Sopenharmony_ci    consumerThread_ = new std::thread([this, listener] {
368094332d3Sopenharmony_ci        int32_t flushFence = 0;
369094332d3Sopenharmony_ci        int64_t timestamp = 0;
370094332d3Sopenharmony_ci        OHOS::Rect damage;
371094332d3Sopenharmony_ci        TestBufferConsumerListener* checker = static_cast<TestBufferConsumerListener*>(listener.GetRefPtr());
372094332d3Sopenharmony_ci        while (running_ == true) {
373094332d3Sopenharmony_ci            OHOS::sptr<OHOS::SurfaceBuffer> buffer = nullptr;
374094332d3Sopenharmony_ci            if (checker->checkBufferAvailable()) {
375094332d3Sopenharmony_ci                consumer_->AcquireBuffer(buffer, flushFence, timestamp, damage);
376094332d3Sopenharmony_ci                if (buffer != nullptr) {
377094332d3Sopenharmony_ci                    void* addr = buffer->GetVirAddr();
378094332d3Sopenharmony_ci                    uint32_t size = buffer->GetSize();
379094332d3Sopenharmony_ci
380094332d3Sopenharmony_ci                    int32_t gotSize = 0;
381094332d3Sopenharmony_ci                    int32_t isKey = 0;
382094332d3Sopenharmony_ci                    int32_t streamId = 0;
383094332d3Sopenharmony_ci                    int32_t captureId = 0;
384094332d3Sopenharmony_ci                    buffer->GetExtraData()->ExtraGet(OHOS::Camera::dataSize, gotSize);
385094332d3Sopenharmony_ci                    buffer->GetExtraData()->ExtraGet(OHOS::Camera::isKeyFrame, isKey);
386094332d3Sopenharmony_ci                    buffer->GetExtraData()->ExtraGet(OHOS::Camera::timeStamp, timestamp);
387094332d3Sopenharmony_ci                    buffer->GetExtraData()->ExtraGet(OHOS::Camera::streamId, streamId);
388094332d3Sopenharmony_ci                    buffer->GetExtraData()->ExtraGet(OHOS::Camera::captureId, captureId);
389094332d3Sopenharmony_ci                    if (gotSize) {
390094332d3Sopenharmony_ci                        CalculateFps(timestamp, streamId);
391094332d3Sopenharmony_ci                        callback_(addr, gotSize);
392094332d3Sopenharmony_ci                    } else {
393094332d3Sopenharmony_ci                        callback_(addr, size);
394094332d3Sopenharmony_ci                    }
395094332d3Sopenharmony_ci
396094332d3Sopenharmony_ci                    consumer_->ReleaseBuffer(buffer, -1);
397094332d3Sopenharmony_ci                    shotCount_--;
398094332d3Sopenharmony_ci                    if (shotCount_ == 0) {
399094332d3Sopenharmony_ci                        std::unique_lock<std::mutex> l(l_);
400094332d3Sopenharmony_ci                        cv_.notify_one();
401094332d3Sopenharmony_ci                    }
402094332d3Sopenharmony_ci                }
403094332d3Sopenharmony_ci            }
404094332d3Sopenharmony_ci            if (running_ == false) {
405094332d3Sopenharmony_ci                break;
406094332d3Sopenharmony_ci            }
407094332d3Sopenharmony_ci            usleep(1);
408094332d3Sopenharmony_ci        }
409094332d3Sopenharmony_ci    });
410094332d3Sopenharmony_ci
411094332d3Sopenharmony_ci    return producer;
412094332d3Sopenharmony_ci}
413094332d3Sopenharmony_ci
414094332d3Sopenharmony_ciOHOS::sptr<BufferProducerSequenceable> HdiCommon::StreamConsumer::CreateProducerSeq(
415094332d3Sopenharmony_ci    std::function<void(void*, uint32_t)> callback)
416094332d3Sopenharmony_ci{
417094332d3Sopenharmony_ci    OHOS::sptr<OHOS::IBufferProducer> producer = CreateProducer(callback);
418094332d3Sopenharmony_ci    if (producer == nullptr) {
419094332d3Sopenharmony_ci        return nullptr;
420094332d3Sopenharmony_ci    }
421094332d3Sopenharmony_ci
422094332d3Sopenharmony_ci    return new BufferProducerSequenceable(producer);
423094332d3Sopenharmony_ci}
424094332d3Sopenharmony_ci
425094332d3Sopenharmony_ciint32_t HdiCommon::TestStreamOperatorCallback::OnCaptureStarted(
426094332d3Sopenharmony_ci    int32_t captureId, const std::vector<int32_t> &streamId)
427094332d3Sopenharmony_ci{
428094332d3Sopenharmony_ci    for (auto it : streamId) {
429094332d3Sopenharmony_ci        CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
430094332d3Sopenharmony_ci    }
431094332d3Sopenharmony_ci    return HDI::Camera::V1_0::NO_ERROR;
432094332d3Sopenharmony_ci}
433094332d3Sopenharmony_ci
434094332d3Sopenharmony_ciint32_t HdiCommon::TestStreamOperatorCallback::OnCaptureEnded(
435094332d3Sopenharmony_ci    int32_t captureId, const std::vector<CaptureEndedInfo> &infos)
436094332d3Sopenharmony_ci{
437094332d3Sopenharmony_ci    for (auto it : infos) {
438094332d3Sopenharmony_ci        CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, count: %{public}d", captureId, it.streamId_,
439094332d3Sopenharmony_ci            it.frameCount_);
440094332d3Sopenharmony_ci    }
441094332d3Sopenharmony_ci    return HDI::Camera::V1_0::NO_ERROR;
442094332d3Sopenharmony_ci}
443094332d3Sopenharmony_ci
444094332d3Sopenharmony_ciint32_t HdiCommon::TestStreamOperatorCallback::OnCaptureError(
445094332d3Sopenharmony_ci    int32_t captureId, const std::vector<CaptureErrorInfo> &infos)
446094332d3Sopenharmony_ci{
447094332d3Sopenharmony_ci    for (auto it : infos) {
448094332d3Sopenharmony_ci        CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d, error: %{public}d", captureId, it.streamId_,
449094332d3Sopenharmony_ci            it.error_);
450094332d3Sopenharmony_ci    }
451094332d3Sopenharmony_ci    return HDI::Camera::V1_0::NO_ERROR;
452094332d3Sopenharmony_ci}
453094332d3Sopenharmony_ci
454094332d3Sopenharmony_ciint32_t HdiCommon::TestStreamOperatorCallback::OnFrameShutter(int32_t captureId,
455094332d3Sopenharmony_ci    const std::vector<int32_t> &streamIds, uint64_t timestamp)
456094332d3Sopenharmony_ci{
457094332d3Sopenharmony_ci    (void)timestamp;
458094332d3Sopenharmony_ci    for (auto it : streamIds) {
459094332d3Sopenharmony_ci        CAMERA_LOGE("captureId: %{public}d, streamId: %{public}d", captureId, it);
460094332d3Sopenharmony_ci    }
461094332d3Sopenharmony_ci    return HDI::Camera::V1_0::NO_ERROR;
462094332d3Sopenharmony_ci}
463094332d3Sopenharmony_ci
464094332d3Sopenharmony_ciint32_t HdiCommon::DemoCameraDeviceCallback::OnError(ErrorType type, int32_t errorMsg)
465094332d3Sopenharmony_ci{
466094332d3Sopenharmony_ci    CAMERA_LOGE("type: %{public}d, errorMsg: %{public}d", type, errorMsg);
467094332d3Sopenharmony_ci    return HDI::Camera::V1_0::NO_ERROR;
468094332d3Sopenharmony_ci}
469094332d3Sopenharmony_ci
470094332d3Sopenharmony_ciint32_t HdiCommon::DemoCameraDeviceCallback::OnResult(uint64_t timestamp, const std::vector<uint8_t> &result)
471094332d3Sopenharmony_ci{
472094332d3Sopenharmony_ci    if (HdiCommon::resultCallback_) {
473094332d3Sopenharmony_ci        std::shared_ptr<CameraMetadata> resultMeta;
474094332d3Sopenharmony_ci        MetadataUtils::ConvertVecToMetadata(result, resultMeta);
475094332d3Sopenharmony_ci        HdiCommon::resultCallback_(timestamp, resultMeta);
476094332d3Sopenharmony_ci    }
477094332d3Sopenharmony_ci    return HDI::Camera::V1_0::NO_ERROR;
478094332d3Sopenharmony_ci}
479094332d3Sopenharmony_ci
480094332d3Sopenharmony_ciint32_t HdiCommon::TestCameraHostCallback::OnCameraStatus(const std::string& cameraId, CameraStatus status)
481094332d3Sopenharmony_ci{
482094332d3Sopenharmony_ci    CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), status);
483094332d3Sopenharmony_ci    return HDI::Camera::V1_0::NO_ERROR;
484094332d3Sopenharmony_ci}
485094332d3Sopenharmony_ci
486094332d3Sopenharmony_ciint32_t HdiCommon::TestCameraHostCallback::OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status)
487094332d3Sopenharmony_ci{
488094332d3Sopenharmony_ci    CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), status);
489094332d3Sopenharmony_ci    return HDI::Camera::V1_0::NO_ERROR;
490094332d3Sopenharmony_ci}
491094332d3Sopenharmony_ci
492094332d3Sopenharmony_ciint32_t HdiCommon::TestCameraHostCallback::OnCameraEvent(const std::string& cameraId, CameraEvent event)
493094332d3Sopenharmony_ci{
494094332d3Sopenharmony_ci    CAMERA_LOGE("cameraId: %{public}s, status: %{public}d", cameraId.c_str(), event);
495094332d3Sopenharmony_ci    return HDI::Camera::V1_0::NO_ERROR;
496094332d3Sopenharmony_ci}
497094332d3Sopenharmony_ci
498094332d3Sopenharmony_ci}
499