Coverage Report

Created: 2025-07-12 06:37

/src/libavc/decoder/ih264d_cabac.c
Line
Count
Source (jump to first uncovered line)
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
 */
62
WORD32 ih264d_init_cabac_dec_envirnoment(decoding_envirnoment_t * ps_cab_env,
63
                                       dec_bit_stream_t *ps_bitstrm)
64
67.2k
{
65
67.2k
    UWORD32 u4_code_int_val_ofst;
66
67
67.2k
    ps_cab_env->u4_code_int_range = (HALF - 2) << 23;
68
67.2k
    NEXTBITS(u4_code_int_val_ofst, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer,
69
67.2k
             32);
70
67.2k
    FLUSHBITS(ps_bitstrm->u4_ofst, 9)
71
72
67.2k
    if(EXCEED_OFFSET(ps_bitstrm))
73
3.79k
        return ERROR_EOB_FLUSHBITS_T;
74
75
63.4k
    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
98
63.4k
RESET_BIN_COUNTS(ps_cab_env)
99
100
63.4k
    return OK;
101
67.2k
}
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
123
void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec)
124
58.3k
{
125
126
58.3k
    bin_ctxt_model_t *p_cabac_ctxt_table_t = ps_dec->p_cabac_ctxt_table_t;
127
58.3k
    UWORD8 u1_qp_y = ps_dec->ps_cur_slice->u1_slice_qp;
128
58.3k
    UWORD8 u1_cabac_init_Idc = 0;
129
130
58.3k
    if(I_SLICE != u1_slice_type)
131
41.9k
    {
132
41.9k
        u1_cabac_init_Idc = ps_dec->ps_cur_slice->u1_cabac_init_idc;
133
41.9k
    }
134
135
58.3k
    {
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
58.3k
        ctxt_inc_mb_info_t *p_DefCtxt = ps_dec->p_ctxt_inc_mb_map - 1;
140
58.3k
        UWORD8 *pu1_temp;
141
58.3k
        WORD8 i;
142
58.3k
        p_DefCtxt->u1_mb_type = CAB_SKIP;
143
144
58.3k
        p_DefCtxt->u1_cbp = 0x0f;
145
58.3k
        p_DefCtxt->u1_intra_chroma_pred_mode = 0;
146
147
58.3k
        p_DefCtxt->u1_yuv_dc_csbp = 0x7;
148
149
58.3k
        p_DefCtxt->u1_transform8x8_ctxt = 0;
150
151
58.3k
        pu1_temp = (UWORD8*)p_DefCtxt->i1_ref_idx;
152
291k
        for(i = 0; i < 4; i++, pu1_temp++)
153
233k
            (*pu1_temp) = 0;
154
58.3k
        pu1_temp = (UWORD8*)p_DefCtxt->u1_mv;
155
992k
        for(i = 0; i < 16; i++, pu1_temp++)
156
933k
            (*pu1_temp) = 0;
157
58.3k
        ps_dec->ps_def_ctxt_mb_info = p_DefCtxt;
158
58.3k
    }
159
160
58.3k
    if(u1_slice_type == I_SLICE)
161
16.4k
    {
162
16.4k
        u1_cabac_init_Idc = 3;
163
16.4k
        ps_dec->p_mb_type_t = p_cabac_ctxt_table_t + MB_TYPE_I_SLICE;
164
16.4k
    }
165
41.9k
    else if(u1_slice_type == P_SLICE)
166
18.8k
    {
167
18.8k
        ps_dec->p_mb_type_t = p_cabac_ctxt_table_t + MB_TYPE_P_SLICE;
168
18.8k
        ps_dec->p_mb_skip_flag_t = p_cabac_ctxt_table_t + MB_SKIP_FLAG_P_SLICE;
169
18.8k
        ps_dec->p_sub_mb_type_t = p_cabac_ctxt_table_t + SUB_MB_TYPE_P_SLICE;
170
18.8k
    }
171
23.1k
    else if(u1_slice_type == B_SLICE)
172
23.1k
    {
173
23.1k
        ps_dec->p_mb_type_t = p_cabac_ctxt_table_t + MB_TYPE_B_SLICE;
174
23.1k
        ps_dec->p_mb_skip_flag_t = p_cabac_ctxt_table_t + MB_SKIP_FLAG_B_SLICE;
175
23.1k
        ps_dec->p_sub_mb_type_t = p_cabac_ctxt_table_t + SUB_MB_TYPE_B_SLICE;
176
23.1k
    }
177
58.3k
    {
178
58.3k
        bin_ctxt_model_t *p_cabac_ctxt_table_t_tmp = p_cabac_ctxt_table_t;
179
58.3k
        if(ps_dec->ps_cur_slice->u1_field_pic_flag)
180
2.93k
        {
181
2.93k
            p_cabac_ctxt_table_t_tmp += SIGNIFICANT_COEFF_FLAG_FLD;
182
183
2.93k
        }
184
55.4k
        else
185
55.4k
        {
186
55.4k
            p_cabac_ctxt_table_t_tmp += SIGNIFICANT_COEFF_FLAG_FRAME;
187
55.4k
        }
188
58.3k
        {
189
58.3k
            bin_ctxt_model_t * * p_significant_coeff_flag_t =
190
58.3k
                            ps_dec->p_significant_coeff_flag_t;
191
58.3k
            p_significant_coeff_flag_t[0] = p_cabac_ctxt_table_t_tmp
192
58.3k
                            + SIG_COEFF_CTXT_CAT_0_OFFSET;
193
58.3k
            p_significant_coeff_flag_t[1] = p_cabac_ctxt_table_t_tmp
194
58.3k
                            + SIG_COEFF_CTXT_CAT_1_OFFSET;
195
58.3k
            p_significant_coeff_flag_t[2] = p_cabac_ctxt_table_t_tmp
196
58.3k
                            + SIG_COEFF_CTXT_CAT_2_OFFSET;
197
58.3k
            p_significant_coeff_flag_t[3] = p_cabac_ctxt_table_t_tmp
198
58.3k
                            + SIG_COEFF_CTXT_CAT_3_OFFSET;
199
58.3k
            p_significant_coeff_flag_t[4] = p_cabac_ctxt_table_t_tmp
200
58.3k
                            + SIG_COEFF_CTXT_CAT_4_OFFSET;
201
202
58.3k
            p_significant_coeff_flag_t[5] = p_cabac_ctxt_table_t_tmp
203
58.3k
                            + SIG_COEFF_CTXT_CAT_5_OFFSET;
204
205
58.3k
        }
206
58.3k
    }
207
208
58.3k
    memcpy(p_cabac_ctxt_table_t,
209
58.3k
           gau1_ih264d_cabac_ctxt_init_table[u1_cabac_init_Idc][u1_qp_y],
210
58.3k
           NUM_CABAC_CTXTS * sizeof(bin_ctxt_model_t));
211
58.3k
}
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
232
UWORD32 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
9.93M
{
238
239
9.93M
    UWORD32 u4_qnt_int_range, u4_code_int_range, u4_code_int_val_ofst,
240
9.93M
                    u4_int_range_lps;
241
242
9.93M
    UWORD32 u4_symbol, u4_mps_state;
243
244
9.93M
    bin_ctxt_model_t *ps_bin_ctxt;
245
246
9.93M
    UWORD32 table_lookup;
247
9.93M
    const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
248
9.93M
    UWORD32 u4_clz;
249
250
9.93M
    ps_bin_ctxt = ps_src_bin_ctxt + u4_ctx_inc;
251
252
9.93M
    u4_code_int_range = ps_cab_env->u4_code_int_range;
253
9.93M
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
254
255
9.93M
    u4_mps_state = (ps_bin_ctxt->u1_mps_state);
256
9.93M
    u4_clz = CLZ(u4_code_int_range);
257
258
9.93M
    u4_qnt_int_range = u4_code_int_range << u4_clz;
259
9.93M
    u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
260
261
9.93M
    table_lookup = pu4_table[(u4_mps_state << 2) + u4_qnt_int_range];
262
9.93M
    u4_int_range_lps = table_lookup & 0xff;
263
264
9.93M
    u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
265
9.93M
    u4_code_int_range = u4_code_int_range - u4_int_range_lps;
266
267
9.93M
    u4_symbol = ((u4_mps_state >> 6) & 0x1);
268
269
9.93M
    u4_mps_state = (table_lookup >> 8) & 0x7F;
270
271
9.93M
    CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
272
9.93M
                 u4_int_range_lps, u4_mps_state, table_lookup)
