xref: /aosp_15_r20/external/libavc/encoder/ih264e_bitstream.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker 
21*495ae853SAndroid Build Coastguard Worker /**
22*495ae853SAndroid Build Coastguard Worker ******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker *  ih264e_bitstream.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker *  This file contains function definitions related to bitstream generation
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker * @author
30*495ae853SAndroid Build Coastguard Worker *  ittiam
31*495ae853SAndroid Build Coastguard Worker *
32*495ae853SAndroid Build Coastguard Worker * @par List of Functions:
33*495ae853SAndroid Build Coastguard Worker *  - ih264e_bitstrm_init
34*495ae853SAndroid Build Coastguard Worker *  - ih264e_put_bits
35*495ae853SAndroid Build Coastguard Worker *  - ih264e_put_bit
36*495ae853SAndroid Build Coastguard Worker *  - ih264e_put_rbsp_trailing_bits
37*495ae853SAndroid Build Coastguard Worker *  - ih264e_put_uev
38*495ae853SAndroid Build Coastguard Worker *  - ih264e_put_sev
39*495ae853SAndroid Build Coastguard Worker *  - ih264e_put_nal_start_code_prefix
40*495ae853SAndroid Build Coastguard Worker *
41*495ae853SAndroid Build Coastguard Worker ******************************************************************************
42*495ae853SAndroid Build Coastguard Worker */
43*495ae853SAndroid Build Coastguard Worker 
44*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
45*495ae853SAndroid Build Coastguard Worker /* File Includes                                                             */
46*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
47*495ae853SAndroid Build Coastguard Worker 
48*495ae853SAndroid Build Coastguard Worker /* System Include Files */
49*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
50*495ae853SAndroid Build Coastguard Worker #include <string.h>
51*495ae853SAndroid Build Coastguard Worker #include <stdlib.h>
52*495ae853SAndroid Build Coastguard Worker #include <assert.h>
53*495ae853SAndroid Build Coastguard Worker #include <stdarg.h>
54*495ae853SAndroid Build Coastguard Worker #include <math.h>
55*495ae853SAndroid Build Coastguard Worker 
56*495ae853SAndroid Build Coastguard Worker /* User Include Files */
57*495ae853SAndroid Build Coastguard Worker #include "ih264e_config.h"
58*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
59*495ae853SAndroid Build Coastguard Worker 
60*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
61*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
62*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
63*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
64*495ae853SAndroid Build Coastguard Worker 
65*495ae853SAndroid Build Coastguard Worker #include "ih264e_error.h"
66*495ae853SAndroid Build Coastguard Worker #include "ih264e_bitstream.h"
67*495ae853SAndroid Build Coastguard Worker 
68*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
69*495ae853SAndroid Build Coastguard Worker /* Function Definitions                                                      */
70*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
71*495ae853SAndroid Build Coastguard Worker 
72*495ae853SAndroid Build Coastguard Worker /**
73*495ae853SAndroid Build Coastguard Worker ******************************************************************************
74*495ae853SAndroid Build Coastguard Worker *
75*495ae853SAndroid Build Coastguard Worker *  @brief Initializes the encoder bitstream engine
76*495ae853SAndroid Build Coastguard Worker *
77*495ae853SAndroid Build Coastguard Worker *  @par   Description
78*495ae853SAndroid Build Coastguard Worker *  This routine needs to be called at start of slice/frame encode
79*495ae853SAndroid Build Coastguard Worker *
80*495ae853SAndroid Build Coastguard Worker *  @param[in]   ps_bitstrm
81*495ae853SAndroid Build Coastguard Worker *  pointer to bitstream context (handle)
82*495ae853SAndroid Build Coastguard Worker *
83*495ae853SAndroid Build Coastguard Worker *  @param[in]   p1_bitstrm_buf
84*495ae853SAndroid Build Coastguard Worker *  bitstream buffer pointer where the encoded stream is generated in byte order
85*495ae853SAndroid Build Coastguard Worker *
86*495ae853SAndroid Build Coastguard Worker *  @param[in]   u4_max_bitstrm_size
87*495ae853SAndroid Build Coastguard Worker *  indicates maximum bitstream buffer size. (in bytes)
88*495ae853SAndroid Build Coastguard Worker *  If actual stream size exceeds the maximum size, encoder should
89*495ae853SAndroid Build Coastguard Worker *   1. Not corrupt data beyond u4_max_bitstrm_size bytes
90*495ae853SAndroid Build Coastguard Worker *   2. Report an error back to application indicating overflow
91*495ae853SAndroid Build Coastguard Worker *
92*495ae853SAndroid Build Coastguard Worker *  @return      success or failure error code
93*495ae853SAndroid Build Coastguard Worker *
94*495ae853SAndroid Build Coastguard Worker ******************************************************************************
95*495ae853SAndroid Build Coastguard Worker */
ih264e_bitstrm_init(bitstrm_t * ps_bitstrm,UWORD8 * pu1_bitstrm_buf,UWORD32 u4_max_bitstrm_size)96*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_bitstrm_init(bitstrm_t *ps_bitstrm,
97*495ae853SAndroid Build Coastguard Worker                                    UWORD8 *pu1_bitstrm_buf,
98*495ae853SAndroid Build Coastguard Worker                                    UWORD32 u4_max_bitstrm_size)
99*495ae853SAndroid Build Coastguard Worker {
100*495ae853SAndroid Build Coastguard Worker     ps_bitstrm->pu1_strm_buffer  = pu1_bitstrm_buf;
101*495ae853SAndroid Build Coastguard Worker     ps_bitstrm->u4_max_strm_size = u4_max_bitstrm_size;
102*495ae853SAndroid Build Coastguard Worker 
103*495ae853SAndroid Build Coastguard Worker     /* Default init values for other members of bitstream context */
104*495ae853SAndroid Build Coastguard Worker     ps_bitstrm->u4_strm_buf_offset  = 0;
105*495ae853SAndroid Build Coastguard Worker     ps_bitstrm->u4_cur_word         = 0;
106*495ae853SAndroid Build Coastguard Worker     ps_bitstrm->i4_bits_left_in_cw  = WORD_SIZE;
107*495ae853SAndroid Build Coastguard Worker     ps_bitstrm->i4_zero_bytes_run   = 0;
108*495ae853SAndroid Build Coastguard Worker 
109*495ae853SAndroid Build Coastguard Worker     return(IH264E_SUCCESS);
110*495ae853SAndroid Build Coastguard Worker }
111*495ae853SAndroid Build Coastguard Worker 
112*495ae853SAndroid Build Coastguard Worker /**
113*495ae853SAndroid Build Coastguard Worker ******************************************************************************
114*495ae853SAndroid Build Coastguard Worker *
115*495ae853SAndroid Build Coastguard Worker *  @brief puts a code with specified number of bits into the bitstream
116*495ae853SAndroid Build Coastguard Worker *
117*495ae853SAndroid Build Coastguard Worker *  @par   Description
118*495ae853SAndroid Build Coastguard Worker *  inserts code_len number of bits from lsb of code_val into the
119*495ae853SAndroid Build Coastguard Worker *  bitstream. updates context members like u4_cur_word, u4_strm_buf_offset and
120*495ae853SAndroid Build Coastguard Worker *  i4_bits_left_in_cw. If the total words (u4_strm_buf_offset) exceeds max
121*495ae853SAndroid Build Coastguard Worker *  available size (u4_max_strm_size), returns error without corrupting data
122*495ae853SAndroid Build Coastguard Worker *  beyond it
123*495ae853SAndroid Build Coastguard Worker *
124*495ae853SAndroid Build Coastguard Worker *  @param[in]    ps_bitstrm
125*495ae853SAndroid Build Coastguard Worker *  pointer to bitstream context (handle)
126*495ae853SAndroid Build Coastguard Worker *
127*495ae853SAndroid Build Coastguard Worker *  @param[in]    u4_code_val
128*495ae853SAndroid Build Coastguard Worker *  code value that needs to be inserted in the stream.
129*495ae853SAndroid Build Coastguard Worker *
130*495ae853SAndroid Build Coastguard Worker *  @param[in]    code_len
131*495ae853SAndroid Build Coastguard Worker *  indicates code length (in bits) of code_val that would be inserted in
132*495ae853SAndroid Build Coastguard Worker *  bitstream buffer size. Range of length[1:WORD_SIZE]
133*495ae853SAndroid Build Coastguard Worker *
134*495ae853SAndroid Build Coastguard Worker *  @remarks     Assumptions: all bits from bit position code_len to msb of
135*495ae853SAndroid Build Coastguard Worker *   code_val shall be zero
136*495ae853SAndroid Build Coastguard Worker *
137*495ae853SAndroid Build Coastguard Worker *  @return      success or failure error code
138*495ae853SAndroid Build Coastguard Worker *
139*495ae853SAndroid Build Coastguard Worker ******************************************************************************
140*495ae853SAndroid Build Coastguard Worker */
ih264e_put_bits(bitstrm_t * ps_bitstrm,UWORD32 u4_code_val,WORD32 code_len)141*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_bits(bitstrm_t *ps_bitstrm,
142*495ae853SAndroid Build Coastguard Worker                                UWORD32 u4_code_val,
143*495ae853SAndroid Build Coastguard Worker                                WORD32 code_len)
144*495ae853SAndroid Build Coastguard Worker {
145*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cur_word = ps_bitstrm->u4_cur_word;
146*495ae853SAndroid Build Coastguard Worker     WORD32  bits_left_in_cw = ps_bitstrm->i4_bits_left_in_cw;
147*495ae853SAndroid Build Coastguard Worker 
148*495ae853SAndroid Build Coastguard Worker 
149*495ae853SAndroid Build Coastguard Worker     /* check assumptions made in the module */
150*495ae853SAndroid Build Coastguard Worker     ASSERT(code_len > 0 && code_len <= WORD_SIZE);
151*495ae853SAndroid Build Coastguard Worker 
152*495ae853SAndroid Build Coastguard Worker     if(code_len < WORD_SIZE)
153*495ae853SAndroid Build Coastguard Worker         ASSERT((u4_code_val >> code_len) == 0);
154*495ae853SAndroid Build Coastguard Worker 
155*495ae853SAndroid Build Coastguard Worker     /* sanity check on the bitstream engine state */
156*495ae853SAndroid Build Coastguard Worker     ASSERT(bits_left_in_cw > 0 && bits_left_in_cw <= WORD_SIZE);
157*495ae853SAndroid Build Coastguard Worker 
158*495ae853SAndroid Build Coastguard Worker     ASSERT(ps_bitstrm->i4_zero_bytes_run <= EPB_ZERO_BYTES);
159*495ae853SAndroid Build Coastguard Worker 
160*495ae853SAndroid Build Coastguard Worker     ASSERT(ps_bitstrm->pu1_strm_buffer != NULL);
161*495ae853SAndroid Build Coastguard Worker 
162*495ae853SAndroid Build Coastguard Worker 
163*495ae853SAndroid Build Coastguard Worker     if(bits_left_in_cw > code_len)
164*495ae853SAndroid Build Coastguard Worker     {
165*495ae853SAndroid Build Coastguard Worker         /*******************************************************************/
166*495ae853SAndroid Build Coastguard Worker         /* insert the code in local bitstream word and return              */
167*495ae853SAndroid Build Coastguard Worker         /* code is inserted in position of bits left (post decrement)      */
168*495ae853SAndroid Build Coastguard Worker         /*******************************************************************/
169*495ae853SAndroid Build Coastguard Worker         bits_left_in_cw -= code_len;
170*495ae853SAndroid Build Coastguard Worker         u4_cur_word     |= (u4_code_val << bits_left_in_cw);
171*495ae853SAndroid Build Coastguard Worker 
172*495ae853SAndroid Build Coastguard Worker         ps_bitstrm->u4_cur_word         = u4_cur_word;
173*495ae853SAndroid Build Coastguard Worker         ps_bitstrm->i4_bits_left_in_cw  = bits_left_in_cw;
174*495ae853SAndroid Build Coastguard Worker 
175*495ae853SAndroid Build Coastguard Worker         return(IH264E_SUCCESS);
176*495ae853SAndroid Build Coastguard Worker     }
177*495ae853SAndroid Build Coastguard Worker     else
178*495ae853SAndroid Build Coastguard Worker     {
179*495ae853SAndroid Build Coastguard Worker         /********************************************************************/
180*495ae853SAndroid Build Coastguard Worker         /* 1. insert partial code corresponding to bits left in cur word    */
181*495ae853SAndroid Build Coastguard Worker         /* 2. flush all the bits of cur word to bitstream                   */
182*495ae853SAndroid Build Coastguard Worker         /* 3. insert emulation prevention bytes while flushing the bits     */
183*495ae853SAndroid Build Coastguard Worker         /* 4. insert remaining bits of code starting from msb of cur word   */
184*495ae853SAndroid Build Coastguard Worker         /* 5. update bitsleft in current word and stream buffer offset      */
185*495ae853SAndroid Build Coastguard Worker         /********************************************************************/
186*495ae853SAndroid Build Coastguard Worker         WORD32  i, rem_bits = (code_len - bits_left_in_cw);
187*495ae853SAndroid Build Coastguard Worker 
188*495ae853SAndroid Build Coastguard Worker         /* insert parital code corresponding to bits left in cur word */
189*495ae853SAndroid Build Coastguard Worker         u4_cur_word |= u4_code_val >> rem_bits;
190*495ae853SAndroid Build Coastguard Worker 
191*495ae853SAndroid Build Coastguard Worker         for(i = WORD_SIZE; i > 0; i -= 8)
192*495ae853SAndroid Build Coastguard Worker         {
193*495ae853SAndroid Build Coastguard Worker             /* flush the bits in cur word byte by byte and copy to stream */
194*495ae853SAndroid Build Coastguard Worker             UWORD8   u1_next_byte = (u4_cur_word >> (i-8)) & 0xFF;
195*495ae853SAndroid Build Coastguard Worker 
196*495ae853SAndroid Build Coastguard Worker             IH264E_ERROR_T status = ih264e_put_byte_epb(ps_bitstrm, u1_next_byte);
197*495ae853SAndroid Build Coastguard Worker             if (status != IH264E_SUCCESS) return status;
198*495ae853SAndroid Build Coastguard Worker         }
199*495ae853SAndroid Build Coastguard Worker 
200*495ae853SAndroid Build Coastguard Worker         /* insert the remaining bits from code val into current word */
201*495ae853SAndroid Build Coastguard Worker         u4_cur_word = rem_bits ? (u4_code_val << (WORD_SIZE - rem_bits)) : 0;
202*495ae853SAndroid Build Coastguard Worker 
203*495ae853SAndroid Build Coastguard Worker         /* update the state variables and return success */
204*495ae853SAndroid Build Coastguard Worker         ps_bitstrm->u4_cur_word         = u4_cur_word;
205*495ae853SAndroid Build Coastguard Worker         ps_bitstrm->i4_bits_left_in_cw  = WORD_SIZE - rem_bits;
206*495ae853SAndroid Build Coastguard Worker         return (IH264E_SUCCESS);
207*495ae853SAndroid Build Coastguard Worker 
208*495ae853SAndroid Build Coastguard Worker     }
209*495ae853SAndroid Build Coastguard Worker }
210*495ae853SAndroid Build Coastguard Worker 
211*495ae853SAndroid Build Coastguard Worker /**
212*495ae853SAndroid Build Coastguard Worker ******************************************************************************
213*495ae853SAndroid Build Coastguard Worker *
214*495ae853SAndroid Build Coastguard Worker *  @brief inserts a 1-bit code into the bitstream
215*495ae853SAndroid Build Coastguard Worker *
216*495ae853SAndroid Build Coastguard Worker *  @par   Description
217*495ae853SAndroid Build Coastguard Worker *  inserts 1bit lsb of code_val into the bitstream
218*495ae853SAndroid Build Coastguard Worker *  updates context members like u4_cur_word, u4_strm_buf_offset and
219*495ae853SAndroid Build Coastguard Worker *  i4_bits_left_in_cw. If the total words (u4_strm_buf_offset) exceeds max
220*495ae853SAndroid Build Coastguard Worker *  available size (u4_max_strm_size), returns error without corrupting data
221*495ae853SAndroid Build Coastguard Worker *  beyond it
222*495ae853SAndroid Build Coastguard Worker *
223*495ae853SAndroid Build Coastguard Worker *  @param[in]    ps_bitstrm
224*495ae853SAndroid Build Coastguard Worker *  pointer to bitstream context (handle)
225*495ae853SAndroid Build Coastguard Worker *
226*495ae853SAndroid Build Coastguard Worker *  @param[in]    u4_code_val
227*495ae853SAndroid Build Coastguard Worker *  code value that needs to be inserted in the stream.
228*495ae853SAndroid Build Coastguard Worker *
229*495ae853SAndroid Build Coastguard Worker *  @remarks     Assumptions: all bits from bit position 1 to msb of code_val
230*495ae853SAndroid Build Coastguard Worker *  shall be zero
231*495ae853SAndroid Build Coastguard Worker *
232*495ae853SAndroid Build Coastguard Worker *  @return      success or failure error code
233*495ae853SAndroid Build Coastguard Worker *
234*495ae853SAndroid Build Coastguard Worker ******************************************************************************
235*495ae853SAndroid Build Coastguard Worker */
ih264e_put_bit(bitstrm_t * ps_bitstrm,UWORD32 u4_code_val)236*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_bit(bitstrm_t *ps_bitstrm, UWORD32 u4_code_val)
237*495ae853SAndroid Build Coastguard Worker {
238*495ae853SAndroid Build Coastguard Worker     /* call the put bits function for 1 bit and return */
239*495ae853SAndroid Build Coastguard Worker     return(ih264e_put_bits(ps_bitstrm, u4_code_val, 1));
240*495ae853SAndroid Build Coastguard Worker }
241*495ae853SAndroid Build Coastguard Worker 
242*495ae853SAndroid Build Coastguard Worker /**
243*495ae853SAndroid Build Coastguard Worker ******************************************************************************
244*495ae853SAndroid Build Coastguard Worker *
245*495ae853SAndroid Build Coastguard Worker *  @brief inserts rbsp trailing bits at the end of stream buffer (NAL)
246*495ae853SAndroid Build Coastguard Worker *
247*495ae853SAndroid Build Coastguard Worker *  @par   Description
248*495ae853SAndroid Build Coastguard Worker *  inserts rbsp trailing bits, updates context members like u4_cur_word and
249*495ae853SAndroid Build Coastguard Worker *  i4_bits_left_in_cw and flushes the same in the bitstream buffer. If the
250*495ae853SAndroid Build Coastguard Worker *  total words (u4_strm_buf_offset) exceeds max available size
251*495ae853SAndroid Build Coastguard Worker *  (u4_max_strm_size), returns error without corrupting data beyond it
252*495ae853SAndroid Build Coastguard Worker *
253*495ae853SAndroid Build Coastguard Worker *  @param[in]    ps_bitstrm
254*495ae853SAndroid Build Coastguard Worker *  pointer to bitstream context (handle)
255*495ae853SAndroid Build Coastguard Worker *
256*495ae853SAndroid Build Coastguard Worker *  @return      success or failure error code
257*495ae853SAndroid Build Coastguard Worker *
258*495ae853SAndroid Build Coastguard Worker ******************************************************************************
259*495ae853SAndroid Build Coastguard Worker */
ih264e_put_rbsp_trailing_bits(bitstrm_t * ps_bitstrm)260*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_rbsp_trailing_bits(bitstrm_t *ps_bitstrm)
261*495ae853SAndroid Build Coastguard Worker {
262*495ae853SAndroid Build Coastguard Worker     WORD32 i;
263*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cur_word = ps_bitstrm->u4_cur_word;
264*495ae853SAndroid Build Coastguard Worker     WORD32  bits_left_in_cw = ps_bitstrm->i4_bits_left_in_cw;
265*495ae853SAndroid Build Coastguard Worker     WORD32  bytes_left_in_cw = (bits_left_in_cw - 1) >> 3;
266*495ae853SAndroid Build Coastguard Worker 
267*495ae853SAndroid Build Coastguard Worker     /* insert a 1 at the end of current word and flush all the bits */
268*495ae853SAndroid Build Coastguard Worker     u4_cur_word |= (1 << (bits_left_in_cw - 1));
269*495ae853SAndroid Build Coastguard Worker 
270*495ae853SAndroid Build Coastguard Worker     /* get the bits to be inserted in msbdb of the word */
271*495ae853SAndroid Build Coastguard Worker     //u4_cur_word <<= (WORD_SIZE - bytes_left_in_cw + 1);
272*495ae853SAndroid Build Coastguard Worker 
273*495ae853SAndroid Build Coastguard Worker     for(i = WORD_SIZE; i > (bytes_left_in_cw*8); i -= 8)
274*495ae853SAndroid Build Coastguard Worker     {
275*495ae853SAndroid Build Coastguard Worker         /* flush the bits in cur word byte by byte  and copy to stream */
276*495ae853SAndroid Build Coastguard Worker         UWORD8   u1_next_byte = (u4_cur_word >> (i-8)) & 0xFF;
277*495ae853SAndroid Build Coastguard Worker 
278*495ae853SAndroid Build Coastguard Worker         IH264E_ERROR_T status = ih264e_put_byte_epb(ps_bitstrm, u1_next_byte);
279*495ae853SAndroid Build Coastguard Worker         if (status != IH264E_SUCCESS) return status;
280*495ae853SAndroid Build Coastguard Worker     }
281*495ae853SAndroid Build Coastguard Worker 
282*495ae853SAndroid Build Coastguard Worker     /* Default init values for scratch variables of bitstream context */
283*495ae853SAndroid Build Coastguard Worker     ps_bitstrm->u4_cur_word         = 0;
284*495ae853SAndroid Build Coastguard Worker     ps_bitstrm->i4_bits_left_in_cw  = WORD_SIZE;
285*495ae853SAndroid Build Coastguard Worker     ps_bitstrm->i4_zero_bytes_run   = 0;
286*495ae853SAndroid Build Coastguard Worker 
287*495ae853SAndroid Build Coastguard Worker     return (IH264E_SUCCESS);
288*495ae853SAndroid Build Coastguard Worker }
289*495ae853SAndroid Build Coastguard Worker 
290*495ae853SAndroid Build Coastguard Worker /**
291*495ae853SAndroid Build Coastguard Worker ******************************************************************************
292*495ae853SAndroid Build Coastguard Worker *
293*495ae853SAndroid Build Coastguard Worker *  @brief puts exponential golomb code of a unsigned integer into bitstream
294*495ae853SAndroid Build Coastguard Worker *
295*495ae853SAndroid Build Coastguard Worker *  @par   Description
296*495ae853SAndroid Build Coastguard Worker *  computes uev code for given syntax element and inserts the same into
297*495ae853SAndroid Build Coastguard Worker *  bitstream by calling ih264e_put_bits() interface.
298*495ae853SAndroid Build Coastguard Worker *
299*495ae853SAndroid Build Coastguard Worker *  @param[in]    ps_bitstrm
300*495ae853SAndroid Build Coastguard Worker *  pointer to bitstream context (handle)
301*495ae853SAndroid Build Coastguard Worker *
302*495ae853SAndroid Build Coastguard Worker *  @param[in]    u4_code_num
303*495ae853SAndroid Build Coastguard Worker *  unsigned integer input whose golomb code is written in stream
304*495ae853SAndroid Build Coastguard Worker *
305*495ae853SAndroid Build Coastguard Worker *  @remarks     Assumptions: code value can be represented in less than 16bits
306*495ae853SAndroid Build Coastguard Worker *
307*495ae853SAndroid Build Coastguard Worker *  @return      success or failure error code
308*495ae853SAndroid Build Coastguard Worker *
309*495ae853SAndroid Build Coastguard Worker ******************************************************************************
310*495ae853SAndroid Build Coastguard Worker */
ih264e_put_uev(bitstrm_t * ps_bitstrm,UWORD32 u4_code_num)311*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_uev(bitstrm_t *ps_bitstrm, UWORD32 u4_code_num)
312*495ae853SAndroid Build Coastguard Worker {
313*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_bit_str, u4_range;
314*495ae853SAndroid Build Coastguard Worker     IH264E_ERROR_T e_error;
315*495ae853SAndroid Build Coastguard Worker 
316*495ae853SAndroid Build Coastguard Worker     /* convert the codenum to exp-golomb bit code: Table 9-2 JCTVC-J1003_d7 */
317*495ae853SAndroid Build Coastguard Worker     u4_bit_str = u4_code_num + 1;
318*495ae853SAndroid Build Coastguard Worker 
319*495ae853SAndroid Build Coastguard Worker     /* get range of the bit string and put using put_bits()                 */
320*495ae853SAndroid Build Coastguard Worker     GETRANGE(u4_range, u4_bit_str);
321*495ae853SAndroid Build Coastguard Worker 
322*495ae853SAndroid Build Coastguard Worker     e_error = ih264e_put_bits(ps_bitstrm, u4_bit_str, (2 * u4_range - 1));
323*495ae853SAndroid Build Coastguard Worker 
324*495ae853SAndroid Build Coastguard Worker     return(e_error);
325*495ae853SAndroid Build Coastguard Worker }
326*495ae853SAndroid Build Coastguard Worker 
327*495ae853SAndroid Build Coastguard Worker /**
328*495ae853SAndroid Build Coastguard Worker ******************************************************************************
329*495ae853SAndroid Build Coastguard Worker *
330*495ae853SAndroid Build Coastguard Worker *  @brief puts exponential golomb code of a signed integer into bitstream
331*495ae853SAndroid Build Coastguard Worker *
332*495ae853SAndroid Build Coastguard Worker *  @par   Description
333*495ae853SAndroid Build Coastguard Worker *  computes sev code for given syntax element and inserts the same into
334*495ae853SAndroid Build Coastguard Worker *  bitstream by calling ih264e_put_bits() interface.
335*495ae853SAndroid Build Coastguard Worker *
336*495ae853SAndroid Build Coastguard Worker *  @param[in]    ps_bitstrm
337*495ae853SAndroid Build Coastguard Worker *  pointer to bitstream context (handle)
338*495ae853SAndroid Build Coastguard Worker *
339*495ae853SAndroid Build Coastguard Worker *  @param[in]    syntax_elem
340*495ae853SAndroid Build Coastguard Worker *  signed integer input whose golomb code is written in stream
341*495ae853SAndroid Build Coastguard Worker *
342*495ae853SAndroid Build Coastguard Worker *  @remarks     Assumptions: code value can be represented in less than 16bits
343*495ae853SAndroid Build Coastguard Worker *
344*495ae853SAndroid Build Coastguard Worker *  @return      success or failure error code
345*495ae853SAndroid Build Coastguard Worker *
346*495ae853SAndroid Build Coastguard Worker ******************************************************************************
347*495ae853SAndroid Build Coastguard Worker */
ih264e_put_sev(bitstrm_t * ps_bitstrm,WORD32 syntax_elem)348*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_sev(bitstrm_t *ps_bitstrm, WORD32 syntax_elem)
349*495ae853SAndroid Build Coastguard Worker {
350*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_code_num, u4_bit_str, u4_range;
351*495ae853SAndroid Build Coastguard Worker     IH264E_ERROR_T e_error;
352*495ae853SAndroid Build Coastguard Worker 
353*495ae853SAndroid Build Coastguard Worker     /************************************************************************/
354*495ae853SAndroid Build Coastguard Worker     /* convert the codenum to exp-golomb bit code for signed syntax element */
355*495ae853SAndroid Build Coastguard Worker     /* See Table9-2 and Table 9-3 of standard JCTVC-J1003_d7                */
356*495ae853SAndroid Build Coastguard Worker     /************************************************************************/
357*495ae853SAndroid Build Coastguard Worker     if(syntax_elem <= 0)
358*495ae853SAndroid Build Coastguard Worker     {
359*495ae853SAndroid Build Coastguard Worker         /* codeNum for non-positive integer =  2*abs(x) : Table9-3  */
360*495ae853SAndroid Build Coastguard Worker         u4_code_num = ((-syntax_elem) << 1);
361*495ae853SAndroid Build Coastguard Worker     }
362*495ae853SAndroid Build Coastguard Worker     else
363*495ae853SAndroid Build Coastguard Worker     {
364*495ae853SAndroid Build Coastguard Worker         /* codeNum for positive integer     =  2x-1     : Table9-3  */
365*495ae853SAndroid Build Coastguard Worker         u4_code_num = (syntax_elem << 1) - 1;
366*495ae853SAndroid Build Coastguard Worker     }
367*495ae853SAndroid Build Coastguard Worker 
368*495ae853SAndroid Build Coastguard Worker     /* convert the codenum to exp-golomb bit code: Table 9-2 JCTVC-J1003_d7 */
369*495ae853SAndroid Build Coastguard Worker     u4_bit_str = u4_code_num + 1;
370*495ae853SAndroid Build Coastguard Worker 
371*495ae853SAndroid Build Coastguard Worker     /* get range of the bit string and put using put_bits()                 */
372*495ae853SAndroid Build Coastguard Worker     GETRANGE(u4_range, u4_bit_str);
373*495ae853SAndroid Build Coastguard Worker 
374*495ae853SAndroid Build Coastguard Worker     e_error = ih264e_put_bits(ps_bitstrm, u4_bit_str, (2 * u4_range - 1));
375*495ae853SAndroid Build Coastguard Worker 
376*495ae853SAndroid Build Coastguard Worker     return(e_error);
377*495ae853SAndroid Build Coastguard Worker }
378*495ae853SAndroid Build Coastguard Worker 
379*495ae853SAndroid Build Coastguard Worker /**
380*495ae853SAndroid Build Coastguard Worker ******************************************************************************
381*495ae853SAndroid Build Coastguard Worker *
382*495ae853SAndroid Build Coastguard Worker *  @brief insert NAL start code prefix (0x000001) into bitstream with an option
383*495ae853SAndroid Build Coastguard Worker *  of inserting leading_zero_8bits (which makes startcode prefix as 0x00000001)
384*495ae853SAndroid Build Coastguard Worker *
385*495ae853SAndroid Build Coastguard Worker *  @par   Description
386*495ae853SAndroid Build Coastguard Worker *  Although start code prefix could have been put by calling ih264e_put_bits(),
387*495ae853SAndroid Build Coastguard Worker *  ih264e_put_nal_start_code_prefix() is specially added to make sure emulation
388*495ae853SAndroid Build Coastguard Worker *  prevention insertion is not done for the NAL start code prefix which will
389*495ae853SAndroid Build Coastguard Worker *  surely happen otherwise by calling ih264e_put_bits() interface.
390*495ae853SAndroid Build Coastguard Worker *
391*495ae853SAndroid Build Coastguard Worker *  @param[in]    ps_bitstrm
392*495ae853SAndroid Build Coastguard Worker *  pointer to bitstream context (handle)
393*495ae853SAndroid Build Coastguard Worker *
394*495ae853SAndroid Build Coastguard Worker *  @param[in]    insert_leading_zero_8bits
395*495ae853SAndroid Build Coastguard Worker *  flag indicating if one more zero bytes needs to prefixed before start code
396*495ae853SAndroid Build Coastguard Worker *
397*495ae853SAndroid Build Coastguard Worker *  @return      success or failure error code
398*495ae853SAndroid Build Coastguard Worker *
399*495ae853SAndroid Build Coastguard Worker ******************************************************************************
400*495ae853SAndroid Build Coastguard Worker */
ih264e_put_nal_start_code_prefix(bitstrm_t * ps_bitstrm,WORD32 insert_leading_zero_8bits)401*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_nal_start_code_prefix(bitstrm_t *ps_bitstrm,
402*495ae853SAndroid Build Coastguard Worker                                                 WORD32 insert_leading_zero_8bits)
403*495ae853SAndroid Build Coastguard Worker {
404*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_strm_buf_offset  = ps_bitstrm->u4_strm_buf_offset;
405*495ae853SAndroid Build Coastguard Worker     UWORD8* pu1_strm_buf        = ps_bitstrm->pu1_strm_buffer;
406*495ae853SAndroid Build Coastguard Worker 
407*495ae853SAndroid Build Coastguard Worker     /* Bitstream buffer overflow check assuming worst case of 4 bytes */
408*495ae853SAndroid Build Coastguard Worker     if((u4_strm_buf_offset + 4) >= ps_bitstrm->u4_max_strm_size)
409*495ae853SAndroid Build Coastguard Worker     {
410*495ae853SAndroid Build Coastguard Worker         return(IH264E_BITSTREAM_BUFFER_OVERFLOW);
411*495ae853SAndroid Build Coastguard Worker     }
412*495ae853SAndroid Build Coastguard Worker 
413*495ae853SAndroid Build Coastguard Worker     /* Insert leading zero 8 bits conditionally */
414*495ae853SAndroid Build Coastguard Worker     if(insert_leading_zero_8bits)
415*495ae853SAndroid Build Coastguard Worker     {
416*495ae853SAndroid Build Coastguard Worker         pu1_strm_buf[u4_strm_buf_offset] = 0x00;
417*495ae853SAndroid Build Coastguard Worker         u4_strm_buf_offset++;
418*495ae853SAndroid Build Coastguard Worker     }
419*495ae853SAndroid Build Coastguard Worker 
420*495ae853SAndroid Build Coastguard Worker     /* Insert NAL start code prefix 0x00 00 01 */
421*495ae853SAndroid Build Coastguard Worker     pu1_strm_buf[u4_strm_buf_offset] = 0x00;
422*495ae853SAndroid Build Coastguard Worker     u4_strm_buf_offset++;
423*495ae853SAndroid Build Coastguard Worker 
424*495ae853SAndroid Build Coastguard Worker     pu1_strm_buf[u4_strm_buf_offset] = 0x00;
425*495ae853SAndroid Build Coastguard Worker     u4_strm_buf_offset++;
426*495ae853SAndroid Build Coastguard Worker 
427*495ae853SAndroid Build Coastguard Worker     pu1_strm_buf[u4_strm_buf_offset] = 0x01;
428*495ae853SAndroid Build Coastguard Worker     u4_strm_buf_offset++;
429*495ae853SAndroid Build Coastguard Worker 
430*495ae853SAndroid Build Coastguard Worker     /* update the stream offset */
431*495ae853SAndroid Build Coastguard Worker     ps_bitstrm->u4_strm_buf_offset = u4_strm_buf_offset;
432*495ae853SAndroid Build Coastguard Worker 
433*495ae853SAndroid Build Coastguard Worker     return (IH264E_SUCCESS);
434*495ae853SAndroid Build Coastguard Worker }
435*495ae853SAndroid Build Coastguard Worker 
436