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