diff --git a/frame_serialize/CBORMessages.h b/frame_serialize/CBORMessages.h index 9f1b09c6..17bf2d7c 100644 --- a/frame_serialize/CBORMessages.h +++ b/frame_serialize/CBORMessages.h @@ -11,6 +11,9 @@ #include "../compression/CompressionAlgorithmEnum.h" #include "../common/SpotToSave.h" +constexpr const uint64_t user_data_release = 1; +constexpr const uint64_t user_data_magic_number = 0x52320000UL | user_data_release; + struct CBORImage { const uint8_t *data; size_t size; // Including compression diff --git a/frame_serialize/JFJochFrameDeserializer.cpp b/frame_serialize/JFJochFrameDeserializer.cpp index a83fe831..3fafd480 100644 --- a/frame_serialize/JFJochFrameDeserializer.cpp +++ b/frame_serialize/JFJochFrameDeserializer.cpp @@ -279,6 +279,16 @@ void GetCBORMultidimTypedArray(CBORImage &v, CborValue &value) { cborErr(cbor_value_leave_container(&value, &array_value)); } +bool CheckMagicNumber(CborValue &v) { + auto key = GetCBORString(v); + if (key != "magic_number") { + cbor_value_advance(&v); + return false; + } else { + return GetCBORUInt(v) == user_data_magic_number; + } +} + void JFJochFrameDeserializer::GetCBORSpots(CborValue &value) { size_t array_len = GetCBORArrayLen(value); @@ -365,6 +375,12 @@ void JFJochFrameDeserializer::ProcessDetTranslation(CborValue &value) { void JFJochFrameDeserializer::ProcessImageMessageUserDataElement(CborValue &value) { CborValue map_value; cborErr(cbor_value_enter_container(&value, &map_value)); + + if (!CheckMagicNumber(map_value)) { + cborErr(cbor_value_leave_container(&value, &map_value)); + return; + } + while (!cbor_value_at_end(&map_value)) { auto key = GetCBORString(map_value); @@ -501,6 +517,12 @@ void JFJochFrameDeserializer::ProcessUnitCellElement(CborValue &value) { void JFJochFrameDeserializer::ProcessStartMessageUserDataElement(CborValue &value) { CborValue map_value; cborErr(cbor_value_enter_container(&value, &map_value)); + + if (!CheckMagicNumber(map_value)) { + cborErr(cbor_value_leave_container(&value, &map_value)); + return; + } + while (!cbor_value_at_end(&map_value)) { auto key = GetCBORString(map_value); @@ -626,27 +648,46 @@ bool JFJochFrameDeserializer::ProcessStartMessageElement(CborValue &value) { } } +void JFJochFrameDeserializer::ProcessEndMessageUserDataElement(CborValue &value) { + CborValue map_value; + cborErr(cbor_value_enter_container(&value, &map_value)); + + if (!CheckMagicNumber(map_value)) { + cborErr(cbor_value_leave_container(&value, &map_value)); + return; + } + + while (!cbor_value_at_end(&map_value)) { + auto key = GetCBORString(map_value); + if (key == "number_of_images") + end_message.number_of_images = GetCBORUInt(map_value); + else if (key == "max_receiver_delay") + end_message.max_receiver_delay = GetCBORUInt(map_value); + else if (key == "receiver_efficiency") + end_message.efficiency = GetCBORFloat(map_value); + else if (key == "write_master_file") + end_message.write_master_file = GetCBORBool(map_value); + else if (key == "rad_int_result") + ProcessRadIntResultElement(map_value); + else + cbor_value_advance(&map_value); + } + cborErr(cbor_value_leave_container(&value, &map_value)); +} + bool JFJochFrameDeserializer::ProcessEndMessageElement(CborValue &value) { if (cbor_value_at_end(&value)) return false; else { auto key = GetCBORString(value); - if (key == "number_of_images") - end_message.number_of_images = GetCBORUInt(value); - else if (key == "max_receiver_delay") - end_message.max_receiver_delay = GetCBORUInt(value); - else if (key == "receiver_efficiency") - end_message.efficiency = GetCBORFloat(value); - else if (key == "write_master_file") - end_message.write_master_file = GetCBORBool(value); - else if (key == "end_date") + if (key == "end_date") end_message.end_date = GetCBORString(value); else if (key == "series_unique_id") end_message.series_unique_id = GetCBORString(value); else if (key == "series_id") end_message.series_id = GetCBORUInt(value); - else if (key == "rad_int_result") - ProcessRadIntResultElement(value); + else if (key == "user_data") + ProcessEndMessageUserDataElement(value); else cbor_value_advance(&value); return true; diff --git a/frame_serialize/JFJochFrameDeserializer.h b/frame_serialize/JFJochFrameDeserializer.h index 04ac9aee..bd20ab80 100644 --- a/frame_serialize/JFJochFrameDeserializer.h +++ b/frame_serialize/JFJochFrameDeserializer.h @@ -42,6 +42,7 @@ private: void ProcessUnitCellElement(CborValue &value); void ProcessStartMessageUserDataElement(CborValue &value); void ProcessImageMessageUserDataElement(CborValue &value); + void ProcessEndMessageUserDataElement(CborValue &value); bool ProcessImageMessageElement(CborValue &value); bool ProcessStartMessageElement(CborValue &value); bool ProcessEndMessageElement(CborValue &value); diff --git a/frame_serialize/JFJochFrameSerializer.cpp b/frame_serialize/JFJochFrameSerializer.cpp index 14f533ba..ae5cf7a8 100644 --- a/frame_serialize/JFJochFrameSerializer.cpp +++ b/frame_serialize/JFJochFrameSerializer.cpp @@ -255,7 +255,8 @@ inline void CBOR_ENC_USER_DATA(CborEncoder &encoder, const StartMessage& message CborEncoder mapEncoder; cborErr(cbor_encode_text_stringz(&encoder, "user_data")); - cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, 22)); + cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, 23)); + CBOR_ENC(mapEncoder, "magic_number", user_data_magic_number); CBOR_ENC(mapEncoder, "file_prefix", message.file_prefix); CBOR_ENC(mapEncoder, "sample_name", message.sample_name); @@ -378,20 +379,26 @@ void JFJochFrameSerializer::SerializeSequenceStart(const StartMessage& message) } void JFJochFrameSerializer::SerializeSequenceEnd(const EndMessage& message) { - CborEncoder encoder, mapEncoder; + CborEncoder encoder, mapEncoder, userDataMapEncoder; cbor_encoder_init(&encoder, buffer, max_buffer_size, 0); - cborErr(cbor_encode_tag(&encoder,CborSignatureTag )); - cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, 9)); + cborErr(cbor_encode_tag(&encoder, CborSignatureTag)); + cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, 5)); CBOR_ENC(mapEncoder, "type", "end"); CBOR_ENC(mapEncoder, "series_unique_id", message.series_unique_id); CBOR_ENC(mapEncoder, "series_id", message.series_id); - CBOR_ENC(mapEncoder, "number_of_images", message.number_of_images); - CBOR_ENC(mapEncoder, "max_receiver_delay", message.max_receiver_delay); - CBOR_ENC(mapEncoder, "receiver_efficiency", message.efficiency); - CBOR_ENC(mapEncoder, "write_master_file", message.write_master_file); CBOR_ENC(mapEncoder, "end_date", message.end_date); - CBOR_ENC_RAD_INT_RESULT(mapEncoder, "rad_int_result", message.rad_int_result); + + cborErr(cbor_encode_text_stringz(&mapEncoder, "user_data")); + cborErr(cbor_encoder_create_map(&mapEncoder, &userDataMapEncoder, 6)); + CBOR_ENC(userDataMapEncoder, "magic_number", user_data_magic_number); + CBOR_ENC(userDataMapEncoder, "number_of_images", message.number_of_images); + CBOR_ENC(userDataMapEncoder, "max_receiver_delay", message.max_receiver_delay); + CBOR_ENC(userDataMapEncoder, "receiver_efficiency", message.efficiency); + CBOR_ENC(userDataMapEncoder, "write_master_file", message.write_master_file); + CBOR_ENC_RAD_INT_RESULT(userDataMapEncoder, "rad_int_result", message.rad_int_result); + cborErr(cbor_encoder_close_container(&mapEncoder, &userDataMapEncoder)); + cborErr(cbor_encoder_close_container(&encoder, &mapEncoder)); curr_size = cbor_encoder_get_buffer_size(&encoder, buffer); @@ -416,8 +423,9 @@ void JFJochFrameSerializer::SerializeImage(const DataMessage& message) { message.timestamp_base); cborErr(cbor_encode_text_stringz(&mapEncoder, "user_data")); - cborErr(cbor_encoder_create_map(&mapEncoder, &userDataMapEncoder, 9)); + cborErr(cbor_encoder_create_map(&mapEncoder, &userDataMapEncoder, 10)); + CBOR_ENC(userDataMapEncoder, "magic_number", user_data_magic_number); CBOR_ENC(userDataMapEncoder, "spots", message.spots); CBOR_ENC(userDataMapEncoder, "rad_int_profile", message.rad_int_profile); CBOR_ENC(userDataMapEncoder, "indexing_result", message.indexing_result);