/*
 * Copyright (c) 2017, 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.
 */

#include "aom_dsp/bitreader.h"
#include "av1/common/enums.h"

#ifndef AV1_DECODER_SYMBOLRATE_H_
#define AV1_DECODER_SYMBOLRATE_H_

#if CONFIG_SYMBOLRATE
static INLINE void av1_dump_symbol_rate(struct AV1Common *cm) {
  const FRAME_COUNTS *counts = &cm->counts;
  printf("fidx %d show %d superblock_num %d\n", cm->current_video_frame,
         cm->show_frame, counts->superblock_num);
  printf("%d %d\n", counts->symbol_num[0], counts->symbol_num[1]);
  for (int i = 0; i < COEFF_LEVELS; ++i) printf("%d ", counts->coeff_num[i]);
  printf("\n");
}
static INLINE int av1_read_record_symbol(FRAME_COUNTS *counts, aom_reader *r,
                                         aom_cdf_prob *cdf, int nsymbs,
                                         const char *str) {
  (void)str;
  if (counts) ++counts->symbol_num[0];
  return aom_read_symbol(r, cdf, nsymbs, str);
}

#if CONFIG_LV_MAP
static INLINE int av1_read_record_bin(FRAME_COUNTS *counts, aom_reader *r,
                                      aom_cdf_prob *cdf, int nsymbs,
                                      const char *str) {
  (void)str;
  if (counts) ++counts->symbol_num[0];
  return aom_read_bin(r, cdf, nsymbs, str);
}
#endif

static INLINE int av1_read_record(FRAME_COUNTS *counts, aom_reader *r, int prob,
                                  const char *str) {
  (void)str;
  if (counts) ++counts->symbol_num[0];
  return aom_read(r, prob, str);
}

static INLINE int av1_read_record_cdf(FRAME_COUNTS *counts, aom_reader *r,
                                      const aom_cdf_prob *cdf, int nsymbs,
                                      const char *str) {
  (void)str;
  if (counts) ++counts->symbol_num[0];
  return aom_read_cdf(r, cdf, nsymbs, str);
}

static INLINE int av1_read_record_bit(FRAME_COUNTS *counts, aom_reader *r,
                                      const char *str) {
  (void)str;
  if (counts) ++counts->symbol_num[1];
  return aom_read_bit(r, str);
}

static INLINE void av1_record_coeff(FRAME_COUNTS *counts, tran_low_t qcoeff) {
  assert(qcoeff >= 0);
  int abs_qc = abs(qcoeff);
  abs_qc = clamp(abs_qc, 0, COEFF_LEVELS - 1);
  if (counts) ++counts->coeff_num[abs_qc];
}

static INLINE void av1_record_superblock(FRAME_COUNTS *counts) {
  if (counts) ++counts->superblock_num;
}
#else  // CONFIG_SYMBOLRATE

#define av1_read_record_symbol(counts, r, cdf, nsymbs, ACCT_STR_NAME) \
  aom_read_symbol(r, cdf, nsymbs, ACCT_STR_NAME)

#if CONFIG_LV_MAP
#define av1_read_record_bin(counts, r, cdf, nsymbs, ACCT_STR_NAME) \
  aom_read_bin(r, cdf, nsymbs, ACCT_STR_NAME)
#endif

#define av1_read_record(counts, r, prob, ACCT_STR_NAME) \
  aom_read(r, prob, ACCT_STR_NAME)

#define av1_read_record_cdf(counts, r, cdf, nsymbs, ACCT_STR_NAME) \
  aom_read_cdf(r, cdf, nsymbs, ACCT_STR_NAME)

#define av1_read_record_bit(counts, r, ACCT_STR_NAME) \
  aom_read_bit(r, ACCT_STR_NAME)

#endif  // CONFIG_SYMBOLRATE

#endif  // AV1_DECODER_SYMBOLRATE_H_
