• 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_provider.h"
17 #include "anonymous_string.h"
18 #include "constants.h"
19 #include "dcamera_device.h"
20 #include "dcamera_host.h"
21 #include "distributed_hardware_log.h"
22 #include "dcamera.h"
23 
24 namespace OHOS {
25 namespace DistributedHardware {
26 OHOS::sptr<DCameraProvider> DCameraProvider::instance_ = nullptr;
27 DCameraProvider::AutoRelease DCameraProvider::autoRelease_;
28 
HdiImplGetInstance(void)29 extern "C" IDCameraProvider *HdiImplGetInstance(void)
30 {
31     return static_cast<IDCameraProvider *>(DCameraProvider::GetInstance().GetRefPtr());
32 }
33 
GetInstance()34 OHOS::sptr<DCameraProvider> DCameraProvider::GetInstance()
35 {
36     if (instance_ == nullptr) {
37         instance_ = new DCameraProvider();
38         if (instance_ == nullptr) {
39             DHLOGE("Get distributed camera provider instance failed.");
40             return nullptr;
41         }
42     }
43     return instance_;
44 }
45 
EnableDCameraDevice(const DHBase & dhBase,const std::string & abilityInfo,const sptr<IDCameraProviderCallback> & callbackObj)46 int32_t DCameraProvider::EnableDCameraDevice(const DHBase& dhBase, const std::string& abilityInfo,
47     const sptr<IDCameraProviderCallback>& callbackObj)
48 {
49     if (IsDhBaseInfoInvalid(dhBase)) {
50         DHLOGE("DCameraProvider::EnableDCameraDevice, devId or dhId is invalid.");
51         return DCamRetCode::INVALID_ARGUMENT;
52     }
53     DHLOGI("DCameraProvider::EnableDCameraDevice for {devId: %s, dhId: %s, abilityInfo length: %d}.",
54         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str(), abilityInfo.length());
55 
56     if (abilityInfo.empty() || abilityInfo.length() > ABILITYINFO_MAX_LENGTH) {
57         DHLOGE("DCameraProvider::EnableDCameraDevice, dcamera ability is empty or over limit.");
58         return DCamRetCode::INVALID_ARGUMENT;
59     }
60     if (callbackObj == nullptr) {
61         DHLOGE("DCameraProvider::EnableDCameraDevice, dcamera provider callback is null.");
62         return DCamRetCode::INVALID_ARGUMENT;
63     }
64 
65     OHOS::sptr<DCameraHost> dCameraHost = DCameraHost::GetInstance();
66     if (dCameraHost == nullptr) {
67         DHLOGE("DCameraProvider::EnableDCameraDevice, dcamera host is null.");
68         return DCamRetCode::DEVICE_NOT_INIT;
69     }
70     DCamRetCode ret = dCameraHost->AddDCameraDevice(dhBase, abilityInfo, callbackObj);
71     if (ret != DCamRetCode::SUCCESS) {
72         DHLOGE("DCameraProvider::EnableDCameraDevice failed, ret = %d.", ret);
73     }
74 
75     return ret;
76 }
77 
DisableDCameraDevice(const DHBase & dhBase)78 int32_t DCameraProvider::DisableDCameraDevice(const DHBase& dhBase)
79 {
80     if (IsDhBaseInfoInvalid(dhBase)) {
81         DHLOGE("DCameraProvider::DisableDCameraDevice, devId or dhId is invalid.");
82         return DCamRetCode::INVALID_ARGUMENT;
83     }
84     DHLOGI("DCameraProvider::DisableDCameraDevice for {devId: %s, dhId: %s}.",
85         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
86 
87     OHOS::sptr<DCameraHost> dCameraHost = DCameraHost::GetInstance();
88     if (dCameraHost == nullptr) {
89         DHLOGE("DCameraProvider::DisableDCameraDevice, dcamera host is null.");
90         return DCamRetCode::DEVICE_NOT_INIT;
91     }
92     DCamRetCode ret = dCameraHost->RemoveDCameraDevice(dhBase);
93     if (ret != DCamRetCode::SUCCESS) {
94         DHLOGE("DCameraProvider::DisableDCameraDevice failed, ret = %d.", ret);
95         return ret;
96     }
97 
98     return DCamRetCode::SUCCESS;
99 }
100 
AcquireBuffer(const DHBase & dhBase,int32_t streamId,DCameraBuffer & buffer)101 int32_t DCameraProvider::AcquireBuffer(const DHBase& dhBase, int32_t streamId, DCameraBuffer& buffer)
102 {
103     if (IsDhBaseInfoInvalid(dhBase)) {
104         DHLOGE("DCameraProvider::AcquireBuffer, devId or dhId is invalid.");
105         return DCamRetCode::INVALID_ARGUMENT;
106     }
107     if (streamId < 0) {
108         DHLOGE("DCameraProvider::AcquireBuffer, input streamId is invalid.");
109         return DCamRetCode::INVALID_ARGUMENT;
110     }
111 
112     DHLOGD("DCameraProvider::AcquireBuffer for {devId: %s, dhId: %s}, streamId: %d.",
113         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str(), streamId);
114 
115     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
116     if (device == nullptr) {
117         DHLOGE("DCameraProvider::AcquireBuffer failed, dcamera device not found.");
118         return DCamRetCode::INVALID_ARGUMENT;
119     }
120 
121     DCamRetCode ret = device->AcquireBuffer(streamId, buffer);
122     if (ret != DCamRetCode::SUCCESS) {
123         DHLOGE("DCameraProvider::AcquireBuffer failed, ret = %d.", ret);
124         return ret;
125     }
126     return DCamRetCode::SUCCESS;
127 }
128 
ShutterBuffer(const DHBase & dhBase,int32_t streamId,const DCameraBuffer & buffer)129 int32_t DCameraProvider::ShutterBuffer(const DHBase& dhBase, int32_t streamId, const DCameraBuffer& buffer)
130 {
131     if (IsDhBaseInfoInvalid(dhBase)) {
132         DHLOGE("DCameraProvider::ShutterBuffer, devId or dhId is invalid.");
133         return DCamRetCode::INVALID_ARGUMENT;
134     }
135     if (buffer.index_ < 0 || buffer.size_ < 0) {
136         DHLOGE("DCameraProvider::ShutterBuffer, input dcamera buffer is invalid.");
137         return DCamRetCode::INVALID_ARGUMENT;
138     }
139     if (streamId < 0) {
140         DHLOGE("DCameraProvider::ShutterBuffer, input streamId is invalid.");
141         return DCamRetCode::INVALID_ARGUMENT;
142     }
143 
144     DHLOGD("DCameraProvider::ShutterBuffer for {devId: %s, dhId: %s}, streamId = %d, buffer index = %d.",
145         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str(), streamId, buffer.index_);
146 
147     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
148     if (device == nullptr) {
149         DHLOGE("DCameraProvider::ShutterBuffer failed, dcamera device not found.");
150         return DCamRetCode::INVALID_ARGUMENT;
151     }
152     return device->ShutterBuffer(streamId, buffer);
153 }
154 
OnSettingsResult(const DHBase & dhBase,const DCameraSettings & result)155 int32_t DCameraProvider::OnSettingsResult(const DHBase& dhBase, const DCameraSettings& result)
156 {
157     if (IsDhBaseInfoInvalid(dhBase)) {
158         DHLOGE("DCameraProvider::OnSettingsResult, devId or dhId is invalid.");
159         return DCamRetCode::INVALID_ARGUMENT;
160     }
161     if (IsDCameraSettingsInvalid(result)) {
162         DHLOGE("DCameraProvider::OnSettingsResult, input dcamera settings is valid.");
163         return DCamRetCode::INVALID_ARGUMENT;
164     }
165     DHLOGI("DCameraProvider::OnSettingsResult for {devId: %s, dhId: %s}.",
166         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
167 
168     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
169     if (device == nullptr) {
170         DHLOGE("DCameraProvider::OnSettingsResult failed, dcamera device not found.");
171         return DCamRetCode::INVALID_ARGUMENT;
172     }
173 
174     std::shared_ptr<DCameraSettings> dCameraResult = std::make_shared<DCameraSettings>();
175     dCameraResult->type_ = result.type_;
176     dCameraResult->value_ = result.value_;
177     return device->OnSettingsResult(dCameraResult);
178 }
179 
Notify(const DHBase & dhBase,const DCameraHDFEvent & event)180 int32_t DCameraProvider::Notify(const DHBase& dhBase, const DCameraHDFEvent& event)
181 {
182     if (IsDhBaseInfoInvalid(dhBase)) {
183         DHLOGE("DCameraProvider::Notify, devId or dhId is invalid.");
184         return DCamRetCode::INVALID_ARGUMENT;
185     }
186     if (IsDCameraHDFEventInvalid(event)) {
187         DHLOGE("DCameraProvider::Notify, input dcamera hdf event is null.");
188         return DCamRetCode::INVALID_ARGUMENT;
189     }
190     DHLOGI("DCameraProvider::Notify for {devId: %s, dhId: %s}.",
191         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
192 
193     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
194     if (device == nullptr) {
195         DHLOGE("DCameraProvider::Notify failed, dcamera device not found.");
196         return DCamRetCode::INVALID_ARGUMENT;
197     }
198 
199     std::shared_ptr<DCameraHDFEvent> dCameraEvent = std::make_shared<DCameraHDFEvent>();
200     dCameraEvent->type_ = event.type_;
201     dCameraEvent->result_ = event.result_;
202     dCameraEvent->content_ = event.content_;
203     return device->Notify(dCameraEvent);
204 }
205 
OpenSession(const DHBase & dhBase)206 int32_t DCameraProvider::OpenSession(const DHBase &dhBase)
207 {
208     DHLOGI("DCameraProvider::OpenSession for {devId: %s, dhId: %s}.",
209         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
210 
211     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
212     if (callback == nullptr) {
213         DHLOGE("DCameraProvider::OpenSession, dcamera provider callback not found.");
214         return DCamRetCode::INVALID_ARGUMENT;
215     }
216 
217     return callback->OpenSession(dhBase);
218 }
219 
CloseSession(const DHBase & dhBase)220 int32_t DCameraProvider::CloseSession(const DHBase &dhBase)
221 {
222     DHLOGI("DCameraProvider::CloseSession for {devId: %s, dhId: %s}.",
223         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
224 
225     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
226     if (callback == nullptr) {
227         DHLOGE("DCameraProvider::CloseSession, dcamera provider callback not found.");
228         return DCamRetCode::INVALID_ARGUMENT;
229     }
230 
231     return callback->CloseSession(dhBase);
232 }
233 
ConfigureStreams(const DHBase & dhBase,const std::vector<DCStreamInfo> & streamInfos)234 int32_t DCameraProvider::ConfigureStreams(const DHBase &dhBase, const std::vector<DCStreamInfo> &streamInfos)
235 {
236     DHLOGI("DCameraProvider::ConfigureStreams for {devId: %s, dhId: %s}.",
237         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
238 
239     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
240     if (callback == nullptr) {
241         DHLOGE("DCameraProvider::ConfigStreams, dcamera provider callback not found.");
242         return DCamRetCode::INVALID_ARGUMENT;
243     }
244 
245     for (auto info = streamInfos.begin(); info != streamInfos.end(); info++) {
246         DHLOGI("ConfigureStreams: id=%d, width=%d, height=%d, format=%d, " +
247                "type=%d.", info->streamId_, info->width_, info->height_, info->format_, info->type_);
248     }
249     return callback->ConfigureStreams(dhBase, streamInfos);
250 }
251 
ReleaseStreams(const DHBase & dhBase,const std::vector<int> & streamIds)252 int32_t DCameraProvider::ReleaseStreams(const DHBase &dhBase, const std::vector<int> &streamIds)
253 {
254     DHLOGI("DCameraProvider::ReleaseStreams for {devId: %s, dhId: %s}.",
255         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
256 
257     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
258     if (callback == nullptr) {
259         DHLOGE("DCameraProvider::ReleaseStreams, dcamera provider callback not found.");
260         return DCamRetCode::INVALID_ARGUMENT;
261     }
262 
263     std::string idString = "";
264     for (int id : streamIds) {
265         idString += (std::to_string(id) + ", ");
266     }
267     DHLOGI("ReleaseStreams: ids=[%s].", idString.c_str());
268     return callback->ReleaseStreams(dhBase, streamIds);
269 }
270 
StartCapture(const DHBase & dhBase,const std::vector<DCCaptureInfo> & captureInfos)271 int32_t DCameraProvider::StartCapture(const DHBase &dhBase, const std::vector<DCCaptureInfo> &captureInfos)
272 {
273     DHLOGI("DCameraProvider::StartCapture for {devId: %s, dhId: %s}.",
274         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
275 
276     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
277     if (callback == nullptr) {
278         DHLOGE("DCameraProvider::StartCapture, dcamera provider callback not found.");
279         return DCamRetCode::INVALID_ARGUMENT;
280     }
281 
282     for (auto info = captureInfos.begin(); info != captureInfos.end(); info++) {
283         std::string idString = "";
284         for (int id : info->streamIds_) {
285             idString += (std::to_string(id) + ", ");
286         }
287         DHLOGI("DCameraProvider::StartCapture: ids=[%s], width=%d, height=%d, format=%d, type=%d, isCapture=%d.",
288             (idString.empty() ? idString.c_str() : (idString.substr(0, idString.length() - INGNORE_STR_LEN)).c_str()),
289             info->width_, info->height_, info->format_, info->type_, info->isCapture_);
290     }
291     return callback->StartCapture(dhBase, captureInfos);
292 }
293 
StopCapture(const DHBase & dhBase,const std::vector<int> & streamIds)294 int32_t DCameraProvider::StopCapture(const DHBase &dhBase, const std::vector<int> &streamIds)
295 {
296     DHLOGI("DCameraProvider::StopCapture for {devId: %s, dhId: %s}.",
297         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
298 
299     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
300     if (callback == nullptr) {
301         DHLOGE("DCameraProvider::StopCapture, dcamera provider callback not found.");
302         return DCamRetCode::INVALID_ARGUMENT;
303     }
304 
305     std::string idString = "";
306     for (int id : streamIds) {
307         idString += (std::to_string(id) + ", ");
308     }
309     DHLOGI("DCameraProvider::StopCapture: ids=[%s].",
310         idString.empty() ? idString.c_str() : (idString.substr(0, idString.length() - INGNORE_STR_LEN)).c_str());
311     return callback->StopCapture(dhBase, streamIds);
312 }
313 
UpdateSettings(const DHBase & dhBase,const std::vector<DCameraSettings> & settings)314 int32_t DCameraProvider::UpdateSettings(const DHBase &dhBase, const std::vector<DCameraSettings> &settings)
315 {
316     DHLOGI("DCameraProvider::UpdateSettings for {devId: %s, dhId: %s}.",
317         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
318 
319     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
320     if (callback == nullptr) {
321         DHLOGE("DCameraProvider::UpdateSettings, dcamera provider callback not found.");
322         return DCamRetCode::INVALID_ARGUMENT;
323     }
324 
325     return callback->UpdateSettings(dhBase, settings);
326 }
327 
IsDCameraSettingsInvalid(const DCameraSettings & result)328 bool DCameraProvider::IsDCameraSettingsInvalid(const DCameraSettings& result)
329 {
330     return result.value_.empty() || result.value_.length() > SETTING_VALUE_MAX_LENGTH;
331 }
332 
IsDCameraHDFEventInvalid(const DCameraHDFEvent & event)333 bool DCameraProvider::IsDCameraHDFEventInvalid(const DCameraHDFEvent& event)
334 {
335     return event.content_.length() > HDF_EVENT_CONTENT_MAX_LENGTH;
336 }
337 
GetCallbackBydhBase(const DHBase & dhBase)338 sptr<IDCameraProviderCallback> DCameraProvider::GetCallbackBydhBase(const DHBase &dhBase)
339 {
340     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
341     if (device == nullptr) {
342         DHLOGE("DCameraProvider::GetCallbackBydhBase failed, dcamera device not found.");
343         return nullptr;
344     }
345     return device->GetProviderCallback();
346 }
347 
GetDCameraDevice(const DHBase & dhBase)348 OHOS::sptr<DCameraDevice> DCameraProvider::GetDCameraDevice(const DHBase &dhBase)
349 {
350     OHOS::sptr<DCameraHost> dCameraHost = DCameraHost::GetInstance();
351     if (dCameraHost == nullptr) {
352         DHLOGE("DCameraProvider::GetDCameraDevice, dcamera host is null.");
353         return nullptr;
354     }
355     return dCameraHost->GetDCameraDeviceByDHBase(dhBase);
356 }
357 } // namespace DistributedHardware
358 } // namespace OHOS
359