feat(ricepp): some minor speed improvements

This commit is contained in:
Marcus Holland-Moritz 2024-02-05 21:52:03 +01:00
parent f95e59e10b
commit f1672b6c78
2 changed files with 7 additions and 7 deletions

View File

@ -50,20 +50,20 @@ void decode_block(V block, BitstreamReader& reader, PixelTraits const& traits,
if (fsp1 == 0) [[unlikely]] { if (fsp1 == 0) [[unlikely]] {
std::fill(block.begin(), block.end(), traits.write(last)); std::fill(block.begin(), block.end(), traits.write(last));
} else if (fsp1 > kFsMax) [[unlikely]] { } else if (fsp1 > kFsMax) [[unlikely]] {
for (size_t i = 0; i < block.size(); ++i) { for (auto& b : block) {
block[i] = reader.template read_bits<pixel_value_type>(kPixelBits); b = reader.template read_bits<pixel_value_type>(kPixelBits);
} }
last = traits.read(block.back()); last = traits.read(block.back());
} else { } else {
auto const fs = fsp1 - 1; auto const fs = fsp1 - 1;
for (size_t i = 0; i < block.size(); ++i) { for (auto& b : block) {
pixel_value_type diff = reader.find_first_set() << fs; pixel_value_type diff = reader.find_first_set() << fs;
if (fs > 0) { if (fs > 0) {
diff |= reader.template read_bits<pixel_value_type>(fs); diff |= reader.template read_bits<pixel_value_type>(fs);
} }
last += static_cast<std::make_signed_t<pixel_value_type>>( last += static_cast<std::make_signed_t<pixel_value_type>>(
(diff & 1) ? ~(diff >> 1) : (diff >> 1)); (diff & 1) ? ~(diff >> 1) : (diff >> 1));
block[i] = traits.write(last); b = traits.write(last);
} }
} }

View File

@ -125,8 +125,8 @@ void encode_block(V block, BitstreamWriter& writer, PixelTraits const& traits,
// the input pixel data. This is really unlikely, so reading the input // the input pixel data. This is really unlikely, so reading the input
// pixels again is fine. // pixels again is fine.
writer.write_bits(kFsMax + 1, kFsBits); writer.write_bits(kFsMax + 1, kFsBits);
for (size_t i = 0; i < block.size(); ++i) { for (auto& b : block) {
writer.write_bits(block[i], kPixelBits); writer.write_bits(b, kPixelBits);
} }
} else { } else {
// Encode the difference values using Rice entropy coding. // Encode the difference values using Rice entropy coding.
@ -134,7 +134,7 @@ void encode_block(V block, BitstreamWriter& writer, PixelTraits const& traits,
for (size_t i = 0; i < block.size(); ++i) { for (size_t i = 0; i < block.size(); ++i) {
pixel_value_type const diff = delta[i]; pixel_value_type const diff = delta[i];
pixel_value_type const top = diff >> fs; pixel_value_type const top = diff >> fs;
if (top > 0) { if (top > 0) [[unlikely]] {
writer.write_bit(0, top); writer.write_bit(0, top);
} }
writer.write_bit(1); writer.write_bit(1);