CBOR: Add self describing CBOR tag at the beginning
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
|
||||
#include "tinycbor/src/cbor.h"
|
||||
|
||||
constexpr const CborTag SelfDescribedCBOR = 55799;
|
||||
constexpr const CborTag TagMultiDimArray = 40;
|
||||
constexpr const CborTag TagDECTRISCompression = 56500;
|
||||
|
||||
|
||||
@@ -587,6 +587,11 @@ std::unique_lock<std::mutex> ul(m);
|
||||
CborParser parser;
|
||||
CborValue value;
|
||||
cborErr(cbor_parser_init(buffer.data(), buffer.size(), 0, &parser, &value));
|
||||
|
||||
if (GetCBORTag(value) != SelfDescribedCBOR)
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError, "CBOR must start with dedicated tag");
|
||||
|
||||
|
||||
if (cbor_value_is_map(&value)) {
|
||||
CborValue map_value;
|
||||
cborErr(cbor_value_enter_container(&value, &map_value));
|
||||
|
||||
@@ -293,8 +293,9 @@ const std::vector<uint8_t> &JFJochFrameSerializer::GetBuffer() const {
|
||||
void JFJochFrameSerializer::SerializeSequenceStart(const StartMessage& message) {
|
||||
buffer.resize(max_buffer_size);
|
||||
CborEncoder encoder, mapEncoder;
|
||||
cbor_encoder_init(&encoder, buffer.data(), buffer.size(), 0);
|
||||
|
||||
cbor_encoder_init(&encoder, buffer.data(), buffer.size(), 0);
|
||||
cborErr(cbor_encode_tag(&encoder, SelfDescribedCBOR ));
|
||||
size_t elements = 27;
|
||||
|
||||
cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, elements));
|
||||
@@ -344,6 +345,7 @@ void JFJochFrameSerializer::SerializeSequenceEnd(const EndMessage& message) {
|
||||
|
||||
CborEncoder encoder, mapEncoder;
|
||||
cbor_encoder_init(&encoder, buffer.data(), buffer.size(), 0);
|
||||
cborErr(cbor_encode_tag(&encoder, SelfDescribedCBOR ));
|
||||
cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, 6));
|
||||
|
||||
CBOR_ENC(mapEncoder, "type", "end");
|
||||
@@ -364,6 +366,8 @@ void JFJochFrameSerializer::SerializeImage(const DataMessage& message) {
|
||||
|
||||
CborEncoder encoder, mapEncoder, userDataMapEncoder;
|
||||
cbor_encoder_init(&encoder, buffer.data(), buffer.size(), 0);
|
||||
|
||||
cborErr(cbor_encode_tag(&encoder, SelfDescribedCBOR ));
|
||||
cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, 4));
|
||||
|
||||
CBOR_ENC(mapEncoder, "type", "image");
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include <catch2/catch.hpp>
|
||||
#include <nlohmann/json.hpp>
|
||||
|
||||
#include "../frame_serialize/JFJochFrameSerializer.h"
|
||||
#include "../frame_serialize/JFJochFrameDeserializer.h"
|
||||
@@ -384,23 +383,61 @@ TEST_CASE("CBORSerialize_Image_Spots", "[CBOR]") {
|
||||
REQUIRE(image_array.spots[1].intensity == 123);
|
||||
}
|
||||
|
||||
TEST_CASE("CBORSerialize_End_NLohmann", "[CBOR]") {
|
||||
TEST_CASE("CBORSerialize_Start_stream2", "[CBOR]") {
|
||||
JFJochFrameSerializer serializer(8*1024*1024);
|
||||
EndMessage message {
|
||||
.number_of_images = 57789,
|
||||
.max_receiver_delay = 3456,
|
||||
.efficiency = 0.99,
|
||||
.write_master_file = true,
|
||||
.end_date = "ccc"
|
||||
|
||||
StartMessage message {
|
||||
.data_file_count = 3,
|
||||
.detector_distance = 0.0005,
|
||||
.beam_center_x = 456.6,
|
||||
.beam_center_y = 124.3,
|
||||
.number_of_images = 34567,
|
||||
.image_size_x = 456,
|
||||
.image_size_y = 457,
|
||||
.pixel_bit_depth = 32,
|
||||
.pixel_signed = true,
|
||||
.incident_energy = 12400,
|
||||
.incident_wavelength = 0.988,
|
||||
.frame_time = 0.0001,
|
||||
.count_time = 0.000098,
|
||||
.saturation_value = 65535,
|
||||
.min_value = -32767,
|
||||
.pixel_size_x = 0.000075,
|
||||
.pixel_size_y = 0.000075,
|
||||
.sensor_thickness = 0.0005,
|
||||
.sensor_material = "Si",
|
||||
.compression_algorithm = CompressionAlgorithm::BSHUF_LZ4,
|
||||
.compression_block_size = 8192,
|
||||
.unit_cell = {45,37,45,90,108,120},
|
||||
.space_group_number = 154,
|
||||
.max_spot_count = 250,
|
||||
.storage_cell_number = 16,
|
||||
.pixel_mask_enabled = true,
|
||||
.arm_date = "abc",
|
||||
.sample_name = "lyso",
|
||||
.file_prefix = "lyso1/dir/file",
|
||||
.channels = {"default", "sc2"},
|
||||
.detector_description = "EIGER 16M",
|
||||
.detector_serial_number = "123",
|
||||
.series_unique_id = "bla",
|
||||
.series_id = 4567,
|
||||
.goniometer = {{"omega", {
|
||||
.increment = 0.1f,
|
||||
.start = 10.0f
|
||||
}}},
|
||||
.detector_translation = {0.5f, 0.0f, 0.5f},
|
||||
.source_name = "Swiss Light Source",
|
||||
.source_name_short = "SLS",
|
||||
.instrument_name = "X06SA",
|
||||
.instrument_name_short = "PXIII",
|
||||
.rad_int_bin_number = 35,
|
||||
.summation = 567
|
||||
};
|
||||
message.pixel_mask["sc0"] = std::vector<uint32_t>(456*457, 15);
|
||||
|
||||
REQUIRE_NOTHROW(serializer.SerializeSequenceEnd(message));
|
||||
REQUIRE_NOTHROW(serializer.SerializeSequenceStart(message));
|
||||
|
||||
auto image = serializer.GetBuffer();
|
||||
|
||||
auto serialized = serializer.GetBuffer();
|
||||
|
||||
nlohmann::json j ;
|
||||
REQUIRE_NOTHROW(j = nlohmann::json::from_cbor(serialized));
|
||||
REQUIRE(j["type"] == "end");
|
||||
REQUIRE(j["write_master_file"] == true);
|
||||
REQUIRE(j["end_date"] == "ccc");
|
||||
}
|
||||
Reference in New Issue
Block a user