layout(local_size_x = 1) in;
-const uint prob_bits = 13; // Note!
+const uint prob_bits = 12;
const uint prob_scale = 1 << prob_bits;
const uint RANS_BYTE_L = (1u << 23);
const uint BLOCKS_PER_STREAM = 320;
uint k = abs(signed_k);
if (k >= ESCAPE_LIMIT) {
- // ... boring stuff here
- RansEncPut(enc.rans, enc.rans_offset, k, 1, prob_bits - 1);
+ // Put the coefficient as a 1/(2^12) symbol _before_
+ // the 255 coefficient, since the decoder will read the
+ // 255 coefficient first.
+ RansEncPut(enc.rans, enc.rans_offset, k, 1, prob_bits);
k = ESCAPE_LIMIT;
}
- uvec2 sym = ransdist[enc.lut_base + (k + NUM_SYMS - 1) & (NUM_SYMS - 1)];
- RansEncPut(enc.rans, enc.rans_offset, sym.x, sym.y, prob_bits);
+ uvec2 sym = ransdist[enc.lut_base + ((k - 1) & (NUM_SYMS - 1))];
+ RansEncPut(enc.rans, enc.rans_offset, sym.x, sym.y, prob_bits + 1);
if (signed_k < 0) {
enc.rans += sign_bias;
uint sign_bias1 = ransdist[enc1.lut_base + 255].x + ransdist[enc1.lut_base + 255].y;
uint sign_bias2 = ransdist[enc2.lut_base + 255].x + ransdist[enc2.lut_base + 255].y;
- for (uint subblock_idx = BLOCKS_PER_STREAM; subblock_idx --> 0; ) {
+ for (uint subblock_idx = 0; subblock_idx < BLOCKS_PER_STREAM; ++subblock_idx) {
// TODO: Use SSBOs instead of a texture?
uint x = (streamgroup_num * BLOCKS_PER_STREAM + subblock_idx) % 160;
uint y = (streamgroup_num * BLOCKS_PER_STREAM + subblock_idx) / 160;