Coverage Report

Created: 2026-07-16 06:20

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.49M
{
71
1.49M
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
72
1.49M
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
73
1.49M
    ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
74
1.49M
    ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
75
1.49M
    bin_ctxt_model_t *ps_mb_bin_ctxt = ps_dec->p_mb_type_t;
76
1.49M
    WORD8 u1_mb_type, u1_bin;
77
1.49M
    UWORD32 u4_cxt_inc;
78
79
1.49M
    u4_cxt_inc = 0;
80
1.49M
    if(!u1_inter)
81
1.44M
    {
82
1.44M
        if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info)
83
1.38M
            u4_cxt_inc += ((ps_left_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0);
84
1.44M
        if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info)
85
1.29M
            u4_cxt_inc += ((ps_top_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0);
86
1.44M
    }
87
50.1k
    else
88
50.1k
    {
89
50.1k
        ps_mb_bin_ctxt = ps_mb_bin_ctxt + 3 + (ps_dec->u1_B << 1);
90
50.1k
    }
91
92
    /* b0 */
93
1.49M
    u1_mb_type = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
94
1.49M
                                          ps_cab_env);
95
1.49M
    if(u1_mb_type)
96
1.05M
    {
97
        /* I16x16 or I_PCM mode */
98
        /* b1 */
99
1.05M
        u1_bin = ih264d_decode_terminate(ps_cab_env, ps_bitstrm);
100
1.05M
        if(u1_bin == 0)
101
1.05M
        {
102
            /* I16x16 mode */
103
            /* Read b2 and b3 */
104
1.05M
            u4_cxt_inc = (u1_inter) ? 0x021 : 0x043;
105
106
1.05M
            u1_bin = ih264d_decode_bins(2, u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
107
1.05M
                                        ps_cab_env);
108
109
1.05M
            if(u1_bin & 0x01)
110
21.2k
                u1_mb_type += 4;
111
112
1.05M
            if(u1_bin & 0x02)
113
39.7k
                u1_mb_type += 12;
114
115
1.05M
            if(u1_bin & 0x01)
116
21.2k
            {
117
                /* since b3=1, Read three bins */
118
21.2k
                u4_cxt_inc = (u1_inter) ? 0x0332 : 0x0765;
119
21.2k
                u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc, ps_mb_bin_ctxt,
120
21.2k
                                                    ps_bitstrm, ps_cab_env);
121
122
21.2k
            }
123
1.03M
            else
124
1.03M
            {
125
                /* Read two bins */
126
1.03M
                u4_cxt_inc = (u1_inter) ? 0x033 : 0x076;
127
1.03M
                u1_bin = (UWORD8)ih264d_decode_bins(2, u4_cxt_inc, ps_mb_bin_ctxt,
128
1.03M
                                                    ps_bitstrm, ps_cab_env);
129
1.03M
            }
130
1.05M
            u1_mb_type += u1_bin;
131
1.05M
        }
132
2.45k
        else
133
2.45k
        {
134
            /* I_PCM mode */
135
            /* b1=1 */
136
2.45k
            u1_mb_type = 25;
137
2.45k
        }
138
1.05M
    }
139
1.49M
    return (u1_mb_type);
140
1.49M
}
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
482k
{
156
482k
    const UWORD8 uc_slice_type = ps_dec->ps_cur_slice->u1_slice_type;
157
482k
    decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env;
158
482k
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
159
482k
    ctxt_inc_mb_info_t *ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
160
482k
    ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
161
482k
    WORD8 c_ctxt_inc;
162
482k
    bin_ctxt_model_t *ps_mb_bin_ctxt = ps_dec->p_mb_type_t;
163
482k
    WORD8 u1_mb_type = 0, u1_bin;
164
482k
    UWORD32 u4_cxt_inc;
165
166
482k
    INC_SYM_COUNT(ps_cab_env);
167
168
482k
    c_ctxt_inc = 0;
169
170
482k
    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
482k
    else if(uc_slice_type == P_SLICE)
192
296k
    {
193
        /* P Slice */
194
        /* b0 */
195
296k
        u4_cxt_inc = 0;
196
296k
        u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
197
296k
                                           ps_cab_env);
198
296k
        if(!u1_bin)
199
248k
        {
200
            /* Inter MB types */
201
            /* b1 */
202
248k
            u4_cxt_inc = 0x01;
203
248k
            u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
204
248k
                                               ps_bitstrm, ps_cab_env);
205
            /* b2 */
206
248k
            u4_cxt_inc = u1_bin + 2;
207
248k
            u1_mb_type = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
208
248k
                                                  ps_bitstrm, ps_cab_env);
209
248k
            u1_mb_type = (u1_bin << 1) + u1_mb_type;
210
248k
            if(u1_mb_type)
211
155k
                u1_mb_type = 4 - u1_mb_type;
212
248k
        }
213
47.7k
        else
214
47.7k
        {
215
            /* Intra Prefix 1 found */
216
            /* Intra MB type */
217
47.7k
            u1_mb_type = 5 + ih264d_parse_mb_type_intra_cabac(1, ps_dec);
218
47.7k
        }
219
296k
    }
220
186k
    else if(uc_slice_type == B_SLICE)
221
186k
    {
222
186k
        WORD8 a, b;
223
        /* B Slice */
224
        /* b0 */
225
        /* a = b = 0, if B slice and MB is a SKIP or B_DIRECT16x16 */
226
186k
        a = 0;
227
186k
        b = 0;
228
186k
        u1_mb_type = 0;
229
186k
        if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info)
230
166k
            a = ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16);
231
186k
        if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info)
232
144k
            b = ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16);
233
234
186k
        u4_cxt_inc = a + b;
235
236
186k
        u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
237
186k
                                           ps_cab_env);
238
239
186k
        if(u1_bin)
