• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }