Coverage Report

Created: 2025-10-13 06:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/ih264d_parse_mb_header.c
Line
Count
Source
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_parse_mb_header.c
23
 *
24
 * \brief
25
 *    This file contains context identifier encoding routines.
26
 *
27
 * \date
28
 *    04/02/2003
29
 *
30
 * \author  NS
31
 ***************************************************************************
32
 */
33
#include <string.h>
34
#include "ih264d_structs.h"
35
#include "ih264d_bitstrm.h"
36
#include "ih264d_cabac.h"
37
#include "ih264_typedefs.h"
38
#include "ih264_macros.h"
39
#include "ih264_platform_macros.h"
40
#include "ih264d_defs.h"
41
#include "ih264d_error_handler.h"
42
#include "ih264d_tables.h"
43
#include "ih264d_debug.h"
44
#include "ih264d_defs.h"
45
#include "ih264d_defs.h"
46
#include "ih264d_mb_utils.h"
47
#include "ih264d_parse_mb_header.h"
48
#include "ih264d_defs.h"
49
50
/*! < CtxtInc index 0 - CtxMbTypeI, CtxMbTypeSISuffix
51
 index 1 - CtxMbTypePSuffix, CtxMbTypeBSuffix
52
 */
53
54
55
56
/*!
57
 **************************************************************************
58
 * \if Function name : ih264d_parse_mb_type_intra_cabac \endif
59
 *
60
 * \brief
61
 *    This function decodes MB type using CABAC entropy coding mode.
62
 *
63
 * \return
64
 *    MBType.
65
 *
66
 **************************************************************************
67
 */
68
UWORD8 ih264d_parse_mb_type_intra_cabac(UWORD8 u1_inter,
69
                                        struct _DecStruct * ps_dec)
70
1.18M
{
71
1.18M
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
72
1.18M
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
73
1.18M
    ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
74
1.18M
    ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
75
1.18M
    bin_ctxt_model_t *ps_mb_bin_ctxt = ps_dec->p_mb_type_t;
76
1.18M
    WORD8 u1_mb_type, u1_bin;
77
1.18M
    UWORD32 u4_cxt_inc;
78
79
1.18M
    u4_cxt_inc = 0;
80
1.18M
    if(!u1_inter)
81
1.13M
    {
82
1.13M
        if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info)
83
1.07M
            u4_cxt_inc += ((ps_left_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0);
84
1.13M
        if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info)
85
969k
            u4_cxt_inc += ((ps_top_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0);
86
1.13M
    }
87
55.2k
    else
88
55.2k
    {
89
55.2k
        ps_mb_bin_ctxt = ps_mb_bin_ctxt + 3 + (ps_dec->u1_B << 1);
90
55.2k
    }
91
92
    /* b0 */
93
1.18M
    u1_mb_type = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
94
1.18M
                                          ps_cab_env);
95
1.18M
    if(u1_mb_type)
96
805k
    {
97
        /* I16x16 or I_PCM mode */
98
        /* b1 */
99
805k
        u1_bin = ih264d_decode_terminate(ps_cab_env, ps_bitstrm);
100
805k
        if(u1_bin == 0)
101
803k
        {
102
            /* I16x16 mode */
103
            /* Read b2 and b3 */
104
803k
            u4_cxt_inc = (u1_inter) ? 0x021 : 0x043;
105
106
803k
            u1_bin = ih264d_decode_bins(2, u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
107
803k
                                        ps_cab_env);
108
109
803k
            if(u1_bin & 0x01)
110
26.4k
                u1_mb_type += 4;
111
112
803k
            if(u1_bin & 0x02)
113
15.8k
                u1_mb_type += 12;
114
115
803k
            if(u1_bin & 0x01)
116
26.4k
            {
117
                /* since b3=1, Read three bins */
118
26.4k
                u4_cxt_inc = (u1_inter) ? 0x0332 : 0x0765;
119
26.4k
                u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc, ps_mb_bin_ctxt,
120
26.4k
                                                    ps_bitstrm, ps_cab_env);
121
122
26.4k
            }
123
777k
            else
124
777k
            {
125
                /* Read two bins */
126
777k
                u4_cxt_inc = (u1_inter) ? 0x033 : 0x076;
127
777k
                u1_bin = (UWORD8)ih264d_decode_bins(2, u4_cxt_inc, ps_mb_bin_ctxt,
128
777k
                                                    ps_bitstrm, ps_cab_env);
129
777k
            }
130
803k
            u1_mb_type += u1_bin;
131
803k
        }
132
2.03k
        else
133
2.03k
        {
134
            /* I_PCM mode */
135
            /* b1=1 */
136
2.03k
            u1_mb_type = 25;
137
2.03k
        }
138
805k
    }
139
1.18M
    return (u1_mb_type);
140
1.18M
}
141
142
/*!
143
 **************************************************************************
144
 * \if Function name : ih264d_parse_mb_type_cabac \endif
145
 *
146
 * \brief
147
 *    This function decodes MB type using CABAC entropy coding mode.
148
 *
149
 * \return
150
 *    MBType.
151
 *
152
 **************************************************************************
153
 */
154
UWORD32 ih264d_parse_mb_type_cabac(struct _DecStruct * ps_dec)
155
480k
{
156
480k
    const UWORD8 uc_slice_type = ps_dec->ps_cur_slice->u1_slice_type;
157
480k
    decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env;
158
480k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
159
480k
    ctxt_inc_mb_info_t *ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
160
480k
    ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
161
480k
    WORD8 c_ctxt_inc;
162
480k
    bin_ctxt_model_t *ps_mb_bin_ctxt = ps_dec->p_mb_type_t;
163
480k
    WORD8 u1_mb_type = 0, u1_bin;
164
480k
    UWORD32 u4_cxt_inc;
165
166
480k
    INC_SYM_COUNT(ps_cab_env);
167
168
480k
    c_ctxt_inc = 0;
169
170
480k
    if(uc_slice_type == SI_SLICE)
171
0
    {
172
        /* b0 */
173
0
        if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info)
174
0
            c_ctxt_inc += ((ps_left_ctxt->u1_mb_type != CAB_SI4x4) ? 1 : 0);
175
0
        if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info)
176
0
            c_ctxt_inc += ((ps_top_ctxt->u1_mb_type != CAB_SI4x4) ? 1 : 0);
177
178
0
        u4_cxt_inc = c_ctxt_inc;
179
0
        u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
180
0
                                           ps_cab_env);
181
0
        if(u1_bin == 0)
182
0
        {
183
            /* SI MB */
184
0
            u1_mb_type = 0;
185
0
        }
186
0
        else
187
0
        {
188
0
            u1_mb_type = 1 + ih264d_parse_mb_type_intra_cabac(0, ps_dec);
189
0
        }
190
0
    }
191
480k
    else if(uc_slice_type == P_SLICE)
192
279k
    {
193
        /* P Slice */
194
        /* b0 */
195
279k
        u4_cxt_inc = 0;
196
279k
        u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
197
279k
                                           ps_cab_env);
198
279k
        if(!u1_bin)
199
227k
        {
200
            /* Inter MB types */
201
            /* b1 */
202
227k
            u4_cxt_inc = 0x01;
203
227k
            u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
204
227k
                                               ps_bitstrm, ps_cab_env);
