cloudini 0.3.2

The cloudini point cloud compression library for Rust.
Documentation
/*
 * Pure-C wrapper around cloudini_lib — Rust FFI bridge (use_cpp feature).
 *
 * Implements the API declared in cloudini_lib/cloudini_c.h without any
 * WASM / emscripten or ROS dependencies.
 */

#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);
    // After DecodeHeader, encoded_view is advanced past the header.

    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;
  }
}

} /* extern "C" */