From 1acd36f77f6718a380f2bdbd71c6e3aeca17d4f2 Mon Sep 17 00:00:00 2001 From: Babicaa Date: Mon, 19 Nov 2018 16:33:02 +0100 Subject: [PATCH] Add metadata buffer class --- lib/src/MetadataBuffer.cpp | 37 +++++++++++++++++++++++++++++++++++++ lib/src/MetadataBuffer.hpp | 25 +++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 lib/src/MetadataBuffer.cpp create mode 100644 lib/src/MetadataBuffer.hpp diff --git a/lib/src/MetadataBuffer.cpp b/lib/src/MetadataBuffer.cpp new file mode 100644 index 0000000..10782e3 --- /dev/null +++ b/lib/src/MetadataBuffer.cpp @@ -0,0 +1,37 @@ +#include "MetadataBuffer.hpp" + +using namespace std; + +MetadataBuffer::MetadataBuffer(uint64_t n_images, shared_ptr> header_values_type) : + n_images(n_images), header_values_type(header_values_type) +{ + if (header_values_type) { + for (const auto& header_type : *header_values_type) { + auto& name = header_type.first; + auto& header_data_type = header_type.second; + + size_t bytes_size_per_frame = header_data_type.value_shape * header_data_type.value_bytes_size; + size_t buffer_size_bytes = n_images * bytes_size_per_frame; + + shared_ptr buffer(new char[buffer_size_bytes], std::default_delete()); + metadata_buffer.insert({name, buffer}); + metadata_length_bytes.insert({name, bytes_size_per_frame}); + } + } +} + +void MetadataBuffer::add_metadata_to_buffer(string name, uint64_t frame_index, const char* data) +{ + size_t bytes_size_per_frame = metadata_length_bytes.at(name); + size_t buffer_offset = frame_index * bytes_size_per_frame; + + char* buffer = (metadata_buffer.at(name)).get(); + buffer += buffer_offset; + + memcpy(buffer, data, bytes_size_per_frame); +} + +shared_ptr MetadataBuffer::get_metadata_values(string name) +{ + return metadata_buffer.at(name); +} diff --git a/lib/src/MetadataBuffer.hpp b/lib/src/MetadataBuffer.hpp new file mode 100644 index 0000000..dee7fc4 --- /dev/null +++ b/lib/src/MetadataBuffer.hpp @@ -0,0 +1,25 @@ +#ifndef METADATABUFFER_H +#define METADATABUFFER_H + +#include +#include + +#include "ZmqReceiver.hpp" + + +class MetadataBuffer +{ + const uint64_t n_images; + const std::shared_ptr> header_values_type; + + protected: + std::unordered_map> metadata_buffer; + std::unordered_map metadata_length_bytes; + + public: + MetadataBuffer(uint64_t n_images, std::shared_ptr> header_values_type); + void add_metadata_to_buffer(std::string name, uint64_t frame_index, const char* data); + std::shared_ptr get_metadata_values(std::string name); +}; + +#endif