/*
 *  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.
 */


#ifndef __INC_BLOCK_H
#define __INC_BLOCK_H

#include "vp8/common/onyx.h"
#include "vp8/common/blockd.h"
#include "vp8/common/entropymv.h"
#include "vp8/common/entropy.h"
#include "vpx_ports/mem.h"

// motion search site
typedef struct {
  MV mv;
  int offset;
} search_site;

typedef struct {
  // 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries
  short *src_diff;
  short *coeff;

  // 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries
  short *quant;
  short *quant_fast;      // fast quant deprecated for now
  unsigned char *quant_shift;
  short *zbin;
  short *zbin_8x8;
  short *zrun_zbin_boost;
  short *zrun_zbin_boost_8x8;
  short *round;

  // Zbin Over Quant value
  short zbin_extra;

  unsigned char **base_src;
  unsigned char **base_second_src;
  int src;
  int src_stride;

  int eob_max_offset;
  int eob_max_offset_8x8;

} BLOCK;

typedef struct {
  int count;
  struct {
    B_PREDICTION_MODE mode;
    int_mv mv;
    int_mv second_mv;
  } bmi[16];
} PARTITION_INFO;

// Structure to hold snapshot of coding context during the mode picking process
// TODO Do we need all of these?
typedef struct {
  MODE_INFO mic;
  PARTITION_INFO partition_info;
  int_mv best_ref_mv;
  int_mv second_best_ref_mv;
  int rate;
  int distortion;
  int intra_error;
  int best_mode_index;
  int rddiv;
  int rdmult;

} PICK_MODE_CONTEXT;

typedef struct {
  DECLARE_ALIGNED(16, short, src_diff[400]);  // 16x16 Y 8x8 U 8x8 V 4x4 2nd Y
  DECLARE_ALIGNED(16, short, coeff[400]);     // 16x16 Y 8x8 U 8x8 V 4x4 2nd Y
  DECLARE_ALIGNED(16, unsigned char, thismb[256]);    // 16x16 Y

  unsigned char *thismb_ptr;
  // 16 Y blocks, 4 U blocks, 4 V blocks,
  // 1 DC 2nd order block each with 16 entries
  BLOCK block[25];

  YV12_BUFFER_CONFIG src;

  MACROBLOCKD e_mbd;
  PARTITION_INFO *partition_info; /* work pointer */
  PARTITION_INFO *pi;   /* Corresponds to upper left visible macroblock */
  PARTITION_INFO *pip;  /* Base of allocated array */

  search_site *ss;
  int ss_count;
  int searches_per_step;

  int errorperbit;
  int sadperbit16;
  int sadperbit4;
  int rddiv;
  int rdmult;
  unsigned int *mb_activity_ptr;
  int *mb_norm_activity_ptr;
  signed int act_zbin_adj;

  int mvcosts[2][MVvals + 1];
  int *mvcost[2];
  int mvsadcosts[2][MVfpvals + 1];
  int *mvsadcost[2];
#if CONFIG_HIGH_PRECISION_MV
  int mvcosts_hp[2][MVvals_hp + 1];
  int *mvcost_hp[2];
  int mvsadcosts_hp[2][MVfpvals_hp + 1];
  int *mvsadcost_hp[2];
#endif
  int mbmode_cost[2][MB_MODE_COUNT];
  int intra_uv_mode_cost[2][MB_MODE_COUNT];
  int bmode_costs[VP8_BINTRAMODES][VP8_BINTRAMODES][VP8_BINTRAMODES];
  int i8x8_mode_costs[MB_MODE_COUNT];
  int inter_bmode_costs[B_MODE_COUNT];

  // These define limits to motion vector components to prevent them from extending outside the UMV borders
  int mv_col_min;
  int mv_col_max;
  int mv_row_min;
  int mv_row_max;
#if CONFIG_SUPERBLOCKS
  int mv_col_min_sb;
  int mv_col_max_sb;
  int mv_row_min_sb;
  int mv_row_max_sb;
#endif

  int skip;

  int encode_breakout;

  // char * gf_active_ptr;
  signed char *gf_active_ptr;

  unsigned char *active_ptr;
  MV_CONTEXT *mvc;
#if CONFIG_HIGH_PRECISION_MV
  MV_CONTEXT_HP *mvc_hp;
#endif

  unsigned int token_costs[BLOCK_TYPES] [COEF_BANDS]
  [PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS];
  unsigned int token_costs_8x8[BLOCK_TYPES_8X8] [COEF_BANDS]
  [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];

  int optimize;
  int q_index;

  int encode_as_sb;

  // Structure to hold context for each of the 4 MBs within a SB:
  // when encoded as 4 independent MBs:
  PICK_MODE_CONTEXT mb_context[4];
#if CONFIG_SUPERBLOCKS
  // when 4 MBs share coding parameters:
  PICK_MODE_CONTEXT sb_context[4];
#endif

  void (*vp8_short_fdct4x4)(short *input, short *output, int pitch);
  void (*vp8_short_fdct8x4)(short *input, short *output, int pitch);
  void (*short_walsh4x4)(short *input, short *output, int pitch);
  void (*quantize_b)(BLOCK *b, BLOCKD *d);
  void (*quantize_b_pair)(BLOCK *b1, BLOCK *b2, BLOCKD *d0, BLOCKD *d1);
  void (*vp8_short_fdct8x8)(short *input, short *output, int pitch);
  void (*short_fhaar2x2)(short *input, short *output, int pitch);
  void (*quantize_b_8x8)(BLOCK *b, BLOCKD *d);
  void (*quantize_b_2x2)(BLOCK *b, BLOCKD *d);

} MACROBLOCK;


#endif