205
            /* b2 */
206
227k
            u4_cxt_inc = u1_bin + 2;
207
227k
            u1_mb_type = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
208
227k
                                                  ps_bitstrm, ps_cab_env);
209
227k
            u1_mb_type = (u1_bin << 1) + u1_mb_type;
210
227k
            if(u1_mb_type)
211
153k
                u1_mb_type = 4 - u1_mb_type;
212
227k
        }
213
51.9k
        else
214
51.9k
        {
215
            /* Intra Prefix 1 found */
216
            /* Intra MB type */
217
51.9k
            u1_mb_type = 5 + ih264d_parse_mb_type_intra_cabac(1, ps_dec);
218
51.9k
        }
219
279k
    }
220
200k
    else if(uc_slice_type == B_SLICE)
221
200k
    {
222
200k
        WORD8 a, b;
223
        /* B Slice */
224
        /* b0 */
225
        /* a = b = 0, if B slice and MB is a SKIP or B_DIRECT16x16 */
226
200k
        a = 0;
227
200k
        b = 0;
228
200k
        u1_mb_type = 0;
229
200k
        if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info)
230
179k
            a = ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16);
231
200k
        if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info)
232
143k
            b = ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16);
233
234
200k
        u4_cxt_inc = a + b;
235
236
200k
        u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
237
200k
                                           ps_cab_env);
238
239
200k
        if(u1_bin)
240
193k
        {
241
242
            /* b1 */
243
193k
            u4_cxt_inc = 0x03;
244
193k
            u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
245
193k
                                               ps_bitstrm, ps_cab_env);
246
247
193k
            if(!u1_bin)
248
57.5k
            {
249
                /* b2 */
250
57.5k
                u4_cxt_inc = 0x05;
251
57.5k
                u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
252
57.5k
                                                   ps_bitstrm, ps_cab_env);
253
254
57.5k
                u1_mb_type = u1_bin + 1;
255
57.5k
            }
256
135k
            else
257
135k
            {
258
135k
                u1_mb_type = 3;
259
                /* b2 */
260
135k
                u4_cxt_inc = 0x04;
261
135k
                u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
262
135k
                                                   ps_bitstrm, ps_cab_env);
263
264
135k
                if(u1_bin)
265
106k
                {
266
106k
                    u1_mb_type += 8;
267
                    /* b3 */
268
106k
                    u4_cxt_inc = 0x05;
269
106k
                    u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
270
106k
                                                       ps_bitstrm, ps_cab_env);
271
272
106k
                    if(!u1_bin)
273
40.5k
                    {
274
40.5k
                        u1_mb_type++;
275
                        /* b4, b5, b6 */
276
40.5k
                        u4_cxt_inc = 0x0555;
277
40.5k
                        u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc,
278
40.5k
                                                            ps_mb_bin_ctxt,
279
40.5k
                                                            ps_bitstrm,
280
40.5k
                                                            ps_cab_env);
281
282
283
284
40.5k
                        u1_mb_type += u1_bin;
285
40.5k
                    }
286
65.8k
                    else
287
65.8k
                    {
288
                        /* b4 */
289
65.8k
                        u4_cxt_inc = 0x05;
290
65.8k
                        u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc,
291
65.8k
                                                           ps_mb_bin_ctxt,
292
65.8k
                                                           ps_bitstrm,
293
65.8k
                                                           ps_cab_env);
294
295
65.8k
                        if(u1_bin)
296
56.9k
                        {
297
                            /* b5 */
298
56.9k
                            u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc,
299
56.9k
                                                               ps_mb_bin_ctxt,
300
56.9k
                                                               ps_bitstrm,
301
56.9k
                                                               ps_cab_env);
302
303
56.9k
                            u1_mb_type += (u1_bin ? 11 : 0);
304
56.9k
                        }
305
8.89k
                        else
306
8.89k
                        {
307
8.89k
                            u1_mb_type = 20;
308
                            /* b5 */
309
8.89k
                            u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc,
310
8.89k
                                                               ps_mb_bin_ctxt,
311
8.89k
                                                               ps_bitstrm,
312
8.89k
                                                               ps_cab_env);
313
314
8.89k
                            if(!u1_bin)
315
5.56k
                            {
316
                                /* b6 */
317
5.56k
                                u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc,
318
5.56k
                                                                   ps_mb_bin_ctxt,
319
5.56k
                                                                   ps_bitstrm,
320
5.56k
                                                                   ps_cab_env);
321
322
5.56k
                                u1_mb_type += u1_bin;
323
5.56k
                            }
324
3.33k
                            else
325
3.33k
                            {
326
                                /* Intra Prefix 111101 found */
327
                                /* Intra MB type */
328
3.33k
                                u1_mb_type =
329
3.33k
                                                23
330
3.33k
                                                                + ih264d_parse_mb_type_intra_cabac(
331
3.33k
                                                                                1,
332
3.33k
                                                                                ps_dec);
333
3.33k
                            }
334
8.89k
                        }
335
65.8k
                    }
336
106k
                }
337
29.0k
                else
338
29.0k
                {
339
                    /* b3, b4, b5 */
340
29.0k
                    u4_cxt_inc = 0x0555;
341
29.0k
                    u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc,
342
29.0k
                                                        ps_mb_bin_ctxt, ps_bitstrm,
343
29.0k
                                                        ps_cab_env);
344
345
346
347
348
29.0k
                    u1_mb_type += u1_bin;
349
29.0k
                }
350
135k
            }
351
193k
        }
352
200k
    }
353
480k
    return ((UWORD32)u1_mb_type);
354
480k
}
355
356
/*!
357
 **************************************************************************
358
 * \if Function name : DecSubMBType \endif
359
 *
360
 * \brief
361
 *    This function decodes MB type using CABAC entropy coding mode.
362
 *
363
 * \return
364
 *    MBType.
365
 *
366
 **************************************************************************
367
 */
368
UWORD32 ih264d_parse_submb_type_cabac(const UWORD8 u1_slc_type_b,
369
                                      decoding_envirnoment_t * ps_cab_env,
370
                                      dec_bit_stream_t * ps_bitstrm,
371
                                      bin_ctxt_model_t * ps_sub_mb_cxt)
