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