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