372
366k
{
373
366k
    WORD8 u1_sub_mb_type, u1_bin;
374
375
366k
    INC_SYM_COUNT(ps_cab_env);
376
377
366k
    u1_sub_mb_type = 0;
378
366k
    u1_bin = (UWORD8)ih264d_decode_bin(0, ps_sub_mb_cxt, ps_bitstrm,
379
366k
                                       ps_cab_env);
380
381
366k
    if(u1_slc_type_b ^ u1_bin)
382
82.1k
        return 0;
383
384
283k
    if(!u1_slc_type_b)
385
97.9k
    {
386
        /* P Slice */
387
97.9k
        u1_sub_mb_type = 1;
388
97.9k
        u1_bin = (UWORD8)ih264d_decode_bin(1, ps_sub_mb_cxt, ps_bitstrm,
389
97.9k
                                           ps_cab_env);
390
97.9k
        if(u1_bin == 1)
391
69.5k
        {
392
69.5k
            u1_bin = (UWORD8)ih264d_decode_bin(2, ps_sub_mb_cxt, ps_bitstrm,
393
69.5k
                                               ps_cab_env);
394
69.5k
            u1_sub_mb_type = (2 + (!u1_bin));
395
69.5k
        }
396
397
97.9k
        return u1_sub_mb_type;
398
97.9k
    }
399
185k
    else
400
185k
    {
401
        /* B Slice */
402
403
        /* b1 */
404
185k
        u1_bin = (UWORD8)ih264d_decode_bin(1, ps_sub_mb_cxt, ps_bitstrm,
405
185k
                                           ps_cab_env);
406
185k
        if(u1_bin)
407
150k
        {
408
            /* b2 */
409
150k
            u1_bin = (UWORD8)ih264d_decode_bin(2, ps_sub_mb_cxt, ps_bitstrm,
410
150k
                                               ps_cab_env);
411
150k
            if(u1_bin)
412
15.6k
            {
413
                /* b3 */
414
15.6k
                u1_sub_mb_type = 7;
415
15.6k
                u1_bin = (UWORD8)ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm,
416
15.6k
                                                   ps_cab_env);
417
15.6k
                u1_sub_mb_type += u1_bin << 2;
418
15.6k
                u1_bin = !u1_bin;
419
                /* b4 */
420
15.6k
                if(u1_bin == 0)
421
12.3k
                {
422
12.3k
                    u1_bin = ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm,
423
12.3k
                                               ps_cab_env);
424
12.3k
                }
425
3.32k
                else
426
3.32k
                {
427
3.32k
                    u1_bin = (UWORD8)ih264d_decode_bins(2, 0x33, ps_sub_mb_cxt,
428
3.32k
                                                        ps_bitstrm, ps_cab_env);
429
3.32k
                }
430
431
15.6k
                return (u1_sub_mb_type + u1_bin);
432
15.6k
            }
433
134k
            else
434
134k
            {
435
                /* b3 */
436
134k
                u1_bin = (UWORD8)ih264d_decode_bins(2, 0x33, ps_sub_mb_cxt,
437
134k
                                                    ps_bitstrm, ps_cab_env);
438
134k
                return (3 + u1_bin);
439
134k
            }
440
150k
        }
441
35.8k
        else
442
35.8k
        {
443
            /* b2 */
444
35.8k
            u1_bin = (UWORD8)ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm,
445
35.8k
                                               ps_cab_env);
446
35.8k
            return (1 + u1_bin);
447
35.8k
        }
448
185k
    }
449
283k
}
450
451
/*!
452
 **************************************************************************
453
 * \if Function name : ih264d_parse_ref_idx_cabac \endif
454
 *
455
 * \brief
456
 *    This function decodes Reference Index using CABAC entropy coding mode.
457
 *
458
 * \return
459
 *    None
460
 *
461
 **************************************************************************
462
 */
463
WORD32 ih264d_parse_ref_idx_cabac(const UWORD8 u1_num_part,
464
                                const UWORD8 u1_b2,
465
                                const UWORD8 u1_max_ref_minus1,
466
                                const UWORD8 u1_mb_mode,
467
                                WORD8 * pi1_ref_idx,
468
                                WORD8 * const pi1_lft_cxt,
469
                                WORD8 * const pi1_top_cxt,
470
                                decoding_envirnoment_t * const ps_cab_env,
471
                                dec_bit_stream_t * const ps_bitstrm,
472
                                bin_ctxt_model_t * const ps_ref_cxt)
473
525k
{
474
525k
    UWORD8 u1_a, u1_b;
475
525k
    UWORD32 u4_cxt_inc;
476
525k
    UWORD8 u1_blk_no, u1_i, u1_idx_lft, u1_idx_top;
477
525k
    WORD8 i1_ref_idx;
478
479
1.65M
    for(u1_blk_no = 0, u1_i = 0; u1_i < u1_num_part; u1_i++, pi1_ref_idx++)
480
1.12M
    {
481
1.12M
        u1_idx_lft = ((u1_blk_no & 0x02) >> 1) + u1_b2;
482
1.12M
        u1_idx_top = (u1_blk_no & 0x01) + u1_b2;
483
1.12M
        i1_ref_idx = *pi1_ref_idx;
484
485
1.12M
        if(i1_ref_idx > 0)
486
584k
        {
487
584k
            u1_a = pi1_lft_cxt[u1_idx_lft] > 0;
488
584k
            u1_b = pi1_top_cxt[u1_idx_top] > 0;
489
490
584k
            u4_cxt_inc = u1_a + (u1_b << 1);
491
584k
            u4_cxt_inc = (u4_cxt_inc | 0x55540);
492
493
584k
            i1_ref_idx = (WORD8)ih264d_decode_bins_unary(32, u4_cxt_inc,
494
584k
                                                         ps_ref_cxt, ps_bitstrm,
495
584k
                                                         ps_cab_env);
496
497
584k
            if((i1_ref_idx > u1_max_ref_minus1) || (i1_ref_idx < 0))
498
954
            {
499
954
                return ERROR_REF_IDX;
500
954
            }
501
502
583k
            *pi1_ref_idx = i1_ref_idx;
503
504
583k
            INC_SYM_COUNT(ps_cab_env);
505
506
583k
        }
507
508
        /* Storing Reference Idx Information */
509
1.12M
        pi1_lft_cxt[u1_idx_lft] = i1_ref_idx;
510
1.12M
        pi1_top_cxt[u1_idx_top] = i1_ref_idx;
511
1.12M
        u1_blk_no = u1_blk_no + 1 + (u1_mb_mode & 0x01);
512
1.12M
    }
513
    /* if(!u1_sub_mb) */
514
524k
    if(u1_num_part != 4)
515
408k
    {
516
408k
        pi1_lft_cxt[(!(u1_mb_mode & 0x1)) + u1_b2] = pi1_lft_cxt[u1_b2];
517
408k
        pi1_top_cxt[(!(u1_mb_mode & 0x2)) + u1_b2] = pi1_top_cxt[u1_b2];
518
408k
    }
519
524k
    return OK;
520
525k
}
521
522
/*!
523
 **************************************************************************
524
 * \if Function name : ih264d_parse_mb_qp_delta_cabac \endif
525
 *
526
 * \brief
527
 *    This function decodes MB Qp delta using CABAC entropy coding mode.
528
 *
529
 * \return
530
 *    None
531
 *
532
 **************************************************************************
533
 */
534
WORD32 ih264d_parse_mb_qp_delta_cabac(struct _DecStruct * ps_dec,
535
                                      WORD8 *pi1_mb_qp_delta)
