1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except 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 "dcamera_source_dev.h"
17 
18 #include "anonymous_string.h"
19 #include "dcamera_hisysevent_adapter.h"
20 #include "dcamera_hitrace_adapter.h"
21 #include "distributed_camera_constants.h"
22 #include "distributed_camera_errno.h"
23 #include "distributed_hardware_log.h"
24 
25 #include "dcamera_channel_info_cmd.h"
26 #include "dcamera_info_cmd.h"
27 #include "dcamera_provider_callback_impl.h"
28 #include "dcamera_source_controller.h"
29 #include "dcamera_source_input.h"
30 #include "dcamera_utils_tools.h"
31 
32 namespace OHOS {
33 namespace DistributedHardware {
DCameraSourceDev(std::string devId, std::string dhId, std::shared_ptr<ICameraStateListener>& stateLisener)34 DCameraSourceDev::DCameraSourceDev(std::string devId, std::string dhId,
35     std::shared_ptr<ICameraStateListener>& stateLisener) : devId_(devId), dhId_(dhId), stateListener_(stateLisener)
36 {
37     DHLOGI("DCameraSourceDev Construct devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
38         GetAnonyString(dhId_).c_str());
39     memberFuncMap_[DCAMERA_EVENT_REGIST] = &DCameraSourceDev::NotifyRegisterResult;
40     memberFuncMap_[DCAMERA_EVENT_UNREGIST] = &DCameraSourceDev::NotifyRegisterResult;
41     memberFuncMap_[DCAMERA_EVENT_OPEN] = &DCameraSourceDev::NotifyHalResult;
42     memberFuncMap_[DCAMERA_EVENT_CLOSE] = &DCameraSourceDev::NotifyHalResult;
43     memberFuncMap_[DCAMERA_EVENT_CONFIG_STREAMS] = &DCameraSourceDev::NotifyHalResult;
44     memberFuncMap_[DCAMERA_EVENT_RELEASE_STREAMS] = &DCameraSourceDev::NotifyHalResult;
45     memberFuncMap_[DCAMERA_EVENT_START_CAPTURE] = &DCameraSourceDev::NotifyHalResult;
46     memberFuncMap_[DCAMERA_EVENT_STOP_CAPTURE] = &DCameraSourceDev::NotifyHalResult;
47     memberFuncMap_[DCAMERA_EVENT_UPDATE_SETTINGS] = &DCameraSourceDev::NotifyHalResult;
48 
49     eventResultMap_[DCAMERA_EVENT_OPEN] = DCAMERA_EVENT_OPEN_CHANNEL_ERROR;
50     eventResultMap_[DCAMERA_EVENT_CLOSE] = DCAMERA_EVENT_CLOSE_CHANNEL_ERROR;
51     eventResultMap_[DCAMERA_EVENT_CONFIG_STREAMS] = DCAMERA_EVENT_CONFIG_STREAMS_ERROR;
52     eventResultMap_[DCAMERA_EVENT_RELEASE_STREAMS] = DCAMERA_EVENT_RELEASE_STREAMS_ERROR;
53     eventResultMap_[DCAMERA_EVENT_START_CAPTURE] = DCAMERA_EVENT_START_CAPTURE_ERROR;
54     eventResultMap_[DCAMERA_EVENT_STOP_CAPTURE] = DCAMERA_EVENT_STOP_CAPTURE_ERROR;
55     eventResultMap_[DCAMERA_EVENT_UPDATE_SETTINGS] = DCAMERA_EVENT_UPDATE_SETTINGS_ERROR;
56 }
57 
~DCameraSourceDev()58 DCameraSourceDev::~DCameraSourceDev()
59 {
60     DHLOGI("DCameraSourceDev Delete devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
61         GetAnonyString(dhId_).c_str());
62     srcDevEventHandler_ = nullptr;
63     hdiCallback_ = nullptr;
64     input_ = nullptr;
65     controller_ = nullptr;
66     stateMachine_ = nullptr;
67     stateListener_ = nullptr;
68 
69     eventResultMap_.clear();
70     memberFuncMap_.clear();
71     DHLOGI("DCameraSourceDev Delete devId %{public}s dhId %{public}s end", GetAnonyString(devId_).c_str(),
72         GetAnonyString(dhId_).c_str());
73 }
74 
InitDCameraSourceDev()75 int32_t DCameraSourceDev::InitDCameraSourceDev()
76 {
77     DHLOGI("DCameraSourceDev InitDCameraSourceDev devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
78         GetAnonyString(dhId_).c_str());
79     std::shared_ptr<AppExecFwk::EventRunner> runner = AppExecFwk::EventRunner::Create(true);
80     srcDevEventHandler_ = std::make_shared<DCameraSourceDev::DCameraSourceDevEventHandler>(
81         runner, shared_from_this());
82     auto cameraSourceDev = std::shared_ptr<DCameraSourceDev>(shared_from_this());
83     stateMachine_ = std::make_shared<DCameraSourceStateMachine>(cameraSourceDev);
84     stateMachine_->UpdateState(DCAMERA_STATE_INIT);
85     controller_ = std::make_shared<DCameraSourceController>(devId_, dhId_, stateMachine_, cameraSourceDev);
86     input_ = std::make_shared<DCameraSourceInput>(devId_, dhId_, cameraSourceDev);
87     hdiCallback_ = sptr<DCameraProviderCallbackImpl>(
88         new (std::nothrow) DCameraProviderCallbackImpl(devId_, dhId_, cameraSourceDev));
89     if (hdiCallback_ == nullptr) {
90         DHLOGE("DCameraSourceDev InitDCameraSourceDev failed, hdiCallback is null.");
91         return DCAMERA_BAD_VALUE;
92     }
93     DHLOGI("DCameraSourceDev InitDCameraSourceDev end devId %{public}s dhId %{public}s",
94         GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
95     return DCAMERA_OK;
96 }
97 
RegisterDistributedHardware(const std::string& devId, const std::string& dhId, const std::string& reqId, const EnableParam& param)98 int32_t DCameraSourceDev::RegisterDistributedHardware(const std::string& devId, const std::string& dhId,
99     const std::string& reqId, const EnableParam& param)
100 {
101     DHLOGI("DCameraSourceDev PostTask RegisterDistributedHardware devId %{public}s dhId %{public}s",
102         GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
103     version_ = param.sinkVersion;
104     if (version_ >= SEPARATE_SINK_VERSION) {
105         ManageSelectChannel::GetInstance().SetSrcConnect(true);
106     }
107     DCameraIndex index(devId, dhId);
108     actualDevInfo_.insert(index);
109 
110     std::shared_ptr<DCameraRegistParam> regParam = std::make_shared<DCameraRegistParam>(devId, dhId, reqId,
111         param.sinkAttrs, param.sourceAttrs);
112     DCameraSourceEvent event(DCAMERA_EVENT_REGIST, regParam);
113     std::shared_ptr<DCameraSourceEvent> eventParam = std::make_shared<DCameraSourceEvent>(event);
114     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
115     AppExecFwk::InnerEvent::Pointer msgEvent =
116         AppExecFwk::InnerEvent::Get(EVENT_SOURCE_DEV_PROCESS, eventParam, 0);
117     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
118     return DCAMERA_OK;
119 }
120 
UnRegisterDistributedHardware(const std::string devId, const std::string dhId, const std::string reqId)121 int32_t DCameraSourceDev::UnRegisterDistributedHardware(const std::string devId, const std::string dhId,
122     const std::string reqId)
123 {
124     DHLOGI("DCameraSourceDev PostTask UnRegisterDistributedHardware devId %{public}s dhId %{public}s",
125         GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
126     std::string sinkAttrs;
127     std::string sourceAttrs;
128     std::shared_ptr<DCameraRegistParam> regParam = std::make_shared<DCameraRegistParam>(devId, dhId, reqId, sinkAttrs,
129         sourceAttrs);
130     DCameraSourceEvent event(DCAMERA_EVENT_UNREGIST, regParam);
131     std::shared_ptr<DCameraSourceEvent> eventParam = std::make_shared<DCameraSourceEvent>(event);
132     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
133     AppExecFwk::InnerEvent::Pointer msgEvent =
134         AppExecFwk::InnerEvent::Get(EVENT_SOURCE_DEV_PROCESS, eventParam, 0);
135     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
136     return DCAMERA_OK;
137 }
138 
DCameraNotify(std::string& eventStr)139 int32_t DCameraSourceDev::DCameraNotify(std::string& eventStr)
140 {
141     DHLOGI("DCameraSourceDev PostTask DCameraNotify devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
142         GetAnonyString(dhId_).c_str());
143     DCameraEventCmd cmd;
144     int32_t ret = cmd.Unmarshal(eventStr);
145     if (ret != DCAMERA_OK) {
146         DHLOGE("DCameraSourceDev DCameraNotify devId %{public}s dhId %{public}s marshal failed, ret: %{public}d",
147             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), ret);
148         return ret;
149     }
150 
151     DCameraSourceEvent event(DCAMERA_EVENT_NOFIFY, cmd.value_);
152     std::shared_ptr<DCameraSourceEvent> eventParam = std::make_shared<DCameraSourceEvent>(event);
153     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
154     AppExecFwk::InnerEvent::Pointer msgEvent =
155         AppExecFwk::InnerEvent::Get(EVENT_SOURCE_DEV_PROCESS, eventParam, 0);
156     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
157     return DCAMERA_OK;
158 }
159 
OpenSession(DCameraIndex& camIndex)160 int32_t DCameraSourceDev::OpenSession(DCameraIndex& camIndex)
161 {
162     DHLOGI("DCameraSourceDev PostTask OpenSession devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
163         GetAnonyString(dhId_).c_str());
164     DCameraSourceEvent event(DCAMERA_EVENT_OPEN, camIndex);
165     std::shared_ptr<DCameraSourceEvent> eventParam = std::make_shared<DCameraSourceEvent>(event);
166     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
167     AppExecFwk::InnerEvent::Pointer msgEvent =
168         AppExecFwk::InnerEvent::Get(EVENT_SOURCE_DEV_PROCESS, eventParam, 0);
169     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
170     return DCAMERA_OK;
171 }
172 
CloseSession(DCameraIndex& camIndex)173 int32_t DCameraSourceDev::CloseSession(DCameraIndex& camIndex)
174 {
175     DHLOGI("DCameraSourceDev PostTask CloseSession devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
176         GetAnonyString(dhId_).c_str());
177     DCameraSourceEvent event(DCAMERA_EVENT_CLOSE, camIndex);
178     std::shared_ptr<DCameraSourceEvent> eventParam = std::make_shared<DCameraSourceEvent>(event);
179     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
180     AppExecFwk::InnerEvent::Pointer msgEvent =
181         AppExecFwk::InnerEvent::Get(EVENT_SOURCE_DEV_PROCESS, eventParam, 0);
182     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
183     return DCAMERA_OK;
184 }
185 
ConfigCameraStreams(const std::vector<std::shared_ptr<DCStreamInfo>>& streamInfos)186 int32_t DCameraSourceDev::ConfigCameraStreams(const std::vector<std::shared_ptr<DCStreamInfo>>& streamInfos)
187 {
188     DHLOGI("DCameraSourceDev PostTask ConfigStreams devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
189         GetAnonyString(dhId_).c_str());
190     DCameraSourceEvent event(DCAMERA_EVENT_CONFIG_STREAMS, streamInfos);
191     std::shared_ptr<DCameraSourceEvent> eventParam = std::make_shared<DCameraSourceEvent>(event);
192     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
193     AppExecFwk::InnerEvent::Pointer msgEvent =
194         AppExecFwk::InnerEvent::Get(EVENT_SOURCE_DEV_PROCESS, eventParam, 0);
195     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
196     return DCAMERA_OK;
197 }
198 
ReleaseCameraStreams(const std::vector<int>& streamIds)199 int32_t DCameraSourceDev::ReleaseCameraStreams(const std::vector<int>& streamIds)
200 {
201     DHLOGI("DCameraSourceDev PostTask ReleaseStreams devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
202         GetAnonyString(dhId_).c_str());
203     DCameraSourceEvent event(DCAMERA_EVENT_RELEASE_STREAMS, streamIds);
204     std::shared_ptr<DCameraSourceEvent> eventParam = std::make_shared<DCameraSourceEvent>(event);
205     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
206     AppExecFwk::InnerEvent::Pointer msgEvent =
207         AppExecFwk::InnerEvent::Get(EVENT_SOURCE_DEV_PROCESS, eventParam, 0);
208     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
209     return DCAMERA_OK;
210 }
211 
StartCameraCapture(const std::vector<std::shared_ptr<DCCaptureInfo>>& captureInfos)212 int32_t DCameraSourceDev::StartCameraCapture(const std::vector<std::shared_ptr<DCCaptureInfo>>& captureInfos)
213 {
214     DHLOGI("DCameraSourceDev PostTask StartCapture devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
215         GetAnonyString(dhId_).c_str());
216     DCameraSourceEvent event(DCAMERA_EVENT_START_CAPTURE, captureInfos);
217     std::shared_ptr<DCameraSourceEvent> eventParam = std::make_shared<DCameraSourceEvent>(event);
218     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
219     AppExecFwk::InnerEvent::Pointer msgEvent =
220         AppExecFwk::InnerEvent::Get(EVENT_SOURCE_DEV_PROCESS, eventParam, 0);
221     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
222     return DCAMERA_OK;
223 }
224 
StopCameraCapture(const std::vector<int>& streamIds)225 int32_t DCameraSourceDev::StopCameraCapture(const std::vector<int>& streamIds)
226 {
227     DHLOGI("DCameraSourceDev PostTask StopCapture devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
228         GetAnonyString(dhId_).c_str());
229     DCameraSourceEvent event(DCAMERA_EVENT_STOP_CAPTURE, streamIds);
230     std::shared_ptr<DCameraSourceEvent> eventParam = std::make_shared<DCameraSourceEvent>(event);
231     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
232     AppExecFwk::InnerEvent::Pointer msgEvent =
233         AppExecFwk::InnerEvent::Get(EVENT_SOURCE_DEV_PROCESS, eventParam, 0);
234     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
235     return DCAMERA_OK;
236 }
237 
UpdateCameraSettings(const std::vector<std::shared_ptr<DCameraSettings>>& settings)238 int32_t DCameraSourceDev::UpdateCameraSettings(const std::vector<std::shared_ptr<DCameraSettings>>& settings)
239 {
240     DHLOGI("DCameraSourceDev PostTask UpdateCameraSettings devId %{public}s dhId %{public}s",
241         GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
242     DCameraSourceEvent event(DCAMERA_EVENT_UPDATE_SETTINGS, settings);
243     std::shared_ptr<DCameraSourceEvent> eventParam = std::make_shared<DCameraSourceEvent>(event);
244     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
245     AppExecFwk::InnerEvent::Pointer msgEvent =
246         AppExecFwk::InnerEvent::Get(EVENT_SOURCE_DEV_PROCESS, eventParam, 0);
247     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
248     return DCAMERA_OK;
249 }
250 
ProcessHDFEvent(const DCameraHDFEvent& event)251 int32_t DCameraSourceDev::ProcessHDFEvent(const DCameraHDFEvent& event)
252 {
253     DHLOGI("DCameraSourceDev ProcessHDFEvent devId %{public}s dhId %{public}s event_type %{public}d",
254         GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), event.type_);
255     std::shared_ptr<DCameraSourceEvent> eventParam = std::make_shared<DCameraSourceEvent>(DCAMERA_EVENT_GET_FULLCAPS);
256     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
257     AppExecFwk::InnerEvent::Pointer msgEvent =
258         AppExecFwk::InnerEvent::Get(EVENT_PROCESS_HDF_NOTIFY, eventParam, 0);
259     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
260     return DCAMERA_OK;
261 }
262 
GetFullCaps()263 int32_t DCameraSourceDev::GetFullCaps()
264 {
265     DHLOGI("DCameraSourceDev GetFullCaps enter.");
266     if (stateListener_ == nullptr) {
267         DHLOGE("DCameraSourceDev DoSyncTrigger, stateListener_ is nullptr.");
268         return DCAMERA_BAD_VALUE;
269     }
270     stateListener_->OnDataSyncTrigger(devId_);
271     return DCAMERA_OK;
272 }
273 
DoHicollieProcess()274 void DCameraSourceDev::DoHicollieProcess()
275 {
276     SetHicollieFlag(true);
277 }
278 
DoProcessData(const AppExecFwk::InnerEvent::Pointer &event)279 void DCameraSourceDev::DoProcessData(const AppExecFwk::InnerEvent::Pointer &event)
280 {
281     std::shared_ptr<DCameraSourceEvent> eventParam = event->GetSharedObject<DCameraSourceEvent>();
282     CHECK_AND_RETURN_LOG(eventParam == nullptr, "eventParam is nullptr.");
283     CHECK_AND_RETURN_LOG(stateMachine_ == nullptr, "stateMachine_ is nullptr.");
284     int32_t ret = stateMachine_->Execute((*eventParam).GetEventType(), (*eventParam));
285     if (ret != DCAMERA_OK) {
286         DHLOGE("DCameraSourceDev Execute failed, ret: %{public}d, devId: %{public}s dhId: %{public}s", ret,
287             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
288     }
289     NotifyResult((*eventParam).GetEventType(), (*eventParam), ret);
290 }
291 
DoProcesHDFEvent(const AppExecFwk::InnerEvent::Pointer &event)292 void DCameraSourceDev::DoProcesHDFEvent(const AppExecFwk::InnerEvent::Pointer &event)
293 {
294     std::shared_ptr<DCameraSourceEvent> eventParam = event->GetSharedObject<DCameraSourceEvent>();
295     CHECK_AND_RETURN_LOG(eventParam == nullptr, "eventParam is nullptr.");
296     CHECK_AND_RETURN_LOG(stateMachine_ == nullptr, "stateMachine_ is nullptr.");
297     int32_t ret = stateMachine_->Execute((*eventParam).GetEventType(), (*eventParam));
298     if (ret != DCAMERA_OK) {
299         DHLOGE("DCameraSourceDev Execute failed, ret: %{public}d, devId: %{public}s dhId: %{public}s", ret,
300             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
301     }
302 }
303 
DCameraSourceDevEventHandler( const std::shared_ptr<AppExecFwk::EventRunner> &runner, std::shared_ptr<DCameraSourceDev> srcDevPtr)304 DCameraSourceDev::DCameraSourceDevEventHandler::DCameraSourceDevEventHandler(
305     const std::shared_ptr<AppExecFwk::EventRunner> &runner, std::shared_ptr<DCameraSourceDev> srcDevPtr)
306     : AppExecFwk::EventHandler(runner), srcDevPtrWPtr_(srcDevPtr)
307 {
308     DHLOGI("Ctor DCameraSourceDevEventHandler.");
309 }
310 
ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)311 void DCameraSourceDev::DCameraSourceDevEventHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
312 {
313     CHECK_AND_RETURN_LOG(event == nullptr, "event is nullptr.");
314     uint32_t eventId = event->GetInnerEventId();
315     auto srcDevPtr = srcDevPtrWPtr_.lock();
316     if (srcDevPtr == nullptr) {
317         DHLOGE("Can not get strong self ptr");
318         return;
319     }
320     switch (eventId) {
321         case EVENT_HICOLLIE:
322             srcDevPtr->DoHicollieProcess();
323             break;
324         case EVENT_SOURCE_DEV_PROCESS:
325             srcDevPtr->DoProcessData(event);
326             break;
327         case EVENT_PROCESS_HDF_NOTIFY:
328             srcDevPtr->DoProcesHDFEvent(event);
329             break;
330         default:
331             DHLOGE("event is undefined, id is %d", eventId);
332             break;
333     }
334 }
335 
Register(std::shared_ptr<DCameraRegistParam>& param)336 int32_t DCameraSourceDev::Register(std::shared_ptr<DCameraRegistParam>& param)
337 {
338     DCAMERA_SYNC_TRACE(DCAMERA_REGISTER_CAMERA);
339     DHLOGI("DCameraSourceDev Execute Register devId: %{public}s dhId: %{public}s",
340         GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
341     ReportRegisterCameraEvent(REGIST_CAMERA_EVENT, GetAnonyString(devId_), dhId_,
342         version_, "execute register event.");
343     std::vector<DCameraIndex> actualDevInfo;
344     actualDevInfo.assign(actualDevInfo_.begin(), actualDevInfo_.end());
345     int32_t ret = controller_->Init(actualDevInfo);
346     if (ret != DCAMERA_OK) {
347         DHLOGE("DCameraSourceDev Execute Register controller init failed, ret: %{public}d, devId: %{public}s dhId: "
348             "%{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
349         return ret;
350     }
351 
352     ret = input_->Init();
353     if (ret != DCAMERA_OK) {
354         DHLOGE("DCameraSourceDev Execute Register input init failed, ret: %{public}d, devId: %{public}s dhId: "
355             "%{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
356         controller_->UnInit();
357         return ret;
358     }
359 
360     sptr<IDCameraProvider> camHdiProvider = IDCameraProvider::Get(HDF_DCAMERA_EXT_SERVICE);
361     if (camHdiProvider == nullptr) {
362         DHLOGI("Register camHdiProvider is nullptr devId: %{public}s dhId: %{public}s", GetAnonyString(devId_).c_str(),
363             GetAnonyString(dhId_).c_str());
364         controller_->UnInit();
365         input_->UnInit();
366         return DCAMERA_BAD_OPERATE;
367     }
368     DHBase dhBase;
369     dhBase.deviceId_ = param->devId_;
370     dhBase.dhId_ = param->dhId_;
371     std::string ability;
372     ret = ParseEnableParam(param, ability);
373     if (ret != DCAMERA_OK) {
374         DHLOGE("Parsing param failed.");
375     }
376     int32_t retHdi = camHdiProvider->EnableDCameraDevice(dhBase, ability, hdiCallback_);
377     DHLOGI("DCameraSourceDev Execute Register register hal, ret: %{public}d, devId: %{public}s dhId: %{public}s",
378         retHdi, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
379     if (retHdi != SUCCESS) {
380         controller_->UnInit();
381         input_->UnInit();
382         return DCAMERA_REGIST_HAL_FAILED;
383     }
384     return DCAMERA_OK;
385 }
386 
ParseEnableParam(std::shared_ptr<DCameraRegistParam>& param, std::string& ability)387 int32_t DCameraSourceDev::ParseEnableParam(std::shared_ptr<DCameraRegistParam>& param, std::string& ability)
388 {
389     cJSON *sinkRootValue = cJSON_Parse(param->sinkParam_.c_str());
390     if (sinkRootValue == nullptr) {
391         DHLOGE("Input sink ablity info is not json object.");
392         return DCAMERA_INIT_ERR;
393     }
394 
395     cJSON *srcRootValue = cJSON_Parse(param->srcParam_.c_str());
396     if (srcRootValue == nullptr) {
397         DHLOGE("Input source ablity info is not json object.");
398         cJSON_Delete(sinkRootValue);
399         return DCAMERA_INIT_ERR;
400     }
401 
402     cJSON *abilityRootValue = cJSON_CreateObject();
403     if (abilityRootValue == nullptr) {
404         cJSON_Delete(sinkRootValue);
405         cJSON_Delete(srcRootValue);
406         return DCAMERA_BAD_VALUE;
407     }
408     cJSON_AddItemToObject(abilityRootValue, "SinkAbility", sinkRootValue);
409     cJSON_AddItemToObject(abilityRootValue, "SourceCodec", srcRootValue);
410     char *jsonstr = cJSON_Print(abilityRootValue);
411     if (jsonstr == nullptr) {
412         cJSON_Delete(abilityRootValue);
413         return DCAMERA_BAD_VALUE;
414     }
415     ability = jsonstr;
416     cJSON_Delete(abilityRootValue);
417     cJSON_free(jsonstr);
418     return DCAMERA_OK;
419 }
420 
UnRegister(std::shared_ptr<DCameraRegistParam>& param)421 int32_t DCameraSourceDev::UnRegister(std::shared_ptr<DCameraRegistParam>& param)
422 {
423     DCAMERA_SYNC_TRACE(DCAMERA_UNREGISTER_CAMERA);
424     DHLOGI("DCameraSourceDev Execute UnRegister devId: %{public}s dhId: %{public}s", GetAnonyString(devId_).c_str(),
425         GetAnonyString(dhId_).c_str());
426     ReportRegisterCameraEvent(UNREGIST_CAMERA_EVENT, GetAnonyString(devId_), dhId_,
427         version_, "execute unregister event.");
428     int32_t ret = controller_->UnInit();
429     if (ret != DCAMERA_OK) {
430         DHLOGE("DCameraSourceDev Execute UnRegister controller uninit failed, ret: %{public}d, devId: %{public}s "
431             "dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
432     }
433 
434     ret = input_->UnInit();
435     if (ret != DCAMERA_OK) {
436         DHLOGE("DCameraSourceDev Execute UnRegister input uninit failed, ret: %{public}d, devId: %{public}s dhId: "
437             "%{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
438     }
439 
440     sptr<IDCameraProvider> camHdiProvider = IDCameraProvider::Get(HDF_DCAMERA_EXT_SERVICE);
441     if (camHdiProvider == nullptr) {
442         DHLOGI("UnRegister camHdiProvider is nullptr devId: %{public}s dhId: %{public}s",
443             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
444         return DCAMERA_BAD_OPERATE;
445     }
446 
447     DHBase dhBase;
448     dhBase.deviceId_ = param->devId_;
449     dhBase.dhId_ = param->dhId_;
450     int32_t retHdi = camHdiProvider->DisableDCameraDevice(dhBase);
451     DHLOGI("DCameraSourceDev Execute UnRegister unregister hal, ret: %{public}d, devId: %{public}s dhId: %{public}s",
452         retHdi, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
453     if (retHdi != SUCCESS) {
454         return DCAMERA_UNREGIST_HAL_FAILED;
455     }
456     return DCAMERA_OK;
457 }
458 
OpenCamera()459 int32_t DCameraSourceDev::OpenCamera()
460 {
461     DHLOGI("DCameraSourceDev Execute OpenCamera devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
462         GetAnonyString(dhId_).c_str());
463     ReportCameraOperaterEvent(OPEN_CAMERA_EVENT, GetAnonyString(devId_), dhId_, "execute open camera event.");
464     std::shared_ptr<DCameraOpenInfo> openInfo = std::make_shared<DCameraOpenInfo>();
465     int32_t ret = GetLocalDeviceNetworkId(openInfo->sourceDevId_);
466     if (ret != DCAMERA_OK) {
467         DHLOGE("DCameraSourceDev getMyId failed ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
468             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
469         return ret;
470     }
471 
472     DcameraStartAsyncTrace(DCAMERA_OPEN_CHANNEL_CONTROL, DCAMERA_OPEN_CHANNEL_TASKID);
473     ret = controller_->OpenChannel(openInfo);
474     if (ret != DCAMERA_OK) {
475         DHLOGE("DCameraSourceDev Execute OpenCamera OpenChannel failed, ret: %{public}d, devId: %{public}s dhId: "
476             "%{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
477         DcameraFinishAsyncTrace(DCAMERA_OPEN_CHANNEL_CONTROL, DCAMERA_OPEN_CHANNEL_TASKID);
478         return DCAMERA_OPEN_CONFLICT;
479     }
480     CHECK_AND_RETURN_RET_LOG(stateListener_ == nullptr, DCAMERA_BAD_VALUE, "stateListener_ is nullptr.");
481     stateListener_->OnHardwareStateChanged(devId_, dhId_, DcameraBusinessState::RUNNING);
482     return DCAMERA_OK;
483 }
484 
CloseCamera()485 int32_t DCameraSourceDev::CloseCamera()
486 {
487     DHLOGI("DCameraSourceDev Execute CloseCamera devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
488         GetAnonyString(dhId_).c_str());
489     ReportCameraOperaterEvent(CLOSE_CAMERA_EVENT, GetAnonyString(devId_), dhId_, "execute close camera event.");
490     int32_t ret = input_->CloseChannel();
491     if (ret != DCAMERA_OK) {
492         DHLOGE("DCameraSourceDev Execute CloseCamera input CloseChannel failed, ret: %{public}d, devId: %{public}s "
493             "dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
494     }
495     ret = controller_->CloseChannel();
496     if (ret != DCAMERA_OK) {
497         DHLOGE("DCameraSourceDev Execute CloseCamera controller CloseChannel failed, ret: %{public}d, devId: "
498             "%{public}s dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
499     }
500     CHECK_AND_RETURN_RET_LOG(stateListener_ == nullptr, DCAMERA_BAD_VALUE, "stateListener_ is nullptr.");
501     stateListener_->OnHardwareStateChanged(devId_, dhId_, DcameraBusinessState::IDLE);
502     return DCAMERA_OK;
503 }
504 
ConfigStreams(std::vector<std::shared_ptr<DCStreamInfo>>& streamInfos)505 int32_t DCameraSourceDev::ConfigStreams(std::vector<std::shared_ptr<DCStreamInfo>>& streamInfos)
506 {
507     DHLOGI("DCameraSourceDev Execute ConfigStreams devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
508         GetAnonyString(dhId_).c_str());
509     for (auto info : streamInfos) {
510         sceneMode_ = info->mode_;
511         break;
512     }
513     int32_t ret = input_->ConfigStreams(streamInfos);
514     if (ret != DCAMERA_OK) {
515         DHLOGE("DCameraSourceDev Execute ConfigStreams ConfigStreams failed, ret: %{public}d, devId: %{public}s dhId: "
516             "%{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
517         return ret;
518     }
519 
520     std::shared_ptr<DCameraChannelInfo> chanInfo = std::make_shared<DCameraChannelInfo>();
521     ret = GetLocalDeviceNetworkId(chanInfo->sourceDevId_);
522     if (ret != DCAMERA_OK) {
523         DHLOGE("DCameraSourceDev getLocalNetworkId failed ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
524             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
525         return ret;
526     }
527     DCameraChannelDetail continueChInfo(CONTINUE_SESSION_FLAG, CONTINUOUS_FRAME);
528     DCameraChannelDetail snapShotChInfo(SNAP_SHOT_SESSION_FLAG, SNAPSHOT_FRAME);
529     chanInfo->detail_.push_back(continueChInfo);
530     chanInfo->detail_.push_back(snapShotChInfo);
531 
532     ret = controller_->ChannelNeg(chanInfo);
533     if (ret != DCAMERA_OK) {
534         DHLOGE("DCameraSourceDev ChannelNeg failed ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
535             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
536         return ret;
537     }
538 
539     std::vector<DCameraIndex> actualDevInfo;
540     actualDevInfo.assign(actualDevInfo_.begin(), actualDevInfo_.end());
541     ret = input_->OpenChannel(actualDevInfo);
542     if (ret != DCAMERA_OK) {
543         DHLOGE("DCameraSourceDev ChannelNeg OpenChannel failed ret: %{public}d, devId: %{public}s, dhId: %{public}s",
544             ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
545         return ret;
546     }
547     return DCAMERA_OK;
548 }
549 
ReleaseStreams(std::vector<int>& streamIds, bool& isAllRelease)550 int32_t DCameraSourceDev::ReleaseStreams(std::vector<int>& streamIds, bool& isAllRelease)
551 {
552     DHLOGI("DCameraSourceDev Execute ReleaseStreams devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
553         GetAnonyString(dhId_).c_str());
554     int32_t ret = input_->ReleaseStreams(streamIds, isAllRelease);
555     if (ret != DCAMERA_OK) {
556         DHLOGE("DCameraSourceDev Execute ReleaseStreams failed ret: %{public}d, devId: %{public}s, dhId: %{public}s",
557             ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
558         return ret;
559     }
560     return DCAMERA_OK;
561 }
562 
ReleaseAllStreams()563 int32_t DCameraSourceDev::ReleaseAllStreams()
564 {
565     DHLOGI("DCameraSourceDev Execute ReleaseAllStreams devId %{public}s dhId %{public}s",
566         GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
567     int32_t ret = input_->ReleaseAllStreams();
568     if (ret != DCAMERA_OK) {
569         DHLOGE("DCameraSourceDev Execute ReleaseAllStreams failed ret: %{public}d, devId: %{public}s, "
570             "dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
571         return ret;
572     }
573     return DCAMERA_OK;
574 }
575 
StartCapture(std::vector<std::shared_ptr<DCCaptureInfo>>& captureInfos)576 int32_t DCameraSourceDev::StartCapture(std::vector<std::shared_ptr<DCCaptureInfo>>& captureInfos)
577 {
578     HitraceAndHisyseventImpl(captureInfos);
579     DHLOGI("DCameraSourceDev Execute StartCapture devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
580         GetAnonyString(dhId_).c_str());
581     int32_t ret = input_->StartCapture(captureInfos);
582     if (ret != DCAMERA_OK) {
583         DHLOGE("DCameraSourceDev input StartCapture failed ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
584             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
585         DcameraFinishAsyncTrace(DCAMERA_CONTINUE_FIRST_FRAME, DCAMERA_CONTINUE_FIRST_FRAME_TASKID);
586         DcameraFinishAsyncTrace(DCAMERA_SNAPSHOT_FIRST_FRAME, DCAMERA_SNAPSHOT_FIRST_FRAME_TASKID);
587         return ret;
588     }
589     std::vector<std::shared_ptr<DCameraCaptureInfo>> captures;
590     for (auto iter = captureInfos.begin(); iter != captureInfos.end(); iter++) {
591         std::shared_ptr<DCameraCaptureInfo> capture = std::make_shared<DCameraCaptureInfo>();
592         capture->width_ = (*iter)->width_;
593         capture->height_ = (*iter)->height_;
594         capture->format_ = (*iter)->format_;
595         capture->dataspace_ = (*iter)->dataspace_;
596         capture->isCapture_ = (*iter)->isCapture_;
597         capture->encodeType_ = (*iter)->encodeType_;
598         capture->streamType_ = (*iter)->type_;
599         DHLOGI("StartCapture devId %{public}s dhId %{public}s settings size: %{public}zu w: %{public}d h: %{public}d "
600             "fmt: %{public}d isC: %{public}d enc: %{public}d streamT: %{public}d",
601             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), (*iter)->captureSettings_.size(),
602             capture->width_, capture->height_, capture->format_, capture->isCapture_ ? 1 : 0, capture->encodeType_,
603             capture->streamType_);
604         for (auto settingIter = (*iter)->captureSettings_.begin(); settingIter != (*iter)->captureSettings_.end();
605             settingIter++) {
606             std::shared_ptr<DCameraSettings> setting = std::make_shared<DCameraSettings>();
607             setting->type_ = settingIter->type_;
608             setting->value_ = settingIter->value_;
609             capture->captureSettings_.push_back(setting);
610         }
611         captures.push_back(capture);
612     }
613 
614     DHLOGI("startcapture sceneMode_: %{public}d", sceneMode_);
615     ret = controller_->StartCapture(captures, sceneMode_);
616     if (ret != DCAMERA_OK) {
617         DHLOGE("DCameraSourceDev Execute StartCapture StartCapture failed, ret: %{public}d, devId: %{public}s dhId: "
618             "%{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
619         DcameraFinishAsyncTrace(DCAMERA_CONTINUE_FIRST_FRAME, DCAMERA_CONTINUE_FIRST_FRAME_TASKID);
620         DcameraFinishAsyncTrace(DCAMERA_SNAPSHOT_FIRST_FRAME, DCAMERA_SNAPSHOT_FIRST_FRAME_TASKID);
621     }
622     return ret;
623 }
624 
HitraceAndHisyseventImpl(std::vector<std::shared_ptr<DCCaptureInfo>>& captureInfos)625 void DCameraSourceDev::HitraceAndHisyseventImpl(std::vector<std::shared_ptr<DCCaptureInfo>>& captureInfos)
626 {
627     for (auto iter = captureInfos.begin(); iter != captureInfos.end(); iter++) {
628         std::shared_ptr<DCCaptureInfo> capture = *iter;
629         EventCaptureInfo eventCaptureInfo = {
630             .width_ = capture->width_,
631             .height_ = capture->height_,
632             .format_ = capture->format_,
633             .isCapture_ = capture->isCapture_,
634             .encodeType_ = capture->encodeType_,
635             .type_ = capture->type_,
636         };
637         ReportStartCaptureEvent(START_CAPTURE_EVENT, eventCaptureInfo, "execute start capture event.");
638         if (capture->type_ == CONTINUOUS_FRAME && capture->isCapture_ == true) {
639             DcameraStartAsyncTrace(DCAMERA_CONTINUE_FIRST_FRAME, DCAMERA_CONTINUE_FIRST_FRAME_TASKID);
640         } else if (capture->type_ == SNAPSHOT_FRAME && capture->isCapture_ == true) {
641             DcameraStartAsyncTrace(DCAMERA_SNAPSHOT_FIRST_FRAME, DCAMERA_SNAPSHOT_FIRST_FRAME_TASKID);
642         }
643     }
644 }
645 
StopCapture(std::vector<int>& streamIds, bool& isAllStop)646 int32_t DCameraSourceDev::StopCapture(std::vector<int>& streamIds, bool& isAllStop)
647 {
648     DHLOGI("DCameraSourceDev Execute StopCapture devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
649         GetAnonyString(dhId_).c_str());
650     int32_t ret = input_->StopCapture(streamIds, isAllStop);
651     if (ret != DCAMERA_OK) {
652         DHLOGE("DCameraSourceDev Execute StopCapture input StopCapture failed, ret: %{public}d, devId: %{public}s "
653             "dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
654     }
655     if (isAllStop) {
656         ret = controller_->StopCapture();
657         if (ret != DCAMERA_OK) {
658             DHLOGE("DCameraSourceDev Execute StopCapture controller StopCapture failed, ret: %{public}d, devId: "
659                 "%{public}s dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
660         }
661     }
662     return DCAMERA_OK;
663 }
664 
StopAllCapture()665 int32_t DCameraSourceDev::StopAllCapture()
666 {
667     DHLOGI("DCameraSourceDev Execute StopAllCapture devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
668         GetAnonyString(dhId_).c_str());
669     int32_t ret = input_->StopAllCapture();
670     if (ret != DCAMERA_OK) {
671         DHLOGE("DCameraSourceDev Execute StopAllCapture input StopAllCapture failed, ret: %{public}d, devId: "
672             "%{public}s dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
673     }
674     ret = controller_->StopCapture();
675     if (ret != DCAMERA_OK) {
676         DHLOGE("DCameraSourceDev Execute StopAllCapture controller StopAllCapture failed, ret: %{public}d, devId: "
677             "%{public}s dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
678     }
679     return DCAMERA_OK;
680 }
681 
UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>>& settings)682 int32_t DCameraSourceDev::UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>>& settings)
683 {
684     DHLOGI("DCameraSourceDev Execute UpdateSettings devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
685         GetAnonyString(dhId_).c_str());
686     int32_t ret = input_->UpdateSettings(settings);
687     if (ret != DCAMERA_OK) {
688         DHLOGE("DCameraSourceDev Execute UpdateSettings input UpdateSettings failed, ret: %{public}d, devId: "
689             "%{public}s dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
690         return ret;
691     }
692     ret = controller_->UpdateSettings(settings);
693     if (ret != DCAMERA_OK) {
694         DHLOGE("DCameraSourceDev Execute UpdateSettings controller UpdateSettings failed, ret: %{public}d, "
695             "devId: %{public}s dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
696         return ret;
697     }
698     return DCAMERA_OK;
699 }
700 
CameraEventNotify(std::shared_ptr<DCameraEvent>& events)701 int32_t DCameraSourceDev::CameraEventNotify(std::shared_ptr<DCameraEvent>& events)
702 {
703     DHLOGI("DCameraSourceDev Execute CameraEventNotify devId %{public}s dhId %{public}s",
704         GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
705     int32_t ret = controller_->DCameraNotify(events);
706     if (ret != DCAMERA_OK) {
707         DHLOGE("DCameraSourceDev Execute CameraEventNotify DCameraNotify failed, ret: %{public}d, devId: %{public}s "
708             "dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
709         return ret;
710     }
711     return DCAMERA_OK;
712 }
713 
NotifyResult(DCAMERA_EVENT eventType, DCameraSourceEvent& event, int32_t result)714 void DCameraSourceDev::NotifyResult(DCAMERA_EVENT eventType, DCameraSourceEvent& event, int32_t result)
715 {
716     DHLOGI("Notify func map, execute %{public}d notify", eventType);
717     switch (eventType) {
718         case DCAMERA_EVENT_REGIST:
719         case DCAMERA_EVENT_UNREGIST:
720             NotifyRegisterResult(eventType, event, result);
721             break;
722         case DCAMERA_EVENT_OPEN:
723         case DCAMERA_EVENT_CLOSE:
724         case DCAMERA_EVENT_CONFIG_STREAMS:
725         case DCAMERA_EVENT_RELEASE_STREAMS:
726         case DCAMERA_EVENT_START_CAPTURE:
727         case DCAMERA_EVENT_STOP_CAPTURE:
728         case DCAMERA_EVENT_UPDATE_SETTINGS:
729             NotifyHalResult(eventType, event, result);
730             break;
731         default:
732             DHLOGE("Notify func map not find, execute %{public}d notify, devId: %{public}s dhId: %{public}s", eventType,
733                 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
734             break;
735     }
736 }
737 
NotifyRegisterResult(DCAMERA_EVENT eventType, DCameraSourceEvent& event, int32_t result)738 void DCameraSourceDev::NotifyRegisterResult(DCAMERA_EVENT eventType, DCameraSourceEvent& event, int32_t result)
739 {
740     std::string data = "";
741     std::shared_ptr<DCameraRegistParam> param;
742     int32_t ret = event.GetDCameraRegistParam(param);
743     if (ret != DCAMERA_OK) {
744         return;
745     }
746 
747     if (stateListener_ == nullptr) {
748         DHLOGE("DCameraSourceDev can not get listener");
749         return;
750     }
751     if (eventType == DCAMERA_EVENT_REGIST) {
752         stateListener_->OnRegisterNotify(param->devId_, param->dhId_, param->reqId_, result, data);
753     } else {
754         stateListener_->OnUnregisterNotify(param->devId_, param->dhId_, param->reqId_, result, data);
755     }
756 }
757 
NotifyHalResult(DCAMERA_EVENT eventType, DCameraSourceEvent& event, int32_t result)758 void DCameraSourceDev::NotifyHalResult(DCAMERA_EVENT eventType, DCameraSourceEvent& event, int32_t result)
759 {
760     DHLOGI("DCameraSourceDev NotifyHalResult eventType: %{public}d, result: %{public}d devId: %{public}s dhId: "
761         "%{public}s", eventType, result, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
762     if (result == DCAMERA_OK) {
763         return;
764     }
765 
766     std::shared_ptr<DCameraEvent> events = std::make_shared<DCameraEvent>();
767     events->eventType_ = DCAMERA_OPERATION;
768     auto iter = eventResultMap_.find(eventType);
769     if (iter == eventResultMap_.end()) {
770         return;
771     }
772     events->eventResult_ = iter->second;
773     CameraEventNotify(events);
774     return;
775 }
776 
GetStateInfo()777 int32_t DCameraSourceDev::GetStateInfo()
778 {
779     DHLOGI("GetStateInfo In state %{public}d", stateMachine_->GetCameraState());
780     return stateMachine_->GetCameraState();
781 }
782 
GetVersion()783 std::string DCameraSourceDev::GetVersion()
784 {
785     return version_;
786 }
787 
OnChannelConnectedEvent()788 int32_t DCameraSourceDev::OnChannelConnectedEvent()
789 {
790     std::shared_ptr<DCameraEvent> camEvent = std::make_shared<DCameraEvent>();
791     camEvent->eventType_ = DCAMERA_MESSAGE;
792     camEvent->eventResult_ = DCAMERA_EVENT_CHANNEL_CONNECTED;
793     DCameraSourceEvent event(DCAMERA_EVENT_NOFIFY, camEvent);
794     std::shared_ptr<DCameraSourceEvent> eventParam = std::make_shared<DCameraSourceEvent>(event);
795     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
796     AppExecFwk::InnerEvent::Pointer msgEvent =
797         AppExecFwk::InnerEvent::Get(EVENT_SOURCE_DEV_PROCESS, eventParam, 0);
798     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
799     return DCAMERA_OK;
800 }
801 
OnChannelDisconnectedEvent()802 int32_t DCameraSourceDev::OnChannelDisconnectedEvent()
803 {
804     DCameraIndex camIndex(devId_, dhId_);
805     std::shared_ptr<DCameraIndex> index = std::make_shared<DCameraIndex>(camIndex);
806     DCameraSourceEvent event(DCAMERA_EVENT_CLOSE, camIndex);
807     std::shared_ptr<DCameraSourceEvent> eventParam = std::make_shared<DCameraSourceEvent>(event);
808     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
809     AppExecFwk::InnerEvent::Pointer msgEvent =
810         AppExecFwk::InnerEvent::Get(EVENT_SOURCE_DEV_PROCESS, eventParam, 0);
811     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
812     std::shared_ptr<DCameraEvent> camEvent = std::make_shared<DCameraEvent>();
813     camEvent->eventType_ = DCAMERA_MESSAGE;
814     camEvent->eventResult_ = DCAMERA_EVENT_CHANNEL_DISCONNECTED;
815     DCameraSourceEvent eventNotify(DCAMERA_EVENT_NOFIFY, camEvent);
816     eventParam = std::make_shared<DCameraSourceEvent>(eventNotify);
817     msgEvent = AppExecFwk::InnerEvent::Get(EVENT_SOURCE_DEV_PROCESS, eventParam, 0);
818     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
819     return DCAMERA_OK;
820 }
821 
PostHicollieEvent()822 int32_t DCameraSourceDev::PostHicollieEvent()
823 {
824     CHECK_AND_RETURN_RET_LOG(srcDevEventHandler_ == nullptr, DCAMERA_BAD_VALUE, "srcDevEventHandler_ is nullptr.");
825     AppExecFwk::InnerEvent::Pointer msgEvent = AppExecFwk::InnerEvent::Get(EVENT_HICOLLIE);
826     srcDevEventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
827     return DCAMERA_OK;
828 }
829 
SetHicollieFlag(bool flag)830 void DCameraSourceDev::SetHicollieFlag(bool flag)
831 {
832     hicollieFlag_.store(flag);
833 }
834 
GetHicollieFlag()835 bool DCameraSourceDev::GetHicollieFlag()
836 {
837     return hicollieFlag_.load();
838 }
839 } // namespace DistributedHardware
840 } // namespace OHOS
841