/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */


#include "dboolhuff.h"
#include "vpx_ports/mem.h"
#include "vpx_mem/vpx_mem.h"

int vp8dx_start_decode(BOOL_DECODER *br,
                       const unsigned char *source,
                       unsigned int source_sz) {
  br->user_buffer_end = source + source_sz;
  br->user_buffer     = source;
  br->value    = 0;
  br->count    = -8;
  br->range    = 255;

  if (source_sz && !source)
    return 1;

  /* Populate the buffer */
  vp8dx_bool_decoder_fill(br);

  return 0;
}


void vp8dx_bool_decoder_fill(BOOL_DECODER *br) {
  const unsigned char *bufptr;
  const unsigned char *bufend;
  VP8_BD_VALUE         value;
  int                  count;
  bufend = br->user_buffer_end;
  bufptr = br->user_buffer;
  value = br->value;
  count = br->count;

  VP8DX_BOOL_DECODER_FILL(count, value, bufptr, bufend);

  br->user_buffer = bufptr;
  br->value = value;
  br->count = count;
}


static int get_unsigned_bits(unsigned num_values) {
  int cat = 0;
  if ((num_values--) <= 1) return 0;
  while (num_values > 0) {
    cat++;
    num_values >>= 1;
  }
  return cat;
}

int inv_recenter_nonneg(int v, int m) {
  if (v > (m << 1)) return v;
  else if ((v & 1) == 0) return (v >> 1) + m;
  else return m - ((v + 1) >> 1);
}

int vp8_decode_uniform(BOOL_DECODER *br, int n) {
  int v;
  int l = get_unsigned_bits(n);
  int m = (1 << l) - n;
  if (!l) return 0;
  v = vp8_decode_value(br, l - 1);
  if (v < m)
    return v;
  else
    return (v << 1) - m + vp8_decode_value(br, 1);
}

int vp8_decode_term_subexp(BOOL_DECODER *br, int k, int num_syms) {
  int i = 0, mk = 0, word;
  while (1) {
    int b = (i ? k + i - 1 : k);
    int a = (1 << b);
    if (num_syms <= mk + 3 * a) {
      word = vp8_decode_uniform(br, num_syms - mk) + mk;
      break;
    } else {
      if (vp8_decode_value(br, 1)) {
        i++;
        mk += a;
      } else {
        word = vp8_decode_value(br, b) + mk;
        break;
      }
    }
  }
  return word;
}
