From: Marcus Comstedt Date: Sun, 4 Aug 2013 14:29:45 +0000 (+0200) Subject: Implement portable LA sample packing and unpacking. X-Git-Tag: pulseview-0.2.0~67 X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=commitdiff_plain;h=8cb717055ce13a6d6568ff384b3cd3932c41d1b0 Implement portable LA sample packing and unpacking. --- diff --git a/pv/data/logicsnapshot.cpp b/pv/data/logicsnapshot.cpp index 754a456c..a1beafb9 100644 --- a/pv/data/logicsnapshot.cpp +++ b/pv/data/logicsnapshot.cpp @@ -62,6 +62,72 @@ LogicSnapshot::~LogicSnapshot() free(l.data); } +uint64_t LogicSnapshot::unpack_sample(const uint8_t *ptr) const +{ + uint64_t value = 0; + switch(_unit_size) { + default: + value |= ((uint64_t)ptr[7]) << 56; + /* FALLTHRU */ + case 7: + value |= ((uint64_t)ptr[6]) << 48; + /* FALLTHRU */ + case 6: + value |= ((uint64_t)ptr[5]) << 40; + /* FALLTHRU */ + case 5: + value |= ((uint64_t)ptr[4]) << 32; + /* FALLTHRU */ + case 4: + value |= ((uint32_t)ptr[3]) << 24; + /* FALLTHRU */ + case 3: + value |= ((uint32_t)ptr[2]) << 16; + /* FALLTHRU */ + case 2: + value |= ptr[1] << 8; + /* FALLTHRU */ + case 1: + value |= ptr[0]; + /* FALLTHRU */ + case 0: + break; + } + return value; +} + +void LogicSnapshot::pack_sample(uint8_t *ptr, uint64_t value) +{ + switch(_unit_size) { + default: + ptr[7] = value >> 56; + /* FALLTHRU */ + case 7: + ptr[6] = value >> 48; + /* FALLTHRU */ + case 6: + ptr[5] = value >> 40; + /* FALLTHRU */ + case 5: + ptr[4] = value >> 32; + /* FALLTHRU */ + case 4: + ptr[3] = value >> 24; + /* FALLTHRU */ + case 3: + ptr[2] = value >> 16; + /* FALLTHRU */ + case 2: + ptr[1] = value >> 8; + /* FALLTHRU */ + case 1: + ptr[0] = value; + /* FALLTHRU */ + case 0: + break; + } +} + void LogicSnapshot::append_payload( const sr_datafeed_logic &logic) { @@ -139,13 +205,13 @@ void LogicSnapshot::append_payload_to_mipmap() diff_counter = MipMapScaleFactor; while (diff_counter-- > 0) { - const uint64_t sample = *(uint64_t*)src_ptr; + const uint64_t sample = unpack_sample(src_ptr); accumulator |= _last_append_sample ^ sample; _last_append_sample = sample; src_ptr += _unit_size; } - *(uint64_t*)dest_ptr = accumulator; + pack_sample(dest_ptr, accumulator); dest_ptr += _unit_size; } @@ -179,11 +245,11 @@ void LogicSnapshot::append_payload_to_mipmap() diff_counter = MipMapScaleFactor; while (diff_counter-- > 0) { - accumulator |= *(uint64_t*)src_ptr; + accumulator |= unpack_sample(src_ptr); src_ptr += _unit_size; } - *(uint64_t*)dest_ptr = accumulator; + pack_sample(dest_ptr, accumulator); } } } @@ -193,7 +259,7 @@ uint64_t LogicSnapshot::get_sample(uint64_t index) const assert(_data); assert(index < _sample_count); - return *(uint64_t*)((uint8_t*)_data + index * _unit_size); + return unpack_sample((uint8_t*)_data + index * _unit_size); } void LogicSnapshot::get_subsampled_edges( @@ -379,7 +445,7 @@ uint64_t LogicSnapshot::get_subsample(int level, uint64_t offset) const { assert(level >= 0); assert(_mip_map[level].data); - return *(uint64_t*)((uint8_t*)_mip_map[level].data + + return unpack_sample((uint8_t*)_mip_map[level].data + _unit_size * offset); } diff --git a/pv/data/logicsnapshot.h b/pv/data/logicsnapshot.h index 50fb6f83..0f6f410c 100644 --- a/pv/data/logicsnapshot.h +++ b/pv/data/logicsnapshot.h @@ -69,6 +69,9 @@ public: int64_t start_sample, int64_t end_sample) const; private: + uint64_t unpack_sample(const uint8_t *ptr) const; + void pack_sample(uint8_t *ptr, uint64_t value); + void reallocate_mipmap_level(MipMapLevel &m); void append_payload_to_mipmap();