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]] {
std::fill(block.begin(), block.end(), traits.write(last));
} else if (fsp1 > kFsMax) [[unlikely]] {
for (size_t i = 0; i < block.size(); ++i) {
block[i] = reader.template read_bits<pixel_value_type>(kPixelBits);
for (auto& b : block) {
b = reader.template read_bits<pixel_value_type>(kPixelBits);
}
last = traits.read(block.back());
} else {
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;
if (fs > 0) {
diff |= reader.template read_bits<pixel_value_type>(fs);
}
last += static_cast<std::make_signed_t<pixel_value_type>>(
(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
// pixels again is fine.
writer.write_bits(kFsMax + 1, kFsBits);
for (size_t i = 0; i < block.size(); ++i) {
writer.write_bits(block[i], kPixelBits);
for (auto& b : block) {
writer.write_bits(b, kPixelBits);
}
} else {
// 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) {
pixel_value_type const diff = delta[i];
pixel_value_type const top = diff >> fs;
if (top > 0) {
if (top > 0) [[unlikely]] {
writer.write_bit(0, top);
}
writer.write_bit(1);