30 const CompressionMetadata& metadata) {
31 const FwDpIdType record_id = this->getIdBase() + RecordId::CompressionRecord;
38 static_cast<FwSizeStoreType>(compressed_payload_size + CompressionMetadata::SERIALIZED_SIZE));
46 Fw::Enabled en_compression = paramGet_ENABLE(param_valid);
53 if (!isConnected_compressChunk_OutputPort(0)) {
67 this->log_WARNING_HI_InvalidHeader(fwBuffer.
getSize(),
static_cast<U32
>(desStat));
73 if (fwBuffer.
getSize() >= std::numeric_limits<FwSizeStoreType>::max()) {
74 this->log_WARNING_HI_ContainerTooLarge(container.getId(), container.getDataSize());
79 this->log_WARNING_HI_BufferTooSmallForPacket(fwBuffer.
getSize(),
84 FwSizeType prm_chunk_size = paramGet_CHUNK_SIZE(param_valid);
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);
161 CompressionAlgorithm alg = CompressionAlgorithm::UNCOMPRESSED;
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);
224 if (alg != CompressionAlgorithm::UNCOMPRESSED) {
227 FW_ASSERT(compression_buffer.getSize() <= min_compression + compression_offset,
229 static_cast<FwAssertArgType>(min_compression),
234 if (alg != CompressionAlgorithm::UNCOMPRESSED) {
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),
270 CompressionMetadata(CompressionAlgorithm::UNCOMPRESSED));
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),
305 CompressionMetadata(CompressionAlgorithm::UNCOMPRESSED));
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));
372 log_ACTIVITY_LO_DidNotCompress(container.getId(), container.getDataSize());
374 case LAST_UNCOMPRESSED:
379 serializeCompressionHeader(data_reser, static_cast<FwSizeStoreType>(uncompressed_size),
380 CompressionMetadata(CompressionAlgorithm::UNCOMPRESSED));
387 case LAST_COMPRESSED:
392 FwSizeType comp_data_size = data_reser.getSize();
393 log_DIAGNOSTIC_CompressionComplete(container.getId(), container.getDataSize(), comp_data_size);
395 container.setDataSize(comp_data_size);
396 container.serializeHeader();
Serialization/Deserialization operation was successful.
A data product Container.
#define FW_PARAM_OK(paramValid)
PlatformSizeType FwSizeType
static constexpr FwSizeType MIN_PACKET_SIZE
SerializeStatus serializeFrom(U8 val, Endianness mode=Endianness::BIG) override
Serialize an 8-bit unsigned integer value.
SerializeStatus
forward declaration for string
Omit length from serialization.
~DpCompressProc()
Destroy DpCompressProc object.
FwSizeType FwSizeStoreType
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.
DpCompressProc(const char *const compName)
Construct DpCompressProc object.
PlatformIndexType FwIndexType
RateGroupDivider component implementation.
Enum representing parameter validity.
PlatformAssertArgType FwAssertArgType
The type of arguments to assert functions.