static inline void emit(encode_state *state, uint64_t data, int bits)
{
- for(;;)
+ if (bits <= state->bitp)
{
- data &= ((1ULL << bits) - 1);
- if (bits <= state->bitp)
- {
- state->bitp -= bits;
- *state->out_bp += data << state->bitp;
- break;
- }
- else
+ state->bitp -= bits;
+ *state->out_bp += data << state->bitp;
+ }
+ else
+ {
+ bits -= state->bitp;
+ *state->out_bp++ += data >> bits;
+
+ while (bits & ~7)
{
- bits -= state->bitp;
- *state->out_bp += data >> bits;
- *++state->out_bp = 0;
- state->bitp = 8;
+ bits -= 8;
+ *state->out_bp++ = data >> bits;
}
+
+ state->bitp = 8 - bits;
+ *state->out_bp = data << state->bitp;
}
}
fs zero bits followed by one 1 bit.
*/
- fs++;
for(;;)
{
- if (fs <= state->bitp)
+ if (fs < state->bitp)
{
- state->bitp -= fs;
+ state->bitp -= fs + 1;
*state->out_bp += 1 << state->bitp;
break;
}
emitfs(state, state->in_block[i] >> k);
for (i = state->ref; i < strm->block_size; i++)
- emit(state, state->in_block[i], k);
+ emit(state, state->in_block[i] & ((1ULL << k) - 1), k);
return m_flush_block(strm);
}
int i;
encode_state *state = strm->state;
- emit(state, 0x1f, state->id_len);
+ emit(state, (1 << state->id_len) - 1, state->id_len);
for (i = 0; i < strm->block_size; i++)
emit(state, state->in_block[i], strm->bit_per_sample);