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