• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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_, eventBus_);
86     input_ = std::make_shared<DCameraSourceInput>(devId_, dhId_, eventBus_);
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 std::string & ver,const std::string attrs)97 int32_t DCameraSourceDev::RegisterDistributedHardware(const std::string& devId, const std::string& dhId,
98     const std::string& reqId, const std::string& ver, const std::string attrs)
99 {
100     DHLOGI("DCameraSourceDev PostTask RegisterDistributedHardware devId %s dhId %s", GetAnonyString(devId).c_str(),
101         GetAnonyString(dhId).c_str());
102     version_ = ver;
103     DCameraIndex index(devId, dhId);
104     actualDevInfo_.insert(index);
105 
106     std::shared_ptr<DCameraRegistParam> regParam = std::make_shared<DCameraRegistParam>(devId, dhId, reqId, attrs);
107     DCameraSourceEvent event(*this, DCAMERA_EVENT_REGIST, regParam);
108     eventBus_->PostEvent<DCameraSourceEvent>(event);
109     return DCAMERA_OK;
110 }
111 
UnRegisterDistributedHardware(const std::string devId,const std::string dhId,const std::string reqId)112 int32_t DCameraSourceDev::UnRegisterDistributedHardware(const std::string devId, const std::string dhId,
113     const std::string reqId)
114 {
115     DHLOGI("DCameraSourceDev PostTask UnRegisterDistributedHardware devId %s dhId %s", GetAnonyString(devId).c_str(),
116         GetAnonyString(dhId).c_str());
117     std::string param;
118     std::shared_ptr<DCameraRegistParam> regParam = std::make_shared<DCameraRegistParam>(devId, dhId, reqId, param);
119     DCameraSourceEvent event(*this, DCAMERA_EVENT_UNREGIST, regParam);
120     eventBus_->PostEvent<DCameraSourceEvent>(event);
121     return DCAMERA_OK;
122 }
123 
DCameraNotify(std::string & eventStr)124 int32_t DCameraSourceDev::DCameraNotify(std::string& eventStr)
125 {
126     DHLOGI("DCameraSourceDev PostTask DCameraNotify devId %s dhId %s", GetAnonyString(devId_).c_str(),
127         GetAnonyString(dhId_).c_str());
128     DCameraEventCmd cmd;
129     int32_t ret = cmd.Unmarshal(eventStr);
130     if (ret != DCAMERA_OK) {
131         DHLOGE("DCameraSourceDev DCameraNotify devId %s dhId %s marshal failed, ret: %d",
132             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), ret);
133         return ret;
134     }
135 
136     DCameraSourceEvent event(*this, DCAMERA_EVENT_NOFIFY, cmd.value_);
137     eventBus_->PostEvent<DCameraSourceEvent>(event);
138     return DCAMERA_OK;
139 }
140 
OpenSession(DCameraIndex & camIndex)141 int32_t DCameraSourceDev::OpenSession(DCameraIndex& camIndex)
142 {
143     DHLOGI("DCameraSourceDev PostTask OpenSession devId %s dhId %s", GetAnonyString(devId_).c_str(),
144         GetAnonyString(dhId_).c_str());
145     DCameraSourceEvent event(*this, DCAMERA_EVENT_OPEN, camIndex);
146     eventBus_->PostEvent<DCameraSourceEvent>(event);
147     return DCAMERA_OK;
148 }
149 
CloseSession(DCameraIndex & camIndex)150 int32_t DCameraSourceDev::CloseSession(DCameraIndex& camIndex)
151 {
152     DHLOGI("DCameraSourceDev PostTask CloseSession devId %s dhId %s", GetAnonyString(devId_).c_str(),
153         GetAnonyString(dhId_).c_str());
154     DCameraSourceEvent event(*this, DCAMERA_EVENT_CLOSE, camIndex);
155     eventBus_->PostEvent<DCameraSourceEvent>(event);
156     return DCAMERA_OK;
157 }
158 
ConfigCameraStreams(const std::vector<std::shared_ptr<DCStreamInfo>> & streamInfos)159 int32_t DCameraSourceDev::ConfigCameraStreams(const std::vector<std::shared_ptr<DCStreamInfo>>& streamInfos)
160 {
161     DHLOGI("DCameraSourceDev PostTask ConfigStreams devId %s dhId %s", GetAnonyString(devId_).c_str(),
162         GetAnonyString(dhId_).c_str());
163     DCameraSourceEvent event(*this, DCAMERA_EVENT_CONFIG_STREAMS, streamInfos);
164     eventBus_->PostEvent<DCameraSourceEvent>(event);
165     return DCAMERA_OK;
166 }
167 
ReleaseCameraStreams(const std::vector<int> & streamIds)168 int32_t DCameraSourceDev::ReleaseCameraStreams(const std::vector<int>& streamIds)
169 {
170     DHLOGI("DCameraSourceDev PostTask ReleaseStreams devId %s dhId %s", GetAnonyString(devId_).c_str(),
171         GetAnonyString(dhId_).c_str());
172     DCameraSourceEvent event(*this, DCAMERA_EVENT_RELEASE_STREAMS, streamIds);
173     eventBus_->PostEvent<DCameraSourceEvent>(event);
174     return DCAMERA_OK;
175 }
176 
StartCameraCapture(const std::vector<std::shared_ptr<DCCaptureInfo>> & captureInfos)177 int32_t DCameraSourceDev::StartCameraCapture(const std::vector<std::shared_ptr<DCCaptureInfo>>& captureInfos)
178 {
179     DHLOGI("DCameraSourceDev PostTask StartCapture devId %s dhId %s", GetAnonyString(devId_).c_str(),
180         GetAnonyString(dhId_).c_str());
181     DCameraSourceEvent event(*this, DCAMERA_EVENT_START_CAPTURE, captureInfos);
182     eventBus_->PostEvent<DCameraSourceEvent>(event);
183     return DCAMERA_OK;
184 }
185 
StopCameraCapture(const std::vector<int> & streamIds)186 int32_t DCameraSourceDev::StopCameraCapture(const std::vector<int>& streamIds)
187 {
188     DHLOGI("DCameraSourceDev PostTask StopCapture devId %s dhId %s", GetAnonyString(devId_).c_str(),
189         GetAnonyString(dhId_).c_str());
190     DCameraSourceEvent event(*this, DCAMERA_EVENT_STOP_CAPTURE, streamIds);
191     eventBus_->PostEvent<DCameraSourceEvent>(event);
192     return DCAMERA_OK;
193 }
194 
UpdateCameraSettings(const std::vector<std::shared_ptr<DCameraSettings>> & settings)195 int32_t DCameraSourceDev::UpdateCameraSettings(const std::vector<std::shared_ptr<DCameraSettings>>& settings)
196 {
197     DHLOGI("DCameraSourceDev PostTask UpdateCameraSettings devId %s dhId %s", GetAnonyString(devId_).c_str(),
198         GetAnonyString(dhId_).c_str());
199     DCameraSourceEvent event(*this, DCAMERA_EVENT_UPDATE_SETTINGS, settings);
200     eventBus_->PostEvent<DCameraSourceEvent>(event);
201     return DCAMERA_OK;
202 }
203 
OnEvent(DCameraSourceEvent & event)204 void DCameraSourceDev::OnEvent(DCameraSourceEvent& event)
205 {
206     DHLOGI("DCameraSourceDev OnEvent devId %s dhId %s eventType: %d", GetAnonyString(devId_).c_str(),
207         GetAnonyString(dhId_).c_str(), event.GetEventType());
208     int32_t ret = stateMachine_->Execute(event.GetEventType(), event);
209     if (ret != DCAMERA_OK) {
210         DHLOGE("DCameraSourceDev OnEvent failed, ret: %d, devId: %s dhId: %s", ret,
211             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
212     }
213     NotifyResult(event.GetEventType(), event, ret);
214 }
215 
Register(std::shared_ptr<DCameraRegistParam> & param)216 int32_t DCameraSourceDev::Register(std::shared_ptr<DCameraRegistParam>& param)
217 {
218     DCAMERA_SYNC_TRACE(DCAMERA_REGISTER_CAMERA);
219     DHLOGI("DCameraSourceDev Execute Register devId: %s dhId: %s",
220         GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
221     ReportRegisterCameraEvent(REGIST_CAMERA_EVENT, GetAnonyString(devId_), dhId_,
222         version_, "execute register event.");
223     std::vector<DCameraIndex> actualDevInfo;
224     actualDevInfo.assign(actualDevInfo_.begin(), actualDevInfo_.end());
225     int32_t ret = controller_->Init(actualDevInfo);
226     if (ret != DCAMERA_OK) {
227         DHLOGE("DCameraSourceDev Execute Register controller init failed, ret: %d, devId: %s dhId: %s", ret,
228             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
229         return ret;
230     }
231 
232     ret = input_->Init();
233     if (ret != DCAMERA_OK) {
234         DHLOGE("DCameraSourceDev Execute Register input init failed, ret: %d, devId: %s dhId: %s", ret,
235             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
236         controller_->UnInit();
237         return ret;
238     }
239 
240     sptr<IDCameraProvider> camHdiProvider = IDCameraProvider::Get(HDF_DCAMERA_EXT_SERVICE);
241     if (camHdiProvider == nullptr) {
242         DHLOGI("Register camHdiProvider is nullptr devId: %s dhId: %s", GetAnonyString(devId_).c_str(),
243             GetAnonyString(dhId_).c_str());
244         controller_->UnInit();
245         input_->UnInit();
246         return DCAMERA_BAD_OPERATE;
247     }
248     DHBase dhBase;
249     dhBase.deviceId_ = param->devId_;
250     dhBase.dhId_ = param->dhId_;
251     int32_t retHdi = camHdiProvider->EnableDCameraDevice(dhBase, param->param_, hdiCallback_);
252     DHLOGI("DCameraSourceDev Execute Register register hal, ret: %d, devId: %s dhId: %s", retHdi,
253         GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
254     if (retHdi != SUCCESS) {
255         controller_->UnInit();
256         input_->UnInit();
257         return DCAMERA_REGIST_HAL_FAILED;
258     }
259     return DCAMERA_OK;
260 }
261 
UnRegister(std::shared_ptr<DCameraRegistParam> & param)262 int32_t DCameraSourceDev::UnRegister(std::shared_ptr<DCameraRegistParam>& param)
263 {
264     DCAMERA_SYNC_TRACE(DCAMERA_UNREGISTER_CAMERA);
265     DHLOGI("DCameraSourceDev Execute UnRegister devId: %s dhId: %s", GetAnonyString(devId_).c_str(),
266         GetAnonyString(dhId_).c_str());
267     ReportRegisterCameraEvent(UNREGIST_CAMERA_EVENT, GetAnonyString(devId_), dhId_,
268         version_, "execute unregister event.");
269     int32_t ret = controller_->UnInit();
270     if (ret != DCAMERA_OK) {
271         DHLOGE("DCameraSourceDev Execute UnRegister controller uninit failed, ret: %d, devId: %s dhId: %s", ret,
272             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
273     }
274 
275     ret = input_->UnInit();
276     if (ret != DCAMERA_OK) {
277         DHLOGE("DCameraSourceDev Execute UnRegister input uninit failed, ret: %d, devId: %s dhId: %s", ret,
278             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
279     }
280 
281     sptr<IDCameraProvider> camHdiProvider = IDCameraProvider::Get(HDF_DCAMERA_EXT_SERVICE);
282     if (camHdiProvider == nullptr) {
283         DHLOGI("UnRegister camHdiProvider is nullptr devId: %s dhId: %s", GetAnonyString(devId_).c_str(),
284             GetAnonyString(dhId_).c_str());
285         return DCAMERA_BAD_OPERATE;
286     }
287 
288     DHBase dhBase;
289     dhBase.deviceId_ = param->devId_;
290     dhBase.dhId_ = param->dhId_;
291     int32_t retHdi = camHdiProvider->DisableDCameraDevice(dhBase);
292     DHLOGI("DCameraSourceDev Execute UnRegister unregister hal, ret: %d, devId: %s dhId: %s", retHdi,
293         GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
294     if (retHdi != SUCCESS) {
295         return DCAMERA_UNREGIST_HAL_FAILED;
296     }
297     return DCAMERA_OK;
298 }
299 
OpenCamera()300 int32_t DCameraSourceDev::OpenCamera()
301 {
302     DHLOGI("DCameraSourceDev Execute OpenCamera devId %s dhId %s", GetAnonyString(devId_).c_str(),
303         GetAnonyString(dhId_).c_str());
304     ReportCameraOperaterEvent(OPEN_CAMERA_EVENT, GetAnonyString(devId_), dhId_, "execute open camera event.");
305     std::shared_ptr<DCameraOpenInfo> openInfo = std::make_shared<DCameraOpenInfo>();
306     int32_t ret = GetLocalDeviceNetworkId(openInfo->sourceDevId_);
307     if (ret != DCAMERA_OK) {
308         DHLOGE("DCameraSourceDev getMyId failed ret: %d, devId: %s, dhId: %s", ret,
309             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
310         return ret;
311     }
312 
313     DcameraStartAsyncTrace(DCAMERA_OPEN_CHANNEL_CONTROL, DCAMERA_OPEN_CHANNEL_TASKID);
314     ret = controller_->OpenChannel(openInfo);
315     if (ret != DCAMERA_OK) {
316         DHLOGE("DCameraSourceDev Execute OpenCamera OpenChannel failed, ret: %d, devId: %s dhId: %s", ret,
317             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
318         DcameraFinishAsyncTrace(DCAMERA_OPEN_CHANNEL_CONTROL, DCAMERA_OPEN_CHANNEL_TASKID);
319         return DCAMERA_OPEN_CONFLICT;
320     }
321     return DCAMERA_OK;
322 }
323 
CloseCamera()324 int32_t DCameraSourceDev::CloseCamera()
325 {
326     DHLOGI("DCameraSourceDev Execute CloseCamera devId %s dhId %s", GetAnonyString(devId_).c_str(),
327         GetAnonyString(dhId_).c_str());
328     ReportCameraOperaterEvent(CLOSE_CAMERA_EVENT, GetAnonyString(devId_), dhId_, "execute close camera event.");
329     int32_t ret = input_->CloseChannel();
330     if (ret != DCAMERA_OK) {
331         DHLOGE("DCameraSourceDev Execute CloseCamera input CloseChannel failed, ret: %d, devId: %s dhId: %s", ret,
332             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
333     }
334     ret = controller_->CloseChannel();
335     if (ret != DCAMERA_OK) {
336         DHLOGE("DCameraSourceDev Execute CloseCamera controller CloseChannel failed, ret: %d, devId: %s dhId: %s", ret,
337             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
338     }
339     return DCAMERA_OK;
340 }
341 
ConfigStreams(std::vector<std::shared_ptr<DCStreamInfo>> & streamInfos)342 int32_t DCameraSourceDev::ConfigStreams(std::vector<std::shared_ptr<DCStreamInfo>>& streamInfos)
343 {
344     DHLOGI("DCameraSourceDev Execute ConfigStreams devId %s dhId %s", GetAnonyString(devId_).c_str(),
345         GetAnonyString(dhId_).c_str());
346     int32_t ret = input_->ConfigStreams(streamInfos);
347     if (ret != DCAMERA_OK) {
348         DHLOGE("DCameraSourceDev Execute ConfigStreams ConfigStreams failed, ret: %d, devId: %s dhId: %s", ret,
349             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
350         return ret;
351     }
352 
353     std::shared_ptr<DCameraChannelInfo> chanInfo = std::make_shared<DCameraChannelInfo>();
354     ret = GetLocalDeviceNetworkId(chanInfo->sourceDevId_);
355     if (ret != DCAMERA_OK) {
356         DHLOGE("DCameraSourceDev getLocalNetworkId failed ret: %d, devId: %s, dhId: %s", ret,
357             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
358         return ret;
359     }
360     DCameraChannelDetail continueChInfo(CONTINUE_SESSION_FLAG, CONTINUOUS_FRAME);
361     DCameraChannelDetail snapShotChInfo(SNAP_SHOT_SESSION_FLAG, SNAPSHOT_FRAME);
362     chanInfo->detail_.push_back(continueChInfo);
363     chanInfo->detail_.push_back(snapShotChInfo);
364 
365     ret = controller_->ChannelNeg(chanInfo);
366     if (ret != DCAMERA_OK) {
367         DHLOGE("DCameraSourceDev ChannelNeg failed ret: %d, devId: %s, dhId: %s", ret,
368             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
369         return ret;
370     }
371 
372     std::vector<DCameraIndex> actualDevInfo;
373     actualDevInfo.assign(actualDevInfo_.begin(), actualDevInfo_.end());
374     ret = input_->OpenChannel(actualDevInfo);
375     if (ret != DCAMERA_OK) {
376         DHLOGE("DCameraSourceDev ChannelNeg OpenChannel failed ret: %d, devId: %s, dhId: %s", ret,
377             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
378         return ret;
379     }
380     return DCAMERA_OK;
381 }
382 
ReleaseStreams(std::vector<int> & streamIds,bool & isAllRelease)383 int32_t DCameraSourceDev::ReleaseStreams(std::vector<int>& streamIds, bool& isAllRelease)
384 {
385     DHLOGI("DCameraSourceDev Execute ReleaseStreams devId %s dhId %s", GetAnonyString(devId_).c_str(),
386         GetAnonyString(dhId_).c_str());
387     int32_t ret = input_->ReleaseStreams(streamIds, isAllRelease);
388     if (ret != DCAMERA_OK) {
389         DHLOGE("DCameraSourceDev Execute ReleaseStreams failed ret: %d, devId: %s, dhId: %s", ret,
390             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
391         return ret;
392     }
393     return DCAMERA_OK;
394 }
395 
ReleaseAllStreams()396 int32_t DCameraSourceDev::ReleaseAllStreams()
397 {
398     DHLOGI("DCameraSourceDev Execute ReleaseAllStreams devId %s dhId %s", GetAnonyString(devId_).c_str(),
399         GetAnonyString(dhId_).c_str());
400     int32_t ret = input_->ReleaseAllStreams();
401     if (ret != DCAMERA_OK) {
402         DHLOGE("DCameraSourceDev Execute ReleaseAllStreams failed ret: %d, devId: %s, dhId: %s", ret,
403             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
404         return ret;
405     }
406     return DCAMERA_OK;
407 }
408 
StartCapture(std::vector<std::shared_ptr<DCCaptureInfo>> & captureInfos)409 int32_t DCameraSourceDev::StartCapture(std::vector<std::shared_ptr<DCCaptureInfo>>& captureInfos)
410 {
411     HitraceAndHisyseventImpl(captureInfos);
412     DHLOGI("DCameraSourceDev Execute StartCapture devId %s dhId %s", GetAnonyString(devId_).c_str(),
413         GetAnonyString(dhId_).c_str());
414     int32_t ret = input_->StartCapture(captureInfos);
415     if (ret != DCAMERA_OK) {
416         DHLOGE("DCameraSourceDev input StartCapture failed ret: %d, devId: %s, dhId: %s", ret,
417             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
418         DcameraFinishAsyncTrace(DCAMERA_CONTINUE_FIRST_FRAME, DCAMERA_CONTINUE_FIRST_FRAME_TASKID);
419         DcameraFinishAsyncTrace(DCAMERA_SNAPSHOT_FIRST_FRAME, DCAMERA_SNAPSHOT_FIRST_FRAME_TASKID);
420         return ret;
421     }
422     std::vector<std::shared_ptr<DCameraCaptureInfo>> captures;
423     for (auto iter = captureInfos.begin(); iter != captureInfos.end(); iter++) {
424         std::shared_ptr<DCameraCaptureInfo> capture = std::make_shared<DCameraCaptureInfo>();
425         capture->width_ = (*iter)->width_;
426         capture->height_ = (*iter)->height_;
427         capture->format_ = (*iter)->format_;
428         capture->dataspace_ = (*iter)->dataspace_;
429         capture->isCapture_ = (*iter)->isCapture_;
430         capture->encodeType_ = (*iter)->encodeType_;
431         capture->streamType_ = (*iter)->type_;
432         DHLOGI("StartCapture devId %s dhId %s settings size: %d w: %d h: %d fmt: %d isC: %d enc: %d streamT: %d",
433             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), (*iter)->captureSettings_.size(),
434             capture->width_, capture->height_, capture->format_, capture->isCapture_ ? 1 : 0, capture->encodeType_,
435             capture->streamType_);
436         for (auto settingIter = (*iter)->captureSettings_.begin(); settingIter != (*iter)->captureSettings_.end();
437             settingIter++) {
438             std::shared_ptr<DCameraSettings> setting = std::make_shared<DCameraSettings>();
439             setting->type_ = settingIter->type_;
440             setting->value_ = settingIter->value_;
441             capture->captureSettings_.push_back(setting);
442         }
443         captures.push_back(capture);
444     }
445 
446     ret = controller_->StartCapture(captures);
447     if (ret != DCAMERA_OK) {
448         DHLOGE("DCameraSourceDev Execute StartCapture StartCapture failed, ret: %d, devId: %s dhId: %s", ret,
449             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
450         DcameraFinishAsyncTrace(DCAMERA_CONTINUE_FIRST_FRAME, DCAMERA_CONTINUE_FIRST_FRAME_TASKID);
451         DcameraFinishAsyncTrace(DCAMERA_SNAPSHOT_FIRST_FRAME, DCAMERA_SNAPSHOT_FIRST_FRAME_TASKID);
452     }
453     return ret;
454 }
455 
HitraceAndHisyseventImpl(std::vector<std::shared_ptr<DCCaptureInfo>> & captureInfos)456 void DCameraSourceDev::HitraceAndHisyseventImpl(std::vector<std::shared_ptr<DCCaptureInfo>>& captureInfos)
457 {
458     for (auto iter = captureInfos.begin(); iter != captureInfos.end(); iter++) {
459         std::shared_ptr<DCCaptureInfo> capture = *iter;
460         EventCaptureInfo eventCaptureInfo = {
461             .width_ = capture->width_,
462             .height_ = capture->height_,
463             .format_ = capture->format_,
464             .isCapture_ = capture->isCapture_,
465             .encodeType_ = capture->encodeType_,
466             .type_ = capture->type_,
467         };
468         ReportStartCaptureEvent(START_CAPTURE_EVENT, eventCaptureInfo, "execute start capture event.");
469         if (capture->type_ == CONTINUOUS_FRAME && capture->isCapture_ == true) {
470             DcameraStartAsyncTrace(DCAMERA_CONTINUE_FIRST_FRAME, DCAMERA_CONTINUE_FIRST_FRAME_TASKID);
471         } else if (capture->type_ == SNAPSHOT_FRAME && capture->isCapture_ == true) {
472             DcameraStartAsyncTrace(DCAMERA_SNAPSHOT_FIRST_FRAME, DCAMERA_SNAPSHOT_FIRST_FRAME_TASKID);
473         }
474     }
475 }
476 
StopCapture(std::vector<int> & streamIds,bool & isAllStop)477 int32_t DCameraSourceDev::StopCapture(std::vector<int>& streamIds, bool& isAllStop)
478 {
479     DHLOGI("DCameraSourceDev Execute StopCapture devId %s dhId %s", GetAnonyString(devId_).c_str(),
480         GetAnonyString(dhId_).c_str());
481     int32_t ret = input_->StopCapture(streamIds, isAllStop);
482     if (ret != DCAMERA_OK) {
483         DHLOGE("DCameraSourceDev Execute StopCapture input StopCapture failed, ret: %d, devId: %s dhId: %s", ret,
484             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
485     }
486     if (isAllStop) {
487         ret = controller_->StopCapture();
488         if (ret != DCAMERA_OK) {
489             DHLOGE("DCameraSourceDev Execute StopCapture controller StopCapture failed, ret: %d, devId: %s dhId: %s",
490                 ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
491         }
492     }
493     return DCAMERA_OK;
494 }
495 
StopAllCapture()496 int32_t DCameraSourceDev::StopAllCapture()
497 {
498     DHLOGI("DCameraSourceDev Execute StopAllCapture devId %s dhId %s", GetAnonyString(devId_).c_str(),
499         GetAnonyString(dhId_).c_str());
500     int32_t ret = input_->StopAllCapture();
501     if (ret != DCAMERA_OK) {
502         DHLOGE("DCameraSourceDev Execute StopAllCapture input StopAllCapture failed, ret: %d, devId: %s dhId: %s",
503             ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
504     }
505     ret = controller_->StopCapture();
506     if (ret != DCAMERA_OK) {
507         DHLOGE("DCameraSourceDev Execute StopAllCapture controller StopAllCapture failed, ret: %d, devId: %s dhId: %s",
508             ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
509     }
510     return DCAMERA_OK;
511 }
512 
UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>> & settings)513 int32_t DCameraSourceDev::UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>>& settings)
514 {
515     DHLOGI("DCameraSourceDev Execute UpdateSettings devId %s dhId %s", GetAnonyString(devId_).c_str(),
516         GetAnonyString(dhId_).c_str());
517     int32_t ret = input_->UpdateSettings(settings);
518     if (ret != DCAMERA_OK) {
519         DHLOGE("DCameraSourceDev Execute UpdateSettings input UpdateSettings failed, ret: %d, devId: %s dhId: %s", ret,
520             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
521         return ret;
522     }
523     ret = controller_->UpdateSettings(settings);
524     if (ret != DCAMERA_OK) {
525         DHLOGE("DCameraSourceDev Execute UpdateSettings controller UpdateSettings failed, ret: %d, devId: %s dhId: %s",
526             ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
527         return ret;
528     }
529     return DCAMERA_OK;
530 }
531 
CameraEventNotify(std::shared_ptr<DCameraEvent> & events)532 int32_t DCameraSourceDev::CameraEventNotify(std::shared_ptr<DCameraEvent>& events)
533 {
534     DHLOGI("DCameraSourceDev Execute CameraEventNotify devId %s dhId %s", GetAnonyString(devId_).c_str(),
535         GetAnonyString(dhId_).c_str());
536     int32_t ret = controller_->DCameraNotify(events);
537     if (ret != DCAMERA_OK) {
538         DHLOGE("DCameraSourceDev Execute CameraEventNotify DCameraNotify failed, ret: %d, devId: %s dhId: %s", ret,
539             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
540         return ret;
541     }
542     return DCAMERA_OK;
543 }
544 
NotifyResult(DCAMERA_EVENT eventType,DCameraSourceEvent & event,int32_t result)545 void DCameraSourceDev::NotifyResult(DCAMERA_EVENT eventType, DCameraSourceEvent& event, int32_t result)
546 {
547     auto itFunc = memberFuncMap_.find(eventType);
548     if (itFunc == memberFuncMap_.end()) {
549         DHLOGE("Notify func map not find, execute %d notify, devId: %s dhId: %s", eventType,
550             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
551         return;
552     }
553 
554     auto memberFunc = itFunc->second;
555     (this->*memberFunc)(eventType, event, result);
556     return;
557 }
558 
NotifyRegisterResult(DCAMERA_EVENT eventType,DCameraSourceEvent & event,int32_t result)559 void DCameraSourceDev::NotifyRegisterResult(DCAMERA_EVENT eventType, DCameraSourceEvent& event, int32_t result)
560 {
561     std::string data = "";
562     std::shared_ptr<DCameraRegistParam> param;
563     int32_t ret = event.GetDCameraRegistParam(param);
564     if (ret != DCAMERA_OK) {
565         return;
566     }
567 
568     if (stateListener_ == nullptr) {
569         DHLOGE("DCameraSourceDev can not get listener");
570         return;
571     }
572     if (eventType == DCAMERA_EVENT_REGIST) {
573         stateListener_->OnRegisterNotify(param->devId_, param->dhId_, param->reqId_, result, data);
574     } else {
575         stateListener_->OnUnregisterNotify(param->devId_, param->dhId_, param->reqId_, result, data);
576     }
577 }
578 
NotifyHalResult(DCAMERA_EVENT eventType,DCameraSourceEvent & event,int32_t result)579 void DCameraSourceDev::NotifyHalResult(DCAMERA_EVENT eventType, DCameraSourceEvent& event, int32_t result)
580 {
581     DHLOGI("DCameraSourceDev NotifyHalResult eventType: %d, result: %d devId: %s dhId: %s", eventType, result,
582         GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
583     if (result == DCAMERA_OK) {
584         return;
585     }
586 
587     std::shared_ptr<DCameraEvent> events = std::make_shared<DCameraEvent>();
588     events->eventType_ = DCAMERA_OPERATION;
589     auto iter = eventResultMap_.find(eventType);
590     if (iter == eventResultMap_.end()) {
591         return;
592     }
593     events->eventResult_ = iter->second;
594     CameraEventNotify(events);
595     return;
596 }
597 
GetStateInfo()598 int32_t DCameraSourceDev::GetStateInfo()
599 {
600     DHLOGI("GetStateInfo In state %d", stateMachine_->GetCameraState());
601     return stateMachine_->GetCameraState();
602 }
603 
GetVersion()604 std::string DCameraSourceDev::GetVersion()
605 {
606     return version_;
607 }
608 } // namespace DistributedHardware
609 } // namespace OHOS
610