/*
 * Copyright (c) 2001-2016, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
 */

/* clang-format off */

#if !defined(_generic_code_H)
# define _generic_code_H

# include "aom_dsp/bitreader.h"
# include "aom_dsp/bitwriter.h"

# define GENERIC_TABLES 12

#if OD_ACCOUNTING
# define generic_decode(r, model, max, ex_q16, integration, str) \
  generic_decode_(r, model, max, ex_q16, integration, str)
# define aom_decode_cdf_adapt_q15(r, cdf, n, count, rate, str) \
  aom_decode_cdf_adapt_q15_(r, cdf, n, count, rate, str)
# define aom_decode_cdf_adapt(r, cdf, n, increment, str) \
  aom_decode_cdf_adapt_(r, cdf, n, increment, str)
#else
# define generic_decode(r, model, max, ex_q16, integration, str) \
  generic_decode_(r, model, max, ex_q16, integration)
# define aom_decode_cdf_adapt_q15(r, cdf, n, count, rate, str) \
  aom_decode_cdf_adapt_q15_(r, cdf, n, count, rate)
# define aom_decode_cdf_adapt(r, cdf, n, increment, str) \
  aom_decode_cdf_adapt_(r, cdf, n, increment)
#endif

typedef struct {
  /** cdf for multiple expectations of x */
  uint16_t cdf[GENERIC_TABLES][16];
  /** Frequency increment for learning the cdfs */
  int increment;
} generic_encoder;

#define OD_IIR_DIADIC(y, x, shift) ((y) += ((x) - (y)) >> (shift))

void generic_model_init(generic_encoder *model);

#define OD_CDFS_INIT(cdf, val) aom_cdf_init(&cdf[0][0], \
 sizeof(cdf)/sizeof(cdf[0]), sizeof(cdf[0])/sizeof(cdf[0][0]), val, val)

#define OD_CDFS_INIT_FIRST(cdf, val, first) aom_cdf_init(&cdf[0][0], \
 sizeof(cdf)/sizeof(cdf[0]), sizeof(cdf[0])/sizeof(cdf[0][0]), val, first)

#define OD_SINGLE_CDF_INIT(cdf, val) aom_cdf_init(cdf, \
 1, sizeof(cdf)/sizeof(cdf[0]), val, val)

#define OD_SINGLE_CDF_INIT_FIRST(cdf, val, first) aom_cdf_init(cdf, \
 1, sizeof(cdf)/sizeof(cdf[0]), val, first)

void aom_cdf_init(uint16_t *cdf, int ncdfs, int nsyms, int val, int first);

void aom_cdf_adapt_q15(int val, uint16_t *cdf, int n, int *count, int rate);

void aom_encode_cdf_adapt_q15(aom_writer *w, int val, uint16_t *cdf, int n,
 int *count, int rate);

void aom_encode_cdf_adapt(aom_writer *w, int val, uint16_t *cdf, int n,
 int increment);

int aom_decode_cdf_adapt_(aom_reader *r, uint16_t *cdf, int n,
 int increment OD_ACC_STR);

void generic_encode(aom_writer *w, generic_encoder *model, int x, int max,
 int *ex_q16, int integration);
double generic_encode_cost(generic_encoder *model, int x, int max,
 int *ex_q16);

double od_encode_cdf_cost(int val, uint16_t *cdf, int n);

int aom_decode_cdf_adapt_q15_(aom_reader *r, uint16_t *cdf, int n,
 int *count, int rate OD_ACC_STR);

int generic_decode_(aom_reader *r, generic_encoder *model, int max,
 int *ex_q16, int integration OD_ACC_STR);

int log_ex(int ex_q16);

void generic_model_update(generic_encoder *model, int *ex_q16, int x, int xs,
 int id, int integration);

#endif
