blob: 38028aec9e63be9ea2645b5445f34fb4701c57fb [file] [log] [blame]
Hamsalekha S8d3d3032015-03-13 21:24:58 +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 * \file ih264d_cabac.c
23 *
24 * \brief
25 * This file contains Binary decoding routines.
26 *
27 * \date
28 * 04/02/2003
29 *
30 * \author NS
31 ***************************************************************************
32 */
33#include <string.h>
34#include "ih264_typedefs.h"
35#include "ih264_macros.h"
36#include "ih264_platform_macros.h"
37#include "ih264d_structs.h"
38#include "ih264d_cabac.h"
39#include "ih264d_bitstrm.h"
40#include "ih264d_error_handler.h"
41#include "ih264d_defs.h"
42#include "ih264d_debug.h"
43#include "ih264d_tables.h"
44#include "ih264d_parse_cabac.h"
45#include "ih264d_tables.h"
46
47
48
49/*!
50 **************************************************************************
51 * \if Function name : ih264d_init_cabac_dec_envirnoment \endif
52 *
53 * \brief
54 * This function initializes CABAC decoding envirnoment. This function
55 * implements 9.3.3.2.3.1 of ISO/IEC14496-10.
56 *
57 * \return
58 * None
59 *
60 **************************************************************************
61 */
62WORD32 ih264d_init_cabac_dec_envirnoment(decoding_envirnoment_t * ps_cab_env,
63 dec_bit_stream_t *ps_bitstrm)
64{
65 UWORD32 u4_code_int_val_ofst;
66
67 ps_cab_env->u4_code_int_range = (HALF - 2) << 23;
68 NEXTBITS(u4_code_int_val_ofst, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer,
69 32);
70 FLUSHBITS(ps_bitstrm->u4_ofst, 9)
71
72 if(ps_bitstrm->u4_ofst > ps_bitstrm->u4_max_ofst)
73 return ERROR_EOB_FLUSHBITS_T;
74
75 ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
76
77 /*brief description of the design adopted for CABAC*/
78 /*according to the standard the u4_code_int_range needs to be initialized 0x 1FE(10 bits) and
79 9 bits from the bit stream need to be read and into the u4_code_int_val_ofst.As and when the
80 u4_code_int_range becomes less than 10 bits we need to renormalize and read from the bitstream*
81
82 In the implemented design
83 initially
84
85 range_new = range <<23
86 valOffset_new = valOffset << 23 + 23 bits(read from the bit stream)
87
88 Thus we have read 23 more bits ahead of time.
89
90 It can be mathematical proved that even with the modified range and u4_ofst the operations
91 like comparison and subtraction needed for a bin decode are still valid(both in the regular case and the bypass case)
92
93 As bins are decoded..we consume the bits that we have already read into the valOffset.The clz of Range
94 gives us the number of bits we consumed of the 23 bits that we have read ahead of time.
95
96 when the number bits we have consumed exceeds 23 ,we renormalize..and we read from the bitstream again*/
97
98RESET_BIN_COUNTS(ps_cab_env)
99
100 return OK;
101}
102
103/*****************************************************************************/
104/* */
105/* Function Name : ih264d_init_cabac_contexts */
106/* */
107/* Description : This function initializes the cabac contexts */
108/* depending upon slice type and Init_Idc value. */
109/* Inputs : ps_dec, slice type */
110/* Globals : <Does it use any global variables?> */
111/* Outputs : */
112/* Returns : void */
113/* */
114/* Issues : none */
115/* */
116/* Revision History: */
117/* */
118/* DD MM YYYY Author(s) Changes (Describe the changes made) */
119/* 03 05 2005 100153) Draft */
120/* */
121/*****************************************************************************/
122
123void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec)
124{
125
126 bin_ctxt_model_t *p_cabac_ctxt_table_t = ps_dec->p_cabac_ctxt_table_t;
127 UWORD8 u1_qp_y = ps_dec->ps_cur_slice->u1_slice_qp;
128 UWORD8 u1_cabac_init_Idc = 0;
129
130 if(I_SLICE != u1_slice_type)
131 {
132 u1_cabac_init_Idc = ps_dec->ps_cur_slice->u1_cabac_init_idc;
133 }
134
135 {
136 /* MAKING ps_dec->p_ctxt_inc_mb_map a scratch buffer */
137 /* 0th entry of CtxtIncMbMap will be always be containing default values
138 for CABAC context representing MB not available */
139 ctxt_inc_mb_info_t *p_DefCtxt = ps_dec->p_ctxt_inc_mb_map - 1;
140 UWORD8 *pu1_temp;
141 WORD8 i;
142 p_DefCtxt->u1_mb_type = CAB_SKIP;
143
144 p_DefCtxt->u1_cbp = 0x0f;
145 p_DefCtxt->u1_intra_chroma_pred_mode = 0;
146
147 p_DefCtxt->u1_yuv_dc_csbp = 0x7;
148
149 p_DefCtxt->u1_transform8x8_ctxt = 0;
150
151 pu1_temp = (UWORD8*)p_DefCtxt->i1_ref_idx;
152 for(i = 0; i < 4; i++, pu1_temp++)
153 (*pu1_temp) = 0;
154 pu1_temp = (UWORD8*)p_DefCtxt->u1_mv;
155 for(i = 0; i < 16; i++, pu1_temp++)
156 (*pu1_temp) = 0;
157 ps_dec->ps_def_ctxt_mb_info = p_DefCtxt;
158 }
159
160 if(u1_slice_type == I_SLICE)
161 {
162 u1_cabac_init_Idc = 3;
163 ps_dec->p_mb_type_t = p_cabac_ctxt_table_t + MB_TYPE_I_SLICE;
164 }
165 else if(u1_slice_type == P_SLICE)
166 {
167 ps_dec->p_mb_type_t = p_cabac_ctxt_table_t + MB_TYPE_P_SLICE;
168 ps_dec->p_mb_skip_flag_t = p_cabac_ctxt_table_t + MB_SKIP_FLAG_P_SLICE;
169 ps_dec->p_sub_mb_type_t = p_cabac_ctxt_table_t + SUB_MB_TYPE_P_SLICE;
170 }
171 else if(u1_slice_type == B_SLICE)
172 {
173 ps_dec->p_mb_type_t = p_cabac_ctxt_table_t + MB_TYPE_B_SLICE;
174 ps_dec->p_mb_skip_flag_t = p_cabac_ctxt_table_t + MB_SKIP_FLAG_B_SLICE;
175 ps_dec->p_sub_mb_type_t = p_cabac_ctxt_table_t + SUB_MB_TYPE_B_SLICE;
176 }
177 {
178 bin_ctxt_model_t *p_cabac_ctxt_table_t_tmp = p_cabac_ctxt_table_t;
179 if(ps_dec->ps_cur_slice->u1_field_pic_flag)
180 {
181 p_cabac_ctxt_table_t_tmp += SIGNIFICANT_COEFF_FLAG_FLD;
182
183 }
184 else
185 {
186 p_cabac_ctxt_table_t_tmp += SIGNIFICANT_COEFF_FLAG_FRAME;
187 }
188 {
189 bin_ctxt_model_t * * p_significant_coeff_flag_t =
190 ps_dec->p_significant_coeff_flag_t;
191 p_significant_coeff_flag_t[0] = p_cabac_ctxt_table_t_tmp
192 + SIG_COEFF_CTXT_CAT_0_OFFSET;
193 p_significant_coeff_flag_t[1] = p_cabac_ctxt_table_t_tmp
194 + SIG_COEFF_CTXT_CAT_1_OFFSET;
195 p_significant_coeff_flag_t[2] = p_cabac_ctxt_table_t_tmp
196 + SIG_COEFF_CTXT_CAT_2_OFFSET;
197 p_significant_coeff_flag_t[3] = p_cabac_ctxt_table_t_tmp
198 + SIG_COEFF_CTXT_CAT_3_OFFSET;
199 p_significant_coeff_flag_t[4] = p_cabac_ctxt_table_t_tmp
200 + SIG_COEFF_CTXT_CAT_4_OFFSET;
201
202 p_significant_coeff_flag_t[5] = p_cabac_ctxt_table_t_tmp
203 + SIG_COEFF_CTXT_CAT_5_OFFSET;
204
205 }
206 }
207
208 memcpy(p_cabac_ctxt_table_t,
209 gau1_ih264d_cabac_ctxt_init_table[u1_cabac_init_Idc][u1_qp_y],
210 NUM_CABAC_CTXTS * sizeof(bin_ctxt_model_t));
211}
212/*!
213 **************************************************************************
214 * \if Function name : ih264d_decode_bin \endif
215 *
216 * \brief
217 * This function implements decoding process of a decision as defined
218 * in 9.3.3.2.2.
219 *
220 * \return
221 * Returns symbol decoded.
222 *
223 * \note
224 * It is specified in 9.3.3.2.3.2 that, one of the input to this function
225 * is CtxIdx. CtxIdx is used to identify state and MPS of that context
226 * (Refer Fig 9.11 - Flowchart for encoding a decision). To suffice that
227 * here we pass a pointer bin_ctxt_model_t which contains these values.
228 *
229 **************************************************************************
230 */
231
232UWORD32 ih264d_decode_bin(UWORD32 u4_ctx_inc,
233 bin_ctxt_model_t *ps_src_bin_ctxt,
234 dec_bit_stream_t *ps_bitstrm,
235 decoding_envirnoment_t *ps_cab_env)
236
237{
238
239 UWORD32 u4_qnt_int_range, u4_code_int_range, u4_code_int_val_ofst,
240 u4_int_range_lps;
241
242 UWORD32 u4_symbol, u4_mps_state;
243
244 bin_ctxt_model_t *ps_bin_ctxt;
245
246 UWORD32 table_lookup;
247 const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
248 UWORD32 u4_clz;
249
250 ps_bin_ctxt = ps_src_bin_ctxt + u4_ctx_inc;
251
252 u4_code_int_range = ps_cab_env->u4_code_int_range;
253 u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
254
255 u4_mps_state = (ps_bin_ctxt->u1_mps_state);
256 u4_clz = CLZ(u4_code_int_range);
257
258 u4_qnt_int_range = u4_code_int_range << u4_clz;
259 u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
260
261 table_lookup = pu4_table[(u4_mps_state << 2) + u4_qnt_int_range];
262 u4_int_range_lps = table_lookup & 0xff;
263
264 u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
265 u4_code_int_range = u4_code_int_range - u4_int_range_lps;
266
267 u4_symbol = ((u4_mps_state >> 6) & 0x1);
268
269 u4_mps_state = (table_lookup >> 8) & 0x7F;
270
271 CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
272 u4_int_range_lps, u4_mps_state, table_lookup)
273
274 if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8)
275 {
276 UWORD32 *pu4_buffer, u4_offset;
277
278 pu4_buffer = ps_bitstrm->pu4_buffer;
279 u4_offset = ps_bitstrm->u4_ofst;
280
281 RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
282 pu4_buffer)
283
284 ps_bitstrm->u4_ofst = u4_offset;
285 }
286
287 INC_BIN_COUNT(ps_cab_env)
288
289 ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
290 ps_cab_env->u4_code_int_range = u4_code_int_range;
291 ps_bin_ctxt->u1_mps_state = u4_mps_state;
292
293 return (u4_symbol);
294}
295
296/*!
297 **************************************************************************
298 * \if Function name : ih264d_decode_terminate \endif
299 *
300 * \brief
301 * This function implements decoding process of a termination as defined
302 * 9.3.3.2.2.3 of ISO/IEC14496-10.
303 *
304 * \return
305 * Returns symbol decoded.
306 *
307 * \note
308 * This routine is called while decoding "end_of_skice_flag" and of the
309 * bin indicating PCM mode in MBType.
310 *
311 **************************************************************************
312 */
313UWORD8 ih264d_decode_terminate(decoding_envirnoment_t * ps_cab_env,
314 dec_bit_stream_t * ps_stream)
315{
316 UWORD32 u4_symbol;
317 UWORD32 u4_code_int_val_ofst, u4_code_int_range;
318 UWORD32 u4_clz;
319
320 u4_code_int_range = ps_cab_env->u4_code_int_range;
321 u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
322
323 u4_clz = CLZ(u4_code_int_range);
324 u4_code_int_range -= (2 << (23 - u4_clz));
325
326 if(u4_code_int_val_ofst >= u4_code_int_range)
327 {
328 /* S=1 */
329 u4_symbol = 1;
330
331 {
332
333 /*the u4_ofst needs to be updated before termination*/
334 ps_stream->u4_ofst += u4_clz;
335
336 }
337
338 }
339 else
340 {
341 /* S=0 */
342 u4_symbol = 0;
343
344 if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8)
345 {
346 UWORD32 *pu4_buffer, u4_offset;
347
348 pu4_buffer = ps_stream->pu4_buffer;
349 u4_offset = ps_stream->u4_ofst;
350
351 RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
352 pu4_buffer)
353 ps_stream->u4_ofst = u4_offset;
354 }
355 }
356
357 ps_cab_env->u4_code_int_range = u4_code_int_range;
358 ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
359
360 INC_BIN_COUNT(ps_cab_env)
361
362 return (u4_symbol);
363}
364
365/*****************************************************************************/
366/* */
367/* Function Name : ih264d_decode_bins_tunary */
368/* */
369/* Description : This function decodes bins in the case of TUNARY */
370/* binarization technique.valid_length is assumed equal to 3 */
371/* and u1_max_bins <= 4 in this functon. */
372/* Inputs : <What inputs does the function take?> */
373/* Globals : <Does it use any global variables?> */
374/* Processing : <Describe how the function operates - include algorithm */
375/* description> */
376/* Outputs : <What does the function produce?> */
377/* Returns : <What does the function return?> */
378/* */
379/* Issues : */
380/* */
381/* Revision History: */
382/* */
383/* DD MM YYYY Author(s) Changes (Describe the changes made) */
384/* 20 11 2008 SH Draft */
385/* */
386/*****************************************************************************/
387
388UWORD32 ih264d_decode_bins_tunary(UWORD8 u1_max_bins,
389 UWORD32 u4_ctx_inc,
390 bin_ctxt_model_t *ps_src_bin_ctxt,
391 dec_bit_stream_t *ps_bitstrm,
392 decoding_envirnoment_t *ps_cab_env)
393
394{
395 UWORD32 u4_value;
396 UWORD32 u4_symbol;
397 UWORD8 u4_ctx_Inc;
398 bin_ctxt_model_t *ps_bin_ctxt;
399 UWORD32 u4_code_int_range, u4_code_int_val_ofst;
400 const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
401
402 u4_value = 0;
403
404 /*u1_max_bins has to be less than or equal to 4, u1_max_bins <= 4 for this function*/
405
406 /*here the valid length is assumed to be equal to 3 ,so the calling function is expected
407 to duplicate CtxInc if valid lenth is 2 and cmaxbin is greater than2*/
408 u4_code_int_range = ps_cab_env->u4_code_int_range;
409 u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
410
411 do
412 {
413 u4_ctx_Inc = u4_ctx_inc & 0xF;
414 u4_ctx_inc = u4_ctx_inc >> 4;
415
416 ps_bin_ctxt = ps_src_bin_ctxt + u4_ctx_Inc;
417
418 DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, u4_code_int_val_ofst,
419 pu4_table, ps_bitstrm, u4_symbol)
420
421 INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
422
423 u4_value++;
424 }
425 while((u4_value < u1_max_bins) & (u4_symbol));
426
427 u4_value = u4_value - 1 + u4_symbol;
428
429 ps_cab_env->u4_code_int_range = u4_code_int_range;
430 ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
431
432 return (u4_value);
433
434}
435
436/*****************************************************************************/
437/* */
438/* Function Name : ih264d_decode_bins */
439/* */
440/* Description : This function decodes bins in the case of MSB_FIRST_FLC */
441/* binarization technique.valid_length is always equal max_bins */
442/* for MSB_FIRST_FLC. assumes u1_max_bins <= 4 */
443/* Inputs : <What inputs does the function take?> */
444/* Globals : <Does it use any global variables?> */
445/* Processing : <Describe how the function operates - include algorithm */
446/* description> */
447/* Outputs : <What does the function produce?> */
448/* Returns : <What does the function return?> */
449/* */
450/* Issues : <List any issues or problems with this function> */
451/* */
452/* Revision History: */
453/* */
454/* DD MM YYYY Author(s) Changes (Describe the changes made) */
455/* 20 11 2008 SH Draft */
456/* */
457/*****************************************************************************/
458
459UWORD32 ih264d_decode_bins(UWORD8 u1_max_bins,
460 UWORD32 u4_ctx_inc,
461 bin_ctxt_model_t *ps_src_bin_ctxt,
462 dec_bit_stream_t *ps_bitstrm,
463 decoding_envirnoment_t *ps_cab_env)
464
465{
466 UWORD32 u4_value;
467 UWORD32 u4_symbol, i;
468 UWORD32 u4_ctxt_inc;
469 bin_ctxt_model_t *ps_bin_ctxt;
470 UWORD32 u4_code_int_range, u4_code_int_val_ofst;
471 const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
472
473 i = 0;
474
475 u4_value = 0;
476
477 /*u1_max_bins has to be less than or equal to 4, u1_max_bins <= 4 for this fucntion*/
478 u4_code_int_range = ps_cab_env->u4_code_int_range;
479 u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
480
481 do
482 {
483 u4_ctxt_inc = u4_ctx_inc & 0xf;
484 u4_ctx_inc = u4_ctx_inc >> 4;
485
486 ps_bin_ctxt = ps_src_bin_ctxt + u4_ctxt_inc;
487
488 DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, u4_code_int_val_ofst,
489 pu4_table, ps_bitstrm, u4_symbol)
490
491 INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
492
493 u4_value = (u4_value << 1) | (u4_symbol);
494
495 i++;
496 }
497 while(i < u1_max_bins);
498
499 ps_cab_env->u4_code_int_range = u4_code_int_range;
500 ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
501
502 return (u4_value);
503
504}
505
506/*****************************************************************************/
507/* */
508/* Function Name : ih264d_decode_bins_unary */
509/* */
510/* Description : This function decodes bins in the case of UNARY */
511/* binarization technique.here the valid length is taken to 5*/
512/* and cmax is always greater than 9 */
513/* Inputs : <What inputs does the function take?> */
514/* Globals : <Does it use any global variables?> */
515/* Processing : <Describe how the function operates - include algorithm */
516/* description> */
517/* Outputs : <What does the function produce?> */
518/* Returns : <What does the function return?> */
519/* */
520/* Issues : <List any issues or problems with this function> */
521/* */
522/* Revision History: */
523/* */
524/* DD MM YYYY Author(s) Changes (Describe the changes made) */
525/* 20 11 2008 SH Draft */
526/* */
527/*****************************************************************************/
528UWORD32 ih264d_decode_bins_unary(UWORD8 u1_max_bins,
529 UWORD32 u4_ctx_inc,
530 bin_ctxt_model_t *ps_src_bin_ctxt,
531 dec_bit_stream_t *ps_bitstrm,
532 decoding_envirnoment_t *ps_cab_env)
533{
534 UWORD32 u4_value;
535 UWORD32 u4_symbol;
536 bin_ctxt_model_t *ps_bin_ctxt;
537 UWORD32 u4_ctx_Inc;
538 UWORD32 u4_code_int_range, u4_code_int_val_ofst;
539 const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
540
541 /* in this function the valid length for u4_ctx_inc is always taken to be,so if the
542 the valid length is lessthan 5 the caller need to duplicate accordingly*/
543
544 /*u1_max_bins is always greater or equal to 9 we have the check for u1_max_bins only after the 2 loop*/
545 u4_value = 0;
546 u4_code_int_range = ps_cab_env->u4_code_int_range;
547 u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
548
549 do
550 {
551 u4_ctx_Inc = u4_ctx_inc & 0xf;
552 u4_ctx_inc = u4_ctx_inc >> 4;
553
554 ps_bin_ctxt = ps_src_bin_ctxt + u4_ctx_Inc;
555
556 DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, u4_code_int_val_ofst,
557 pu4_table, ps_bitstrm, u4_symbol)
558
559 INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
560
561 u4_value++;
562
563 }
564 while(u4_symbol && u4_value < 4);
565
566 if(u4_symbol && (u4_value < u1_max_bins))
567 {
568
569 u4_ctx_Inc = u4_ctx_inc & 0xf;
570
571 ps_bin_ctxt = ps_src_bin_ctxt + u4_ctx_Inc;
572
573 do
574 {
575
576 DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, u4_code_int_val_ofst,
577 pu4_table, ps_bitstrm, u4_symbol)
578
579 INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
580
581 u4_value++;
582
583 }
584 while(u4_symbol && (u4_value < u1_max_bins));
585
586 }
587
588 ps_cab_env->u4_code_int_range = u4_code_int_range;
589 ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
590
591 u4_value = u4_value - 1 + u4_symbol;
592
593 return (u4_value);
594
595}
596
597/*****************************************************************************/
598/* */
599/* Function Name : ih264d_decode_bypass_bins_unary */
600/* */
601/* Description : This function is used in the case of UNARY coding */
602/* */
603/* */
604/* Inputs : <What inputs does the function take?> */
605/* Globals : <Does it use any global variables?> */
606/* Processing : <Describe how the function operates - include algorithm */
607/* description> */
608/* Outputs : <What does the function produce?> */
609/* Returns : <What does the function return?> */
610/* */
611/* Issues : <List any issues or problems with this function> */
612/* */
613/* Revision History: */
614/* */
615/* DD MM YYYY Author(s) Changes (Describe the changes made) */
616/* 13 10 2005 Ittiam Draft */
617/* */
618/*****************************************************************************/
619
620UWORD32 ih264d_decode_bypass_bins_unary(decoding_envirnoment_t *ps_cab_env,
621 dec_bit_stream_t *ps_bitstrm)
622{
623 UWORD32 u4_value;
624 UWORD32 u4_bin;
625 UWORD32 u4_code_int_val_ofst, u4_code_int_range;
626
627 UWORD32 u1_max_bins;
628
629 u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
630 u4_code_int_range = ps_cab_env->u4_code_int_range;
631
632 if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
633 {
634 UWORD32 *pu4_buffer, u4_offset;
635
636 pu4_buffer = ps_bitstrm->pu4_buffer;
637 u4_offset = ps_bitstrm->u4_ofst;
638
639 RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
640 pu4_buffer)
641 ps_bitstrm->u4_ofst = u4_offset;
642 }
643
644 /*as it is called only form mvd*/
645 u1_max_bins = 32;
646 u4_value = 0;
647
648 do
649 {
650 u4_value++;
651
652 u4_code_int_range = u4_code_int_range >> 1;
653 if(u4_code_int_val_ofst >= u4_code_int_range)
654 {
655 /* S=1 */
656 u4_bin = 1;
657 u4_code_int_val_ofst -= u4_code_int_range;
658 }
659 else
660 {
661 /* S=0 */
662 u4_bin = 0;
663 }
664
665 INC_BIN_COUNT(ps_cab_env);INC_BYPASS_BINS(ps_cab_env);
666
667 if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
668 {
669 UWORD32 *pu4_buffer, u4_offset;
670
671 pu4_buffer = ps_bitstrm->pu4_buffer;
672 u4_offset = ps_bitstrm->u4_ofst;
673
674 RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
675 pu4_buffer)
676
677 ps_bitstrm->u4_ofst = u4_offset;
678 }
679
680 }
681 while(u4_bin && (u4_value < u1_max_bins));
682
683 ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
684 ps_cab_env->u4_code_int_range = u4_code_int_range;
685 u4_value = (u4_value - 1 + u4_bin);
686
687return (u4_value);
688}
689
690/*****************************************************************************/
691/* */
692/* Function Name : ih264d_decode_bypass_bins */
693/* */
694/* Description : This function is used in the case of FLC coding */
695/* */
696/* */
697/* Inputs : <What inputs does the function take?> */
698/* Globals : <Does it use any global variables?> */
699/* Processing : <Describe how the function operates - include algorithm */
700/* description> */
701/* Outputs : <What does the function produce?> */
702/* Returns : <What does the function return?> */
703/* */
704/* Issues : <List any issues or problems with this function> */
705/* */
706/* Revision History: */
707/* */
708/* DD MM YYYY Author(s) Changes (Describe the changes made) */
709/* 13 10 2005 Ittiam Draft */
710/* */
711/*****************************************************************************/
712
713UWORD32 ih264d_decode_bypass_bins(decoding_envirnoment_t *ps_cab_env,
714 UWORD8 u1_max_bins,
715 dec_bit_stream_t *ps_bitstrm)
716{
717 UWORD32 u4_bins;
718 UWORD32 u4_bin;
719 UWORD32 u4_code_int_val_ofst, u4_code_int_range;
720
721 u4_bins = 0;
722 u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
723 u4_code_int_range = ps_cab_env->u4_code_int_range;
724
725 if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
726 {
727 UWORD32 *pu4_buffer, u4_offset;
728
729 pu4_buffer = ps_bitstrm->pu4_buffer;
730 u4_offset = ps_bitstrm->u4_ofst;
731
732 RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
733 pu4_buffer)
734 ps_bitstrm->u4_ofst = u4_offset;
735 }
736
737 do
738 {
739
740 u4_code_int_range = u4_code_int_range >> 1;
741
742 if(u4_code_int_val_ofst >= u4_code_int_range)
743 {
744 /* S=1 */
745 u4_bin = 1;
746 u4_code_int_val_ofst -= u4_code_int_range;
747 }
748 else
749 {
750 /* S=0 */
751 u4_bin = 0;
752 }
753
754 INC_BIN_COUNT(ps_cab_env);INC_BYPASS_BINS(ps_cab_env);
755
756 u4_bins = ((u4_bins << 1) | u4_bin);
757 u1_max_bins--;
758
759 if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
760 {
761 UWORD32 *pu4_buffer, u4_offset;
762
763 pu4_buffer = ps_bitstrm->pu4_buffer;
764 u4_offset = ps_bitstrm->u4_ofst;
765
766 RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
767 pu4_buffer)
768 ps_bitstrm->u4_ofst = u4_offset;
769 }
770
771 }
772 while(u1_max_bins);
773
774 ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
775 ps_cab_env->u4_code_int_range = u4_code_int_range;
776
777 return (u4_bins);
778}
779