/*
 * 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(_state_H)
# define _state_H (1)

typedef struct od_state     od_state;
typedef struct od_adapt_ctx od_adapt_ctx;

# include "generic_code.h"
# include "odintrin.h"
# include "pvq.h"

/*Adaptation speed of scalar Laplace encoding.*/
# define OD_SCALAR_ADAPT_SPEED (4)

struct od_adapt_ctx {
  /* Support for PVQ encode/decode */
  od_pvq_adapt_ctx pvq;

  generic_encoder model_dc[OD_NPLANES_MAX];

  int ex_dc[OD_NPLANES_MAX][OD_TXSIZES][3];
  int ex_g[OD_NPLANES_MAX][OD_TXSIZES];

  /* Joint skip flag for DC and AC */
  uint16_t skip_cdf[OD_TXSIZES*2][4];
  int skip_increment;
};

struct od_state {
  od_adapt_ctx adapt;
  /* TODO(yushin): Enable this for activity masking,
     when pvq_qm_q4 is available in AOM. */
  /* unsigned char pvq_qm_q4[OD_NPLANES_MAX][OD_QM_SIZE]; */

  /* Quantization matrices and their inverses. */
  int16_t qm[OD_QM_BUFFER_SIZE];
  int16_t qm_inv[OD_QM_BUFFER_SIZE];
};

void od_adapt_ctx_reset(od_adapt_ctx *state, int is_keyframe);
void od_init_skipped_coeffs(int16_t *d, int16_t *pred, int is_keyframe,
 int bo, int n, int w);

#endif
