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