blob: e4722fac83fa385a7a6b77727cacff8489e13843 [file] [log] [blame]
Harinarayanan K K134291e2015-06-18 16:03:38 +05301/******************************************************************************
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
Harinarayanan K K134291e2015-06-18 16:03:38 +053050/**
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 */
107void 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 */
127void 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 */
152UWORD32 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 */
175void 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 *
Doney Alex9c6a2f72015-06-30 17:56:42 +0530186 * @returns none
Harinarayanan K K134291e2015-06-18 16:03:38 +0530187 *
188 * @remarks
189 * None
190 *
191 *******************************************************************************
192 */
Doney Alex9c6a2f72015-06-30 17:56:42 +0530193void ih264e_cabac_flush(cabac_ctxt_t *ps_cabac_ctxt);
Harinarayanan K K134291e2015-06-18 16:03:38 +0530194
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 */
218void 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 */
244void 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 */
282void 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 */
306void 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
327void 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
355void 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 */
383IH264E_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 */
407IH264E_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 */
431IH264E_ERROR_T ih264e_write_bslice_mb_cabac(entropy_ctxt_t *ps_ent_ctxt);
432
433
434#endif /* IH264E_CABAC_H_ */