1 /*
2 * Copyright (c) 2021-2023 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_sink_controller.h"
17
18 #include <securec.h>
19 #include <thread>
20
21 #include "anonymous_string.h"
22 #include "dcamera_channel_sink_impl.h"
23 #include "dcamera_client.h"
24 #include "dcamera_metadata_setting_cmd.h"
25 #include "dcamera_protocol.h"
26 #include "dcamera_utils_tools.h"
27
28 #include "dcamera_sink_access_control.h"
29 #include "dcamera_sink_controller_channel_listener.h"
30 #include "dcamera_sink_controller_state_callback.h"
31 #include "dcamera_sink_output.h"
32 #include "dcamera_sink_service_ipc.h"
33
34 #include "distributed_camera_constants.h"
35 #include "distributed_camera_errno.h"
36 #include "distributed_hardware_log.h"
37 #include "idistributed_camera_source.h"
38 #include "json/json.h"
39 #include "dcamera_low_latency.h"
40 #include <sys/prctl.h>
41
42 namespace OHOS {
43 namespace DistributedHardware {
DCameraSinkController(std::shared_ptr<ICameraSinkAccessControl> & accessControl)44 DCameraSinkController::DCameraSinkController(std::shared_ptr<ICameraSinkAccessControl>& accessControl)
45 : isInit_(false), sessionState_(DCAMERA_CHANNEL_STATE_DISCONNECTED), accessControl_(accessControl)
46 {
47 }
48
~DCameraSinkController()49 DCameraSinkController::~DCameraSinkController()
50 {
51 if (isInit_) {
52 UnInit();
53 }
54 }
55
StartCapture(std::vector<std::shared_ptr<DCameraCaptureInfo>> & captureInfos)56 int32_t DCameraSinkController::StartCapture(std::vector<std::shared_ptr<DCameraCaptureInfo>>& captureInfos)
57 {
58 DHLOGI("StartCapture dhId: %s", GetAnonyString(dhId_).c_str());
59 std::string accessType = "";
60 if ((accessControl_->IsSensitiveSrcAccess(SRC_TYPE)) &&
61 (accessControl_->GetAccessControlType(accessType) == DCAMERA_SAME_ACCOUNT)) {
62 int32_t ret = StartCaptureInner(captureInfos);
63 if (ret == DCAMERA_OK) {
64 accessControl_->NotifySensitiveSrc(SRC_TYPE);
65 }
66 return ret;
67 } else {
68 std::string param = "";
69 DCameraFrameTriggerEvent triggerEvent(*this, param);
70 DCameraPostAuthorizationEvent authEvent(*this, captureInfos);
71 eventBus_->PostEvent<DCameraFrameTriggerEvent>(triggerEvent, POSTMODE::POST_ASYNC);
72 eventBus_->PostEvent<DCameraPostAuthorizationEvent>(authEvent, POSTMODE::POST_ASYNC);
73 }
74 return DCAMERA_OK;
75 }
76
StopCapture()77 int32_t DCameraSinkController::StopCapture()
78 {
79 DHLOGI("StopCapture dhId: %s", GetAnonyString(dhId_).c_str());
80 std::lock_guard<std::mutex> autoLock(captureLock_);
81 int32_t ret = operator_->StopCapture();
82 if (ret != DCAMERA_OK) {
83 DHLOGE("client stop capture failed, dhId: %s, ret: %d",
84 GetAnonyString(dhId_).c_str(), ret);
85 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_DEVICE_ERROR, std::string("operator stop capture failed."));
86 return ret;
87 }
88
89 ret = output_->StopCapture();
90 if (ret != DCAMERA_OK) {
91 DHLOGE("output stop capture failed, dhId: %s, ret: %d",
92 GetAnonyString(dhId_).c_str(), ret);
93 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_DEVICE_ERROR, std::string("output stop capture failed"));
94 return ret;
95 }
96
97 DHLOGI("StopCapture %s success", GetAnonyString(dhId_).c_str());
98 return DCAMERA_OK;
99 }
100
ChannelNeg(std::shared_ptr<DCameraChannelInfo> & info)101 int32_t DCameraSinkController::ChannelNeg(std::shared_ptr<DCameraChannelInfo>& info)
102 {
103 DHLOGI("ChannelNeg dhId: %s", GetAnonyString(dhId_).c_str());
104 int32_t ret = output_->OpenChannel(info);
105 if (ret != DCAMERA_OK) {
106 DHLOGE("channel negotiate failed, dhId: %s, ret: %d", GetAnonyString(dhId_).c_str(), ret);
107 return ret;
108 }
109
110 DHLOGI("ChannelNeg %s success", GetAnonyString(dhId_).c_str());
111 return DCAMERA_OK;
112 }
113
DCameraNotify(std::shared_ptr<DCameraEvent> & events)114 int32_t DCameraSinkController::DCameraNotify(std::shared_ptr<DCameraEvent>& events)
115 {
116 DHLOGI("DCameraNotify dhId: %s", GetAnonyString(dhId_).c_str());
117 if (srcDevId_.empty()) {
118 DHLOGE("source deviceId is empty");
119 return DCAMERA_BAD_VALUE;
120 }
121
122 sptr<IDistributedCameraSource> sourceSA = DCameraSinkServiceIpc::GetInstance().GetSourceRemoteCamSrv(srcDevId_);
123 if (sourceSA == nullptr) {
124 DHLOGE("sourceSA is null");
125 return DCAMERA_BAD_VALUE;
126 }
127
128 DCameraEventCmd eventCmd;
129 std::string jsonStr = "";
130 eventCmd.type_ = DCAMERA_PROTOCOL_TYPE_MESSAGE;
131 eventCmd.dhId_ = dhId_;
132 eventCmd.command_ = DCAMERA_PROTOCOL_CMD_STATE_NOTIFY;
133 eventCmd.value_ = events;
134 int32_t ret = eventCmd.Marshal(jsonStr);
135 if (ret != DCAMERA_OK) {
136 DHLOGE("DCameraEventCmd marshal failed, dhId: %s, ret: %d",
137 GetAnonyString(dhId_).c_str(), ret);
138 return ret;
139 }
140
141 std::string sinkDevId;
142 ret = GetLocalDeviceNetworkId(sinkDevId);
143 if (ret != DCAMERA_OK) {
144 DHLOGE("GetLocalDeviceNetworkId failed, devId: %s, dhId: %s, ret: %d",
145 GetAnonyString(sinkDevId).c_str(), GetAnonyString(dhId_).c_str(), ret);
146 return ret;
147 }
148
149 ret = sourceSA->DCameraNotify(sinkDevId, dhId_, jsonStr);
150 if (ret != DCAMERA_OK) {
151 DHLOGE("SourceSA notify failed, srcId: %s, sinkId: %s, dhId: %s, ret: %d",
152 GetAnonyString(srcDevId_).c_str(), GetAnonyString(sinkDevId).c_str(),
153 GetAnonyString(dhId_).c_str(), ret);
154 return ret;
155 }
156
157 DHLOGI("DCameraNotify %s success", GetAnonyString(dhId_).c_str());
158 return DCAMERA_OK;
159 }
160
UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>> & settings)161 int32_t DCameraSinkController::UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>>& settings)
162 {
163 DHLOGI("UpdateSettings dhId: %s", GetAnonyString(dhId_).c_str());
164 int32_t ret = operator_->UpdateSettings(settings);
165 if (ret != DCAMERA_OK) {
166 DHLOGE("UpdateSettings failed, dhId: %s, ret: %d", GetAnonyString(dhId_).c_str(), ret);
167 return ret;
168 }
169
170 DHLOGI("UpdateSettings %s success", GetAnonyString(dhId_).c_str());
171 return DCAMERA_OK;
172 }
173
GetCameraInfo(std::shared_ptr<DCameraInfo> & camInfo)174 int32_t DCameraSinkController::GetCameraInfo(std::shared_ptr<DCameraInfo>& camInfo)
175 {
176 DHLOGI("GetCameraInfo dhId: %s, session state: %d", GetAnonyString(dhId_).c_str(), sessionState_);
177 camInfo->state_ = sessionState_;
178 return DCAMERA_OK;
179 }
180
OpenChannel(std::shared_ptr<DCameraOpenInfo> & openInfo)181 int32_t DCameraSinkController::OpenChannel(std::shared_ptr<DCameraOpenInfo>& openInfo)
182 {
183 DHLOGI("OpenChannel dhId: %s", GetAnonyString(dhId_).c_str());
184 if (sessionState_ != DCAMERA_CHANNEL_STATE_DISCONNECTED) {
185 DHLOGE("wrong state, dhId: %s, sessionState: %d", GetAnonyString(dhId_).c_str(), sessionState_);
186 return DCAMERA_WRONG_STATE;
187 }
188 DCameraLowLatency::GetInstance().EnableLowLatency();
189 srcDevId_ = openInfo->sourceDevId_;
190 std::vector<DCameraIndex> indexs;
191 indexs.push_back(DCameraIndex(srcDevId_, dhId_));
192 auto controller = std::shared_ptr<DCameraSinkController>(shared_from_this());
193 std::shared_ptr<ICameraChannelListener> listener =
194 std::make_shared<DCameraSinkControllerChannelListener>(controller);
195 int32_t ret = channel_->CreateSession(indexs, SESSION_FLAG, DCAMERA_SESSION_MODE_CTRL, listener);
196 if (ret != DCAMERA_OK) {
197 DHLOGE("channel create session failed, dhId: %s, ret: %d", GetAnonyString(dhId_).c_str(), ret);
198 return ret;
199 }
200 DHLOGI("OpenChannel %s success", GetAnonyString(dhId_).c_str());
201 return DCAMERA_OK;
202 }
203
CloseChannel()204 int32_t DCameraSinkController::CloseChannel()
205 {
206 DHLOGI("CloseChannel dhId: %s", GetAnonyString(dhId_).c_str());
207 std::lock_guard<std::mutex> autoLock(channelLock_);
208 DCameraLowLatency::GetInstance().DisableLowLatency();
209 DCameraSinkServiceIpc::GetInstance().DeleteSourceRemoteCamSrv(srcDevId_);
210 srcDevId_.clear();
211 int32_t ret = channel_->ReleaseSession();
212 if (ret != DCAMERA_OK) {
213 DHLOGE("DCameraSinkController release channel failed, dhId: %s, ret: %d",
214 GetAnonyString(dhId_).c_str(), ret);
215 }
216
217 ret = output_->CloseChannel();
218 if (ret != DCAMERA_OK) {
219 DHLOGE("DCameraSinkController CloseChannel failed, dhId: %s, ret: %d",
220 GetAnonyString(dhId_).c_str(), ret);
221 }
222 sessionState_ = DCAMERA_CHANNEL_STATE_DISCONNECTED;
223 DHLOGI("CloseChannel %s success", GetAnonyString(dhId_).c_str());
224 return DCAMERA_OK;
225 }
226
Init(std::vector<DCameraIndex> & indexs)227 int32_t DCameraSinkController::Init(std::vector<DCameraIndex>& indexs)
228 {
229 DHLOGI("DCameraSinkController Init");
230 dhId_ = indexs[0].dhId_;
231 operator_ = std::make_shared<DCameraClient>(dhId_);
232 output_ = std::make_shared<DCameraSinkOutput>(dhId_, operator_);
233 int32_t ret = output_->Init();
234 if (ret != DCAMERA_OK) {
235 DHLOGE("output init failed, dhId: %s, ret: %d", GetAnonyString(dhId_).c_str(), ret);
236 return ret;
237 }
238
239 auto controller = std::shared_ptr<DCameraSinkController>(shared_from_this());
240 std::shared_ptr<StateCallback> stateCallback = std::make_shared<DCameraSinkControllerStateCallback>(controller);
241 operator_->SetStateCallback(stateCallback);
242 ret = operator_->Init();
243 if (ret != DCAMERA_OK) {
244 DHLOGE("operator init failed, dhId: %s, ret: %d", GetAnonyString(dhId_).c_str(), ret);
245 return ret;
246 }
247
248 channel_ = std::make_shared<DCameraChannelSinkImpl>();
249 eventBus_ = std::make_shared<EventBus>("SinkCtlHandler");
250 DCameraFrameTriggerEvent triggerEvent(*this);
251 DCameraPostAuthorizationEvent authEvent(*this);
252 eventBus_->AddHandler<DCameraFrameTriggerEvent>(triggerEvent.GetType(), *this);
253 eventBus_->AddHandler<DCameraPostAuthorizationEvent>(authEvent.GetType(), *this);
254
255 isInit_ = true;
256 DHLOGI("DCameraSinkController Init %s success", GetAnonyString(dhId_).c_str());
257 return DCAMERA_OK;
258 }
259
UnInit()260 int32_t DCameraSinkController::UnInit()
261 {
262 DHLOGI("DCameraSinkController UnInit dhId: %s", GetAnonyString(dhId_).c_str());
263 std::lock_guard<std::mutex> autoLock(autoLock_);
264 int32_t ret = StopCapture();
265 if (ret != DCAMERA_OK) {
266 DHLOGE("DCameraSinkController UnInit %s stop capture failed, ret: %d", GetAnonyString(dhId_).c_str(), ret);
267 }
268
269 ret = CloseChannel();
270 if (ret != DCAMERA_OK) {
271 DHLOGE("DCameraSinkController UnInit %s close channel failed, ret: %d", GetAnonyString(dhId_).c_str(), ret);
272 }
273
274 if (output_ != nullptr) {
275 ret = output_->UnInit();
276 if (ret != DCAMERA_OK) {
277 DHLOGE("DCameraSinkController release output failed, dhId: %s, ret: %d",
278 GetAnonyString(dhId_).c_str(), ret);
279 }
280 }
281
282 if (operator_ != nullptr) {
283 ret = operator_->UnInit();
284 if (ret != DCAMERA_OK) {
285 DHLOGE("DCameraSinkController release operator failed, dhId: %s, ret: %d",
286 GetAnonyString(dhId_).c_str(), ret);
287 }
288 }
289
290 isInit_ = false;
291 DHLOGI("DCameraSinkController UnInit %s success", GetAnonyString(dhId_).c_str());
292 return DCAMERA_OK;
293 }
294
OnEvent(DCameraFrameTriggerEvent & event)295 void DCameraSinkController::OnEvent(DCameraFrameTriggerEvent& event)
296 {
297 std::string param = event.GetParam();
298 accessControl_->TriggerFrame(param);
299 }
300
OnEvent(DCameraPostAuthorizationEvent & event)301 void DCameraSinkController::OnEvent(DCameraPostAuthorizationEvent& event)
302 {
303 std::vector<std::shared_ptr<DCameraCaptureInfo>> captureInfos = event.GetParam();
304 PostAuthorization(captureInfos);
305 }
306
OnStateChanged(std::shared_ptr<DCameraEvent> & event)307 void DCameraSinkController::OnStateChanged(std::shared_ptr<DCameraEvent>& event)
308 {
309 DHLOGI("DCameraSinkController::OnStateChanged dhId: %s, result: %d",
310 GetAnonyString(dhId_).c_str(), event->eventResult_);
311 if (event->eventResult_ == DCAMERA_EVENT_DEVICE_PREEMPT) {
312 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_DEVICE_PREEMPT, std::string("camera device preempted"));
313 } else {
314 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_DEVICE_ERROR, std::string("camera error"));
315 }
316 }
317
OnMetadataResult(std::vector<std::shared_ptr<DCameraSettings>> & settings)318 void DCameraSinkController::OnMetadataResult(std::vector<std::shared_ptr<DCameraSettings>>& settings)
319 {
320 DHLOGI("DCameraSinkController::OnMetadataResult dhId: %s", GetAnonyString(dhId_).c_str());
321 if (settings.empty()) {
322 DHLOGE("camera settings is empty");
323 return;
324 }
325 DCameraMetadataSettingCmd cmd;
326 cmd.type_ = DCAMERA_PROTOCOL_TYPE_MESSAGE;
327 cmd.dhId_ = dhId_;
328 cmd.command_ = DCAMERA_PROTOCOL_CMD_METADATA_RESULT;
329 cmd.value_.assign(settings.begin(), settings.end());
330 std::string jsonStr;
331 int32_t ret = cmd.Marshal(jsonStr);
332 if (ret != DCAMERA_OK) {
333 DHLOGE("Marshal metadata settings failed, dhId: %s ret: %d", GetAnonyString(dhId_).c_str(), ret);
334 return;
335 }
336 std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(jsonStr.length() + 1);
337 ret = memcpy_s(buffer->Data(), buffer->Capacity(), reinterpret_cast<uint8_t *>(const_cast<char *>(jsonStr.c_str())),
338 jsonStr.length());
339 if (ret != EOK) {
340 DHLOGE("memcpy_s failed, dhId: %s ret: %d", GetAnonyString(dhId_).c_str(), ret);
341 return;
342 }
343 ret = channel_->SendData(buffer);
344 if (ret != DCAMERA_OK) {
345 DHLOGE("channel send data failed, dhId: %s ret: %d", GetAnonyString(dhId_).c_str(), ret);
346 return;
347 }
348 DHLOGI("DCameraSinkController::OnMetadataResult dhId: %s success", GetAnonyString(dhId_).c_str());
349 }
350
OnSessionState(int32_t state)351 void DCameraSinkController::OnSessionState(int32_t state)
352 {
353 DHLOGI("DCameraSinkController::OnSessionState dhId: %s, state: %d", GetAnonyString(dhId_).c_str(), state);
354 sessionState_ = state;
355 switch (state) {
356 case DCAMERA_CHANNEL_STATE_CONNECTING:
357 DHLOGI("channel is connecting");
358 break;
359 case DCAMERA_CHANNEL_STATE_CONNECTED:
360 DHLOGI("channel is connected");
361 break;
362 case DCAMERA_CHANNEL_STATE_DISCONNECTED:
363 DHLOGI("channel is disconnected");
364 std::thread([this]() {
365 DHLOGI("DCameraSinkController::OnSessionState %s new thread session state: %d",
366 GetAnonyString(dhId_).c_str(), sessionState_);
367 prctl(PR_SET_NAME, CHANNEL_DISCONNECTED.c_str());
368 std::lock_guard<std::mutex> autoLock(autoLock_);
369 int32_t ret = CloseChannel();
370 if (ret != DCAMERA_OK) {
371 DHLOGE("session state: %d, %s close channel failed, ret: %d",
372 sessionState_, GetAnonyString(dhId_).c_str(), ret);
373 }
374 ret = StopCapture();
375 if (ret != DCAMERA_OK) {
376 DHLOGE("session state: %d, %s stop capture failed, ret: %d",
377 sessionState_, GetAnonyString(dhId_).c_str(), ret);
378 }
379 }).detach();
380 break;
381 default:
382 DHLOGE("unknown session state");
383 break;
384 }
385 }
386
OnSessionError(int32_t eventType,int32_t eventReason,std::string detail)387 void DCameraSinkController::OnSessionError(int32_t eventType, int32_t eventReason, std::string detail)
388 {
389 DHLOGI("DCameraSinkController::OnSessionError dhId: %s, eventType: %d, eventReason: %d, detail: %s",
390 GetAnonyString(dhId_).c_str(), eventType, eventReason, detail.c_str());
391 }
392
OnDataReceived(std::vector<std::shared_ptr<DataBuffer>> & buffers)393 void DCameraSinkController::OnDataReceived(std::vector<std::shared_ptr<DataBuffer>>& buffers)
394 {
395 DHLOGI("OnReceivedData %s control channel receive data", GetAnonyString(dhId_).c_str());
396 for (auto& buffer : buffers) {
397 if (buffer->Size() <= 0 || buffer->Size() > DATABUFF_MAX_SIZE) {
398 DHLOGI("buffer is invalid");
399 return;
400 }
401 HandleReceivedData(buffer);
402 }
403 }
404
PostAuthorization(std::vector<std::shared_ptr<DCameraCaptureInfo>> & captureInfos)405 void DCameraSinkController::PostAuthorization(std::vector<std::shared_ptr<DCameraCaptureInfo>>& captureInfos)
406 {
407 DHLOGI("DCameraSinkController::PostAuthorization dhId: %s", GetAnonyString(dhId_).c_str());
408 int32_t ret = StartCaptureInner(captureInfos);
409 if (ret == DCAMERA_OK) {
410 accessControl_->NotifySensitiveSrc(SRC_TYPE);
411 }
412 }
413
StartCaptureInner(std::vector<std::shared_ptr<DCameraCaptureInfo>> & captureInfos)414 int32_t DCameraSinkController::StartCaptureInner(std::vector<std::shared_ptr<DCameraCaptureInfo>>& captureInfos)
415 {
416 DHLOGI("StartCaptureInner dhId: %s", GetAnonyString(dhId_).c_str());
417 std::lock_guard<std::mutex> autoLock(captureLock_);
418 int32_t ret = output_->StartCapture(captureInfos);
419 if (ret != DCAMERA_OK) {
420 DHLOGE("output start capture failed, dhId: %s, ret: %d", GetAnonyString(dhId_).c_str(), ret);
421 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_DEVICE_ERROR, std::string("output start capture failed"));
422 return ret;
423 }
424 PropertyCarrier carrier;
425 ret = output_->GetProperty(SURFACE, carrier);
426 if (ret != DCAMERA_OK) {
427 DHLOGD("StartCaptureInner: get property fail.");
428 return DCAMERA_BAD_VALUE;
429 }
430 ret = operator_->StartCapture(captureInfos, carrier.surface_);
431 if (ret != DCAMERA_OK) {
432 DHLOGE("camera client start capture failed, dhId: %s, ret: %d", GetAnonyString(dhId_).c_str(), ret);
433 if (ret == DCAMERA_ALLOC_ERROR) {
434 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_NO_PERMISSION,
435 std::string("operator start capture permission denial."));
436 } else if (ret == DCAMERA_DEVICE_BUSY) {
437 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_DEVICE_IN_USE,
438 std::string("operator start capture in used."));
439 }
440 return ret;
441 }
442
443 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_CAMERA_SUCCESS, std::string("operator start capture success"));
444 DHLOGI("DCameraSinkController::StartCaptureInner %s success", GetAnonyString(dhId_).c_str());
445 return DCAMERA_OK;
446 }
447
DCameraNotifyInner(int32_t type,int32_t result,std::string reason)448 int32_t DCameraSinkController::DCameraNotifyInner(int32_t type, int32_t result, std::string reason)
449 {
450 std::shared_ptr<DCameraEvent> event = std::make_shared<DCameraEvent>();
451 event->eventType_ = type;
452 event->eventResult_ = result;
453 event->eventContent_ = reason;
454 return DCameraNotify(event);
455 }
456
HandleReceivedData(std::shared_ptr<DataBuffer> & dataBuffer)457 int32_t DCameraSinkController::HandleReceivedData(std::shared_ptr<DataBuffer>& dataBuffer)
458 {
459 DHLOGI("DCameraSinkController::HandleReceivedData dhId: %s", GetAnonyString(dhId_).c_str());
460 uint8_t *data = dataBuffer->Data();
461 std::string jsonStr(reinterpret_cast<const char *>(data), dataBuffer->Capacity());
462
463 JSONCPP_STRING errs;
464 Json::CharReaderBuilder readerBuilder;
465 Json::Value root;
466 std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
467 if ((!jsonReader->parse(jsonStr.c_str(), jsonStr.c_str() + jsonStr.length(), &root, &errs)) ||
468 (!root.isObject())) {
469 DHLOGE("parse json string failed");
470 return DCAMERA_BAD_VALUE;
471 }
472
473 if ((!root.isMember("Command")) || (!root["Command"].isString())) {
474 DHLOGE("parse command failed");
475 return DCAMERA_BAD_VALUE;
476 }
477
478 std::string command = root["Command"].asString();
479 if ((!command.empty()) && (command.compare(DCAMERA_PROTOCOL_CMD_CAPTURE) == 0)) {
480 DCameraCaptureInfoCmd captureInfoCmd;
481 int ret = captureInfoCmd.Unmarshal(jsonStr);
482 if (ret != DCAMERA_OK) {
483 DHLOGE("Capture Info Unmarshal failed, dhId: %s ret: %d", GetAnonyString(dhId_).c_str(), ret);
484 return ret;
485 }
486 return StartCapture(captureInfoCmd.value_);
487 } else if ((!command.empty()) && (command.compare(DCAMERA_PROTOCOL_CMD_UPDATE_METADATA) == 0)) {
488 DCameraMetadataSettingCmd metadataSettingCmd;
489 int ret = metadataSettingCmd.Unmarshal(jsonStr);
490 if (ret != DCAMERA_OK) {
491 DHLOGE("Metadata Setting Unmarshal failed, dhId: %s ret: %d",
492 GetAnonyString(dhId_).c_str(), ret);
493 return ret;
494 }
495 return UpdateSettings(metadataSettingCmd.value_);
496 }
497 return DCAMERA_BAD_VALUE;
498 }
499 } // namespace DistributedHardware
500 } // namespace OHOS