encode bits and x together instead of len and bits
authorGeoffrey Allott <geoffrey@allott.email>
Sat, 3 Sep 2022 17:33:48 +0000 (18:33 +0100)
committerGeoffrey Allott <geoffrey@allott.email>
Sat, 3 Sep 2022 17:33:48 +0000 (18:33 +0100)
src/tANS.c

index 0a24c8a8e019f56c4d62b402adc49f680eea7bf4..ea6a03bfa2a84e430d306e29ccc864625641f180 100644 (file)
@@ -215,7 +215,8 @@ fail:
 
 static int tANS_compress_file(FILE* input, FILE *output)
 {
-    uint32_t i, len, bits, count, len_and_bits;
+    uint32_t i, len, bits, count, bits_and_x;
+    uint16_t u16_len;
     uint8_t *read_buf;
     uint8_t *write_buf;
     double p[N_AUX][N_SYMBOLS] = {0};
@@ -263,9 +264,10 @@ static int tANS_compress_file(FILE* input, FILE *output)
 
         st->x += read_buf[len-1];
         bits = tANS_rl_encode(st, read_buf, len - 1, write_buf);
-        len_and_bits = (len - 1) | (bits << 14);
-        if (fwrite(&len_and_bits, sizeof len_and_bits, 1, output) != 1) goto fail;
-        if (fwrite(&st->x, sizeof st->x, 1, output) != 1) goto fail;
+        u16_len = (uint16_t) (len - 1);
+        bits_and_x = (st->x & ((1 << LOG2_TBLSZ) - 1)) | (bits << LOG2_TBLSZ);
+        if (fwrite(&u16_len, sizeof u16_len, 1, output) != 1) goto fail;
+        if (fwrite(&bits_and_x, sizeof bits_and_x, 1, output) != 1) goto fail;
         if (fwrite(write_buf, (bits + 7) / 8, 1, output) != 1) goto fail;
 
         memset(write_buf, 0, (bits + 7) / 8);
@@ -294,7 +296,8 @@ fail:
 
 static int tANS_decompress_file(FILE* input, FILE *output)
 {
-    uint32_t i, len, bits, count, len_and_bits;
+    uint32_t i, len, bits, count, bits_and_x;
+    uint16_t u16_len;
     uint8_t *read_buf;
     uint8_t *write_buf;
     double p[N_AUX][N_SYMBOLS] = {0};
@@ -325,12 +328,12 @@ static int tANS_decompress_file(FILE* input, FILE *output)
         }
         tANS_rl_decode_st_init(st, symbol_tbls);
 
-        if (fread(&len_and_bits, sizeof len_and_bits, 1, input) != 1) break;
-        len = (len_and_bits & ((1 << 14) - 1)) + 1;
-        bits = len_and_bits >> 14;
-        if (fread(&st->x, sizeof st->x, 1, input) != 1) goto fail;
+        if (fread(&u16_len, sizeof u16_len, 1, input) != 1) break;
+        if (fread(&bits_and_x, sizeof bits_and_x, 1, input) != 1) goto fail;
+        len = (uint32_t) u16_len + 1;
+        bits = bits_and_x >> LOG2_TBLSZ;
+        st->x = bits_and_x & ((1 << LOG2_TBLSZ) - 1);
         if (fread(read_buf + 4, (bits + 7) / 8, 1, input) != 1) goto fail;
-        st->x &= symbol_tbls[0].tblsz - 1;
         bits = tANS_rl_decode(st, write_buf, len - 1, read_buf + 4, bits);
         if (bits != 0) {
             fprintf(stderr, "tANS: corrupted file\n");