JFJochFrameSerializer: for the buffer return pointer + size, not vector reference (allows for more flexibility)
This commit is contained in:
@@ -15,15 +15,3 @@ void PrepareCBORImage(DataMessage& message,
|
||||
message.image.algorithm = experiment.GetCompressionAlgorithmEnum();
|
||||
message.image.channel = "default";
|
||||
}
|
||||
|
||||
|
||||
void PrepareDataMessageSpots(DataMessage& message,
|
||||
const std::vector<DiffractionSpot>& spots) {
|
||||
message.spots.clear();
|
||||
for (const auto & spot : spots)
|
||||
message.spots.push_back(spot);
|
||||
}
|
||||
|
||||
void ImagePusher::SendData(const std::vector<uint8_t> &serialized_image, int64_t image_number) {
|
||||
SendDataInternal(serialized_image, image_number);
|
||||
}
|
||||
@@ -18,12 +18,10 @@ void PrepareCBORImage(DataMessage& message,
|
||||
void *image, size_t image_size);
|
||||
|
||||
class ImagePusher {
|
||||
protected:
|
||||
virtual void SendDataInternal(const std::vector<uint8_t>& serialized_image, int64_t image_number) = 0;
|
||||
public:
|
||||
virtual void StartDataCollection(const StartMessage& message) = 0;
|
||||
virtual void EndDataCollection(const EndMessage& message) = 0;
|
||||
void SendData(const std::vector<uint8_t>& serialized_image, int64_t image_number);
|
||||
virtual void SendImage(const uint8_t *image_data, size_t image_size, int64_t image_number) = 0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -29,14 +29,14 @@ void TestImagePusher::EndDataCollection(const EndMessage& message) {
|
||||
is_running = false;
|
||||
}
|
||||
|
||||
void TestImagePusher::SendDataInternal(const std::vector<uint8_t> &serialized_image, int64_t image_number) {
|
||||
void TestImagePusher::SendImage(const uint8_t *image_data, size_t image_size, int64_t image_number) {
|
||||
std::unique_lock<std::mutex> ul(m);
|
||||
|
||||
frame_counter++;
|
||||
if (image_number == image_id) {
|
||||
|
||||
JFJochFrameDeserializer deserializer;
|
||||
deserializer.Process(serialized_image);
|
||||
deserializer.Process(image_data, image_size);
|
||||
|
||||
auto image_array = deserializer.GetDataMessage();
|
||||
receiver_generated_image.resize(image_array.image.size);
|
||||
|
||||
@@ -19,8 +19,8 @@ class TestImagePusher : public ImagePusher {
|
||||
bool correct_sequence = true;
|
||||
bool is_running = false;
|
||||
size_t frame_counter = 0;
|
||||
void SendDataInternal(const std::vector<uint8_t> &serialized_image, int64_t image_number) override;
|
||||
public:
|
||||
void SendImage(const uint8_t *image_data, size_t image_size, int64_t image_number) override;
|
||||
explicit TestImagePusher(int64_t image_number);
|
||||
void StartDataCollection(const StartMessage& message) override;
|
||||
void EndDataCollection(const EndMessage& message) override;
|
||||
|
||||
@@ -40,11 +40,11 @@ ZMQImagePusher::ZMQImagePusher(const std::vector<std::string> &addr,
|
||||
}
|
||||
}
|
||||
|
||||
void ZMQImagePusher::SendDataInternal(const std::vector<uint8_t> &serialized_image, int64_t image_number) {
|
||||
void ZMQImagePusher::SendImage(const uint8_t *image_data, size_t image_size, int64_t image_number) {
|
||||
if (sockets.empty())
|
||||
return;
|
||||
auto socket_number = (image_number % file_count) % sockets.size();
|
||||
sockets[socket_number]->Send(serialized_image.data(), serialized_image.size());
|
||||
sockets[socket_number]->Send(image_data, image_size);
|
||||
}
|
||||
|
||||
void ZMQImagePusher::StartDataCollection(const StartMessage& message) {
|
||||
@@ -56,9 +56,9 @@ void ZMQImagePusher::StartDataCollection(const StartMessage& message) {
|
||||
file_count = message.data_file_count;
|
||||
|
||||
serializer.SerializeSequenceStart(message);
|
||||
auto &buffer = serializer.GetBuffer();
|
||||
|
||||
for (const auto &s: sockets)
|
||||
s->Send(buffer.data(), buffer.size(), true);
|
||||
s->Send(serializer.GetBuffer(), serializer.GetBufferSize(), true);
|
||||
}
|
||||
|
||||
|
||||
@@ -69,9 +69,7 @@ void ZMQImagePusher::EndDataCollection(const EndMessage& message) {
|
||||
|
||||
for (const auto &s: sockets) {
|
||||
serializer.SerializeSequenceEnd(end_message);
|
||||
auto &buffer = serializer.GetBuffer();
|
||||
|
||||
s->Send(buffer.data(), buffer.size(), true);
|
||||
s->Send(serializer.GetBuffer(), serializer.GetBufferSize(), true);
|
||||
end_message.write_master_file = false;
|
||||
}
|
||||
}
|
||||
@@ -16,8 +16,8 @@ class ZMQImagePusher : public ImagePusher {
|
||||
std::vector<std::unique_ptr<ZMQContext>> contexts;
|
||||
std::vector<std::unique_ptr<ZMQSocket>> sockets;
|
||||
int64_t file_count = 1;
|
||||
void SendDataInternal(const std::vector<uint8_t>& serialized_image, int64_t image_number) override;
|
||||
public:
|
||||
void SendImage(const uint8_t *image_data, size_t image_size, int64_t image_number) override;
|
||||
ZMQImagePusher(ZMQContext &context, const std::vector<std::string>& addr,
|
||||
int32_t send_buffer_high_watermark = -1, int32_t send_buffer_size = -1);
|
||||
// High performance implementation, where each socket has dedicated ZMQ context
|
||||
|
||||
@@ -603,12 +603,16 @@ void JFJochFrameDeserializer::ProcessImageData(CborValue &value) {
|
||||
}
|
||||
|
||||
void JFJochFrameDeserializer::Process(const std::vector<uint8_t> &buffer) {
|
||||
Process(buffer.data(), buffer.size());
|
||||
}
|
||||
|
||||
void JFJochFrameDeserializer::Process(const uint8_t *msg, size_t msg_size) {
|
||||
std::unique_lock<std::mutex> ul(m);
|
||||
data_message = DataMessage();
|
||||
|
||||
CborParser parser;
|
||||
CborValue value;
|
||||
cborErr(cbor_parser_init(buffer.data(), buffer.size(), 0, &parser, &value));
|
||||
cborErr(cbor_parser_init(msg, msg_size, 0, &parser, &value));
|
||||
|
||||
if (GetCBORTag(value) != CborSignatureTag)
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError, "CBOR must start with dedicated tag");
|
||||
|
||||
@@ -47,6 +47,7 @@ private:
|
||||
bool ProcessEndMessageElement(CborValue &value);
|
||||
public:
|
||||
void Process(const std::vector<uint8_t>& buffer);
|
||||
void Process(const uint8_t *msg, size_t msg_size);
|
||||
[[nodiscard]] Type GetType() const;
|
||||
[[nodiscard]] EndMessage GetEndMessage() const;
|
||||
[[nodiscard]] StartMessage GetStartMessage() const;
|
||||
|
||||
@@ -52,9 +52,9 @@ void CBOR_ENC_COMPRESSED(CborEncoder &encoder,
|
||||
const void *image, size_t image_size,
|
||||
CompressionAlgorithm algorithm,
|
||||
size_t elem_size) {
|
||||
if (algorithm == CompressionAlgorithm::NO_COMPRESSION) {
|
||||
if (algorithm == CompressionAlgorithm::NO_COMPRESSION)
|
||||
cborErr(cbor_encode_byte_string(&encoder, (uint8_t *) image, image_size));
|
||||
} else {
|
||||
else {
|
||||
cbor_encode_tag(&encoder, TagDECTRISCompression);
|
||||
|
||||
CborEncoder arrayEncoder;
|
||||
@@ -288,16 +288,19 @@ inline void CBOR_ENC_USER_DATA(CborEncoder &encoder, const StartMessage& message
|
||||
}
|
||||
|
||||
JFJochFrameSerializer::JFJochFrameSerializer(size_t in_max_buffer_size) :
|
||||
max_buffer_size(in_max_buffer_size) {
|
||||
buffer.reserve(in_max_buffer_size);
|
||||
max_buffer_size(in_max_buffer_size), curr_size(0) {
|
||||
buffer.resize(max_buffer_size);
|
||||
}
|
||||
|
||||
const std::vector<uint8_t> &JFJochFrameSerializer::GetBuffer() const {
|
||||
return buffer;
|
||||
const uint8_t *JFJochFrameSerializer::GetBuffer() const {
|
||||
return buffer.data();
|
||||
}
|
||||
|
||||
size_t JFJochFrameSerializer::GetBufferSize() const {
|
||||
return curr_size;
|
||||
}
|
||||
|
||||
void JFJochFrameSerializer::SerializeSequenceStart(const StartMessage& message) {
|
||||
buffer.resize(max_buffer_size);
|
||||
CborEncoder encoder, mapEncoder;
|
||||
|
||||
cbor_encoder_init(&encoder, buffer.data(), buffer.size(), 0);
|
||||
@@ -342,13 +345,10 @@ void JFJochFrameSerializer::SerializeSequenceStart(const StartMessage& message)
|
||||
CBOR_ENC_CHANNELS(mapEncoder, "channels", message.channels);
|
||||
|
||||
cborErr(cbor_encoder_close_container(&encoder, &mapEncoder));
|
||||
|
||||
buffer.resize(cbor_encoder_get_buffer_size(&encoder, buffer.data()));
|
||||
curr_size = cbor_encoder_get_buffer_size(&encoder, buffer.data());
|
||||
}
|
||||
|
||||
void JFJochFrameSerializer::SerializeSequenceEnd(const EndMessage& message) {
|
||||
buffer.resize(max_buffer_size);
|
||||
|
||||
CborEncoder encoder, mapEncoder;
|
||||
cbor_encoder_init(&encoder, buffer.data(), buffer.size(), 0);
|
||||
cborErr(cbor_encode_tag(&encoder,CborSignatureTag ));
|
||||
@@ -365,12 +365,10 @@ void JFJochFrameSerializer::SerializeSequenceEnd(const EndMessage& message) {
|
||||
|
||||
cborErr(cbor_encoder_close_container(&encoder, &mapEncoder));
|
||||
|
||||
buffer.resize(cbor_encoder_get_buffer_size(&encoder, buffer.data()));
|
||||
curr_size = cbor_encoder_get_buffer_size(&encoder, buffer.data());
|
||||
}
|
||||
|
||||
void JFJochFrameSerializer::SerializeImage(const DataMessage& message) {
|
||||
buffer.resize(max_buffer_size);
|
||||
|
||||
CborEncoder encoder, mapEncoder, userDataMapEncoder;
|
||||
cbor_encoder_init(&encoder, buffer.data(), buffer.size(), 0);
|
||||
|
||||
@@ -397,5 +395,5 @@ void JFJochFrameSerializer::SerializeImage(const DataMessage& message) {
|
||||
|
||||
cborErr(cbor_encoder_close_container(&encoder, &mapEncoder));
|
||||
|
||||
buffer.resize(cbor_encoder_get_buffer_size(&encoder, buffer.data()));
|
||||
curr_size = cbor_encoder_get_buffer_size(&encoder, buffer.data());
|
||||
}
|
||||
|
||||
@@ -15,9 +15,11 @@
|
||||
class JFJochFrameSerializer {
|
||||
std::vector<uint8_t> buffer;
|
||||
size_t max_buffer_size;
|
||||
size_t curr_size;
|
||||
public:
|
||||
explicit JFJochFrameSerializer(size_t buffer_size);
|
||||
[[nodiscard]] const std::vector<uint8_t> &GetBuffer() const;
|
||||
[[nodiscard]] const uint8_t *GetBuffer() const;
|
||||
[[nodiscard]] size_t GetBufferSize() const;
|
||||
void SerializeSequenceStart(const StartMessage& message);
|
||||
void SerializeSequenceEnd(const EndMessage& message);
|
||||
void SerializeImage(const DataMessage& message);
|
||||
|
||||
Submodule image_analysis/fast-feedback-indexer updated: 111b4975ca...6eccc70b52
@@ -413,7 +413,7 @@ int64_t JFJochReceiver::FrameTransformationThread() {
|
||||
if (push_images_to_writer) {
|
||||
PrepareCBORImage(message, experiment, writer_buffer.data(), image_size);
|
||||
serializer.SerializeImage(message);
|
||||
image_pusher.SendData(serializer.GetBuffer(), image_number);
|
||||
image_pusher.SendImage(serializer.GetBuffer(), serializer.GetBufferSize(), image_number);
|
||||
}
|
||||
|
||||
UpdateMaxImage(image_number);
|
||||
|
||||
+12
-27
@@ -63,10 +63,8 @@ TEST_CASE("CBORSerialize_Start", "[CBOR]") {
|
||||
|
||||
REQUIRE_NOTHROW(serializer.SerializeSequenceStart(message));
|
||||
|
||||
auto image = serializer.GetBuffer();
|
||||
|
||||
JFJochFrameDeserializer deserializer;
|
||||
REQUIRE_NOTHROW(deserializer.Process(image));
|
||||
REQUIRE_NOTHROW(deserializer.Process(serializer.GetBuffer(), serializer.GetBufferSize()));
|
||||
REQUIRE(deserializer.GetType() == JFJochFrameDeserializer::Type::START);
|
||||
|
||||
StartMessage output_message;
|
||||
@@ -137,11 +135,9 @@ TEST_CASE("CBORSerialize_End", "[CBOR]") {
|
||||
};
|
||||
|
||||
REQUIRE_NOTHROW(serializer.SerializeSequenceEnd(message));
|
||||
|
||||
auto image = serializer.GetBuffer();
|
||||
|
||||
|
||||
JFJochFrameDeserializer deserializer;
|
||||
REQUIRE_NOTHROW(deserializer.Process(image));
|
||||
REQUIRE_NOTHROW(deserializer.Process(serializer.GetBuffer(), serializer.GetBufferSize()));
|
||||
REQUIRE(deserializer.GetType() == JFJochFrameDeserializer::Type::END);
|
||||
|
||||
EndMessage output_message{};
|
||||
@@ -188,10 +184,9 @@ TEST_CASE("CBORSerialize_Image", "[CBOR]") {
|
||||
};
|
||||
|
||||
REQUIRE_NOTHROW(serializer.SerializeImage(message));
|
||||
auto serialized = serializer.GetBuffer();
|
||||
|
||||
JFJochFrameDeserializer deserializer;
|
||||
REQUIRE_NOTHROW(deserializer.Process(serialized));
|
||||
REQUIRE_NOTHROW(deserializer.Process(serializer.GetBuffer(), serializer.GetBufferSize()));
|
||||
REQUIRE(deserializer.GetType() == JFJochFrameDeserializer::Type::IMAGE);
|
||||
|
||||
auto image_array = deserializer.GetDataMessage();
|
||||
@@ -241,13 +236,11 @@ TEST_CASE("CBORSerialize_Image_2", "[CBOR]") {
|
||||
};
|
||||
|
||||
REQUIRE_NOTHROW(serializer.SerializeImage(message));
|
||||
auto serialized = serializer.GetBuffer();
|
||||
|
||||
JFJochFrameDeserializer deserializer;
|
||||
REQUIRE_NOTHROW(deserializer.Process(serialized));
|
||||
REQUIRE_NOTHROW(deserializer.Process(serializer.GetBuffer(), serializer.GetBufferSize()));
|
||||
REQUIRE(deserializer.GetType() == JFJochFrameDeserializer::Type::IMAGE);
|
||||
|
||||
|
||||
auto image_array = deserializer.GetDataMessage();
|
||||
REQUIRE(image_array.image.algorithm == CompressionAlgorithm::NO_COMPRESSION);
|
||||
REQUIRE(image_array.image.xpixel == 1024);
|
||||
@@ -288,10 +281,9 @@ TEST_CASE("CBORSerialize_Image_Compressed", "[CBOR]") {
|
||||
};
|
||||
|
||||
REQUIRE_NOTHROW(serializer.SerializeImage(message));
|
||||
auto serialized = serializer.GetBuffer();
|
||||
|
||||
JFJochFrameDeserializer deserializer;
|
||||
REQUIRE_NOTHROW(deserializer.Process(serialized));
|
||||
REQUIRE_NOTHROW(deserializer.Process(serializer.GetBuffer(), serializer.GetBufferSize()));
|
||||
REQUIRE(deserializer.GetType() == JFJochFrameDeserializer::Type::IMAGE);
|
||||
|
||||
auto image_array = deserializer.GetDataMessage();
|
||||
@@ -331,10 +323,8 @@ TEST_CASE("CBORSerialize_Image_Rad_Int_Profile", "[CBOR]") {
|
||||
|
||||
REQUIRE_NOTHROW(serializer.SerializeImage(message));
|
||||
|
||||
auto serialized = serializer.GetBuffer();
|
||||
|
||||
JFJochFrameDeserializer deserializer;
|
||||
REQUIRE_NOTHROW(deserializer.Process(serialized));
|
||||
REQUIRE_NOTHROW(deserializer.Process(serializer.GetBuffer(), serializer.GetBufferSize()));
|
||||
REQUIRE(deserializer.GetType() == JFJochFrameDeserializer::Type::IMAGE);
|
||||
|
||||
auto image_array = deserializer.GetDataMessage();
|
||||
@@ -374,10 +364,8 @@ TEST_CASE("CBORSerialize_Image_Spots", "[CBOR]") {
|
||||
|
||||
REQUIRE_NOTHROW(serializer.SerializeImage(message));
|
||||
|
||||
auto serialized = serializer.GetBuffer();
|
||||
|
||||
JFJochFrameDeserializer deserializer;
|
||||
REQUIRE_NOTHROW(deserializer.Process(serialized));
|
||||
REQUIRE_NOTHROW(deserializer.Process(serializer.GetBuffer(), serializer.GetBufferSize()));
|
||||
REQUIRE(deserializer.GetType() == JFJochFrameDeserializer::Type::IMAGE);
|
||||
|
||||
auto image_array = deserializer.GetDataMessage();
|
||||
@@ -452,10 +440,9 @@ TEST_CASE("CBORSerialize_Start_stream2", "[CBOR]") {
|
||||
|
||||
REQUIRE_NOTHROW(serializer.SerializeSequenceStart(message));
|
||||
|
||||
auto image = serializer.GetBuffer();
|
||||
stream2_msg *msg;
|
||||
|
||||
auto ret = stream2_parse_msg(image.data(), image.size(), &msg);
|
||||
auto ret = stream2_parse_msg(serializer.GetBuffer(), serializer.GetBufferSize(), &msg);
|
||||
REQUIRE(ret == STREAM2_OK);
|
||||
CHECK(msg->type == STREAM2_MSG_START);
|
||||
auto msg2 = (stream2_start_msg *) msg;
|
||||
@@ -499,10 +486,9 @@ TEST_CASE("CBORSerialize_End_stream2", "[CBOR]") {
|
||||
|
||||
REQUIRE_NOTHROW(serializer.SerializeSequenceEnd(message));
|
||||
|
||||
auto image = serializer.GetBuffer();
|
||||
stream2_msg *msg;
|
||||
|
||||
auto ret = stream2_parse_msg(image.data(), image.size(), &msg);
|
||||
auto ret = stream2_parse_msg(serializer.GetBuffer(), serializer.GetBufferSize(), &msg);
|
||||
REQUIRE(ret == STREAM2_OK);
|
||||
CHECK(msg->type == STREAM2_MSG_END);
|
||||
auto msg2 = (stream2_end_msg *) msg;
|
||||
@@ -546,11 +532,10 @@ TEST_CASE("CBORSerialize_Image_compressed_stream2", "[CBOR]") {
|
||||
};
|
||||
|
||||
REQUIRE_NOTHROW(serializer.SerializeImage(message));
|
||||
auto cbor_image = serializer.GetBuffer();
|
||||
|
||||
stream2_msg *msg;
|
||||
|
||||
auto ret = stream2_parse_msg(cbor_image.data(), cbor_image.size(), &msg);
|
||||
auto ret = stream2_parse_msg(serializer.GetBuffer(), serializer.GetBufferSize(), &msg);
|
||||
REQUIRE(ret == STREAM2_OK);
|
||||
CHECK(msg->type == STREAM2_MSG_IMAGE);
|
||||
auto msg2 = (stream2_image_msg *) msg;
|
||||
@@ -601,7 +586,7 @@ TEST_CASE("CBORSerialize_Image_uncompressed_stream2", "[CBOR]") {
|
||||
|
||||
stream2_msg *msg;
|
||||
|
||||
auto ret = stream2_parse_msg(cbor_image.data(), cbor_image.size(), &msg);
|
||||
auto ret = stream2_parse_msg(serializer.GetBuffer(), serializer.GetBufferSize(), &msg);
|
||||
REQUIRE(ret == STREAM2_OK);
|
||||
CHECK(msg->type == STREAM2_MSG_IMAGE);
|
||||
auto msg2 = (stream2_image_msg *) msg;
|
||||
|
||||
@@ -97,7 +97,7 @@ TEST_CASE("ZMQImageCommTest_1Writer","[ZeroMQ]") {
|
||||
data_message.number = i;
|
||||
PrepareCBORImage(data_message, x, image1.data() + i * x.GetPixelsNum(), x.GetPixelsNum() * sizeof(uint16_t));
|
||||
serializer.SerializeImage(data_message);
|
||||
pusher.SendData(serializer.GetBuffer(), i);
|
||||
pusher.SendImage(serializer.GetBuffer(), serializer.GetBufferSize(), i);
|
||||
}
|
||||
|
||||
pusher.EndDataCollection(end_message);
|
||||
@@ -172,7 +172,7 @@ TEST_CASE("ZMQImageCommTest_2Writers","[ZeroMQ]") {
|
||||
data_message.number = i;
|
||||
PrepareCBORImage(data_message, x, image1.data() + i * x.GetPixelsNum(), x.GetPixelsNum() * sizeof(uint16_t));
|
||||
serializer.SerializeImage(data_message);
|
||||
pusher.SendData(serializer.GetBuffer(), i);
|
||||
pusher.SendImage(serializer.GetBuffer(), serializer.GetBufferSize(), i);
|
||||
}
|
||||
|
||||
pusher.EndDataCollection(end_message);
|
||||
@@ -260,7 +260,7 @@ TEST_CASE("ZMQImageCommTest_4Writers","[ZeroMQ]") {
|
||||
data_message.number = i;
|
||||
PrepareCBORImage(data_message, x, image1.data() + i * x.GetPixelsNum(), x.GetPixelsNum() * sizeof(uint16_t));
|
||||
serializer.SerializeImage(data_message);
|
||||
pusher.SendData(serializer.GetBuffer(), i);
|
||||
pusher.SendImage(serializer.GetBuffer(), serializer.GetBufferSize(), i);
|
||||
}
|
||||
|
||||
pusher.EndDataCollection(end_message);
|
||||
|
||||
@@ -102,7 +102,7 @@ int main(int argc, char **argv) {
|
||||
data_message.number = i;
|
||||
PrepareCBORImage(data_message, x, output[i % nimages_in_file].data(), output_size[i % nimages_in_file]);
|
||||
serializer.SerializeImage(data_message);
|
||||
pusher.SendData(serializer.GetBuffer(), i);
|
||||
pusher.SendImage(serializer.GetBuffer(), serializer.GetBufferSize(), i);
|
||||
}
|
||||
|
||||
EndMessage end_message{};
|
||||
|
||||
Reference in New Issue
Block a user