Coverage Report

Created: 2025-11-11 06:42

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