/*
 ** 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:		bitbuffer.c

	Content:	Bit Buffer Management functions

*******************************************************************************/

#include "bitbuffer.h"

/*****************************************************************************
*
* function name: CreateBitBuffer
* description:  create and init Bit Buffer Management
*
*****************************************************************************/
HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf,
                               UWord8 *pBitBufBase,
                               Word16  bitBufSize)
{
  assert(bitBufSize*8 <= 32768);

  hBitBuf->pBitBufBase = pBitBufBase;
  hBitBuf->pBitBufEnd  = pBitBufBase + bitBufSize - 1;

  hBitBuf->pWriteNext  = pBitBufBase;

  hBitBuf->cache       = 0;

  hBitBuf->wBitPos     = 0;
  hBitBuf->cntBits     = 0;

  hBitBuf->size        = (bitBufSize << 3);
  hBitBuf->isValid     = 1;

  return hBitBuf;
}

/*****************************************************************************
*
* function name: DeleteBitBuffer
* description:  uninit Bit Buffer Management
*
*****************************************************************************/
void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf)
{
  if(*hBitBuf)
	(*hBitBuf)->isValid = 0;
  *hBitBuf = NULL;
}

/*****************************************************************************
*
* function name: ResetBitBuf
* description:  reset Bit Buffer Management
*
*****************************************************************************/
void ResetBitBuf(HANDLE_BIT_BUF hBitBuf,
                 UWord8 *pBitBufBase,
                 Word16  bitBufSize)
{
  hBitBuf->pBitBufBase = pBitBufBase;
  hBitBuf->pBitBufEnd  = pBitBufBase + bitBufSize - 1;


  hBitBuf->pWriteNext  = pBitBufBase;

  hBitBuf->wBitPos     = 0;
  hBitBuf->cntBits     = 0;

  hBitBuf->cache	   = 0;
}

/*****************************************************************************
*
* function name: CopyBitBuf
* description:  copy Bit Buffer Management
*
*****************************************************************************/
void CopyBitBuf(HANDLE_BIT_BUF hBitBufSrc,
                HANDLE_BIT_BUF hBitBufDst)
{
  *hBitBufDst = *hBitBufSrc;
}

/*****************************************************************************
*
* function name: GetBitsAvail
* description:  get available bits
*
*****************************************************************************/
Word16 GetBitsAvail(HANDLE_BIT_BUF hBitBuf)
{
  return hBitBuf->cntBits;
}

/*****************************************************************************
*
* function name: WriteBits
* description:  write bits to the buffer
*
*****************************************************************************/
Word16 WriteBits(HANDLE_BIT_BUF hBitBuf,
                 UWord32 writeValue,
                 Word16 noBitsToWrite)
{
  Word16 wBitPos;

  assert(noBitsToWrite <= (Word16)sizeof(Word32)*8);

  if(noBitsToWrite == 0)
	  return noBitsToWrite;

  hBitBuf->cntBits += noBitsToWrite;

  wBitPos = hBitBuf->wBitPos;
  wBitPos += noBitsToWrite;
  writeValue &= ~(0xffffffff << noBitsToWrite); // Mask out everything except the lowest noBitsToWrite bits
  writeValue <<= 32 - wBitPos;
  writeValue |= hBitBuf->cache;

  while (wBitPos >= 8)
  {
	  UWord8 tmp;
	  tmp = (UWord8)((writeValue >> 24) & 0xFF);

	  *hBitBuf->pWriteNext++ = tmp;
	  writeValue <<= 8;
	  wBitPos -= 8;
  }

  hBitBuf->wBitPos = wBitPos;
  hBitBuf->cache = writeValue;

  return noBitsToWrite;
}
