/***************************************************************************
 *cr
 *cr            (C) Copyright 2007 The Board of Trustees of the
 *cr                        University of Illinois
 *cr                         All Rights Reserved
 *cr
 ***************************************************************************/

/* Search offsets within 16 pixels of (0,0) */
#define SEARCH_RANGE 16

/* The total search area is 33 pixels square */
#define SEARCH_DIMENSION (2*SEARCH_RANGE+1)

/* The total number of search positions is 33^2 */
#define MAX_POS 1089

/* This is padded to a multiple of 4 when allocating memory */
#define MAX_POS_PADDED 1092

/* VBSME block indices in the SAD array for different 
 * block sizes.  The index is computed from the
 * image size in macroblocks.  Block sizes are (height, width):
 *  1: 16 by 16 pixels, one block per macroblock
 *  2: 8  by 16 pixels, 2  blocks per macroblock
 *  3: 16 by 8  pixels, 2  blocks per macroblock
 *  4: 8  by 8  pixels, 4  blocks per macroblock
 *  5: 4  by 8  pixels, 8  blocks per macroblock
 *  6: 8  by 4  pixels, 8  blocks per macroblock
 *  7: 4  by 4  pixels, 16 blocks per macroblock
 */
#define SAD_TYPE_1_IX(image_size) 0
#define SAD_TYPE_2_IX(image_size) ((image_size)*MAX_POS_PADDED)
#define SAD_TYPE_3_IX(image_size) ((image_size)*(3*MAX_POS_PADDED))
#define SAD_TYPE_4_IX(image_size) ((image_size)*(5*MAX_POS_PADDED))
#define SAD_TYPE_5_IX(image_size) ((image_size)*(9*MAX_POS_PADDED))
#define SAD_TYPE_6_IX(image_size) ((image_size)*(17*MAX_POS_PADDED))
#define SAD_TYPE_7_IX(image_size) ((image_size)*(25*MAX_POS_PADDED))

#define SAD_TYPE_IX(n, image_size) \
  ((n == 1) ? SAD_TYPE_1_IX(image_size) : \
   ((n == 2) ? SAD_TYPE_2_IX(image_size) : \
    ((n == 3) ? SAD_TYPE_3_IX(image_size) : \
     ((n == 4) ? SAD_TYPE_4_IX(image_size) : \
      ((n == 5) ? SAD_TYPE_5_IX(image_size) : \
       ((n == 6) ? SAD_TYPE_6_IX(image_size) : \
        (SAD_TYPE_7_IX(image_size) \
	 )))))))

#define SAD_TYPE_1_CT 1
#define SAD_TYPE_2_CT 2
#define SAD_TYPE_3_CT 2
#define SAD_TYPE_4_CT 4
#define SAD_TYPE_5_CT 8
#define SAD_TYPE_6_CT 8
#define SAD_TYPE_7_CT 16

#define SAD_TYPE_CT(n) \
  ((n == 1) ? SAD_TYPE_1_CT : \
   ((n == 2) ? SAD_TYPE_2_CT : \
    ((n == 3) ? SAD_TYPE_3_CT : \
     ((n == 4) ? SAD_TYPE_4_CT : \
      ((n == 5) ? SAD_TYPE_5_CT : \
       ((n == 6) ? SAD_TYPE_6_CT : \
        (SAD_TYPE_7_CT \
	 )))))))

#ifdef __cplusplus
extern "C" {
#endif

void sad4_cpu(unsigned short *blk_sad,
	      unsigned short *frame,
	      unsigned short *ref,
	      int mb_width,
	      int mb_height);

void larger_sads(unsigned short *sads,
		 int mbs);

#ifdef __cplusplus
}
#endif
