• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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