| ... | @@ -68,8 +68,7 @@ const DecodeState = struct { | ... | @@ -68,8 +68,7 @@ const DecodeState = struct { |
| 68 | | 68 | |
| 69 | fse_tables_undefined: bool, | 69 | fse_tables_undefined: bool, |
| 70 | | 70 | |
| 71 | literal_stream_reader: ReverseBitReader(ReversedByteReader.Reader), | 71 | literal_stream_reader: ReverseBitReader, |
| 72 | literal_stream_bytes: ReversedByteReader, | | |
| 73 | literal_stream_index: usize, | 72 | literal_stream_index: usize, |
| 74 | huffman_tree: ?Literals.HuffmanTree, | 73 | huffman_tree: ?Literals.HuffmanTree, |
| 75 | | 74 | |
| ... | @@ -288,9 +287,7 @@ const DecodeState = struct { | ... | @@ -288,9 +287,7 @@ const DecodeState = struct { |
| 288 | | 287 | |
| 289 | fn initLiteralStream(self: *DecodeState, bytes: []const u8) !void { | 288 | fn initLiteralStream(self: *DecodeState, bytes: []const u8) !void { |
| 290 | log.debug("initing literal stream: {}", .{std.fmt.fmtSliceHexUpper(bytes)}); | 289 | log.debug("initing literal stream: {}", .{std.fmt.fmtSliceHexUpper(bytes)}); |
| 291 | self.literal_stream_bytes = reversedByteReader(bytes); | 290 | try self.literal_stream_reader.init(bytes); |
| 292 | self.literal_stream_reader = reverseBitReader(self.literal_stream_bytes.reader()); | | |
| 293 | while (0 == try self.literal_stream_reader.readBitsNoEof(u1, 1)) {} | | |
| 294 | } | 291 | } |
| 295 | | 292 | |
| 296 | fn decodeLiteralsSlice(self: *DecodeState, dest: []u8, literals: Literals, len: usize) !void { | 293 | fn decodeLiteralsSlice(self: *DecodeState, dest: []u8, literals: Literals, len: usize) !void { |
| ... | @@ -532,7 +529,6 @@ pub fn decodeZStandardFrameAlloc(allocator: std.mem.Allocator, src: []const u8, | ... | @@ -532,7 +529,6 @@ pub fn decodeZStandardFrameAlloc(allocator: std.mem.Allocator, src: []const u8, |
| 532 | | 529 | |
| 533 | .literal_written_count = 0, | 530 | .literal_written_count = 0, |
| 534 | .literal_stream_reader = undefined, | 531 | .literal_stream_reader = undefined, |
| 535 | .literal_stream_bytes = undefined, | | |
| 536 | .literal_stream_index = undefined, | 532 | .literal_stream_index = undefined, |
| 537 | .huffman_tree = null, | 533 | .huffman_tree = null, |
| 538 | }; | 534 | }; |
| ... | @@ -591,7 +587,6 @@ pub fn decodeFrameBlocks(dest: []u8, src: []const u8, consumed_count: *usize, ha | ... | @@ -591,7 +587,6 @@ pub fn decodeFrameBlocks(dest: []u8, src: []const u8, consumed_count: *usize, ha |
| 591 | | 587 | |
| 592 | .literal_written_count = 0, | 588 | .literal_written_count = 0, |
| 593 | .literal_stream_reader = undefined, | 589 | .literal_stream_reader = undefined, |
| 594 | .literal_stream_bytes = undefined, | | |
| 595 | .literal_stream_index = undefined, | 590 | .literal_stream_index = undefined, |
| 596 | .huffman_tree = null, | 591 | .huffman_tree = null, |
| 597 | }; | 592 | }; |
| ... | @@ -725,10 +720,9 @@ pub fn decodeBlock( | ... | @@ -725,10 +720,9 @@ pub fn decodeBlock( |
| 725 | var bytes_written: usize = 0; | 720 | var bytes_written: usize = 0; |
| 726 | if (sequences_header.sequence_count > 0) { | 721 | if (sequences_header.sequence_count > 0) { |
| 727 | const bit_stream_bytes = src[bytes_read..block_size]; | 722 | const bit_stream_bytes = src[bytes_read..block_size]; |
| 728 | var reverse_byte_reader = reversedByteReader(bit_stream_bytes); | 723 | var bit_stream: ReverseBitReader = undefined; |
| 729 | var bit_stream = reverseBitReader(reverse_byte_reader.reader()); | 724 | try bit_stream.init(bit_stream_bytes); |
| 730 | | 725 | |
| 731 | while (0 == try bit_stream.readBitsNoEof(u1, 1)) {} | | |
| 732 | try decode_state.readInitialState(&bit_stream); | 726 | try decode_state.readInitialState(&bit_stream); |
| 733 | | 727 | |
| 734 | var i: usize = 0; | 728 | var i: usize = 0; |
| ... | @@ -791,10 +785,9 @@ pub fn decodeBlockRingBuffer( | ... | @@ -791,10 +785,9 @@ pub fn decodeBlockRingBuffer( |
| 791 | var bytes_written: usize = 0; | 785 | var bytes_written: usize = 0; |
| 792 | if (sequences_header.sequence_count > 0) { | 786 | if (sequences_header.sequence_count > 0) { |
| 793 | const bit_stream_bytes = src[bytes_read..block_size]; | 787 | const bit_stream_bytes = src[bytes_read..block_size]; |
| 794 | var reverse_byte_reader = reversedByteReader(bit_stream_bytes); | 788 | var bit_stream: ReverseBitReader = undefined; |
| 795 | var bit_stream = reverseBitReader(reverse_byte_reader.reader()); | 789 | try bit_stream.init(bit_stream_bytes); |
| 796 | | 790 | |
| 797 | while (0 == try bit_stream.readBitsNoEof(u1, 1)) {} | | |
| 798 | try decode_state.readInitialState(&bit_stream); | 791 | try decode_state.readInitialState(&bit_stream); |
| 799 | | 792 | |
| 800 | var i: usize = 0; | 793 | var i: usize = 0; |
| ... | @@ -1028,9 +1021,8 @@ fn decodeHuffmanTree(src: []const u8, consumed_count: *usize) !Literals.HuffmanT | ... | @@ -1028,9 +1021,8 @@ fn decodeHuffmanTree(src: []const u8, consumed_count: *usize) !Literals.HuffmanT |
| 1028 | const accuracy_log = std.math.log2_int_ceil(usize, table_size); | 1021 | const accuracy_log = std.math.log2_int_ceil(usize, table_size); |
| 1029 | | 1022 | |
| 1030 | var huff_data = src[1 + counting_reader.bytes_read .. compressed_size + 1]; | 1023 | var huff_data = src[1 + counting_reader.bytes_read .. compressed_size + 1]; |
| 1031 | var huff_data_bytes = reversedByteReader(huff_data); | 1024 | var huff_bits: ReverseBitReader = undefined; |
| 1032 | var huff_bits = reverseBitReader(huff_data_bytes.reader()); | 1025 | try huff_bits.init(huff_data); |
| 1033 | while (0 == try huff_bits.readBitsNoEof(u1, 1)) {} | | |
| 1034 | | 1026 | |
| 1035 | dumpFseTable("huffman", entries[0..table_size]); | 1027 | dumpFseTable("huffman", entries[0..table_size]); |
| 1036 | | 1028 | |
| ... | @@ -1415,48 +1407,49 @@ const ReversedByteReader = struct { | ... | @@ -1415,48 +1407,49 @@ const ReversedByteReader = struct { |
| 1415 | | 1407 | |
| 1416 | const Reader = std.io.Reader(*ReversedByteReader, error{}, readFn); | 1408 | const Reader = std.io.Reader(*ReversedByteReader, error{}, readFn); |
| 1417 | | 1409 | |
| | 1410 | fn init(bytes: []const u8) ReversedByteReader { |
| | 1411 | return .{ |
| | 1412 | .bytes = bytes, |
| | 1413 | .remaining_bytes = bytes.len, |
| | 1414 | }; |
| | 1415 | } |
| | 1416 | |
| 1418 | fn reader(self: *ReversedByteReader) Reader { | 1417 | fn reader(self: *ReversedByteReader) Reader { |
| 1419 | return .{ .context = self }; | 1418 | return .{ .context = self }; |
| 1420 | } | 1419 | } |
| 1421 | }; | | |
| 1422 | | | |
| 1423 | fn readFn(ctx: *ReversedByteReader, buffer: []u8) !usize { | | |
| 1424 | if (ctx.remaining_bytes == 0) return 0; | | |
| 1425 | const byte_index = ctx.remaining_bytes - 1; | | |
| 1426 | buffer[0] = ctx.bytes[byte_index]; | | |
| 1427 | // buffer[0] = @bitReverse(ctx.bytes[byte_index]); | | |
| 1428 | ctx.remaining_bytes = byte_index; | | |
| 1429 | return 1; | | |
| 1430 | } | | |
| 1431 | | 1420 | |
| 1432 | fn reversedByteReader(bytes: []const u8) ReversedByteReader { | 1421 | fn readFn(ctx: *ReversedByteReader, buffer: []u8) !usize { |
| 1433 | return ReversedByteReader{ | 1422 | if (ctx.remaining_bytes == 0) return 0; |
| 1434 | .remaining_bytes = bytes.len, | 1423 | const byte_index = ctx.remaining_bytes - 1; |
| 1435 | .bytes = bytes, | 1424 | buffer[0] = ctx.bytes[byte_index]; |
| 1436 | }; | 1425 | // buffer[0] = @bitReverse(ctx.bytes[byte_index]); |
| 1437 | } | 1426 | ctx.remaining_bytes = byte_index; |
| | 1427 | return 1; |
| | 1428 | } |
| | 1429 | }; |
| 1438 | | 1430 | |
| 1439 | fn ReverseBitReader(comptime Reader: type) type { | 1431 | const ReverseBitReader = struct { |
| 1440 | return struct { | 1432 | byte_reader: ReversedByteReader, |
| 1441 | underlying: std.io.BitReader(.Big, Reader), | 1433 | bit_reader: std.io.BitReader(.Big, ReversedByteReader.Reader), |
| 1442 | | 1434 | |
| 1443 | fn readBitsNoEof(self: *@This(), comptime U: type, num_bits: usize) !U { | 1435 | fn init(self: *ReverseBitReader, bytes: []const u8) !void { |
| 1444 | return self.underlying.readBitsNoEof(U, num_bits); | 1436 | self.byte_reader = ReversedByteReader.init(bytes); |
| 1445 | } | 1437 | self.bit_reader = std.io.bitReader(.Big, self.byte_reader.reader()); |
| | 1438 | while (0 == self.readBitsNoEof(u1, 1) catch return error.BitStreamHasNoStartBit) {} |
| | 1439 | } |
| 1446 | | 1440 | |
| 1447 | fn readBits(self: *@This(), comptime U: type, num_bits: usize, out_bits: *usize) !U { | 1441 | fn readBitsNoEof(self: *@This(), comptime U: type, num_bits: usize) !U { |
| 1448 | return try self.underlying.readBits(U, num_bits, out_bits); | 1442 | return self.bit_reader.readBitsNoEof(U, num_bits); |
| 1449 | } | 1443 | } |
| 1450 | | 1444 | |
| 1451 | fn alignToByte(self: *@This()) void { | 1445 | fn readBits(self: *@This(), comptime U: type, num_bits: usize, out_bits: *usize) !U { |
| 1452 | self.underlying.alignToByte(); | 1446 | return try self.bit_reader.readBits(U, num_bits, out_bits); |
| 1453 | } | 1447 | } |
| 1454 | }; | | |
| 1455 | } | | |
| 1456 | | 1448 | |
| 1457 | fn reverseBitReader(reader: anytype) ReverseBitReader(@TypeOf(reader)) { | 1449 | fn alignToByte(self: *@This()) void { |
| 1458 | return .{ .underlying = std.io.bitReader(.Big, reader) }; | 1450 | self.bit_reader.alignToByte(); |
| 1459 | } | 1451 | } |
| | 1452 | }; |
| 1460 | | 1453 | |
| 1461 | fn BitReader(comptime Reader: type) type { | 1454 | fn BitReader(comptime Reader: type) type { |
| 1462 | return struct { | 1455 | return struct { |