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