Skip to content

Commit 460c298

Browse files
Changed serialization method for ObjectDetectorParams class
1 parent a1ca635 commit 460c298

File tree

5 files changed

+48
-14
lines changed

5 files changed

+48
-14
lines changed
258 KB
Binary file not shown.

README.md

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
# **ObjectDetector interface C++ library**
88

9-
**v1.2.0**
9+
**v1.3.0**
1010

1111
------
1212

@@ -59,6 +59,7 @@
5959
| 1.0.1 | 17.07.2023 | - 3rdparty variable name mistake fixed. |
6060
| 1.1.0 | 18.07.2023 | - Added frame ID field for detection results. |
6161
| 1.2.0 | 22.08.2023 | - Added new setMask method. |
62+
| 1.3.0 | 12.09.2023 | - Changed params serialization method. |
6263

6364

6465

@@ -684,11 +685,12 @@ public:
684685
ObjectDetectorParams& operator= (const ObjectDetectorParams& src);
685686
/**
686687
* @brief Encode params. Method doesn't encode initString.
687-
* @param data Pointer to data buffer.
688+
* @param data Pointer to data buffer. Must have at least 99 bytes size.
689+
* @param dataBufferSize Size of data buffer. Min value is 99.
688690
* @param size Size of data.
689691
* @param mask Pointer to parameters mask.
690692
*/
691-
void encode(uint8_t* data, int& size,
693+
void encode(uint8_t* data, int dataBufferSize, int& size,
692694
ObjectDetectorParamsMask* mask = nullptr);
693695
/**
694696
* @brief Decode params. Method doesn't decode initString;
@@ -738,14 +740,15 @@ public:
738740
**ObjectDetectorParams** class provides method **encode(...)** to serialize object detector params (fields of ObjectDetectorParams class, see Table 5). Serialization of object detector params necessary in case when you need to send params via communication channels. Method provides options to exclude particular parameters from serialization. To do this method inserts binary mask (3 bytes) where each bit represents particular parameter and **decode(...)** method recognizes it. Method doesn't encode initString. Method declaration:
739741
740742
```cpp
741-
void encode(uint8_t* data, int& size, ObjectDetectorParamsMask* mask = nullptr);
743+
void encode(uint8_t* data, int dataBufferSize, int& size, ObjectDetectorParamsMask* mask = nullptr);
742744
```
743745

744-
| Parameter | Value |
745-
| --------- | ------------------------------------------------------------ |
746-
| data | Pointer to data buffer. Buffer size should be at least **43** bytes. |
747-
| size | Size of encoded data. 43 bytes by default. |
748-
| mask | Parameters mask - pointer to **ObjectDetectorParamsMask** structure. **ObjectDetectorParamsMask** (declared in ObjectDetector.h file) determines flags for each field (parameter) declared in **ObjectDetectorParams** class. If the user wants to exclude any parameters from serialization, he can put a pointer to the mask. If the user wants to exclude a particular parameter from serialization, he should set the corresponding flag in the ObjectDetectorParamsMask structure. |
746+
| Parameter | Value |
747+
| -------------- | ------------------------------------------------------------ |
748+
| data | Pointer to data buffer. Buffer size should be at least **99** bytes. |
749+
| dataBufferSize | Size of data buffer. If the data buffer size is not large enough to serialize all detected objects (40 bytes per object), not all objects will be included in the data. |
750+
| size | Size of encoded data. 99 bytes by default. |
751+
| mask | Parameters mask - pointer to **ObjectDetectorParamsMask** structure. **ObjectDetectorParamsMask** (declared in ObjectDetector.h file) determines flags for each field (parameter) declared in **ObjectDetectorParams** class. If the user wants to exclude any parameters from serialization, he can put a pointer to the mask. If the user wants to exclude a particular parameter from serialization, he should set the corresponding flag in the ObjectDetectorParamsMask structure. |
749752

750753
**ObjectDetectorParamsMask** structure declaration:
751754

src/ObjectDetector.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,16 @@ cr::detector::ObjectDetectorParams &cr::detector::ObjectDetectorParams::operator
4949

5050

5151
void cr::detector::ObjectDetectorParams::encode(
52-
uint8_t* data, int& size, cr::detector::ObjectDetectorParamsMask* mask)
52+
uint8_t* data, int dataBufferSize, int& size,
53+
ObjectDetectorParamsMask* mask)
5354
{
55+
// Check data buffer size.
56+
if (dataBufferSize < 99)
57+
{
58+
size = 0;
59+
return;
60+
}
61+
5462
// Encode version.
5563
int pos = 0;
5664
data[pos] = 0x02; pos += 1;
@@ -92,6 +100,17 @@ void cr::detector::ObjectDetectorParams::encode(
92100
memcpy(&data[pos], &minDetectionProbability, 4); pos += 4;
93101
int numObjects = (int)objects.size();
94102
memcpy(&data[pos], &numObjects, 4); pos += 4;
103+
104+
// Check how much object we can put into buffer.
105+
int restObjects = (dataBufferSize - pos) / 40;
106+
if (restObjects < 0)
107+
restObjects = 0;
108+
if (restObjects < numObjects)
109+
{
110+
numObjects = restObjects;
111+
memcpy(&data[pos - 4], &numObjects, 4); pos += 4;
112+
}
113+
95114
for (int i = 0; i < numObjects; ++i)
96115
{
97116
memcpy(&data[pos], &objects[i].id, 4); pos += 4;
@@ -243,6 +262,17 @@ void cr::detector::ObjectDetectorParams::encode(
243262
{
244263
int numObjects = (int)objects.size();
245264
memcpy(&data[pos], &numObjects, 4); pos += 4;
265+
266+
// Check how much object we can put into buffer.
267+
int restObjects = (dataBufferSize - pos) / 40;
268+
if (restObjects < 0)
269+
restObjects = 0;
270+
if (restObjects < numObjects)
271+
{
272+
numObjects = restObjects;
273+
memcpy(&data[pos - 4], &numObjects, 4); pos += 4;
274+
}
275+
246276
for (int i = 0; i < numObjects; ++i)
247277
{
248278
memcpy(&data[pos], &objects[i].id, 4); pos += 4;

src/ObjectDetector.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,12 @@ class ObjectDetectorParams
178178

179179
/**
180180
* @brief Encode params. Method doesn't encode initString.
181-
* @param data Pointer to data buffer.
181+
* @param data Pointer to data buffer. Must have at least 99 bytes size.
182+
* @param dataBufferSize Size of data buffer. Min value is 99.
182183
* @param size Size of data.
183184
* @param mask Pointer to parameters mask.
184185
*/
185-
void encode(uint8_t* data, int& size,
186+
void encode(uint8_t* data, int dataBufferSize, int& size,
186187
ObjectDetectorParamsMask* mask = nullptr);
187188

188189
/**

test/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ bool encodeDecodeTest()
354354
// Encode data.
355355
uint8_t data[1024];
356356
int size = 0;
357-
in.encode(data, size);
357+
in.encode(data, 1024, size);
358358

359359
cout << "Encoded data size: " << size << " bytes" << endl;
360360

@@ -868,7 +868,7 @@ bool encodeDecodeWithMaskTest()
868868
// Encode data.
869869
uint8_t data[1024];
870870
int size = 0;
871-
in.encode(data, size, &mask);
871+
in.encode(data, 1024, size, &mask);
872872

873873
cout << "Encoded data size: " << size << " bytes" << endl;
874874

0 commit comments

Comments
 (0)