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