536
1.19M
{
537
1.19M
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
538
1.19M
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
539
540
1.19M
    UWORD8 u1_code_num;
541
1.19M
    bin_ctxt_model_t *ps_mb_qp_delta_ctxt = ps_dec->p_mb_qp_delta_t;
542
1.19M
    UWORD32 u4_cxt_inc;
543
544
1.19M
    INC_SYM_COUNT(ps_cab_env);
545
546
1.19M
    u4_cxt_inc = (!(!(ps_dec->i1_prev_mb_qp_delta)));
547
548
1.19M
    u1_code_num = 0;
549
1.19M
    u4_cxt_inc = (u4_cxt_inc | 0x33320);
550
    /* max number of bins = 53,
551
     since Range for MbQpDelta= -26 to +25 inclusive, UNARY code */
552
1.19M
    u1_code_num = ih264d_decode_bins_unary(32, u4_cxt_inc, ps_mb_qp_delta_ctxt,
553
1.19M
                                          ps_bitstrm, ps_cab_env);
554
1.19M
    if(u1_code_num == 32)
555
1.66k
    {
556
        /* Read remaining 21 bins */
557
1.66k
        UWORD8 uc_codeNumX;
558
1.66k
        u4_cxt_inc = 0x33333;
559
1.66k
        uc_codeNumX = ih264d_decode_bins_unary(21, u4_cxt_inc, ps_mb_qp_delta_ctxt,
560
1.66k
                                               ps_bitstrm, ps_cab_env);
561
1.66k
        u1_code_num = u1_code_num + uc_codeNumX;
562
1.66k
    }
563
564
1.19M
    *pi1_mb_qp_delta = (u1_code_num + 1) >> 1;
565
    /* Table 9.3: If code_num is even Syntax Element has -ve value */
566
1.19M
    if(!(u1_code_num & 0x01))
567
959k
        *pi1_mb_qp_delta = -(*pi1_mb_qp_delta);
568
569
    /* Range of MbQpDelta= -26 to +25 inclusive */
570
1.19M
    if((*pi1_mb_qp_delta < -26) || (*pi1_mb_qp_delta > 25))
571
1.01k
        return ERROR_INV_RANGE_QP_T;
572
1.19M
    ps_dec->i1_prev_mb_qp_delta = *pi1_mb_qp_delta;
573
1.19M
    return OK;
574
1.19M
}
575
/*!
576
 **************************************************************************
577
 * \if Function name : ih264d_parse_chroma_pred_mode_cabac \endif
578
 *
579
 * \brief
580
 *    This function decodes Chroma Pred mode using CABAC entropy coding mode.
581
 *
582
 * \return
583
 *    None
584
 *
585
 **************************************************************************
586
 */
587
WORD8 ih264d_parse_chroma_pred_mode_cabac(struct _DecStruct * ps_dec)
588
1.18M
{
589
1.18M
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
590
1.18M
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
591
1.18M
    ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
592
1.18M
    ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
593
1.18M
    WORD8 i1_chroma_pred_mode, a, b;
594
1.18M
    UWORD32 u4_cxt_inc;
595
596
1.18M
    INC_SYM_COUNT(ps_cab_env);
597
598
    /* Binarization is TU and Cmax=3 */
599
1.18M
    i1_chroma_pred_mode = 0;
600
1.18M
    a = 0;
601
1.18M
    b = 0;
602
603
1.18M
    a = ((ps_left_ctxt->u1_intra_chroma_pred_mode != 0) ? 1 : 0);
604
605
1.18M
    b = ((ps_top_ctxt->u1_intra_chroma_pred_mode != 0) ? 1 : 0);
606
1.18M
    u4_cxt_inc = a + b;
607
608
1.18M
    u4_cxt_inc = (u4_cxt_inc | 0x330);
609
610
1.18M
    i1_chroma_pred_mode = ih264d_decode_bins_tunary(
611
1.18M
                    3, u4_cxt_inc, ps_dec->p_intra_chroma_pred_mode_t,
612
1.18M
                    ps_bitstrm, ps_cab_env);
613
614
1.18M
    return (i1_chroma_pred_mode);
615
1.18M
}
616
617
/*****************************************************************************/
618
/*                                                                           */
619
/*  Function Name : ih264d_parse_transform8x8flag_cabac                                     */
620
/*                                                                           */
621
/*  Description   :                                                          */
622
/*  Inputs        :                                                          */
623
/*                                                                           */
624
/*                                                                           */
625
/*  Returns       :                                                          */
626
/*                                                                           */
627
/*  Revision History:                                                        */
628
/*                                                                           */
629
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
630
/*                      Rajasekhar      Creation                             */
631
/*                                                                           */
632
/*****************************************************************************/
633
UWORD8 ih264d_parse_transform8x8flag_cabac(struct _DecStruct * ps_dec,
634
                                           dec_mb_info_t * ps_cur_mb_info)
635
153k
{
636
153k
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
637
153k
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
638
153k
    ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
639
153k
    ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
640
153k
    UWORD8 u1_transform_8x8flag;
641
153k
    UWORD8 u1_mb_ngbr_avail = ps_cur_mb_info->u1_mb_ngbr_availablity;
642
643
153k
    WORD8 a, b;
644
153k
    UWORD32 u4_cxt_inc;
645
646
    /* for calculating the context increment for transform8x8 u4_flag */
647
    /* it reads transform8x8 u4_flag of the neighbors through */
648
649
    /* Binarization is FLC */
650
153k
    a = 0;
651
153k
    b = 0;
652
653
153k
    if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK)
654
122k
    {
655
122k
        a = ps_left_ctxt->u1_transform8x8_ctxt;
656
122k
    }
657
153k
    if(u1_mb_ngbr_avail & TOP_MB_AVAILABLE_MASK)
658
115k
    {
659
115k
        b = ps_top_ctxt->u1_transform8x8_ctxt;
660
661
115k
    }
662
663
153k
    u4_cxt_inc = a + b;
664
665
153k
    u1_transform_8x8flag = ih264d_decode_bin(
666
153k
                    u4_cxt_inc, ps_dec->s_high_profile.ps_transform8x8_flag,
667
153k
                    ps_bitstrm, ps_cab_env);
668
669
153k
    return (u1_transform_8x8flag);
670
153k
}
671
672
/*!
673
 **************************************************************************
674
 * \if Function name : ih264d_read_intra_pred_modes_cabac \endif
675
 *
676
 * \brief
677
 *    Reads the intra pred mode related values of I4x4 MB from bitstream.
678
 *
679
 *    This function will read the prev intra pred mode flags and
680
 *    stores it in pu1_prev_intra4x4_pred_mode_flag. If the u4_flag
681
 *    indicates that most probable mode is not intra pred mode, then
682
 *    the rem_intra4x4_pred_mode is read and stored in
683
 *    pu1_rem_intra4x4_pred_mode array.
684
 *
685
 *
686
 * \return
687
 *    0 on success and Error code otherwise
688
 *
689
 **************************************************************************
690
 */
691
WORD32 ih264d_read_intra_pred_modes_cabac(dec_struct_t * ps_dec,
692
                                          UWORD8 * pu1_prev_intra4x4_pred_mode_flag,
693
                                          UWORD8 * pu1_rem_intra4x4_pred_mode,
694
                                          UWORD8 u1_tran_form8x8)
