Skip to content

Commit 93b7ca0

Browse files
fix segmem
1 parent 2400e88 commit 93b7ca0

File tree

2 files changed

+58
-141
lines changed

2 files changed

+58
-141
lines changed

assets/longdress.bin

131 Bytes
Binary file not shown.

source/pcc.c

Lines changed: 58 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -121,188 +121,105 @@ void pcc_multiple_encode(const pcc_point_cloud_t *pcds,
121121
char **wbuff,
122122
size_t *wsize)
123123
{
124-
char **raw_buffers = malloc(num_pcds * sizeof(char *));
125-
size_t *raw_sizes = malloc(num_pcds * sizeof(size_t));
126-
if (!raw_buffers || !raw_sizes)
127-
{
128-
free(raw_buffers);
129-
free(raw_sizes);
130-
*wbuff = NULL;
131-
*wsize = 0;
132-
return;
133-
}
124+
size_t lossly_total_len = 0;
125+
char *ptr = NULL;
126+
// stuf needs to be free
127+
char **lossly_arr = NULL;
128+
size_t *lossly_len_arr = NULL;
129+
char *lossly_total = NULL;
134130

135-
size_t total_size = sizeof(uint32_t); // for num_pcds header
131+
lossly_arr = (char **)malloc(sizeof(char *) * num_pcds);
132+
lossly_len_arr = (size_t *)malloc(sizeof(size_t) * num_pcds);
133+
134+
lossly_total_len += sizeof(num_pcds);
136135

137-
// Serialize octree (without compression) for each point cloud
138136
for (size_t i = 0; i < num_pcds; i++)
139137
{
140-
pcc_octree_t oct = {0};
138+
lossly_arr[i] = NULL;
139+
lossly_len_arr[i] = 0;
140+
141+
pcc_octree_t oct = {0};
142+
141143
pcc_octree_init(&oct);
142144

143-
// Serialize octree from point cloud with given error
144145
oct.read_from_point_cloud(&oct, pcds[i], error);
146+
oct.write_to_buff(&oct, &(lossly_arr[i]), &(lossly_len_arr[i]));
145147

146-
char *buff = NULL;
147-
size_t buff_len = 0;
148-
oct.write_to_buff(&oct, &buff, &buff_len);
148+
lossly_total_len +=
149+
sizeof(lossly_len_arr[i]) + lossly_len_arr[i];
149150

150151
pcc_octree_destroy(&oct);
151-
152-
if (!buff)
153-
{
154-
// Cleanup previously allocated buffers
155-
for (size_t j = 0; j < i; j++)
156-
free(raw_buffers[j]);
157-
free(raw_buffers);
158-
free(raw_sizes);
159-
*wbuff = NULL;
160-
*wsize = 0;
161-
return;
162-
}
163-
164-
raw_buffers[i] = buff;
165-
raw_sizes[i] = buff_len;
166-
total_size += sizeof(uint32_t) + buff_len;
167-
}
168-
169-
// Allocate buffer for combined raw serialized data with header
170-
char *combined = malloc(total_size);
171-
if (!combined)
172-
{
173-
for (size_t i = 0; i < num_pcds; i++)
174-
free(raw_buffers[i]);
175-
free(raw_buffers);
176-
free(raw_sizes);
177-
*wbuff = NULL;
178-
*wsize = 0;
179-
return;
180152
}
181153

182-
// Write header (num_pcds)
183-
// uint32_t *header = (uint32_t *)combined;
184-
// *header = (uint32_t)num_pcds;
185-
uint32_t tempo = (uint32_t)num_pcds;
186-
memcpy(combined, &tempo, sizeof(uint32_t));
154+
lossly_total = (char *)malloc(lossly_total_len);
155+
ptr = lossly_total;
187156

188-
size_t offset = sizeof(uint32_t);
157+
memcpy(ptr, &num_pcds, sizeof(num_pcds));
158+
ptr += sizeof(num_pcds);
189159

190-
// Write sizes + buffers
191160
for (size_t i = 0; i < num_pcds; i++)
192161
{
193-
uint32_t *size_ptr = (uint32_t *)(combined + offset);
194-
*size_ptr = (uint32_t)raw_sizes[i];
195-
offset += sizeof(uint32_t);
196-
197-
memcpy(combined + offset, raw_buffers[i], raw_sizes[i]);
198-
offset += raw_sizes[i];
162+
memcpy(ptr, &(lossly_len_arr[i]), sizeof(lossly_len_arr[i]));
163+
ptr += sizeof(lossly_len_arr[i]);
199164

200-
free(raw_buffers[i]);
165+
memcpy(ptr, lossly_arr[i], lossly_len_arr[i]);
166+
ptr += lossly_len_arr[i];
201167
}
202168

203-
free(raw_buffers);
204-
free(raw_sizes);
169+
*wbuff = pcc_compress_with_zstd_s(
170+
lossly_total, lossly_total_len, wsize);
205171

206-
// Compress once for the whole combined buffer
207-
*wbuff = pcc_compress_with_zstd_s(combined, total_size, wsize);
208-
free(combined);
172+
free(lossly_total);
173+
free(lossly_len_arr);
174+
for (size_t i = 0; i < num_pcds; i++)
175+
{
176+
free(lossly_arr[i]);
177+
}
178+
free(lossly_arr);
209179
}
210180