240
178k
        {
241
242
            /* b1 */
243
178k
            u4_cxt_inc = 0x03;
244
178k
            u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
245
178k
                                               ps_bitstrm, ps_cab_env);
246
247
178k
            if(!u1_bin)
248
49.0k
            {
249
                /* b2 */
250
49.0k
                u4_cxt_inc = 0x05;
251
49.0k
                u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
252
49.0k
                                                   ps_bitstrm, ps_cab_env);
253
254
49.0k
                u1_mb_type = u1_bin + 1;
255
49.0k
            }
256
129k
            else
257
129k
            {
258
129k
                u1_mb_type = 3;
259
                /* b2 */
260
129k
                u4_cxt_inc = 0x04;
261
129k
                u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
262
129k
                                                   ps_bitstrm, ps_cab_env);
263
264
129k
                if(u1_bin)
265
98.8k
                {
266
98.8k
                    u1_mb_type += 8;
267
                    /* b3 */
268
98.8k
                    u4_cxt_inc = 0x05;
269
98.8k
                    u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
270
98.8k
                                                       ps_bitstrm, ps_cab_env);
271
272
98.8k
                    if(!u1_bin)
273
34.7k
                    {
274
34.7k
                        u1_mb_type++;
275
                        /* b4, b5, b6 */
276
34.7k
                        u4_cxt_inc = 0x0555;
277
34.7k
                        u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc,
278
34.7k
                                                            ps_mb_bin_ctxt,
279
34.7k
                                                            ps_bitstrm,
280
34.7k
                                                            ps_cab_env);
281
282
283
284
34.7k
                        u1_mb_type += u1_bin;
285
34.7k
                    }
286
64.0k
                    else
287
64.0k
                    {
288
                        /* b4 */
289
64.0k
                        u4_cxt_inc = 0x05;
290
64.0k
                        u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc,
291
64.0k
                                                           ps_mb_bin_ctxt,
292
64.0k
                                                           ps_bitstrm,
293
64.0k
                                                           ps_cab_env);
294
295
64.0k
                        if(u1_bin)
296
57.6k
                        {
297
                            /* b5 */
298
57.6k
                            u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc,
299
57.6k
                                                               ps_mb_bin_ctxt,
300
57.6k
                                                               ps_bitstrm,
301
57.6k
                                                               ps_cab_env);
302
303
57.6k
                            u1_mb_type += (u1_bin ? 11 : 0);
304
57.6k
                        }
305
6.40k
                        else
306
6.40k
                        {
307
6.40k
                            u1_mb_type = 20;
308
                            /* b5 */
309
6.40k
                            u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc,
310
6.40k
                                                               ps_mb_bin_ctxt,
311
6.40k
                                                               ps_bitstrm,
312
6.40k
                                                               ps_cab_env);
313
314
6.40k
                            if(!u1_bin)
315
4.06k
                            {
316
                                /* b6 */
317
4.06k
                                u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc,
318
4.06k
                                                                   ps_mb_bin_ctxt,
319
4.06k
                                                                   ps_bitstrm,
320
4.06k
                                                                   ps_cab_env);
321
322
4.06k
                                u1_mb_type += u1_bin;
323
4.06k
                            }
324
2.33k
                            else
325
2.33k
                            {
326
                                /* Intra Prefix 111101 found */
327
                                /* Intra MB type */
328
2.33k
                                u1_mb_type =
329
2.33k
                                                23
330
2.33k
                                                                + ih264d_parse_mb_type_intra_cabac(
331
2.33k
                                                                                1,
332
2.33k
                                                                                ps_dec);
333
2.33k
                            }
334
6.40k
                        }
335
64.0k
                    }
336
98.8k
                }
337
30.9k
                else
338
30.9k
                {
339
                    /* b3, b4, b5 */
340
30.9k
                    u4_cxt_inc = 0x0555;
341
30.9k
                    u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc,
342
30.9k
                                                        ps_mb_bin_ctxt, ps_bitstrm,
343
30.9k
                                                        ps_cab_env);
344
345
346
347
348
30.9k
                    u1_mb_type += u1_bin;
349
30.9k
                }
350
129k
            }
351
178k
        }
352
186k
    }
353
482k
    return ((UWORD32)u1_mb_type);
