1 /*
2 * Copyright (c) 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_frame_info.h"
17 #include "distributed_camera_errno.h"
18 #include "distributed_hardware_log.h"
19 #include "cJSON.h"
20
21 namespace OHOS {
22 namespace DistributedHardware {
Marshal(std::string & jsonStr)23 void DCameraSinkFrameInfo::Marshal(std::string& jsonStr)
24 {
25 cJSON *frameInfo = cJSON_CreateObject();
26 if (frameInfo == nullptr) {
27 return;
28 }
29 cJSON_AddNumberToObject(frameInfo, FRAME_INFO_TYPE.c_str(), type_);
30 cJSON_AddNumberToObject(frameInfo, FRAME_INFO_INDEX.c_str(), index_);
31 cJSON_AddNumberToObject(frameInfo, FRAME_INFO_PTS.c_str(), pts_);
32 cJSON_AddNumberToObject(frameInfo, FRAME_INFO_START_ENCODE.c_str(), startEncodeT_);
33 cJSON_AddNumberToObject(frameInfo, FRAME_INFO_FINISH_ENCODE.c_str(), finishEncodeT_);
34 cJSON_AddNumberToObject(frameInfo, FRAME_INFO_SENDT.c_str(), sendT_);
35 cJSON_AddStringToObject(frameInfo, FRAME_INFO_VERSION.c_str(), ver_.c_str());
36
37 char *data = cJSON_Print(frameInfo);
38 if (data == nullptr) {
39 cJSON_Delete(frameInfo);
40 return;
41 }
42 jsonStr = std::string(data);
43 cJSON_Delete(frameInfo);
44 cJSON_free(data);
45 }
46
Unmarshal(const std::string & jsonStr)47 int32_t DCameraSinkFrameInfo::Unmarshal(const std::string& jsonStr)
48 {
49 cJSON *rootValue = cJSON_Parse(jsonStr.c_str());
50 if (rootValue == nullptr) {
51 return DCAMERA_BAD_VALUE;
52 }
53 cJSON *type = cJSON_GetObjectItemCaseSensitive(rootValue, FRAME_INFO_TYPE.c_str());
54 if (type == nullptr || !cJSON_IsNumber(type)) {
55 cJSON_Delete(rootValue);
56 return DCAMERA_BAD_VALUE;
57 }
58 type_ = static_cast<int8_t>(type->valueint);
59 cJSON *index = cJSON_GetObjectItemCaseSensitive(rootValue, FRAME_INFO_INDEX.c_str());
60 if (index == nullptr || !cJSON_IsNumber(index)) {
61 cJSON_Delete(rootValue);
62 return DCAMERA_BAD_VALUE;
63 }
64 index_ = static_cast<int32_t>(index->valueint);
65 cJSON *pts = cJSON_GetObjectItemCaseSensitive(rootValue, FRAME_INFO_PTS.c_str());
66 if (pts == nullptr || !cJSON_IsNumber(pts)) {
67 cJSON_Delete(rootValue);
68 return DCAMERA_BAD_VALUE;
69 }
70 pts_ = static_cast<int64_t>(pts->valueint);
71 cJSON *startEncode = cJSON_GetObjectItemCaseSensitive(rootValue, FRAME_INFO_START_ENCODE.c_str());
72 if (startEncode == nullptr || !cJSON_IsNumber(startEncode)) {
73 cJSON_Delete(rootValue);
74 return DCAMERA_BAD_VALUE;
75 }
76 startEncodeT_ = static_cast<int64_t>(startEncode->valueint);
77 cJSON *finishEncode = cJSON_GetObjectItemCaseSensitive(rootValue, FRAME_INFO_FINISH_ENCODE.c_str());
78 if (finishEncode == nullptr || !cJSON_IsNumber(finishEncode)) {
79 cJSON_Delete(rootValue);
80 return DCAMERA_BAD_VALUE;
81 }
82 finishEncodeT_ = static_cast<int64_t>(finishEncode->valueint);
83 cJSON *sendT = cJSON_GetObjectItemCaseSensitive(rootValue, FRAME_INFO_SENDT.c_str());
84 if (sendT == nullptr || !cJSON_IsNumber(sendT)) {
85 cJSON_Delete(rootValue);
86 return DCAMERA_BAD_VALUE;
87 }
88 sendT_ = static_cast<int64_t>(sendT->valueint);
89 cJSON *ver = cJSON_GetObjectItemCaseSensitive(rootValue, FRAME_INFO_VERSION.c_str());
90 if (ver == nullptr || !cJSON_IsString(ver)) {
91 cJSON_Delete(rootValue);
92 return DCAMERA_BAD_VALUE;
93 }
94 ver_ = std::string(ver->valuestring);
95 cJSON_Delete(rootValue);
96 return DCAMERA_OK;
97 }
98 } // namespace DistributedHardware
99 } // namespace OHOS