273
274
9.93M
    if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8)
275
44.9k
    {
276
44.9k
        UWORD32 *pu4_buffer, u4_offset;
277
278
44.9k
        pu4_buffer = ps_bitstrm->pu4_buffer;
279
44.9k
        u4_offset = ps_bitstrm->u4_ofst;
280
281
44.9k
        RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
282
44.9k
                            pu4_buffer)
283
284
44.9k
        ps_bitstrm->u4_ofst = u4_offset;
285
44.9k
    }
286
287
9.93M
    INC_BIN_COUNT(ps_cab_env)
288
289
9.93M
    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
290
9.93M
    ps_cab_env->u4_code_int_range = u4_code_int_range;
291
9.93M
    ps_bin_ctxt->u1_mps_state = u4_mps_state;
292
293
9.93M
    return (u4_symbol);
294
9.93M
}
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
 */
313
UWORD8 ih264d_decode_terminate(decoding_envirnoment_t * ps_cab_env,
314
                               dec_bit_stream_t * ps_stream)
315
5.05M
{
316
5.05M
    UWORD32 u4_symbol;
317
5.05M
    UWORD32 u4_code_int_val_ofst, u4_code_int_range;
318
5.05M
    UWORD32 u4_clz;
319
320
5.05M
    u4_code_int_range = ps_cab_env->u4_code_int_range;
321
5.05M
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
322
323
5.05M
    u4_clz = CLZ(u4_code_int_range);
324
5.05M
    u4_code_int_range -= (2 << (23 - u4_clz));
325
326
5.05M
    if(u4_code_int_val_ofst >= u4_code_int_range)
327
14.6k
    {
328
        /* S=1 */
329
14.6k
        u4_symbol = 1;
330
331
14.6k
        {
332
333
            /*the u4_ofst needs to be updated before termination*/
334
14.6k
            ps_stream->u4_ofst += u4_clz;
335
336
14.6k
        }
337
338
14.6k
    }
339
5.03M
    else
340
5.03M
    {
341
        /* S=0 */
342
5.03M
        u4_symbol = 0;
343
344
5.03M
        if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8)
345
3.24k
        {
346
3.24k
            UWORD32 *pu4_buffer, u4_offset;
347
348
3.24k
            pu4_buffer = ps_stream->pu4_buffer;
349
3.24k
            u4_offset = ps_stream->u4_ofst;
350
351
3.24k
            RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
352
3.24k
                                pu4_buffer)
353
3.24k
            ps_stream->u4_ofst = u4_offset;
354
3.24k
        }
