• 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_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