diff --git a/frame_serialize/CBORStream2Deserializer.cpp b/frame_serialize/CBORStream2Deserializer.cpp index cd2bc51b..9389a288 100644 --- a/frame_serialize/CBORStream2Deserializer.cpp +++ b/frame_serialize/CBORStream2Deserializer.cpp @@ -822,44 +822,50 @@ void CBORStream2Deserializer::Process(const std::vector &buffer) { } void CBORStream2Deserializer::Process(const uint8_t *msg, size_t msg_size) { -std::unique_lock ul(m); + std::unique_lock ul(m); data_message = DataMessage(); CborParser parser; CborValue 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"); + try { + cborErr(cbor_parser_init(msg, msg_size, 0, &parser, &value)); + + if (GetCBORTag(value) != CborSignatureTag) + 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)); + if (cbor_value_is_map(&value)) { + CborValue map_value; + cborErr(cbor_value_enter_container(&value, &map_value)); - DecodeType(map_value); - switch (msg_type) { - case Type::IMAGE: - while (ProcessImageMessageElement(map_value)); - break; - case Type::START: - start_message = StartMessage{ - .data_file_count = 1 - }; - while (ProcessStartMessageElement(map_value)); - break; - case Type::END: - end_message = EndMessage{}; - while (ProcessEndMessageElement(map_value)); - break; - case Type::NONE: - break; - } + DecodeType(map_value); + switch (msg_type) { + case Type::IMAGE: + while (ProcessImageMessageElement(map_value)); + break; + case Type::START: + start_message = StartMessage{ + .data_file_count = 1 + }; + while (ProcessStartMessageElement(map_value)); + break; + case Type::END: + end_message = EndMessage{}; + while (ProcessEndMessageElement(map_value)); + break; + case Type::NONE: + break; + } - cborErr(cbor_value_leave_container(&value, &map_value)); - } else - throw JFJochException(JFJochExceptionCategory::CBORError, - "Serialized frame must be map in top level"); + cborErr(cbor_value_leave_container(&value, &map_value)); + } else + throw JFJochException(JFJochExceptionCategory::CBORError, + "Serialized frame must be map in top level"); + } catch (...) { + msg_type = Type::NONE; + throw; + } } DataMessage CBORStream2Deserializer::GetDataMessage() const { diff --git a/writer/StreamWriter.cpp b/writer/StreamWriter.cpp index 86f7039c..679bb27c 100644 --- a/writer/StreamWriter.cpp +++ b/writer/StreamWriter.cpp @@ -14,8 +14,11 @@ StreamWriter::StreamWriter(ZMQContext &context, Logger &in_logger, const std::st void StreamWriter::CollectImages(std::vector &v) { bool run = true; - while (run && (image_puller.GetFrameType() != CBORStream2Deserializer::Type::START)) - run = image_puller.WaitForImage(); + while (run && (image_puller.GetFrameType() != CBORStream2Deserializer::Type::START)) { + if (image_puller.GetFrameType() == CBORStream2Deserializer::Type::IMAGE) + logger.Warning("Missing meaningful image while waiting for START"); + run = WaitForImage(); + } if (!run) return; @@ -34,7 +37,7 @@ void StreamWriter::CollectImages(std::vector &v) { HDF5Writer writer(start_message); bool first_image = true; - run = image_puller.WaitForImage(); + run = WaitForImage(); while (run && (image_puller.GetFrameType() == CBORStream2Deserializer::Type::IMAGE)) { if (first_image) { state = StreamWriterState::Receiving; @@ -51,7 +54,7 @@ void StreamWriter::CollectImages(std::vector &v) { processed_images++; processed_image_size += image_array.image.size; - run = image_puller.WaitForImage(); + run = WaitForImage(); } if (image_puller.GetFrameType() == CBORStream2Deserializer::Type::END) { @@ -90,6 +93,15 @@ StreamWriterOutput StreamWriter::Run() { return ret; } +bool StreamWriter::WaitForImage() { + try { + return image_puller.WaitForImage(); + } catch (const JFJochException &e) { + logger.ErrorException(e); + return false; + } +} + StreamWriterStatistics StreamWriter::GetStatistics() const { float perf_MBs = 0.0f, perf_Hz = 0.0f; diff --git a/writer/StreamWriter.h b/writer/StreamWriter.h index a5854755..96dcd805 100644 --- a/writer/StreamWriter.h +++ b/writer/StreamWriter.h @@ -35,11 +35,11 @@ class StreamWriter { ZMQImagePuller image_puller; Logger &logger; void CollectImages(std::vector &v); + bool WaitForImage(); public: StreamWriter(ZMQContext& context, Logger &logger, const std::string& zmq_addr, const std::string& repub_address = ""); StreamWriterOutput Run(); void Cancel(); - StreamWriterStatistics GetStatistics() const; };