• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 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, sinkAbilityInfo 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 
71     JSONCPP_STRING errs;
72     Json::CharReaderBuilder readerBuilder;
73     Json::Value rootValue;
74 
75     std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
76     if (!jsonReader->parse(abilityInfo.c_str(), abilityInfo.c_str() + abilityInfo.length(),
77         &rootValue, &errs) || !rootValue.isObject()) {
78         DHLOGE("Input sink ablity info is not json object.");
79         return DCamRetCode::INVALID_ARGUMENT;
80     }
81 
82     if (!rootValue["SinkAbility"].isObject() && !rootValue["SourceAbility"].isObject()) {
83         DHLOGE("Get ability error.");
84         return DCamRetCode::INVALID_ARGUMENT;
85     }
86     Json::Value sinkRootValue = rootValue["SinkAbility"];
87     Json::Value srcRootValue = rootValue["SourceAbility"];
88     std::string sinkAbilityInfo = sinkRootValue.toStyledString();
89     std::string sourceAbilityInfo = srcRootValue.toStyledString();
90 
91     DCamRetCode ret = dCameraHost->AddDCameraDevice(dhBase, sinkAbilityInfo, sourceAbilityInfo, callbackObj);
92     if (ret != DCamRetCode::SUCCESS) {
93         DHLOGE("DCameraProvider::EnableDCameraDevice failed, ret = %d.", ret);
94     }
95 
96     return ret;
97 }
98 
DisableDCameraDevice(const DHBase & dhBase)99 int32_t DCameraProvider::DisableDCameraDevice(const DHBase& dhBase)
100 {
101     if (IsDhBaseInfoInvalid(dhBase)) {
102         DHLOGE("DCameraProvider::DisableDCameraDevice, devId or dhId is invalid.");
103         return DCamRetCode::INVALID_ARGUMENT;
104     }
105     DHLOGI("DCameraProvider::DisableDCameraDevice for {devId: %s, dhId: %s}.",
106         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
107 
108     OHOS::sptr<DCameraHost> dCameraHost = DCameraHost::GetInstance();
109     if (dCameraHost == nullptr) {
110         DHLOGE("DCameraProvider::DisableDCameraDevice, dcamera host is null.");
111         return DCamRetCode::DEVICE_NOT_INIT;
112     }
113     DCamRetCode ret = dCameraHost->RemoveDCameraDevice(dhBase);
114     if (ret != DCamRetCode::SUCCESS) {
115         DHLOGE("DCameraProvider::DisableDCameraDevice failed, ret = %d.", ret);
116         return ret;
117     }
118 
119     return DCamRetCode::SUCCESS;
120 }
121 
AcquireBuffer(const DHBase & dhBase,int32_t streamId,DCameraBuffer & buffer)122 int32_t DCameraProvider::AcquireBuffer(const DHBase& dhBase, int32_t streamId, DCameraBuffer& buffer)
123 {
124     if (IsDhBaseInfoInvalid(dhBase)) {
125         DHLOGE("DCameraProvider::AcquireBuffer, devId or dhId is invalid.");
126         return DCamRetCode::INVALID_ARGUMENT;
127     }
128     if (streamId < 0) {
129         DHLOGE("DCameraProvider::AcquireBuffer, input streamId is invalid.");
130         return DCamRetCode::INVALID_ARGUMENT;
131     }
132 
133     DHLOGD("DCameraProvider::AcquireBuffer for {devId: %s, dhId: %s}, streamId: %d.",
134         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str(), streamId);
135 
136     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
137     if (device == nullptr) {
138         DHLOGE("DCameraProvider::AcquireBuffer failed, dcamera device not found.");
139         return DCamRetCode::INVALID_ARGUMENT;
140     }
141 
142     DCamRetCode ret = device->AcquireBuffer(streamId, buffer);
143     if (ret != DCamRetCode::SUCCESS) {
144         DHLOGE("DCameraProvider::AcquireBuffer failed, ret = %d.", ret);
145         return ret;
146     }
147     return DCamRetCode::SUCCESS;
148 }
149 
ShutterBuffer(const DHBase & dhBase,int32_t streamId,const DCameraBuffer & buffer)150 int32_t DCameraProvider::ShutterBuffer(const DHBase& dhBase, int32_t streamId, const DCameraBuffer& buffer)
151 {
152     if (IsDhBaseInfoInvalid(dhBase)) {
153         DHLOGE("DCameraProvider::ShutterBuffer, devId or dhId is invalid.");
154         return DCamRetCode::INVALID_ARGUMENT;
155     }
156     if (buffer.index_ < 0 || buffer.size_ < 0) {
157         DHLOGE("DCameraProvider::ShutterBuffer, input dcamera buffer is invalid.");
158         return DCamRetCode::INVALID_ARGUMENT;
159     }
160     if (streamId < 0) {
161         DHLOGE("DCameraProvider::ShutterBuffer, input streamId is invalid.");
162         return DCamRetCode::INVALID_ARGUMENT;
163     }
164 
165     DHLOGD("DCameraProvider::ShutterBuffer for {devId: %s, dhId: %s}, streamId = %d, buffer index = %d.",
166         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str(), streamId, buffer.index_);
167 
168     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
169     if (device == nullptr) {
170         DHLOGE("DCameraProvider::ShutterBuffer failed, dcamera device not found.");
171         return DCamRetCode::INVALID_ARGUMENT;
172     }
173     return device->ShutterBuffer(streamId, buffer);
174 }
175 
OnSettingsResult(const DHBase & dhBase,const DCameraSettings & result)176 int32_t DCameraProvider::OnSettingsResult(const DHBase& dhBase, const DCameraSettings& result)
177 {
178     if (IsDhBaseInfoInvalid(dhBase)) {
179         DHLOGE("DCameraProvider::OnSettingsResult, devId or dhId is invalid.");
180         return DCamRetCode::INVALID_ARGUMENT;
181     }
182     if (IsDCameraSettingsInvalid(result)) {
183         DHLOGE("DCameraProvider::OnSettingsResult, input dcamera settings is valid.");
184         return DCamRetCode::INVALID_ARGUMENT;
185     }
186     DHLOGI("DCameraProvider::OnSettingsResult for {devId: %s, dhId: %s}.",
187         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
188 
189     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
190     if (device == nullptr) {
191         DHLOGE("DCameraProvider::OnSettingsResult failed, dcamera device not found.");
192         return DCamRetCode::INVALID_ARGUMENT;
193     }
194 
195     std::shared_ptr<DCameraSettings> dCameraResult = std::make_shared<DCameraSettings>();
196     dCameraResult->type_ = result.type_;
197     dCameraResult->value_ = result.value_;
198     return device->OnSettingsResult(dCameraResult);
199 }
200 
Notify(const DHBase & dhBase,const DCameraHDFEvent & event)201 int32_t DCameraProvider::Notify(const DHBase& dhBase, const DCameraHDFEvent& event)
202 {
203     if (IsDhBaseInfoInvalid(dhBase)) {
204         DHLOGE("DCameraProvider::Notify, devId or dhId is invalid.");
205         return DCamRetCode::INVALID_ARGUMENT;
206     }
207     if (IsDCameraHDFEventInvalid(event)) {
208         DHLOGE("DCameraProvider::Notify, input dcamera hdf event is null.");
209         return DCamRetCode::INVALID_ARGUMENT;
210     }
211     DHLOGI("DCameraProvider::Notify for {devId: %s, dhId: %s}.",
212         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
213 
214     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
215     if (device == nullptr) {
216         DHLOGE("DCameraProvider::Notify failed, dcamera device not found.");
217         return DCamRetCode::INVALID_ARGUMENT;
218     }
219 
220     std::shared_ptr<DCameraHDFEvent> dCameraEvent = std::make_shared<DCameraHDFEvent>();
221     dCameraEvent->type_ = event.type_;
222     dCameraEvent->result_ = event.result_;
223     dCameraEvent->content_ = event.content_;
224     return device->Notify(dCameraEvent);
225 }
226 
OpenSession(const DHBase & dhBase)227 int32_t DCameraProvider::OpenSession(const DHBase &dhBase)
228 {
229     DHLOGI("DCameraProvider::OpenSession for {devId: %s, dhId: %s}.",
230         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
231 
232     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
233     if (callback == nullptr) {
234         DHLOGE("DCameraProvider::OpenSession, dcamera provider callback not found.");
235         return DCamRetCode::INVALID_ARGUMENT;
236     }
237 
238     return callback->OpenSession(dhBase);
239 }
240 
CloseSession(const DHBase & dhBase)241 int32_t DCameraProvider::CloseSession(const DHBase &dhBase)
242 {
243     DHLOGI("DCameraProvider::CloseSession for {devId: %s, dhId: %s}.",
244         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
245 
246     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
247     if (callback == nullptr) {
248         DHLOGE("DCameraProvider::CloseSession, dcamera provider callback not found.");
249         return DCamRetCode::INVALID_ARGUMENT;
250     }
251 
252     return callback->CloseSession(dhBase);
253 }
254 
ConfigureStreams(const DHBase & dhBase,const std::vector<DCStreamInfo> & streamInfos)255 int32_t DCameraProvider::ConfigureStreams(const DHBase &dhBase, const std::vector<DCStreamInfo> &streamInfos)
256 {
257     DHLOGI("DCameraProvider::ConfigureStreams for {devId: %s, dhId: %s}.",
258         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
259 
260     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
261     if (callback == nullptr) {
262         DHLOGE("DCameraProvider::ConfigStreams, dcamera provider callback not found.");
263         return DCamRetCode::INVALID_ARGUMENT;
264     }
265 
266     for (auto info = streamInfos.begin(); info != streamInfos.end(); info++) {
267         DHLOGI("ConfigureStreams: id=%d, width=%d, height=%d, format=%d, " +
268                "type=%d.", info->streamId_, info->width_, info->height_, info->format_, info->type_);
269     }
270     return callback->ConfigureStreams(dhBase, streamInfos);
271 }
272 
ReleaseStreams(const DHBase & dhBase,const std::vector<int> & streamIds)273 int32_t DCameraProvider::ReleaseStreams(const DHBase &dhBase, const std::vector<int> &streamIds)
274 {
275     DHLOGI("DCameraProvider::ReleaseStreams for {devId: %s, dhId: %s}.",
276         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
277 
278     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
279     if (callback == nullptr) {
280         DHLOGE("DCameraProvider::ReleaseStreams, dcamera provider callback not found.");
281         return DCamRetCode::INVALID_ARGUMENT;
282     }
283 
284     std::string idString = "";
285     for (int id : streamIds) {
286         idString += (std::to_string(id) + ", ");
287     }
288     DHLOGI("ReleaseStreams: ids=[%s].", idString.c_str());
289     return callback->ReleaseStreams(dhBase, streamIds);
290 }
291 
StartCapture(const DHBase & dhBase,const std::vector<DCCaptureInfo> & captureInfos)292 int32_t DCameraProvider::StartCapture(const DHBase &dhBase, const std::vector<DCCaptureInfo> &captureInfos)
293 {
294     DHLOGI("DCameraProvider::StartCapture for {devId: %s, dhId: %s}.",
295         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
296 
297     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
298     if (callback == nullptr) {
299         DHLOGE("DCameraProvider::StartCapture, dcamera provider callback not found.");
300         return DCamRetCode::INVALID_ARGUMENT;
301     }
302 
303     for (auto info = captureInfos.begin(); info != captureInfos.end(); info++) {
304         std::string idString = "";
305         for (int id : info->streamIds_) {
306             idString += (std::to_string(id) + ", ");
307         }
308         DHLOGI("DCameraProvider::StartCapture: ids=[%s], width=%d, height=%d, format=%d, type=%d, isCapture=%d.",
309             (idString.empty() ? idString.c_str() : (idString.substr(0, idString.length() - INGNORE_STR_LEN)).c_str()),
310             info->width_, info->height_, info->format_, info->type_, info->isCapture_);
311     }
312     return callback->StartCapture(dhBase, captureInfos);
313 }
314 
StopCapture(const DHBase & dhBase,const std::vector<int> & streamIds)315 int32_t DCameraProvider::StopCapture(const DHBase &dhBase, const std::vector<int> &streamIds)
316 {
317     DHLOGI("DCameraProvider::StopCapture for {devId: %s, dhId: %s}.",
318         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
319 
320     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
321     if (callback == nullptr) {
322         DHLOGE("DCameraProvider::StopCapture, dcamera provider callback not found.");
323         return DCamRetCode::INVALID_ARGUMENT;
324     }
325 
326     std::string idString = "";
327     for (int id : streamIds) {
328         idString += (std::to_string(id) + ", ");
329     }
330     DHLOGI("DCameraProvider::StopCapture: ids=[%s].",
331         idString.empty() ? idString.c_str() : (idString.substr(0, idString.length() - INGNORE_STR_LEN)).c_str());
332     return callback->StopCapture(dhBase, streamIds);
333 }
334 
UpdateSettings(const DHBase & dhBase,const std::vector<DCameraSettings> & settings)335 int32_t DCameraProvider::UpdateSettings(const DHBase &dhBase, const std::vector<DCameraSettings> &settings)
336 {
337     DHLOGI("DCameraProvider::UpdateSettings for {devId: %s, dhId: %s}.",
338         GetAnonyString(dhBase.deviceId_).c_str(), GetAnonyString(dhBase.dhId_).c_str());
339 
340     sptr<IDCameraProviderCallback> callback = GetCallbackBydhBase(dhBase);
341     if (callback == nullptr) {
342         DHLOGE("DCameraProvider::UpdateSettings, dcamera provider callback not found.");
343         return DCamRetCode::INVALID_ARGUMENT;
344     }
345 
346     return callback->UpdateSettings(dhBase, settings);
347 }
348 
IsDCameraSettingsInvalid(const DCameraSettings & result)349 bool DCameraProvider::IsDCameraSettingsInvalid(const DCameraSettings& result)
350 {
351     return result.value_.empty() || result.value_.length() > SETTING_VALUE_MAX_LENGTH;
352 }
353 
IsDCameraHDFEventInvalid(const DCameraHDFEvent & event)354 bool DCameraProvider::IsDCameraHDFEventInvalid(const DCameraHDFEvent& event)
355 {
356     return event.content_.length() > HDF_EVENT_CONTENT_MAX_LENGTH;
357 }
358 
GetCallbackBydhBase(const DHBase & dhBase)359 sptr<IDCameraProviderCallback> DCameraProvider::GetCallbackBydhBase(const DHBase &dhBase)
360 {
361     OHOS::sptr<DCameraDevice> device = GetDCameraDevice(dhBase);
362     if (device == nullptr) {
363         DHLOGE("DCameraProvider::GetCallbackBydhBase failed, dcamera device not found.");
364         return nullptr;
365     }
366     return device->GetProviderCallback();
367 }
368 
GetDCameraDevice(const DHBase & dhBase)369 OHOS::sptr<DCameraDevice> DCameraProvider::GetDCameraDevice(const DHBase &dhBase)
370 {
371     OHOS::sptr<DCameraHost> dCameraHost = DCameraHost::GetInstance();
372     if (dCameraHost == nullptr) {
373         DHLOGE("DCameraProvider::GetDCameraDevice, dcamera host is null.");
374         return nullptr;
375     }
376     return dCameraHost->GetDCameraDeviceByDHBase(dhBase);
377 }
378 } // namespace DistributedHardware
379 } // namespace OHOS
380