xref: /aosp_15_r20/external/libhevc/decoder/ihevcd_bitstream.c (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_bitstream.c
22*c83a76b0SSuyog Pawar *
23*c83a76b0SSuyog Pawar * @brief
24*c83a76b0SSuyog Pawar *  Contains functions for bitstream access
25*c83a76b0SSuyog Pawar *
26*c83a76b0SSuyog Pawar * @author
27*c83a76b0SSuyog Pawar *  Harish
28*c83a76b0SSuyog Pawar *
29*c83a76b0SSuyog Pawar * @par List of Functions:
30*c83a76b0SSuyog Pawar * - ihevcd_bits_init()
31*c83a76b0SSuyog Pawar * - ihevcd_bits_flush()
32*c83a76b0SSuyog Pawar * - ihevcd_bits_flush_to_byte_boundary()
33*c83a76b0SSuyog Pawar * - ihevcd_bits_nxt()
34*c83a76b0SSuyog Pawar * - ihevcd_bits_nxt32()
35*c83a76b0SSuyog Pawar * - ihevcd_bits_get()
36*c83a76b0SSuyog Pawar * - ihevcd_bits_num_bits_remaining()
37*c83a76b0SSuyog Pawar * - ihevcd_bits_num_bits_consumed()
38*c83a76b0SSuyog Pawar * - ihevcd_sev()
39*c83a76b0SSuyog Pawar * - ihevcd_uev()
40*c83a76b0SSuyog Pawar *
41*c83a76b0SSuyog Pawar *
42*c83a76b0SSuyog Pawar * @remarks
43*c83a76b0SSuyog Pawar *  None
44*c83a76b0SSuyog Pawar *
45*c83a76b0SSuyog Pawar *******************************************************************************
46*c83a76b0SSuyog Pawar */
47*c83a76b0SSuyog Pawar /*****************************************************************************/
48*c83a76b0SSuyog Pawar /* File Includes                                                             */
49*c83a76b0SSuyog Pawar /*****************************************************************************/
50*c83a76b0SSuyog Pawar #include <stdio.h>
51*c83a76b0SSuyog Pawar #include <stddef.h>
52*c83a76b0SSuyog Pawar #include <stdlib.h>
53*c83a76b0SSuyog Pawar #include <string.h>
54*c83a76b0SSuyog Pawar #include <assert.h>
55*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
56*c83a76b0SSuyog Pawar #include "iv.h"
57*c83a76b0SSuyog Pawar #include "ivd.h"
58*c83a76b0SSuyog Pawar #include "ihevcd_cxa.h"
59*c83a76b0SSuyog Pawar 
60*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
61*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
62*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
63*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
64*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
65*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
66*c83a76b0SSuyog Pawar 
67*c83a76b0SSuyog Pawar #include "ihevcd_defs.h"
68*c83a76b0SSuyog Pawar #include "ihevcd_function_selector.h"
69*c83a76b0SSuyog Pawar #include "ihevcd_structs.h"
70*c83a76b0SSuyog Pawar #include "ihevcd_error.h"
71*c83a76b0SSuyog Pawar #include "ihevcd_bitstream.h"
72*c83a76b0SSuyog Pawar 
73*c83a76b0SSuyog Pawar /*****************************************************************************/
74*c83a76b0SSuyog Pawar /* Function Prototypes                                                       */
75*c83a76b0SSuyog Pawar /*****************************************************************************/
76*c83a76b0SSuyog Pawar 
77*c83a76b0SSuyog Pawar /**
78*c83a76b0SSuyog Pawar *******************************************************************************
79*c83a76b0SSuyog Pawar *
80*c83a76b0SSuyog Pawar * @brief
81*c83a76b0SSuyog Pawar *  Function used for bitstream structure initialization
82*c83a76b0SSuyog Pawar *
83*c83a76b0SSuyog Pawar * @par Description:
84*c83a76b0SSuyog Pawar *  Initialize bitstream structure elements
85*c83a76b0SSuyog Pawar *
86*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
87*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
88*c83a76b0SSuyog Pawar *
89*c83a76b0SSuyog Pawar * @param[in] pu1_buf
90*c83a76b0SSuyog Pawar *  Pointer to bitstream data
91*c83a76b0SSuyog Pawar *
92*c83a76b0SSuyog Pawar * @param[in] u4_numbytes
93*c83a76b0SSuyog Pawar *  Number of bytes in bitstream
94*c83a76b0SSuyog Pawar *
95*c83a76b0SSuyog Pawar * @returns  none
96*c83a76b0SSuyog Pawar *
97*c83a76b0SSuyog Pawar * @remarks
98*c83a76b0SSuyog Pawar *  Assumes pu1_buf is aligned to 4 bytes. If not aligned  then all bitstream
99*c83a76b0SSuyog Pawar * accesses will be unaligned and hence  costlier. Since this is codec memory
100*c83a76b0SSuyog Pawar * that holds emulation prevented data, assumption of aligned to 4 bytes is
101*c83a76b0SSuyog Pawar * valid
102*c83a76b0SSuyog Pawar *
103*c83a76b0SSuyog Pawar *******************************************************************************
104*c83a76b0SSuyog Pawar */
ihevcd_bits_init(bitstrm_t * ps_bitstrm,UWORD8 * pu1_buf,UWORD32 u4_numbytes)105*c83a76b0SSuyog Pawar void ihevcd_bits_init(bitstrm_t *ps_bitstrm,
106*c83a76b0SSuyog Pawar                       UWORD8 *pu1_buf,
107*c83a76b0SSuyog Pawar                       UWORD32 u4_numbytes)
108*c83a76b0SSuyog Pawar {
109*c83a76b0SSuyog Pawar     UWORD32 u4_cur_word;
110*c83a76b0SSuyog Pawar     UWORD32 u4_nxt_word;
111*c83a76b0SSuyog Pawar     UWORD32 u4_temp;
112*c83a76b0SSuyog Pawar     UWORD32 *pu4_buf;
113*c83a76b0SSuyog Pawar 
114*c83a76b0SSuyog Pawar     pu4_buf     = (UWORD32 *)pu1_buf;
115*c83a76b0SSuyog Pawar     u4_temp = *pu4_buf++;
116*c83a76b0SSuyog Pawar     u4_cur_word = ITT_BIG_ENDIAN(u4_temp);
117*c83a76b0SSuyog Pawar     u4_temp = *pu4_buf++;
118*c83a76b0SSuyog Pawar     u4_nxt_word = ITT_BIG_ENDIAN(u4_temp);
119*c83a76b0SSuyog Pawar 
120*c83a76b0SSuyog Pawar     ps_bitstrm->u4_bit_ofst     = 0;
121*c83a76b0SSuyog Pawar     ps_bitstrm->pu1_buf_base    = pu1_buf;
122*c83a76b0SSuyog Pawar     ps_bitstrm->pu4_buf         = pu4_buf;
123*c83a76b0SSuyog Pawar     ps_bitstrm->u4_cur_word     = u4_cur_word;
124*c83a76b0SSuyog Pawar     ps_bitstrm->u4_nxt_word     = u4_nxt_word;
125*c83a76b0SSuyog Pawar 
126*c83a76b0SSuyog Pawar     ps_bitstrm->pu1_buf_max     = pu1_buf + u4_numbytes + 8;
127*c83a76b0SSuyog Pawar 
128*c83a76b0SSuyog Pawar     return;
129*c83a76b0SSuyog Pawar }
130*c83a76b0SSuyog Pawar 
131*c83a76b0SSuyog Pawar /**
132*c83a76b0SSuyog Pawar *******************************************************************************
133*c83a76b0SSuyog Pawar *
134*c83a76b0SSuyog Pawar * @brief
135*c83a76b0SSuyog Pawar *  Flushes given number of bits. Bits consumed increases by  this number
136*c83a76b0SSuyog Pawar *
137*c83a76b0SSuyog Pawar * @par Description:
138*c83a76b0SSuyog Pawar *  Increment bit offset by numbits. If bit offset increases  beyond 32, then
139*c83a76b0SSuyog Pawar * move nxt_word to cur_word, read next  word32 to nxt_word after endian
140*c83a76b0SSuyog Pawar * conversion
141*c83a76b0SSuyog Pawar *
142*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
143*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
144*c83a76b0SSuyog Pawar *
145*c83a76b0SSuyog Pawar * @param[in] u4_numbits
146*c83a76b0SSuyog Pawar *  Number of bits to be flushed
147*c83a76b0SSuyog Pawar *
148*c83a76b0SSuyog Pawar * @returns  None
149*c83a76b0SSuyog Pawar *
150*c83a76b0SSuyog Pawar * @remarks
151*c83a76b0SSuyog Pawar *
152*c83a76b0SSuyog Pawar *
153*c83a76b0SSuyog Pawar *******************************************************************************
154*c83a76b0SSuyog Pawar */
ihevcd_bits_flush(bitstrm_t * ps_bitstrm,UWORD32 u4_numbits)155*c83a76b0SSuyog Pawar void ihevcd_bits_flush(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits)
156*c83a76b0SSuyog Pawar {
157*c83a76b0SSuyog Pawar 
158*c83a76b0SSuyog Pawar     BITS_FLUSH(ps_bitstrm->pu4_buf,
159*c83a76b0SSuyog Pawar                ps_bitstrm->u4_bit_ofst,
160*c83a76b0SSuyog Pawar                ps_bitstrm->u4_cur_word,
161*c83a76b0SSuyog Pawar                ps_bitstrm->u4_nxt_word,
162*c83a76b0SSuyog Pawar                u4_numbits);
163*c83a76b0SSuyog Pawar 
164*c83a76b0SSuyog Pawar     return;
165*c83a76b0SSuyog Pawar }
166*c83a76b0SSuyog Pawar 
167*c83a76b0SSuyog Pawar /**
168*c83a76b0SSuyog Pawar *******************************************************************************
169*c83a76b0SSuyog Pawar *
170*c83a76b0SSuyog Pawar * @brief
171*c83a76b0SSuyog Pawar *  Flushes to next byte boundary.Bits consumed increases by  this number
172*c83a76b0SSuyog Pawar *
173*c83a76b0SSuyog Pawar * @par Description:
174*c83a76b0SSuyog Pawar *  Compute number of bits remaining in the current byte  then call
175*c83a76b0SSuyog Pawar * ihevcd_bits_flush() bits with this number
176*c83a76b0SSuyog Pawar *
177*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
178*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
179*c83a76b0SSuyog Pawar *
180*c83a76b0SSuyog Pawar * @returns  None
181*c83a76b0SSuyog Pawar *
182*c83a76b0SSuyog Pawar * @remarks
183*c83a76b0SSuyog Pawar *
184*c83a76b0SSuyog Pawar *
185*c83a76b0SSuyog Pawar *******************************************************************************
186*c83a76b0SSuyog Pawar */
ihevcd_bits_flush_to_byte_boundary(bitstrm_t * ps_bitstrm)187*c83a76b0SSuyog Pawar void ihevcd_bits_flush_to_byte_boundary(bitstrm_t *ps_bitstrm)
188*c83a76b0SSuyog Pawar {
189*c83a76b0SSuyog Pawar     UWORD32 u4_numbits;
190*c83a76b0SSuyog Pawar     u4_numbits = (ps_bitstrm->u4_bit_ofst) & 7;
191*c83a76b0SSuyog Pawar 
192*c83a76b0SSuyog Pawar     u4_numbits = 8 - u4_numbits;
193*c83a76b0SSuyog Pawar 
194*c83a76b0SSuyog Pawar     BITS_FLUSH(ps_bitstrm->pu4_buf,
195*c83a76b0SSuyog Pawar                ps_bitstrm->u4_bit_ofst,
196*c83a76b0SSuyog Pawar                ps_bitstrm->u4_cur_word,
197*c83a76b0SSuyog Pawar                ps_bitstrm->u4_nxt_word,
198*c83a76b0SSuyog Pawar                u4_numbits);
199*c83a76b0SSuyog Pawar 
200*c83a76b0SSuyog Pawar     return;
201*c83a76b0SSuyog Pawar }
202*c83a76b0SSuyog Pawar 
203*c83a76b0SSuyog Pawar /**
204*c83a76b0SSuyog Pawar *******************************************************************************
205*c83a76b0SSuyog Pawar *
206*c83a76b0SSuyog Pawar * @brief
207*c83a76b0SSuyog Pawar *  Seeks by given number of bits in the bitstream from current position
208*c83a76b0SSuyog Pawar *
209*c83a76b0SSuyog Pawar * @par Description:
210*c83a76b0SSuyog Pawar *  Add given number of bits to bitstream offset and update pu4_buf, cur_word and
211*c83a76b0SSuyog Pawar *  nxt_word accordingly
212*c83a76b0SSuyog Pawar *
213*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
214*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
215*c83a76b0SSuyog Pawar *
216*c83a76b0SSuyog Pawar * @param[in] numbits
217*c83a76b0SSuyog Pawar *  Number of bits to seek
218*c83a76b0SSuyog Pawar *
219*c83a76b0SSuyog Pawar * @returns  None
220*c83a76b0SSuyog Pawar *
221*c83a76b0SSuyog Pawar * @remarks
222*c83a76b0SSuyog Pawar * Assumes emulation prevention has been done before and the buffer does not
223*c83a76b0SSuyog Pawar * contain any emulation prevention bytes
224*c83a76b0SSuyog Pawar *
225*c83a76b0SSuyog Pawar *******************************************************************************
226*c83a76b0SSuyog Pawar */
ihevcd_bits_seek(bitstrm_t * ps_bitstrm,WORD32 numbits)227*c83a76b0SSuyog Pawar void ihevcd_bits_seek(bitstrm_t *ps_bitstrm, WORD32 numbits)
228*c83a76b0SSuyog Pawar {
229*c83a76b0SSuyog Pawar     WORD32 val;
230*c83a76b0SSuyog Pawar     ASSERT(numbits >= -32);
231*c83a76b0SSuyog Pawar     ASSERT(numbits <= 32);
232*c83a76b0SSuyog Pawar     /* Check if Seeking backwards*/
233*c83a76b0SSuyog Pawar     if(numbits < 0)
234*c83a76b0SSuyog Pawar     {
235*c83a76b0SSuyog Pawar         UWORD32 abs_numbits = -numbits;
236*c83a76b0SSuyog Pawar         if(ps_bitstrm->u4_bit_ofst >= abs_numbits)
237*c83a76b0SSuyog Pawar         {
238*c83a76b0SSuyog Pawar             /* If the current offset is greater than number of bits to seek back,
239*c83a76b0SSuyog Pawar              * then subtract abs_numbits from offset and return.
240*c83a76b0SSuyog Pawar              */
241*c83a76b0SSuyog Pawar             ps_bitstrm->u4_bit_ofst -= abs_numbits;
242*c83a76b0SSuyog Pawar             return;
243*c83a76b0SSuyog Pawar         }
244*c83a76b0SSuyog Pawar         else
245*c83a76b0SSuyog Pawar         {
246*c83a76b0SSuyog Pawar             /* If the current offset is lesser than number of bits to seek back,
247*c83a76b0SSuyog Pawar              * then subtract abs_numbits from offset and add 32 and move cur_word to nxt_word
248*c83a76b0SSuyog Pawar              * and load cur_word appropriately and decrement pu4_buf
249*c83a76b0SSuyog Pawar              */
250*c83a76b0SSuyog Pawar             ps_bitstrm->u4_bit_ofst += 32;
251*c83a76b0SSuyog Pawar             ps_bitstrm->u4_bit_ofst -= abs_numbits;
252*c83a76b0SSuyog Pawar             ps_bitstrm->pu4_buf--;
253*c83a76b0SSuyog Pawar 
254*c83a76b0SSuyog Pawar             val = *(ps_bitstrm->pu4_buf - 2);
255*c83a76b0SSuyog Pawar             ps_bitstrm->u4_nxt_word = ps_bitstrm->u4_cur_word;
256*c83a76b0SSuyog Pawar             ps_bitstrm->u4_cur_word = ITT_BIG_ENDIAN(val);
257*c83a76b0SSuyog Pawar             return;
258*c83a76b0SSuyog Pawar         }
259*c83a76b0SSuyog Pawar     }
260*c83a76b0SSuyog Pawar     else
261*c83a76b0SSuyog Pawar     {
262*c83a76b0SSuyog Pawar         /* Not supported/tested currently */
263*c83a76b0SSuyog Pawar         ASSERT(1);
264*c83a76b0SSuyog Pawar         BITS_FLUSH(ps_bitstrm->pu4_buf,
265*c83a76b0SSuyog Pawar                    ps_bitstrm->u4_bit_ofst,
266*c83a76b0SSuyog Pawar                    ps_bitstrm->u4_cur_word,
267*c83a76b0SSuyog Pawar                    ps_bitstrm->u4_nxt_word,
268*c83a76b0SSuyog Pawar                    numbits);
269*c83a76b0SSuyog Pawar 
270*c83a76b0SSuyog Pawar 
271*c83a76b0SSuyog Pawar     }
272*c83a76b0SSuyog Pawar     return;
273*c83a76b0SSuyog Pawar }
274*c83a76b0SSuyog Pawar /**
275*c83a76b0SSuyog Pawar *******************************************************************************
276*c83a76b0SSuyog Pawar *
277*c83a76b0SSuyog Pawar * @brief
278*c83a76b0SSuyog Pawar *  Snoops for next numbits number of bits from the bitstream this does not
279*c83a76b0SSuyog Pawar * update the bitstream offset and does not  consume the bits
280*c83a76b0SSuyog Pawar *
281*c83a76b0SSuyog Pawar * @par Description:
282*c83a76b0SSuyog Pawar *  Extract required number of bits from cur_word & nxt_word  return these
283*c83a76b0SSuyog Pawar * bits
284*c83a76b0SSuyog Pawar *
285*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
286*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
287*c83a76b0SSuyog Pawar *
288*c83a76b0SSuyog Pawar * @param[in] u4_numbits
289*c83a76b0SSuyog Pawar *  Number of bits
290*c83a76b0SSuyog Pawar *
291*c83a76b0SSuyog Pawar * @returns  Next u4_numbits number of bits
292*c83a76b0SSuyog Pawar *
293*c83a76b0SSuyog Pawar * @remarks
294*c83a76b0SSuyog Pawar *
295*c83a76b0SSuyog Pawar *
296*c83a76b0SSuyog Pawar *******************************************************************************
297*c83a76b0SSuyog Pawar */
ihevcd_bits_nxt(bitstrm_t * ps_bitstrm,UWORD32 u4_numbits)298*c83a76b0SSuyog Pawar UWORD32 ihevcd_bits_nxt(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits)
299*c83a76b0SSuyog Pawar {
300*c83a76b0SSuyog Pawar     UWORD32 u4_bits_read;
301*c83a76b0SSuyog Pawar 
302*c83a76b0SSuyog Pawar     BITS_NXT(u4_bits_read,
303*c83a76b0SSuyog Pawar              ps_bitstrm->pu4_buf,
304*c83a76b0SSuyog Pawar              ps_bitstrm->u4_bit_ofst,
305*c83a76b0SSuyog Pawar              ps_bitstrm->u4_cur_word,
306*c83a76b0SSuyog Pawar              ps_bitstrm->u4_nxt_word,
307*c83a76b0SSuyog Pawar              u4_numbits);
308*c83a76b0SSuyog Pawar     return u4_bits_read;
309*c83a76b0SSuyog Pawar }
310*c83a76b0SSuyog Pawar /**
311*c83a76b0SSuyog Pawar *******************************************************************************
312*c83a76b0SSuyog Pawar *
313*c83a76b0SSuyog Pawar * @brief
314*c83a76b0SSuyog Pawar *  Snoops for next 32 bits from the bitstream  this does not update the
315*c83a76b0SSuyog Pawar * bitstream offset and does not  consume the bits
316*c83a76b0SSuyog Pawar *
317*c83a76b0SSuyog Pawar * @par Description:
318*c83a76b0SSuyog Pawar *  Extract required number of bits from cur_word & nxt_word  return these
319*c83a76b0SSuyog Pawar * bits
320*c83a76b0SSuyog Pawar *
321*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
322*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
323*c83a76b0SSuyog Pawar *
324*c83a76b0SSuyog Pawar * @param[in] u4_numbits
325*c83a76b0SSuyog Pawar *  Number of bits
326*c83a76b0SSuyog Pawar *
327*c83a76b0SSuyog Pawar * @returns  Next 32 bits
328*c83a76b0SSuyog Pawar *
329*c83a76b0SSuyog Pawar * @remarks
330*c83a76b0SSuyog Pawar *
331*c83a76b0SSuyog Pawar *
332*c83a76b0SSuyog Pawar *******************************************************************************
333*c83a76b0SSuyog Pawar */
ihevcd_bits_nxt32(bitstrm_t * ps_bitstrm,UWORD32 u4_numbits)334*c83a76b0SSuyog Pawar UWORD32 ihevcd_bits_nxt32(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits)
335*c83a76b0SSuyog Pawar {
336*c83a76b0SSuyog Pawar     UWORD32 u4_bits_read;
337*c83a76b0SSuyog Pawar     UNUSED(u4_numbits);
338*c83a76b0SSuyog Pawar     BITS_NXT32(u4_bits_read,
339*c83a76b0SSuyog Pawar                ps_bitstrm->pu4_buf,
340*c83a76b0SSuyog Pawar                ps_bitstrm->u4_bit_ofst,
341*c83a76b0SSuyog Pawar                ps_bitstrm->u4_cur_word,
342*c83a76b0SSuyog Pawar                ps_bitstrm->u4_nxt_word);
343*c83a76b0SSuyog Pawar     return u4_bits_read;
344*c83a76b0SSuyog Pawar }
345*c83a76b0SSuyog Pawar 
346*c83a76b0SSuyog Pawar /**
347*c83a76b0SSuyog Pawar *******************************************************************************
348*c83a76b0SSuyog Pawar *
349*c83a76b0SSuyog Pawar * @brief
350*c83a76b0SSuyog Pawar *  Reads next numbits number of bits from the bitstream  this updates the
351*c83a76b0SSuyog Pawar * bitstream offset and consumes the bits
352*c83a76b0SSuyog Pawar *
353*c83a76b0SSuyog Pawar * @par Description:
354*c83a76b0SSuyog Pawar *  Extract required number of bits from cur_word & nxt_word  return these
355*c83a76b0SSuyog Pawar * bits
356*c83a76b0SSuyog Pawar *
357*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
358*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
359*c83a76b0SSuyog Pawar *
360*c83a76b0SSuyog Pawar * @param[in] u4_numbits
361*c83a76b0SSuyog Pawar *  Number of bits
362*c83a76b0SSuyog Pawar *
363*c83a76b0SSuyog Pawar * @returns  Bits read
364*c83a76b0SSuyog Pawar *
365*c83a76b0SSuyog Pawar * @remarks
366*c83a76b0SSuyog Pawar *
367*c83a76b0SSuyog Pawar *
368*c83a76b0SSuyog Pawar *******************************************************************************
369*c83a76b0SSuyog Pawar */
ihevcd_bits_get(bitstrm_t * ps_bitstrm,UWORD32 u4_numbits)370*c83a76b0SSuyog Pawar UWORD32 ihevcd_bits_get(bitstrm_t *ps_bitstrm, UWORD32 u4_numbits)
371*c83a76b0SSuyog Pawar {
372*c83a76b0SSuyog Pawar     UWORD32 u4_bits_read;
373*c83a76b0SSuyog Pawar 
374*c83a76b0SSuyog Pawar     BITS_GET(u4_bits_read,
375*c83a76b0SSuyog Pawar              ps_bitstrm->pu4_buf,
376*c83a76b0SSuyog Pawar              ps_bitstrm->u4_bit_ofst,
377*c83a76b0SSuyog Pawar              ps_bitstrm->u4_cur_word,
378*c83a76b0SSuyog Pawar              ps_bitstrm->u4_nxt_word,
379*c83a76b0SSuyog Pawar              u4_numbits);
380*c83a76b0SSuyog Pawar     return u4_bits_read;
381*c83a76b0SSuyog Pawar 
382*c83a76b0SSuyog Pawar }
383*c83a76b0SSuyog Pawar 
384*c83a76b0SSuyog Pawar /**
385*c83a76b0SSuyog Pawar *******************************************************************************
386*c83a76b0SSuyog Pawar *
387*c83a76b0SSuyog Pawar * @brief
388*c83a76b0SSuyog Pawar *  Returns the number of bits remaining in the bitstream
389*c83a76b0SSuyog Pawar *
390*c83a76b0SSuyog Pawar * @par Description:
391*c83a76b0SSuyog Pawar *  Compute number of bits remaining based on current pointer and buffer base
392*c83a76b0SSuyog Pawar * and current offset. Since 8 bytes are  read at the start into cur_word and
393*c83a76b0SSuyog Pawar * nxt_word and are not  consumed, 8 has to be subtracted
394*c83a76b0SSuyog Pawar *
395*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
396*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
397*c83a76b0SSuyog Pawar *
398*c83a76b0SSuyog Pawar * @returns  Total number of bits remaining
399*c83a76b0SSuyog Pawar *
400*c83a76b0SSuyog Pawar * @remarks
401*c83a76b0SSuyog Pawar *
402*c83a76b0SSuyog Pawar *
403*c83a76b0SSuyog Pawar *******************************************************************************
404*c83a76b0SSuyog Pawar */
ihevcd_bits_num_bits_remaining(bitstrm_t * ps_bitstrm)405*c83a76b0SSuyog Pawar UWORD32  ihevcd_bits_num_bits_remaining(bitstrm_t *ps_bitstrm)
406*c83a76b0SSuyog Pawar {
407*c83a76b0SSuyog Pawar     UWORD32 u4_bits_consumed;
408*c83a76b0SSuyog Pawar     UWORD32 u4_size_in_bits;
409*c83a76b0SSuyog Pawar 
410*c83a76b0SSuyog Pawar     /* 8 bytes are read in cur_word and nxt_word at the start. Hence */
411*c83a76b0SSuyog Pawar     /* subtract 8 bytes */
412*c83a76b0SSuyog Pawar     u4_bits_consumed = (UWORD32)(((UWORD8 *)ps_bitstrm->pu4_buf -
413*c83a76b0SSuyog Pawar                                   (UWORD8 *)ps_bitstrm->pu1_buf_base - 8) <<
414*c83a76b0SSuyog Pawar                                  3) + ps_bitstrm->u4_bit_ofst;
415*c83a76b0SSuyog Pawar 
416*c83a76b0SSuyog Pawar     u4_size_in_bits = (UWORD32)(ps_bitstrm->pu1_buf_max -
417*c83a76b0SSuyog Pawar                     ps_bitstrm->pu1_buf_base) - 8;
418*c83a76b0SSuyog Pawar     u4_size_in_bits <<= 3;
419*c83a76b0SSuyog Pawar     if(u4_size_in_bits > u4_bits_consumed)
420*c83a76b0SSuyog Pawar     {
421*c83a76b0SSuyog Pawar         return (u4_size_in_bits - u4_bits_consumed);
422*c83a76b0SSuyog Pawar     }
423*c83a76b0SSuyog Pawar     else
424*c83a76b0SSuyog Pawar     {
425*c83a76b0SSuyog Pawar         return 0;
426*c83a76b0SSuyog Pawar     }
427*c83a76b0SSuyog Pawar }
428*c83a76b0SSuyog Pawar 
429*c83a76b0SSuyog Pawar /**
430*c83a76b0SSuyog Pawar *******************************************************************************
431*c83a76b0SSuyog Pawar *
432*c83a76b0SSuyog Pawar * @brief
433*c83a76b0SSuyog Pawar *  Returns the number of bits consumed in the bitstream
434*c83a76b0SSuyog Pawar *
435*c83a76b0SSuyog Pawar * @par Description:
436*c83a76b0SSuyog Pawar *  Compute number of bits consumed based on current pointer  and buffer base
437*c83a76b0SSuyog Pawar * and current offset. Since 8 bytes are  read at the start into cur_word and
438*c83a76b0SSuyog Pawar * nxt_word and are not  consumed, 8 has to be subtracted
439*c83a76b0SSuyog Pawar *
440*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
441*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
442*c83a76b0SSuyog Pawar *
443*c83a76b0SSuyog Pawar * @returns  Total number of bits bits consumed
444*c83a76b0SSuyog Pawar *
445*c83a76b0SSuyog Pawar * @remarks
446*c83a76b0SSuyog Pawar *
447*c83a76b0SSuyog Pawar *
448*c83a76b0SSuyog Pawar *******************************************************************************
449*c83a76b0SSuyog Pawar */
ihevcd_bits_num_bits_consumed(bitstrm_t * ps_bitstrm)450*c83a76b0SSuyog Pawar UWORD32  ihevcd_bits_num_bits_consumed(bitstrm_t *ps_bitstrm)
451*c83a76b0SSuyog Pawar {
452*c83a76b0SSuyog Pawar     UWORD32 u4_bits_consumed;
453*c83a76b0SSuyog Pawar     /* 8 bytes are read in cur_word and nxt_word at the start. Hence */
454*c83a76b0SSuyog Pawar     /* subtract 8 bytes */
455*c83a76b0SSuyog Pawar 
456*c83a76b0SSuyog Pawar     u4_bits_consumed = (UWORD32)(((UWORD8 *)ps_bitstrm->pu4_buf -
457*c83a76b0SSuyog Pawar                                   (UWORD8 *)ps_bitstrm->pu1_buf_base - 8) <<
458*c83a76b0SSuyog Pawar                                  3) + ps_bitstrm->u4_bit_ofst;
459*c83a76b0SSuyog Pawar     return u4_bits_consumed;
460*c83a76b0SSuyog Pawar }
461*c83a76b0SSuyog Pawar 
462*c83a76b0SSuyog Pawar /**
463*c83a76b0SSuyog Pawar *******************************************************************************
464*c83a76b0SSuyog Pawar *
465*c83a76b0SSuyog Pawar * @brief
466*c83a76b0SSuyog Pawar *  Reads unsigned integer 0-th order exp-golomb-coded syntax element from
467*c83a76b0SSuyog Pawar * the bitstream  Section: 9.2
468*c83a76b0SSuyog Pawar *
469*c83a76b0SSuyog Pawar * @par Description:
470*c83a76b0SSuyog Pawar *  Extract required number of bits from cur_word & nxt_word  return these
471*c83a76b0SSuyog Pawar * bits
472*c83a76b0SSuyog Pawar *
473*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
474*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
475*c83a76b0SSuyog Pawar *
476*c83a76b0SSuyog Pawar * @returns  UEV decoded syntax element
477*c83a76b0SSuyog Pawar *
478*c83a76b0SSuyog Pawar * @remarks
479*c83a76b0SSuyog Pawar *
480*c83a76b0SSuyog Pawar *
481*c83a76b0SSuyog Pawar *******************************************************************************
482*c83a76b0SSuyog Pawar */
ihevcd_uev(bitstrm_t * ps_bitstrm)483*c83a76b0SSuyog Pawar UWORD32 ihevcd_uev(bitstrm_t *ps_bitstrm)
484*c83a76b0SSuyog Pawar {
485*c83a76b0SSuyog Pawar     UWORD32 u4_bits_read;
486*c83a76b0SSuyog Pawar     UWORD32 u4_clz;
487*c83a76b0SSuyog Pawar 
488*c83a76b0SSuyog Pawar 
489*c83a76b0SSuyog Pawar     /***************************************************************/
490*c83a76b0SSuyog Pawar     /* Find leading zeros in next 32 bits                          */
491*c83a76b0SSuyog Pawar     /***************************************************************/
492*c83a76b0SSuyog Pawar     BITS_NXT32(u4_bits_read,
493*c83a76b0SSuyog Pawar                ps_bitstrm->pu4_buf,
494*c83a76b0SSuyog Pawar                ps_bitstrm->u4_bit_ofst,
495*c83a76b0SSuyog Pawar                ps_bitstrm->u4_cur_word,
496*c83a76b0SSuyog Pawar                ps_bitstrm->u4_nxt_word);
497*c83a76b0SSuyog Pawar 
498*c83a76b0SSuyog Pawar 
499*c83a76b0SSuyog Pawar     u4_clz = CLZ(u4_bits_read);
500*c83a76b0SSuyog Pawar 
501*c83a76b0SSuyog Pawar     BITS_FLUSH(ps_bitstrm->pu4_buf,
502*c83a76b0SSuyog Pawar                ps_bitstrm->u4_bit_ofst,
503*c83a76b0SSuyog Pawar                ps_bitstrm->u4_cur_word,
504*c83a76b0SSuyog Pawar                ps_bitstrm->u4_nxt_word,
505*c83a76b0SSuyog Pawar                (u4_clz + 1));
506*c83a76b0SSuyog Pawar 
507*c83a76b0SSuyog Pawar     u4_bits_read = 0;
508*c83a76b0SSuyog Pawar     if(u4_clz)
509*c83a76b0SSuyog Pawar     {
510*c83a76b0SSuyog Pawar         BITS_GET(u4_bits_read,
511*c83a76b0SSuyog Pawar                  ps_bitstrm->pu4_buf,
512*c83a76b0SSuyog Pawar                  ps_bitstrm->u4_bit_ofst,
513*c83a76b0SSuyog Pawar                  ps_bitstrm->u4_cur_word,
514*c83a76b0SSuyog Pawar                  ps_bitstrm->u4_nxt_word,
515*c83a76b0SSuyog Pawar                  u4_clz);
516*c83a76b0SSuyog Pawar     }
517*c83a76b0SSuyog Pawar     return ((1 << u4_clz) + u4_bits_read - 1);
518*c83a76b0SSuyog Pawar 
519*c83a76b0SSuyog Pawar }
520*c83a76b0SSuyog Pawar 
521*c83a76b0SSuyog Pawar /**
522*c83a76b0SSuyog Pawar *******************************************************************************
523*c83a76b0SSuyog Pawar *
524*c83a76b0SSuyog Pawar * @brief
525*c83a76b0SSuyog Pawar *  Reads signed integer 0-th order exp-golomb-coded syntax  element from the
526*c83a76b0SSuyog Pawar * bitstream. Function similar to get_uev  Section: 9.2.1
527*c83a76b0SSuyog Pawar *
528*c83a76b0SSuyog Pawar * @par Description:
529*c83a76b0SSuyog Pawar *  Extract required number of bits from cur_word & nxt_word  return these
530*c83a76b0SSuyog Pawar * bits
531*c83a76b0SSuyog Pawar *
532*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
533*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
534*c83a76b0SSuyog Pawar *
535*c83a76b0SSuyog Pawar * @returns  UEV decoded syntax element
536*c83a76b0SSuyog Pawar *
537*c83a76b0SSuyog Pawar * @remarks
538*c83a76b0SSuyog Pawar *
539*c83a76b0SSuyog Pawar *
540*c83a76b0SSuyog Pawar *******************************************************************************
541*c83a76b0SSuyog Pawar */
ihevcd_sev(bitstrm_t * ps_bitstrm)542*c83a76b0SSuyog Pawar WORD32 ihevcd_sev(bitstrm_t *ps_bitstrm)
543*c83a76b0SSuyog Pawar {
544*c83a76b0SSuyog Pawar     UWORD32 u4_bits_read;
545*c83a76b0SSuyog Pawar     UWORD32 u4_clz;
546*c83a76b0SSuyog Pawar     UWORD32 u4_abs_val;
547*c83a76b0SSuyog Pawar 
548*c83a76b0SSuyog Pawar 
549*c83a76b0SSuyog Pawar     /***************************************************************/
550*c83a76b0SSuyog Pawar     /* Find leading zeros in next 32 bits                          */
551*c83a76b0SSuyog Pawar     /***************************************************************/
552*c83a76b0SSuyog Pawar     BITS_NXT32(u4_bits_read,
553*c83a76b0SSuyog Pawar                ps_bitstrm->pu4_buf,
554*c83a76b0SSuyog Pawar                ps_bitstrm->u4_bit_ofst,
555*c83a76b0SSuyog Pawar                ps_bitstrm->u4_cur_word,
556*c83a76b0SSuyog Pawar                ps_bitstrm->u4_nxt_word);
557*c83a76b0SSuyog Pawar 
558*c83a76b0SSuyog Pawar 
559*c83a76b0SSuyog Pawar     u4_clz = CLZ(u4_bits_read);
560*c83a76b0SSuyog Pawar 
561*c83a76b0SSuyog Pawar     BITS_FLUSH(ps_bitstrm->pu4_buf,
562*c83a76b0SSuyog Pawar                ps_bitstrm->u4_bit_ofst,
563*c83a76b0SSuyog Pawar                ps_bitstrm->u4_cur_word,
564*c83a76b0SSuyog Pawar                ps_bitstrm->u4_nxt_word,
565*c83a76b0SSuyog Pawar                (u4_clz + 1));
566*c83a76b0SSuyog Pawar 
567*c83a76b0SSuyog Pawar     u4_bits_read = 0;
568*c83a76b0SSuyog Pawar     if(u4_clz)
569*c83a76b0SSuyog Pawar     {
570*c83a76b0SSuyog Pawar         BITS_GET(u4_bits_read,
571*c83a76b0SSuyog Pawar                  ps_bitstrm->pu4_buf,
572*c83a76b0SSuyog Pawar                  ps_bitstrm->u4_bit_ofst,
573*c83a76b0SSuyog Pawar                  ps_bitstrm->u4_cur_word,
574*c83a76b0SSuyog Pawar                  ps_bitstrm->u4_nxt_word,
575*c83a76b0SSuyog Pawar                  u4_clz);
576*c83a76b0SSuyog Pawar     }
577*c83a76b0SSuyog Pawar     u4_abs_val = ((1 << u4_clz) + u4_bits_read) >> 1;
578*c83a76b0SSuyog Pawar     if(u4_bits_read & 0x1)
579*c83a76b0SSuyog Pawar         return (-(WORD32)u4_abs_val);
580*c83a76b0SSuyog Pawar     else
581*c83a76b0SSuyog Pawar         return (u4_abs_val);
582*c83a76b0SSuyog Pawar }
583*c83a76b0SSuyog Pawar 
584*c83a76b0SSuyog Pawar 
585*c83a76b0SSuyog Pawar 
586*c83a76b0SSuyog Pawar 
587*c83a76b0SSuyog Pawar 
588*c83a76b0SSuyog Pawar 
589