211181
void pcc_multiple_decode(const char *rbuff,
212182
size_t rsize,
213183
pcc_point_cloud_t **pcds_out,
214184
size_t *num_pcds_out)
215185
{
216-
size_t decompressed_size = 0;
217-
char *decompressed =
218-
pcc_decompress_with_zstd_s(rbuff, rsize, &decompressed_size);
219-
if (!decompressed)
220-
{
221-
*pcds_out = NULL;
222-
*num_pcds_out = 0;
223-
return;
224-
}
186+
char *ptr = NULL;
225187

226-
if (decompressed_size < sizeof(uint32_t))
227-
{
228-
free(decompressed);
229-
*pcds_out = NULL;
230-
*num_pcds_out = 0;
231-
return;
232-
}
188+
char *lossly_total = NULL;
189+
size_t lossly_total_len = 0;
190+
size_t num_pcds = 0;
233191

234-
const char *ptr = decompressed;
235-
const char *end = decompressed + decompressed_size;
192+
lossly_total =
193+
pcc_decompress_with_zstd_s(rbuff, rsize, &lossly_total_len);
194+
ptr = lossly_total;
236195

237-
// uint32_t num_pcds = *(uint32_t *)ptr;
238-
uint32_t num_pcds = 0;
239-
memcpy(&num_pcds, ptr, sizeof(uint32_t));
240-
ptr += sizeof(uint32_t);
196+
memcpy(&num_pcds, ptr, sizeof(num_pcds));
197+
ptr += sizeof(num_pcds);
241198

242-
if (num_pcds == 0)
243-
{
244-
free(decompressed);
245-
*pcds_out = NULL;
246-
*num_pcds_out = 0;
247-
return;
248-
}
199+
*pcds_out = (pcc_point_cloud_t *)malloc(sizeof(pcc_point_cloud_t) *
200+
num_pcds);
249201

250-
pcc_point_cloud_t *pcds =
251-
malloc(num_pcds * sizeof(pcc_point_cloud_t));
252-
if (!pcds)
202+
for (size_t i = 0; i < num_pcds; i++)
253203
{
254-
free(decompressed);
255-
*pcds_out = NULL;
256-
*num_pcds_out = 0;
257-
return;
204+
pcc_point_cloud_init(&((*pcds_out)[i]));
258205
}
259206

260-
memset(pcds, 0, num_pcds * sizeof(pcc_point_cloud_t));
261-
262-
for (uint32_t i = 0; i < num_pcds; i++)
207+
for (size_t i = 0; i < num_pcds; i++)
263208
{
264-
if (ptr + sizeof(uint32_t) > end)
265-
{
266-
// corrupted
267-
goto error_cleanup;
268-
}
269-
uint32_t size_i = *(uint32_t *)ptr;
270-
ptr += sizeof(uint32_t);
271-
if (ptr + size_i > end)
272-
{
273-
// corrupted
274-
goto error_cleanup;
275-
}
276-
277-
// Deserialize octree for this chunk
278-
pcc_octree_t oct = {0};
279-
pcc_point_cloud_t pcd = {0};
209+
size_t lossly_len = 0;
210+
pcc_octree_t oct = {0};
280211
pcc_octree_init(&oct);
281-
pcc_point_cloud_init(&pcd);
282212

283-
oct.read_from_buff(&oct, ptr, size_i);
284-
pcd.read_from_octree(&pcd, oct);
213+
memcpy(&lossly_len, ptr, sizeof(lossly_len));
214+
ptr += sizeof(lossly_len);
285215

286-
pcc_octree_destroy(&oct);
216+
oct.read_from_buff(&oct, ptr, lossly_len);
217+
ptr += lossly_len;
287218

288-
pcds[i] = pcd;
219+
(*pcds_out)[i].read_from_octree(&((*pcds_out)[i]), oct);
289220

290-
ptr += size_i;
221+
pcc_octree_destroy(&oct);
291222
}
292-
293-
free(decompressed);
294-
*pcds_out = pcds;
295223
*num_pcds_out = num_pcds;
296-
return;
297-
298-
error_cleanup:
299-
for (uint32_t j = 0; j < num_pcds; j++)
300-
{
301-
free(pcds[j].positions);
302-
free(pcds[j].colors);
303-
}
304-
free(pcds);
305-
free(decompressed);
306-
*pcds_out = NULL;
307-
*num_pcds_out = 0;
224+
free(lossly_total);
308225
}

0 commit comments

Comments
 (0)