From 962edaa4adcb7f09d3164d876b642e7d6fa79263 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Tue, 18 Apr 2023 13:35:58 +0200 Subject: [PATCH] FrameSerializer: hide image data in user_data in CBOR --- frame_serialize/JFJochFrameDeserializer.cpp | 45 +++++++++++++-------- frame_serialize/JFJochFrameDeserializer.h | 5 ++- frame_serialize/JFJochFrameSerializer.cpp | 22 ++++++---- 3 files changed, 46 insertions(+), 26 deletions(-) diff --git a/frame_serialize/JFJochFrameDeserializer.cpp b/frame_serialize/JFJochFrameDeserializer.cpp index 5e05ee27..65b2093a 100644 --- a/frame_serialize/JFJochFrameDeserializer.cpp +++ b/frame_serialize/JFJochFrameDeserializer.cpp @@ -321,8 +321,31 @@ void JFJochFrameDeserializer::ProcessDetTranslation(CborValue &value) { cborErr(cbor_value_leave_container(&value, &array_value)); } +void JFJochFrameDeserializer::ProcessImageMessageUserDataElement(CborValue &value) { + CborValue map_value; + cborErr(cbor_value_enter_container(&value, &map_value)); + while (!cbor_value_at_end(&map_value)) { + auto key = GetCBORString(map_value); -bool JFJochFrameDeserializer::ProcessImageMapElement(CborValue &value) { + if (key == "spots") + GetCBORSpots(map_value); + else if (key == "rad_int_profile") + GetCBORFloatArray(map_value, data_message.rad_int_profile); + else if (key == "indexing_result") + data_message.indexing_result = GetCBORUInt(map_value); + else if (key == "jf_info") + data_message.jf_info = GetCBORUInt(map_value) & UINT32_MAX; + else if (key == "bunch_id") + data_message.bunch_id = GetCBORUInt(map_value); + else if (key == "timestamp") + data_message.timestamp = GetCBORUInt(map_value); + else + cbor_value_advance(&map_value); + } + cborErr(cbor_value_leave_container(&value, &map_value)); +} + +bool JFJochFrameDeserializer::ProcessImageMessageElement(CborValue &value) { if (cbor_value_at_end(&value)) return false; else { @@ -332,18 +355,8 @@ bool JFJochFrameDeserializer::ProcessImageMapElement(CborValue &value) { data_message.number = GetCBORInt(value); else if (key == "data") ProcessImageData(value); - else if (key == "spots") - GetCBORSpots(value); - else if (key == "rad_int_profile") - GetCBORFloatArray(value, data_message.rad_int_profile); - else if (key == "indexing_result") - data_message.indexing_result = GetCBORUInt(value); - else if (key == "jf_info") - data_message.jf_info = GetCBORUInt(value) & UINT32_MAX; - else if (key == "bunch_id") - data_message.bunch_id = GetCBORUInt(value); - else if (key == "timestamp") - data_message.timestamp = GetCBORUInt(value); + else if (key == "user_data") + ProcessImageMessageUserDataElement(value); else cbor_value_advance(&value); return true; @@ -408,7 +421,7 @@ void JFJochFrameDeserializer::ProcessUnitCellElement(CborValue &value) { cborErr(cbor_value_leave_container(&value, &map_value)); } -void JFJochFrameDeserializer::ProcessUserDataElement(CborValue &value) { +void JFJochFrameDeserializer::ProcessStartMessageUserDataElement(CborValue &value) { CborValue map_value; cborErr(cbor_value_enter_container(&value, &map_value)); while (!cbor_value_at_end(&map_value)) { @@ -519,7 +532,7 @@ bool JFJochFrameDeserializer::ProcessStartMessageElement(CborValue &value) { else if (key == "arm_date") start_message.arm_date = GetCBORString(value); else if (key == "user_data") - ProcessUserDataElement(value); + ProcessStartMessageUserDataElement(value); else cbor_value_advance(&value); return true; @@ -579,7 +592,7 @@ std::unique_lock ul(m); DecodeType(map_value); switch (msg_type) { case Type::IMAGE: - while (ProcessImageMapElement(map_value)); + while (ProcessImageMessageElement(map_value)); break; case Type::START: start_message = StartMessage{ diff --git a/frame_serialize/JFJochFrameDeserializer.h b/frame_serialize/JFJochFrameDeserializer.h index 4a841f84..90011f1b 100644 --- a/frame_serialize/JFJochFrameDeserializer.h +++ b/frame_serialize/JFJochFrameDeserializer.h @@ -40,8 +40,9 @@ private: void ProcessImageData(CborValue &value); void ProcessPixelMaskElement(CborValue &value); void ProcessUnitCellElement(CborValue &value); - void ProcessUserDataElement(CborValue &value); - bool ProcessImageMapElement(CborValue &value); + void ProcessStartMessageUserDataElement(CborValue &value); + void ProcessImageMessageUserDataElement(CborValue &value); + bool ProcessImageMessageElement(CborValue &value); bool ProcessStartMessageElement(CborValue &value); bool ProcessEndMessageElement(CborValue &value); public: diff --git a/frame_serialize/JFJochFrameSerializer.cpp b/frame_serialize/JFJochFrameSerializer.cpp index 3460848b..5be3f65c 100644 --- a/frame_serialize/JFJochFrameSerializer.cpp +++ b/frame_serialize/JFJochFrameSerializer.cpp @@ -361,19 +361,25 @@ void JFJochFrameSerializer::SerializeSequenceEnd(const EndMessage& message) { void JFJochFrameSerializer::SerializeImage(const DataMessage& message) { buffer.resize(max_buffer_size); - CborEncoder encoder, mapEncoder; + CborEncoder encoder, mapEncoder, userDataMapEncoder; cbor_encoder_init(&encoder, buffer.data(), buffer.size(), 0); - cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, 9)); + cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, 4)); CBOR_ENC(mapEncoder, "type", "image"); CBOR_ENC(mapEncoder, "image_id", message.number); CBOR_ENC(mapEncoder, "data", message.image); - CBOR_ENC(mapEncoder, "spots", message.spots); - CBOR_ENC(mapEncoder, "rad_int_profile", message.rad_int_profile); - CBOR_ENC(mapEncoder, "indexing_result", message.indexing_result); - CBOR_ENC(mapEncoder, "bunch_id", message.bunch_id); - CBOR_ENC(mapEncoder, "jf_info", (uint64_t) message.jf_info); - CBOR_ENC(mapEncoder, "timestamp", message.timestamp); + + cborErr(cbor_encode_text_stringz(&mapEncoder, "user_data")); + cborErr(cbor_encoder_create_map(&mapEncoder, &userDataMapEncoder, 6)); + + CBOR_ENC(userDataMapEncoder, "spots", message.spots); + CBOR_ENC(userDataMapEncoder, "rad_int_profile", message.rad_int_profile); + CBOR_ENC(userDataMapEncoder, "indexing_result", message.indexing_result); + CBOR_ENC(userDataMapEncoder, "bunch_id", message.bunch_id); + CBOR_ENC(userDataMapEncoder, "jf_info", (uint64_t) message.jf_info); + CBOR_ENC(userDataMapEncoder, "timestamp", message.timestamp); + cborErr(cbor_encoder_close_container(&mapEncoder, &userDataMapEncoder)); + cborErr(cbor_encoder_close_container(&encoder, &mapEncoder)); buffer.resize(cbor_encoder_get_buffer_size(&encoder, buffer.data()));