1 /******************************************************************************
2  *
3  * Copyright (C) 2015 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 
21 /**
22  *******************************************************************************
23  * @file
24  *  ih264e_cabac_structs.h
25  *
26  * @brief
27  *  This file contains cabac related macros, enums, tables and function declarations.
28  *
29  * @author
30  *  Doney Alex
31  *
32  * @remarks
33  *  none
34  *
35  *******************************************************************************
36  */
37 
38 #ifndef IH264E_CABAC_H_
39 #define IH264E_CABAC_H_
40 
41 
42 
43 /*******************************************************************************
44 @brief Bit precision of cabac engine;
45 *******************************************************************************
46 */
47 #define CABAC_BITS  9
48 
49 
50 /**
51 ******************************************************************************
52  *  @macro Reverse bits in an unsigned integer
53 ******************************************************************************
54 */
55 #define REV(u4_input, u4_output)                 \
56 {                                                \
57     UWORD32 u4_temp = (u4_input);                \
58     WORD8 i;                                     \
59     u4_output = 0;                               \
60     for (i = 0; i < 32; i++)                     \
61     {                                            \
62         u4_output = (u4_output << 1) +           \
63                         ((u4_temp >> i) & 0x01); \
64     }                                            \
65 }
66 
67 /**
68 ******************************************************************************
69 *! Bit manipulation macros
70 ******************************************************************************
71 */
72 #define SETBIT(a, i)   ((a) |= (1 << (i)))
73 #define CLEARBIT(a, i) ((a) &= ~(1 << (i)))
74 
75 
76 /**
77 ******************************************************************************
78 *! Cabac module expect atlesat MIN_STREAM_SIZE_MB bytes left in stream buffer
79 *! for encoding an MB
80 ******************************************************************************
81 */
82 #define MIN_STREAM_SIZE_MB   1024
83 
84 
85 
86 /*****************************************************************************/
87 /* Function Declarations                                                 */
88 /*****************************************************************************/
89 
90 
91 /**
92  *******************************************************************************
93  *
94  * @brief
95  * Initialize default context values and pointers.
96  *
97  * @param[in] ps_ent_ctxt
98  *  Pointer to entropy context structure
99  *
100  * @returns
101  *
102  * @remarks
103  *  None
104  *
105  *******************************************************************************
106  */
107 void ih264e_init_cabac_table(entropy_ctxt_t *ps_ent_ctxt);
108 
109 
110 /**
111  *******************************************************************************
112  *
113  * @brief
114  * Initialize cabac context: Intitalize all contest with init values given in the spec.
115  * Called at the beginning of entropy coding of each slice for CABAC encoding.
116  *
117  * @param[in] ps_ent_ctxt
118  *  Pointer to entropy context structure
119  *
120  * @returns
121  *
122  * @remarks
123  *  None
124  *
125  *******************************************************************************
126  */
127 void ih264e_init_cabac_ctxt(entropy_ctxt_t *ps_ent_ctxt);
128 
129 
130 
131 /**
132  *******************************************************************************
133  *
134  * @brief
135  *  k-th order Exp-Golomb (UEGk) binarization process: Implements concatenated
136  *   unary/ k-th order Exp-Golomb  (UEGk) binarization process,
137  *   where k = 0 as defined in 9.3.2.3 of  ITU_T_H264-201402
138  *
139  * @param[in] i2_sufs
140  *  Suffix bit string
141  *
142  * @param[in] pi1_bins_len
143  *  Pointer to length of the string
144  *
145  * @returns Binarized value
146  *
147  * @remarks
148  *  None
149  *
150  *******************************************************************************
151  */
152 UWORD32 ih264e_cabac_UEGk0_binarization(WORD16 i2_sufs, WORD8 *pi1_bins_len);
153 
154 
155 /**
156  *******************************************************************************
157  *
158  * @brief
159  *  Get cabac context for the MB :calculates the pointers to Top and   left
160  *          cabac neighbor context depending upon neighbor  availability.
161  *
162  * @param[in] ps_ent_ctxt
163  *  Pointer to entropy context structure
164  *
165  * @param[in] u4_mb_type
166  *  Type of MB
167  *
168  * @returns
169  *
170  * @remarks
171  *  None
172  *
173  *******************************************************************************
174  */
175 void ih264e_get_cabac_context(entropy_ctxt_t *ps_ent_ctxt, WORD32 u4_mb_type);
176 
177 
178 /**
179  *******************************************************************************
180  * @brief
181  *  flushing at termination: Explained in flowchart 9-12(ITU_T_H264-201402).
182  *
183  *  @param[in]   ps_cabac_ctxt
184  *  pointer to cabac context (handle)
185  *
186  * @returns  none
187  *
188  * @remarks
189  *  None
190  *
191  *******************************************************************************
192  */
193 void ih264e_cabac_flush(cabac_ctxt_t *ps_cabac_ctxt);
194 
195 
196 /**
197  ******************************************************************************
198  *
199  *  @brief Puts new byte (and outstanding bytes) into bitstream after cabac
200  *         renormalization
201  *
202  *  @par   Description
203  *  1. Extract the leading byte of low(L)
204  *  2. If leading byte=0xff increment outstanding bytes and return
205  *     (as the actual bits depend on carry propogation later)
206  *  3. If leading byte is not 0xff check for any carry propogation
207  *  4. Insert the carry (propogated in previous byte) along with outstanding
208  *     bytes (if any) and leading byte
209  *
210  *
211  *  @param[inout]   ps_cabac_ctxt
212  *  pointer to cabac context (handle)
213  *
214  *  @return
215  *
216  ******************************************************************************
217  */
218 void ih264e_cabac_put_byte(cabac_ctxt_t *ps_cabac_ctxt);
219 
220 
221 /**
222  ******************************************************************************
223  *
224  *  @brief Codes a bin based on probablilty and mps packed context model
225  *
226  *  @par   Description
227  *  1. Apart from encoding bin, context model is updated as per state transition
228  *  2. Range and Low renormalization is done based on bin and original state
229  *  3. After renorm bistream is updated (if required)
230  *
231  *  @param[inout]   ps_cabac
232  *  pointer to cabac context (handle)
233  *
234  *  @param[in]   bin
235  *  bin(boolean) to be encoded
236  *
237  *  @param[in]  pu1_bin_ctxts
238  *  index of cabac context model containing pState[bits 5-0] | MPS[bit6]
239  *
240  *  @return
241  *
242  ******************************************************************************
243  */
244 void ih264e_cabac_encode_bin(cabac_ctxt_t *ps_cabac, WORD32 bin,
245                              bin_ctxt_model *pu1_bin_ctxts);
246 
247 
248 
249 /**
250  *******************************************************************************
251  *
252  * @brief
253  *  Encoding process for a binary decision :implements encoding process of a decision
254  *  as defined in 9.3.4.2 . This function encodes multiple bins, of a symbol. Implements
255  *  flowchart Figure 9-7( ITU_T_H264-201402)
256  *
257  * @param[in] u4_bins
258  * array of bin values
259  *
260  * @param[in] i1_bins_len
261  *  Length of bins, maximum 32
262  *
263  * @param[in] u4_ctx_inc
264  *  CtxInc, byte0- bin0, byte1-bin1 ..
265  *
266  * @param[in] i1_valid_len
267  *  valid length of bins, after that CtxInc is constant
268  *
269  * @param[in] pu1_bin_ctxt_type
270  *  Pointer to binary contexts
271 
272  * @param[in] ps_cabac
273  *  Pointer to cabac_context_structure
274  *
275  * @returns
276  *
277  * @remarks
278  *  None
279  *
280  *******************************************************************************
281  */
282 void ih264e_encode_decision_bins(UWORD32 u4_bins, WORD8 i1_bins_len,
283                                  UWORD32 u4_ctx_inc, WORD8 i1_valid_len,
284                                  bin_ctxt_model *pu1_bin_ctxt_type,
285                                  cabac_ctxt_t *ps_cabac);
286 
287 /**
288  *******************************************************************************
289  * @brief
290  *  Encoding process for a binary decision before termination:Encoding process
291  *  of a termination(9.3.4.5 :ITU_T_H264-201402) . Explained in flowchart 9-11.
292  *
293  * @param[in] ps_cabac
294  *  Pointer to cabac structure
295  *
296  * @param[in] term_bin
297  *  Symbol value, end of slice or not, term_bin is binary
298  *
299  * @returns
300  *
301  * @remarks
302  *  None
303  *
304  *******************************************************************************
305  */
306 void ih264e_cabac_encode_terminate(cabac_ctxt_t *ps_cabac, WORD32 term_bin);
307 
308 
309 /**
310  *******************************************************************************
311  * @brief
312  * Bypass encoding process for binary decisions:  Explained (9.3.4.4 :ITU_T_H264-201402)
313  * , flowchart 9-10.
314  *
315  *  @param[in]  ps_cabac : pointer to cabac context (handle)
316  *
317  *  @param[in]   bin :  bypass bin(0/1) to be encoded
318  *
319  *  @returns
320  *
321  *  @remarks
322  *  None
323  *
324  *******************************************************************************
325  */
326 
327 void ih264e_cabac_encode_bypass_bin(cabac_ctxt_t *ps_cabac, WORD32 bin);
328 
329 
330 
331 /**
332  ******************************************************************************
333  *
334  *  @brief Encodes a series of bypass bins (FLC bypass bins)
335  *
336  *  @par   Description
337  *  This function is more optimal than calling ih264e_cabac_encode_bypass_bin()
338  *  in a loop as cabac low, renorm and generating the stream (8bins at a time)
339  *  can be done in one operation
340  *
341  *  @param[inout]ps_cabac
342  *   pointer to cabac context (handle)
343  *
344  *  @param[in]   u4_bins
345  *   syntax element to be coded (as FLC bins)
346  *
347  *  @param[in]   num_bins
348  *   This is the FLC length for u4_sym
349  *
350  *  @return
351  *
352  ******************************************************************************
353  */
354 
355 void ih264e_cabac_encode_bypass_bins(cabac_ctxt_t *ps_cabac, UWORD32 u4_bins,
356                                      WORD32 num_bins);
357 
358 
359 
360 
361 
362 /**
363  *******************************************************************************
364  *
365  * @brief
366  *  This function generates CABAC coded bit stream for an Intra Slice.
367  *
368  * @description
369  *  The mb syntax layer for intra slices constitutes luma mb mode, luma sub modes
370  *  (if present), mb qp delta, coded block pattern, chroma mb mode and
371  *  luma/chroma residue. These syntax elements are written as directed by table
372  *  7.3.5 of h264 specification.
373  *
374  * @param[in] ps_ent_ctxt
375  *  pointer to entropy context
376  *
377  * @returns error code
378  *
379  * @remarks none
380  *
381  *******************************************************************************
382  */
383 IH264E_ERROR_T ih264e_write_islice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt);
384 
385 
386 /**
387  *******************************************************************************
388  *
389  * @brief
390  *  This function generates CABAC coded bit stream for Inter slices
391  *
392  * @description
393  *  The mb syntax layer for inter slices constitutes luma mb mode, luma sub modes
394  *  (if present), mb qp delta, coded block pattern, chroma mb mode and
395  *  luma/chroma residue. These syntax elements are written as directed by table
396  *  7.3.5 of h264 specification
397  *
398  * @param[in] ps_ent_ctxt
399  *  pointer to entropy context
400  *
401  * @returns error code
402  *
403  * @remarks none
404  *
405  *******************************************************************************
406  */
407 IH264E_ERROR_T ih264e_write_pslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt);
408 
409 
410 /**
411  *******************************************************************************
412  *
413  * @brief
414  *  This function generates CABAC coded bit stream for B slices
415  *
416  * @description
417  *  The mb syntax layer for inter slices constitutes luma mb mode,
418  *  mb qp delta, coded block pattern, chroma mb mode and
419  *  luma/chroma residue. These syntax elements are written as directed by table
420  *  7.3.5 of h264 specification
421  *
422  * @param[in] ps_ent_ctxt
423  *  pointer to entropy context
424  *
425  * @returns error code
426  *
427  * @remarks none
428  *
429  *******************************************************************************
430  */
431 IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt);
432 
433 
434 #endif /* IH264E_CABAC_H_ */
435