#include "cloudini_lib/cloudini_c.h"
#include "cloudini_lib/cloudini.hpp"
#include <cstring>
#include <vector>
extern "C" {
uint32_t cloudini_c_encode(
const char* header_yaml,
const uint8_t* pc_data,
uint32_t pc_data_size,
uint8_t* output,
uint32_t max_output_size,
int use_threads)
{
try {
Cloudini::EncodingInfo info = Cloudini::EncodingInfoFromYAML(header_yaml);
info.use_threads = (use_threads != 0);
Cloudini::ConstBufferView data_view(pc_data, pc_data_size);
Cloudini::PointcloudEncoder encoder(info);
std::vector<uint8_t> out;
const size_t compressed_size = encoder.encode(data_view, out);
if (compressed_size > max_output_size) {
return 0;
}
std::memcpy(output, out.data(), compressed_size);
return static_cast<uint32_t>(compressed_size);
} catch (...) {
return 0;
}
}
uint32_t cloudini_c_decode(
const uint8_t* encoded,
uint32_t encoded_size,
uint8_t* output,
uint32_t max_output_size)
{
try {
Cloudini::ConstBufferView encoded_view(encoded, encoded_size);
Cloudini::EncodingInfo info = Cloudini::DecodeHeader(encoded_view);
const size_t decoded_size =
static_cast<size_t>(info.width) * info.height * info.point_step;
if (decoded_size > max_output_size) {
return 0;
}
Cloudini::BufferView output_view(output, decoded_size);
Cloudini::PointcloudDecoder decoder;
decoder.decode(info, encoded_view, output_view);
return static_cast<uint32_t>(decoded_size);
} catch (...) {
return 0;
}
}
uint32_t cloudini_c_decompressed_size(
const uint8_t* encoded,
uint32_t encoded_size)
{
try {
Cloudini::ConstBufferView encoded_view(encoded, encoded_size);
Cloudini::EncodingInfo info = Cloudini::DecodeHeader(encoded_view);
return static_cast<uint32_t>(
static_cast<size_t>(info.width) * info.height * info.point_step);
} catch (...) {
return 0;
}
}
}