From 5b32118626b8bdbcadfb5c6a715e12dfc36e069f Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sat, 9 Apr 2022 21:03:49 -0500 Subject: [PATCH] Raster Data Packet RLE decoding to levels --- .../scwx/wsr88d/rpg/raster_data_packet.hpp | 2 ++ .../scwx/wsr88d/rpg/raster_data_packet.cpp | 30 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/wxdata/include/scwx/wsr88d/rpg/raster_data_packet.hpp b/wxdata/include/scwx/wsr88d/rpg/raster_data_packet.hpp index db1e0726..b24f87b0 100644 --- a/wxdata/include/scwx/wsr88d/rpg/raster_data_packet.hpp +++ b/wxdata/include/scwx/wsr88d/rpg/raster_data_packet.hpp @@ -37,6 +37,8 @@ public: uint16_t number_of_rows() const; uint16_t packaging_descriptor() const; + const std::vector& level(uint16_t r) const; + size_t data_size() const override; bool Parse(std::istream& is) override; diff --git a/wxdata/source/scwx/wsr88d/rpg/raster_data_packet.cpp b/wxdata/source/scwx/wsr88d/rpg/raster_data_packet.cpp index fb0bf908..3915ed7b 100644 --- a/wxdata/source/scwx/wsr88d/rpg/raster_data_packet.cpp +++ b/wxdata/source/scwx/wsr88d/rpg/raster_data_packet.cpp @@ -22,8 +22,9 @@ public: { uint16_t numberOfBytes_; std::vector data_; + std::vector level_; - Row() : numberOfBytes_ {0}, data_ {} {} + Row() : numberOfBytes_ {0}, data_ {}, level_ {} {} }; explicit RasterDataPacketImpl() : @@ -120,6 +121,11 @@ uint16_t RasterDataPacket::packaging_descriptor() const return p->packagingDescriptor_; } +const std::vector& RasterDataPacket::level(uint16_t r) const +{ + return p->row_[r].level_; +} + size_t RasterDataPacket::data_size() const { return p->dataSize_; @@ -212,6 +218,28 @@ bool RasterDataPacket::Parse(std::istream& is) { row.data_.pop_back(); } + + // Unpack the levels from the Run Length Encoded data + uint16_t binCount = + std::accumulate(row.data_.cbegin(), + row.data_.cend(), + 0, + [](const uint16_t& a, const uint8_t& b) -> uint16_t + { return a + (b >> 4); }); + + row.level_.resize(binCount); + + uint16_t b = 0; + for (auto it = row.data_.cbegin(); it != row.data_.cend(); it++) + { + uint8_t run = *it >> 4; + uint8_t level = *it & 0x0f; + + for (int i = 0; i < run && b < binCount; i++) + { + row.level_[b++] = level; + } + } } }