354
482k
}
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
390k
{
373
390k
    WORD8 u1_sub_mb_type, u1_bin;
374
375
390k
    INC_SYM_COUNT(ps_cab_env);
376
377
390k
    u1_sub_mb_type = 0;
378
390k
    u1_bin = (UWORD8)ih264d_decode_bin(0, ps_sub_mb_cxt, ps_bitstrm,
379
390k
                                       ps_cab_env);
380
381
390k
    if(u1_slc_type_b ^ u1_bin)
382
107k
        return 0;
383
384
282k
    if(!u1_slc_type_b)
385
84.9k
    {
386
        /* P Slice */
387
84.9k
        u1_sub_mb_type = 1;
388
84.9k
        u1_bin = (UWORD8)ih264d_decode_bin(1, ps_sub_mb_cxt, ps_bitstrm,
389
84.9k
                                           ps_cab_env);
390
84.9k
        if(u1_bin == 1)
391
61.5k
        {
392
61.5k
            u1_bin = (UWORD8)ih264d_decode_bin(2, ps_sub_mb_cxt, ps_bitstrm,
393
61.5k
                                               ps_cab_env);
394
61.5k
            u1_sub_mb_type = (2 + (!u1_bin));
395
61.5k
        }
396
397
84.9k
        return u1_sub_mb_type;
398
84.9k
    }
399
197k
    else
400
197k
    {
401
        /* B Slice */
402
403
        /* b1 */
404
197k
        u1_bin = (UWORD8)ih264d_decode_bin(1, ps_sub_mb_cxt, ps_bitstrm,
405
197k
                                           ps_cab_env);
406
197k
        if(u1_bin)
407
109k
        {
408
            /* b2 */
409
109k
            u1_bin = (UWORD8)ih264d_decode_bin(2, ps_sub_mb_cxt, ps_bitstrm,
410
109k
                                               ps_cab_env);
411
109k
            if(u1_bin)
412
8.90k
            {
413
                /* b3 */
414
8.90k
                u1_sub_mb_type = 7;
415
8.90k
                u1_bin = (UWORD8)ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm,
416
8.90k
                                                   ps_cab_env);
417
8.90k
                u1_sub_mb_type += u1_bin << 2;
418
8.90k
                u1_bin = !u1_bin;
419
                /* b4 */
420
8.90k
                if(u1_bin == 0)
421
5.48k
                {
422
5.48k
                    u1_bin = ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm,
423
5.48k
                                               ps_cab_env);
424
5.48k
                }
425
3.42k
                else
426
3.42k
                {
427
3.42k
                    u1_bin = (UWORD8)ih264d_decode_bins(2, 0x33, ps_sub_mb_cxt,
428
3.42k
                                                        ps_bitstrm, ps_cab_env);
429
3.42k
                }
430
431
8.90k
                return (u1_sub_mb_type + u1_bin);
432
8.90k
            }
433
100k
            else
434
100k
            {
435
                /* b3 */
436
100k
                u1_bin = (UWORD8)ih264d_decode_bins(2, 0x33, ps_sub_mb_cxt,
437
100k
                                                    ps_bitstrm, ps_cab_env);
438
100k
                return (3 + u1_bin);
439
100k
            }
440
109k
        }
441
87.8k
        else
442
87.8k
        {
443
            /* b2 */
444
87.8k
            u1_bin = (UWORD8)ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm,
445
87.8k
                                               ps_cab_env);
446
87.8k
            return (1 + u1_bin);
447
87.8k
        }
448
197k
    }
449
282k
}
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
519k
{
474
519k
    UWORD8 u1_a, u1_b;
475
519k
    UWORD32 u4_cxt_inc;
476
519k
    UWORD8 u1_blk_no, u1_i, u1_idx_lft, u1_idx_top;
477
519k
    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.13M
    {
481
1.13M
        u1_idx_lft = ((u1_blk_no & 0x02) >> 1) + u1_b2;
482
1.13M
        u1_idx_top = (u1_blk_no & 0x01) + u1_b2;
483
1.13M
        i1_ref_idx = *pi1_ref_idx;
484
485
1.13M
        if(i1_ref_idx > 0)
486
607k
        {
487
607k
            u1_a = pi1_lft_cxt[u1_idx_lft] > 0;
488
607k
            u1_b = pi1_top_cxt[u1_idx_top] > 0;
489
490
607k
            u4_cxt_inc = u1_a + (u1_b << 1);
491
607k
            u4_cxt_inc = (u4_cxt_inc | 0x55540);
492
493
607k
            i1_ref_idx = (WORD8)ih264d_decode_bins_unary(32, u4_cxt_inc,
494
607k
                                                         ps_ref_cxt, ps_bitstrm,
495
607k
                                                         ps_cab_env);
496
497
607k
            if((i1_ref_idx > u1_max_ref_minus1) || (i1_ref_idx < 0))
498
835
            {
499
835
                return ERROR_REF_IDX;
500
835
            }
501
502
606k
            *pi1_ref_idx = i1_ref_idx;
503
504
606k
            INC_SYM_COUNT(ps_cab_env);
505
506
606k
        }
507
508
        /* Storing Reference Idx Information */
509
1.13M
        pi1_lft_cxt[u1_idx_lft] = i1_ref_idx;
510
1.13M
        pi1_top_cxt[u1_idx_top] = i1_ref_idx;
511
1.13M
        u1_blk_no = u1_blk_no + 1 + (u1_mb_mode & 0x01);
512
1.13M
    }
513
    /* if(!u1_sub_mb) */
514
518k
    if(u1_num_part != 4)
515
391k
    {
516
391k
        pi1_lft_cxt[(!(u1_mb_mode & 0x1)) + u1_b2] = pi1_lft_cxt[u1_b2];
517
391k
        pi1_top_cxt[(!(u1_mb_mode & 0x2)) + u1_b2] = pi1_top_cxt[u1_b2];
518
391k
    }
519
518k
    return OK;
520
519k
}
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.52M
{
537
1.52M
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
538
1.52M
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
539
540
1.52M
    UWORD8 u1_code_num;
541
1.52M
    bin_ctxt_model_t *ps_mb_qp_delta_ctxt = ps_dec->p_mb_qp_delta_t;
542
1.52M
    UWORD32 u4_cxt_inc;
543
544
1.52M
    INC_SYM_COUNT(ps_cab_env);
545
546
1.52M
    u4_cxt_inc = (!(!(ps_dec->i1_prev_mb_qp_delta)));
547
548
1.52M
    u1_code_num = 0;
549
1.52M
    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.52M
    u1_code_num = ih264d_decode_bins_unary(32, u4_cxt_inc, ps_mb_qp_delta_ctxt,
553
1.52M
                                          ps_bitstrm, ps_cab_env);
554
1.52M
    if(u1_code_num == 32)
555
1.30k
    {
556
        /* Read remaining 21 bins */
557
1.30k
        UWORD8 uc_codeNumX;
558
1.30k
        u4_cxt_inc = 0x33333;
559
1.30k
        uc_codeNumX = ih264d_decode_bins_unary(21, u4_cxt_inc, ps_mb_qp_delta_ctxt,
560
1.30k
                                               ps_bitstrm, ps_cab_env);
561
1.30k
        u1_code_num = u1_code_num + uc_codeNumX;
562
1.30k
    }
563
564
1.52M
    *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.52M
    if(!(u1_code_num & 0x01))
567
1.18M
        *pi1_mb_qp_delta = -(*pi1_mb_qp_delta);
568
569
    /* Range of MbQpDelta= -26 to +25 inclusive */
570
1.52M
    if((*pi1_mb_qp_delta < -26) || (*pi1_mb_qp_delta > 25))
571
868
        return ERROR_INV_RANGE_QP_T;
572
1.52M
    ps_dec->i1_prev_mb_qp_delta = *pi1_mb_qp_delta;
573
1.52M
    return OK;
574
1.52M
}
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.49M
{
589
1.49M
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
590
1.49M
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
591
1.49M
    ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
592
1.49M
    ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
593
1.49M
    WORD8 i1_chroma_pred_mode, a, b;
594
1.49M
    UWORD32 u4_cxt_inc;
595
596
1.49M
    INC_SYM_COUNT(ps_cab_env);
597
598
    /* Binarization is TU and Cmax=3 */
599
1.49M
    i1_chroma_pred_mode = 0;
600
1.49M
    a = 0;
601
1.49M
    b = 0;
602
603
1.49M
    a = ((ps_left_ctxt->u1_intra_chroma_pred_mode != 0) ? 1 : 0);
604
605
1.49M
    b = ((ps_top_ctxt->u1_intra_chroma_pred_mode != 0) ? 1 : 0);
606
1.49M
    u4_cxt_inc = a + b;
607
608
1.49M
    u4_cxt_inc = (u4_cxt_inc | 0x330);
609
610
1.49M
    i1_chroma_pred_mode = ih264d_decode_bins_tunary(
611
1.49M
                    3, u4_cxt_inc, ps_dec->p_intra_chroma_pred_mode_t,
612
1.49M
                    ps_bitstrm, ps_cab_env);
613
614
1.49M
    return (i1_chroma_pred_mode);
615
1.49M
}
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
152k
{
636
152k
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
637
152k
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
638
152k
    ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
639
152k
    ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
640
152k
    UWORD8 u1_transform_8x8flag;
641
152k
    UWORD8 u1_mb_ngbr_avail = ps_cur_mb_info->u1_mb_ngbr_availablity;
642
643
152k
    WORD8 a, b;
644
152k
    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
152k
    a = 0;
651
152k
    b = 0;
652
653
152k
    if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK)
