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