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