Adjust how the final ANS state is written.
The new prefixes are
0: 15 bits of state are added to the base state.
10: 22 bits of state are added to the base state.
110: Reserved for super frame marker
111: 29 bits of state are added to the base state.
The likelihood of any final state is proportional to 1 / state. Given a
state range of [2**15, 2 **23) this should save on average 0.4 bits
per serialized final state.
BDRATE
subset1: -.000%
lowres: -.010%
Change-Id: I8e66e4a6667f5692c541083e6d6edc35ff411181
diff --git a/aom_dsp/answriter.h b/aom_dsp/answriter.h
index 370472a..23d7b41 100644
--- a/aom_dsp/answriter.h
+++ b/aom_dsp/answriter.h
@@ -60,17 +60,14 @@
assert(ans->state >= L_BASE);
assert(ans->state < L_BASE * IO_BASE);
state = ans->state - L_BASE;
- if (state < (1 << 6)) {
- ans->buf[ans->buf_offset] = (0x00 << 6) + state;
- return ans->buf_offset + 1;
- } else if (state < (1 << 14)) {
- mem_put_le16(ans->buf + ans->buf_offset, (0x01 << 14) + state);
+ if (state < (1u << 15)) {
+ mem_put_le16(ans->buf + ans->buf_offset, (0x00u << 15) + state);
return ans->buf_offset + 2;
- } else if (state < (1 << 22)) {
- mem_put_le24(ans->buf + ans->buf_offset, (0x02 << 22) + state);
+ } else if (state < (1u << 22)) {
+ mem_put_le24(ans->buf + ans->buf_offset, (0x02u << 22) + state);
return ans->buf_offset + 3;
- } else if (state < (1 << 29)) {
- mem_put_le32(ans->buf + ans->buf_offset, (0x07 << 29) + state);
+ } else if (state < (1u << 29)) {
+ mem_put_le32(ans->buf + ans->buf_offset, (0x07u << 29) + state);
return ans->buf_offset + 4;
} else {
assert(0 && "State is too large to be serialized");