- rans_offset -= 4;
- rans_output[rans_offset + 0] = uint8_t(rans >> 0);
- rans_output[rans_offset + 1] = uint8_t(rans >> 8);
- rans_output[rans_offset + 2] = uint8_t(rans >> 16);
- rans_output[rans_offset + 3] = uint8_t(rans >> 24);
+ uint x_max = sym.x;
+ uint rcp_freq = sym.y;
+ uint bias = sym.z;
+ uint rcp_shift = (sym.w & 0xffffu);
+ uint cmpl_freq = (sym.w >> 16);
+
+ // renormalize
+ while (enc.rans >= x_max) {
+ RansPutByte(enc.rans & 0xffu, enc);
+ enc.rans >>= 8;
+ }
+
+ uint q, unused;
+ umulExtended(enc.rans, rcp_freq, q, unused);
+ enc.rans += bias + (q >> rcp_shift) * cmpl_freq;
+}
+
+uint RansEncFlush(inout RansEncoder enc)
+{
+ RansPutByte(enc.rans >> 24, enc);
+ RansPutByte(enc.rans >> 16, enc);
+ RansPutByte(enc.rans >> 8, enc);
+ RansPutByte(enc.rans >> 0, enc);
+
+ uint num_bytes_written = (enc.rans_start_offset - enc.rans_offset) * 4 + enc.bytes_in_buffer;
+
+ // Make sure there's nothing left in the buffer.
+ RansPutByte(0, enc);
+ RansPutByte(0, enc);
+ RansPutByte(0, enc);
+
+ return num_bytes_written;