73 if (fwBuffer.
getSize() >= std::numeric_limits<FwSizeStoreType>::max()) {
87 if (prm_chunk_size > container.getDataSize()) {
88 prm_chunk_size = container.getDataSize();
90 const FwSizeType max_chunk_size = prm_chunk_size;
91 FW_ASSERT(max_chunk_size <= std::numeric_limits<FwSizeStoreType>::max(),
92 static_cast<FwAssertArgType>(max_chunk_size));
93 if (max_chunk_size <= 0) {
102 auto data_deser = data_buffer.getDeserializer();
103 auto data_reser = data_buffer.getSerializer();
138 U8* uncompressed_head =
nullptr;
141 while (data_deser.getDeserializeSizeLeft() > 0) {
143 const FwSizeType chunk_size_tmp = (data_deser.getDeserializeSizeLeft() < max_chunk_size)
144 ? static_cast<FwSizeType>(data_deser.getDeserializeSizeLeft())
148 FW_ASSERT(chunk_size_tmp > 0, static_cast<FwAssertArgType>(chunk_size_tmp));
149 FW_ASSERT(chunk_size_tmp <= std::numeric_limits<FwSizeStoreType>::max(),
150 static_cast<FwAssertArgType>(chunk_size_tmp));
153 U8* data_offset = data_buffer.getData() + (data_buffer.getSize() - data_deser.getDeserializeSizeLeft());
155 Fw::Buffer compression_buffer(data_offset, chunk_size);
158 ser_stat = data_deser.deserializeSkip(chunk_size);
169 if (chunk_size > 4 * compression_header_size) {
176 min_compression = chunk_size - 2 * compression_header_size;
180 compression_offset = compression_header_size;
187 min_compression = chunk_size - 3 * compression_header_size;
191 compression_offset = 2 * compression_header_size;
193 case LAST_UNCOMPRESSED:
194 case LAST_COMPRESSED:
202 min_compression = chunk_size - (2 * compression_header_size);
205 compression_offset = compression_header_size;
212 if (min_compression > chunk_size - compression_offset) {
213 min_compression = chunk_size - compression_offset;
216 FW_ASSERT(min_compression <= chunk_size, static_cast<FwAssertArgType>(min_compression),
217 static_cast<FwAssertArgType>(chunk_size));
219 FW_ASSERT(compression_offset <= chunk_size, static_cast<FwAssertArgType>(compression_offset),
220 static_cast<FwAssertArgType>(chunk_size));
222 alg =
compressChunk_out(0, compression_buffer, min_compression, compression_offset);
227 FW_ASSERT(compression_buffer.getSize() <= min_compression + compression_offset,
229 static_cast<FwAssertArgType>(min_compression),
237 U8*
const comp_data_ptr = compression_buffer.getData() + compression_offset;
240 static_cast<FwSizeType>(compression_buffer.getSize()) - static_cast<FwSizeType>(compression_offset);
241 FW_ASSERT(compressed_size_tmp <= std::numeric_limits<FwSizeStoreType>::max());
242 FW_ASSERT(compressed_size_tmp < chunk_size);
249 state = LAST_COMPRESSED;
252 const FwSizeType deser_loc = data_deser.getSize() - data_deser.getDeserializeSizeLeft();
262 FW_ASSERT(deser_loc >= (uncompressed_size + 2 * compression_header_size + compressed_size),
263 static_cast<FwAssertArgType>(deser_loc), static_cast<FwAssertArgType>(uncompressed_size),
264 static_cast<FwAssertArgType>(compressed_size));
265 (void)std::memmove(data_buffer.getData() + compression_header_size, data_buffer.getData(),
269 serializeCompressionHeader(data_reser, static_cast<FwSizeStoreType>(uncompressed_size),
273 ser_stat = data_reser.serializeSkip(uncompressed_size);
276 serializeCompressionHeader(data_reser, compressed_size, CompressionMetadata(alg));
281 case LAST_COMPRESSED:
285 serializeCompressionHeader(data_reser, compressed_size, CompressionMetadata(alg));
290 case LAST_UNCOMPRESSED:
301 (data_reser.getSize() + uncompressed_size + 2 * compression_header_size + compressed_size),
302 static_cast<FwAssertArgType>(deser_loc),
static_cast<FwAssertArgType>(data_reser.getSize()),
303 static_cast<FwAssertArgType>(uncompressed_size),
static_cast<FwAssertArgType>(compressed_size));
304 serializeCompressionHeader(data_reser, static_cast<FwSizeStoreType>(uncompressed_size),
312 serializeCompressionHeader(data_reser, compressed_size, CompressionMetadata(alg));
323 uncompressed_size = 0;
324 uncompressed_head =
nullptr;
325 state = LAST_COMPRESSED;
342 case LAST_COMPRESSED:
346 uncompressed_head = compression_buffer.getData();
348 state = LAST_UNCOMPRESSED;
350 case LAST_UNCOMPRESSED:
353 state = LAST_UNCOMPRESSED;
359 uncompressed_size += chunk_size;
363 const FwSizeType ser_loc = data_reser.getSize();
364 const FwSizeType deser_loc =
static_cast<uintptr_t
>(data_deser.getBuffAddrLeft() - data_buffer.getData());
365 FW_ASSERT(ser_loc <= deser_loc, static_cast<FwAssertArgType>(ser_loc), static_cast<FwAssertArgType>(deser_loc));
374 case LAST_UNCOMPRESSED:
379 serializeCompressionHeader(data_reser, static_cast<FwSizeStoreType>(uncompressed_size),
387 case LAST_COMPRESSED:
392 FwSizeType comp_data_size = data_reser.getSize();
395 container.setDataSize(comp_data_size);
396 container.serializeHeader();
Serialization/Deserialization operation was successful.
A data product Container.
void log_WARNING_HI_BufferTooSmallForPacket(FwSizeType buffer_size, FwSizeType min_size)
#define FW_PARAM_OK(paramValid)
FwIdType getIdBase() const
PlatformSizeType FwSizeType
void log_WARNING_HI_InvalidHeader(FwSizeType buffer_size, U32 error_code)
static constexpr FwSizeType MIN_PACKET_SIZE
SerializeStatus serializeFrom(U8 val, Endianness mode=Endianness::BIG) override
Serialize an 8-bit unsigned integer value.
bool isConnected_compressChunk_OutputPort(FwIndexType portNum) const
SerializeStatus
forward declaration for string
void log_ACTIVITY_LO_DidNotCompress(FwDpIdType dp_id, FwSizeType data_size)
Log event DidNotCompress.
U16 FwSizeStoreType
The type used to serialize a size value.
Auto-generated base for DpCompressProc component.
Omit length from serialization.
~DpCompressProc()
Destroy DpCompressProc object.
Svc::CompressionAlgorithm compressChunk_out(FwIndexType portNum, Fw::Buffer &buffer, FwSizeType min_compression, FwSizeType write_offset) const
Invoke output port compressChunk.
void log_DIAGNOSTIC_CompressionComplete(FwDpIdType dp_id, FwSizeType initial_size, FwSizeType final_size) const
Log event CompressionComplete.
Enabled and disabled states.
static constexpr FwSizeType DATA_OFFSET
The data offset.
uint8_t U8
8-bit unsigned integer
FwSizeType getSize() const
FwIdType FwDpIdType
The type of a data product identifier.
FwSizeStoreType paramGet_CHUNK_SIZE(Fw::ParamValid &valid)
DpCompressProc(const char *const compName)
Construct DpCompressProc object.
PlatformIndexType FwIndexType
RateGroupDivider component implementation.
Enum representing parameter validity.
void log_WARNING_HI_ContainerTooLarge(FwDpIdType dp_id, FwSizeType data_size)
Fw::Enabled paramGet_ENABLE(Fw::ParamValid &valid)
PlatformAssertArgType FwAssertArgType
The type of arguments to assert functions.