summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/aacenc/src/bitbuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/codecs/aacenc/src/bitbuffer.c')
-rw-r--r--media/libstagefright/codecs/aacenc/src/bitbuffer.c173
1 files changed, 173 insertions, 0 deletions
diff --git a/media/libstagefright/codecs/aacenc/src/bitbuffer.c b/media/libstagefright/codecs/aacenc/src/bitbuffer.c
new file mode 100644
index 0000000..0ce93d3
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/bitbuffer.c
@@ -0,0 +1,173 @@
+/*
+ ** 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: updateBitBufWordPtr
+* description: update Bit Buffer pointer
+*
+*****************************************************************************/
+static void updateBitBufWordPtr(HANDLE_BIT_BUF hBitBuf,
+ UWord8 **pBitBufWord,
+ Word16 cnt)
+{
+ *pBitBufWord += cnt;
+
+
+ if(*pBitBufWord > hBitBuf->pBitBufEnd) {
+ *pBitBufWord -= (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1);
+ }
+
+ if(*pBitBufWord < hBitBuf->pBitBufBase) {
+ *pBitBufWord += (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1);
+ }
+}
+
+
+/*****************************************************************************
+*
+* 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;
+}