X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Flogicsnapshot.cpp;h=e6fd26e33b68f742a8547894487ddf7f719a5bd3;hp=03e6a54f2e7c097bb2909c9ad1ae1fbe671bbaf5;hb=023887ca1d8a104b4bef287b7cea8d403044a41b;hpb=1b1ec774978b65209ce2b454cbf81da499b797d2 diff --git a/pv/data/logicsnapshot.cpp b/pv/data/logicsnapshot.cpp index 03e6a54f..e6fd26e3 100644 --- a/pv/data/logicsnapshot.cpp +++ b/pv/data/logicsnapshot.cpp @@ -60,23 +60,27 @@ void LogicSnapshot::append_payload( const sr_datafeed_logic &logic) { assert(_unit_size == logic.unitsize); + assert((logic.length % _unit_size) == 0); lock_guard lock(_mutex); - append_data(logic.data, logic.length); + append_data(logic.data, logic.length / _unit_size); // Generate the first mip-map from the data append_payload_to_mipmap(); } -void LogicSnapshot::reallocate_mip_map(MipMapLevel &m) +void LogicSnapshot::reallocate_mipmap_level(MipMapLevel &m) { const uint64_t new_data_length = ((m.length + MipMapDataUnit - 1) / MipMapDataUnit) * MipMapDataUnit; if (new_data_length > m.data_length) { m.data_length = new_data_length; - m.data = realloc(m.data, new_data_length * _unit_size); + + // Padding is added to allow for the uint64_t write word + m.data = realloc(m.data, new_data_length * _unit_size + + sizeof(uint64_t)); } } @@ -97,14 +101,12 @@ void LogicSnapshot::append_payload_to_mipmap() if (m0.length == prev_length) return; - reallocate_mip_map(m0); + reallocate_mipmap_level(m0); dest_ptr = (uint8_t*)m0.data + prev_length * _unit_size; // Iterate through the samples to populate the first level mipmap - accumulator = 0; - diff_counter = MipMapScaleFactor; - const uint8_t *end_src_ptr = (uint8_t*)_data + + const uint8_t *const end_src_ptr = (uint8_t*)_data + m0.length * _unit_size * MipMapScaleFactor; for (src_ptr = (uint8_t*)_data + prev_length * _unit_size * MipMapScaleFactor; @@ -139,12 +141,12 @@ void LogicSnapshot::append_payload_to_mipmap() if (m.length == prev_length) break; - reallocate_mip_map(m); + reallocate_mipmap_level(m); // Subsample the level lower level src_ptr = (uint8_t*)ml.data + _unit_size * prev_length * MipMapScaleFactor; - const uint8_t *end_dest_ptr = + const uint8_t *const end_dest_ptr = (uint8_t*)m.data + _unit_size * m.length; for (dest_ptr = (uint8_t*)m.data + _unit_size * prev_length; @@ -167,7 +169,7 @@ void LogicSnapshot::append_payload_to_mipmap() uint64_t LogicSnapshot::get_sample(uint64_t index) const { assert(_data); - assert(index >= 0 && index < _sample_count); + assert(index < _sample_count); return *(uint64_t*)((uint8_t*)_data + index * _unit_size); } @@ -182,7 +184,6 @@ void LogicSnapshot::get_subsampled_edges( bool last_sample; bool fast_forward; - assert(start >= 0); assert(end <= get_sample_count()); assert(start <= end); assert(min_length > 0); @@ -204,7 +205,10 @@ void LogicSnapshot::get_subsampled_edges( { //----- Continue to search -----// level = min_level; - fast_forward = true; + + // We cannot fast-forward if there is no mip-map data at + // at the minimum level. + fast_forward = (_mip_map[level].data != NULL); if (min_length < MipMapScaleFactor) { @@ -241,7 +245,8 @@ void LogicSnapshot::get_subsampled_edges( // We can fast forward only if there was no change const bool sample = (get_sample(index) & sig_mask) != 0; - fast_forward = last_sample == sample; + if (last_sample != sample) + fast_forward = false; } if (fast_forward) { @@ -258,7 +263,6 @@ void LogicSnapshot::get_subsampled_edges( (level + 1) * MipMapScalePower; const uint64_t offset = index >> level_scale_power; - assert(offset >= 0); // Check if we reached the last block at this // level, or if there was a change in this block @@ -293,7 +297,6 @@ void LogicSnapshot::get_subsampled_edges( (level + 1) * MipMapScalePower; const uint64_t offset = index >> level_scale_power; - assert(offset >= 0); // Check if we reached the last block at this // level, or if there was a change in this block