1 /*
2 * Copyright (c) 2021 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_input.h"
17
18 #include "anonymous_string.h"
19 #include "distributed_camera_constants.h"
20 #include "distributed_camera_errno.h"
21 #include "distributed_hardware_log.h"
22
23 #include "dcamera_channel_source_impl.h"
24 #include "dcamera_source_data_process.h"
25 #include "dcamera_source_event.h"
26 #include "dcamera_source_input_channel_listener.h"
27
28 namespace OHOS {
29 namespace DistributedHardware {
DCameraSourceInput(std::string devId,std::string dhId,std::shared_ptr<EventBus> & eventBus)30 DCameraSourceInput::DCameraSourceInput(std::string devId, std::string dhId, std::shared_ptr<EventBus>& eventBus)
31 : devId_(devId), dhId_(dhId), eventBus_(eventBus), isInit(false), isCapture_(false)
32 {
33 DHLOGI("DCameraSourceInput Constructor devId %s dhId %s", GetAnonyString(devId_).c_str(),
34 GetAnonyString(dhId_).c_str());
35 }
36
~DCameraSourceInput()37 DCameraSourceInput::~DCameraSourceInput()
38 {
39 DHLOGI("DCameraSourceInput Destructor devId %s dhId %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 DHLOGI("DCameraSourceInput ConfigStreams devId %s dhId %s, size: %d", GetAnonyString(devId_).c_str(),
49 GetAnonyString(dhId_).c_str(), streamInfos.size());
50 int32_t ret = ReleaseAllStreams();
51 if (ret != DCAMERA_OK) {
52 DHLOGE("DCameraSourceInput ConfigStreams ReleaseAllStreams failed %d devId: %s, dhId: %s", ret,
53 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
54 return ret;
55 }
56
57 if (streamInfos.empty()) {
58 return DCAMERA_OK;
59 }
60
61 std::vector<std::shared_ptr<DCStreamInfo>> snapStreams;
62 std::vector<std::shared_ptr<DCStreamInfo>> continueStreams;
63 for (auto iter = streamInfos.begin(); iter != streamInfos.end(); iter++) {
64 std::shared_ptr<DCStreamInfo> streamInfo = *iter;
65 DHLOGI("DCameraSourceInput ConfigStreams devId: %s, dhId: %s, streamId: %d, width: %d, height: %d," +
66 "format: %d, dataspace: %d, encodeType:%d streamType: %d", GetAnonyString(devId_).c_str(),
67 GetAnonyString(dhId_).c_str(), streamInfo->streamId_, streamInfo->width_, streamInfo->height_,
68 streamInfo->format_, streamInfo->dataspace_, streamInfo->encodeType_, streamInfo->type_);
69 switch (streamInfo->type_) {
70 case CONTINUOUS_FRAME: {
71 continueStreams.push_back(streamInfo);
72 break;
73 }
74 case SNAPSHOT_FRAME: {
75 snapStreams.push_back(streamInfo);
76 break;
77 }
78 default:
79 break;
80 }
81 }
82
83 do {
84 ret = dataProcess_[CONTINUOUS_FRAME]->ConfigStreams(continueStreams);
85 if (ret != DCAMERA_OK) {
86 DHLOGE("DCameraSourceInput ConfigStreams continue failed %d devId %s dhId %s", ret,
87 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
88 break;
89 }
90 ret = dataProcess_[SNAPSHOT_FRAME]->ConfigStreams(snapStreams);
91 if (ret != DCAMERA_OK) {
92 DHLOGE("DCameraSourceInput ConfigStreams snapshot failed %d devId %s dhId %s", ret,
93 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
94 break;
95 }
96 } while (0);
97
98 if (ret != DCAMERA_OK) {
99 ReleaseAllStreams();
100 }
101 return ret;
102 }
103
ReleaseStreams(std::vector<int> & streamIds,bool & isAllRelease)104 int32_t DCameraSourceInput::ReleaseStreams(std::vector<int>& streamIds, bool& isAllRelease)
105 {
106 DHLOGI("DCameraSourceInput ReleaseStreams devId %s dhId %s", GetAnonyString(devId_).c_str(),
107 GetAnonyString(dhId_).c_str());
108 int32_t ret = dataProcess_[CONTINUOUS_FRAME]->ReleaseStreams(streamIds);
109 if (ret != DCAMERA_OK) {
110 DHLOGE("DCameraSourceInput ReleaseStreams continue stream ReleaseStreams ret: %d, devId: %s, dhId: %s", ret,
111 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: %d, devId: %s, dhId: %s", ret,
117 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_[CONTINUOUS_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 %s dhId %s", GetAnonyString(devId_).c_str(),
134 GetAnonyString(dhId_).c_str());
135 int32_t ret = DCAMERA_OK;
136 for (auto iter = captureInfos.begin(); iter != captureInfos.end(); iter++) {
137 for (auto iterSet = (*iter)->streamIds_.begin(); iterSet != (*iter)->streamIds_.end(); iterSet++) {
138 DHLOGI("DCameraSourceInput StartCapture devId %s dhId %s StartCapture id: %d",
139 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), *iterSet);
140 }
141 DHLOGI("DCameraSourceInput StartCapture Inner devId %s dhId %s streamType: %d idSize: %d isCap: %d",
142 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), (*iter)->type_, (*iter)->streamIds_.size(),
143 (*iter)->isCapture_ ? 1 : 0);
144 ret = dataProcess_[(*iter)->type_]->StartCapture(*iter);
145 if (ret != DCAMERA_OK) {
146 DHLOGE("DCameraSourceInput StartCapture ret: %d, devId: %s, dhId: %s", ret,
147 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
148 return ret;
149 }
150 }
151 std::lock_guard<std::mutex> autoLock(inputMutex_);
152 isCapture_ = true;
153 return DCAMERA_OK;
154 }
155
StopCapture()156 int32_t DCameraSourceInput::StopCapture()
157 {
158 DHLOGI("DCameraSourceInput StopCapture devId %s dhId %s", GetAnonyString(devId_).c_str(),
159 GetAnonyString(dhId_).c_str());
160 std::lock_guard<std::mutex> autoLock(inputMutex_);
161 isCapture_ = false;
162 int32_t ret = dataProcess_[CONTINUOUS_FRAME]->StopCapture();
163 if (ret != DCAMERA_OK) {
164 DHLOGE("DCameraSourceInput StopCapture continue ret: %d, devId: %s, dhId: %s", ret,
165 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
166 return ret;
167 }
168
169 ret = dataProcess_[SNAPSHOT_FRAME]->StopCapture();
170 if (ret != DCAMERA_OK) {
171 DHLOGE("DCameraSourceInput StopCapture snapshot ret: %d, devId: %s, dhId: %s", ret,
172 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
173 return ret;
174 }
175 return DCAMERA_OK;
176 }
177
OpenChannel(std::vector<DCameraIndex> & indexs)178 int32_t DCameraSourceInput::OpenChannel(std::vector<DCameraIndex>& indexs)
179 {
180 DHLOGI("DCameraSourceInput OpenChannel devId %s dhId %s continue state: %d, snapshot state: %d",
181 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), channelState_[CONTINUOUS_FRAME],
182 channelState_[SNAPSHOT_FRAME]);
183 int32_t ret = DCAMERA_OK;
184 if (channelState_[CONTINUOUS_FRAME] == DCAMERA_CHANNEL_STATE_DISCONNECTED) {
185 ret = channels_[CONTINUOUS_FRAME]->CreateSession(indexs, CONTINUE_SESSION_FLAG, DCAMERA_SESSION_MODE_VIDEO,
186 listeners_[CONTINUOUS_FRAME]);
187 if (ret != DCAMERA_OK) {
188 DHLOGE("DCameraSourceInput CreateSession continue failed ret: %d, devId: %s, dhId: %s", ret,
189 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
190 return ret;
191 }
192
193 ret = channels_[CONTINUOUS_FRAME]->OpenSession();
194 if (ret != DCAMERA_OK) {
195 DHLOGE("DCameraSourceInput OpenChannel continue stream failed ret: %d, devId: %s, dhId: %s", ret,
196 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
197 return ret;
198 }
199 }
200
201 if (channelState_[SNAPSHOT_FRAME] == DCAMERA_CHANNEL_STATE_DISCONNECTED) {
202 ret = channels_[SNAPSHOT_FRAME]->CreateSession(indexs, SNAP_SHOT_SESSION_FLAG, DCAMERA_SESSION_MODE_JPEG,
203 listeners_[SNAPSHOT_FRAME]);
204 if (ret != DCAMERA_OK) {
205 DHLOGE("DCameraSourceInput Init CreateSession snapshot failed ret: %d, devId: %s, dhId: %s", ret,
206 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
207 return ret;
208 }
209
210 ret = channels_[SNAPSHOT_FRAME]->OpenSession();
211 if (ret != DCAMERA_OK) {
212 DHLOGE("DCameraSourceInput OpenChannel snapshot stream failed ret: %d, devId: %s, dhId: %s", ret,
213 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
214 return ret;
215 }
216 }
217 return DCAMERA_OK;
218 }
219
CloseChannel()220 int32_t DCameraSourceInput::CloseChannel()
221 {
222 DHLOGI("DCameraSourceInput CloseChannel devId %s dhId %s continue state: %d, snapshot state: %d",
223 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), channelState_[CONTINUOUS_FRAME],
224 channelState_[SNAPSHOT_FRAME]);
225 int32_t ret = DCAMERA_OK;
226 if (channelState_[CONTINUOUS_FRAME] != DCAMERA_CHANNEL_STATE_DISCONNECTED) {
227 ret = channels_[CONTINUOUS_FRAME]->CloseSession();
228 if (ret != DCAMERA_OK) {
229 DHLOGE("DCameraSourceInput CloseChannel continue stream failed ret: %d, devId: %s, dhId: %s", ret,
230 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
231 }
232 channelState_[CONTINUOUS_FRAME] = DCAMERA_CHANNEL_STATE_DISCONNECTED;
233
234 ret = channels_[CONTINUOUS_FRAME]->ReleaseSession();
235 if (ret != DCAMERA_OK) {
236 DHLOGI("DCameraSourceInput release continue session failed: %d devId %s dhId %s", ret,
237 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
238 }
239 }
240
241 if (channelState_[SNAPSHOT_FRAME] != DCAMERA_CHANNEL_STATE_DISCONNECTED) {
242 ret = channels_[SNAPSHOT_FRAME]->CloseSession();
243 if (ret != DCAMERA_OK) {
244 DHLOGE("DCameraSourceInput CloseChannel snapshot stream failed ret: %d, devId: %s, dhId: %s", ret,
245 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
246 }
247 channelState_[SNAPSHOT_FRAME] = DCAMERA_CHANNEL_STATE_DISCONNECTED;
248
249 ret = channels_[SNAPSHOT_FRAME]->ReleaseSession();
250 if (ret != DCAMERA_OK) {
251 DHLOGI("DCameraSourceInput release snapshot session failed: %d devId %s dhId %s", ret,
252 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
253 }
254 }
255 return DCAMERA_OK;
256 }
257
Init()258 int32_t DCameraSourceInput::Init()
259 {
260 DHLOGI("DCameraSourceInput Init devId %s dhId %s", GetAnonyString(devId_).c_str(),
261 GetAnonyString(dhId_).c_str());
262 auto input = std::shared_ptr<DCameraSourceInput>(shared_from_this());
263 std::shared_ptr<ICameraSourceDataProcess> conDataProcess = std::make_shared<DCameraSourceDataProcess>(devId_, dhId_,
264 CONTINUOUS_FRAME);
265 std::shared_ptr<ICameraChannel> continueCh = std::make_shared<DCameraChannelSourceImpl>();
266 std::shared_ptr<ICameraChannelListener> conListener =
267 std::make_shared<DCameraSourceInputChannelListener>(input, CONTINUOUS_FRAME);
268 channels_.emplace(CONTINUOUS_FRAME, continueCh);
269 listeners_.emplace(CONTINUOUS_FRAME, conListener);
270 dataProcess_.emplace(CONTINUOUS_FRAME, conDataProcess);
271 channelState_.emplace(CONTINUOUS_FRAME, DCAMERA_CHANNEL_STATE_DISCONNECTED);
272
273 std::shared_ptr<ICameraSourceDataProcess> snapDataProcess = std::make_shared<DCameraSourceDataProcess>(devId_,
274 dhId_, SNAPSHOT_FRAME);
275 std::shared_ptr<ICameraChannel> snapShotCh = std::make_shared<DCameraChannelSourceImpl>();
276 std::shared_ptr<ICameraChannelListener> snapListener =
277 std::make_shared<DCameraSourceInputChannelListener>(input, SNAPSHOT_FRAME);
278 channels_.emplace(SNAPSHOT_FRAME, snapShotCh);
279 listeners_.emplace(SNAPSHOT_FRAME, snapListener);
280 dataProcess_.emplace(SNAPSHOT_FRAME, snapDataProcess);
281 channelState_.emplace(SNAPSHOT_FRAME, DCAMERA_CHANNEL_STATE_DISCONNECTED);
282 isInit = true;
283 DHLOGI("DCameraSourceInput Init devId end %s dhId %s", GetAnonyString(devId_).c_str(),
284 GetAnonyString(dhId_).c_str());
285 return DCAMERA_OK;
286 }
287
UnInit()288 int32_t DCameraSourceInput::UnInit()
289 {
290 DHLOGI("DCameraSourceInput UnInit devId %s dhId %s", GetAnonyString(devId_).c_str(),
291 GetAnonyString(dhId_).c_str());
292 channels_.clear();
293 listeners_.clear();
294 dataProcess_.clear();
295 channelState_.clear();
296 isInit = false;
297 return DCAMERA_OK;
298 }
299
UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>> & settings)300 int32_t DCameraSourceInput::UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>>& settings)
301 {
302 return DCAMERA_OK;
303 }
304
OnSessionState(DCStreamType streamType,int32_t state)305 void DCameraSourceInput::OnSessionState(DCStreamType streamType, int32_t state)
306 {
307 DHLOGI("DCameraSourceInput OnSessionState devId: %s, dhId: %s, streamType: %d, state: %d",
308 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType, state);
309 channelState_[streamType] = (DCameraChannelState)state;
310 switch (state) {
311 case DCAMERA_CHANNEL_STATE_DISCONNECTED: {
312 DHLOGI("DCameraSourceDev PostTask CloseSession Input OnClose devId %s dhId %s",
313 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
314 DCameraIndex camIndex(devId_, dhId_);
315 DCameraSourceEvent event(*this, DCAMERA_EVENT_CLOSE, camIndex);
316 eventBus_->PostEvent<DCameraSourceEvent>(event);
317 std::shared_ptr<DCameraEvent> camEvent = std::make_shared<DCameraEvent>();
318 camEvent->eventType_ = DCAMERA_MESSAGE;
319 camEvent->eventResult_ = DCAMERA_EVENT_CHANNEL_DISCONNECTED;
320 DCameraSourceEvent srcEvent(*this, DCAMERA_EVENT_NOFIFY, camEvent);
321 eventBus_->PostEvent<DCameraSourceEvent>(srcEvent);
322 break;
323 }
324 default: {
325 DHLOGI("DCameraSourceInput OnSessionState state %d", state);
326 break;
327 }
328 }
329 }
330
OnSessionError(DCStreamType streamType,int32_t eventType,int32_t eventReason,std::string detail)331 void DCameraSourceInput::OnSessionError(DCStreamType streamType, int32_t eventType, int32_t eventReason,
332 std::string detail)
333 {
334 DHLOGI("DCameraSourceInput OnSessionError devId: %s, dhId: %s, eventType: %d, eventReason: %d, detail %s",
335 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), eventType, eventReason, detail.c_str());
336 }
337
OnDataReceived(DCStreamType streamType,std::vector<std::shared_ptr<DataBuffer>> & buffers)338 void DCameraSourceInput::OnDataReceived(DCStreamType streamType, std::vector<std::shared_ptr<DataBuffer>>& buffers)
339 {
340 std::lock_guard<std::mutex> autoLock(inputMutex_);
341 if (!isCapture_) {
342 DHLOGE("DCameraSourceInput OnDataReceived FeedStream %d stream capture stop, devId: %s, dhId: %s", streamType,
343 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
344 return;
345 }
346 int32_t ret = dataProcess_[streamType]->FeedStream(buffers);
347 if (ret != DCAMERA_OK) {
348 DHLOGE("DCameraSourceInput OnDataReceived FeedStream %d stream failed ret: %d, devId: %s, dhId: %s", streamType,
349 ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
350 }
351 }
352
ReleaseAllStreams()353 int32_t DCameraSourceInput::ReleaseAllStreams()
354 {
355 DHLOGI("DCameraSourceInput ReleaseAllStreams devId %s dhId %s", GetAnonyString(devId_).c_str(),
356 GetAnonyString(dhId_).c_str());
357 std::vector<int> continueStreamIds;
358 dataProcess_[CONTINUOUS_FRAME]->GetAllStreamIds(continueStreamIds);
359 int32_t ret = dataProcess_[CONTINUOUS_FRAME]->ReleaseStreams(continueStreamIds);
360 if (ret != DCAMERA_OK) {
361 DHLOGE("DCameraSourceInput ReleaseAllStreams continue stream ReleaseStreams ret: %d, devId: %s, dhId: %s", ret,
362 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
363 return ret;
364 }
365
366 std::vector<int> snapStreamIds;
367 dataProcess_[SNAPSHOT_FRAME]->GetAllStreamIds(snapStreamIds);
368 ret = dataProcess_[SNAPSHOT_FRAME]->ReleaseStreams(snapStreamIds);
369 if (ret != DCAMERA_OK) {
370 DHLOGE("DCameraSourceInput ReleaseAllStreams snapshot stream ReleaseStreams ret: %d, devId: %s, dhId: %s", ret,
371 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
372 return ret;
373 }
374 return DCAMERA_OK;
375 }
376 }
377 }