/*
 ** Copyright 2003-2010, VisualOn, Inc.
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 **
 **     http://www.apache.org/licenses/LICENSE-2.0
 **
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
 */
/*******************************************************************************
	File:		bit_cnt.h

	Content:	Huffman Bitcounter & coder structure and functions

*******************************************************************************/

#ifndef __BITCOUNT_H
#define __BITCOUNT_H

#include "bitbuffer.h"
#include "basic_op.h"
#define INVALID_BITCOUNT (MAX_16/4)

/*
  code book number table
*/

enum codeBookNo{
  CODE_BOOK_ZERO_NO=               0,
  CODE_BOOK_1_NO=                  1,
  CODE_BOOK_2_NO=                  2,
  CODE_BOOK_3_NO=                  3,
  CODE_BOOK_4_NO=                  4,
  CODE_BOOK_5_NO=                  5,
  CODE_BOOK_6_NO=                  6,
  CODE_BOOK_7_NO=                  7,
  CODE_BOOK_8_NO=                  8,
  CODE_BOOK_9_NO=                  9,
  CODE_BOOK_10_NO=                10,
  CODE_BOOK_ESC_NO=               11,
  CODE_BOOK_RES_NO=               12,
  CODE_BOOK_PNS_NO=               13
};

/*
  code book index table
*/

enum codeBookNdx{
  CODE_BOOK_ZERO_NDX=0,
  CODE_BOOK_1_NDX,
  CODE_BOOK_2_NDX,
  CODE_BOOK_3_NDX,
  CODE_BOOK_4_NDX,
  CODE_BOOK_5_NDX,
  CODE_BOOK_6_NDX,
  CODE_BOOK_7_NDX,
  CODE_BOOK_8_NDX,
  CODE_BOOK_9_NDX,
  CODE_BOOK_10_NDX,
  CODE_BOOK_ESC_NDX,
  CODE_BOOK_RES_NDX,
  CODE_BOOK_PNS_NDX,
  NUMBER_OF_CODE_BOOKS
};

/*
  code book lav table
*/

enum codeBookLav{
  CODE_BOOK_ZERO_LAV=0,
  CODE_BOOK_1_LAV=1,
  CODE_BOOK_2_LAV=1,
  CODE_BOOK_3_LAV=2,
  CODE_BOOK_4_LAV=2,
  CODE_BOOK_5_LAV=4,
  CODE_BOOK_6_LAV=4,
  CODE_BOOK_7_LAV=7,
  CODE_BOOK_8_LAV=7,
  CODE_BOOK_9_LAV=12,
  CODE_BOOK_10_LAV=12,
  CODE_BOOK_ESC_LAV=16,
  CODE_BOOK_SCF_LAV=60,
  CODE_BOOK_PNS_LAV=60
};

Word16 bitCount(const Word16 *aQuantSpectrum,
                const Word16  noOfSpecLines,
                Word16        maxVal,
                Word16       *bitCountLut);

Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF hBitstream);

Word16 bitCountScalefactorDelta(Word16 delta);
Word16 codeScalefactorDelta(Word16 scalefactor, HANDLE_BIT_BUF hBitstream);



#endif
