@@ -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
211181void 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