blob: 1656b4ad0acf6d81917bf3c8dfc74663b625efab [file] [log] [blame]
#ifndef _AOS_VISION_BLOB_CODEC_H_
#define _AOS_VISION_BLOB_CODEC_H_
#include <stdint.h>
#include <string.h>
#include <string>
#include "aos/vision/blob/range_image.h"
namespace aos::vision {
template <typename T>
struct IntCodec {
static constexpr size_t kSize = sizeof(T);
static inline char *Write(char *data, T ival) {
memcpy(data, &ival, sizeof(T));
return data + kSize;
}
static inline T Read(const char **data) {
T datum;
memcpy(&datum, *data, sizeof(T));
*data += kSize;
return datum;
}
};
using Int64Codec = IntCodec<uint64_t>;
using Int32Codec = IntCodec<uint32_t>;
using Int16Codec = IntCodec<uint16_t>;
// Calculates bytes size of blob_list. This runs the encoding algorithm below
// to get the exact size that SerializeBlob will require.
// Consider just using SerializeBlobTo instead of these lower level routines.
size_t CalculateSize(const BlobList &blob_list);
// Serializes blob_list to data. Must be valid memory of size returned by
// PredictSize.
void SerializeBlob(const BlobList &blob_list, char *data);
// Combines above to serialize to a string.
inline void SerializeBlobTo(const BlobList &blob_list, std::string *out) {
size_t len = CalculateSize(blob_list);
out->resize(len, 0);
SerializeBlob(blob_list, &(*out)[0]);
}
// Parses a blob from data (Advancing data pointer by the size of the image).
const char *ParseBlobList(BlobList *blob_list, const char *data);
} // namespace aos::vision
#endif // _AOS_VISION_BLOB_CODEC_H_