ih264d_parse_cabac.c revision 8d3d303c7942ced6a987a52db8977d768dc3605f
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_cabac.c
23 *
24 * \brief
25 *    This file contains cabac Residual decoding routines.
26 *
27 * \date
28 *    20/03/2003
29 *
30 * \author  NS
31 ***************************************************************************
32 */
33
34#include "ih264_typedefs.h"
35#include "ih264_macros.h"
36#include "ih264_platform_macros.h"
37#include "ih264d_defs.h"
38#include "ih264d_structs.h"
39
40#include "ih264d_cabac.h"
41#include "ih264d_bitstrm.h"
42#include "ih264d_parse_mb_header.h"
43#include "ih264d_debug.h"
44#include "ih264d_tables.h"
45#include "ih264d_error_handler.h"
46#include "ih264d_parse_cabac.h"
47#include "ih264d_parse_slice.h"
48#include "ih264d_tables.h"
49#include "ih264d_mb_utils.h"
50#include "ih264d_utils.h"
51
52/*!
53 ********************************************************************************
54 *   \if Function name : ih264d_read_coeff4x4_cabac \endif
55 *
56 *   \brief  This function encodes residual_block_cabac as defined in 7.3.5.3.2.
57 *
58 *   \return
59 *       Returns the index of last significant coeff.
60 *
61 ********************************************************************************
62 */
63
64UWORD8 ih264d_read_coeff4x4_cabac(dec_bit_stream_t *ps_bitstrm,
65                                  UWORD32 u4_ctxcat,
66                                  bin_ctxt_model_t *ps_ctxt_sig_coeff,
67                                  dec_struct_t *ps_dec, /*!< pointer to access global variables*/
68                                  bin_ctxt_model_t *ps_ctxt_coded)
69{
70
71    decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env;
72    UWORD32 u4_coded_flag;
73    UWORD32 u4_offset, *pu4_buffer;
74    UWORD32 u4_code_int_range, u4_code_int_val_ofst;
75    tu_sblk4x4_coeff_data_t *ps_tu_4x4;
76    WORD16 *pi2_coeff_data;
77    WORD32 num_sig_coeffs = 0;
78
79    /*loading from strcuctures*/
80
81    ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
82    ps_tu_4x4->u2_sig_coeff_map = 0;
83    pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
84
85    u4_offset = ps_bitstrm->u4_ofst;
86    pu4_buffer = ps_bitstrm->pu4_buffer;
87
88    u4_code_int_range = ps_cab_env->u4_code_int_range;
89    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
90
91    {
92
93        /*inilined DecodeDecision_onebin begins*/
94
95        {
96
97            UWORD32 u4_qnt_int_range, u4_int_range_lps;
98            UWORD32 u4_symbol, u1_mps_state;
99
100            UWORD32 table_lookup;
101            const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
102            UWORD32 u4_clz;
103
104            u1_mps_state = (ps_ctxt_coded->u1_mps_state);
105            u4_clz = CLZ(u4_code_int_range);
106            u4_qnt_int_range = u4_code_int_range << u4_clz;
107            u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
108            table_lookup =
109                            pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
110            u4_int_range_lps = table_lookup & 0xff;
111            u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
112            u4_code_int_range = u4_code_int_range - u4_int_range_lps;
113            u4_symbol = ((u1_mps_state >> 6) & 0x1);
114            u1_mps_state = (table_lookup >> 8) & 0x7F;
115
116            CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
117                         u4_int_range_lps, u1_mps_state, table_lookup)
118
119            if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8)
120            {
121
122                RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst,
123                                    u4_offset, pu4_buffer)
124            }
125
126            ps_ctxt_coded->u1_mps_state = u1_mps_state;
127            u4_coded_flag = u4_symbol;
128
129            /*inilined DecodeDecision_onebin ends*/
130
131        }
132
133    }
134
135    if(u4_coded_flag)
136    {
137
138        {
139            bin_ctxt_model_t *p_binCtxt_last, *p_binCtxt_last_org;
140            UWORD32 uc_last_coeff_idx;
141            UWORD32 uc_bin;
142            UWORD32 i;
143            WORD32 first_coeff_offset = 0;
144
145            if((u4_ctxcat == CHROMA_AC_CTXCAT) || (u4_ctxcat == LUMA_AC_CTXCAT))
146            {
147                first_coeff_offset = 1;
148            }
149
150            i = 0;
151            if(u4_ctxcat == CHROMA_DC_CTXCAT)
152            {
153                uc_last_coeff_idx = 3;
154            }
155            else
156            {
157                UWORD32 u4_start;
158                u4_start = (u4_ctxcat & 1) + (u4_ctxcat >> 2);
159                uc_last_coeff_idx = 15 - u4_start;
160            }
161            p_binCtxt_last_org = ps_ctxt_sig_coeff
162                            + LAST_COEFF_CTXT_MINUS_SIG_COEFF_CTXT;
163
164            do
165            {
166
167                /*inilined DecodeDecision_onebin begins*/
168                {
169
170                    UWORD32 u4_qnt_int_range, u4_int_range_lps;
171                    UWORD32 u4_symbol, u1_mps_state;
172                    UWORD32 table_lookup;
173                    const UWORD32 *pu4_table =
174                                    (const UWORD32 *)ps_cab_env->cabac_table;
175                    UWORD32 u4_clz;
176
177                    u1_mps_state = (ps_ctxt_sig_coeff->u1_mps_state);
178
179                    u4_clz = CLZ(u4_code_int_range);
180
181                    u4_qnt_int_range = u4_code_int_range << u4_clz;
182                    u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
183
184                    table_lookup = pu4_table[(u1_mps_state << 2)
185                                    + u4_qnt_int_range];
186
187                    u4_int_range_lps = table_lookup & 0xff;
188
189                    u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
190                    u4_code_int_range = u4_code_int_range - u4_int_range_lps;
191                    u4_symbol = ((u1_mps_state >> 6) & 0x1);
192                    u1_mps_state = (table_lookup >> 8) & 0x7F;
193
194                    CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst,
195                                 u4_symbol, u4_int_range_lps, u1_mps_state,
196                                 table_lookup)
197
198                    if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_14)
199                    {
200
201                        UWORD32 read_bits, u4_clz;
202                        u4_clz = CLZ(u4_code_int_range);
203                        NEXTBITS(read_bits, (u4_offset + 23), pu4_buffer,
204                                 u4_clz)
205                        FLUSHBITS(u4_offset, (u4_clz))
206                        u4_code_int_range = u4_code_int_range << u4_clz;
207                        u4_code_int_val_ofst = (u4_code_int_val_ofst << u4_clz)
208                                        | read_bits;
209                    }
210
211                    INC_BIN_COUNT(
212                                    ps_cab_env)
213
214                    ps_ctxt_sig_coeff->u1_mps_state = u1_mps_state;
215                    uc_bin = u4_symbol;
216
217                }
218                /*incrementing pointer to point to the context of the next bin*/
219                ps_ctxt_sig_coeff++;
220
221                /*inilined DecodeDecision_onebin ends*/
222
223                if(uc_bin)
224                {
225                    num_sig_coeffs++;
226                    SET_BIT(ps_tu_4x4->u2_sig_coeff_map, (i + first_coeff_offset));
227
228                    p_binCtxt_last = p_binCtxt_last_org + i;
229
230                    /*inilined DecodeDecision_onebin begins*/
231
232                    {
233
234                        UWORD32 u4_qnt_int_range, u4_int_range_lps;
235                        UWORD32 u4_symbol, u1_mps_state;
236                        UWORD32 table_lookup;
237                        const UWORD32 *pu4_table =
238                                        (const UWORD32 *)ps_cab_env->cabac_table;
239                        UWORD32 u4_clz;
240
241                        u1_mps_state = (p_binCtxt_last->u1_mps_state);
242
243                        u4_clz = CLZ(u4_code_int_range);
244                        u4_qnt_int_range = u4_code_int_range << u4_clz;
245                        u4_qnt_int_range = (u4_qnt_int_range >> 29)
246                                        & 0x3;
247
248                        table_lookup = pu4_table[(u1_mps_state << 2)
249                                        + u4_qnt_int_range];
250                        u4_int_range_lps = table_lookup & 0xff;
251
252                        u4_int_range_lps = u4_int_range_lps
253                                        << (23 - u4_clz);
254
255                        u4_code_int_range = u4_code_int_range
256                                        - u4_int_range_lps;
257                        u4_symbol = ((u1_mps_state >> 6) & 0x1);
258                        u1_mps_state = (table_lookup >> 8) & 0x7F;
259
260                        CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst,
261                                     u4_symbol, u4_int_range_lps,
262                                     u1_mps_state, table_lookup)
263
264                        INC_BIN_COUNT(ps_cab_env)
265
266                        p_binCtxt_last->u1_mps_state = u1_mps_state;
267                        uc_bin = u4_symbol;
268
269                    }
270
271                    /*inilined DecodeDecision_onebin ends*/
272                    if(uc_bin == 1)
273                        goto label_read_levels;
274
275                }
276
277                i = i + 1;
278
279            }
280            while(i < uc_last_coeff_idx);
281
282            num_sig_coeffs++;
283            SET_BIT(ps_tu_4x4->u2_sig_coeff_map, (i + first_coeff_offset));
284
285            label_read_levels: ;
286
287        }
288
289        /// VALUE of No of Coeff in BLOCK = i + 1 for second case else i;
290
291        /* Decode coeff_abs_level_minus1 and coeff_sign_flag */
292        {
293
294            WORD32 i2_abs_lvl;
295            UWORD32 u1_abs_level_equal1 = 1, u1_abs_level_gt1 = 0;
296
297            UWORD32 u4_ctx_inc;
298            UWORD32 ui_prefix;
299        bin_ctxt_model_t *p_ctxt_abs_level;
300
301
302        p_ctxt_abs_level = ps_dec->p_coeff_abs_level_minus1_t[u4_ctxcat];
303        u4_ctx_inc = ((0x51));
304
305        /*****************************************************/
306        /* Main Loop runs for no. of Significant coefficient */
307        /*****************************************************/
308
309
310        do
311            {
312
313                {
314                    INC_SYM_COUNT(&(ps_dec.s_cab_dec_env));
315
316                    /*****************************************************/
317                    /* inilining a modified ih264d_decode_bins_unary     */
318                    /*****************************************************/
319
320                    {
321                        UWORD32 u4_value;
322                        UWORD32 u4_symbol;
323                        bin_ctxt_model_t *ps_bin_ctxt;
324                        UWORD32 u4_ctx_Inc;
325
326                        u4_value = 0;
327
328                        u4_ctx_Inc = u4_ctx_inc & 0xf;
329                        ps_bin_ctxt = p_ctxt_abs_level + u4_ctx_Inc;
330
331                        do
332                        {
333
334                            {
335
336                                UWORD32 u4_qnt_int_range,
337                                                u4_int_range_lps;
338                                UWORD32 u1_mps_state;
339                                UWORD32 table_lookup;
340                                const UWORD32 *pu4_table =
341                                                (const UWORD32 *)ps_cab_env->cabac_table;
342                                UWORD32 u4_clz;
343
344                                u1_mps_state = (ps_bin_ctxt->u1_mps_state);
345                                u4_clz = CLZ(u4_code_int_range);
346                                u4_qnt_int_range = u4_code_int_range
347                                                << u4_clz;
348                                u4_qnt_int_range = (u4_qnt_int_range
349                                                >> 29) & 0x3;
350                                table_lookup = pu4_table[(u1_mps_state << 2)
351                                                + u4_qnt_int_range];
352                                u4_int_range_lps = table_lookup & 0xff;
353
354                                u4_int_range_lps = u4_int_range_lps
355                                                << (23 - u4_clz);
356                                u4_code_int_range = u4_code_int_range
357                                                - u4_int_range_lps;
358                                u4_symbol = ((u1_mps_state >> 6) & 0x1);
359                                u1_mps_state = (table_lookup >> 8) & 0x7F;
360
361                                CHECK_IF_LPS(u4_code_int_range,
362                                             u4_code_int_val_ofst, u4_symbol,
363                                             u4_int_range_lps, u1_mps_state,
364                                             table_lookup)
365
366                                if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
367                                {
368
369                                    RENORM_RANGE_OFFSET(u4_code_int_range,
370                                                        u4_code_int_val_ofst,
371                                                        u4_offset, pu4_buffer)
372                                }
373
374                                INC_BIN_COUNT(ps_cab_env);
375
376                                ps_bin_ctxt->u1_mps_state = u1_mps_state;
377                            }
378
379                            INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
380
381                            u4_value++;
382                            ps_bin_ctxt = p_ctxt_abs_level + (u4_ctx_inc >> 4);
383
384                        }
385                        while(u4_symbol && (u4_value < UCOFF_LEVEL));
386
387                        ui_prefix = u4_value - 1 + u4_symbol;
388
389                    }
390
391                    if(ui_prefix == UCOFF_LEVEL)
392                    {
393                        UWORD32 ui16_sufS = 0;
394                        UWORD32 u1_max_bins;
395                        UWORD32 u4_value;
396
397                        i2_abs_lvl = UCOFF_LEVEL;
398                        /*inlining ih264d_decode_bypass_bins_unary begins*/
399
400                        {
401                            UWORD32 uc_bin;
402                            UWORD32 bits_to_flush;
403                            UWORD32 max_bits = 32;
404
405                            bits_to_flush = 0;
406                            /*renormalize to ensure there 23 bits more in the u4_code_int_val_ofst*/
407                            {
408                                UWORD32 u4_clz, read_bits;
409
410                                u4_clz = CLZ(u4_code_int_range);
411                                FLUSHBITS(u4_offset, u4_clz)
412                                NEXTBITS(read_bits, u4_offset, pu4_buffer, 23)
413                                u4_code_int_range = u4_code_int_range << u4_clz;
414                                u4_code_int_val_ofst = (u4_code_int_val_ofst
415                                                << u4_clz) | read_bits;
416
417                            }
418
419                            do
420                            {
421                                bits_to_flush++;
422
423                                u4_code_int_range = u4_code_int_range >> 1;
424
425                                if(u4_code_int_val_ofst >= u4_code_int_range)
426                                {
427                                    /* S=1 */
428                                    uc_bin = 1;
429                                    u4_code_int_val_ofst -= u4_code_int_range;
430                                }
431                                else
432                                {
433                                    /* S=0 */
434                                    uc_bin = 0;
435                                }
436
437                                INC_BIN_COUNT(
438                                                ps_cab_env);INC_BYPASS_BINS(ps_cab_env);
439
440                            }
441                            while(uc_bin && (bits_to_flush < max_bits));
442
443                            u4_value = (bits_to_flush - 1);
444
445                        }
446                        /*inlining ih264d_decode_bypass_bins_unary ends*/
447
448                        ui16_sufS = (1 << u4_value);
449                        u1_max_bins = u4_value;
450
451                        if(u4_value > 0)
452                        {
453
454                            /*inline bypassbins_flc begins*/
455
456                            if(u4_value > 10)
457                            {
458                                UWORD32 u4_clz, read_bits;
459
460                                u4_clz = CLZ(u4_code_int_range);
461                                FLUSHBITS(u4_offset, u4_clz)
462                                NEXTBITS(read_bits, u4_offset, pu4_buffer, 23)
463                                u4_code_int_range = u4_code_int_range << u4_clz;
464                                u4_code_int_val_ofst = (u4_code_int_val_ofst
465                                                << u4_clz) | read_bits;
466                            }
467
468                            {
469                                UWORD32 ui_bins;
470                                UWORD32 uc_bin;
471                                UWORD32 bits_to_flush;
472
473                                ui_bins = 0;
474                                bits_to_flush = 0;
475
476                                do
477                                {
478                                    bits_to_flush++;
479
480                                    u4_code_int_range = u4_code_int_range >> 1;
481
482                                    if(u4_code_int_val_ofst
483                                                    >= u4_code_int_range)
484                                    {
485                                        /* S=1 */
486                                        uc_bin = 1;
487                                        u4_code_int_val_ofst -=
488                                                        u4_code_int_range;
489                                    }
490                                    else
491                                    {
492                                        /* S=0 */
493                                        uc_bin = 0;
494                                    }
495
496                                    INC_BIN_COUNT(
497                                                    ps_cab_env);INC_BYPASS_BINS(ps_cab_env);
498
499                                    ui_bins = ((ui_bins << 1) | uc_bin);
500
501                                }
502                                while(bits_to_flush < u1_max_bins);
503
504                                u4_value = ui_bins;
505                            }
506
507                            /*inline bypassbins_flc ends*/
508
509                        }
510
511                        //Value of K
512                        ui16_sufS += u4_value;
513                        i2_abs_lvl += ui16_sufS;
514
515                    }
516                    else
517                        i2_abs_lvl = 1 + ui_prefix;
518
519                    if(i2_abs_lvl > 1)
520                    {
521                        u1_abs_level_gt1++;
522                    }
523                    if(!u1_abs_level_gt1)
524                    {
525                        u1_abs_level_equal1++;
526                        u4_ctx_inc = (5 << 4) + MIN(u1_abs_level_equal1, 4);
527                    }
528                    else
529                        u4_ctx_inc = (5 + MIN(u1_abs_level_gt1, 4)) << 4;
530
531                    /*u4_ctx_inc = g_table_temp[u1_abs_level_gt1][u1_abs_level_equal1];*/
532
533                    /* encode coeff_sign_flag[i] */
534
535                    {
536                        u4_code_int_range = u4_code_int_range >> 1;
537
538                        if(u4_code_int_val_ofst >= (u4_code_int_range))
539                        {
540                            /* S=1 */
541                            u4_code_int_val_ofst -= u4_code_int_range;
542                            i2_abs_lvl = (-i2_abs_lvl);
543                        }
544
545                    }
546                    num_sig_coeffs--;
547                    *pi2_coeff_data++ = i2_abs_lvl;
548                }
549            }
550            while(num_sig_coeffs > 0);
551        }
552    }
553
554    if(u4_coded_flag)
555    {
556        WORD32 offset;
557        offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
558        offset = ALIGN4(offset);
559        ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
560    }
561
562
563    /*updating structures*/
564    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
565    ps_cab_env->u4_code_int_range = u4_code_int_range;
566    ps_bitstrm->u4_ofst = u4_offset;
567    return (u4_coded_flag);
568}
569/*!
570 ********************************************************************************
571 *   \if Function name : ih264d_read_coeff8x8_cabac \endif
572 *
573 *   \brief  This function encodes residual_block_cabac as defined in 7.3.5.3.2.
574 when transform_8x8_flag  = 1
575 *
576 *   \return
577 *       Returns the index of last significant coeff.
578 *
579 ********************************************************************************
580 */
581
582void ih264d_read_coeff8x8_cabac(dec_bit_stream_t *ps_bitstrm,
583                                dec_struct_t *ps_dec, /*!< pointer to access global variables*/
584                                dec_mb_info_t *ps_cur_mb_info)
585{
586    decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env;
587    UWORD32 u4_offset, *pu4_buffer;
588    UWORD32 u4_code_int_range, u4_code_int_val_ofst;
589
590    /* High profile related declarations */
591    UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;
592    const UWORD8 *pu1_lastcoeff_context_inc =
593                    (UWORD8 *)gau1_ih264d_lastcoeff_context_inc;
594    const UWORD8 *pu1_sigcoeff_context_inc;
595    bin_ctxt_model_t *ps_ctxt_sig_coeff;
596    WORD32 num_sig_coeffs = 0;
597    tu_blk8x8_coeff_data_t *ps_tu_8x8;
598    WORD16 *pi2_coeff_data;
599
600    /*loading from strcuctures*/
601
602    ps_tu_8x8 = (tu_blk8x8_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
603    ps_tu_8x8->au4_sig_coeff_map[0] = 0;
604    ps_tu_8x8->au4_sig_coeff_map[1] = 0;
605    pi2_coeff_data = &ps_tu_8x8->ai2_level[0];
606
607
608    if(!u1_field_coding_flag)
609    {
610        pu1_sigcoeff_context_inc =
611                        (UWORD8 *)gau1_ih264d_sigcoeff_context_inc_frame;
612
613        /*******************************************************************/
614        /* last coefficient context is derived from significant coeff u4_flag */
615        /* only significant coefficient matrix need to be initialized      */
616        /*******************************************************************/
617        ps_ctxt_sig_coeff = ps_dec->s_high_profile.ps_sigcoeff_8x8_frame;
618    }
619    else
620    {
621        pu1_sigcoeff_context_inc =
622                        (UWORD8 *)gau1_ih264d_sigcoeff_context_inc_field;
623
624        /*******************************************************************/
625        /* last coefficient context is derived from significant coeff u4_flag */
626        /* only significant coefficient matrix need to be initialized      */
627        /*******************************************************************/
628        ps_ctxt_sig_coeff = ps_dec->s_high_profile.ps_sigcoeff_8x8_field;
629    }
630
631    /*loading from strcuctures*/
632
633    u4_offset = ps_bitstrm->u4_ofst;
634    pu4_buffer = ps_bitstrm->pu4_buffer;
635
636    u4_code_int_range = ps_cab_env->u4_code_int_range;
637    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
638
639    {
640        {
641            bin_ctxt_model_t *p_binCtxt_last, *p_binCtxt_last_org,
642                            *p_ctxt_sig_coeff_org;
643            UWORD32 uc_last_coeff_idx;
644            UWORD32 uc_bin;
645            UWORD32 i;
646
647            i = 0;
648
649            uc_last_coeff_idx = 63;
650
651            p_binCtxt_last_org = ps_ctxt_sig_coeff
652                            + LAST_COEFF_CTXT_MINUS_SIG_COEFF_CTXT_8X8;
653
654            p_ctxt_sig_coeff_org = ps_ctxt_sig_coeff;
655
656            do
657            {
658                /*inilined DecodeDecision_onebin begins*/
659                {
660                    UWORD32 u4_qnt_int_range, u4_int_range_lps;
661                    UWORD32 u4_symbol, u1_mps_state;
662                    UWORD32 table_lookup;
663                    const UWORD32 *pu4_table =
664                                    (const UWORD32 *)ps_cab_env->cabac_table;
665                    UWORD32 u4_clz;
666
667                    u1_mps_state = (ps_ctxt_sig_coeff->u1_mps_state);
668
669                    u4_clz = CLZ(u4_code_int_range);
670
671                    u4_qnt_int_range = u4_code_int_range << u4_clz;
672                    u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
673
674                    table_lookup = pu4_table[(u1_mps_state << 2)
675                                    + u4_qnt_int_range];
676
677                    u4_int_range_lps = table_lookup & 0xff;
678
679                    u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
680                    u4_code_int_range = u4_code_int_range - u4_int_range_lps;
681                    u4_symbol = ((u1_mps_state >> 6) & 0x1);
682                    u1_mps_state = (table_lookup >> 8) & 0x7F;
683
684                    CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst,
685                                 u4_symbol, u4_int_range_lps, u1_mps_state,
686                                 table_lookup)
687
688                    if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_14)
689                    {
690                        UWORD32 read_bits, u4_clz;
691                        u4_clz = CLZ(u4_code_int_range);
692                        NEXTBITS(read_bits, (u4_offset + 23), pu4_buffer,
693                                 u4_clz)
694                        FLUSHBITS(u4_offset, (u4_clz))
695                        u4_code_int_range = u4_code_int_range << u4_clz;
696                        u4_code_int_val_ofst = (u4_code_int_val_ofst << u4_clz)
697                                        | read_bits;
698                    }
699
700                    ps_ctxt_sig_coeff->u1_mps_state = u1_mps_state;
701                    uc_bin = u4_symbol;
702                }
703                /*incrementing pointer to point to the context of the next bin*/
704                ps_ctxt_sig_coeff = p_ctxt_sig_coeff_org
705                                + pu1_sigcoeff_context_inc[i + 1];
706
707                /*inilined DecodeDecision_onebin ends*/
708                if(uc_bin)
709                {
710                    num_sig_coeffs++;
711                    SET_BIT(ps_tu_8x8->au4_sig_coeff_map[i>31], (i > 31 ? i - 32:i));
712
713                    p_binCtxt_last = p_binCtxt_last_org
714                                    + pu1_lastcoeff_context_inc[i];
715
716                    /*inilined DecodeDecision_onebin begins*/
717
718                    {
719                        UWORD32 u4_qnt_int_range, u4_int_range_lps;
720                        UWORD32 u4_symbol, u1_mps_state;
721                        UWORD32 table_lookup;
722                        const UWORD32 *pu4_table =
723                                        (const UWORD32 *)ps_cab_env->cabac_table;
724                        UWORD32 u4_clz;
725
726                        u1_mps_state = (p_binCtxt_last->u1_mps_state);
727
728                        u4_clz = CLZ(u4_code_int_range);
729                        u4_qnt_int_range = u4_code_int_range << u4_clz;
730                        u4_qnt_int_range = (u4_qnt_int_range >> 29)
731                                        & 0x3;
732
733                        table_lookup = pu4_table[(u1_mps_state << 2)
734                                        + u4_qnt_int_range];
735                        u4_int_range_lps = table_lookup & 0xff;
736
737                        u4_int_range_lps = u4_int_range_lps
738                                        << (23 - u4_clz);
739
740                        u4_code_int_range = u4_code_int_range
741                                        - u4_int_range_lps;
742                        u4_symbol = ((u1_mps_state >> 6) & 0x1);
743                        u1_mps_state = (table_lookup >> 8) & 0x7F;
744
745                        CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst,
746                                     u4_symbol, u4_int_range_lps,
747                                     u1_mps_state, table_lookup)
748
749                        p_binCtxt_last->u1_mps_state = u1_mps_state;
750                        uc_bin = u4_symbol;
751                    }
752
753                    /*inilined DecodeDecision_onebin ends*/
754                    if(uc_bin == 1)
755                        goto label_read_levels;
756
757                }
758
759                i = i + 1;
760
761            }
762            while(i < uc_last_coeff_idx);
763
764            num_sig_coeffs++;
765            SET_BIT(ps_tu_8x8->au4_sig_coeff_map[i>31], (i > 31 ? i - 32:i));
766
767            label_read_levels: ;
768        }
769
770        /// VALUE of No of Coeff in BLOCK = i + 1 for second case else i;
771
772        /* Decode coeff_abs_level_minus1 and coeff_sign_flag */
773        {
774            WORD32 i2_abs_lvl;
775            UWORD32 u1_abs_level_equal1 = 1, u1_abs_level_gt1 = 0;
776
777            UWORD32 u4_ctx_inc;
778            UWORD32 ui_prefix;
779            bin_ctxt_model_t *p_ctxt_abs_level;
780
781            p_ctxt_abs_level =
782                            ps_dec->p_coeff_abs_level_minus1_t[LUMA_8X8_CTXCAT];
783            u4_ctx_inc = ((0x51));
784
785            /*****************************************************/
786            /* Main Loop runs for no. of Significant coefficient */
787            /*****************************************************/
788            do
789            {
790                {
791
792                    /*****************************************************/
793                    /* inilining a modified ih264d_decode_bins_unary     */
794                    /*****************************************************/
795
796                    {
797                        UWORD32 u4_value;
798                        UWORD32 u4_symbol;
799                        bin_ctxt_model_t *ps_bin_ctxt;
800                        UWORD32 u4_ctx_Inc;
801                        u4_value = 0;
802
803                        u4_ctx_Inc = u4_ctx_inc & 0xf;
804                        ps_bin_ctxt = p_ctxt_abs_level + u4_ctx_Inc;
805
806                        do
807                        {
808                            {
809                                UWORD32 u4_qnt_int_range,
810                                                u4_int_range_lps;
811                                UWORD32 u1_mps_state;
812                                UWORD32 table_lookup;
813                                const UWORD32 *pu4_table =
814                                                (const UWORD32 *)ps_cab_env->cabac_table;
815                                UWORD32 u4_clz;
816
817                                u1_mps_state = (ps_bin_ctxt->u1_mps_state);
818                                u4_clz = CLZ(u4_code_int_range);
819                                u4_qnt_int_range = u4_code_int_range
820                                                << u4_clz;
821                                u4_qnt_int_range = (u4_qnt_int_range
822                                                >> 29) & 0x3;
823                                table_lookup = pu4_table[(u1_mps_state << 2)
824                                                + u4_qnt_int_range];
825                                u4_int_range_lps = table_lookup & 0xff;
826
827                                u4_int_range_lps = u4_int_range_lps
828                                                << (23 - u4_clz);
829                                u4_code_int_range = u4_code_int_range
830                                                - u4_int_range_lps;
831                                u4_symbol = ((u1_mps_state >> 6) & 0x1);
832                                u1_mps_state = (table_lookup >> 8) & 0x7F;
833
834                                CHECK_IF_LPS(u4_code_int_range,
835                                             u4_code_int_val_ofst, u4_symbol,
836                                             u4_int_range_lps, u1_mps_state,
837                                             table_lookup)
838
839                                if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
840                                {
841
842                                    RENORM_RANGE_OFFSET(u4_code_int_range,
843                                                        u4_code_int_val_ofst,
844                                                        u4_offset, pu4_buffer)
845                                }
846
847                                ps_bin_ctxt->u1_mps_state = u1_mps_state;
848                            }
849
850                            u4_value++;
851                            ps_bin_ctxt = p_ctxt_abs_level + (u4_ctx_inc >> 4);
852
853                        }
854                        while(u4_symbol && (u4_value < UCOFF_LEVEL));
855
856                        ui_prefix = u4_value - 1 + u4_symbol;
857                    }
858
859                    if(ui_prefix == UCOFF_LEVEL)
860                    {
861                        UWORD32 ui16_sufS = 0;
862                        UWORD32 u1_max_bins;
863                        UWORD32 u4_value;
864
865                        i2_abs_lvl = UCOFF_LEVEL;
866                        /*inlining ih264d_decode_bypass_bins_unary begins*/
867
868                        {
869                            UWORD32 uc_bin;
870                            UWORD32 bits_to_flush;
871                            UWORD32 max_bits = 32;
872
873                            bits_to_flush = 0;
874                            /*renormalize to ensure there 23 bits more in the u4_code_int_val_ofst*/
875                            {
876                                UWORD32 u4_clz, read_bits;
877
878                                u4_clz = CLZ(u4_code_int_range);
879                                FLUSHBITS(u4_offset, u4_clz)
880                                NEXTBITS(read_bits, u4_offset, pu4_buffer, 23)
881                                u4_code_int_range = u4_code_int_range << u4_clz;
882                                u4_code_int_val_ofst = (u4_code_int_val_ofst
883                                                << u4_clz) | read_bits;
884                            }
885
886                            do
887                            {
888                                bits_to_flush++;
889
890                                u4_code_int_range = u4_code_int_range >> 1;
891
892                                if(u4_code_int_val_ofst >= u4_code_int_range)
893                                {
894                                    /* S=1 */
895                                    uc_bin = 1;
896                                    u4_code_int_val_ofst -= u4_code_int_range;
897                                }
898                                else
899                                {
900                                    /* S=0 */
901                                    uc_bin = 0;
902                                }
903
904                            }
905                            while(uc_bin && (bits_to_flush < max_bits));
906
907                            u4_value = (bits_to_flush - 1);
908                        }
909                        /*inlining ih264d_decode_bypass_bins_unary ends*/
910
911                        ui16_sufS = (1 << u4_value);
912                        u1_max_bins = u4_value;
913
914                        if(u4_value > 0)
915                        {
916                            /*inline bypassbins_flc begins*/
917
918                            if(u4_value > 10)
919                            {
920                                UWORD32 u4_clz, read_bits;
921
922                                u4_clz = CLZ(u4_code_int_range);
923                                FLUSHBITS(u4_offset, u4_clz)
924                                NEXTBITS(read_bits, u4_offset, pu4_buffer, 23)
925                                u4_code_int_range = u4_code_int_range << u4_clz;
926                                u4_code_int_val_ofst = (u4_code_int_val_ofst
927                                                << u4_clz) | read_bits;
928                            }
929
930                            {
931                                UWORD32 ui_bins;
932                                UWORD32 uc_bin;
933                                UWORD32 bits_to_flush;
934
935                                ui_bins = 0;
936                                bits_to_flush = 0;
937
938                                do
939                                {
940                                    bits_to_flush++;
941
942                                    u4_code_int_range = u4_code_int_range >> 1;
943
944                                    if(u4_code_int_val_ofst
945                                                    >= u4_code_int_range)
946                                    {
947                                        /* S=1 */
948                                        uc_bin = 1;
949                                        u4_code_int_val_ofst -=
950                                                        u4_code_int_range;
951                                    }
952                                    else
953                                    {
954                                        /* S=0 */
955                                        uc_bin = 0;
956                                    }
957
958                                    ui_bins = ((ui_bins << 1) | uc_bin);
959
960                                }
961                                while(bits_to_flush < u1_max_bins);
962
963                                u4_value = ui_bins;
964                            }
965                            /*inline bypassbins_flc ends*/
966                        }
967
968                        //Value of K
969                        ui16_sufS += u4_value;
970                        i2_abs_lvl += ui16_sufS;
971                    }
972                    else
973                    {
974                        i2_abs_lvl = 1 + ui_prefix;
975                    }
976
977                    if(i2_abs_lvl > 1)
978                    {
979                        u1_abs_level_gt1++;
980                    }
981                    if(!u1_abs_level_gt1)
982                    {
983                        u1_abs_level_equal1++;
984                        u4_ctx_inc = (5 << 4) + MIN(u1_abs_level_equal1, 4);
985                    }
986                    else
987                    {
988                        u4_ctx_inc = (5 + MIN(u1_abs_level_gt1, 4)) << 4;
989                    }
990
991                    /*u4_ctx_inc = g_table_temp[u1_abs_level_gt1][u1_abs_level_equal1];*/
992
993                    /* encode coeff_sign_flag[i] */
994
995                    {
996                        u4_code_int_range = u4_code_int_range >> 1;
997
998                        if(u4_code_int_val_ofst >= (u4_code_int_range))
999                        {
1000                            /* S=1 */
1001                            u4_code_int_val_ofst -= u4_code_int_range;
1002                            i2_abs_lvl = (-i2_abs_lvl);
1003                        }
1004                    }
1005
1006                    *pi2_coeff_data++ = i2_abs_lvl;
1007                    num_sig_coeffs--;
1008                }
1009            }
1010            while(num_sig_coeffs > 0);
1011        }
1012    }
1013
1014    {
1015        WORD32 offset;
1016        offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_8x8;
1017        offset = ALIGN4(offset);
1018        ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
1019    }
1020
1021    /*updating structures*/
1022    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
1023    ps_cab_env->u4_code_int_range = u4_code_int_range;
1024    ps_bitstrm->u4_ofst = u4_offset;
1025}
1026
1027/*****************************************************************************/
1028/*                                                                           */
1029/*  Function Name : ih264d_cabac_parse_8x8block                                     */
1030/*                                                                           */
1031/*  Description   : This function does the residual parsing of 4 subblocks   */
1032/*                  in a 8x8 block.                                          */
1033/*                                                                           */
1034/*  Inputs        : pi2_coeff_block : pointer to residual block where        */
1035/*                  decoded and inverse scan coefficients are updated        */
1036/*                                                                           */
1037/*                  u4_sub_block_strd : indicates the number of sublocks    */
1038/*                  in a row. It is 4 for luma and 2 for chroma.             */
1039/*                                                                           */
1040/*                  u4_ctx_cat : inidicates context category for residual    */
1041/*                  decoding.                                                */
1042/*                                                                           */
1043/*                  ps_dec : pointer to Decstruct (decoder context)          */
1044/*                                                                           */
1045/*                  pu1_top_nnz : top nnz pointer                            */
1046/*                                                                           */
1047/*                  pu1_left_nnz : left nnz pointer                          */
1048/*                                                                           */
1049/*  Globals       : No                                                       */
1050/*  Processing    : Parsing for four subblocks in unrolled, top and left nnz */
1051/*                  are updated on the fly. csbp is set in accordance to     */
1052/*                  decoded numcoeff for the subblock index in raster order  */
1053/*                                                                           */
1054/*  Outputs       : The updated residue buffer, nnzs and csbp current block  */
1055/*                                                                           */
1056/*  Returns       : Returns the coded sub block pattern csbp for the block   */
1057/*                                                                           */
1058/*  Issues        : <List any issues or problems with this function>         */
1059/*                                                                           */
1060/*  Revision History:                                                        */
1061/*                                                                           */
1062/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1063/*         09 10 2008   Jay          Draft                                   */
1064/*                                                                           */
1065/*****************************************************************************/
1066UWORD32 ih264d_cabac_parse_8x8block(WORD16 *pi2_coeff_block,
1067                                    UWORD32 u4_sub_block_strd,
1068                                    UWORD32 u4_ctx_cat,
1069                                    dec_struct_t * ps_dec,
1070                                    UWORD8 *pu1_top_nnz,
1071                                    UWORD8 *pu1_left_nnz)
1072{
1073    UWORD32 u4_ctxinc, u4_subblock_coded;
1074    UWORD32 u4_top0, u4_top1;
1075    UWORD32 u4_csbp = 0;
1076    UWORD32 u4_idx = 0;
1077    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1078    bin_ctxt_model_t * const ps_cbf = ps_dec->p_cbf_t[u4_ctx_cat];
1079    bin_ctxt_model_t *ps_src_bin_ctxt;
1080    bin_ctxt_model_t * const ps_sig_coeff_flag =
1081                    ps_dec->p_significant_coeff_flag_t[u4_ctx_cat];
1082
1083    UWORD8 *pu1_inv_scan = ps_dec->pu1_inv_scan;
1084
1085    /*------------------------------------------------------*/
1086    /* Residual 4x4 decoding: SubBlock 0                    */
1087    /*------------------------------------------------------*/
1088    u4_ctxinc = ((!!pu1_top_nnz[0]) << 1) + (!!pu1_left_nnz[0]);
1089
1090    ps_src_bin_ctxt = ps_cbf + u4_ctxinc;
1091
1092    u4_top0 = ih264d_read_coeff4x4_cabac( ps_bitstrm,
1093                                         u4_ctx_cat, ps_sig_coeff_flag, ps_dec,
1094                                         ps_src_bin_ctxt);
1095
1096    INSERT_BIT(u4_csbp, u4_idx, u4_top0);
1097
1098    /*------------------------------------------------------*/
1099    /* Residual 4x4 decoding: SubBlock 1                    */
1100    /*------------------------------------------------------*/
1101    u4_idx++;
1102    pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
1103    u4_ctxinc = ((!!pu1_top_nnz[1]) << 1) + u4_top0;
1104
1105    ps_src_bin_ctxt = ps_cbf + u4_ctxinc;
1106
1107    u4_top1 = ih264d_read_coeff4x4_cabac(ps_bitstrm,
1108                                         u4_ctx_cat, ps_sig_coeff_flag, ps_dec,
1109                                         ps_src_bin_ctxt);
1110
1111    INSERT_BIT(u4_csbp, u4_idx, u4_top1);
1112    pu1_left_nnz[0] = u4_top1;
1113
1114    /*------------------------------------------------------*/
1115    /* Residual 4x4 decoding: SubBlock 2                    */
1116    /*------------------------------------------------------*/
1117    u4_idx += (u4_sub_block_strd - 1);
1118    pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
1119    u4_ctxinc = (u4_top0 << 1) + (!!pu1_left_nnz[1]);
1120
1121    ps_src_bin_ctxt = ps_cbf + u4_ctxinc;
1122
1123    u4_subblock_coded = ih264d_read_coeff4x4_cabac(ps_bitstrm, u4_ctx_cat,
1124                                                   ps_sig_coeff_flag, ps_dec,
1125                                                   ps_src_bin_ctxt);
1126
1127    INSERT_BIT(u4_csbp, u4_idx, u4_subblock_coded);
1128    pu1_top_nnz[0] = u4_subblock_coded;
1129
1130    /*------------------------------------------------------*/
1131    /* Residual 4x4 decoding: SubBlock 3                    */
1132    /*------------------------------------------------------*/
1133    u4_idx++;
1134    pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
1135    u4_ctxinc = (u4_top1 << 1) + u4_subblock_coded;
1136
1137    ps_src_bin_ctxt = ps_cbf + u4_ctxinc;
1138
1139    u4_subblock_coded = ih264d_read_coeff4x4_cabac(ps_bitstrm, u4_ctx_cat,
1140                                                   ps_sig_coeff_flag, ps_dec,
1141                                                   ps_src_bin_ctxt);
1142
1143    INSERT_BIT(u4_csbp, u4_idx, u4_subblock_coded);
1144    pu1_top_nnz[1] = pu1_left_nnz[1] = u4_subblock_coded;
1145
1146    return (u4_csbp);
1147}
1148
1149/*!
1150 **************************************************************************
1151 * \if Function name : ih264d_parse_residual4x4_cabac \endif
1152 *
1153 * \brief
1154 *    This function parses CABAC syntax of a Luma and Chroma AC Residuals.
1155 *
1156 * \return
1157 *    0 on Success and Error code otherwise
1158 **************************************************************************
1159 */
1160
1161WORD32 ih264d_parse_residual4x4_cabac(dec_struct_t * ps_dec,
1162                                      dec_mb_info_t *ps_cur_mb_info,
1163                                      UWORD8 u1_offset)
1164{
1165    UWORD8 u1_cbp = ps_cur_mb_info->u1_cbp;
1166    UWORD16 ui16_csbp = 0;
1167    WORD16 *pi2_residual_buf;
1168    UWORD8 uc_ctx_cat;
1169    UWORD8 *pu1_top_nnz = ps_cur_mb_info->ps_curmb->pu1_nnz_y;
1170    UWORD8 *pu1_left_nnz = ps_dec->pu1_left_nnz_y;
1171    UWORD8 *pu1_top_nnz_uv = ps_cur_mb_info->ps_curmb->pu1_nnz_uv;
1172    ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
1173    ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
1174    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1175    UWORD32 u4_nbr_avail = ps_dec->u1_mb_ngbr_availablity;
1176    WORD16 *pi2_coeff_block = NULL;
1177    bin_ctxt_model_t *ps_src_bin_ctxt;
1178
1179    UWORD8 u1_top_dc_csbp = (ps_top_ctxt->u1_yuv_dc_csbp) >> 1;
1180    UWORD8 u1_left_dc_csbp = (ps_dec->pu1_left_yuv_dc_csbp[0]) >> 1;
1181
1182
1183    if(!(u4_nbr_avail & TOP_MB_AVAILABLE_MASK))
1184    {
1185        if(p_curr_ctxt->u1_mb_type & CAB_INTRA_MASK)
1186        {
1187            *(UWORD32 *)pu1_top_nnz = 0;
1188            u1_top_dc_csbp = 0;
1189            *(UWORD32 *)pu1_top_nnz_uv = 0;
1190        }
1191        else
1192        {
1193            *(UWORD32 *)pu1_top_nnz = 0x01010101;
1194            u1_top_dc_csbp = 0x3;
1195            *(UWORD32 *)pu1_top_nnz_uv = 0x01010101;
1196        }
1197    }
1198    else
1199    {
1200        UWORD32 *pu4_buf;
1201        UWORD8 *pu1_buf;
1202        pu1_buf = ps_cur_mb_info->ps_top_mb->pu1_nnz_y;
1203        pu4_buf = (UWORD32 *)pu1_buf;
1204        *(UWORD32 *)(pu1_top_nnz) = *pu4_buf;
1205
1206        pu1_buf = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv;
1207        pu4_buf = (UWORD32 *)pu1_buf;
1208        *(UWORD32 *)(pu1_top_nnz_uv) = *pu4_buf;
1209
1210    }
1211
1212    if(!(u4_nbr_avail & LEFT_MB_AVAILABLE_MASK))
1213    {
1214        if(p_curr_ctxt->u1_mb_type & CAB_INTRA_MASK)
1215        {
1216            UWORD32 *pu4_buf;
1217            UWORD8 *pu1_buf;
1218            *(UWORD32 *)pu1_left_nnz = 0;
1219            u1_left_dc_csbp = 0;
1220            pu1_buf = ps_dec->pu1_left_nnz_uv;
1221            pu4_buf = (UWORD32 *)pu1_buf;
1222            *pu4_buf = 0;
1223        }
1224        else
1225        {
1226            UWORD32 *pu4_buf;
1227            UWORD8 *pu1_buf;
1228            *(UWORD32 *)pu1_left_nnz = 0x01010101;
1229            u1_left_dc_csbp = 0x3;
1230            pu1_buf = ps_dec->pu1_left_nnz_uv;
1231            pu4_buf = (UWORD32 *)pu1_buf;
1232            *pu4_buf = 0x01010101;
1233        }
1234    }
1235
1236    uc_ctx_cat = u1_offset ? LUMA_AC_CTXCAT : LUMA_4X4_CTXCAT;
1237
1238    ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6;
1239    ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6;
1240    ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6;
1241    ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6;
1242    // CHECK_THIS
1243    ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6;
1244    ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6;
1245
1246    if(u1_cbp & 0x0f)
1247    {
1248        if(ps_cur_mb_info->u1_tran_form8x8 == 0)
1249        {
1250            /*******************************************************************/
1251            /* Block 0 residual decoding, check cbp and proceed (subblock = 0) */
1252            /*******************************************************************/
1253            if(!(u1_cbp & 0x1))
1254            {
1255                *(UWORD16 *)(pu1_top_nnz) = 0;
1256                *(UWORD16 *)(pu1_left_nnz) = 0;
1257            }
1258            else
1259            {
1260                ui16_csbp = ih264d_cabac_parse_8x8block(pi2_coeff_block, 4,
1261                                                        uc_ctx_cat, ps_dec,
1262                                                        pu1_top_nnz,
1263                                                        pu1_left_nnz);
1264            }
1265
1266            /*******************************************************************/
1267            /* Block 1 residual decoding, check cbp and proceed (subblock = 2) */
1268            /*******************************************************************/
1269            pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK);
1270            if(!(u1_cbp & 0x2))
1271            {
1272                *(UWORD16 *)(pu1_top_nnz + 2) = 0;
1273                *(UWORD16 *)(pu1_left_nnz) = 0;
1274            }
1275            else
1276            {
1277                UWORD32 u4_temp = ih264d_cabac_parse_8x8block(pi2_coeff_block,
1278                                                              4, uc_ctx_cat,
1279                                                              ps_dec,
1280                                                              (pu1_top_nnz + 2),
1281                                                              pu1_left_nnz);
1282                ui16_csbp |= (u4_temp << 2);
1283            }
1284
1285            /*******************************************************************/
1286            /* Block 2 residual decoding, check cbp and proceed (subblock = 8) */
1287            /*******************************************************************/
1288            pi2_coeff_block += (6 * NUM_COEFFS_IN_4x4BLK);
1289            if(!(u1_cbp & 0x4))
1290            {
1291                *(UWORD16 *)(pu1_top_nnz) = 0;
1292                *(UWORD16 *)(pu1_left_nnz + 2) = 0;
1293            }
1294            else
1295            {
1296                UWORD32 u4_temp = ih264d_cabac_parse_8x8block(
1297                                pi2_coeff_block, 4, uc_ctx_cat, ps_dec,
1298                                pu1_top_nnz, (pu1_left_nnz + 2));
1299                ui16_csbp |= (u4_temp << 8);
1300            }
1301
1302            /*******************************************************************/
1303            /* Block 3 residual decoding, check cbp and proceed (subblock = 10)*/
1304            /*******************************************************************/
1305            pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK);
1306            if(!(u1_cbp & 0x8))
1307            {
1308                *(UWORD16 *)(pu1_top_nnz + 2) = 0;
1309                *(UWORD16 *)(pu1_left_nnz + 2) = 0;
1310            }
1311            else
1312            {
1313                UWORD32 u4_temp = ih264d_cabac_parse_8x8block(
1314                                pi2_coeff_block, 4, uc_ctx_cat, ps_dec,
1315                                (pu1_top_nnz + 2), (pu1_left_nnz + 2));
1316                ui16_csbp |= (u4_temp << 10);
1317            }
1318
1319        }
1320        else
1321        {
1322            ui16_csbp = 0;
1323
1324            /*******************************************************************/
1325            /* Block 0 residual decoding, check cbp and proceed (subblock = 0) */
1326            /*******************************************************************/
1327            if(!(u1_cbp & 0x1))
1328            {
1329                *(UWORD16 *)(pu1_top_nnz) = 0;
1330                *(UWORD16 *)(pu1_left_nnz) = 0;
1331            }
1332            else
1333            {
1334
1335                dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1336
1337                ih264d_read_coeff8x8_cabac( ps_bitstrm,
1338                                           ps_dec, ps_cur_mb_info);
1339
1340                pu1_left_nnz[0] = 1;
1341                pu1_left_nnz[1] = 1;
1342
1343                pu1_top_nnz[0] = 1;
1344                pu1_top_nnz[1] = 1;
1345
1346                /* added to be used by BS computation module */
1347                ui16_csbp |= 0x0033;
1348            }
1349
1350            /*******************************************************************/
1351            /* Block 1 residual decoding, check cbp and proceed (subblock = 2) */
1352            /*******************************************************************/
1353            pi2_coeff_block += 64;
1354
1355            if(!(u1_cbp & 0x2))
1356            {
1357                *(UWORD16 *)(pu1_top_nnz + 2) = 0;
1358                *(UWORD16 *)(pu1_left_nnz) = 0;
1359            }
1360            else
1361            {
1362
1363
1364                dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1365
1366                ih264d_read_coeff8x8_cabac(ps_bitstrm,
1367                                           ps_dec, ps_cur_mb_info);
1368
1369                pu1_left_nnz[0] = 1;
1370                pu1_left_nnz[1] = 1;
1371
1372                pu1_top_nnz[2] = 1;
1373                pu1_top_nnz[3] = 1;
1374
1375                /* added to be used by BS computation module */
1376                ui16_csbp |= 0x00CC;
1377
1378            }
1379
1380            /*******************************************************************/
1381            /* Block 2 residual decoding, check cbp and proceed (subblock = 8) */
1382            /*******************************************************************/
1383            pi2_coeff_block += 64;
1384            if(!(u1_cbp & 0x4))
1385            {
1386                *(UWORD16 *)(pu1_top_nnz) = 0;
1387                *(UWORD16 *)(pu1_left_nnz + 2) = 0;
1388            }
1389            else
1390            {
1391
1392                dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1393
1394                ih264d_read_coeff8x8_cabac(ps_bitstrm,
1395                                           ps_dec, ps_cur_mb_info);
1396
1397                pu1_left_nnz[2] = 1;
1398                pu1_left_nnz[3] = 1;
1399
1400                pu1_top_nnz[0] = 1;
1401                pu1_top_nnz[1] = 1;
1402
1403                /* added to be used by BS computation module */
1404                ui16_csbp |= 0x3300;
1405            }
1406
1407            /*******************************************************************/
1408            /* Block 3 residual decoding, check cbp and proceed (subblock = 10)*/
1409            /*******************************************************************/
1410            pi2_coeff_block += 64;
1411
1412            if(!(u1_cbp & 0x8))
1413            {
1414                *(UWORD16 *)(pu1_top_nnz + 2) = 0;
1415                *(UWORD16 *)(pu1_left_nnz + 2) = 0;
1416            }
1417            else
1418            {
1419
1420                dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1421
1422                ih264d_read_coeff8x8_cabac(ps_bitstrm,
1423                                           ps_dec, ps_cur_mb_info);
1424
1425                pu1_left_nnz[2] = 1;
1426                pu1_left_nnz[3] = 1;
1427
1428                pu1_top_nnz[2] = 1;
1429                pu1_top_nnz[3] = 1;
1430
1431                /* added to be used by BS computation module */
1432                ui16_csbp |= 0xCC00;
1433            }
1434        }
1435    }
1436    else
1437    {
1438        *(UWORD32 *)(pu1_top_nnz) = 0;
1439        *(UWORD32 *)(pu1_left_nnz) = 0;
1440    }
1441    /*--------------------------------------------------------------------*/
1442    /* Store the last row of N values to top row                          */
1443    /*--------------------------------------------------------------------*/
1444    ps_cur_mb_info->u2_luma_csbp = ui16_csbp;
1445    ps_cur_mb_info->ps_curmb->u2_luma_csbp = ui16_csbp;
1446    {
1447        WORD8 i;
1448        UWORD16 u2_chroma_csbp = 0;
1449        ps_cur_mb_info->u2_chroma_csbp = 0;
1450
1451        u1_cbp >>= 4;
1452        pu1_top_nnz = pu1_top_nnz_uv;
1453        pu1_left_nnz = ps_dec->pu1_left_nnz_uv;
1454        /*--------------------------------------------------------------------*/
1455        /* if Chroma Component not present OR no ac values present            */
1456        /* Set the values of N to zero                                        */
1457        /*--------------------------------------------------------------------*/
1458        if(u1_cbp == CBPC_ALLZERO)
1459        {
1460            ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x1;
1461            *(UWORD32 *)(pu1_top_nnz) = 0;
1462            *(UWORD32 *)(pu1_left_nnz) = 0;
1463            p_curr_ctxt->u1_yuv_dc_csbp &= 0x1;
1464            return (0);
1465        }
1466
1467        /*--------------------------------------------------------------------*/
1468        /* Decode Chroma DC values                                            */
1469        /*--------------------------------------------------------------------*/
1470        for(i = 0; i < 2; i++)
1471        {
1472            UWORD8 uc_a = 1, uc_b = 1;
1473            UWORD32 u4_ctx_inc;
1474            UWORD8 uc_codedBlockFlag;
1475            UWORD8 pu1_inv_scan[4] =
1476                { 0, 1, 2, 3 };
1477            WORD32 u4_scale;
1478            WORD32 i4_mb_inter_inc;
1479            tu_sblk4x4_coeff_data_t *ps_tu_4x4 =
1480                            (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
1481            WORD16 *pi2_coeff_data =
1482                            (WORD16 *)ps_dec->pv_parse_tu_coeff_data;
1483            WORD16 ai2_dc_coef[4];
1484
1485            INC_SYM_COUNT(&(ps_dec->s_cab_dec_env));
1486            u4_scale = (i) ?
1487                            (ps_dec->pu2_quant_scale_v[0]
1488                                            << ps_dec->u1_qp_v_div6) :
1489                            (ps_dec->pu2_quant_scale_u[0]
1490                                            << ps_dec->u1_qp_u_div6);
1491
1492            /*--------------------------------------------------------------------*/
1493            /* Decode Bitstream to get the DC coeff                               */
1494            /*--------------------------------------------------------------------*/
1495            uc_a = (u1_left_dc_csbp >> i) & 0x01;
1496            uc_b = (u1_top_dc_csbp >> i) & 0x01;
1497            u4_ctx_inc = (uc_a + (uc_b << 1));
1498
1499            ps_src_bin_ctxt = (ps_dec->p_cbf_t[CHROMA_DC_CTXCAT]) + u4_ctx_inc;
1500
1501            uc_codedBlockFlag =
1502                            ih264d_read_coeff4x4_cabac(ps_bitstrm,
1503                                            CHROMA_DC_CTXCAT,
1504                                            ps_dec->p_significant_coeff_flag_t[CHROMA_DC_CTXCAT],
1505                                            ps_dec, ps_src_bin_ctxt);
1506
1507            i4_mb_inter_inc = (!((ps_cur_mb_info->ps_curmb->u1_mb_type == I_4x4_MB)
1508                            || (ps_cur_mb_info->ps_curmb->u1_mb_type == I_16x16_MB)))
1509                            * 3;
1510
1511            if(ps_dec->s_high_profile.u1_scaling_present)
1512            {
1513                u4_scale *=
1514                                ps_dec->s_high_profile.i2_scalinglist4x4[i4_mb_inter_inc
1515                                                + 1 + i][0];
1516
1517            }
1518            else
1519            {
1520                u4_scale <<= 4;
1521            }
1522
1523            if(uc_codedBlockFlag)
1524            {
1525                WORD32 i_z0, i_z1, i_z2, i_z3;
1526                WORD32 *pi4_scale;
1527
1528                SET_BIT(u1_top_dc_csbp, i);
1529                SET_BIT(u1_left_dc_csbp, i);
1530
1531                ai2_dc_coef[0] = 0;
1532                ai2_dc_coef[1] = 0;
1533                ai2_dc_coef[2] = 0;
1534                ai2_dc_coef[3] = 0;
1535
1536                ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4,
1537                                                 ai2_dc_coef,
1538                                                 pu1_inv_scan);
1539                i_z0 = (ai2_dc_coef[0] + ai2_dc_coef[2]);
1540                i_z1 = (ai2_dc_coef[0] - ai2_dc_coef[2]);
1541                i_z2 = (ai2_dc_coef[1] - ai2_dc_coef[3]);
1542                i_z3 = (ai2_dc_coef[1] + ai2_dc_coef[3]);
1543
1544                /*-----------------------------------------------------------*/
1545                /* Scaling and storing the values back                       */
1546                /*-----------------------------------------------------------*/
1547                *pi2_coeff_data++ = ((i_z0 + i_z3) * u4_scale) >> 5;
1548                *pi2_coeff_data++ = ((i_z0 - i_z3) * u4_scale) >> 5;
1549                *pi2_coeff_data++ = ((i_z1 + i_z2) * u4_scale) >> 5;
1550                *pi2_coeff_data++ = ((i_z1 - i_z2) * u4_scale) >> 5;
1551
1552                ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_data;
1553
1554                SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,(i+1));
1555            }
1556            else
1557            {
1558                CLEARBIT(u1_top_dc_csbp, i);
1559                CLEARBIT(u1_left_dc_csbp, i);
1560            }
1561        }
1562
1563        /*********************************************************************/
1564        /*                   Update the DC csbp                              */
1565        /*********************************************************************/
1566        ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x1;
1567        p_curr_ctxt->u1_yuv_dc_csbp &= 0x1;
1568        ps_dec->pu1_left_yuv_dc_csbp[0] |= (u1_left_dc_csbp << 1);
1569        p_curr_ctxt->u1_yuv_dc_csbp |= (u1_top_dc_csbp << 1);
1570        if(u1_cbp == CBPC_ACZERO)
1571        {
1572            *(UWORD32 *)(pu1_top_nnz) = 0;
1573            *(UWORD32 *)(pu1_left_nnz) = 0;
1574            return (0);
1575        }
1576        /*--------------------------------------------------------------------*/
1577        /* Decode Chroma AC values                                            */
1578        /*--------------------------------------------------------------------*/
1579        {
1580            UWORD32 u4_temp;
1581            /*****************************************************************/
1582            /* U Block  residual decoding, check cbp and proceed (subblock=0)*/
1583            /*****************************************************************/
1584            u2_chroma_csbp = ih264d_cabac_parse_8x8block(pi2_coeff_block, 2,
1585            CHROMA_AC_CTXCAT,
1586                                                         ps_dec, pu1_top_nnz,
1587                                                         pu1_left_nnz);
1588
1589            pi2_coeff_block += MB_CHROM_SIZE;
1590            /*****************************************************************/
1591            /* V Block  residual decoding, check cbp and proceed (subblock=1)*/
1592            /*****************************************************************/
1593            u4_temp = ih264d_cabac_parse_8x8block(pi2_coeff_block, 2,
1594            CHROMA_AC_CTXCAT,
1595                                                  ps_dec, (pu1_top_nnz + 2),
1596                                                  (pu1_left_nnz + 2));
1597            u2_chroma_csbp |= (u4_temp << 4);
1598        }
1599        /*********************************************************************/
1600        /*                   Update the AC csbp                              */
1601        /*********************************************************************/
1602        ps_cur_mb_info->u2_chroma_csbp = u2_chroma_csbp;
1603    }
1604
1605    return (0);
1606}
1607
1608