ans: Support a larger state range in reverse serialization
Change-Id: Ic3a6f9d16a16f347fb36b94e6dca70d9436b984e
diff --git a/aom_dsp/ansreader.h b/aom_dsp/ansreader.h
index fe6f009..760c539 100644
--- a/aom_dsp/ansreader.h
+++ b/aom_dsp/ansreader.h
@@ -142,32 +142,43 @@
ans->buf = buf + offset;
ans->buf_offset = -offset;
x = buf[0];
- if ((x & 0x80) == 0) {
+ if ((x & 0x80) == 0) { // Marker is 0xxx xxxx
if (offset < 2) return 1;
ans->buf_offset += 2;
ans->state = mem_get_be16(buf) & 0x7FFF;
- } else {
+#if L_BASE * IO_BASE > (1 << 23)
+ } else if ((x & 0xC0) == 0x80) { // Marker is 10xx xxxx
+ if (offset < 3) return 1;
+ ans->buf_offset += 3;
+ ans->state = mem_get_be24(buf) & 0x3FFFFF;
+ } else { // Marker is 11xx xxxx
+ if (offset < 4) return 1;
+ ans->buf_offset += 4;
+ ans->state = mem_get_be32(buf) & 0x3FFFFFFF;
+#else
+ } else { // Marker is 1xxx xxxx
if (offset < 3) return 1;
ans->buf_offset += 3;
ans->state = mem_get_be24(buf) & 0x7FFFFF;
+#endif
}
#else
ans->buf = buf;
x = buf[offset - 1];
- if ((x & 0x80) == 0) {
+ if ((x & 0x80) == 0) { // Marker is 0xxx xxxx
if (offset < 2) return 1;
ans->buf_offset = offset - 2;
ans->state = mem_get_le16(buf + offset - 2) & 0x7FFF;
- } else if ((x & 0xC0) == 0x80) {
+ } else if ((x & 0xC0) == 0x80) { // Marker is 10xx xxxx
if (offset < 3) return 1;
ans->buf_offset = offset - 3;
ans->state = mem_get_le24(buf + offset - 3) & 0x3FFFFF;
- } else if ((x & 0xE0) == 0xE0) {
+ } else if ((x & 0xE0) == 0xE0) { // Marker is 111x xxxx
if (offset < 4) return 1;
ans->buf_offset = offset - 4;
ans->state = mem_get_le32(buf + offset - 4) & 0x1FFFFFFF;
} else {
- // 110xxxxx implies this byte is a superframe marker
+ // Marker 110x xxxx implies this byte is a superframe marker
return 1;
}
#endif // ANS_REVERSE
diff --git a/aom_dsp/answriter.h b/aom_dsp/answriter.h
index 220ffb1..5c024b0 100644
--- a/aom_dsp/answriter.h
+++ b/aom_dsp/answriter.h
@@ -65,9 +65,18 @@
mem_put_le16(ans->buf + ans->buf_offset, (0x00u << 15) + state);
ans_size = ans->buf_offset + 2;
#if ANS_REVERSE
+#if L_BASE * IO_BASE > (1 << 23)
+ } else if (state < (1u << 22)) {
+ mem_put_le24(ans->buf + ans->buf_offset, (0x02u << 22) + state);
+ ans_size = ans->buf_offset + 3;
+ } else if (state < (1u << 30)) {
+ mem_put_le32(ans->buf + ans->buf_offset, (0x03u << 30) + state);
+ ans_size = ans->buf_offset + 4;
+#else
} else if (state < (1u << 23)) {
mem_put_le24(ans->buf + ans->buf_offset, (0x01u << 23) + state);
ans_size = ans->buf_offset + 3;
+#endif
#else
} else if (state < (1u << 22)) {
mem_put_le24(ans->buf + ans->buf_offset, (0x02u << 22) + state);