@@ -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 {
0 commit comments