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 
ih264d_read_coeff4x4_cabac(dec_bit_stream_t * ps_bitstrm,UWORD32 u4_ctxcat,bin_ctxt_model_t * ps_ctxt_sig_coeff,dec_struct_t * ps_dec,bin_ctxt_model_t * ps_ctxt_coded)64 UWORD8 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 
ih264d_read_coeff8x8_cabac(dec_bit_stream_t * ps_bitstrm,dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info)582 void 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 /*****************************************************************************/
ih264d_cabac_parse_8x8block(WORD16 * pi2_coeff_block,UWORD32 u4_sub_block_strd,UWORD32 u4_ctx_cat,dec_struct_t * ps_dec,UWORD8 * pu1_top_nnz,UWORD8 * pu1_left_nnz)1066 UWORD32 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 
ih264d_parse_residual4x4_cabac(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_offset)1161 WORD32 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