695
383k
{
696
383k
    WORD32 i4x4_luma_blk_idx = 0;
697
383k
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
698
383k
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
699
383k
    bin_ctxt_model_t *ps_ctxt_ipred_luma_mpm, *ps_ctx_ipred_luma_rm;
700
383k
    WORD32 i4_rem_intra4x4_pred_mode;
701
383k
    UWORD32 u4_prev_intra4x4_pred_mode_flag;
702
383k
    UWORD32 u4_code_int_range, u4_code_int_val_ofst;
703
383k
    const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
704
705
383k
    ps_ctxt_ipred_luma_mpm = ps_dec->p_prev_intra4x4_pred_mode_flag_t;
706
383k
    ps_ctx_ipred_luma_rm = ps_dec->p_rem_intra4x4_pred_mode_t;
707
383k
    SWITCHOFFTRACE;
708
709
383k
    i4x4_luma_blk_idx = (0 == u1_tran_form8x8) ? 16 : 4;
710
711
383k
    u4_code_int_range = ps_cab_env->u4_code_int_range;
712
383k
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
713
714
383k
    do
715
5.25M
    {
716
717
5.25M
        DECODE_ONE_BIN_MACRO(ps_ctxt_ipred_luma_mpm, u4_code_int_range,
718
5.25M
                             u4_code_int_val_ofst, pu4_table, ps_bitstrm,
719
5.25M
                             u4_prev_intra4x4_pred_mode_flag)
720
5.25M
        *pu1_prev_intra4x4_pred_mode_flag = u4_prev_intra4x4_pred_mode_flag;
721
722
5.25M
        i4_rem_intra4x4_pred_mode = -1;
723
5.25M
        if(!u4_prev_intra4x4_pred_mode_flag)
724
291k
        {
725
726
            /*inlining DecodeDecisionBins_FLC*/
727
728
291k
            {
729
730
291k
                UWORD8 u1_max_bins = 3;
731
291k
                UWORD32 u4_value;
732
291k
                UWORD32 u4_symbol, i;
733
734
291k
                i = 0;
735
291k
                u4_value = 0;
736
737
291k
                do
738
873k
                {
739
740
873k
                    DECODE_ONE_BIN_MACRO(ps_ctx_ipred_luma_rm, u4_code_int_range,
741
873k
                                         u4_code_int_val_ofst, pu4_table,
742
873k
                                         ps_bitstrm, u4_symbol)
743
744
873k
                    INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
745
746
873k
                    u4_value = u4_value | (u4_symbol << i);
747
748
873k
                    i++;
749
873k
                }
750
873k
                while(i < u1_max_bins);
751
752
291k
                i4_rem_intra4x4_pred_mode = (u4_value);
753
754
291k
            }
755
756
291k
        }
757
758
5.25M
        (*pu1_rem_intra4x4_pred_mode) = i4_rem_intra4x4_pred_mode;
759
760
5.25M
        COPYTHECONTEXT("intra4x4_pred_mode", i4_rem_intra4x4_pred_mode);
761
762
5.25M
        pu1_prev_intra4x4_pred_mode_flag++;
763
5.25M
        pu1_rem_intra4x4_pred_mode++;
764
765
5.25M
        i4x4_luma_blk_idx--;
766
5.25M
    }
767
5.25M
    while(i4x4_luma_blk_idx);
768
769
383k
    ps_cab_env->u4_code_int_range = u4_code_int_range;
770
383k
    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
771
772
383k
    return (0);
773
774
383k
}
775
776
/*!
777
 **************************************************************************
778
 * \if Function name : ih264d_parse_ctx_cbp_cabac \endif
779
 *
780
 * \brief
781
 *    This function decodes CtxCbpLuma and CtxCbpChroma (CBP of a Macroblock).
782
 *    using CABAC entropy coding mode.
783
 *
784
 * \return
785
 *    CBP of a MB.
786
 *
787
 **************************************************************************
788
 */
789
UWORD32 ih264d_parse_ctx_cbp_cabac(struct _DecStruct * ps_dec)
790
842k
{
791
792
842k
    UWORD32 u4_cxt_inc;
793
842k
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
794
842k
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
795
842k
    ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
796
842k
    ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
797
842k
    bin_ctxt_model_t *ps_ctxt_cbp_luma = ps_dec->p_cbp_luma_t, *ps_bin_ctxt;
798
842k
    WORD8 c_Cbp; //,i,j;
799
842k
    UWORD32 u4_code_int_range, u4_code_int_val_ofst;
800
842k
    UWORD32 u4_offset, *pu4_buffer;
801
842k
    const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
802
803
842k
    INC_SYM_COUNT(ps_cab_env);
804
805
806
807
    /* CBP Luma, FL, Cmax = 15, L = 4 */
808
842k
    u4_cxt_inc = (!((ps_top_ctxt->u1_cbp >> 2) & 0x01)) << 1;
809
842k
    u4_cxt_inc += !((ps_left_ctxt->u1_cbp >> 1) & 0x01);
810
811
842k
    u4_offset = ps_bitstrm->u4_ofst;
812
842k
    pu4_buffer = ps_bitstrm->pu4_buffer;
813
814
842k
    u4_code_int_range = ps_cab_env->u4_code_int_range;
815
842k
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
816
    /*renormalize to ensure there 23 bits more in the u4_code_int_val_ofst*/
817
842k
    {
818
842k
        UWORD32 u4_clz, read_bits;
819
820
842k
        u4_clz = CLZ(u4_code_int_range);
821
842k
        FLUSHBITS(u4_offset, u4_clz)
822
842k
        NEXTBITS(read_bits, u4_offset, pu4_buffer, 23)
823
842k
        u4_code_int_range = u4_code_int_range << u4_clz;
824
842k
        u4_code_int_val_ofst = (u4_code_int_val_ofst << u4_clz) | read_bits;
825
842k
    }
826
827
842k
    ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc;
828
829
    /*inlining DecodeDecision_onebin without renorm*/
830
842k
    {
831
832
842k
        UWORD32 u4_qnt_int_range, u4_int_range_lps;
833
842k
        UWORD32 u4_symbol, u1_mps_state;
834
842k
        UWORD32 table_lookup;
835
842k
        UWORD32 u4_clz;
836
837
842k
        u1_mps_state = (ps_bin_ctxt->u1_mps_state);
838
839
842k
        u4_clz = CLZ(u4_code_int_range);
840
842k
        u4_qnt_int_range = u4_code_int_range << u4_clz;
841
842k
        u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
842
843
842k
        table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
844
842k
        u4_int_range_lps = table_lookup & 0xff;
845
846
842k
        u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
847
842k
        u4_code_int_range = u4_code_int_range - u4_int_range_lps;
848
849
842k
        u4_symbol = ((u1_mps_state >> 6) & 0x1);
850
851
        /*if mps*/
852
842k
        u1_mps_state = (table_lookup >> 8) & 0x7F;
853
854
842k
        CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
855
842k
                     u4_int_range_lps, u1_mps_state, table_lookup)
856
857
842k
        INC_BIN_COUNT(ps_cab_env);
858
859
842k
        ps_bin_ctxt->u1_mps_state = u1_mps_state;
860
861
842k
        c_Cbp = u4_symbol;
862
863
842k
    }
864
865
842k
    u4_cxt_inc = (!((ps_top_ctxt->u1_cbp >> 3) & 0x01)) << 1;
866
842k
    u4_cxt_inc += !(c_Cbp & 0x01);
867
842k
    ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc;
868
    /*inlining DecodeDecision_onebin without renorm*/
