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