• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 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 "anonymous_string.h"
17 #include "dcamera_channel_source_impl.h"
18 #include "dcamera_hitrace_adapter.h"
19 #include "dcamera_frame_info.h"
20 #include "dcamera_source_data_process.h"
21 #include "dcamera_source_event.h"
22 #include "dcamera_source_input.h"
23 #include "dcamera_source_input_channel_listener.h"
24 #include "dcamera_softbus_latency.h"
25 #include "distributed_camera_constants.h"
26 #include "distributed_hardware_log.h"
27 
28 namespace OHOS {
29 namespace DistributedHardware {
DCameraSourceInput(std::string devId,std::string dhId,std::shared_ptr<DCameraSourceDev> & camDev)30 DCameraSourceInput::DCameraSourceInput(std::string devId, std::string dhId, std::shared_ptr<DCameraSourceDev>& camDev)
31     : devId_(devId), dhId_(dhId), camDev_(camDev), isInit(false)
32 {
33     DHLOGI("DCameraSourceInput Constructor devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
34         GetAnonyString(dhId_).c_str());
35 }
36 
~DCameraSourceInput()37 DCameraSourceInput::~DCameraSourceInput()
38 {
39     DHLOGI("DCameraSourceInput Destructor devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
40         GetAnonyString(dhId_).c_str());
41     if (isInit) {
42         UnInit();
43     }
44 }
45 
ConfigStreams(std::vector<std::shared_ptr<DCStreamInfo>> & streamInfos)46 int32_t DCameraSourceInput::ConfigStreams(std::vector<std::shared_ptr<DCStreamInfo>>& streamInfos)
47 {
48     uint64_t infoSize = static_cast<uint64_t>(streamInfos.size());
49     DHLOGI("DCameraSourceInput ConfigStreams devId %{public}s dhId %{public}s, size: %{public}" PRIu64,
50         GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), infoSize);
51     int32_t ret = ReleaseAllStreams();
52     if (ret != DCAMERA_OK) {
53         DHLOGE("DCameraSourceInput ConfigStreams ReleaseAllStreams failed %{public}d devId: %{public}s, dhId: "
54             "%{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
55         return ret;
56     }
57     if (streamInfos.empty()) {
58         return DCAMERA_OK;
59     }
60     std::vector<std::shared_ptr<DCStreamInfo>> snapStreams;
61     std::vector<std::shared_ptr<DCStreamInfo>> continueStreams;
62     for (auto iter = streamInfos.begin(); iter != streamInfos.end(); iter++) {
63         std::shared_ptr<DCStreamInfo> streamInfo = *iter;
64         if (streamInfo == nullptr) {
65             DHLOGE("DCameraSourceInput ConfigStreams streamInfo is nullptr");
66             continue;
67         }
68         DHLOGI("DCameraSourceInput ConfigStreams devId: %{public}s, dhId: %{public}s, streamId: %{public}d, width: "
69             "%{public}d, height: %{public}d, format: %{public}d, dataspace: %{public}d, encodeType:%{public}d "
70             "streamType: %{public}d", GetAnonyString(devId_).c_str(),
71             GetAnonyString(dhId_).c_str(), streamInfo->streamId_, streamInfo->width_, streamInfo->height_,
72             streamInfo->format_, streamInfo->dataspace_, streamInfo->encodeType_, streamInfo->type_);
73         if (streamInfo->type_ == CONTINUOUS_FRAME) {
74             continueStreams.push_back(streamInfo);
75         }
76         if (streamInfo->type_ == SNAPSHOT_FRAME) {
77             snapStreams.push_back(streamInfo);
78         }
79     }
80     do {
81         ret = dataProcess_[CONTINUOUS_FRAME]->ConfigStreams(continueStreams);
82         if (ret != DCAMERA_OK) {
83             DHLOGE("DCameraSourceInput ConfigStreams continue failed %{public}d devId %{public}s dhId %{public}s", ret,
84                 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
85             break;
86         }
87         ret = dataProcess_[SNAPSHOT_FRAME]->ConfigStreams(snapStreams);
88         if (ret != DCAMERA_OK) {
89             DHLOGE("DCameraSourceInput ConfigStreams snapshot failed %{public}d devId %{public}s dhId %{public}s", ret,
90                 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
91             break;
92         }
93     } while (0);
94     if (ret != DCAMERA_OK) {
95         ReleaseAllStreams();
96     }
97     return ret;
98 }
99 
ReleaseStreams(std::vector<int> & streamIds,bool & isAllRelease)100 int32_t DCameraSourceInput::ReleaseStreams(std::vector<int>& streamIds, bool& isAllRelease)
101 {
102     DHLOGI("DCameraSourceInput ReleaseStreams devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
103         GetAnonyString(dhId_).c_str());
104     CHECK_AND_RETURN_RET_LOG(dataProcess_[CONTINUOUS_FRAME] == nullptr,
105         DCAMERA_BAD_VALUE, "DCameraSourceInput ReleaseStreams continuous frame dataProcess_ is nullptr");
106     CHECK_AND_RETURN_RET_LOG(dataProcess_[SNAPSHOT_FRAME] == nullptr,
107         DCAMERA_BAD_VALUE, "DCameraSourceInput ReleaseStreams snapshot frame dataProcess_ is nullptr");
108     int32_t ret = dataProcess_[CONTINUOUS_FRAME]->ReleaseStreams(streamIds);
109     if (ret != DCAMERA_OK) {
110         DHLOGE("DCameraSourceInput ReleaseStreams continue stream ReleaseStreams ret: %{public}d, devId: %{public}s,"
111             " dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
112         return ret;
113     }
114     ret = dataProcess_[SNAPSHOT_FRAME]->ReleaseStreams(streamIds);
115     if (ret != DCAMERA_OK) {
116         DHLOGE("DCameraSourceInput ReleaseStreams snapshot stream ReleaseStreams ret: %{public}d, devId: %{public}s, "
117             "dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
118         return ret;
119     }
120 
121     std::vector<int32_t> continueStreamIds;
122     dataProcess_[CONTINUOUS_FRAME]->GetAllStreamIds(continueStreamIds);
123     std::vector<int32_t> snapStreamIds;
124     dataProcess_[SNAPSHOT_FRAME]->GetAllStreamIds(snapStreamIds);
125     if (continueStreamIds.empty() && snapStreamIds.empty()) {
126         isAllRelease = true;
127     }
128     return DCAMERA_OK;
129 }
130 
StartCapture(std::vector<std::shared_ptr<DCCaptureInfo>> & captureInfos)131 int32_t DCameraSourceInput::StartCapture(std::vector<std::shared_ptr<DCCaptureInfo>>& captureInfos)
132 {
133     DHLOGI("DCameraSourceInput StartCapture devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
134         GetAnonyString(dhId_).c_str());
135     for (auto iter = captureInfos.begin(); iter != captureInfos.end(); iter++) {
136         int32_t ret = DCAMERA_OK;
137         if (*iter == nullptr) {
138             DHLOGE("DCameraSourceInput StartCapture captureInfo is nullptr");
139             continue;
140         }
141         for (auto iterSet = (*iter)->streamIds_.begin(); iterSet != (*iter)->streamIds_.end(); iterSet++) {
142             DHLOGI("DCameraSourceInput StartCapture devId %{public}s dhId %{public}s StartCapture id: %{public}d",
143                 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), *iterSet);
144         }
145         uint64_t idSize = static_cast<uint64_t>((*iter)->streamIds_.size());
146         DHLOGI("DCameraSourceInput StartCapture Inner devId %{public}s dhId %{public}s streamType: %{public}d "
147             "idSize: %{public}" PRIu64" isCap: %{public}d", GetAnonyString(devId_).c_str(),
148             GetAnonyString(dhId_).c_str(), (*iter)->type_, idSize, (*iter)->isCapture_ ? 1 : 0);
149         if (dataProcess_[(*iter)->type_] == nullptr) {
150             DHLOGE("DCameraSourceInput StartCapture dataProcess_ is nullptr");
151             continue;
152         }
153         ret = dataProcess_[(*iter)->type_]->StartCapture(*iter);
154         if (ret != DCAMERA_OK) {
155             DHLOGE("DCameraSourceInput StartCapture ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
156                 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
157             return ret;
158         }
159     }
160     return DCAMERA_OK;
161 }
162 
StopCapture(std::vector<int> & streamIds,bool & isAllStop)163 int32_t DCameraSourceInput::StopCapture(std::vector<int>& streamIds, bool& isAllStop)
164 {
165     DHLOGI("DCameraSourceInput StopCapture devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
166         GetAnonyString(dhId_).c_str());
167     CHECK_AND_RETURN_RET_LOG(dataProcess_[CONTINUOUS_FRAME] == nullptr,
168         DCAMERA_BAD_VALUE, "DCameraSourceInput StopCapture continuous frame dataProcess_ is nullptr");
169     int32_t ret = dataProcess_[CONTINUOUS_FRAME]->StopCapture(streamIds);
170     if (ret != DCAMERA_OK) {
171         DHLOGE("DCameraSourceInput StopCapture continue ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
172             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
173         return ret;
174     }
175 
176     int32_t size = dataProcess_[CONTINUOUS_FRAME]->GetProducerSize();
177     if (size == 0) {
178         CHECK_AND_RETURN_RET_LOG(dataProcess_[SNAPSHOT_FRAME] == nullptr,
179             DCAMERA_BAD_VALUE, "DCameraSourceInput StopCapture snapshot frame dataProcess_ is nullptr");
180         isAllStop = true;
181         std::vector<int> snapStreamIds;
182         dataProcess_[SNAPSHOT_FRAME]->GetAllStreamIds(snapStreamIds);
183         ret = dataProcess_[SNAPSHOT_FRAME]->StopCapture(snapStreamIds);
184         if (ret != DCAMERA_OK) {
185             DHLOGE("DCameraSourceInput StopCapture snapshot ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
186                 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
187             return ret;
188         }
189     }
190     return DCAMERA_OK;
191 }
192 
WaitForOpenChannelCompletion(bool needWait)193 int32_t DCameraSourceInput::WaitForOpenChannelCompletion(bool needWait)
194 {
195     DHLOGI("openChannel needWait: %{public}s", needWait ? "true" : "false");
196     if (needWait) {
197         std::unique_lock<std::mutex> lock(isOpenChannelMtx_);
198         bool timeOut = !isOpenChannelCond_.wait_for(lock, TIMEOUT_3_SEC, [this] {
199             return isOpenChannelFinished_.load();
200         });
201         if (timeOut) {
202             DHLOGE("openChannel timed out after 3 seconds.");
203             continuousFrameResult_.store(DCAMERA_BAD_VALUE);
204         }
205     }
206     DHLOGI("DCameraSourceInput OpenChannel finish devId %{public}s dhId %{public}s continue "
207         "state: %{public}d, snapshot state: %{public}d", GetAnonyString(devId_).c_str(),
208         GetAnonyString(dhId_).c_str(), channelState_[CONTINUOUS_FRAME], channelState_[SNAPSHOT_FRAME]);
209     const int32_t contRet = continuousFrameResult_.load();
210     if (contRet != DCAMERA_OK) {
211         return contRet;
212     }
213     const int32_t snapRet = snapshotFrameResult_.load();
214     if (snapRet != DCAMERA_OK) {
215         return snapRet;
216     }
217     return DCAMERA_OK;
218 }
219 
OpenChannel(std::vector<DCameraIndex> & indexs)220 int32_t DCameraSourceInput::OpenChannel(std::vector<DCameraIndex>& indexs)
221 {
222     DHLOGI("DCameraSourceInput OpenChannel devId %{public}s dhId %{public}s continue state: %{public}d, snapshot "
223         "state: %{public}d", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(),
224         channelState_[CONTINUOUS_FRAME], channelState_[SNAPSHOT_FRAME]);
225     bool needWait = false;
226     isOpenChannelFinished_.store(false);
227     const bool continuousNeeded = (channelState_[CONTINUOUS_FRAME] == DCAMERA_CHANNEL_STATE_DISCONNECTED);
228     const bool snapshotNeeded = (channelState_[SNAPSHOT_FRAME] == DCAMERA_CHANNEL_STATE_DISCONNECTED);
229     continuousFrameResult_.store(DCAMERA_OK);
230     snapshotFrameResult_.store(DCAMERA_OK);
231     if (continuousNeeded) {
232         needWait = true;
233         DHLOGI("openChannel starting continuous frame session establishment");
234         auto task = [&]() {
235             DHLOGI("openChannel continuous frame task started");
236             int32_t ret = EstablishContinuousFrameSession(indexs);
237             continuousFrameResult_.store(ret);
238             if (ret != DCAMERA_OK) {
239                 DHLOGE("esdablish continuous frame failed ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
240                     GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
241             }
242             {
243                 std::unique_lock<std::mutex> lock(isOpenChannelMtx_);
244                 isOpenChannelFinished_.store(true);
245             }
246             isOpenChannelCond_.notify_one();
247             DHLOGI("openChannel continuous frame task completed");
248         };
249         CHECK_AND_RETURN_RET_LOG(handler_ == nullptr, DCAMERA_BAD_VALUE,
250             "DCameraSourceInput OpenChannel handler is nullptr");
251         handler_->PostTask(task, "DCameraSourceInput:OpenChannel", 0, AppExecFwk::EventQueue::Priority::HIGH);
252     }
253     if (snapshotNeeded) {
254         DHLOGI("openChannel starting snapshot frame session establishment");
255         int32_t ret = EstablishSnapshotFrameSession(indexs);
256         snapshotFrameResult_.store(ret);
257         if (ret != DCAMERA_OK) {
258             DHLOGE("esdablish snapshot frame failed ret: %{public}d,"
259                 "devId: %{public}s, dhId: %{public}s", ret, GetAnonyString(devId_).c_str(),
260                 GetAnonyString(dhId_).c_str());
261         }
262     }
263     return WaitForOpenChannelCompletion(needWait);
264 }
265 
CloseChannel()266 int32_t DCameraSourceInput::CloseChannel()
267 {
268     DHLOGI("DCameraSourceInput CloseChannel devId %{public}s dhId %{public}s continue state: %{public}d, "
269         "snapshot state: %{public}d", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(),
270         channelState_[CONTINUOUS_FRAME], channelState_[SNAPSHOT_FRAME]);
271     if (channelState_[CONTINUOUS_FRAME] != DCAMERA_CHANNEL_STATE_DISCONNECTED) {
272         int32_t ret = DCAMERA_OK;
273         ret = channels_[CONTINUOUS_FRAME]->CloseSession();
274         if (ret != DCAMERA_OK) {
275             DHLOGE("DCameraSourceInput CloseChannel continue stream failed ret: %{public}d, devId: %{public}s, dhId: "
276                 "%{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
277         }
278         channelState_[CONTINUOUS_FRAME] = DCAMERA_CHANNEL_STATE_DISCONNECTED;
279 
280         ret = channels_[CONTINUOUS_FRAME]->ReleaseSession();
281         if (ret != DCAMERA_OK) {
282             DHLOGI("DCameraSourceInput release continue session failed: %{public}d devId %{public}s dhId %{public}s",
283                 ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
284         }
285     }
286 
287     if (channelState_[SNAPSHOT_FRAME] != DCAMERA_CHANNEL_STATE_DISCONNECTED) {
288         int32_t ret = DCAMERA_OK;
289         ret = channels_[SNAPSHOT_FRAME]->CloseSession();
290         if (ret != DCAMERA_OK) {
291             DHLOGE("DCameraSourceInput CloseChannel snapshot stream failed ret: %{public}d, devId: %{public}s, dhId: "
292                 "%{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
293         }
294         channelState_[SNAPSHOT_FRAME] = DCAMERA_CHANNEL_STATE_DISCONNECTED;
295 
296         ret = channels_[SNAPSHOT_FRAME]->ReleaseSession();
297         if (ret != DCAMERA_OK) {
298             DHLOGI("DCameraSourceInput release snapshot session failed: %{public}d devId %{public}s dhId %{public}s",
299                 ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
300         }
301     }
302     return DCAMERA_OK;
303 }
304 
Init()305 int32_t DCameraSourceInput::Init()
306 {
307     DHLOGI("DCameraSourceInput Init devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
308         GetAnonyString(dhId_).c_str());
309     auto input = std::shared_ptr<DCameraSourceInput>(shared_from_this());
310     std::shared_ptr<ICameraSourceDataProcess> conDataProcess = std::make_shared<DCameraSourceDataProcess>(devId_, dhId_,
311         CONTINUOUS_FRAME);
312     std::shared_ptr<ICameraChannel> continueCh = std::make_shared<DCameraChannelSourceImpl>();
313     std::shared_ptr<ICameraChannelListener> conListener =
314         std::make_shared<DCameraSourceInputChannelListener>(input, CONTINUOUS_FRAME);
315     channels_.emplace(CONTINUOUS_FRAME, continueCh);
316     listeners_.emplace(CONTINUOUS_FRAME, conListener);
317     dataProcess_.emplace(CONTINUOUS_FRAME, conDataProcess);
318     channelState_.emplace(CONTINUOUS_FRAME, DCAMERA_CHANNEL_STATE_DISCONNECTED);
319 
320     std::shared_ptr<ICameraSourceDataProcess> snapDataProcess = std::make_shared<DCameraSourceDataProcess>(devId_,
321         dhId_, SNAPSHOT_FRAME);
322     std::shared_ptr<ICameraChannel> snapShotCh = std::make_shared<DCameraChannelSourceImpl>();
323     std::shared_ptr<ICameraChannelListener> snapListener =
324         std::make_shared<DCameraSourceInputChannelListener>(input, SNAPSHOT_FRAME);
325     channels_.emplace(SNAPSHOT_FRAME, snapShotCh);
326     listeners_.emplace(SNAPSHOT_FRAME, snapListener);
327     dataProcess_.emplace(SNAPSHOT_FRAME, snapDataProcess);
328     channelState_.emplace(SNAPSHOT_FRAME, DCAMERA_CHANNEL_STATE_DISCONNECTED);
329     isInit = true;
330     DHLOGI("DCameraSourceInput Init devId end %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
331         GetAnonyString(dhId_).c_str());
332     return DCAMERA_OK;
333 }
334 
UnInit()335 int32_t DCameraSourceInput::UnInit()
336 {
337     DHLOGI("DCameraSourceInput UnInit devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
338         GetAnonyString(dhId_).c_str());
339     channels_.clear();
340     listeners_.clear();
341     dataProcess_.clear();
342     channelState_.clear();
343     isInit = false;
344     isChannelConnected_.store(false);
345     return DCAMERA_OK;
346 }
347 
UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>> & settings)348 int32_t DCameraSourceInput::UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>>& settings)
349 {
350     return DCAMERA_OK;
351 }
352 
OnSessionState(DCStreamType streamType,int32_t state)353 void DCameraSourceInput::OnSessionState(DCStreamType streamType, int32_t state)
354 {
355     DHLOGI("DCameraSourceInput OnSessionState devId: %{public}s, dhId: %{public}s, streamType: %{public}d, state: "
356         "%{public}d", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType, state);
357     channelState_[streamType] = (DCameraChannelState)state;
358     switch (state) {
359         case DCAMERA_CHANNEL_STATE_DISCONNECTED: {
360             FinshFrameAsyncTrace(streamType);
361             DHLOGI("DCameraSourceDev PostTask CloseSession Input OnClose devId %{public}s dhId %{public}s",
362                 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
363             isChannelConnected_.store(false);
364             PostChannelDisconnectedEvent();
365             break;
366         }
367         case DCAMERA_CHANNEL_STATE_CONNECTED: {
368             FinshFrameAsyncTrace(streamType);
369             isChannelConnected_.store(true);
370             channelCond_.notify_one();
371             DHLOGI("DCameraSourceInput OnSessionState state %{public}d", state);
372             break;
373         }
374         default: {
375             DHLOGI("DCameraSourceInput OnSessionState state %{public}d", state);
376             break;
377         }
378     }
379 }
380 
FinshFrameAsyncTrace(DCStreamType streamType)381 void DCameraSourceInput::FinshFrameAsyncTrace(DCStreamType streamType)
382 {
383     if (streamType == CONTINUOUS_FRAME) {
384         DcameraFinishAsyncTrace(DCAMERA_OPEN_DATA_CONTINUE, DCAMERA_OPEN_DATA_CONTINUE_TASKID);
385     } else if (streamType == SNAPSHOT_FRAME) {
386         DcameraFinishAsyncTrace(DCAMERA_OPEN_DATA_SNAPSHOT, DCAMERA_OPEN_DATA_SNAPSHOT_TASKID);
387     }
388 }
389 
OnSessionError(DCStreamType streamType,int32_t eventType,int32_t eventReason,std::string detail)390 void DCameraSourceInput::OnSessionError(DCStreamType streamType, int32_t eventType, int32_t eventReason,
391     std::string detail)
392 {
393     DHLOGI("DCameraSourceInput OnSessionError devId: %{public}s, dhId: %{public}s, eventType: %{public}d, "
394         "eventReason: %{public}d, detail %{public}s", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(),
395         eventType, eventReason, detail.c_str());
396     (void)streamType;
397 }
398 
OnDataReceived(DCStreamType streamType,std::vector<std::shared_ptr<DataBuffer>> & buffers)399 void DCameraSourceInput::OnDataReceived(DCStreamType streamType, std::vector<std::shared_ptr<DataBuffer>>& buffers)
400 {
401     CHECK_AND_RETURN_LOG(buffers[0] == nullptr, "the first buffer is nullptr.");
402     CHECK_AND_RETURN_LOG(dataProcess_[streamType] == nullptr, "dataProcess_ is nullptr.");
403     buffers[0]->frameInfo_.offset = DCameraSoftbusLatency::GetInstance().GetTimeSyncInfo(devId_);
404     int32_t ret = dataProcess_[streamType]->FeedStream(buffers);
405     if (ret != DCAMERA_OK) {
406         DHLOGE("OnDataReceived FeedStream %{public}d stream failed ret: %{public}d, devId: %{public}s, "
407             "dhId: %{public}s", streamType, ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
408     }
409 }
410 
ReleaseAllStreams()411 int32_t DCameraSourceInput::ReleaseAllStreams()
412 {
413     DHLOGI("ReleaseAllStreams devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
414         GetAnonyString(dhId_).c_str());
415     CHECK_AND_RETURN_RET_LOG(dataProcess_[CONTINUOUS_FRAME] == nullptr,
416         DCAMERA_BAD_VALUE, "DCameraSourceInput ReleaseAllStreams continuous frame dataProcess_ is nullptr");
417     CHECK_AND_RETURN_RET_LOG(dataProcess_[SNAPSHOT_FRAME] == nullptr,
418         DCAMERA_BAD_VALUE, "DCameraSourceInput ReleaseAllStreams snapshot frame dataProcess_ is nullptr");
419     std::vector<int> continueStreamIds;
420     dataProcess_[CONTINUOUS_FRAME]->GetAllStreamIds(continueStreamIds);
421     int32_t ret = dataProcess_[CONTINUOUS_FRAME]->ReleaseStreams(continueStreamIds);
422     if (ret != DCAMERA_OK) {
423         DHLOGE("continue stream ReleaseStreams ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
424             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
425         return ret;
426     }
427 
428     std::vector<int> snapStreamIds;
429     dataProcess_[SNAPSHOT_FRAME]->GetAllStreamIds(snapStreamIds);
430     ret = dataProcess_[SNAPSHOT_FRAME]->ReleaseStreams(snapStreamIds);
431     if (ret != DCAMERA_OK) {
432         DHLOGE("ReleaseAllStreams snapshot stream ReleaseStreams ret: %{public}d, devId: %{public}s, dhId: %{public}s",
433             ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
434         return ret;
435     }
436     return DCAMERA_OK;
437 }
438 
StopAllCapture()439 int32_t DCameraSourceInput::StopAllCapture()
440 {
441     DHLOGI("StopAllCapture devId %{public}s dhId %{public}s", GetAnonyString(devId_).c_str(),
442         GetAnonyString(dhId_).c_str());
443     std::vector<int> continueStreamIds;
444     CHECK_AND_RETURN_RET_LOG(dataProcess_[CONTINUOUS_FRAME] == nullptr,
445         DCAMERA_BAD_VALUE, "DCameraSourceInput StopAllCapture continuous frame dataProcess_ is nullptr");
446     CHECK_AND_RETURN_RET_LOG(dataProcess_[SNAPSHOT_FRAME] == nullptr,
447         DCAMERA_BAD_VALUE, "DCameraSourceInput StopAllCapture snapshot frame dataProcess_ is nullptr");
448     dataProcess_[CONTINUOUS_FRAME]->GetAllStreamIds(continueStreamIds);
449     int32_t ret = dataProcess_[CONTINUOUS_FRAME]->StopCapture(continueStreamIds);
450     if (ret != DCAMERA_OK) {
451         DHLOGE("StopAllCapture continue ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
452             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
453         return ret;
454     }
455 
456     std::vector<int> snapStreamIds;
457     dataProcess_[SNAPSHOT_FRAME]->GetAllStreamIds(snapStreamIds);
458     ret = dataProcess_[SNAPSHOT_FRAME]->StopCapture(snapStreamIds);
459     if (ret != DCAMERA_OK) {
460         DHLOGE("StopAllCapture snapshot ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
461             GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
462         return ret;
463     }
464     return DCAMERA_OK;
465 }
466 
PostChannelDisconnectedEvent()467 void DCameraSourceInput::PostChannelDisconnectedEvent()
468 {
469     std::shared_ptr<DCameraSourceDev> camDev = camDev_.lock();
470     if (camDev == nullptr) {
471         DHLOGE("DCameraSourceInput PostChannelDisconnectedEvent camDev is nullptr");
472         return;
473     }
474     camDev->OnChannelDisconnectedEvent();
475 }
476 
EstablishContinuousFrameSession(std::vector<DCameraIndex> & indexs)477 int32_t DCameraSourceInput::EstablishContinuousFrameSession(std::vector<DCameraIndex>& indexs)
478 {
479     DcameraStartAsyncTrace(DCAMERA_OPEN_DATA_CONTINUE, DCAMERA_OPEN_DATA_CONTINUE_TASKID);
480     int32_t ret = channels_[CONTINUOUS_FRAME]->CreateSession(indexs, CONTINUE_SESSION_FLAG, DCAMERA_SESSION_MODE_VIDEO,
481         listeners_[CONTINUOUS_FRAME]);
482     if (ret != DCAMERA_OK) {
483         DHLOGE("Create Session failed ret: %{public}d,"
484             "devId: %{public}s, dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
485         PostChannelDisconnectedEvent();
486         DcameraFinishAsyncTrace(DCAMERA_OPEN_DATA_CONTINUE, DCAMERA_OPEN_DATA_CONTINUE_TASKID);
487         return ret;
488     }
489     isChannelConnected_.store(false);
490     DcameraFinishAsyncTrace(DCAMERA_OPEN_DATA_CONTINUE, DCAMERA_OPEN_DATA_CONTINUE_TASKID);
491     return DCAMERA_OK;
492 }
493 
EstablishSnapshotFrameSession(std::vector<DCameraIndex> & indexs)494 int32_t DCameraSourceInput::EstablishSnapshotFrameSession(std::vector<DCameraIndex>& indexs)
495 {
496     DcameraStartAsyncTrace(DCAMERA_OPEN_DATA_SNAPSHOT, DCAMERA_OPEN_DATA_SNAPSHOT_TASKID);
497     int32_t ret = channels_[SNAPSHOT_FRAME]->CreateSession(indexs, SNAP_SHOT_SESSION_FLAG, DCAMERA_SESSION_MODE_JPEG,
498         listeners_[SNAPSHOT_FRAME]);
499     if (ret != DCAMERA_OK) {
500         DHLOGE("create session failed ret: %{public}d,"
501             "devId: %{public}s, dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
502         PostChannelDisconnectedEvent();
503         DcameraFinishAsyncTrace(DCAMERA_OPEN_DATA_SNAPSHOT, DCAMERA_OPEN_DATA_SNAPSHOT_TASKID);
504         return ret;
505     }
506     isChannelConnected_.store(false);
507     return DCAMERA_OK;
508 }
509 } // namespace DistributedHardware
510 } // namespace OHOS
511