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