654
124k
    {
655
124k
        a = ps_left_ctxt->u1_transform8x8_ctxt;
656
124k
    }
657
152k
    if(u1_mb_ngbr_avail & TOP_MB_AVAILABLE_MASK)
658
120k
    {
659
120k
        b = ps_top_ctxt->u1_transform8x8_ctxt;
660
661
120k
    }
662
663
152k
    u4_cxt_inc = a + b;
664
665
152k
    u1_transform_8x8flag = ih264d_decode_bin(
666
152k
                    u4_cxt_inc, ps_dec->s_high_profile.ps_transform8x8_flag,
667
152k
                    ps_bitstrm, ps_cab_env);
668
669
152k
    return (u1_transform_8x8flag);
670
152k
}
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
441k
{
696
441k
    WORD32 i4x4_luma_blk_idx = 0;
697
441k
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
698
441k
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
699
441k
    bin_ctxt_model_t *ps_ctxt_ipred_luma_mpm, *ps_ctx_ipred_luma_rm;
700
441k
    WORD32 i4_rem_intra4x4_pred_mode;
701
441k
    UWORD32 u4_prev_intra4x4_pred_mode_flag;
702
441k
    UWORD32 u4_code_int_range, u4_code_int_val_ofst;
703
441k
    const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
704
705
441k
    ps_ctxt_ipred_luma_mpm = ps_dec->p_prev_intra4x4_pred_mode_flag_t;
706
441k
    ps_ctx_ipred_luma_rm = ps_dec->p_rem_intra4x4_pred_mode_t;
707
441k
    SWITCHOFFTRACE;
708
709
441k
    i4x4_luma_blk_idx = (0 == u1_tran_form8x8) ? 16 : 4;
710
711
441k
    u4_code_int_range = ps_cab_env->u4_code_int_range;
712
441k
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
713
714
441k
    do
715
6.28M
    {
716
717
6.28M
        DECODE_ONE_BIN_MACRO(ps_ctxt_ipred_luma_mpm, u4_code_int_range,
718
6.28M
                             u4_code_int_val_ofst, pu4_table, ps_bitstrm,
719
6.28M
                             u4_prev_intra4x4_pred_mode_flag)
720
6.28M
        *pu1_prev_intra4x4_pred_mode_flag = u4_prev_intra4x4_pred_mode_flag;
721
722
6.28M
        i4_rem_intra4x4_pred_mode = -1;
723
6.28M
        if(!u4_prev_intra4x4_pred_mode_flag)
724
426k
        {
725
726
            /*inlining DecodeDecisionBins_FLC*/
727
728
426k
            {
729
730
426k
                UWORD8 u1_max_bins = 3;
731
426k
                UWORD32 u4_value;
732
426k
                UWORD32 u4_symbol, i;
733
734
426k
                i = 0;
735
426k
                u4_value = 0;
736
737
426k
                do
738
1.27M
                {
739
740
1.27M
                    DECODE_ONE_BIN_MACRO(ps_ctx_ipred_luma_rm, u4_code_int_range,
741
1.27M
                                         u4_code_int_val_ofst, pu4_table,
742
1.27M
                                         ps_bitstrm, u4_symbol)
743
744
1.27M
                    INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
745
746
1.27M
                    u4_value = u4_value | (u4_symbol << i);
747
748
1.27M
                    i++;
749
1.27M
                }
750
1.27M
                while(i < u1_max_bins);
751
752
426k
                i4_rem_intra4x4_pred_mode = (u4_value);
753
754
426k
            }
755
756
426k
        }
757
758
6.28M
        (*pu1_rem_intra4x4_pred_mode) = i4_rem_intra4x4_pred_mode;
759
760
6.28M
        COPYTHECONTEXT("intra4x4_pred_mode", i4_rem_intra4x4_pred_mode);
761
762
6.28M
        pu1_prev_intra4x4_pred_mode_flag++;
763
6.28M
        pu1_rem_intra4x4_pred_mode++;
764
765
6.28M
        i4x4_luma_blk_idx--;
766
6.28M
    }
767
6.28M
    while(i4x4_luma_blk_idx);
768
769
441k
    ps_cab_env->u4_code_int_range = u4_code_int_range;
770
441k
    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
771
772
441k
    return (0);
773
774
441k
}
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
904k
{
791
792
904k
    UWORD32 u4_cxt_inc;
793
904k
    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
794
904k
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
795
904k
    ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
796
904k
    ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
797
904k
    bin_ctxt_model_t *ps_ctxt_cbp_luma = ps_dec->p_cbp_luma_t, *ps_bin_ctxt;
798
904k
    WORD8 c_Cbp; //,i,j;
799
904k
    UWORD32 u4_code_int_range, u4_code_int_val_ofst;
800
904k
    UWORD32 u4_offset, *pu4_buffer;
801
904k
    const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
802
803
904k
    INC_SYM_COUNT(ps_cab_env);
804
805
806
807
    /* CBP Luma, FL, Cmax = 15, L = 4 */
808
904k
    u4_cxt_inc = (!((ps_top_ctxt->u1_cbp >> 2) & 0x01)) << 1;
809
904k
    u4_cxt_inc += !((ps_left_ctxt->u1_cbp >> 1) & 0x01);
810
811
904k
    u4_offset = ps_bitstrm->u4_ofst;
812
904k
    pu4_buffer = ps_bitstrm->pu4_buffer;
813
814
904k
    u4_code_int_range = ps_cab_env->u4_code_int_range;
815
904k
    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
904k
    {
818
904k
        UWORD32 u4_clz, read_bits;
819
820
904k
        u4_clz = CLZ(u4_code_int_range);
821
904k
        FLUSHBITS(u4_offset, u4_clz)
822
904k
        NEXTBITS(read_bits, u4_offset, pu4_buffer, 23)
823
904k
        u4_code_int_range = u4_code_int_range << u4_clz;
824
904k
        u4_code_int_val_ofst = (u4_code_int_val_ofst << u4_clz) | read_bits;
825
904k
    }
826
827
904k
    ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc;
828
829
    /*inlining DecodeDecision_onebin without renorm*/
830
904k
    {
831
832
904k
        UWORD32 u4_qnt_int_range, u4_int_range_lps;
833
904k
        UWORD32 u4_symbol, u1_mps_state;
834
904k
        UWORD32 table_lookup;
835
904k
        UWORD32 u4_clz;
836
837
904k
        u1_mps_state = (ps_bin_ctxt->u1_mps_state);
838
839
904k
        u4_clz = CLZ(u4_code_int_range);
840
904k
        u4_qnt_int_range = u4_code_int_range << u4_clz;
841
904k
        u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
842
843
904k
        table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
844
904k
        u4_int_range_lps = table_lookup & 0xff;
845
846
904k
        u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
847
904k
        u4_code_int_range = u4_code_int_range - u4_int_range_lps;
848
849
904k
        u4_symbol = ((u1_mps_state >> 6) & 0x1);
850
851
        /*if mps*/
852
904k
        u1_mps_state = (table_lookup >> 8) & 0x7F;
853
854
904k
        CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
855
904k
                     u4_int_range_lps, u1_mps_state, table_lookup)
856
857
904k
        INC_BIN_COUNT(ps_cab_env);
858
859
904k
        ps_bin_ctxt->u1_mps_state = u1_mps_state;
860
861
904k
        c_Cbp = u4_symbol;
862
863
904k
    }
