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