355
5.03M
    }
356
357
5.05M
    ps_cab_env->u4_code_int_range = u4_code_int_range;
358
5.05M
    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
359
360
5.05M
    INC_BIN_COUNT(ps_cab_env)
361
362
5.05M
    return (u4_symbol);
363
5.05M
}
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
388
UWORD32 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
1.09M
{
395
1.09M
    UWORD32 u4_value;
396
1.09M
    UWORD32 u4_symbol;
397
1.09M
    UWORD8 u4_ctx_Inc;
398
1.09M
    bin_ctxt_model_t *ps_bin_ctxt;
399
1.09M
    UWORD32 u4_code_int_range, u4_code_int_val_ofst;
400
1.09M
    const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
401
402
1.09M
    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
1.09M
    u4_code_int_range = ps_cab_env->u4_code_int_range;
409
1.09M
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
410
411
1.09M
    do
412
1.55M
    {
413
1.55M
        u4_ctx_Inc = u4_ctx_inc & 0xF;
414
1.55M
        u4_ctx_inc = u4_ctx_inc >> 4;
415
416
1.55M
        ps_bin_ctxt = ps_src_bin_ctxt + u4_ctx_Inc;
417
418
1.55M
        DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, u4_code_int_val_ofst,
419
1.55M
                             pu4_table, ps_bitstrm, u4_symbol)
420
421
1.55M
        INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
422
423
1.55M
        u4_value++;
424
1.55M
    }
425
1.55M
    while((u4_value < u1_max_bins) & (u4_symbol));
426
427
1.09M
    u4_value = u4_value - 1 + u4_symbol;
428
429
1.09M
    ps_cab_env->u4_code_int_range = u4_code_int_range;
430
1.09M
    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
431
432
1.09M
    return (u4_value);