869
870
842k
    {
871
872
842k
        UWORD32 u4_qnt_int_range, u4_int_range_lps;
873
842k
        UWORD32 u4_symbol, u1_mps_state;
874
842k
        UWORD32 table_lookup;
875
842k
        UWORD32 u4_clz;
876
877
842k
        u1_mps_state = (ps_bin_ctxt->u1_mps_state);
878
879
842k
        u4_clz = CLZ(u4_code_int_range);
880
842k
        u4_qnt_int_range = u4_code_int_range << u4_clz;
881
842k
        u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
882
883
842k
        table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
884
842k
        u4_int_range_lps = table_lookup & 0xff;
885
886
842k
        u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
887
842k
        u4_code_int_range = u4_code_int_range - u4_int_range_lps;
888
889
842k
        u4_symbol = ((u1_mps_state >> 6) & 0x1);
890
891
        /*if mps*/
892
842k
        u1_mps_state = (table_lookup >> 8) & 0x7F;
893
894
842k
        CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
895
842k
                     u4_int_range_lps, u1_mps_state, table_lookup)
896
897
842k
        INC_BIN_COUNT(ps_cab_env);
898
899
842k
        ps_bin_ctxt->u1_mps_state = u1_mps_state;
900
901
842k
        c_Cbp |= u4_symbol << 1;
902
903
842k
    }
904
905
842k
    u4_cxt_inc = (!(c_Cbp & 0x01)) << 1;
906
842k
    u4_cxt_inc += !((ps_left_ctxt->u1_cbp >> 3) & 0x01);
907
842k
    ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc;
908
    /*inlining DecodeDecision_onebin without renorm*/
909
910
842k
    {
911
912
842k
        UWORD32 u4_qnt_int_range, u4_int_range_lps;
913
842k
        UWORD32 u4_symbol, u1_mps_state;
914
842k
        UWORD32 table_lookup;
915
842k
        UWORD32 u4_clz;
916
917
842k
        u1_mps_state = (ps_bin_ctxt->u1_mps_state);
918
919
842k
        u4_clz = CLZ(u4_code_int_range);
920
842k
        u4_qnt_int_range = u4_code_int_range << u4_clz;
921
842k
        u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
922
923
842k
        table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
924
842k
        u4_int_range_lps = table_lookup & 0xff;
925
926
842k
        u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
927
842k
        u4_code_int_range = u4_code_int_range - u4_int_range_lps;
928
929
842k
        u4_symbol = ((u1_mps_state >> 6) & 0x1);
930
931
        /*if mps*/
932
842k
        u1_mps_state = (table_lookup >> 8) & 0x7F;
933
934
842k
        CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
935
842k
                     u4_int_range_lps, u1_mps_state, table_lookup)
936
937
842k
        INC_BIN_COUNT(ps_cab_env);
938
939
842k
        ps_bin_ctxt->u1_mps_state = u1_mps_state;
940
941
842k
        c_Cbp |= u4_symbol << 2;
942
943
842k
    }
944
945
842k
    u4_cxt_inc = (!((c_Cbp >> 1) & 0x01)) << 1;
946
842k
    u4_cxt_inc += !((c_Cbp >> 2) & 0x01);
947
842k
    ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc;
948
    /*inlining DecodeDecision_onebin without renorm*/
949
950
842k
    {
951
952
842k
        UWORD32 u4_qnt_int_range, u4_int_range_lps;
953
842k
        UWORD32 u4_symbol, u1_mps_state;
954
842k
        UWORD32 table_lookup;
955
842k
        UWORD32 u4_clz;
956
957
842k
        u1_mps_state = (ps_bin_ctxt->u1_mps_state);
958
959
842k
        u4_clz = CLZ(u4_code_int_range);
960
842k
        u4_qnt_int_range = u4_code_int_range << u4_clz;
961
842k
        u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
962
963
842k
        table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
964
842k
        u4_int_range_lps = table_lookup & 0xff;
965
966
842k
        u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
967
842k
        u4_code_int_range = u4_code_int_range - u4_int_range_lps;
968
969
842k
        u4_symbol = ((u1_mps_state >> 6) & 0x1);
970
971
        /*if mps*/
972
842k
        u1_mps_state = (table_lookup >> 8) & 0x7F;
973
974
842k
        CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
975
842k
                     u4_int_range_lps, u1_mps_state, table_lookup)
976
977
842k
        INC_BIN_COUNT(ps_cab_env);
978
979
842k
        ps_bin_ctxt->u1_mps_state = u1_mps_state;
980
981
842k
        c_Cbp |= u4_symbol << 3;
982
983
842k
    }
984
985
842k
    if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8)
986
0
    {
987
988
0
        RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
989
0
                            pu4_buffer)
990
991
0
    }
992
993
842k
    {
994
842k
        UWORD32 u4_cxt_inc;
995
842k
        WORD8 a, b, c, d;
996
842k
        bin_ctxt_model_t *p_CtxtCbpChroma = ps_dec->p_cbp_chroma_t;
997
998
        /* CBP Chroma, TU, Cmax = 2 */
999
842k
        a = 0;
1000
842k
        b = 0;
1001
842k
        c = 0;
1002
842k
        d = 0;
1003
1004
842k
        {
1005
842k
            a = (ps_top_ctxt->u1_cbp > 15) ? 2 : 0;
1006
842k
            c = (ps_top_ctxt->u1_cbp > 31) ? 2 : 0;
1007
842k
        }
1008
1009
842k
        {
1010
842k
            b = (ps_left_ctxt->u1_cbp > 15) ? 1 : 0;
1011
842k
            d = (ps_left_ctxt->u1_cbp > 31) ? 1 : 0;
1012
842k
        }
1013
842k
        u4_cxt_inc = a + b;
1014
842k
        u4_cxt_inc = (u4_cxt_inc | ((4 + c + d) << 4));
1015
1016
        /*inlining ih264d_decode_bins_tunary */
1017
1018
842k
        {
1019
1020
842k
            UWORD8 u1_max_bins = 2;
1021
842k
            UWORD32 u4_ctx_inc = u4_cxt_inc;
1022
1023
842k
            UWORD32 u4_value;
1024
842k
            UWORD32 u4_symbol;
1025
842k
            UWORD8 u4_ctx_Inc;
1026
842k
            bin_ctxt_model_t *ps_bin_ctxt;
1027
842k
            u4_value = 0;
1028
1029
842k
            do
1030
941k
            {
1031
941k
                u4_ctx_Inc = u4_ctx_inc & 0xF;
1032
941k
                u4_ctx_inc = u4_ctx_inc >> 4;
1033
1034
941k
                ps_bin_ctxt = p_CtxtCbpChroma + u4_ctx_Inc;
1035
                /*inlining DecodeDecision_onebin*/
1036
941k
                {
1037
1038
941k
                    UWORD32 u4_qnt_int_range, u4_int_range_lps;
1039
1040
941k
                    UWORD32 u1_mps_state;
1041
941k
                    UWORD32 table_lookup;
1042
941k
                    UWORD32 u4_clz;
1043
1044
941k
                    u1_mps_state = (ps_bin_ctxt->u1_mps_state);
1045
1046
941k
                    u4_clz = CLZ(u4_code_int_range);
1047
941k
                    u4_qnt_int_range = u4_code_int_range << u4_clz;
1048
941k
                    u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
1049
1050
941k
                    table_lookup = pu4_table[(u1_mps_state << 2)
1051
941k
                                    + u4_qnt_int_range];
1052
941k
                    u4_int_range_lps = table_lookup & 0xff;
1053
1054
941k
                    u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
1055
941k
                    u4_code_int_range = u4_code_int_range - u4_int_range_lps;
1056
1057
941k
                    u4_symbol = ((u1_mps_state >> 6) & 0x1);
1058
1059
                    /*if mps*/
1060
941k
                    u1_mps_state = (table_lookup >> 8) & 0x7F;
1061
1062
941k
                    CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst,
1063
941k
                                 u4_symbol, u4_int_range_lps, u1_mps_state,
1064
941k
                                 table_lookup)
1065
1066
941k
                    if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8)
1067
572
                    {
1068
572
                        RENORM_RANGE_OFFSET(u4_code_int_range,
1069
572
                                            u4_code_int_val_ofst, u4_offset,
1070
572
                                            pu4_buffer)
1071
572
                    }
1072
941k
                    ps_bin_ctxt->u1_mps_state = u1_mps_state;
1073
941k
                }
1074
1075
941k
                INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(
1076
941k
                                ps_cab_env);
1077
1078
941k
                u4_value++;
1079
941k
            }