864
865
904k
    u4_cxt_inc = (!((ps_top_ctxt->u1_cbp >> 3) & 0x01)) << 1;
866
904k
    u4_cxt_inc += !(c_Cbp & 0x01);
867
904k
    ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc;
868
    /*inlining DecodeDecision_onebin without renorm*/
869
870
904k
    {
871
872
904k
        UWORD32 u4_qnt_int_range, u4_int_range_lps;
873
904k
        UWORD32 u4_symbol, u1_mps_state;
874
904k
        UWORD32 table_lookup;
875
904k
        UWORD32 u4_clz;
876
877
904k
        u1_mps_state = (ps_bin_ctxt->u1_mps_state);
878
879
904k
        u4_clz = CLZ(u4_code_int_range);
880
904k
        u4_qnt_int_range = u4_code_int_range << u4_clz;
881
904k
        u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
882
883
904k
        table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
884
904k
        u4_int_range_lps = table_lookup & 0xff;
885
886
904k
        u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
887
904k
        u4_code_int_range = u4_code_int_range - u4_int_range_lps;
888
889
904k
        u4_symbol = ((u1_mps_state >> 6) & 0x1);
890
891
        /*if mps*/
892
904k
        u1_mps_state = (table_lookup >> 8) & 0x7F;
893
894
904k
        CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
895
904k
                     u4_int_range_lps, u1_mps_state, table_lookup)
896
897
904k
        INC_BIN_COUNT(ps_cab_env);
898
899
904k
        ps_bin_ctxt->u1_mps_state = u1_mps_state;
900
901
904k
        c_Cbp |= u4_symbol << 1;
902
903
904k
    }
904
905
904k
    u4_cxt_inc = (!(c_Cbp & 0x01)) << 1;
906
904k
    u4_cxt_inc += !((ps_left_ctxt->u1_cbp >> 3) & 0x01);
907
904k
    ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc;
