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_config_stream_state.h"
17
18 #include "dcamera_source_dev.h"
19 #include "dcamera_source_state_machine.h"
20 #include "distributed_camera_errno.h"
21 #include "distributed_hardware_log.h"
22
23 namespace OHOS {
24 namespace DistributedHardware {
DCameraSourceConfigStreamState(std::shared_ptr<DCameraSourceStateMachine> & stateMachine)25 DCameraSourceConfigStreamState::DCameraSourceConfigStreamState(std::shared_ptr<DCameraSourceStateMachine>& stateMachine)
26 : stateMachine_(stateMachine)
27 {
28 memberFuncMap_[DCAMERA_EVENT_REGIST] = &DCameraSourceConfigStreamState::DoRegisterTask;
29 memberFuncMap_[DCAMERA_EVENT_UNREGIST] = &DCameraSourceConfigStreamState::DoUnregisterTask;
30 memberFuncMap_[DCAMERA_EVENT_OPEN] = &DCameraSourceConfigStreamState::DoOpenTask;
31 memberFuncMap_[DCAMERA_EVENT_CLOSE] = &DCameraSourceConfigStreamState::DoCloseTask;
32 memberFuncMap_[DCAMERA_EVENT_CONFIG_STREAMS] = &DCameraSourceConfigStreamState::DoConfigStreamsTask;
33 memberFuncMap_[DCAMERA_EVENT_RELEASE_STREAMS] = &DCameraSourceConfigStreamState::DoReleaseStreamsTask;
34 memberFuncMap_[DCAMERA_EVENT_START_CAPTURE] = &DCameraSourceConfigStreamState::DoStartCaptureTask;
35 memberFuncMap_[DCAMERA_EVENT_STOP_CAPTURE] = &DCameraSourceConfigStreamState::DoStopCaptureTask;
36 memberFuncMap_[DCAMERA_EVENT_UPDATE_SETTINGS] = &DCameraSourceConfigStreamState::DoUpdateSettingsTask;
37 memberFuncMap_[DCAMERA_EVENT_NOFIFY] = &DCameraSourceConfigStreamState::DoEventNofityTask;
38 }
39
Execute(std::shared_ptr<DCameraSourceDev> & camDev,DCAMERA_EVENT eventType,DCameraSourceEvent & event)40 int32_t DCameraSourceConfigStreamState::Execute(std::shared_ptr<DCameraSourceDev>& camDev, DCAMERA_EVENT eventType,
41 DCameraSourceEvent& event)
42 {
43 auto itFunc = memberFuncMap_.find(eventType);
44 if (itFunc == memberFuncMap_.end()) {
45 DHLOGE("DCameraSourceConfigStreamState execute %d in wrong state", eventType);
46 return DCAMERA_WRONG_STATE;
47 }
48
49 auto memberFunc = itFunc->second;
50 int32_t ret = (this->*memberFunc)(camDev, event);
51 if (ret != DCAMERA_OK) {
52 DHLOGE("DCameraSourceConfigStreamState execute %d failed, ret: %d", eventType, ret);
53 }
54 return ret;
55 }
56
GetStateType()57 DCameraStateType DCameraSourceConfigStreamState::GetStateType()
58 {
59 return DCAMERA_STATE_CONFIG_STREAM;
60 }
61
DoRegisterTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)62 int32_t DCameraSourceConfigStreamState::DoRegisterTask(std::shared_ptr<DCameraSourceDev>& camDev,
63 DCameraSourceEvent& event)
64 {
65 DHLOGI("DCameraSourceConfigStreamState DoRegisterTask Idempotent");
66 return DCAMERA_OK;
67 }
68
DoUnregisterTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)69 int32_t DCameraSourceConfigStreamState::DoUnregisterTask(std::shared_ptr<DCameraSourceDev>& camDev,
70 DCameraSourceEvent& event)
71 {
72 std::shared_ptr<DCameraEvent> camEvent = std::make_shared<DCameraEvent>();
73 camEvent->eventType_ = DCAMERA_MESSAGE;
74 camEvent->eventResult_ = DCAMERA_EVENT_CHANNEL_DISCONNECTED;
75 int32_t ret = camDev->CameraEventNotify(camEvent);
76 if (ret != DCAMERA_OK) {
77 DHLOGE("DCameraSourceConfigStreamState DoUnregisterTask CameraEventNotify failed: %d", ret);
78 return ret;
79 }
80
81 ret = camDev->CloseCamera();
82 if (ret != DCAMERA_OK) {
83 DHLOGE("DCameraSourceConfigStreamState DoUnregisterTask CloseCamera failed, ret: %d", ret);
84 return ret;
85 }
86
87 ret = camDev->ReleaseAllStreams();
88 if (ret != DCAMERA_OK) {
89 DHLOGE("DCameraSourceConfigStreamState DoUnregisterTask ReleaseAllStreams failed, ret: %d", ret);
90 return ret;
91 }
92
93 std::shared_ptr<DCameraRegistParam> param;
94 ret = event.GetDCameraRegistParam(param);
95 if (ret != DCAMERA_OK) {
96 return ret;
97 }
98 ret = camDev->UnRegister(param);
99 if (ret != DCAMERA_OK) {
100 DHLOGE("DCameraSourceConfigStreamState DoUnregisterTask UnRegister failed: %d", ret);
101 return ret;
102 }
103 std::shared_ptr<DCameraSourceStateMachine> stateMachine = stateMachine_.lock();
104 if (stateMachine == nullptr) {
105 DHLOGE("DCameraSourceConfigStreamState DoUnregisterTask can not get stateMachine");
106 return DCAMERA_BAD_VALUE;
107 }
108 stateMachine->UpdateState(DCAMERA_STATE_INIT);
109 return DCAMERA_OK;
110 }
111
DoOpenTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)112 int32_t DCameraSourceConfigStreamState::DoOpenTask(std::shared_ptr<DCameraSourceDev>& camDev, DCameraSourceEvent& event)
113 {
114 DHLOGI("DCameraSourceConfigStreamState DoOpenTask Idempotent");
115 return DCAMERA_OK;
116 }
117
DoCloseTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)118 int32_t DCameraSourceConfigStreamState::DoCloseTask(std::shared_ptr<DCameraSourceDev>& camDev,
119 DCameraSourceEvent& event)
120 {
121 int32_t ret = camDev->CloseCamera();
122 if (ret != DCAMERA_OK) {
123 DHLOGE("DCameraSourceConfigStreamState CloseCamera failed, ret: %d", ret);
124 return ret;
125 }
126
127 ret = camDev->ReleaseAllStreams();
128 if (ret != DCAMERA_OK) {
129 DHLOGE("DCameraSourceConfigStreamState ReleaseAllStreams failed, ret: %d", ret);
130 return ret;
131 }
132 std::shared_ptr<DCameraSourceStateMachine> stateMachine = stateMachine_.lock();
133 if (stateMachine == nullptr) {
134 DHLOGE("DCameraSourceConfigStreamState DoOpenTask can not get stateMachine");
135 return DCAMERA_BAD_VALUE;
136 }
137 stateMachine->UpdateState(DCAMERA_STATE_REGIST);
138 return DCAMERA_OK;
139 }
140
DoConfigStreamsTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)141 int32_t DCameraSourceConfigStreamState::DoConfigStreamsTask(std::shared_ptr<DCameraSourceDev>& camDev,
142 DCameraSourceEvent& event)
143 {
144 std::vector<std::shared_ptr<DCStreamInfo>> streamInfos;
145 int32_t ret = event.GetStreamInfos(streamInfos);
146 if (ret != DCAMERA_OK) {
147 return ret;
148 }
149
150 ret = camDev->ConfigStreams(streamInfos);
151 if (ret != DCAMERA_OK) {
152 DHLOGE("DCameraSourceConfigStreamState ConfigStreams failed, ret: %d", ret);
153 return ret;
154 }
155
156 if (streamInfos.empty()) {
157 std::shared_ptr<DCameraSourceStateMachine> stateMachine = stateMachine_.lock();
158 if (stateMachine == nullptr) {
159 DHLOGE("DCameraSourceConfigStreamState DoOpenTask can not get stateMachine");
160 return DCAMERA_BAD_VALUE;
161 }
162 stateMachine->UpdateState(DCAMERA_STATE_OPENED);
163 }
164 return DCAMERA_OK;
165 }
166
DoReleaseStreamsTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)167 int32_t DCameraSourceConfigStreamState::DoReleaseStreamsTask(std::shared_ptr<DCameraSourceDev>& camDev,
168 DCameraSourceEvent& event)
169 {
170 std::vector<int> streamIds;
171 int32_t ret = event.GetStreamIds(streamIds);
172 if (ret != DCAMERA_OK) {
173 return ret;
174 }
175
176 bool isAllRelease = false;
177 ret = camDev->ReleaseStreams(streamIds, isAllRelease);
178 if (ret != DCAMERA_OK) {
179 DHLOGE("DCameraSourceConfigStreamState ReleaseStreams failed, ret: %d", ret);
180 return ret;
181 }
182
183 if (isAllRelease) {
184 std::shared_ptr<DCameraSourceStateMachine> stateMachine = stateMachine_.lock();
185 if (stateMachine == nullptr) {
186 DHLOGE("DCameraSourceConfigStreamState DoOpenTask can not get stateMachine");
187 return DCAMERA_BAD_VALUE;
188 }
189 stateMachine->UpdateState(DCAMERA_STATE_OPENED);
190 }
191 return DCAMERA_OK;
192 }
193
DoStartCaptureTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)194 int32_t DCameraSourceConfigStreamState::DoStartCaptureTask(std::shared_ptr<DCameraSourceDev>& camDev,
195 DCameraSourceEvent& event)
196 {
197 std::vector<std::shared_ptr<DCCaptureInfo>> captureInfos;
198 int32_t ret = event.GetCaptureInfos(captureInfos);
199 if (ret != DCAMERA_OK) {
200 return ret;
201 }
202
203 ret = camDev->StartCapture(captureInfos);
204 if (ret != DCAMERA_OK) {
205 DHLOGE("DCameraSourceConfigStreamState StartCapture failed, ret: %d", ret);
206 return ret;
207 }
208 std::shared_ptr<DCameraSourceStateMachine> stateMachine = stateMachine_.lock();
209 if (stateMachine == nullptr) {
210 DHLOGE("DCameraSourceConfigStreamState DoOpenTask can not get stateMachine");
211 return DCAMERA_BAD_VALUE;
212 }
213 stateMachine->UpdateState(DCAMERA_STATE_CAPTURE);
214 return DCAMERA_OK;
215 }
216
DoStopCaptureTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)217 int32_t DCameraSourceConfigStreamState::DoStopCaptureTask(std::shared_ptr<DCameraSourceDev>& camDev,
218 DCameraSourceEvent& event)
219 {
220 DHLOGI("DCameraSourceConfigStreamState DoStopCaptureTask Idempotent");
221 return DCAMERA_OK;
222 }
223
DoUpdateSettingsTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)224 int32_t DCameraSourceConfigStreamState::DoUpdateSettingsTask(std::shared_ptr<DCameraSourceDev>& camDev,
225 DCameraSourceEvent& event)
226 {
227 std::vector<std::shared_ptr<DCameraSettings>> settings;
228 int32_t ret = event.GetCameraSettings(settings);
229 if (ret != DCAMERA_OK) {
230 return ret;
231 }
232
233 ret = camDev->UpdateSettings(settings);
234 if (ret != DCAMERA_OK) {
235 DHLOGE("DCameraSourceConfigStreamState UpdateSettings failed, ret: %d", ret);
236 return ret;
237 }
238 return DCAMERA_OK;
239 }
240
DoEventNofityTask(std::shared_ptr<DCameraSourceDev> & camDev,DCameraSourceEvent & event)241 int32_t DCameraSourceConfigStreamState::DoEventNofityTask(std::shared_ptr<DCameraSourceDev>& camDev,
242 DCameraSourceEvent& event)
243 {
244 std::shared_ptr<DCameraEvent> camEvent;
245 int32_t ret = event.GetCameraEvent(camEvent);
246 if (ret != DCAMERA_OK) {
247 return ret;
248 }
249
250 ret = camDev->CameraEventNotify(camEvent);
251 if (ret != DCAMERA_OK) {
252 DHLOGE("DCameraSourceConfigStreamState CameraEventNotify failed, ret: %d", ret);
253 return ret;
254 }
255 return DCAMERA_OK;
256 }
257 } // namespace DistributedHardware
258 } // namespace OHOS
259