• 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     /* ShutterBuffer don't need buffer handle */
148     if (buffer.bufferHandle_ != nullptr) {
149         FreeBufferHandle(buffer.bufferHandle_->GetBufferHandle());
150     }
151     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
152     if (device == nullptr) {
153         DHLOGE("DCameraProvider::ShutterBuffer failed, dcamera device not found.");
154         return DCamRetCode::INVALID_ARGUMENT;
155     }
156     return device->ShutterBuffer(streamId, buffer);
157 }
158 
OnSettingsResult(const DHBase & dhBase,const DCameraSettings & result)159 int32_t DCameraProvider::OnSettingsResult(const DHBase& dhBase, const DCameraSettings& result)
160 {
161     if (IsDhBaseInfoInvalid(dhBase)) {
162         DHLOGE("DCameraProvider::OnSettingsResult, devId or dhId is invalid.");
163         return DCamRetCode::INVALID_ARGUMENT;
164     }
165     if (IsDCameraSettingsInvalid(result)) {
166         DHLOGE("DCameraProvider::OnSettingsResult, input dcamera settings is valid.");
167         return DCamRetCode::INVALID_ARGUMENT;
168     }
169     DHLOGI("DCameraProvider::OnSettingsResult for {devId: %s, dhId: %s}.",
170         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
171 
172     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
173     if (device == nullptr) {
174         DHLOGE("DCameraProvider::OnSettingsResult failed, dcamera device not found.");
175         return DCamRetCode::INVALID_ARGUMENT;
176     }
177 
178     std::shared_ptr<DCameraSettings> dCameraResult = std::make_shared<DCameraSettings>();
179     dCameraResult->type_ = result.type_;
180     dCameraResult->value_ = result.value_;
181     return device->OnSettingsResult(dCameraResult);
182 }
183 
Notify(const DHBase & dhBase,const DCameraHDFEvent & event)184 int32_t DCameraProvider::Notify(const DHBase& dhBase, const DCameraHDFEvent& event)
185 {
186     if (IsDhBaseInfoInvalid(dhBase)) {
187         DHLOGE("DCameraProvider::Notify, devId or dhId is invalid.");
188         return DCamRetCode::INVALID_ARGUMENT;
189     }
190     if (IsDCameraHDFEventInvalid(event)) {
191         DHLOGE("DCameraProvider::Notify, input dcamera hdf event is null.");
192         return DCamRetCode::INVALID_ARGUMENT;
193     }
194     DHLOGI("DCameraProvider::Notify for {devId: %s, dhId: %s}.",
195         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
196 
197     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
198     if (device == nullptr) {
199         DHLOGE("DCameraProvider::Notify failed, dcamera device not found.");
200         return DCamRetCode::INVALID_ARGUMENT;
201     }
202 
203     std::shared_ptr<DCameraHDFEvent> dCameraEvent = std::make_shared<DCameraHDFEvent>();
204     dCameraEvent->type_ = event.type_;
205     dCameraEvent->result_ = event.result_;
206     dCameraEvent->content_ = event.content_;
207     return device->Notify(dCameraEvent);
208 }
209 
OpenSession(const DHBase & dhBase)210 int32_t DCameraProvider::OpenSession(const DHBase &dhBase)
211 {
212     DHLOGI("DCameraProvider::OpenSession for {devId: %s, dhId: %s}.",
213         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
214 
215     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
216     if (callback == nullptr) {
217         DHLOGE("DCameraProvider::OpenSession, dcamera provider callback not found.");
218         return DCamRetCode::INVALID_ARGUMENT;
219     }
220 
221     return callback->OpenSession(dhBase);
222 }
223 
CloseSession(const DHBase & dhBase)224 int32_t DCameraProvider::CloseSession(const DHBase &dhBase)
225 {
226     DHLOGI("DCameraProvider::CloseSession for {devId: %s, dhId: %s}.",
227         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
228 
229     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
230     if (callback == nullptr) {
231         DHLOGE("DCameraProvider::CloseSession, dcamera provider callback not found.");
232         return DCamRetCode::INVALID_ARGUMENT;
233     }
234 
235     return callback->CloseSession(dhBase);
236 }
237 
ConfigureStreams(const DHBase & dhBase,const std::vector<DCStreamInfo> & streamInfos)238 int32_t DCameraProvider::ConfigureStreams(const DHBase &dhBase, const std::vector<DCStreamInfo> &streamInfos)
239 {
240     DHLOGI("DCameraProvider::ConfigureStreams for {devId: %s, dhId: %s}.",
241         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
242 
243     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
244     if (callback == nullptr) {
245         DHLOGE("DCameraProvider::ConfigStreams, dcamera provider callback not found.");
246         return DCamRetCode::INVALID_ARGUMENT;
247     }
248 
249     for (auto info = streamInfos.begin(); info != streamInfos.end(); info++) {
250         DHLOGI("ConfigureStreams: id=%d, width=%d, height=%d, format=%d, " +
251                "type=%d.", info->streamId_, info->width_, info->height_, info->format_, info->type_);
252     }
253     return callback->ConfigureStreams(dhBase, streamInfos);
254 }
255 
ReleaseStreams(const DHBase & dhBase,const std::vector<int> & streamIds)256 int32_t DCameraProvider::ReleaseStreams(const DHBase &dhBase, const std::vector<int> &streamIds)
257 {
258     DHLOGI("DCameraProvider::ReleaseStreams for {devId: %s, dhId: %s}.",
259         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
260 
261     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
262     if (callback == nullptr) {
263         DHLOGE("DCameraProvider::ReleaseStreams, dcamera provider callback not found.");
264         return DCamRetCode::INVALID_ARGUMENT;
265     }
266 
267     std::string idString = "";
268     for (int id : streamIds) {
269         idString += (std::to_string(id) + ", ");
270     }
271     DHLOGI("ReleaseStreams: ids=[%s].", idString.c_str());
272     return callback->ReleaseStreams(dhBase, streamIds);
273 }
274 
StartCapture(const DHBase & dhBase,const std::vector<DCCaptureInfo> & captureInfos)275 int32_t DCameraProvider::StartCapture(const DHBase &dhBase, const std::vector<DCCaptureInfo> &captureInfos)
276 {
277     DHLOGI("DCameraProvider::StartCapture for {devId: %s, dhId: %s}.",
278         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
279 
280     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
281     if (callback == nullptr) {
282         DHLOGE("DCameraProvider::StartCapture, dcamera provider callback not found.");
283         return DCamRetCode::INVALID_ARGUMENT;
284     }
285 
286     for (auto info = captureInfos.begin(); info != captureInfos.end(); info++) {
287         std::string idString = "";
288         for (int id : info->streamIds_) {
289             idString += (std::to_string(id) + ", ");
290         }
291         DHLOGI("DCameraProvider::StartCapture: ids=[%s], width=%d, height=%d, format=%d, type=%d, isCapture=%d.",
292             (idString.empty() ? idString.c_str() : (idString.substr(0, idString.length() - INGNORE_STR_LEN)).c_str()),
293             info->width_, info->height_, info->format_, info->type_, info->isCapture_);
294     }
295     return callback->StartCapture(dhBase, captureInfos);
296 }
297 
StopCapture(const DHBase & dhBase,const std::vector<int> & streamIds)298 int32_t DCameraProvider::StopCapture(const DHBase &dhBase, const std::vector<int> &streamIds)
299 {
300     DHLOGI("DCameraProvider::StopCapture for {devId: %s, dhId: %s}.",
301         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
302 
303     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
304     if (callback == nullptr) {
305         DHLOGE("DCameraProvider::StopCapture, dcamera provider callback not found.");
306         return DCamRetCode::INVALID_ARGUMENT;
307     }
308 
309     std::string idString = "";
310     for (int id : streamIds) {
311         idString += (std::to_string(id) + ", ");
312     }
313     DHLOGI("DCameraProvider::StopCapture: ids=[%s].",
314         idString.empty() ? idString.c_str() : (idString.substr(0, idString.length() - INGNORE_STR_LEN)).c_str());
315     return callback->StopCapture(dhBase, streamIds);
316 }
317 
UpdateSettings(const DHBase & dhBase,const std::vector<DCameraSettings> & settings)318 int32_t DCameraProvider::UpdateSettings(const DHBase &dhBase, const std::vector<DCameraSettings> &settings)
319 {
320     DHLOGI("DCameraProvider::UpdateSettings for {devId: %s, dhId: %s}.",
321         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
322 
323     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
324     if (callback == nullptr) {
325         DHLOGE("DCameraProvider::UpdateSettings, dcamera provider callback not found.");
326         return DCamRetCode::INVALID_ARGUMENT;
327     }
328 
329     return callback->UpdateSettings(dhBase, settings);
330 }
331 
IsDCameraSettingsInvalid(const DCameraSettings & result)332 bool DCameraProvider::IsDCameraSettingsInvalid(const DCameraSettings& result)
333 {
334     return result.value_.empty() || result.value_.length() > SETTING_VALUE_MAX_LENGTH;
335 }
336 
IsDCameraHDFEventInvalid(const DCameraHDFEvent & event)337 bool DCameraProvider::IsDCameraHDFEventInvalid(const DCameraHDFEvent& event)
338 {
339     return event.content_.length() > HDF_EVENT_CONTENT_MAX_LENGTH;
340 }
341 
GetCallbackBydhBase(const DHBase & dhBase)342 sptr<IDCameraProviderCallback> DCameraProvider::GetCallbackBydhBase(const DHBase &dhBase)
343 {
344     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
345     if (device == nullptr) {
346         DHLOGE("DCameraProvider::GetCallbackBydhBase failed, dcamera device not found.");
347         return nullptr;
348     }
349     return device->GetProviderCallback();
350 }
351 
GetDCameraDevice(const DHBase & dhBase)352 OHOS::sptr<DCameraDevice> DCameraProvider::GetDCameraDevice(const DHBase &dhBase)
353 {
354     OHOS::sptr<DCameraHost> dCameraHost = DCameraHost::GetInstance();
355     if (dCameraHost == nullptr) {
356         DHLOGE("DCameraProvider::GetDCameraDevice, dcamera host is null.");
357         return nullptr;
358     }
359     return dCameraHost->GetDCameraDeviceByDHBase(dhBase);
360 }
361 } // namespace DistributedHardware
362 } // namespace OHOS
363