/H264Dec/source/h264bsd_stream.c
C | 242 lines | 86 code | 31 blank | 125 comment | 10 complexity | 04af0b1338f516da6161b1546a8ef4d6 MD5 | raw file
Possible License(s): BSD-3-Clause
- /*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * 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.
- */
- /*------------------------------------------------------------------------------
- Table of contents
- 1. Include headers
- 2. External compiler flags
- 3. Module defines
- 4. Local function prototypes
- 5. Functions
- h264bsdGetBits
- h264bsdShowBits32
- h264bsdFlushBits
- h264bsdIsByteAligned
- ------------------------------------------------------------------------------*/
- /*------------------------------------------------------------------------------
- 1. Include headers
- ------------------------------------------------------------------------------*/
- #include "h264bsd_util.h"
- #include "h264bsd_stream.h"
- /*------------------------------------------------------------------------------
- 2. External compiler flags
- --------------------------------------------------------------------------------
- --------------------------------------------------------------------------------
- 3. Module defines
- ------------------------------------------------------------------------------*/
- /*------------------------------------------------------------------------------
- 4. Local function prototypes
- ------------------------------------------------------------------------------*/
- /*------------------------------------------------------------------------------
- Function: h264bsdGetBits
- Functional description:
- Read and remove bits from the stream buffer.
- Input:
- pStrmData pointer to stream data structure
- numBits number of bits to read
- Output:
- none
- Returns:
- bits read from stream
- END_OF_STREAM if not enough bits left
- ------------------------------------------------------------------------------*/
- u32 h264bsdGetBits(strmData_t *pStrmData, u32 numBits)
- {
- u32 out;
- ASSERT(pStrmData);
- ASSERT(numBits < 32);
- out = h264bsdShowBits32(pStrmData) >> (32 - numBits);
- if (h264bsdFlushBits(pStrmData, numBits) == HANTRO_OK)
- {
- return(out);
- }
- else
- {
- return(END_OF_STREAM);
- }
- }
- /*------------------------------------------------------------------------------
- Function: h264bsdShowBits32
- Functional description:
- Read 32 bits from the stream buffer. Buffer is left as it is, i.e.
- no bits are removed. First bit read from the stream is the MSB of
- the return value. If there is not enough bits in the buffer ->
- bits beyong the end of the stream are set to '0' in the return
- value.
- Input:
- pStrmData pointer to stream data structure
- Output:
- none
- Returns:
- bits read from stream
- ------------------------------------------------------------------------------*/
- u32 h264bsdShowBits32(strmData_t *pStrmData)
- {
- i32 bits, shift;
- u32 out;
- u8 *pStrm;
- ASSERT(pStrmData);
- ASSERT(pStrmData->pStrmCurrPos);
- ASSERT(pStrmData->bitPosInWord < 8);
- ASSERT(pStrmData->bitPosInWord ==
- (pStrmData->strmBuffReadBits & 0x7));
- pStrm = pStrmData->pStrmCurrPos;
- /* number of bits left in the buffer */
- bits = (i32)pStrmData->strmBuffSize*8 - (i32)pStrmData->strmBuffReadBits;
- /* at least 32-bits in the buffer */
- if (bits >= 32)
- {
- u32 bitPosInWord = pStrmData->bitPosInWord;
- out = ((u32)pStrm[0] << 24) | ((u32)pStrm[1] << 16) |
- ((u32)pStrm[2] << 8) | ((u32)pStrm[3]);
- if (bitPosInWord)
- {
- u32 byte = (u32)pStrm[4];
- u32 tmp = (8-bitPosInWord);
- out <<= bitPosInWord;
- out |= byte>>tmp;
- }
- return (out);
- }
- /* at least one bit in the buffer */
- else if (bits > 0)
- {
- shift = (i32)(24 + pStrmData->bitPosInWord);
- out = (u32)(*pStrm++) << shift;
- bits -= (i32)(8 - pStrmData->bitPosInWord);
- while (bits > 0)
- {
- shift -= 8;
- out |= (u32)(*pStrm++) << shift;
- bits -= 8;
- }
- return (out);
- }
- else
- return (0);
- }
- /*------------------------------------------------------------------------------
- Function: h264bsdFlushBits
- Functional description:
- Remove bits from the stream buffer
- Input:
- pStrmData pointer to stream data structure
- numBits number of bits to remove
- Output:
- none
- Returns:
- HANTRO_OK success
- END_OF_STREAM not enough bits left
- ------------------------------------------------------------------------------*/
- #ifndef H264DEC_NEON
- u32 h264bsdFlushBits(strmData_t *pStrmData, u32 numBits)
- {
- ASSERT(pStrmData);
- ASSERT(pStrmData->pStrmBuffStart);
- ASSERT(pStrmData->pStrmCurrPos);
- ASSERT(pStrmData->bitPosInWord < 8);
- ASSERT(pStrmData->bitPosInWord == (pStrmData->strmBuffReadBits & 0x7));
- pStrmData->strmBuffReadBits += numBits;
- pStrmData->bitPosInWord = pStrmData->strmBuffReadBits & 0x7;
- if ( (pStrmData->strmBuffReadBits ) <= (8*pStrmData->strmBuffSize) )
- {
- pStrmData->pStrmCurrPos = pStrmData->pStrmBuffStart +
- (pStrmData->strmBuffReadBits >> 3);
- return(HANTRO_OK);
- }
- else
- return(END_OF_STREAM);
- }
- #endif
- /*------------------------------------------------------------------------------
- Function: h264bsdIsByteAligned
- Functional description:
- Check if current stream position is byte aligned.
- Inputs:
- pStrmData pointer to stream data structure
- Outputs:
- none
- Returns:
- TRUE stream is byte aligned
- FALSE stream is not byte aligned
- ------------------------------------------------------------------------------*/
- u32 h264bsdIsByteAligned(strmData_t *pStrmData)
- {
- /* Variables */
- /* Code */
- if (!pStrmData->bitPosInWord)
- return(HANTRO_TRUE);
- else
- return(HANTRO_FALSE);
- }