Move and wrap the old vpx boolcoder.

This should make room for compile time pluggable replacements.

Change-Id: Ib7afcffa93bf664b89a49da21a20138127443292
(cherry picked from commit 9dd0b8982445515d6dddb6342e655b56062a8f7f)
diff --git a/aom_dsp/bitreader.h b/aom_dsp/bitreader.h
index ed97776..6092421 100644
--- a/aom_dsp/bitreader.h
+++ b/aom_dsp/bitreader.h
@@ -12,147 +12,45 @@
 #ifndef AOM_DSP_BITREADER_H_
 #define AOM_DSP_BITREADER_H_
 
-#include <limits.h>
-#include <stddef.h>
-
 #include "./aom_config.h"
-
-#if CONFIG_BITSTREAM_DEBUG
-#include <assert.h>
-#include <stdio.h>
-#endif  // CONFIG_BITSTREAM_DEBUG
-
-#include "aom_ports/mem.h"
 #include "aom/aomdx.h"
 #include "aom/aom_integer.h"
+#include "aom_dsp/dkboolreader.h"
 #include "aom_dsp/prob.h"
-#include "aom_util/debug_util.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-typedef size_t BD_VALUE;
+typedef struct aom_dk_reader aom_reader;
 
-#define BD_VALUE_SIZE ((int)sizeof(BD_VALUE) * CHAR_BIT)
+static INLINE int aom_reader_init(aom_reader *r, const uint8_t *buffer,
+                                  size_t size, aom_decrypt_cb decrypt_cb,
+                                  void *decrypt_state) {
+  return aom_dk_reader_init(r, buffer, size, decrypt_cb, decrypt_state);
+}
 
-// This is meant to be a large, positive constant that can still be efficiently
-// loaded as an immediate (on platforms like ARM, for example).
-// Even relatively modest values like 100 would work fine.
-#define LOTS_OF_BITS 0x40000000
-
-typedef struct {
-  // Be careful when reordering this struct, it may impact the cache negatively.
-  BD_VALUE value;
-  unsigned int range;
-  int count;
-  const uint8_t *buffer_end;
-  const uint8_t *buffer;
-  aom_decrypt_cb decrypt_cb;
-  void *decrypt_state;
-  uint8_t clear_buffer[sizeof(BD_VALUE) + 1];
-} aom_reader;
-
-int aom_reader_init(aom_reader *r, const uint8_t *buffer, size_t size,
-                    aom_decrypt_cb decrypt_cb, void *decrypt_state);
-
-void aom_reader_fill(aom_reader *r);
-
-const uint8_t *aom_reader_find_end(aom_reader *r);
+static INLINE const uint8_t *aom_reader_find_end(aom_reader *r) {
+  return aom_dk_reader_find_end(r);
+}
 
 static INLINE int aom_reader_has_error(aom_reader *r) {
-  // Check if we have reached the end of the buffer.
-  //
-  // Variable 'count' stores the number of bits in the 'value' buffer, minus
-  // 8. The top byte is part of the algorithm, and the remainder is buffered
-  // to be shifted into it. So if count == 8, the top 16 bits of 'value' are
-  // occupied, 8 for the algorithm and 8 in the buffer.
-  //
-  // When reading a byte from the user's buffer, count is filled with 8 and
-  // one byte is filled into the value buffer. When we reach the end of the
-  // data, count is additionally filled with LOTS_OF_BITS. So when
-  // count == LOTS_OF_BITS - 1, the user's data has been exhausted.
-  //
-  // 1 if we have tried to decode bits after the end of stream was encountered.
-  // 0 No error.
-  return r->count > BD_VALUE_SIZE && r->count < LOTS_OF_BITS;
+  return aom_dk_reader_has_error(r);
 }
 
 static INLINE int aom_read(aom_reader *r, int prob) {
-  unsigned int bit = 0;
-  BD_VALUE value;
-  BD_VALUE bigsplit;
-  int count;
-  unsigned int range;
-  unsigned int split = (r->range * prob + (256 - prob)) >> CHAR_BIT;
-
-  if (r->count < 0) aom_reader_fill(r);
-
-  value = r->value;
-  count = r->count;
-
-  bigsplit = (BD_VALUE)split << (BD_VALUE_SIZE - CHAR_BIT);
-
-  range = split;
-
-  if (value >= bigsplit) {
-    range = r->range - split;
-    value = value - bigsplit;
-    bit = 1;
-  }
-
-  {
-    register int shift = aom_norm[range];
-    range <<= shift;
-    value <<= shift;
-    count -= shift;
-  }
-  r->value = value;
-  r->count = count;
-  r->range = range;
-
-#if CONFIG_BITSTREAM_DEBUG
-  {
-    int ref_bit, ref_prob;
-    const int queue_r = bitstream_queue_get_read();
-    const int frame_idx = bitstream_queue_get_frame_read();
-    bitstream_queue_pop(&ref_bit, &ref_prob);
-    if (prob != ref_prob) {
-      fprintf(
-          stderr,
-          "\n *** prob error, frame_idx_r %d prob %d ref_prob %d queue_r %d\n",
-          frame_idx, prob, ref_prob, queue_r);
-      assert(0);
-    }
-    if ((int)bit != ref_bit) {
-      fprintf(stderr, "\n *** bit error, frame_idx_r %d bit %d ref_bit %d\n",
-              frame_idx, bit, ref_bit);
-      assert(0);
-    }
-  }
-#endif  // CONFIG_BITSTREAM_DEBUG
-  return bit;
+  return aom_dk_read(r, prob);
 }
 
-static INLINE int aom_read_bit(aom_reader *r) {
-  return aom_read(r, 128);  // aom_prob_half
-}
+static INLINE int aom_read_bit(aom_reader *r) { return aom_dk_read_bit(r); }
 
 static INLINE int aom_read_literal(aom_reader *r, int bits) {
-  int literal = 0, bit;
-
-  for (bit = bits - 1; bit >= 0; bit--) literal |= aom_read_bit(r) << bit;
-
-  return literal;
+  return aom_dk_read_literal(r, bits);
 }
 
 static INLINE int aom_read_tree(aom_reader *r, const aom_tree_index *tree,
                                 const aom_prob *probs) {
-  aom_tree_index i = 0;
-
-  while ((i = tree[i + aom_read(r, probs[i >> 1])]) > 0) continue;
-
-  return -i;
+  return aom_dk_read_tree(r, tree, probs);
 }
 
 #ifdef __cplusplus