1*c83a76b0SSuyog Pawar /****************************************************************************** 2*c83a76b0SSuyog Pawar * 3*c83a76b0SSuyog Pawar * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore 4*c83a76b0SSuyog Pawar * 5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License"); 6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License. 7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at: 8*c83a76b0SSuyog Pawar * 9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0 10*c83a76b0SSuyog Pawar * 11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software 12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS, 13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and 15*c83a76b0SSuyog Pawar * limitations under the License. 16*c83a76b0SSuyog Pawar * 17*c83a76b0SSuyog Pawar ******************************************************************************/ 18*c83a76b0SSuyog Pawar /** 19*c83a76b0SSuyog Pawar ******************************************************************************* 20*c83a76b0SSuyog Pawar * @file 21*c83a76b0SSuyog Pawar * ihevcd_bitps_bitstrm.h 22*c83a76b0SSuyog Pawar * 23*c83a76b0SSuyog Pawar * @brief 24*c83a76b0SSuyog Pawar * Header for bitps_bitstrm access functions 25*c83a76b0SSuyog Pawar * 26*c83a76b0SSuyog Pawar * @author 27*c83a76b0SSuyog Pawar * Harish 28*c83a76b0SSuyog Pawar * 29*c83a76b0SSuyog Pawar * @par List of Functions: 30*c83a76b0SSuyog Pawar * 31*c83a76b0SSuyog Pawar * @remarks 32*c83a76b0SSuyog Pawar * None 33*c83a76b0SSuyog Pawar * 34*c83a76b0SSuyog Pawar ******************************************************************************* 35*c83a76b0SSuyog Pawar */ 36*c83a76b0SSuyog Pawar 37*c83a76b0SSuyog Pawar #ifndef _IHEVCD_BITSTREAM_H_ 38*c83a76b0SSuyog Pawar #define _IHEVCD_BITSTREAM_H_ 39*c83a76b0SSuyog Pawar /** 40*c83a76b0SSuyog Pawar * @brief defines the maximum number of bits in a bitstream word 41*c83a76b0SSuyog Pawar */ 42*c83a76b0SSuyog Pawar #define WORD_SIZE 32 43*c83a76b0SSuyog Pawar /** 44*c83a76b0SSuyog Pawar * @brief Twice the WORD_SIZE 45*c83a76b0SSuyog Pawar */ 46*c83a76b0SSuyog Pawar #define DBL_WORD_SIZE (2 * (WORD_SIZE)) 47*c83a76b0SSuyog Pawar 48*c83a76b0SSuyog Pawar /** 49*c83a76b0SSuyog Pawar * @brief WORD_SIZE - 1 50*c83a76b0SSuyog Pawar */ 51*c83a76b0SSuyog Pawar #define WORD_SIZE_MINUS1 (WORD_SIZE - 1) 52*c83a76b0SSuyog Pawar 53*c83a76b0SSuyog Pawar /** 54*c83a76b0SSuyog Pawar ****************************************************************************** 55*c83a76b0SSuyog Pawar * @brief Macro used to copy elements in bistream structure to local variables. 56*c83a76b0SSuyog Pawar ****************************************************************************** 57*c83a76b0SSuyog Pawar */ 58*c83a76b0SSuyog Pawar 59*c83a76b0SSuyog Pawar #define GET_STREAM(m_ps_bitstrm, m_pu4_buf, m_u4_bit_ofst, \ 60*c83a76b0SSuyog Pawar m_u4_cur_word, m_u4_nxt_word) \ 61*c83a76b0SSuyog Pawar { \ 62*c83a76b0SSuyog Pawar m_pu4_buf = m_ps_bitstrm->pu4_buf; \ 63*c83a76b0SSuyog Pawar m_u4_bit_ofst = m_ps_bitstrm->u4_bit_ofst; \ 64*c83a76b0SSuyog Pawar m_u4_cur_word = m_ps_bitstrm->u4_cur_word; \ 65*c83a76b0SSuyog Pawar m_u4_nxt_word = m_ps_bitstrm->u4_nxt_word; \ 66*c83a76b0SSuyog Pawar } 67*c83a76b0SSuyog Pawar 68*c83a76b0SSuyog Pawar /** 69*c83a76b0SSuyog Pawar ****************************************************************************** 70*c83a76b0SSuyog Pawar * @brief Macro used to copy local variables to elements in bistream structure. 71*c83a76b0SSuyog Pawar ****************************************************************************** 72*c83a76b0SSuyog Pawar */ 73*c83a76b0SSuyog Pawar #define SET_STREAM(m_ps_bitstrm, m_pu4_buf, m_u4_bit_ofst, \ 74*c83a76b0SSuyog Pawar m_u4_cur_word, m_u4_nxt_word) \ 75*c83a76b0SSuyog Pawar { \ 76*c83a76b0SSuyog Pawar m_ps_bitstrm->pu4_buf = m_pu4_buf; \ 77*c83a76b0SSuyog Pawar m_ps_bitstrm->u4_bit_ofst = m_u4_bit_ofst; \ 78*c83a76b0SSuyog Pawar m_ps_bitstrm->u4_cur_word = m_u4_cur_word; \ 79*c83a76b0SSuyog Pawar m_ps_bitstrm->u4_nxt_word = m_u4_nxt_word; \ 80*c83a76b0SSuyog Pawar } 81*c83a76b0SSuyog Pawar 82*c83a76b0SSuyog Pawar 83*c83a76b0SSuyog Pawar 84*c83a76b0SSuyog Pawar /** 85*c83a76b0SSuyog Pawar ****************************************************************************** 86*c83a76b0SSuyog Pawar * @brief Snoop next m_cnt bits without updating offsets or buffer increments. 87*c83a76b0SSuyog Pawar * Data is not consumed in this call 88*c83a76b0SSuyog Pawar ****************************************************************************** 89*c83a76b0SSuyog Pawar */ 90*c83a76b0SSuyog Pawar #define BITS_NXT(m_u4_bits, m_pu4_buf, m_u4_bit_ofst, \ 91*c83a76b0SSuyog Pawar m_u4_cur_word, m_u4_nxt_word, m_cnt) \ 92*c83a76b0SSuyog Pawar { \ 93*c83a76b0SSuyog Pawar m_u4_bits = (m_u4_cur_word << m_u4_bit_ofst) >> \ 94*c83a76b0SSuyog Pawar (WORD_SIZE - m_cnt); \ 95*c83a76b0SSuyog Pawar \ 96*c83a76b0SSuyog Pawar if(m_u4_bit_ofst > (WORD_SIZE - m_cnt)) \ 97*c83a76b0SSuyog Pawar { \ 98*c83a76b0SSuyog Pawar m_u4_bits |= SHR(m_u4_nxt_word, \ 99*c83a76b0SSuyog Pawar (WORD_SIZE + WORD_SIZE - m_cnt \ 100*c83a76b0SSuyog Pawar - m_u4_bit_ofst)); \ 101*c83a76b0SSuyog Pawar } \ 102*c83a76b0SSuyog Pawar } 103*c83a76b0SSuyog Pawar 104*c83a76b0SSuyog Pawar 105*c83a76b0SSuyog Pawar /** 106*c83a76b0SSuyog Pawar ****************************************************************************** 107*c83a76b0SSuyog Pawar * @brief Snoop next 32 bits without updating offsets or buffer increments. 108*c83a76b0SSuyog Pawar * Data is not consumed in this call 109*c83a76b0SSuyog Pawar ****************************************************************************** 110*c83a76b0SSuyog Pawar */ 111*c83a76b0SSuyog Pawar #define BITS_NXT32(m_u4_bits, m_pu4_buf, m_u4_bit_ofst, \ 112*c83a76b0SSuyog Pawar m_u4_cur_word, m_u4_nxt_word) \ 113*c83a76b0SSuyog Pawar { \ 114*c83a76b0SSuyog Pawar m_u4_bits = (m_u4_cur_word << m_u4_bit_ofst); \ 115*c83a76b0SSuyog Pawar \ 116*c83a76b0SSuyog Pawar m_u4_bits |= SHR(m_u4_nxt_word, (WORD_SIZE - m_u4_bit_ofst)); \ 117*c83a76b0SSuyog Pawar } 118*c83a76b0SSuyog Pawar 119*c83a76b0SSuyog Pawar 120*c83a76b0SSuyog Pawar /** 121*c83a76b0SSuyog Pawar ****************************************************************************** 122*c83a76b0SSuyog Pawar * @brief Flush m_u4_bits and updated the buffer pointer. 123*c83a76b0SSuyog Pawar * Data is consumed 124*c83a76b0SSuyog Pawar ****************************************************************************** 125*c83a76b0SSuyog Pawar */ 126*c83a76b0SSuyog Pawar #define BITS_FLUSH(m_pu4_buf, m_u4_bit_ofst, m_u4_cur_word, \ 127*c83a76b0SSuyog Pawar m_u4_nxt_word, m_cnt) \ 128*c83a76b0SSuyog Pawar { \ 129*c83a76b0SSuyog Pawar UWORD32 temp; \ 130*c83a76b0SSuyog Pawar \ 131*c83a76b0SSuyog Pawar m_u4_bit_ofst += m_cnt; \ 132*c83a76b0SSuyog Pawar if( m_u4_bit_ofst >= WORD_SIZE ) \ 133*c83a76b0SSuyog Pawar { \ 134*c83a76b0SSuyog Pawar m_u4_cur_word = m_u4_nxt_word; \ 135*c83a76b0SSuyog Pawar /* Getting the next word */ \ 136*c83a76b0SSuyog Pawar temp = *(m_pu4_buf++); \ 137*c83a76b0SSuyog Pawar \ 138*c83a76b0SSuyog Pawar m_u4_bit_ofst -= WORD_SIZE; \ 139*c83a76b0SSuyog Pawar /* Swapping little endian to big endian conversion*/\ 140*c83a76b0SSuyog Pawar m_u4_nxt_word = ITT_BIG_ENDIAN(temp); \ 141*c83a76b0SSuyog Pawar } \ 142*c83a76b0SSuyog Pawar } 143*c83a76b0SSuyog Pawar /** 144*c83a76b0SSuyog Pawar ****************************************************************************** 145*c83a76b0SSuyog Pawar * @brief Get m_cnt number of bits and update bffer pointers and offset. 146*c83a76b0SSuyog Pawar * Data is consumed 147*c83a76b0SSuyog Pawar ****************************************************************************** 148*c83a76b0SSuyog Pawar */ 149*c83a76b0SSuyog Pawar #define BITS_GET(m_u4_bits, m_pu4_buf, m_u4_bit_ofst, \ 150*c83a76b0SSuyog Pawar m_u4_cur_word,m_u4_nxt_word, m_cnt) \ 151*c83a76b0SSuyog Pawar { \ 152*c83a76b0SSuyog Pawar m_u4_bits = (m_u4_cur_word << m_u4_bit_ofst) \ 153*c83a76b0SSuyog Pawar >> (WORD_SIZE - m_cnt); \ 154*c83a76b0SSuyog Pawar m_u4_bit_ofst += m_cnt; \ 155*c83a76b0SSuyog Pawar if(m_u4_bit_ofst > WORD_SIZE) \ 156*c83a76b0SSuyog Pawar { \ 157*c83a76b0SSuyog Pawar m_u4_bits |= SHR(m_u4_nxt_word, \ 158*c83a76b0SSuyog Pawar (DBL_WORD_SIZE - m_u4_bit_ofst)); \ 159*c83a76b0SSuyog Pawar } \ 160*c83a76b0SSuyog Pawar \ 161*c83a76b0SSuyog Pawar if( m_u4_bit_ofst >= WORD_SIZE ) \ 162*c83a76b0SSuyog Pawar { \ 163*c83a76b0SSuyog Pawar UWORD32 pu4_word_tmp; \ 164*c83a76b0SSuyog Pawar m_u4_cur_word = m_u4_nxt_word; \ 165*c83a76b0SSuyog Pawar /* Getting the next word */ \ 166*c83a76b0SSuyog Pawar pu4_word_tmp = *(m_pu4_buf++); \ 167*c83a76b0SSuyog Pawar \ 168*c83a76b0SSuyog Pawar m_u4_bit_ofst -= WORD_SIZE; \ 169*c83a76b0SSuyog Pawar /* Swapping little endian to big endian conversion*/ \ 170*c83a76b0SSuyog Pawar m_u4_nxt_word = ITT_BIG_ENDIAN(pu4_word_tmp); \ 171*c83a76b0SSuyog Pawar } \ 172*c83a76b0SSuyog Pawar } 173*c83a76b0SSuyog Pawar 174*c83a76b0SSuyog Pawar /** 175*c83a76b0SSuyog Pawar ****************************************************************************** 176*c83a76b0SSuyog Pawar * @brief Get 1 bit and update buffer pointers and offset. 177*c83a76b0SSuyog Pawar * Data is consumed 178*c83a76b0SSuyog Pawar ****************************************************************************** 179*c83a76b0SSuyog Pawar */ 180*c83a76b0SSuyog Pawar 181*c83a76b0SSuyog Pawar #define BIT_GET(m_u4_bits,m_pu4_buf,m_u4_bit_ofst, \ 182*c83a76b0SSuyog Pawar m_u4_cur_word,m_u4_nxt_word) \ 183*c83a76b0SSuyog Pawar { \ 184*c83a76b0SSuyog Pawar m_u4_bits = (m_u4_cur_word << m_u4_bit_ofst) \ 185*c83a76b0SSuyog Pawar >> (WORD_SIZE_MINUS1); \ 186*c83a76b0SSuyog Pawar m_u4_bit_ofst++; \ 187*c83a76b0SSuyog Pawar \ 188*c83a76b0SSuyog Pawar if(m_u4_bit_ofst == WORD_SIZE) \ 189*c83a76b0SSuyog Pawar { \ 190*c83a76b0SSuyog Pawar UWORD32 pu4_word_tmp; \ 191*c83a76b0SSuyog Pawar m_u4_cur_word = m_u4_nxt_word; \ 192*c83a76b0SSuyog Pawar /* Getting the next word */ \ 193*c83a76b0SSuyog Pawar pu4_word_tmp = *m_pu4_buf++; \ 194*c83a76b0SSuyog Pawar \ 195*c83a76b0SSuyog Pawar m_u4_bit_ofst = 0; \ 196*c83a76b0SSuyog Pawar /* Swapping little endian to big endian conversion*/ \ 197*c83a76b0SSuyog Pawar m_u4_nxt_word = ITT_BIG_ENDIAN(pu4_word_tmp); \ 198*c83a76b0SSuyog Pawar } \ 199*c83a76b0SSuyog Pawar } 200*c83a76b0SSuyog Pawar 201*c83a76b0SSuyog Pawar void ihevcd_bits_init(bitstrm_t *ps_bitstrm, 202*c83a76b0SSuyog Pawar UWORD8 *pu1_buf, 203*c83a76b0SSuyog Pawar UWORD32 u4_numbytes); 204*c83a76b0SSuyog Pawar void ihevcd_bits_flush(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits); 205*c83a76b0SSuyog Pawar 206*c83a76b0SSuyog Pawar void ihevcd_bits_flush_to_byte_boundary(bitstrm_t *ps_bitstrm); 207*c83a76b0SSuyog Pawar 208*c83a76b0SSuyog Pawar UWORD32 ihevcd_bits_nxt(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits); 209*c83a76b0SSuyog Pawar 210*c83a76b0SSuyog Pawar UWORD32 ihevcd_bits_nxt32(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits); 211*c83a76b0SSuyog Pawar 212*c83a76b0SSuyog Pawar 213*c83a76b0SSuyog Pawar UWORD32 ihevcd_bits_get(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits); 214*c83a76b0SSuyog Pawar 215*c83a76b0SSuyog Pawar UWORD32 ihevcd_bits_num_bits_remaining(bitstrm_t *ps_bitstrm); 216*c83a76b0SSuyog Pawar 217*c83a76b0SSuyog Pawar 218*c83a76b0SSuyog Pawar UWORD32 ihevcd_bits_num_bits_consumed(bitstrm_t *ps_bitstrm); 219*c83a76b0SSuyog Pawar 220*c83a76b0SSuyog Pawar UWORD32 ihevcd_uev(bitstrm_t *ps_bitstrm); 221*c83a76b0SSuyog Pawar 222*c83a76b0SSuyog Pawar WORD32 ihevcd_sev(bitstrm_t *ps_bitstrm); 223*c83a76b0SSuyog Pawar 224*c83a76b0SSuyog Pawar void ihevcd_bits_seek(bitstrm_t *ps_bitstrm, WORD32 numbits); 225*c83a76b0SSuyog Pawar 226*c83a76b0SSuyog Pawar #endif /* _IHEVCD_BITSTREAM_H_ */ 227