433
434
1.09M
}
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
459
UWORD32 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
1.82M
{
466
1.82M
    UWORD32 u4_value;
467
1.82M
    UWORD32 u4_symbol, i;
468
1.82M
    UWORD32 u4_ctxt_inc;
469
1.82M
    bin_ctxt_model_t *ps_bin_ctxt;
470
1.82M
    UWORD32 u4_code_int_range, u4_code_int_val_ofst;
471
1.82M
    const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
472
473
1.82M
    i = 0;
474
475
1.82M
    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
1.82M
    u4_code_int_range = ps_cab_env->u4_code_int_range;
479
1.82M
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
480
481
1.82M
    do
482
3.80M
    {
483
3.80M
        u4_ctxt_inc = u4_ctx_inc & 0xf;
484
3.80M
        u4_ctx_inc = u4_ctx_inc >> 4;
485
486
3.80M
        ps_bin_ctxt = ps_src_bin_ctxt + u4_ctxt_inc;
487
488
3.80M
        DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, u4_code_int_val_ofst,
489
3.80M
                             pu4_table, ps_bitstrm, u4_symbol)
490
491
3.80M
        INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
492
493
3.80M
        u4_value = (u4_value << 1) | (u4_symbol);
494
495
3.80M
        i++;
496
3.80M
    }
497
3.80M
    while(i < u1_max_bins);
498
499
1.82M
    ps_cab_env->u4_code_int_range = u4_code_int_range;
500
1.82M
    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
501
502
1.82M
    return (u4_value);
503
504
1.82M
}
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
/*****************************************************************************/
528
UWORD32 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
2.30M
{
534
2.30M
    UWORD32 u4_value;
535
2.30M
    UWORD32 u4_symbol;
536
2.30M
    bin_ctxt_model_t *ps_bin_ctxt;
537
2.30M
    UWORD32 u4_ctx_Inc;
538
2.30M
    UWORD32 u4_code_int_range, u4_code_int_val_ofst;
539
2.30M
    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
2.30M
    u4_value = 0;
546
2.30M
    u4_code_int_range = ps_cab_env->u4_code_int_range;
547
2.30M
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
548
549
2.30M
    do
550
3.16M
    {
551
3.16M
        u4_ctx_Inc = u4_ctx_inc & 0xf;
552
3.16M
        u4_ctx_inc = u4_ctx_inc >> 4;
553
554
3.16M
        ps_bin_ctxt = ps_src_bin_ctxt + u4_ctx_Inc;
555
556
3.16M
        DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, u4_code_int_val_ofst,
557
3.16M
                             pu4_table, ps_bitstrm, u4_symbol)
558
559
3.16M
        INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
560
561
3.16M
        u4_value++;
562
563
3.16M
    }
564
3.16M
    while(u4_symbol && u4_value < 4);
565
566
2.30M
    if(u4_symbol && (u4_value < u1_max_bins))
567
36.8k
    {
568
569
36.8k
        u4_ctx_Inc = u4_ctx_inc & 0xf;
570
571
36.8k
        ps_bin_ctxt = ps_src_bin_ctxt + u4_ctx_Inc;
572
573
36.8k
        do
574
174k
        {
575
576
174k
            DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, u4_code_int_val_ofst,
577
174k
                                 pu4_table, ps_bitstrm, u4_symbol)
578
579
174k
            INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
580
581
174k
            u4_value++;
582
583
174k
        }
584
174k
        while(u4_symbol && (u4_value < u1_max_bins));
585
586
36.8k
    }
587
588
2.30M
    ps_cab_env->u4_code_int_range = u4_code_int_range;
589
2.30M
    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
590
591
2.30M
    u4_value = u4_value - 1 + u4_symbol;
592
593
2.30M
    return (u4_value);
594
595
2.30M
}
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
620
UWORD32 ih264d_decode_bypass_bins_unary(decoding_envirnoment_t *ps_cab_env,
621
                                        dec_bit_stream_t *ps_bitstrm)
622
972k
{
623
972k
    UWORD32 u4_value;
624
972k
    UWORD32 u4_bin;
625
972k
    UWORD32 u4_code_int_val_ofst, u4_code_int_range;
626
627
972k
    UWORD32 u1_max_bins;
628
629
972k
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
630
972k
    u4_code_int_range = ps_cab_env->u4_code_int_range;
631
632
972k
    if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
633
23.6k
    {
634
23.6k
        UWORD32 *pu4_buffer, u4_offset;
635
636
23.6k
        pu4_buffer = ps_bitstrm->pu4_buffer;
637
23.6k
        u4_offset = ps_bitstrm->u4_ofst;
638
639
23.6k
        RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
640
23.6k
                            pu4_buffer)
641
23.6k
        ps_bitstrm->u4_ofst = u4_offset;
642
23.6k
    }
