• 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 "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