From 8127c117cb502e0249109c802c3d0b35c2c55146 Mon Sep 17 00:00:00 2001 From: gichan Date: Tue, 30 Aug 2022 19:30:23 +0900 Subject: [PATCH] [Common] Adding serialize/deserialze the edge data. Adding serialize and deserialize the edge data. Signed-off-by: gichan --- .../nnstreamer-edge-common.c | 125 ++++++++++++++++++ .../nnstreamer-edge-common.h | 23 ++++ 2 files changed, 148 insertions(+) diff --git a/src/libnnstreamer-edge/nnstreamer-edge-common.c b/src/libnnstreamer-edge/nnstreamer-edge-common.c index 4bce06d..389f23b 100644 --- a/src/libnnstreamer-edge/nnstreamer-edge-common.c +++ b/src/libnnstreamer-edge/nnstreamer-edge-common.c @@ -874,3 +874,128 @@ nns_edge_data_deserialize_meta (nns_edge_data_h data_h, void *data, nns_edge_unlock (ed); return ret; } + +/** + * @brief Serialize edge data (meta data + raw data). + * @note This is internal function, DO NOT export this. Caller should release the returned value using free(). + */ +int +nns_edge_data_serialize (nns_edge_data_h data_h, void **data, size_t *len) +{ + nns_edge_data_s *ed; + nns_edge_data_header_s edata_header; + void *meta_serialized = NULL; + size_t total, header_len, data_len; + char *serialized, *ptr; + unsigned int n; + int ret; + + ed = (nns_edge_data_s *) data_h; + if (!ed || !data || !len) { + nns_edge_loge ("Invalid param, one of the given param is null."); + return NNS_EDGE_ERROR_INVALID_PARAMETER; + } + + nns_edge_lock (ed); + + if (!NNS_EDGE_MAGIC_IS_VALID (ed)) { + nns_edge_loge ("Invalid param, given edge data is invalid."); + nns_edge_unlock (ed); + return NNS_EDGE_ERROR_INVALID_PARAMETER; + } + + header_len = sizeof (nns_edge_data_header_s); + + data_len = 0; + edata_header.num_mem = ed->num; + for (n = 0; n < ed->num; n++) { + edata_header.data_len[n] = ed->data[n].data_len; + data_len += ed->data[n].data_len; + } + + ret = + nns_edge_metadata_serialize (&ed->metadata, &meta_serialized, + &edata_header.meta_len); + if (NNS_EDGE_ERROR_NONE != ret) { + goto done; + } + + total = header_len + data_len + edata_header.meta_len; + + serialized = ptr = (char *) malloc (total); + if (!serialized) { + ret = NNS_EDGE_ERROR_OUT_OF_MEMORY; + goto done; + } + + /** Copy serialization header of edge data */ + memcpy (ptr, &edata_header, header_len); + ptr += header_len; + + /** Copy edge data */ + for (n = 0; n < ed->num; n++) { + memcpy (ptr, ed->data[n].data, ed->data[n].data_len); + ptr += ed->data[n].data_len; + } + + /** Copy edge meta data */ + memcpy (ptr, meta_serialized, edata_header.meta_len); + + *data = serialized; + *len = total; + +done: + nns_edge_free (meta_serialized); + nns_edge_unlock (ed); + return ret; +} + +/** + * @brief Deserialize metadata in edge data. + * @note This is internal function, DO NOT export this. Caller should release the returned value using free(). + */ +int +nns_edge_data_deserialize (nns_edge_data_h data_h, void *data) +{ + nns_edge_data_s *ed; + nns_edge_data_header_s *header; + int ret; + unsigned int n; + size_t meta_len; + char *ptr; + + ed = (nns_edge_data_s *) data_h; + if (!ed || !data) { + nns_edge_loge ("Invalid param, one of the given param is null."); + return NNS_EDGE_ERROR_INVALID_PARAMETER; + } + + nns_edge_lock (ed); + + if (!NNS_EDGE_MAGIC_IS_VALID (ed)) { + nns_edge_loge ("Invalid param, given edge data is invalid."); + nns_edge_unlock (ed); + return NNS_EDGE_ERROR_INVALID_PARAMETER; + } + + ptr = (char *) data; + header = (nns_edge_data_header_s *) ptr; + + ed->num = header->num_mem; + for (n = 0; n < ed->num; n++) { + ed->data[n].data_len = header->data_len[n]; + } + meta_len = header->meta_len; + + ptr += sizeof (nns_edge_data_header_s); + + for (n = 0; n < ed->num; n++) { + ed->data[n].data = nns_edge_memdup (ptr, ed->data[n].data_len); + ptr += ed->data[n].data_len; + } + + ret = nns_edge_metadata_deserialize (&ed->metadata, ptr, meta_len); + + nns_edge_unlock (ed); + return ret; +} diff --git a/src/libnnstreamer-edge/nnstreamer-edge-common.h b/src/libnnstreamer-edge/nnstreamer-edge-common.h index 920aa77..78dd493 100644 --- a/src/libnnstreamer-edge/nnstreamer-edge-common.h +++ b/src/libnnstreamer-edge/nnstreamer-edge-common.h @@ -74,6 +74,15 @@ typedef struct { nns_edge_raw_data_s data; } nns_edge_event_s; +/** + * @brief Internal data structure for the header of the serialzied edge data. + */ +typedef struct { + unsigned int num_mem; + size_t data_len[NNS_EDGE_DATA_LIMIT]; + size_t meta_len; +} nns_edge_data_header_s; + /** * @brief Internal function to initialize metadata structure. */ @@ -145,6 +154,20 @@ int nns_edge_data_serialize_meta (nns_edge_data_h data_h, void **data, size_t *d */ int nns_edge_data_deserialize_meta (nns_edge_data_h data_h, void *data, size_t data_len); +/** + * @brief Serialize entire edge data (meta data + raw data). + * @note This is internal function, DO NOT export this. Caller should release the returned value using free(). + */ +int +nns_edge_data_serialize (nns_edge_data_h data_h, void **data, size_t *data_len); + +/** + * @brief Deserialize entire edge data (meta data + raw data). + * @note This is internal function, DO NOT export this. Caller should release the returned value using free(). + */ +int +nns_edge_data_deserialize (nns_edge_data_h data_h, void *data); + #ifdef __cplusplus } #endif /* __cplusplus */ -- 2.34.1