xref: /aosp_15_r20/external/libhevc/decoder/ihevcd_bitstream.h (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
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