diff options
author | Tom Rondeau <trondeau@vt.edu> | 2012-12-05 14:03:03 -0500 |
---|---|---|
committer | Tom Rondeau <trondeau@vt.edu> | 2012-12-05 14:08:42 -0500 |
commit | e8cf359e43f533fd3309389e5d62642f3080ac15 (patch) | |
tree | bcb9b7e4c2425d0397983e8db746749443cfc629 /gnuradio-core/src/lib/io | |
parent | 17c3f992bcd7b671e4e8c0a9dd13c582d256ced9 (diff) |
core: update to metadata files to grow the extras dictionary when any tag is seen.
Diffstat (limited to 'gnuradio-core/src/lib/io')
-rw-r--r-- | gnuradio-core/src/lib/io/gr_file_meta_sink.cc | 59 | ||||
-rw-r--r-- | gnuradio-core/src/lib/io/gr_file_meta_sink.h | 2 |
2 files changed, 29 insertions, 32 deletions
diff --git a/gnuradio-core/src/lib/io/gr_file_meta_sink.cc b/gnuradio-core/src/lib/io/gr_file_meta_sink.cc index f225e4409d..da3be80602 100644 --- a/gnuradio-core/src/lib/io/gr_file_meta_sink.cc +++ b/gnuradio-core/src/lib/io/gr_file_meta_sink.cc @@ -123,7 +123,7 @@ gr_file_meta_sink::write_header(pmt_t header, pmt_t extra) } } -bool +void gr_file_meta_sink::update_header(pmt_t key, pmt_t value) { // Special handling caveat to transform rate from radio source into @@ -133,16 +133,17 @@ gr_file_meta_sink::update_header(pmt_t key, pmt_t value) value = pmt_from_double(d_samp_rate*d_relative_rate); } + // If the tag is not part of the standard header, we put it into the + // extra data, which either updates the current dictionary or adds a + // new item. if(pmt_dict_has_key(d_header, key)) { d_header = pmt_dict_add(d_header, key, value); - return true; - } - else if(pmt_dict_has_key(d_extra, key)) { - d_extra = pmt_dict_add(d_extra, key, value); - return true; } else { - return false; + d_extra = pmt_dict_add(d_extra, key, value); + d_extra_size = pmt_serialize_str(d_extra).size(); + d_header = pmt_dict_add(d_header, mp("strt"), + pmt_from_uint64(METADATA_HEADER_SIZE+d_extra_size)); } } @@ -154,11 +155,10 @@ gr_file_meta_sink::update_last_header() size_t hdrlen = METADATA_HEADER_SIZE+d_extra_size; size_t seg_size = d_itemsize*d_total_seg_size; pmt_t s = pmt_from_uint64(seg_size); - if(update_header(mp("size"), s)) { - fseek(d_fp, -seg_size-hdrlen, SEEK_CUR); - write_header(d_header, d_extra); - fseek(d_fp, seg_size, SEEK_CUR); - } + update_header(mp("size"), s); + fseek(d_fp, -seg_size-hdrlen, SEEK_CUR); + write_header(d_header, d_extra); + fseek(d_fp, seg_size, SEEK_CUR); } void @@ -168,15 +168,14 @@ gr_file_meta_sink::write_and_update() // based on current index + header size. //uint64_t loc = get_last_header_loc(); pmt_t s = pmt_from_uint64(0); - if(update_header(mp("size"), s)) { - // If we have multiple tags on the same offset, this makes - // sure we just overwrite the same header each time instead - // of creating a new header per tag. - s = pmt_from_uint64(METADATA_HEADER_SIZE + d_extra_size); - if(update_header(mp("strt"), s)) { - write_header(d_header, d_extra); - } - } + update_header(mp("size"), s); + + // If we have multiple tags on the same offset, this makes + // sure we just overwrite the same header each time instead + // of creating a new header per tag. + s = pmt_from_uint64(METADATA_HEADER_SIZE + d_extra_size); + update_header(mp("strt"), s); + write_header(d_header, d_extra); } void @@ -233,10 +232,9 @@ gr_file_meta_sink::work(int noutput_items, // Special case where info is carried on the first tag, so we just // overwrite the first header. if(itr->offset == 0) { - if(update_header(itr->key, itr->value)) { - fseek(d_fp, 0, SEEK_SET); - write_header(d_header, d_extra); - } + update_header(itr->key, itr->value); + fseek(d_fp, 0, SEEK_SET); + write_header(d_header, d_extra); } else { int item_offset = (int)(itr->offset - abs_N); @@ -266,14 +264,13 @@ gr_file_meta_sink::work(int noutput_items, if(d_total_seg_size > 0) { update_last_header(); - if(update_header(itr->key, itr->value)) { - write_and_update(); - d_total_seg_size = 0; - } + update_header(itr->key, itr->value); + write_and_update(); + d_total_seg_size = 0; } else { - if(update_header(itr->key, itr->value)) - update_last_header(); + update_header(itr->key, itr->value); + update_last_header(); } } } diff --git a/gnuradio-core/src/lib/io/gr_file_meta_sink.h b/gnuradio-core/src/lib/io/gr_file_meta_sink.h index efe00c4e6a..929c9634e2 100644 --- a/gnuradio-core/src/lib/io/gr_file_meta_sink.h +++ b/gnuradio-core/src/lib/io/gr_file_meta_sink.h @@ -120,7 +120,7 @@ class GR_CORE_API gr_file_meta_sink : public gr_sync_block, public gr_file_sink_ const std::string &extra_dict=""); void write_header(pmt_t header, pmt_t extra); - bool update_header(pmt_t key, pmt_t value); + void update_header(pmt_t key, pmt_t value); void update_last_header(); void write_and_update(); void update_rx_time(); |