908
    /*inlining DecodeDecision_onebin without renorm*/
909
910
904k
    {
911
912
904k
        UWORD32 u4_qnt_int_range, u4_int_range_lps;
913
904k
        UWORD32 u4_symbol, u1_mps_state;
914
904k
        UWORD32 table_lookup;
915
904k
        UWORD32 u4_clz;
916
917
904k
        u1_mps_state = (ps_bin_ctxt->u1_mps_state);
918
919
904k
        u4_clz = CLZ(u4_code_int_range);
920
904k
        u4_qnt_int_range = u4_code_int_range << u4_clz;
921
904k
        u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
922
923
904k
        table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
924
904k
        u4_int_range_lps = table_lookup & 0xff;
925
926
904k
        u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
927
904k
        u4_code_int_range = u4_code_int_range - u4_int_range_lps;
928
929
904k
        u4_symbol = ((u1_mps_state >> 6) & 0x1);
930
931
        /*if mps*/
932
904k
        u1_mps_state = (table_lookup >> 8) & 0x7F;
933
934
904k
        CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
935
904k
                     u4_int_range_lps, u1_mps_state, table_lookup)
936
937
904k
        INC_BIN_COUNT(ps_cab_env);
938
939
904k
        ps_bin_ctxt->u1_mps_state = u1_mps_state;
940
941
904k
        c_Cbp |= u4_symbol << 2;
942
943
904k
    }
944
945
904k
    u4_cxt_inc = (!((c_Cbp >> 1) & 0x01)) << 1;
946
904k
    u4_cxt_inc += !((c_Cbp >> 2) & 0x01);
947
904k
    ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc;
948
    /*inlining DecodeDecision_onebin without renorm*/
949
950
904k
    {
951
952
904k
        UWORD32 u4_qnt_int_range, u4_int_range_lps;
953
904k
        UWORD32 u4_symbol, u1_mps_state;
954
904k
        UWORD32 table_lookup;
955
904k
        UWORD32 u4_clz;
956
957
904k
        u1_mps_state = (ps_bin_ctxt->u1_mps_state);
958
959
904k
        u4_clz = CLZ(u4_code_int_range);
960
904k
        u4_qnt_int_range = u4_code_int_range << u4_clz;
961
904k
        u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
962
963
904k
        table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
964
904k
        u4_int_range_lps = table_lookup & 0xff;
965
966
904k
        u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
967
904k
        u4_code_int_range = u4_code_int_range - u4_int_range_lps;
968
969
904k
        u4_symbol = ((u1_mps_state >> 6) & 0x1);
970
971
        /*if mps*/
972
904k
        u1_mps_state = (table_lookup >> 8) & 0x7F;
973
974
904k
        CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
975
904k
                     u4_int_range_lps, u1_mps_state, table_lookup)
976
977
904k
        INC_BIN_COUNT(ps_cab_env);
978
979
904k
        ps_bin_ctxt->u1_mps_state = u1_mps_state;
980
981
904k
        c_Cbp |= u4_symbol << 3;
982
983
904k
    }
984
985
904k
    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
904k
    {
994
904k
        UWORD32 u4_cxt_inc;
995
904k
        WORD8 a, b, c, d;
996
904k
        bin_ctxt_model_t *p_CtxtCbpChroma = ps_dec->p_cbp_chroma_t;
997
998
        /* CBP Chroma, TU, Cmax = 2 */
999
904k
        a = 0;
1000
904k
        b = 0;
1001
904k
        c = 0;
1002
904k
        d = 0;
1003
1004
904k
        {
1005
904k
            a = (ps_top_ctxt->u1_cbp > 15) ? 2 : 0;
1006
904k
            c = (ps_top_ctxt->u1_cbp > 31) ? 2 : 0;
1007
904k
        }
1008
1009
904k
        {
1010
904k
            b = (ps_left_ctxt->u1_cbp > 15) ? 1 : 0;
1011
904k
            d = (ps_left_ctxt->u1_cbp > 31) ? 1 : 0;
1012
904k
        }
1013
904k
        u4_cxt_inc = a + b;
1014
904k
        u4_cxt_inc = (u4_cxt_inc | ((4 + c + d) << 4));
1015
1016
        /*inlining ih264d_decode_bins_tunary */
1017
1018
904k
        {
1019
1020
904k
            UWORD8 u1_max_bins = 2;
1021
904k
            UWORD32 u4_ctx_inc = u4_cxt_inc;
1022
1023
904k
            UWORD32 u4_value;
1024
904k
            UWORD32 u4_symbol;
1025
904k
            UWORD8 u4_ctx_Inc;
1026
904k
            bin_ctxt_model_t *ps_bin_ctxt;
1027
904k
            u4_value = 0;
1028
1029
904k
            do
1030
993k
            {
1031
993k
                u4_ctx_Inc = u4_ctx_inc & 0xF;
1032
993k
                u4_ctx_inc = u4_ctx_inc >> 4;
1033
1034
993k
                ps_bin_ctxt = p_CtxtCbpChroma + u4_ctx_Inc;
1035
                /*inlining DecodeDecision_onebin*/
1036
993k
                {
1037
1038
993k
                    UWORD32 u4_qnt_int_range, u4_int_range_lps;
1039
1040
993k
                    UWORD32 u1_mps_state;
1041
993k
                    UWORD32 table_lookup;
1042
993k
                    UWORD32 u4_clz;
1043
1044
993k
                    u1_mps_state = (ps_bin_ctxt->u1_mps_state);
1045
1046
993k
                    u4_clz = CLZ(u4_code_int_range);
1047
993k
                    u4_qnt_int_range = u4_code_int_range << u4_clz;
1048
993k
                    u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
1049
1050
993k
                    table_lookup = pu4_table[(u1_mps_state << 2)
1051
993k
                                    + u4_qnt_int_range];
1052
993k
                    u4_int_range_lps = table_lookup & 0xff;
1053
1054
993k
                    u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
1055
993k
                    u4_code_int_range = u4_code_int_range - u4_int_range_lps;
1056
1057
993k
                    u4_symbol = ((u1_mps_state >> 6) & 0x1);
1058
1059
                    /*if mps*/
1060
993k
                    u1_mps_state = (table_lookup >> 8) & 0x7F;
1061
1062
993k
                    CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst,
1063
993k
                                 u4_symbol, u4_int_range_lps, u1_mps_state,
1064
993k
                                 table_lookup)
1065
1066
993k
                    if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8)
1067
682
                    {
1068
682
                        RENORM_RANGE_OFFSET(u4_code_int_range,
1069
682
                                            u4_code_int_val_ofst, u4_offset,
1070
682
                                            pu4_buffer)
1071
682
                    }
1072
993k
                    ps_bin_ctxt->u1_mps_state = u1_mps_state;
1073
993k
                }
1074
1075
993k
                INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(
1076
993k
                                ps_cab_env);
1077
1078
993k
                u4_value++;
1079
993k
            }
