ih264d_cabac.c revision a2b49e5f0574dee76f81507f288143d83a4b7c1a
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 * \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
780