1 /*
2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "dcamera_source_dev.h"
17
18 #include "anonymous_string.h"
19 #include "dcamera_hisysevent_adapter.h"
20 #include "dcamera_hitrace_adapter.h"
21 #include "distributed_camera_constants.h"
22 #include "distributed_camera_errno.h"
23 #include "distributed_hardware_log.h"
24
25 #include "dcamera_channel_info_cmd.h"
26 #include "dcamera_info_cmd.h"
27 #include "dcamera_provider_callback_impl.h"
28 #include "dcamera_source_controller.h"
29 #include "dcamera_source_input.h"
30 #include "dcamera_utils_tools.h"
31
32 namespace OHOS {
33 namespace DistributedHardware {
DCameraSourceDev(std::string devId,std::string dhId,std::shared_ptr<ICameraStateListener> & stateLisener)34 DCameraSourceDev::DCameraSourceDev(std::string devId, std::string dhId,
35 std::shared_ptr<ICameraStateListener>& stateLisener) : devId_(devId), dhId_(dhId), stateListener_(stateLisener)
36 {
37 DHLOGI("DCameraSourceDev Construct devId %s dhId %s", GetAnonyString(devId_).c_str(),
38 GetAnonyString(dhId_).c_str());
39 memberFuncMap_[DCAMERA_EVENT_REGIST] = &DCameraSourceDev::NotifyRegisterResult;
40 memberFuncMap_[DCAMERA_EVENT_UNREGIST] = &DCameraSourceDev::NotifyRegisterResult;
41 memberFuncMap_[DCAMERA_EVENT_OPEN] = &DCameraSourceDev::NotifyHalResult;
42 memberFuncMap_[DCAMERA_EVENT_CLOSE] = &DCameraSourceDev::NotifyHalResult;
43 memberFuncMap_[DCAMERA_EVENT_CONFIG_STREAMS] = &DCameraSourceDev::NotifyHalResult;
44 memberFuncMap_[DCAMERA_EVENT_RELEASE_STREAMS] = &DCameraSourceDev::NotifyHalResult;
45 memberFuncMap_[DCAMERA_EVENT_START_CAPTURE] = &DCameraSourceDev::NotifyHalResult;
46 memberFuncMap_[DCAMERA_EVENT_STOP_CAPTURE] = &DCameraSourceDev::NotifyHalResult;
47 memberFuncMap_[DCAMERA_EVENT_UPDATE_SETTINGS] = &DCameraSourceDev::NotifyHalResult;
48
49 eventResultMap_[DCAMERA_EVENT_OPEN] = DCAMERA_EVENT_OPEN_CHANNEL_ERROR;
50 eventResultMap_[DCAMERA_EVENT_CLOSE] = DCAMERA_EVENT_CLOSE_CHANNEL_ERROR;
51 eventResultMap_[DCAMERA_EVENT_CONFIG_STREAMS] = DCAMERA_EVENT_CONFIG_STREAMS_ERROR;
52 eventResultMap_[DCAMERA_EVENT_RELEASE_STREAMS] = DCAMERA_EVENT_RELEASE_STREAMS_ERROR;
53 eventResultMap_[DCAMERA_EVENT_START_CAPTURE] = DCAMERA_EVENT_START_CAPTURE_ERROR;
54 eventResultMap_[DCAMERA_EVENT_STOP_CAPTURE] = DCAMERA_EVENT_STOP_CAPTURE_ERROR;
55 eventResultMap_[DCAMERA_EVENT_UPDATE_SETTINGS] = DCAMERA_EVENT_UPDATE_SETTINGS_ERROR;
56 }
57
~DCameraSourceDev()58 DCameraSourceDev::~DCameraSourceDev()
59 {
60 DHLOGI("DCameraSourceDev Delete devId %s dhId %s", GetAnonyString(devId_).c_str(),
61 GetAnonyString(dhId_).c_str());
62 eventBus_ = nullptr;
63 hdiCallback_ = nullptr;
64 input_ = nullptr;
65 controller_ = nullptr;
66 stateMachine_ = nullptr;
67 stateListener_ = nullptr;
68
69 eventResultMap_.clear();
70 memberFuncMap_.clear();
71 DHLOGI("DCameraSourceDev Delete devId %s dhId %s end", GetAnonyString(devId_).c_str(),
72 GetAnonyString(dhId_).c_str());
73 }
74
InitDCameraSourceDev()75 int32_t DCameraSourceDev::InitDCameraSourceDev()
76 {
77 DHLOGI("DCameraSourceDev InitDCameraSourceDev devId %s dhId %s", GetAnonyString(devId_).c_str(),
78 GetAnonyString(dhId_).c_str());
79 eventBus_ = std::make_shared<EventBus>("SrcDevHandler");
80 DCameraSourceEvent event(*this);
81 eventBus_->AddHandler<DCameraSourceEvent>(event.GetType(), *this);
82 auto cameraSourceDev = std::shared_ptr<DCameraSourceDev>(shared_from_this());
83 stateMachine_ = std::make_shared<DCameraSourceStateMachine>(cameraSourceDev);
84 stateMachine_->UpdateState(DCAMERA_STATE_INIT);
85 controller_ = std::make_shared<DCameraSourceController>(devId_, dhId_, stateMachine_, cameraSourceDev);
86 input_ = std::make_shared<DCameraSourceInput>(devId_, dhId_, cameraSourceDev);
87 hdiCallback_ = new (std::nothrow) DCameraProviderCallbackImpl(devId_, dhId_, cameraSourceDev);
88 if (hdiCallback_ == nullptr) {
89 DHLOGE("DCameraSourceDev InitDCameraSourceDev failed, hdiCallback is null.");
90 return DCAMERA_BAD_VALUE;
91 }
92 DHLOGI("DCameraSourceDev InitDCameraSourceDev end devId %s dhId %s", GetAnonyString(devId_).c_str(),
93 GetAnonyString(dhId_).c_str());
94 return DCAMERA_OK;
95 }
96
RegisterDistributedHardware(const std::string & devId,const std::string & dhId,const std::string & reqId,const EnableParam & param)97 int32_t DCameraSourceDev::RegisterDistributedHardware(const std::string& devId, const std::string& dhId,
98 const std::string& reqId, const EnableParam& param)
99 {
100 DHLOGI("DCameraSourceDev PostTask RegisterDistributedHardware devId %s dhId %s", GetAnonyString(devId).c_str(),
101 GetAnonyString(dhId).c_str());
102 version_ = param.sinkVersion;
103 DCameraIndex index(devId, dhId);
104 actualDevInfo_.insert(index);
105
106 std::shared_ptr<DCameraRegistParam> regParam = std::make_shared<DCameraRegistParam>(devId, dhId, reqId,
107 param.sinkAttrs, param.sourceAttrs);
108 DCameraSourceEvent event(*this, DCAMERA_EVENT_REGIST, regParam);
109 eventBus_->PostEvent<DCameraSourceEvent>(event);
110 return DCAMERA_OK;
111 }
112
UnRegisterDistributedHardware(const std::string devId,const std::string dhId,const std::string reqId)113 int32_t DCameraSourceDev::UnRegisterDistributedHardware(const std::string devId, const std::string dhId,
114 const std::string reqId)
115 {
116 DHLOGI("DCameraSourceDev PostTask UnRegisterDistributedHardware devId %s dhId %s", GetAnonyString(devId).c_str(),
117 GetAnonyString(dhId).c_str());
118 std::string sinkAttrs;
119 std::string sourceAttrs;
120 std::shared_ptr<DCameraRegistParam> regParam = std::make_shared<DCameraRegistParam>(devId, dhId, reqId, sinkAttrs,
121 sourceAttrs);
122 DCameraSourceEvent event(*this, DCAMERA_EVENT_UNREGIST, regParam);
123 eventBus_->PostEvent<DCameraSourceEvent>(event);
124 return DCAMERA_OK;
125 }
126
DCameraNotify(std::string & eventStr)127 int32_t DCameraSourceDev::DCameraNotify(std::string& eventStr)
128 {
129 DHLOGI("DCameraSourceDev PostTask DCameraNotify devId %s dhId %s", GetAnonyString(devId_).c_str(),
130 GetAnonyString(dhId_).c_str());
131 DCameraEventCmd cmd;
132 int32_t ret = cmd.Unmarshal(eventStr);
133 if (ret != DCAMERA_OK) {
134 DHLOGE("DCameraSourceDev DCameraNotify devId %s dhId %s marshal failed, ret: %d",
135 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), ret);
136 return ret;
137 }
138
139 DCameraSourceEvent event(*this, DCAMERA_EVENT_NOFIFY, cmd.value_);
140 eventBus_->PostEvent<DCameraSourceEvent>(event);
141 return DCAMERA_OK;
142 }
143
OpenSession(DCameraIndex & camIndex)144 int32_t DCameraSourceDev::OpenSession(DCameraIndex& camIndex)
145 {
146 DHLOGI("DCameraSourceDev PostTask OpenSession devId %s dhId %s", GetAnonyString(devId_).c_str(),
147 GetAnonyString(dhId_).c_str());
148 DCameraSourceEvent event(*this, DCAMERA_EVENT_OPEN, camIndex);
149 eventBus_->PostEvent<DCameraSourceEvent>(event);
150 return DCAMERA_OK;
151 }
152
CloseSession(DCameraIndex & camIndex)153 int32_t DCameraSourceDev::CloseSession(DCameraIndex& camIndex)
154 {
155 DHLOGI("DCameraSourceDev PostTask CloseSession devId %s dhId %s", GetAnonyString(devId_).c_str(),
156 GetAnonyString(dhId_).c_str());
157 DCameraSourceEvent event(*this, DCAMERA_EVENT_CLOSE, camIndex);
158 eventBus_->PostEvent<DCameraSourceEvent>(event);
159 return DCAMERA_OK;
160 }
161
ConfigCameraStreams(const std::vector<std::shared_ptr<DCStreamInfo>> & streamInfos)162 int32_t DCameraSourceDev::ConfigCameraStreams(const std::vector<std::shared_ptr<DCStreamInfo>>& streamInfos)
163 {
164 DHLOGI("DCameraSourceDev PostTask ConfigStreams devId %s dhId %s", GetAnonyString(devId_).c_str(),
165 GetAnonyString(dhId_).c_str());
166 DCameraSourceEvent event(*this, DCAMERA_EVENT_CONFIG_STREAMS, streamInfos);
167 eventBus_->PostEvent<DCameraSourceEvent>(event);
168 return DCAMERA_OK;
169 }
170
ReleaseCameraStreams(const std::vector<int> & streamIds)171 int32_t DCameraSourceDev::ReleaseCameraStreams(const std::vector<int>& streamIds)
172 {
173 DHLOGI("DCameraSourceDev PostTask ReleaseStreams devId %s dhId %s", GetAnonyString(devId_).c_str(),
174 GetAnonyString(dhId_).c_str());
175 DCameraSourceEvent event(*this, DCAMERA_EVENT_RELEASE_STREAMS, streamIds);
176 eventBus_->PostEvent<DCameraSourceEvent>(event);
177 return DCAMERA_OK;
178 }
179
StartCameraCapture(const std::vector<std::shared_ptr<DCCaptureInfo>> & captureInfos)180 int32_t DCameraSourceDev::StartCameraCapture(const std::vector<std::shared_ptr<DCCaptureInfo>>& captureInfos)
181 {
182 DHLOGI("DCameraSourceDev PostTask StartCapture devId %s dhId %s", GetAnonyString(devId_).c_str(),
183 GetAnonyString(dhId_).c_str());
184 DCameraSourceEvent event(*this, DCAMERA_EVENT_START_CAPTURE, captureInfos);
185 eventBus_->PostEvent<DCameraSourceEvent>(event);
186 return DCAMERA_OK;
187 }
188
StopCameraCapture(const std::vector<int> & streamIds)189 int32_t DCameraSourceDev::StopCameraCapture(const std::vector<int>& streamIds)
190 {
191 DHLOGI("DCameraSourceDev PostTask StopCapture devId %s dhId %s", GetAnonyString(devId_).c_str(),
192 GetAnonyString(dhId_).c_str());
193 DCameraSourceEvent event(*this, DCAMERA_EVENT_STOP_CAPTURE, streamIds);
194 eventBus_->PostEvent<DCameraSourceEvent>(event);
195 return DCAMERA_OK;
196 }
197
UpdateCameraSettings(const std::vector<std::shared_ptr<DCameraSettings>> & settings)198 int32_t DCameraSourceDev::UpdateCameraSettings(const std::vector<std::shared_ptr<DCameraSettings>>& settings)
199 {
200 DHLOGI("DCameraSourceDev PostTask UpdateCameraSettings devId %s dhId %s", GetAnonyString(devId_).c_str(),
201 GetAnonyString(dhId_).c_str());
202 DCameraSourceEvent event(*this, DCAMERA_EVENT_UPDATE_SETTINGS, settings);
203 eventBus_->PostEvent<DCameraSourceEvent>(event);
204 return DCAMERA_OK;
205 }
206
OnEvent(DCameraSourceEvent & event)207 void DCameraSourceDev::OnEvent(DCameraSourceEvent& event)
208 {
209 DHLOGI("DCameraSourceDev OnEvent devId %s dhId %s eventType: %d", GetAnonyString(devId_).c_str(),
210 GetAnonyString(dhId_).c_str(), event.GetEventType());
211 if (event.GetEventType() == DCAMERA_EVENT_HICOLLIE) {
212 SetHicollieFlag(true);
213 return;
214 }
215 int32_t ret = stateMachine_->Execute(event.GetEventType(), event);
216 if (ret != DCAMERA_OK) {
217 DHLOGE("DCameraSourceDev OnEvent failed, ret: %d, devId: %s dhId: %s", ret,
218 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
219 }
220 NotifyResult(event.GetEventType(), event, ret);
221 }
222
Register(std::shared_ptr<DCameraRegistParam> & param)223 int32_t DCameraSourceDev::Register(std::shared_ptr<DCameraRegistParam>& param)
224 {
225 DCAMERA_SYNC_TRACE(DCAMERA_REGISTER_CAMERA);
226 DHLOGI("DCameraSourceDev Execute Register devId: %s dhId: %s",
227 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
228 ReportRegisterCameraEvent(REGIST_CAMERA_EVENT, GetAnonyString(devId_), dhId_,
229 version_, "execute register event.");
230 std::vector<DCameraIndex> actualDevInfo;
231 actualDevInfo.assign(actualDevInfo_.begin(), actualDevInfo_.end());
232 int32_t ret = controller_->Init(actualDevInfo);
233 if (ret != DCAMERA_OK) {
234 DHLOGE("DCameraSourceDev Execute Register controller init failed, ret: %d, devId: %s dhId: %s", ret,
235 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
236 return ret;
237 }
238
239 ret = input_->Init();
240 if (ret != DCAMERA_OK) {
241 DHLOGE("DCameraSourceDev Execute Register input init failed, ret: %d, devId: %s dhId: %s", ret,
242 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
243 controller_->UnInit();
244 return ret;
245 }
246
247 sptr<IDCameraProvider> camHdiProvider = IDCameraProvider::Get(HDF_DCAMERA_EXT_SERVICE);
248 if (camHdiProvider == nullptr) {
249 DHLOGI("Register camHdiProvider is nullptr devId: %s dhId: %s", GetAnonyString(devId_).c_str(),
250 GetAnonyString(dhId_).c_str());
251 controller_->UnInit();
252 input_->UnInit();
253 return DCAMERA_BAD_OPERATE;
254 }
255 DHBase dhBase;
256 dhBase.deviceId_ = param->devId_;
257 dhBase.dhId_ = param->dhId_;
258 std::string ability;
259 ret = ParseEnableParam(param, ability);
260 if (ret != DCAMERA_OK) {
261 DHLOGE("Parsing param failed.");
262 }
263 int32_t retHdi = camHdiProvider->EnableDCameraDevice(dhBase, ability, hdiCallback_);
264 DHLOGI("DCameraSourceDev Execute Register register hal, ret: %d, devId: %s dhId: %s", retHdi,
265 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
266 if (retHdi != SUCCESS) {
267 controller_->UnInit();
268 input_->UnInit();
269 return DCAMERA_REGIST_HAL_FAILED;
270 }
271 return DCAMERA_OK;
272 }
273
ParseEnableParam(std::shared_ptr<DCameraRegistParam> & param,std::string & ability)274 int32_t DCameraSourceDev::ParseEnableParam(std::shared_ptr<DCameraRegistParam>& param, std::string& ability)
275 {
276 JSONCPP_STRING errs;
277 Json::CharReaderBuilder readerBuilder;
278 Json::Value sinkRootValue;
279
280 std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
281 if (!jsonReader->parse(param->sinkParam_.c_str(), param->sinkParam_.c_str() + param->sinkParam_.length(),
282 &sinkRootValue, &errs) || !sinkRootValue.isObject()) {
283 DHLOGE("Input sink ablity info is not json object.");
284 return DCAMERA_INIT_ERR;
285 }
286
287 Json::Value srcRootValue;
288 if (!jsonReader->parse(param->srcParam_.c_str(), param->srcParam_.c_str() + param->srcParam_.length(),
289 &srcRootValue, &errs) || !srcRootValue.isObject()) {
290 DHLOGE("Input source ablity info is not json object.");
291 return DCAMERA_INIT_ERR;
292 }
293 Json::Value abilityRootValue;
294 abilityRootValue["SinkAbility"] = sinkRootValue;
295 abilityRootValue["SourceAbility"] = srcRootValue;
296 ability = abilityRootValue.toStyledString();
297 return DCAMERA_OK;
298 }
299
UnRegister(std::shared_ptr<DCameraRegistParam> & param)300 int32_t DCameraSourceDev::UnRegister(std::shared_ptr<DCameraRegistParam>& param)
301 {
302 DCAMERA_SYNC_TRACE(DCAMERA_UNREGISTER_CAMERA);
303 DHLOGI("DCameraSourceDev Execute UnRegister devId: %s dhId: %s", GetAnonyString(devId_).c_str(),
304 GetAnonyString(dhId_).c_str());
305 ReportRegisterCameraEvent(UNREGIST_CAMERA_EVENT, GetAnonyString(devId_), dhId_,
306 version_, "execute unregister event.");
307 int32_t ret = controller_->UnInit();
308 if (ret != DCAMERA_OK) {
309 DHLOGE("DCameraSourceDev Execute UnRegister controller uninit failed, ret: %d, devId: %s dhId: %s", ret,
310 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
311 }
312
313 ret = input_->UnInit();
314 if (ret != DCAMERA_OK) {
315 DHLOGE("DCameraSourceDev Execute UnRegister input uninit failed, ret: %d, devId: %s dhId: %s", ret,
316 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
317 }
318
319 sptr<IDCameraProvider> camHdiProvider = IDCameraProvider::Get(HDF_DCAMERA_EXT_SERVICE);
320 if (camHdiProvider == nullptr) {
321 DHLOGI("UnRegister camHdiProvider is nullptr devId: %s dhId: %s", GetAnonyString(devId_).c_str(),
322 GetAnonyString(dhId_).c_str());
323 return DCAMERA_BAD_OPERATE;
324 }
325
326 DHBase dhBase;
327 dhBase.deviceId_ = param->devId_;
328 dhBase.dhId_ = param->dhId_;
329 int32_t retHdi = camHdiProvider->DisableDCameraDevice(dhBase);
330 DHLOGI("DCameraSourceDev Execute UnRegister unregister hal, ret: %d, devId: %s dhId: %s", retHdi,
331 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
332 if (retHdi != SUCCESS) {
333 return DCAMERA_UNREGIST_HAL_FAILED;
334 }
335 return DCAMERA_OK;
336 }
337
OpenCamera()338 int32_t DCameraSourceDev::OpenCamera()
339 {
340 DHLOGI("DCameraSourceDev Execute OpenCamera devId %s dhId %s", GetAnonyString(devId_).c_str(),
341 GetAnonyString(dhId_).c_str());
342 ReportCameraOperaterEvent(OPEN_CAMERA_EVENT, GetAnonyString(devId_), dhId_, "execute open camera event.");
343 std::shared_ptr<DCameraOpenInfo> openInfo = std::make_shared<DCameraOpenInfo>();
344 int32_t ret = GetLocalDeviceNetworkId(openInfo->sourceDevId_);
345 if (ret != DCAMERA_OK) {
346 DHLOGE("DCameraSourceDev getMyId failed ret: %d, devId: %s, dhId: %s", ret,
347 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
348 return ret;
349 }
350
351 DcameraStartAsyncTrace(DCAMERA_OPEN_CHANNEL_CONTROL, DCAMERA_OPEN_CHANNEL_TASKID);
352 ret = controller_->OpenChannel(openInfo);
353 if (ret != DCAMERA_OK) {
354 DHLOGE("DCameraSourceDev Execute OpenCamera OpenChannel failed, ret: %d, devId: %s dhId: %s", ret,
355 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
356 DcameraFinishAsyncTrace(DCAMERA_OPEN_CHANNEL_CONTROL, DCAMERA_OPEN_CHANNEL_TASKID);
357 return DCAMERA_OPEN_CONFLICT;
358 }
359 return DCAMERA_OK;
360 }
361
CloseCamera()362 int32_t DCameraSourceDev::CloseCamera()
363 {
364 DHLOGI("DCameraSourceDev Execute CloseCamera devId %s dhId %s", GetAnonyString(devId_).c_str(),
365 GetAnonyString(dhId_).c_str());
366 ReportCameraOperaterEvent(CLOSE_CAMERA_EVENT, GetAnonyString(devId_), dhId_, "execute close camera event.");
367 int32_t ret = input_->CloseChannel();
368 if (ret != DCAMERA_OK) {
369 DHLOGE("DCameraSourceDev Execute CloseCamera input CloseChannel failed, ret: %d, devId: %s dhId: %s", ret,
370 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
371 }
372 ret = controller_->CloseChannel();
373 if (ret != DCAMERA_OK) {
374 DHLOGE("DCameraSourceDev Execute CloseCamera controller CloseChannel failed, ret: %d, devId: %s dhId: %s", ret,
375 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
376 }
377 return DCAMERA_OK;
378 }
379
ConfigStreams(std::vector<std::shared_ptr<DCStreamInfo>> & streamInfos)380 int32_t DCameraSourceDev::ConfigStreams(std::vector<std::shared_ptr<DCStreamInfo>>& streamInfos)
381 {
382 DHLOGI("DCameraSourceDev Execute ConfigStreams devId %s dhId %s", GetAnonyString(devId_).c_str(),
383 GetAnonyString(dhId_).c_str());
384 int32_t ret = input_->ConfigStreams(streamInfos);
385 if (ret != DCAMERA_OK) {
386 DHLOGE("DCameraSourceDev Execute ConfigStreams ConfigStreams failed, ret: %d, devId: %s dhId: %s", ret,
387 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
388 return ret;
389 }
390
391 std::shared_ptr<DCameraChannelInfo> chanInfo = std::make_shared<DCameraChannelInfo>();
392 ret = GetLocalDeviceNetworkId(chanInfo->sourceDevId_);
393 if (ret != DCAMERA_OK) {
394 DHLOGE("DCameraSourceDev getLocalNetworkId failed ret: %d, devId: %s, dhId: %s", ret,
395 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
396 return ret;
397 }
398 DCameraChannelDetail continueChInfo(CONTINUE_SESSION_FLAG, CONTINUOUS_FRAME);
399 DCameraChannelDetail snapShotChInfo(SNAP_SHOT_SESSION_FLAG, SNAPSHOT_FRAME);
400 chanInfo->detail_.push_back(continueChInfo);
401 chanInfo->detail_.push_back(snapShotChInfo);
402
403 ret = controller_->ChannelNeg(chanInfo);
404 if (ret != DCAMERA_OK) {
405 DHLOGE("DCameraSourceDev ChannelNeg failed ret: %d, devId: %s, dhId: %s", ret,
406 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
407 return ret;
408 }
409
410 std::vector<DCameraIndex> actualDevInfo;
411 actualDevInfo.assign(actualDevInfo_.begin(), actualDevInfo_.end());
412 ret = input_->OpenChannel(actualDevInfo);
413 if (ret != DCAMERA_OK) {
414 DHLOGE("DCameraSourceDev ChannelNeg OpenChannel failed ret: %d, devId: %s, dhId: %s", ret,
415 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
416 return ret;
417 }
418 return DCAMERA_OK;
419 }
420
ReleaseStreams(std::vector<int> & streamIds,bool & isAllRelease)421 int32_t DCameraSourceDev::ReleaseStreams(std::vector<int>& streamIds, bool& isAllRelease)
422 {
423 DHLOGI("DCameraSourceDev Execute ReleaseStreams devId %s dhId %s", GetAnonyString(devId_).c_str(),
424 GetAnonyString(dhId_).c_str());
425 int32_t ret = input_->ReleaseStreams(streamIds, isAllRelease);
426 if (ret != DCAMERA_OK) {
427 DHLOGE("DCameraSourceDev Execute ReleaseStreams failed ret: %d, devId: %s, dhId: %s", ret,
428 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
429 return ret;
430 }
431 return DCAMERA_OK;
432 }
433
ReleaseAllStreams()434 int32_t DCameraSourceDev::ReleaseAllStreams()
435 {
436 DHLOGI("DCameraSourceDev Execute ReleaseAllStreams devId %s dhId %s", GetAnonyString(devId_).c_str(),
437 GetAnonyString(dhId_).c_str());
438 int32_t ret = input_->ReleaseAllStreams();
439 if (ret != DCAMERA_OK) {
440 DHLOGE("DCameraSourceDev Execute ReleaseAllStreams failed ret: %d, devId: %s, dhId: %s", ret,
441 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
442 return ret;
443 }
444 return DCAMERA_OK;
445 }
446
StartCapture(std::vector<std::shared_ptr<DCCaptureInfo>> & captureInfos)447 int32_t DCameraSourceDev::StartCapture(std::vector<std::shared_ptr<DCCaptureInfo>>& captureInfos)
448 {
449 HitraceAndHisyseventImpl(captureInfos);
450 DHLOGI("DCameraSourceDev Execute StartCapture devId %s dhId %s", GetAnonyString(devId_).c_str(),
451 GetAnonyString(dhId_).c_str());
452 int32_t ret = input_->StartCapture(captureInfos);
453 if (ret != DCAMERA_OK) {
454 DHLOGE("DCameraSourceDev input StartCapture failed ret: %d, devId: %s, dhId: %s", ret,
455 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
456 DcameraFinishAsyncTrace(DCAMERA_CONTINUE_FIRST_FRAME, DCAMERA_CONTINUE_FIRST_FRAME_TASKID);
457 DcameraFinishAsyncTrace(DCAMERA_SNAPSHOT_FIRST_FRAME, DCAMERA_SNAPSHOT_FIRST_FRAME_TASKID);
458 return ret;
459 }
460 std::vector<std::shared_ptr<DCameraCaptureInfo>> captures;
461 for (auto iter = captureInfos.begin(); iter != captureInfos.end(); iter++) {
462 std::shared_ptr<DCameraCaptureInfo> capture = std::make_shared<DCameraCaptureInfo>();
463 capture->width_ = (*iter)->width_;
464 capture->height_ = (*iter)->height_;
465 capture->format_ = (*iter)->format_;
466 capture->dataspace_ = (*iter)->dataspace_;
467 capture->isCapture_ = (*iter)->isCapture_;
468 capture->encodeType_ = (*iter)->encodeType_;
469 capture->streamType_ = (*iter)->type_;
470 DHLOGI("StartCapture devId %s dhId %s settings size: %d w: %d h: %d fmt: %d isC: %d enc: %d streamT: %d",
471 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), (*iter)->captureSettings_.size(),
472 capture->width_, capture->height_, capture->format_, capture->isCapture_ ? 1 : 0, capture->encodeType_,
473 capture->streamType_);
474 for (auto settingIter = (*iter)->captureSettings_.begin(); settingIter != (*iter)->captureSettings_.end();
475 settingIter++) {
476 std::shared_ptr<DCameraSettings> setting = std::make_shared<DCameraSettings>();
477 setting->type_ = settingIter->type_;
478 setting->value_ = settingIter->value_;
479 capture->captureSettings_.push_back(setting);
480 }
481 captures.push_back(capture);
482 }
483
484 ret = controller_->StartCapture(captures);
485 if (ret != DCAMERA_OK) {
486 DHLOGE("DCameraSourceDev Execute StartCapture StartCapture failed, ret: %d, devId: %s dhId: %s", ret,
487 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
488 DcameraFinishAsyncTrace(DCAMERA_CONTINUE_FIRST_FRAME, DCAMERA_CONTINUE_FIRST_FRAME_TASKID);
489 DcameraFinishAsyncTrace(DCAMERA_SNAPSHOT_FIRST_FRAME, DCAMERA_SNAPSHOT_FIRST_FRAME_TASKID);
490 }
491 return ret;
492 }
493
HitraceAndHisyseventImpl(std::vector<std::shared_ptr<DCCaptureInfo>> & captureInfos)494 void DCameraSourceDev::HitraceAndHisyseventImpl(std::vector<std::shared_ptr<DCCaptureInfo>>& captureInfos)
495 {
496 for (auto iter = captureInfos.begin(); iter != captureInfos.end(); iter++) {
497 std::shared_ptr<DCCaptureInfo> capture = *iter;
498 EventCaptureInfo eventCaptureInfo = {
499 .width_ = capture->width_,
500 .height_ = capture->height_,
501 .format_ = capture->format_,
502 .isCapture_ = capture->isCapture_,
503 .encodeType_ = capture->encodeType_,
504 .type_ = capture->type_,
505 };
506 ReportStartCaptureEvent(START_CAPTURE_EVENT, eventCaptureInfo, "execute start capture event.");
507 if (capture->type_ == CONTINUOUS_FRAME && capture->isCapture_ == true) {
508 DcameraStartAsyncTrace(DCAMERA_CONTINUE_FIRST_FRAME, DCAMERA_CONTINUE_FIRST_FRAME_TASKID);
509 } else if (capture->type_ == SNAPSHOT_FRAME && capture->isCapture_ == true) {
510 DcameraStartAsyncTrace(DCAMERA_SNAPSHOT_FIRST_FRAME, DCAMERA_SNAPSHOT_FIRST_FRAME_TASKID);
511 }
512 }
513 }
514
StopCapture(std::vector<int> & streamIds,bool & isAllStop)515 int32_t DCameraSourceDev::StopCapture(std::vector<int>& streamIds, bool& isAllStop)
516 {
517 DHLOGI("DCameraSourceDev Execute StopCapture devId %s dhId %s", GetAnonyString(devId_).c_str(),
518 GetAnonyString(dhId_).c_str());
519 int32_t ret = input_->StopCapture(streamIds, isAllStop);
520 if (ret != DCAMERA_OK) {
521 DHLOGE("DCameraSourceDev Execute StopCapture input StopCapture failed, ret: %d, devId: %s dhId: %s", ret,
522 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
523 }
524 if (isAllStop) {
525 ret = controller_->StopCapture();
526 if (ret != DCAMERA_OK) {
527 DHLOGE("DCameraSourceDev Execute StopCapture controller StopCapture failed, ret: %d, devId: %s dhId: %s",
528 ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
529 }
530 }
531 return DCAMERA_OK;
532 }
533
StopAllCapture()534 int32_t DCameraSourceDev::StopAllCapture()
535 {
536 DHLOGI("DCameraSourceDev Execute StopAllCapture devId %s dhId %s", GetAnonyString(devId_).c_str(),
537 GetAnonyString(dhId_).c_str());
538 int32_t ret = input_->StopAllCapture();
539 if (ret != DCAMERA_OK) {
540 DHLOGE("DCameraSourceDev Execute StopAllCapture input StopAllCapture failed, ret: %d, devId: %s dhId: %s",
541 ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
542 }
543 ret = controller_->StopCapture();
544 if (ret != DCAMERA_OK) {
545 DHLOGE("DCameraSourceDev Execute StopAllCapture controller StopAllCapture failed, ret: %d, devId: %s dhId: %s",
546 ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
547 }
548 return DCAMERA_OK;
549 }
550
UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>> & settings)551 int32_t DCameraSourceDev::UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>>& settings)
552 {
553 DHLOGI("DCameraSourceDev Execute UpdateSettings devId %s dhId %s", GetAnonyString(devId_).c_str(),
554 GetAnonyString(dhId_).c_str());
555 int32_t ret = input_->UpdateSettings(settings);
556 if (ret != DCAMERA_OK) {
557 DHLOGE("DCameraSourceDev Execute UpdateSettings input UpdateSettings failed, ret: %d, devId: %s dhId: %s", ret,
558 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
559 return ret;
560 }
561 ret = controller_->UpdateSettings(settings);
562 if (ret != DCAMERA_OK) {
563 DHLOGE("DCameraSourceDev Execute UpdateSettings controller UpdateSettings failed, ret: %d, devId: %s dhId: %s",
564 ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
565 return ret;
566 }
567 return DCAMERA_OK;
568 }
569
CameraEventNotify(std::shared_ptr<DCameraEvent> & events)570 int32_t DCameraSourceDev::CameraEventNotify(std::shared_ptr<DCameraEvent>& events)
571 {
572 DHLOGI("DCameraSourceDev Execute CameraEventNotify devId %s dhId %s", GetAnonyString(devId_).c_str(),
573 GetAnonyString(dhId_).c_str());
574 int32_t ret = controller_->DCameraNotify(events);
575 if (ret != DCAMERA_OK) {
576 DHLOGE("DCameraSourceDev Execute CameraEventNotify DCameraNotify failed, ret: %d, devId: %s dhId: %s", ret,
577 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
578 return ret;
579 }
580 return DCAMERA_OK;
581 }
582
NotifyResult(DCAMERA_EVENT eventType,DCameraSourceEvent & event,int32_t result)583 void DCameraSourceDev::NotifyResult(DCAMERA_EVENT eventType, DCameraSourceEvent& event, int32_t result)
584 {
585 auto itFunc = memberFuncMap_.find(eventType);
586 if (itFunc == memberFuncMap_.end()) {
587 DHLOGE("Notify func map not find, execute %d notify, devId: %s dhId: %s", eventType,
588 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
589 return;
590 }
591
592 auto memberFunc = itFunc->second;
593 (this->*memberFunc)(eventType, event, result);
594 return;
595 }
596
NotifyRegisterResult(DCAMERA_EVENT eventType,DCameraSourceEvent & event,int32_t result)597 void DCameraSourceDev::NotifyRegisterResult(DCAMERA_EVENT eventType, DCameraSourceEvent& event, int32_t result)
598 {
599 std::string data = "";
600 std::shared_ptr<DCameraRegistParam> param;
601 int32_t ret = event.GetDCameraRegistParam(param);
602 if (ret != DCAMERA_OK) {
603 return;
604 }
605
606 if (stateListener_ == nullptr) {
607 DHLOGE("DCameraSourceDev can not get listener");
608 return;
609 }
610 if (eventType == DCAMERA_EVENT_REGIST) {
611 stateListener_->OnRegisterNotify(param->devId_, param->dhId_, param->reqId_, result, data);
612 } else {
613 stateListener_->OnUnregisterNotify(param->devId_, param->dhId_, param->reqId_, result, data);
614 }
615 }
616
NotifyHalResult(DCAMERA_EVENT eventType,DCameraSourceEvent & event,int32_t result)617 void DCameraSourceDev::NotifyHalResult(DCAMERA_EVENT eventType, DCameraSourceEvent& event, int32_t result)
618 {
619 DHLOGI("DCameraSourceDev NotifyHalResult eventType: %d, result: %d devId: %s dhId: %s", eventType, result,
620 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
621 if (result == DCAMERA_OK) {
622 return;
623 }
624
625 std::shared_ptr<DCameraEvent> events = std::make_shared<DCameraEvent>();
626 events->eventType_ = DCAMERA_OPERATION;
627 auto iter = eventResultMap_.find(eventType);
628 if (iter == eventResultMap_.end()) {
629 return;
630 }
631 events->eventResult_ = iter->second;
632 CameraEventNotify(events);
633 return;
634 }
635
GetStateInfo()636 int32_t DCameraSourceDev::GetStateInfo()
637 {
638 DHLOGI("GetStateInfo In state %d", stateMachine_->GetCameraState());
639 return stateMachine_->GetCameraState();
640 }
641
GetVersion()642 std::string DCameraSourceDev::GetVersion()
643 {
644 return version_;
645 }
646
OnChannelConnectedEvent()647 int32_t DCameraSourceDev::OnChannelConnectedEvent()
648 {
649 std::shared_ptr<DCameraEvent> camEvent = std::make_shared<DCameraEvent>();
650 camEvent->eventType_ = DCAMERA_MESSAGE;
651 camEvent->eventResult_ = DCAMERA_EVENT_CHANNEL_CONNECTED;
652 DCameraSourceEvent event(*this, DCAMERA_EVENT_NOFIFY, camEvent);
653 eventBus_->PostEvent<DCameraSourceEvent>(event);
654 return DCAMERA_OK;
655 }
656
OnChannelDisconnectedEvent()657 int32_t DCameraSourceDev::OnChannelDisconnectedEvent()
658 {
659 DCameraIndex camIndex(devId_, dhId_);
660 DCameraSourceEvent event(*this, DCAMERA_EVENT_CLOSE, camIndex);
661 eventBus_->PostEvent<DCameraSourceEvent>(event);
662 std::shared_ptr<DCameraEvent> camEvent = std::make_shared<DCameraEvent>();
663 camEvent->eventType_ = DCAMERA_MESSAGE;
664 camEvent->eventResult_ = DCAMERA_EVENT_CHANNEL_DISCONNECTED;
665 DCameraSourceEvent eventNotify(*this, DCAMERA_EVENT_NOFIFY, camEvent);
666 eventBus_->PostEvent<DCameraSourceEvent>(eventNotify);
667 return DCAMERA_OK;
668 }
669
PostHicollieEvent()670 int32_t DCameraSourceDev::PostHicollieEvent()
671 {
672 DCameraIndex camIndex(devId_, dhId_);
673 DCameraSourceEvent event(*this, DCAMERA_EVENT_HICOLLIE, camIndex);
674 eventBus_->PostEvent<DCameraSourceEvent>(event);
675 return DCAMERA_OK;
676 }
677
SetHicollieFlag(bool flag)678 void DCameraSourceDev::SetHicollieFlag(bool flag)
679 {
680 hicollieFlag_.store(flag);
681 }
682
GetHicollieFlag()683 bool DCameraSourceDev::GetHicollieFlag()
684 {
685 return hicollieFlag_.load();
686 }
687 } // namespace DistributedHardware
688 } // namespace OHOS
689