643
644
    /*as it is called only form mvd*/
645
972k
    u1_max_bins = 32;
646
972k
    u4_value = 0;
647
648
972k
    do
649
1.24M
    {
650
1.24M
        u4_value++;
651
652
1.24M
        u4_code_int_range = u4_code_int_range >> 1;
653
1.24M
        if(u4_code_int_val_ofst >= u4_code_int_range)
654
269k
        {
655
            /* S=1 */
656
269k
            u4_bin = 1;
657
269k
            u4_code_int_val_ofst -= u4_code_int_range;
658
269k
        }
659
972k
        else
660
972k
        {
661
            /* S=0 */
662
972k
            u4_bin = 0;
663
972k
        }
664
665
1.24M
        INC_BIN_COUNT(ps_cab_env);INC_BYPASS_BINS(ps_cab_env);
666
667
1.24M
        if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
668
61.3k
        {
669
61.3k
            UWORD32 *pu4_buffer, u4_offset;
670
671
61.3k
            pu4_buffer = ps_bitstrm->pu4_buffer;
672
61.3k
            u4_offset = ps_bitstrm->u4_ofst;
673
674
61.3k
            RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
675
61.3k
                                pu4_buffer)
676
677
61.3k
            ps_bitstrm->u4_ofst = u4_offset;
678
61.3k
        }
679
680
1.24M
    }
681
1.24M
    while(u4_bin && (u4_value < u1_max_bins));
682
683
972k
    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
684
972k
    ps_cab_env->u4_code_int_range = u4_code_int_range;
685
972k
    u4_value = (u4_value - 1 + u4_bin);
686
687
972k
return (u4_value);
688
972k
}
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
713
UWORD32 ih264d_decode_bypass_bins(decoding_envirnoment_t *ps_cab_env,
714
                                  UWORD8 u1_max_bins,
715
                                  dec_bit_stream_t *ps_bitstrm)
716
972k
{
717
972k
    UWORD32 u4_bins;
718
972k
    UWORD32 u4_bin;
719
972k
    UWORD32 u4_code_int_val_ofst, u4_code_int_range;
720
721
972k
    u4_bins = 0;
722
972k
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
723
972k
    u4_code_int_range = ps_cab_env->u4_code_int_range;
724
725
972k
    if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
726
0
    {
727
0
        UWORD32 *pu4_buffer, u4_offset;
728
729
0
        pu4_buffer = ps_bitstrm->pu4_buffer;
730
0
        u4_offset = ps_bitstrm->u4_ofst;
731
732
0
        RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
733
0
                            pu4_buffer)
734
0
        ps_bitstrm->u4_ofst = u4_offset;
735
0
    }
736
737
972k
    do
738
3.18M
    {
739
740
3.18M
        u4_code_int_range = u4_code_int_range >> 1;
741
742
3.18M
        if(u4_code_int_val_ofst >= u4_code_int_range)
743
549k
        {
744
            /* S=1 */
745
549k
            u4_bin = 1;
746
549k
            u4_code_int_val_ofst -= u4_code_int_range;
747
549k
        }
748
2.63M
        else
749
2.63M
        {
750
            /* S=0 */
751
2.63M
            u4_bin = 0;
752
2.63M
        }
753
754
3.18M
        INC_BIN_COUNT(ps_cab_env);INC_BYPASS_BINS(ps_cab_env);
755
756
3.18M
        u4_bins = ((u4_bins << 1) | u4_bin);
757
3.18M
        u1_max_bins--;
758
759
3.18M
        if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
760
95.8k
        {
761
95.8k
            UWORD32 *pu4_buffer, u4_offset;
762
763
95.8k
            pu4_buffer = ps_bitstrm->pu4_buffer;
764
95.8k
            u4_offset = ps_bitstrm->u4_ofst;
765
766
95.8k
            RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
767
95.8k
                                pu4_buffer)
768
95.8k
            ps_bitstrm->u4_ofst = u4_offset;
769
95.8k
        }
770
771
3.18M
    }
772
3.18M
    while(u1_max_bins);
773
774
972k
    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
775
972k
    ps_cab_env->u4_code_int_range = u4_code_int_range;
776
777
972k
    return (u4_bins);
778
972k
}
779