From 7b961ff3296c6290a4544a82d163a573b7bd2423 Mon Sep 17 00:00:00 2001 From: Ynse Hoornenborg Date: Fri, 12 Jan 2024 12:29:40 +0100 Subject: [PATCH] Optimized WriteBoolean() --- .../Formats/Heif/Av1/Av1BitStreamReader.cs | 1 - .../Formats/Heif/Av1/Av1BitStreamWriter.cs | 16 +++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/ImageSharp/Formats/Heif/Av1/Av1BitStreamReader.cs b/src/ImageSharp/Formats/Heif/Av1/Av1BitStreamReader.cs index 8804c31626..e1f80b1af4 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Av1BitStreamReader.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Av1BitStreamReader.cs @@ -8,7 +8,6 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1; internal ref struct Av1BitStreamReader(Span data) { private const int WordSize = sizeof(byte) * 8; - private const int DoubleWordSize = 2 * WordSize; private readonly Span data = data; private int wordPosition = 0; private int bitOffset = 0; diff --git a/src/ImageSharp/Formats/Heif/Av1/Av1BitStreamWriter.cs b/src/ImageSharp/Formats/Heif/Av1/Av1BitStreamWriter.cs index 4459c01a00..a5c55530ec 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Av1BitStreamWriter.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Av1BitStreamWriter.cs @@ -5,7 +5,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1; internal ref struct Av1BitStreamWriter(Stream stream) { - private const int WordSize = sizeof(byte) * 8; + private const int WordSize = 8; private readonly Stream stream = stream; private byte buffer = 0; private int bitOffset = 0; @@ -35,7 +35,7 @@ internal ref struct Av1BitStreamWriter(Stream stream) { int shift = 24; uint padded = value << ((32 - bitCount) - this.bitOffset); - while (bitCount >= 8) + while ((bitCount + this.bitOffset) >= 8) { byte current = (byte)(((padded >> shift) & 0xff) | this.buffer); this.stream.WriteByte(current); @@ -52,5 +52,15 @@ internal ref struct Av1BitStreamWriter(Stream stream) } } - internal void WriteBoolean(bool value) => this.WriteLiteral(value ? 1U : 0U, 1); + internal void WriteBoolean(bool value) + { + byte boolByte = value ? (byte)1 : (byte)0; + this.buffer = (byte)(((boolByte << (7 - this.bitOffset)) & 0xff) | this.buffer); + this.bitOffset++; + if (this.bitOffset == WordSize) + { + this.stream.WriteByte(this.buffer); + this.bitOffset = 0; + } + } }