1080
941k
            while((u4_value < u1_max_bins) & (u4_symbol));
1081
1082
842k
            u4_value = u4_value - 1 + u4_symbol;
1083
1084
842k
            a = (u4_value);
1085
1086
842k
        }
1087
1088
842k
c_Cbp = (c_Cbp | (a << 4));
1089
842k
}
1090
1091
842k
ps_bitstrm->u4_ofst = u4_offset;
1092
1093
842k
ps_cab_env->u4_code_int_range = u4_code_int_range;
1094
842k
ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
1095
1096
842k
return (c_Cbp);
1097
842k
}
1098
1099
/*!
1100
 **************************************************************************
1101
 * \if Function name : ih264d_get_mvd_cabac \endif
1102
 *
1103
 * \brief
1104
 *    This function decodes Horz and Vert mvd_l0 and mvd_l1 using CABAC entropy
1105
 *    coding mode as defined in 9.3.2.3.
1106
 *
1107
 * \return
1108
 *    None
1109
 *
1110
 **************************************************************************
1111
 */
1112
void ih264d_get_mvd_cabac(UWORD8 u1_sub_mb,
1113
                          UWORD8 u1_b2,
1114
                          UWORD8 u1_part_wd,
1115
                          UWORD8 u1_part_ht,
1116
                          UWORD8 u1_dec_mvd,
1117
                          dec_struct_t *ps_dec,
1118
                          mv_pred_t *ps_mv)
1119
1.59M
{
1120
1.59M
    UWORD8 u1_abs_mvd_x = 0, u1_abs_mvd_y = 0;
1121
1.59M
    UWORD8 u1_sub_mb_x, u1_sub_mb_y;
1122
1.59M
    UWORD8 *pu1_top_mv_ctxt, *pu1_lft_mv_ctxt;
1123
1.59M
    WORD16 *pi2_mv;
1124
1125
1.59M
    u1_sub_mb_x = (UWORD8)(u1_sub_mb & 0x03);
1126
1.59M
    u1_sub_mb_y = (UWORD8)(u1_sub_mb >> 2);
1127
1.59M
    pu1_top_mv_ctxt = &ps_dec->ps_curr_ctxt_mb_info->u1_mv[u1_sub_mb_x][u1_b2];
1128
1.59M
    pu1_lft_mv_ctxt = &ps_dec->pu1_left_mv_ctxt_inc[u1_sub_mb_y][u1_b2];
1129
1.59M
    pi2_mv = &ps_mv->i2_mv[u1_b2];
1130
1131
1.59M
    if(u1_dec_mvd)
1132
1.25M
    {
1133
1.25M
        WORD16 i2_mv_x, i2_mv_y;
1134
1.25M
        WORD32 i2_temp;
1135
1.25M
        {
1136
1.25M
            decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
1137
1.25M
            dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
1138
1.25M
            UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a,
1139
1.25M
                            u2_abs_mvd_y_b;
1140
1141
1.25M
            u2_abs_mvd_x_b = (UWORD16)pu1_top_mv_ctxt[0];
1142
1.25M
            u2_abs_mvd_y_b = (UWORD16)pu1_top_mv_ctxt[1];
1143
1.25M
            u2_abs_mvd_x_a = (UWORD16)pu1_lft_mv_ctxt[0];
1144
1.25M
            u2_abs_mvd_y_a = (UWORD16)pu1_lft_mv_ctxt[1];
1145
1146
1.25M
            i2_temp = u2_abs_mvd_x_a + u2_abs_mvd_x_b;
1147
1148
1.25M
            i2_mv_x = ih264d_parse_mvd_cabac(ps_bitstrm, ps_cab_env,
1149
1.25M
                                             ps_dec->p_mvd_x_t, i2_temp);
1150
1151
1.25M
            i2_temp = u2_abs_mvd_y_a + u2_abs_mvd_y_b;
1152
1153
1.25M
            i2_mv_y = ih264d_parse_mvd_cabac(ps_bitstrm, ps_cab_env,
1154
1.25M
                                             ps_dec->p_mvd_y_t, i2_temp);
1155
1.25M
        }
1156
1157
        /***********************************************************************/
1158
        /* Store the abs_mvd_values in cabac contexts                          */
1159
        /* The follownig code can be easily optimzed if mvX, mvY clip values   */
1160
        /* are packed in 16 bits follwed by memcpy                             */
1161
        /***********************************************************************/
1162
1.25M
        u1_abs_mvd_x = CLIP3(0, 127, ABS(i2_mv_x));
1163
1.25M
        u1_abs_mvd_y = CLIP3(0, 127, ABS(i2_mv_y));
1164
1165
1.25M
        COPYTHECONTEXT("MVD", i2_mv_x);COPYTHECONTEXT("MVD", i2_mv_y);
1166
1167
        /* Storing Mv residuals */
1168
1.25M
        pi2_mv[0] = i2_mv_x;
1169
1.25M
        pi2_mv[1] = i2_mv_y;
1170
1.25M
    }
1171
1172
    /***************************************************************/
1173
    /* Store abs_mvd_values cabac contexts                         */
1174
    /***************************************************************/
1175
1.59M
    {
1176
1.59M
        UWORD8 u1_i;
1177
5.62M
        for(u1_i = 0; u1_i < u1_part_wd; u1_i++, pu1_top_mv_ctxt += 4)
1178
4.02M
        {
1179
4.02M
            pu1_top_mv_ctxt[0] = u1_abs_mvd_x;
1180
4.02M
            pu1_top_mv_ctxt[1] = u1_abs_mvd_y;
1181
4.02M
        }
1182
1183
5.13M
        for(u1_i = 0; u1_i < u1_part_ht; u1_i++, pu1_lft_mv_ctxt += 4)
1184
3.53M
        {
1185
3.53M
            pu1_lft_mv_ctxt[0] = u1_abs_mvd_x;
1186
3.53M
            pu1_lft_mv_ctxt[1] = u1_abs_mvd_y;
1187
3.53M
        }
1188
1.59M
    }
1189
1.59M
}
1190
1191
/*****************************************************************************/
1192
/*                                                                           */
1193
/*  Function Name : ih264d_parse_mvd_cabac                                                  */
1194
/*                                                                           */
1195
/*  Description   : This cabac function decodes the mvd in a given direction */
1196
/*                  direction ( x or y ) as defined in 9.3.2.3.              */
1197
/*                                                                           */
1198
/*  Inputs        : 1. pointer to Bitstream                                  */
1199
/*                  2. pointer to cabac decoding environmnet                 */
1200
/*                  3. pointer to Mvd context                                */
1201
/*                  4. abs(Top mvd) = u2_abs_mvd_b                           */
1202
/*                  5. abs(left mvd)= u2_abs_mvd_a                           */
1203
/*                                                                           */
1204
/*  Processing    : see section 9.3.2.3 of the standard                      */
1205
/*                                                                           */
1206
/*  Outputs       : i2_mvd                                                   */
1207
/*  Returns       : i2_mvd                                                   */
1208
/*                                                                           */
1209
/*  Issues        : none                                                     */
1210
/*                                                                           */
1211
/*  Revision History:                                                        */
1212
/*                                                                           */
1213
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1214
/*         16 06 2005   Jay          Draft                                   */
1215
/*                                                                           */
1216
/*****************************************************************************/
1217
WORD16 ih264d_parse_mvd_cabac(dec_bit_stream_t * ps_bitstrm,
1218
                              decoding_envirnoment_t * ps_cab_env,
1219
                              bin_ctxt_model_t * p_ctxt_mvd,
1220
                              UWORD32 i4_temp)