1080
993k
            while((u4_value < u1_max_bins) & (u4_symbol));
1081
1082
904k
            u4_value = u4_value - 1 + u4_symbol;
1083
1084
904k
            a = (u4_value);
1085
1086
904k
        }
1087
1088
904k
c_Cbp = (c_Cbp | (a << 4));
1089
904k
}
1090
1091
904k
ps_bitstrm->u4_ofst = u4_offset;
1092
1093
904k
ps_cab_env->u4_code_int_range = u4_code_int_range;
1094
904k
ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
1095
1096
904k
return (c_Cbp);
1097
904k
}
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.49M
{
1120
1.49M
    UWORD8 u1_abs_mvd_x = 0, u1_abs_mvd_y = 0;
1121
1.49M
    UWORD8 u1_sub_mb_x, u1_sub_mb_y;
1122
1.49M
    UWORD8 *pu1_top_mv_ctxt, *pu1_lft_mv_ctxt;
1123
1.49M
    WORD16 *pi2_mv;
1124
1125
1.49M
    u1_sub_mb_x = (UWORD8)(u1_sub_mb & 0x03);
1126
1.49M
    u1_sub_mb_y = (UWORD8)(u1_sub_mb >> 2);
1127
1.49M
    pu1_top_mv_ctxt = &ps_dec->ps_curr_ctxt_mb_info->u1_mv[u1_sub_mb_x][u1_b2];
1128
1.49M
    pu1_lft_mv_ctxt = &ps_dec->pu1_left_mv_ctxt_inc[u1_sub_mb_y][u1_b2];
1129
1.49M
    pi2_mv = &ps_mv->i2_mv[u1_b2];
1130
1131
1.49M
    if(u1_dec_mvd)
1132
1.16M
    {
1133
1.16M
        WORD16 i2_mv_x, i2_mv_y;
1134
1.16M
        WORD32 i2_temp;
1135
1.16M
        {
1136
1.16M
            decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
1137
1.16M
            dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
1138
1.16M
            UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a,
1139
1.16M
                            u2_abs_mvd_y_b;
1140
1141
1.16M
            u2_abs_mvd_x_b = (UWORD16)pu1_top_mv_ctxt[0];
1142
1.16M
            u2_abs_mvd_y_b = (UWORD16)pu1_top_mv_ctxt[1];
1143
1.16M
            u2_abs_mvd_x_a = (UWORD16)pu1_lft_mv_ctxt[0];
1144
1.16M
            u2_abs_mvd_y_a = (UWORD16)pu1_lft_mv_ctxt[1];
1145
1146
1.16M
            i2_temp = u2_abs_mvd_x_a + u2_abs_mvd_x_b;
1147
1148
1.16M
            i2_mv_x = ih264d_parse_mvd_cabac(ps_bitstrm, ps_cab_env,
1149
1.16M
                                             ps_dec->p_mvd_x_t, i2_temp);
1150
1151
1.16M
            i2_temp = u2_abs_mvd_y_a + u2_abs_mvd_y_b;
1152
1153
1.16M
            i2_mv_y = ih264d_parse_mvd_cabac(ps_bitstrm, ps_cab_env,
1154
1.16M
                                             ps_dec->p_mvd_y_t, i2_temp);
1155
1.16M
        }
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.16M
        u1_abs_mvd_x = CLIP3(0, 127, ABS(i2_mv_x));
1163
1.16M
        u1_abs_mvd_y = CLIP3(0, 127, ABS(i2_mv_y));
1164
1165
1.16M
        COPYTHECONTEXT("MVD", i2_mv_x);COPYTHECONTEXT("MVD", i2_mv_y);
1166
1167
        /* Storing Mv residuals */
1168
1.16M
        pi2_mv[0] = i2_mv_x;
1169
1.16M
        pi2_mv[1] = i2_mv_y;
1170
1.16M
    }
1171
1172
    /***************************************************************/
1173
    /* Store abs_mvd_values cabac contexts                         */
1174
    /***************************************************************/
1175
1.49M
    {
1176
1.49M
        UWORD8 u1_i;
1177
5.34M
        for(u1_i = 0; u1_i < u1_part_wd; u1_i++, pu1_top_mv_ctxt += 4)
1178
3.84M
        {
1179
3.84M
            pu1_top_mv_ctxt[0] = u1_abs_mvd_x;
1180
3.84M
            pu1_top_mv_ctxt[1] = u1_abs_mvd_y;
1181
3.84M
        }
1182
1183
4.99M
        for(u1_i = 0; u1_i < u1_part_ht; u1_i++, pu1_lft_mv_ctxt += 4)
1184
3.49M
        {
1185
3.49M
            pu1_lft_mv_ctxt[0] = u1_abs_mvd_x;
1186
3.49M
            pu1_lft_mv_ctxt[1] = u1_abs_mvd_y;
1187
3.49M
        }
1188
1.49M
    }
1189
1.49M
}
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.32M
{
1223
2.32M
    WORD8 k;
1224
2.32M
    WORD16 i2_suf;
1225
2.32M
    WORD16 i2_mvd;
1226
2.32M
    UWORD16 u2_abs_mvd;
1227
2.32M
    UWORD32 u4_ctx_inc;
1228
2.32M
    UWORD32 u4_prefix;
1229
2.32M
    const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
1230
2.32M
    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.32M
    u2_abs_mvd = (UWORD16)i4_temp;
1240
2.32M
    u4_ctx_inc = 1;
1241
1242
2.32M
    if(u2_abs_mvd < 3)
1243
1.64M
        u4_ctx_inc = 0;
1244
680k
    else if(u2_abs_mvd > 32)
1245
62.0k
        u4_ctx_inc = 2;
1246
1247
2.32M
    u4_ctx_inc = (u4_ctx_inc | 0x65430);
1248
1249
    /*inlining modified version of ih264d_decode_bins_unary*/
1250
1251
2.32M
    {
1252
2.32M
        UWORD8 u1_max_bins = 9;
1253
2.32M
        UWORD32 u4_value;
1254
2.32M
        UWORD32 u4_symbol;
1255
2.32M
        bin_ctxt_model_t *ps_bin_ctxt;
1256
2.32M
        UWORD32 u4_ctx_Inc;
1257
1258
2.32M
        u4_value = 0;
1259
2.32M
        u4_code_int_range = ps_cab_env->u4_code_int_range;
1260
2.32M
        u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
1261
1262
2.32M
        do
1263
5.33M
        {
1264
5.33M
            u4_ctx_Inc = u4_ctx_inc & 0xf;
1265
5.33M
            u4_ctx_inc = u4_ctx_inc >> 4;
1266
1267
5.33M
            ps_bin_ctxt = p_ctxt_mvd + u4_ctx_Inc;
1268
1269
5.33M
            DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range,
1270
5.33M
                                 u4_code_int_val_ofst, pu4_table, ps_bitstrm,
1271
5.33M
                                 u4_symbol)
1272
1273
5.33M
            INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
1274
1275
5.33M
            u4_value++;
1276
1277
5.33M
        }
1278
5.33M
        while(u4_symbol && u4_value < 5);
1279
1280
2.32M
        ps_bin_ctxt = p_ctxt_mvd + 6;
1281
1282
2.32M
        if(u4_symbol && (u4_value < u1_max_bins))
1283
447k
        {
1284
1285
447k
            do
1286
1.66M
            {
1287
1288
1.66M
                DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range,
1289
1.66M
                                     u4_code_int_val_ofst, pu4_table,
1290
1.66M
                                     ps_bitstrm, u4_symbol)
1291
1292
1.66M
                INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
1293
1.66M
                u4_value++;
1294
1.66M
            }
1295
1.66M
            while(u4_symbol && (u4_value < u1_max_bins));
1296
1297
447k
        }
