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 ******************************************************************************
23*c83a76b0SSuyog Pawar *
24*c83a76b0SSuyog Pawar * @file ihevce_cabac.h
25*c83a76b0SSuyog Pawar *
26*c83a76b0SSuyog Pawar * @brief
27*c83a76b0SSuyog Pawar * This file contains encoder cabac engine related structures and
28*c83a76b0SSuyog Pawar * interface prototypes
29*c83a76b0SSuyog Pawar *
30*c83a76b0SSuyog Pawar * @author
31*c83a76b0SSuyog Pawar * ittiam
32*c83a76b0SSuyog Pawar *
33*c83a76b0SSuyog Pawar ******************************************************************************
34*c83a76b0SSuyog Pawar */
35*c83a76b0SSuyog Pawar
36*c83a76b0SSuyog Pawar #ifndef _IHEVCE_CABAC_H_
37*c83a76b0SSuyog Pawar #define _IHEVCE_CABAC_H_
38*c83a76b0SSuyog Pawar
39*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
40*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
41*c83a76b0SSuyog Pawar
42*c83a76b0SSuyog Pawar /*****************************************************************************/
43*c83a76b0SSuyog Pawar /* Constant Macros */
44*c83a76b0SSuyog Pawar /*****************************************************************************/
45*c83a76b0SSuyog Pawar /**
46*c83a76b0SSuyog Pawar *******************************************************************************
47*c83a76b0SSuyog Pawar @brief Bit precision of cabac engine;
48*c83a76b0SSuyog Pawar *******************************************************************************
49*c83a76b0SSuyog Pawar */
50*c83a76b0SSuyog Pawar #define CABAC_BITS 9
51*c83a76b0SSuyog Pawar
52*c83a76b0SSuyog Pawar /**
53*c83a76b0SSuyog Pawar *******************************************************************************
54*c83a76b0SSuyog Pawar @brief q format to account for the fractional bits encoded in cabac
55*c83a76b0SSuyog Pawar *******************************************************************************
56*c83a76b0SSuyog Pawar */
57*c83a76b0SSuyog Pawar #define CABAC_FRAC_BITS_Q 12
58*c83a76b0SSuyog Pawar
59*c83a76b0SSuyog Pawar /**
60*c83a76b0SSuyog Pawar *******************************************************************************
61*c83a76b0SSuyog Pawar @brief Enables bit-efficient chroma cbf signalling by peeking into cbfs of
62*c83a76b0SSuyog Pawar children nodes
63*c83a76b0SSuyog Pawar *******************************************************************************
64*c83a76b0SSuyog Pawar */
65*c83a76b0SSuyog Pawar #define CABAC_BIT_EFFICIENT_CHROMA_PARENT_CBF 1
66*c83a76b0SSuyog Pawar
67*c83a76b0SSuyog Pawar /*****************************************************************************/
68*c83a76b0SSuyog Pawar /* Function Macros */
69*c83a76b0SSuyog Pawar /*****************************************************************************/
70*c83a76b0SSuyog Pawar
71*c83a76b0SSuyog Pawar /**
72*c83a76b0SSuyog Pawar *******************************************************************************
73*c83a76b0SSuyog Pawar @brief converts floating point number to CABAC_FRAC_BITS_Q q format and
74*c83a76b0SSuyog Pawar rounds the results to 16 bit integer
75*c83a76b0SSuyog Pawar *******************************************************************************
76*c83a76b0SSuyog Pawar */
77*c83a76b0SSuyog Pawar #define ROUND_Q12(x) ((UWORD16)(((x) * (1 << CABAC_FRAC_BITS_Q)) + 0.5))
78*c83a76b0SSuyog Pawar
79*c83a76b0SSuyog Pawar /*****************************************************************************/
80*c83a76b0SSuyog Pawar /* Enums */
81*c83a76b0SSuyog Pawar /*****************************************************************************/
82*c83a76b0SSuyog Pawar
83*c83a76b0SSuyog Pawar /**
84*c83a76b0SSuyog Pawar *******************************************************************************
85*c83a76b0SSuyog Pawar @brief Enums for controlling the operating mode of cabac engine
86*c83a76b0SSuyog Pawar *******************************************************************************
87*c83a76b0SSuyog Pawar */
88*c83a76b0SSuyog Pawar typedef enum
89*c83a76b0SSuyog Pawar {
90*c83a76b0SSuyog Pawar /** in this mode, bits are encoded in the bit stream buffer */
91*c83a76b0SSuyog Pawar CABAC_MODE_ENCODE_BITS = 0,
92*c83a76b0SSuyog Pawar
93*c83a76b0SSuyog Pawar /** in this mode, only num bits gen are computed but not put in the stream */
94*c83a76b0SSuyog Pawar CABAC_MODE_COMPUTE_BITS = 1
95*c83a76b0SSuyog Pawar
96*c83a76b0SSuyog Pawar } CABAC_OP_MODE;
97*c83a76b0SSuyog Pawar
98*c83a76b0SSuyog Pawar /*****************************************************************************/
99*c83a76b0SSuyog Pawar /* Structures */
100*c83a76b0SSuyog Pawar /*****************************************************************************/
101*c83a76b0SSuyog Pawar
102*c83a76b0SSuyog Pawar /**
103*c83a76b0SSuyog Pawar ******************************************************************************
104*c83a76b0SSuyog Pawar * @brief Cabac context for encoder
105*c83a76b0SSuyog Pawar ******************************************************************************
106*c83a76b0SSuyog Pawar */
107*c83a76b0SSuyog Pawar typedef struct cab_ctxt
108*c83a76b0SSuyog Pawar {
109*c83a76b0SSuyog Pawar /**
110*c83a76b0SSuyog Pawar * indicates if cabac encode works in put bits mode or bit compute mode
111*c83a76b0SSuyog Pawar * In puts bits mode, bitstream and cabac engine fields L,R etc are used
112*c83a76b0SSuyog Pawar * In bit compute mode, bitstream and cabac engine fields are not used
113*c83a76b0SSuyog Pawar */
114*c83a76b0SSuyog Pawar CABAC_OP_MODE e_cabac_op_mode;
115*c83a76b0SSuyog Pawar
116*c83a76b0SSuyog Pawar /**
117*c83a76b0SSuyog Pawar * total bits estimated (for a cu) when mode is CABAC_MODE_COMPUTE_BITS
118*c83a76b0SSuyog Pawar * This is in q12 format to account for the fractional bits as well
119*c83a76b0SSuyog Pawar */
120*c83a76b0SSuyog Pawar UWORD32 u4_bits_estimated_q12;
121*c83a76b0SSuyog Pawar
122*c83a76b0SSuyog Pawar /**
123*c83a76b0SSuyog Pawar * total texture bits estimated (for a cu) when mode is CABAC_MODE_COMPUTE_BITS
124*c83a76b0SSuyog Pawar * This is in q12 format to account for the fractional bits as well
125*c83a76b0SSuyog Pawar */
126*c83a76b0SSuyog Pawar UWORD32 u4_texture_bits_estimated_q12;
127*c83a76b0SSuyog Pawar
128*c83a76b0SSuyog Pawar /**
129*c83a76b0SSuyog Pawar * total header bits estimated (for a cu) when mode is CABAC_MODE_COMPUTE_BITS
130*c83a76b0SSuyog Pawar * This is in q12 format to account for the fractional bits as well
131*c83a76b0SSuyog Pawar */
132*c83a76b0SSuyog Pawar UWORD32 u4_header_bits_estimated_q12;
133*c83a76b0SSuyog Pawar
134*c83a76b0SSuyog Pawar UWORD32 u4_cbf_bits_q12;
135*c83a76b0SSuyog Pawar
136*c83a76b0SSuyog Pawar UWORD32 u4_true_tu_split_flag_q12;
137*c83a76b0SSuyog Pawar /*********************************************************************/
138*c83a76b0SSuyog Pawar /* CABAC ENGINE related fields; not used in CABAC_MODE_COMPUTE_BITS */
139*c83a76b0SSuyog Pawar /*********************************************************************/
140*c83a76b0SSuyog Pawar /** cabac interval range R */
141*c83a76b0SSuyog Pawar UWORD32 u4_range;
142*c83a76b0SSuyog Pawar
143*c83a76b0SSuyog Pawar /** cabac interval start L */
144*c83a76b0SSuyog Pawar UWORD32 u4_low;
145*c83a76b0SSuyog Pawar
146*c83a76b0SSuyog Pawar /** bits generated during renormalization
147*c83a76b0SSuyog Pawar * A byte is put to stream/u4_out_standing_bytes from u4_low(L) when
148*c83a76b0SSuyog Pawar * u4_bits_gen exceeds 8
149*c83a76b0SSuyog Pawar */
150*c83a76b0SSuyog Pawar UWORD32 u4_bits_gen;
151*c83a76b0SSuyog Pawar
152*c83a76b0SSuyog Pawar /** bytes_outsanding; number of 0xFF bits that occur during renorm
153*c83a76b0SSuyog Pawar * These will be accumulated till the carry bit is knwon
154*c83a76b0SSuyog Pawar */
155*c83a76b0SSuyog Pawar UWORD32 u4_out_standing_bytes;
156*c83a76b0SSuyog Pawar
157*c83a76b0SSuyog Pawar /*************************************************************************/
158*c83a76b0SSuyog Pawar /* OUTPUT Bitstream related fields; not used in CABAC_MODE_COMPUTE_BITS */
159*c83a76b0SSuyog Pawar /*************************************************************************/
160*c83a76b0SSuyog Pawar /** points to start of stream buffer. */
161*c83a76b0SSuyog Pawar UWORD8 *pu1_strm_buffer;
162*c83a76b0SSuyog Pawar
163*c83a76b0SSuyog Pawar /**
164*c83a76b0SSuyog Pawar * max bitstream size (in bytes).
165*c83a76b0SSuyog Pawar * Encoded stream shall not exceed this size.
166*c83a76b0SSuyog Pawar */
167*c83a76b0SSuyog Pawar UWORD32 u4_max_strm_size;
168*c83a76b0SSuyog Pawar
169*c83a76b0SSuyog Pawar /**
170*c83a76b0SSuyog Pawar `* byte offset (w.r.t pu1_strm_buffer) where next byte would be written
171*c83a76b0SSuyog Pawar * Bitstream engine makes sure it would not corrupt data beyond
172*c83a76b0SSuyog Pawar * u4_max_strm_size bytes
173*c83a76b0SSuyog Pawar */
174*c83a76b0SSuyog Pawar UWORD32 u4_strm_buf_offset;
175*c83a76b0SSuyog Pawar
176*c83a76b0SSuyog Pawar /**
177*c83a76b0SSuyog Pawar * signifies the number of consecutive zero bytes propogated from previous
178*c83a76b0SSuyog Pawar * word. It is used for emulation prevention byte insertion in the stream
179*c83a76b0SSuyog Pawar */
180*c83a76b0SSuyog Pawar WORD32 i4_zero_bytes_run;
181*c83a76b0SSuyog Pawar
182*c83a76b0SSuyog Pawar /*********************************************************************/
183*c83a76b0SSuyog Pawar /* CABAC context models */
184*c83a76b0SSuyog Pawar /*********************************************************************/
185*c83a76b0SSuyog Pawar /** All Context models stored in packed form pState[bits6-1] | MPS[bit0] */
186*c83a76b0SSuyog Pawar UWORD8 au1_ctxt_models[IHEVC_CAB_CTXT_END];
187*c83a76b0SSuyog Pawar
188*c83a76b0SSuyog Pawar /**
189*c83a76b0SSuyog Pawar *Cabac context for start of every row which is same as top right ctxt
190*c83a76b0SSuyog Pawar */
191*c83a76b0SSuyog Pawar UWORD8 au1_ctxt_models_top_right[IHEVC_CAB_CTXT_END];
192*c83a76b0SSuyog Pawar
193*c83a76b0SSuyog Pawar /**
194*c83a76b0SSuyog Pawar * copy of enable entropy coding sync flag in pps
195*c83a76b0SSuyog Pawar */
196*c83a76b0SSuyog Pawar WORD8 i1_entropy_coding_sync_enabled_flag;
197*c83a76b0SSuyog Pawar
198*c83a76b0SSuyog Pawar /**
199*c83a76b0SSuyog Pawar * store the bitstream offset from which first slice data is generated by cabac
200*c83a76b0SSuyog Pawar */
201*c83a76b0SSuyog Pawar UWORD32 u4_first_slice_start_offset;
202*c83a76b0SSuyog Pawar
203*c83a76b0SSuyog Pawar } cab_ctxt_t;
204*c83a76b0SSuyog Pawar
205*c83a76b0SSuyog Pawar /*****************************************************************************/
206*c83a76b0SSuyog Pawar /* Globals */
207*c83a76b0SSuyog Pawar /*****************************************************************************/
208*c83a76b0SSuyog Pawar extern UWORD16 gau2_ihevce_cabac_bin_to_bits[64 * 2];
209*c83a76b0SSuyog Pawar
210*c83a76b0SSuyog Pawar /*****************************************************************************/
211*c83a76b0SSuyog Pawar /* Extern Function Declarations */
212*c83a76b0SSuyog Pawar /*****************************************************************************/
213*c83a76b0SSuyog Pawar WORD32
214*c83a76b0SSuyog Pawar ihevce_cabac_reset(cab_ctxt_t *ps_cabac, bitstrm_t *ps_bitstrm, CABAC_OP_MODE e_cabac_op_mode);
215*c83a76b0SSuyog Pawar
216*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_init(
217*c83a76b0SSuyog Pawar cab_ctxt_t *ps_cabac,
218*c83a76b0SSuyog Pawar bitstrm_t *ps_bitstrm,
219*c83a76b0SSuyog Pawar WORD32 slice_qp,
220*c83a76b0SSuyog Pawar WORD32 cabac_init_idc,
221*c83a76b0SSuyog Pawar CABAC_OP_MODE e_cabac_op_mode);
222*c83a76b0SSuyog Pawar
223*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_put_byte(cab_ctxt_t *ps_cabac);
224*c83a76b0SSuyog Pawar
225*c83a76b0SSuyog Pawar /**
226*c83a76b0SSuyog Pawar ******************************************************************************
227*c83a76b0SSuyog Pawar *
228*c83a76b0SSuyog Pawar * @brief Codes a bin based on probablilty and mps packed context model
229*c83a76b0SSuyog Pawar *
230*c83a76b0SSuyog Pawar * @par Description
231*c83a76b0SSuyog Pawar * 1. Apart from encoding bin, context model is updated as per state transition
232*c83a76b0SSuyog Pawar * 2. Range and Low renormalization is done based on bin and original state
233*c83a76b0SSuyog Pawar * 3. After renorm bistream is updated (if required)
234*c83a76b0SSuyog Pawar *
235*c83a76b0SSuyog Pawar * @param[inout] ps_cabac
236*c83a76b0SSuyog Pawar * pointer to cabac context (handle)
237*c83a76b0SSuyog Pawar *
238*c83a76b0SSuyog Pawar * @param[in] bin
239*c83a76b0SSuyog Pawar * bin(boolean) to be encoded
240*c83a76b0SSuyog Pawar *
241*c83a76b0SSuyog Pawar * @param[in] ctxt_index
242*c83a76b0SSuyog Pawar * index of cabac context model containing pState[bits6-1] | MPS[bit0]
243*c83a76b0SSuyog Pawar *
244*c83a76b0SSuyog Pawar * @return success or failure error code
245*c83a76b0SSuyog Pawar *
246*c83a76b0SSuyog Pawar ******************************************************************************
247*c83a76b0SSuyog Pawar */
ihevce_cabac_encode_bin(cab_ctxt_t * ps_cabac,WORD32 bin,WORD32 ctxt_index)248*c83a76b0SSuyog Pawar static INLINE WORD32 ihevce_cabac_encode_bin(cab_ctxt_t *ps_cabac, WORD32 bin, WORD32 ctxt_index)
249*c83a76b0SSuyog Pawar {
250*c83a76b0SSuyog Pawar UWORD32 u4_range = ps_cabac->u4_range;
251*c83a76b0SSuyog Pawar UWORD32 u4_low = ps_cabac->u4_low;
252*c83a76b0SSuyog Pawar UWORD32 u4_rlps;
253*c83a76b0SSuyog Pawar UWORD8 *pu1_ctxt_model = &ps_cabac->au1_ctxt_models[ctxt_index];
254*c83a76b0SSuyog Pawar WORD32 state_mps = *pu1_ctxt_model;
255*c83a76b0SSuyog Pawar WORD32 shift;
256*c83a76b0SSuyog Pawar
257*c83a76b0SSuyog Pawar /* Sanity checks */
258*c83a76b0SSuyog Pawar ASSERT((bin == 0) || (bin == 1));
259*c83a76b0SSuyog Pawar ASSERT((ctxt_index >= 0) && (ctxt_index < IHEVC_CAB_CTXT_END));
260*c83a76b0SSuyog Pawar ASSERT(state_mps < 128);
261*c83a76b0SSuyog Pawar
262*c83a76b0SSuyog Pawar if(CABAC_MODE_ENCODE_BITS == ps_cabac->e_cabac_op_mode)
263*c83a76b0SSuyog Pawar {
264*c83a76b0SSuyog Pawar ASSERT((u4_range >= 256) && (u4_range < 512));
265*c83a76b0SSuyog Pawar
266*c83a76b0SSuyog Pawar /* Get the lps range from LUT based on quantized range and state */
267*c83a76b0SSuyog Pawar u4_rlps = gau1_ihevc_cabac_rlps[state_mps >> 1][(u4_range >> 6) & 0x3];
268*c83a76b0SSuyog Pawar
269*c83a76b0SSuyog Pawar u4_range -= u4_rlps;
270*c83a76b0SSuyog Pawar
271*c83a76b0SSuyog Pawar /* check if bin is mps or lps */
272*c83a76b0SSuyog Pawar if((state_mps & 0x1) ^ bin)
273*c83a76b0SSuyog Pawar {
274*c83a76b0SSuyog Pawar /* lps path; L= L + R; R = RLPS */
275*c83a76b0SSuyog Pawar u4_low += u4_range;
276*c83a76b0SSuyog Pawar u4_range = u4_rlps;
277*c83a76b0SSuyog Pawar }
278*c83a76b0SSuyog Pawar
279*c83a76b0SSuyog Pawar /*Compute bit always to populate the trace*/
280*c83a76b0SSuyog Pawar /* increment bits generated based on state and bin encoded */
281*c83a76b0SSuyog Pawar ps_cabac->u4_bits_estimated_q12 += gau2_ihevce_cabac_bin_to_bits[state_mps ^ bin];
282*c83a76b0SSuyog Pawar
283*c83a76b0SSuyog Pawar /* update the context model from state transition LUT */
284*c83a76b0SSuyog Pawar *pu1_ctxt_model = gau1_ihevc_next_state[(state_mps << 1) | bin];
285*c83a76b0SSuyog Pawar
286*c83a76b0SSuyog Pawar /*****************************************************************/
287*c83a76b0SSuyog Pawar /* Renormalization; calculate bits generated based on range(R) */
288*c83a76b0SSuyog Pawar /* Note : 6 <= R < 512; R is 2 only for terminating encode */
289*c83a76b0SSuyog Pawar /*****************************************************************/
290*c83a76b0SSuyog Pawar GETRANGE(shift, u4_range);
291*c83a76b0SSuyog Pawar shift = 9 - shift;
292*c83a76b0SSuyog Pawar u4_low <<= shift;
293*c83a76b0SSuyog Pawar u4_range <<= shift;
294*c83a76b0SSuyog Pawar
295*c83a76b0SSuyog Pawar /* bits to be inserted in the bitstream */
296*c83a76b0SSuyog Pawar ps_cabac->u4_bits_gen += shift;
297*c83a76b0SSuyog Pawar ps_cabac->u4_range = u4_range;
298*c83a76b0SSuyog Pawar ps_cabac->u4_low = u4_low;
299*c83a76b0SSuyog Pawar
300*c83a76b0SSuyog Pawar /* generate stream when a byte is ready */
301*c83a76b0SSuyog Pawar if(ps_cabac->u4_bits_gen > CABAC_BITS)
302*c83a76b0SSuyog Pawar {
303*c83a76b0SSuyog Pawar return (ihevce_cabac_put_byte(ps_cabac));
304*c83a76b0SSuyog Pawar }
305*c83a76b0SSuyog Pawar }
306*c83a76b0SSuyog Pawar else /* (CABAC_MODE_COMPUTE_BITS == e_cabac_op_mode) */
307*c83a76b0SSuyog Pawar {
308*c83a76b0SSuyog Pawar /* increment bits generated based on state and bin encoded */
309*c83a76b0SSuyog Pawar ps_cabac->u4_bits_estimated_q12 += gau2_ihevce_cabac_bin_to_bits[state_mps ^ bin];
310*c83a76b0SSuyog Pawar
311*c83a76b0SSuyog Pawar /* update the context model from state transition LUT */
312*c83a76b0SSuyog Pawar *pu1_ctxt_model = gau1_ihevc_next_state[(state_mps << 1) | bin];
313*c83a76b0SSuyog Pawar }
314*c83a76b0SSuyog Pawar
315*c83a76b0SSuyog Pawar return (IHEVCE_SUCCESS);
316*c83a76b0SSuyog Pawar }
317*c83a76b0SSuyog Pawar
318*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_encode_bypass_bin(cab_ctxt_t *ps_cabac, WORD32 bin);
319*c83a76b0SSuyog Pawar
320*c83a76b0SSuyog Pawar WORD32
321*c83a76b0SSuyog Pawar ihevce_cabac_encode_terminate(cab_ctxt_t *ps_cabac, WORD32 term_bin, WORD32 i4_end_of_sub_strm);
322*c83a76b0SSuyog Pawar
323*c83a76b0SSuyog Pawar /**
324*c83a76b0SSuyog Pawar ******************************************************************************
325*c83a76b0SSuyog Pawar *
326*c83a76b0SSuyog Pawar * @brief Encodes a series of bypass bins (FLC bypass bins)
327*c83a76b0SSuyog Pawar *
328*c83a76b0SSuyog Pawar * @par Description
329*c83a76b0SSuyog Pawar * This function is more optimal than calling ihevce_cabac_encode_bypass_bin()
330*c83a76b0SSuyog Pawar * in a loop as cabac low, renorm and generating the stream (8bins at a time)
331*c83a76b0SSuyog Pawar * can be done in one operation
332*c83a76b0SSuyog Pawar *
333*c83a76b0SSuyog Pawar * @param[inout]ps_cabac
334*c83a76b0SSuyog Pawar * pointer to cabac context (handle)
335*c83a76b0SSuyog Pawar *
336*c83a76b0SSuyog Pawar * @param[in] u4_sym
337*c83a76b0SSuyog Pawar * syntax element to be coded (as FLC bins)
338*c83a76b0SSuyog Pawar *
339*c83a76b0SSuyog Pawar * @param[in] num_bins
340*c83a76b0SSuyog Pawar * This is the FLC length for u4_sym
341*c83a76b0SSuyog Pawar *
342*c83a76b0SSuyog Pawar *
343*c83a76b0SSuyog Pawar * @return success or failure error code
344*c83a76b0SSuyog Pawar *
345*c83a76b0SSuyog Pawar ******************************************************************************
346*c83a76b0SSuyog Pawar */
347*c83a76b0SSuyog Pawar static INLINE WORD32
ihevce_cabac_encode_bypass_bins(cab_ctxt_t * ps_cabac,UWORD32 u4_bins,WORD32 num_bins)348*c83a76b0SSuyog Pawar ihevce_cabac_encode_bypass_bins(cab_ctxt_t *ps_cabac, UWORD32 u4_bins, WORD32 num_bins)
349*c83a76b0SSuyog Pawar {
350*c83a76b0SSuyog Pawar UWORD32 u4_range = ps_cabac->u4_range;
351*c83a76b0SSuyog Pawar WORD32 next_byte;
352*c83a76b0SSuyog Pawar WORD32 error = IHEVCE_SUCCESS;
353*c83a76b0SSuyog Pawar
354*c83a76b0SSuyog Pawar if(CABAC_MODE_ENCODE_BITS == ps_cabac->e_cabac_op_mode)
355*c83a76b0SSuyog Pawar {
356*c83a76b0SSuyog Pawar /* Sanity checks */
357*c83a76b0SSuyog Pawar ASSERT((num_bins < 33) && (num_bins > 0));
358*c83a76b0SSuyog Pawar ASSERT((u4_range >= 256) && (u4_range < 512));
359*c83a76b0SSuyog Pawar
360*c83a76b0SSuyog Pawar /*Compute bit always to populate the trace*/
361*c83a76b0SSuyog Pawar /* increment bits generated by num_bins */
362*c83a76b0SSuyog Pawar ps_cabac->u4_bits_estimated_q12 += (num_bins << CABAC_FRAC_BITS_Q);
363*c83a76b0SSuyog Pawar
364*c83a76b0SSuyog Pawar /* Encode 8bins at a time and put in the bit-stream */
365*c83a76b0SSuyog Pawar while(num_bins > 8)
366*c83a76b0SSuyog Pawar {
367*c83a76b0SSuyog Pawar num_bins -= 8;
368*c83a76b0SSuyog Pawar
369*c83a76b0SSuyog Pawar /* extract the leading 8 bins */
370*c83a76b0SSuyog Pawar next_byte = (u4_bins >> num_bins) & 0xff;
371*c83a76b0SSuyog Pawar
372*c83a76b0SSuyog Pawar /* L = (L << 8) + (R * next_byte) */
373*c83a76b0SSuyog Pawar ps_cabac->u4_low <<= 8;
374*c83a76b0SSuyog Pawar ps_cabac->u4_low += (next_byte * u4_range);
375*c83a76b0SSuyog Pawar ps_cabac->u4_bits_gen += 8;
376*c83a76b0SSuyog Pawar
377*c83a76b0SSuyog Pawar if(ps_cabac->u4_bits_gen > CABAC_BITS)
378*c83a76b0SSuyog Pawar {
379*c83a76b0SSuyog Pawar /* insert the leading byte of low into stream */
380*c83a76b0SSuyog Pawar error |= ihevce_cabac_put_byte(ps_cabac);
381*c83a76b0SSuyog Pawar }
382*c83a76b0SSuyog Pawar }
383*c83a76b0SSuyog Pawar
384*c83a76b0SSuyog Pawar /* Update low with remaining bins and return */
385*c83a76b0SSuyog Pawar next_byte = (u4_bins & ((1 << num_bins) - 1));
386*c83a76b0SSuyog Pawar
387*c83a76b0SSuyog Pawar ps_cabac->u4_low <<= num_bins;
388*c83a76b0SSuyog Pawar ps_cabac->u4_low += (next_byte * u4_range);
389*c83a76b0SSuyog Pawar ps_cabac->u4_bits_gen += num_bins;
390*c83a76b0SSuyog Pawar
391*c83a76b0SSuyog Pawar if(ps_cabac->u4_bits_gen > CABAC_BITS)
392*c83a76b0SSuyog Pawar {
393*c83a76b0SSuyog Pawar /* insert the leading byte of low into stream */
394*c83a76b0SSuyog Pawar error |= ihevce_cabac_put_byte(ps_cabac);
395*c83a76b0SSuyog Pawar }
396*c83a76b0SSuyog Pawar }
397*c83a76b0SSuyog Pawar else
398*c83a76b0SSuyog Pawar {
399*c83a76b0SSuyog Pawar /* increment bits generated by num_bins */
400*c83a76b0SSuyog Pawar ps_cabac->u4_bits_estimated_q12 += (num_bins << CABAC_FRAC_BITS_Q);
401*c83a76b0SSuyog Pawar }
402*c83a76b0SSuyog Pawar
403*c83a76b0SSuyog Pawar return (error);
404*c83a76b0SSuyog Pawar }
405*c83a76b0SSuyog Pawar
406*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_encode_tunary(
407*c83a76b0SSuyog Pawar cab_ctxt_t *ps_cabac,
408*c83a76b0SSuyog Pawar WORD32 sym,
409*c83a76b0SSuyog Pawar WORD32 c_max,
410*c83a76b0SSuyog Pawar WORD32 ctxt_index,
411*c83a76b0SSuyog Pawar WORD32 ctxt_shift,
412*c83a76b0SSuyog Pawar WORD32 ctxt_inc_max);
413*c83a76b0SSuyog Pawar
414*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_encode_tunary_bypass(cab_ctxt_t *ps_cabac, WORD32 sym, WORD32 c_max);
415*c83a76b0SSuyog Pawar
416*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_encode_egk(cab_ctxt_t *ps_cabac, UWORD32 u4_sym, WORD32 k);
417*c83a76b0SSuyog Pawar
418*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_encode_trunc_rice(
419*c83a76b0SSuyog Pawar cab_ctxt_t *ps_cabac, UWORD32 u4_sym, WORD32 c_rice_param, WORD32 c_rice_max);
420*c83a76b0SSuyog Pawar
421*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_flush(cab_ctxt_t *ps_cabac, WORD32 i4_end_of_sub_strm);
422*c83a76b0SSuyog Pawar
423*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_ctxt_backup(cab_ctxt_t *ps_cabac);
424*c83a76b0SSuyog Pawar
425*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_ctxt_row_init(cab_ctxt_t *ps_cabac);
426*c83a76b0SSuyog Pawar
427*c83a76b0SSuyog Pawar #endif /* _IHEVCE_CABAC_H_ */
428