1221
1222
2.50M
{
1223
2.50M
    WORD8 k;
1224
2.50M
    WORD16 i2_suf;
1225
2.50M
    WORD16 i2_mvd;
1226
2.50M
    UWORD16 u2_abs_mvd;
1227
2.50M
    UWORD32 u4_ctx_inc;
1228
2.50M
    UWORD32 u4_prefix;
1229
2.50M
    const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
1230
2.50M
    UWORD32 u4_code_int_range, u4_code_int_val_ofst;
1231
1232
    /*  if mvd < 9                                                  */
1233
    /*  mvd =  Prefix                                                   */
1234
    /*  else                                                            */
1235
    /*  mvd = Prefix + Suffix                                           */
1236
    /*  decode sign bit                                                 */
1237
    /*  Prefix TU decoding Cmax =Ucoff and Suffix 3rd order Exp-Golomb  */
1238
1239
2.50M
    u2_abs_mvd = (UWORD16)i4_temp;
1240
2.50M
    u4_ctx_inc = 1;
1241
1242
2.50M
    if(u2_abs_mvd < 3)
1243
1.73M
        u4_ctx_inc = 0;
1244
767k
    else if(u2_abs_mvd > 32)
1245
47.7k
        u4_ctx_inc = 2;
1246
1247
2.50M
    u4_ctx_inc = (u4_ctx_inc | 0x65430);
1248
1249
    /*inlining modified version of ih264d_decode_bins_unary*/
1250
1251
2.50M
    {
1252
2.50M
        UWORD8 u1_max_bins = 9;
1253
2.50M
        UWORD32 u4_value;
1254
2.50M
        UWORD32 u4_symbol;
1255
2.50M
        bin_ctxt_model_t *ps_bin_ctxt;
1256
2.50M
        UWORD32 u4_ctx_Inc;
1257
1258
2.50M
        u4_value = 0;
1259
2.50M
        u4_code_int_range = ps_cab_env->u4_code_int_range;
1260
2.50M
        u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
1261
1262
2.50M
        do
1263
5.89M
        {
1264
5.89M
            u4_ctx_Inc = u4_ctx_inc & 0xf;
1265
5.89M
            u4_ctx_inc = u4_ctx_inc >> 4;
1266
1267
5.89M
            ps_bin_ctxt = p_ctxt_mvd + u4_ctx_Inc;
1268
1269
5.89M
            DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range,
1270
5.89M
                                 u4_code_int_val_ofst, pu4_table, ps_bitstrm,
1271
5.89M
                                 u4_symbol)
1272
1273
5.89M
            INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
1274
1275
5.89M
            u4_value++;
1276
1277
5.89M
        }
1278
5.89M
        while(u4_symbol && u4_value < 5);
1279
1280
2.50M
        ps_bin_ctxt = p_ctxt_mvd + 6;
1281
1282
2.50M
        if(u4_symbol && (u4_value < u1_max_bins))
1283
430k
        {
1284
1285
430k
            do
1286
1.58M
            {
1287
1288
1.58M
                DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range,
1289
1.58M
                                     u4_code_int_val_ofst, pu4_table,
1290
1.58M
                                     ps_bitstrm, u4_symbol)
1291
1292
1.58M
                INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
1293
1.58M
                u4_value++;
1294
1.58M
            }
1295
1.58M
            while(u4_symbol && (u4_value < u1_max_bins));
1296
1297
430k
        }
1298
1299
2.50M
        ps_cab_env->u4_code_int_range = u4_code_int_range;
1300
2.50M
        ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
1301
2.50M
        u4_value = u4_value - 1 + u4_symbol;
1302
2.50M
        u4_prefix = (u4_value);
1303
2.50M
    }
1304
1305
2.50M
    i2_mvd = u4_prefix;
1306
1307
2.50M
    if(i2_mvd == 9)
1308
358k
    {
1309
        /* Read Suffix */
1310
358k
        k = ih264d_decode_bypass_bins_unary(ps_cab_env, ps_bitstrm);
1311
358k
        i2_suf = (k > 15) ? INT16_MAX : ((1 << k) - 1);
1312
358k
        k = k + 3;
1313
358k
        i2_suf = (i2_suf << 3);
1314
358k
        i2_mvd += i2_suf;
1315
358k
        i2_suf = ih264d_decode_bypass_bins(ps_cab_env, k, ps_bitstrm);
1316
358k
        i2_mvd += i2_suf;
1317
358k
    }
1318
    /* Read Sign bit */
1319
2.50M
    if(!i2_mvd)
1320
1.25M
        return (i2_mvd);
1321
1322
1.24M
    else
1323
1.24M
    {
1324
1.24M
        UWORD32 u4_code_int_val_ofst, u4_code_int_range;
1325
1326
1.24M
        u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
1327
1.24M
        u4_code_int_range = ps_cab_env->u4_code_int_range;
1328
1329
1.24M
        if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
1330
23.8k
        {
1331
23.8k
            UWORD32 *pu4_buffer, u4_offset;
1332
1333
23.8k
            pu4_buffer = ps_bitstrm->pu4_buffer;
1334
23.8k
            u4_offset = ps_bitstrm->u4_ofst;
1335
1336
23.8k
            RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst,
1337
23.8k
                                u4_offset, pu4_buffer)
1338
23.8k
            ps_bitstrm->u4_ofst = u4_offset;
1339
23.8k
        }
1340
1341
1.24M
        u4_code_int_range = u4_code_int_range >> 1;
1342
1343
1.24M
        if(u4_code_int_val_ofst >= u4_code_int_range)
1344
331k
        {
1345
            /* S=1 */
1346
331k
            u4_code_int_val_ofst -= u4_code_int_range;
1347
331k
            i2_mvd = (-i2_mvd);
1348
331k
        }
1349
1350
1.24M
        ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
1351
1.24M
        ps_cab_env->u4_code_int_range = u4_code_int_range;
1352
1353
1.24M
        return (i2_mvd);
1354
1355
1.24M
    }
1356
2.50M
}