/****************************************************************************** * * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore * * 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 * ihevcd_bitps_bitstrm.h * * @brief * Header for bitps_bitstrm access functions * * @author * Harish * * @par List of Functions: * * @remarks * None * ******************************************************************************* */ #ifndef _IHEVCD_BITSTREAM_H_ #define _IHEVCD_BITSTREAM_H_ /** * @brief defines the maximum number of bits in a bitstream word */ #define WORD_SIZE 32 /** * @brief Twice the WORD_SIZE */ #define DBL_WORD_SIZE (2 * (WORD_SIZE)) /** * @brief WORD_SIZE - 1 */ #define WORD_SIZE_MINUS1 (WORD_SIZE - 1) /** ****************************************************************************** * @brief Macro used to copy elements in bistream structure to local variables. ****************************************************************************** */ #define GET_STREAM(m_ps_bitstrm, m_pu4_buf, m_u4_bit_ofst, \ m_u4_cur_word, m_u4_nxt_word) \ { \ m_pu4_buf = m_ps_bitstrm->pu4_buf; \ m_u4_bit_ofst = m_ps_bitstrm->u4_bit_ofst; \ m_u4_cur_word = m_ps_bitstrm->u4_cur_word; \ m_u4_nxt_word = m_ps_bitstrm->u4_nxt_word; \ } /** ****************************************************************************** * @brief Macro used to copy local variables to elements in bistream structure. ****************************************************************************** */ #define SET_STREAM(m_ps_bitstrm, m_pu4_buf, m_u4_bit_ofst, \ m_u4_cur_word, m_u4_nxt_word) \ { \ m_ps_bitstrm->pu4_buf = m_pu4_buf; \ m_ps_bitstrm->u4_bit_ofst = m_u4_bit_ofst; \ m_ps_bitstrm->u4_cur_word = m_u4_cur_word; \ m_ps_bitstrm->u4_nxt_word = m_u4_nxt_word; \ } /** ****************************************************************************** * @brief Snoop next m_cnt bits without updating offsets or buffer increments. * Data is not consumed in this call ****************************************************************************** */ #define BITS_NXT(m_u4_bits, m_pu4_buf, m_u4_bit_ofst, \ m_u4_cur_word, m_u4_nxt_word, m_cnt) \ { \ m_u4_bits = (m_u4_cur_word << m_u4_bit_ofst) >> \ (WORD_SIZE - m_cnt); \ \ if(m_u4_bit_ofst > (WORD_SIZE - m_cnt)) \ { \ m_u4_bits |= SHR(m_u4_nxt_word, \ (WORD_SIZE + WORD_SIZE - m_cnt \ - m_u4_bit_ofst)); \ } \ } /** ****************************************************************************** * @brief Snoop next 32 bits without updating offsets or buffer increments. * Data is not consumed in this call ****************************************************************************** */ #define BITS_NXT32(m_u4_bits, m_pu4_buf, m_u4_bit_ofst, \ m_u4_cur_word, m_u4_nxt_word) \ { \ m_u4_bits = (m_u4_cur_word << m_u4_bit_ofst); \ \ m_u4_bits |= SHR(m_u4_nxt_word, (WORD_SIZE - m_u4_bit_ofst)); \ } /** ****************************************************************************** * @brief Flush m_u4_bits and updated the buffer pointer. * Data is consumed ****************************************************************************** */ #define BITS_FLUSH(m_pu4_buf, m_u4_bit_ofst, m_u4_cur_word, \ m_u4_nxt_word, m_cnt) \ { \ UWORD32 temp; \ \ m_u4_bit_ofst += m_cnt; \ if( m_u4_bit_ofst >= WORD_SIZE ) \ { \ m_u4_cur_word = m_u4_nxt_word; \ /* Getting the next word */ \ temp = *(m_pu4_buf++); \ \ m_u4_bit_ofst -= WORD_SIZE; \ /* Swapping little endian to big endian conversion*/\ m_u4_nxt_word = ITT_BIG_ENDIAN(temp); \ } \ } /** ****************************************************************************** * @brief Get m_cnt number of bits and update bffer pointers and offset. * Data is consumed ****************************************************************************** */ #define BITS_GET(m_u4_bits, m_pu4_buf, m_u4_bit_ofst, \ m_u4_cur_word,m_u4_nxt_word, m_cnt) \ { \ m_u4_bits = (m_u4_cur_word << m_u4_bit_ofst) \ >> (WORD_SIZE - m_cnt); \ m_u4_bit_ofst += m_cnt; \ if(m_u4_bit_ofst > WORD_SIZE) \ { \ m_u4_bits |= SHR(m_u4_nxt_word, \ (DBL_WORD_SIZE - m_u4_bit_ofst)); \ } \ \ if( m_u4_bit_ofst >= WORD_SIZE ) \ { \ UWORD32 pu4_word_tmp; \ m_u4_cur_word = m_u4_nxt_word; \ /* Getting the next word */ \ pu4_word_tmp = *(m_pu4_buf++); \ \ m_u4_bit_ofst -= WORD_SIZE; \ /* Swapping little endian to big endian conversion*/ \ m_u4_nxt_word = ITT_BIG_ENDIAN(pu4_word_tmp); \ } \ } /** ****************************************************************************** * @brief Get 1 bit and update buffer pointers and offset. * Data is consumed ****************************************************************************** */ #define BIT_GET(m_u4_bits,m_pu4_buf,m_u4_bit_ofst, \ m_u4_cur_word,m_u4_nxt_word) \ { \ m_u4_bits = (m_u4_cur_word << m_u4_bit_ofst) \ >> (WORD_SIZE_MINUS1); \ m_u4_bit_ofst++; \ \ if(m_u4_bit_ofst == WORD_SIZE) \ { \ UWORD32 pu4_word_tmp; \ m_u4_cur_word = m_u4_nxt_word; \ /* Getting the next word */ \ pu4_word_tmp = *m_pu4_buf++; \ \ m_u4_bit_ofst = 0; \ /* Swapping little endian to big endian conversion*/ \ m_u4_nxt_word = ITT_BIG_ENDIAN(pu4_word_tmp); \ } \ } void ihevcd_bits_init(bitstrm_t *ps_bitstrm, UWORD8 *pu1_buf, UWORD32 u4_numbytes); void ihevcd_bits_flush(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits); void ihevcd_bits_flush_to_byte_boundary(bitstrm_t *ps_bitstrm); UWORD32 ihevcd_bits_nxt(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits); UWORD32 ihevcd_bits_nxt32(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits); UWORD32 ihevcd_bits_get(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits); UWORD32 ihevcd_bits_num_bits_remaining(bitstrm_t *ps_bitstrm); UWORD32 ihevcd_bits_num_bits_consumed(bitstrm_t *ps_bitstrm); UWORD32 ihevcd_uev(bitstrm_t *ps_bitstrm); WORD32 ihevcd_sev(bitstrm_t *ps_bitstrm); void ihevcd_bits_seek(bitstrm_t *ps_bitstrm, WORD32 numbits); #endif /* _IHEVCD_BITSTREAM_H_ */