private static JpegHuffmanCanonicalCode[] BuildCanonicalCode(ReadOnlySpan <byte> bits, ReadOnlySpan <Symbol> symbols) { int codeCount = symbols.Length; var codes = new JpegHuffmanCanonicalCode[codeCount]; int currentCodeLength = 1; ref byte codeLengthsRef = ref MemoryMarshal.GetReference(bits);
public void GetCode(int symbol, out ushort code, out int codeLength) { Debug.Assert((uint)symbol < 256); JpegHuffmanCanonicalCode c = _codes[_symbolMap[symbol]]; code = c.Code; codeLength = c.CodeLength; }
private static JpegHuffmanCanonicalCode[] BuildCanonicalCode(ReadOnlySpan <byte> codeLengths, ReadOnlySpan <byte> codeValues) { int codeCount = codeValues.Length; var codes = new JpegHuffmanCanonicalCode[codeCount]; Span <byte> codeLengthsBuffer = stackalloc byte[16]; codeLengths.CopyTo(codeLengthsBuffer); int currentCodeLength = 1; ref byte codeLengthsRef = ref MemoryMarshal.GetReference(codeLengthsBuffer);
public JpegHuffmanEncodingTable(JpegHuffmanCanonicalCode[] codes) { _codes = codes ?? throw new ArgumentNullException(nameof(codes)); int codeCount = 0; _symbolMap = new byte[256]; for (int i = 0; i < codes.Length; i++) { JpegHuffmanCanonicalCode code = codes[i]; if (code.CodeLength != 0) { _symbolMap[code.Symbol] = (byte)i; codeCount++; } } _codeCount = codeCount; }