1298
1299
2.32M
        ps_cab_env->u4_code_int_range = u4_code_int_range;
1300
2.32M
        ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
1301
2.32M
        u4_value = u4_value - 1 + u4_symbol;
1302
2.32M
        u4_prefix = (u4_value);
1303
2.32M
    }
1304
1305
2.32M
    i2_mvd = u4_prefix;
1306
1307
2.32M
    if(i2_mvd == 9)
1308
375k
    {
1309
        /* Read Suffix */
1310
375k
        k = ih264d_decode_bypass_bins_unary(ps_cab_env, ps_bitstrm);
1311
375k
        i2_suf = (k > 15) ? INT16_MAX : ((1 << k) - 1);
1312
375k
        k = k + 3;
1313
375k
        i2_suf = (i2_suf << 3);
1314
375k
        i2_mvd += i2_suf;
1315
375k
        i2_suf = ih264d_decode_bypass_bins(ps_cab_env, k, ps_bitstrm);
1316
375k
        i2_mvd += i2_suf;
1317
375k
    }
1318
    /* Read Sign bit */
1319
2.32M
    if(!i2_mvd)
1320
1.17M
        return (i2_mvd);
1321
1322
1.15M
    else
1323
1.15M
    {
1324
1.15M
        UWORD32 u4_code_int_val_ofst, u4_code_int_range;
1325
1326
1.15M
        u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
1327
1.15M
        u4_code_int_range = ps_cab_env->u4_code_int_range;
1328
1329
1.15M
        if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
1330
19.8k
        {
1331
19.8k
            UWORD32 *pu4_buffer, u4_offset;
1332
1333
19.8k
            pu4_buffer = ps_bitstrm->pu4_buffer;
1334
19.8k
            u4_offset = ps_bitstrm->u4_ofst;
1335
1336
19.8k
            RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst,
1337
19.8k
                                u4_offset, pu4_buffer)
1338
19.8k
            ps_bitstrm->u4_ofst = u4_offset;
1339
19.8k
        }
1340
1341
1.15M
        u4_code_int_range = u4_code_int_range >> 1;
1342
1343
1.15M
        if(u4_code_int_val_ofst >= u4_code_int_range)
1344
352k
        {
1345
            /* S=1 */
1346
352k
            u4_code_int_val_ofst -= u4_code_int_range;
1347
352k
            i2_mvd = (-i2_mvd);
1348
352k
        }
1349
1350
1.15M
        ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
1351
1.15M
        ps_cab_env->u4_code_int_range = u4_code_int_range;
1352
1353
1.15M
        return (i2_mvd);
1354
1355
1.15M
    }
1356
2.32M
}