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/ansreader.h b/aom_dsp/ansreader.h
index 0e9a671..e0343fd 100644
--- a/aom_dsp/ansreader.h
+++ b/aom_dsp/ansreader.h
@@ -105,19 +105,16 @@
unsigned x;
if (offset < 1) return 1;
ans->buf = buf;
- x = buf[offset - 1] >> 6;
- if (x == 0) {
- ans->buf_offset = offset - 1;
- ans->state = buf[offset - 1] & 0x3F;
- } else if (x == 1) {
+ x = buf[offset - 1];
+ if ((x & 0x80) == 0) {
if (offset < 2) return 1;
ans->buf_offset = offset - 2;
- ans->state = mem_get_le16(buf + offset - 2) & 0x3FFF;
- } else if (x == 2) {
+ ans->state = mem_get_le16(buf + offset - 2) & 0x7FFF;
+ } else if ((x & 0xC0) == 0x80) {
if (offset < 3) return 1;
ans->buf_offset = offset - 3;
ans->state = mem_get_le24(buf + offset - 3) & 0x3FFFFF;
- } else if ((buf[offset - 1] & 0xE0) == 0xE0) {
+ } else if ((x & 0xE0) == 0xE0) {
if (offset < 4) return 1;
ans->buf_offset = offset - 4;
ans->state = mem_get_le32(buf + offset - 4) & 0x1FFFFFFF;
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");