xref: /aosp_15_r20/external/libhevc/decoder/ihevcd_parse_residual.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4*c83a76b0SSuyog Pawar *
5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar *
9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar *
11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar * limitations under the License.
16*c83a76b0SSuyog Pawar *
17*c83a76b0SSuyog Pawar ******************************************************************************/
18*c83a76b0SSuyog Pawar /**
19*c83a76b0SSuyog Pawar *******************************************************************************
20*c83a76b0SSuyog Pawar * @file
21*c83a76b0SSuyog Pawar *  ihevcd_parse_residual.c
22*c83a76b0SSuyog Pawar *
23*c83a76b0SSuyog Pawar * @brief
24*c83a76b0SSuyog Pawar *  Contains functions for parsing residual data at TU level
25*c83a76b0SSuyog Pawar *
26*c83a76b0SSuyog Pawar * @author
27*c83a76b0SSuyog Pawar *  Harish
28*c83a76b0SSuyog Pawar *
29*c83a76b0SSuyog Pawar * @par List of Functions:
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * @remarks
32*c83a76b0SSuyog Pawar *  None
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar *******************************************************************************
35*c83a76b0SSuyog Pawar */
36*c83a76b0SSuyog Pawar /*****************************************************************************/
37*c83a76b0SSuyog Pawar /* File Includes                                                             */
38*c83a76b0SSuyog Pawar /*****************************************************************************/
39*c83a76b0SSuyog Pawar #include <stdio.h>
40*c83a76b0SSuyog Pawar #include <stddef.h>
41*c83a76b0SSuyog Pawar #include <stdlib.h>
42*c83a76b0SSuyog Pawar #include <string.h>
43*c83a76b0SSuyog Pawar #include <assert.h>
44*c83a76b0SSuyog Pawar 
45*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
46*c83a76b0SSuyog Pawar #include "iv.h"
47*c83a76b0SSuyog Pawar #include "ivd.h"
48*c83a76b0SSuyog Pawar #include "ihevcd_cxa.h"
49*c83a76b0SSuyog Pawar 
50*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
51*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
52*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
53*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
54*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
55*c83a76b0SSuyog Pawar 
56*c83a76b0SSuyog Pawar #include "ihevc_common_tables.h"
57*c83a76b0SSuyog Pawar #include "ihevc_error.h"
58*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
59*c83a76b0SSuyog Pawar 
60*c83a76b0SSuyog Pawar #include "ihevcd_trace.h"
61*c83a76b0SSuyog Pawar #include "ihevcd_defs.h"
62*c83a76b0SSuyog Pawar #include "ihevcd_function_selector.h"
63*c83a76b0SSuyog Pawar #include "ihevcd_structs.h"
64*c83a76b0SSuyog Pawar #include "ihevcd_error.h"
65*c83a76b0SSuyog Pawar #include "ihevcd_nal.h"
66*c83a76b0SSuyog Pawar #include "ihevcd_bitstream.h"
67*c83a76b0SSuyog Pawar #include "ihevcd_utils.h"
68*c83a76b0SSuyog Pawar #include "ihevcd_parse_residual.h"
69*c83a76b0SSuyog Pawar #include "ihevcd_cabac.h"
70*c83a76b0SSuyog Pawar 
71*c83a76b0SSuyog Pawar /**
72*c83a76b0SSuyog Pawar   *****************************************************************************
73*c83a76b0SSuyog Pawar   * @brief  returns context increment for sig coeff based on csbf neigbour
74*c83a76b0SSuyog Pawar   *         flags (bottom and right) and current coeff postion in 4x4 block
75*c83a76b0SSuyog Pawar   *         See section 9.3.3.1.4 for details on this context increment
76*c83a76b0SSuyog Pawar   *
77*c83a76b0SSuyog Pawar   * input   : neigbour csbf flags(bit0:rightcsbf, bit1:bottom csbf)
78*c83a76b0SSuyog Pawar   *           coeff idx in raster order (0-15)
79*c83a76b0SSuyog Pawar   *
80*c83a76b0SSuyog Pawar   * output  : context increment for sig coeff flag
81*c83a76b0SSuyog Pawar   *
82*c83a76b0SSuyog Pawar   *****************************************************************************
83*c83a76b0SSuyog Pawar   */
84*c83a76b0SSuyog Pawar const UWORD8 gau1_ihevcd_sigcoeff_ctxtinc[3][4][16] =
85*c83a76b0SSuyog Pawar {
86*c83a76b0SSuyog Pawar 
87*c83a76b0SSuyog Pawar     {
88*c83a76b0SSuyog Pawar         /* nbr csbf = 0:  sigCtx = (xP+yP == 0) ? 2 : (xP+yP < 3) ? 1: 0 */
89*c83a76b0SSuyog Pawar         { 2,    1,    1,    1,    1,    1,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0 },
90*c83a76b0SSuyog Pawar         /* nbr csbf = 1:  sigCtx = (yP == 0) ? 2 : (yP == 1) ? 1: 0      */
91*c83a76b0SSuyog Pawar         { 2,    1,    2,    0,    1,    2,    0,    0,    1,    2,    0,    0,    1,    0,    0,    0 },
92*c83a76b0SSuyog Pawar         /* nbr csbf = 2:  sigCtx = (xP == 0) ? 2 : (xP == 1) ? 1: 0      */
93*c83a76b0SSuyog Pawar         { 2,    2,    1,    2,    1,    0,    2,    1,    0,    0,    1,    0,    0,    0,    0,    0 },
94*c83a76b0SSuyog Pawar         /* nbr csbf = 3:  sigCtx = 2                                     */
95*c83a76b0SSuyog Pawar         { 2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2 },
96*c83a76b0SSuyog Pawar     },
97*c83a76b0SSuyog Pawar     {
98*c83a76b0SSuyog Pawar         /* nbr csbf = 0:  sigCtx = (xP+yP == 0) ? 2 : (xP+yP < 3) ? 1: 0 */
99*c83a76b0SSuyog Pawar         { 2,    1,    1,    0,    1,    1,    0,    0,    1,    0,    0,    0,    0,    0,    0,    0 },
100*c83a76b0SSuyog Pawar         /* nbr csbf = 1:  sigCtx = (yP == 0) ? 2 : (yP == 1) ? 1: 0      */
101*c83a76b0SSuyog Pawar         { 2,    2,    2,    2,    1,    1,    1,    1,    0,    0,    0,    0,    0,    0,    0,    0 },
102*c83a76b0SSuyog Pawar         /* nbr csbf = 2:  sigCtx = (xP == 0) ? 2 : (xP == 1) ? 1: 0      */
103*c83a76b0SSuyog Pawar         { 2,    1,    0,    0,    2,    1,    0,    0,    2,    1,    0,    0,    2,    1,    0,    0 },
104*c83a76b0SSuyog Pawar         /* nbr csbf = 3:  sigCtx = 2                                     */
105*c83a76b0SSuyog Pawar         { 2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2 },
106*c83a76b0SSuyog Pawar     },
107*c83a76b0SSuyog Pawar     {
108*c83a76b0SSuyog Pawar         /* nbr csbf = 0:  sigCtx = (xP+yP == 0) ? 2 : (xP+yP < 3) ? 1: 0 */
109*c83a76b0SSuyog Pawar         { 2,    1,    1,    0,    1,    1,    0,    0,    1,    0,    0,    0,    0,    0,    0,    0 },
110*c83a76b0SSuyog Pawar         /* nbr csbf = 1:  sigCtx = (yP == 0) ? 2 : (yP == 1) ? 1: 0      */
111*c83a76b0SSuyog Pawar         { 2,    1,    0,    0,    2,    1,    0,    0,    2,    1,    0,    0,    2,    1,    0,    0 },
112*c83a76b0SSuyog Pawar         /* nbr csbf = 2:  sigCtx = (xP == 0) ? 2 : (xP == 1) ? 1: 0      */
113*c83a76b0SSuyog Pawar         { 2,    2,    2,    2,    1,    1,    1,    1,    0,    0,    0,    0,    0,    0,    0,    0 },
114*c83a76b0SSuyog Pawar         /* nbr csbf = 3:  sigCtx = 2                                     */
115*c83a76b0SSuyog Pawar         { 2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2 },
116*c83a76b0SSuyog Pawar     },
117*c83a76b0SSuyog Pawar 
118*c83a76b0SSuyog Pawar 
119*c83a76b0SSuyog Pawar };
120*c83a76b0SSuyog Pawar 
121*c83a76b0SSuyog Pawar 
122*c83a76b0SSuyog Pawar 
123*c83a76b0SSuyog Pawar /**
124*c83a76b0SSuyog Pawar   *****************************************************************************
125*c83a76b0SSuyog Pawar   * @brief  returns context increment for sig coeff for 4x4 tranform size as
126*c83a76b0SSuyog Pawar   *         per Table 9-39 in section 9.3.3.1.4
127*c83a76b0SSuyog Pawar   *
128*c83a76b0SSuyog Pawar   * input   : coeff idx in raster order (0-15)
129*c83a76b0SSuyog Pawar   *
130*c83a76b0SSuyog Pawar   * output  : context increment for sig coeff flag
131*c83a76b0SSuyog Pawar   *
132*c83a76b0SSuyog Pawar   *****************************************************************************
133*c83a76b0SSuyog Pawar   */
134*c83a76b0SSuyog Pawar const UWORD8 gau1_ihevcd_sigcoeff_ctxtinc_tr4[3][16] =
135*c83a76b0SSuyog Pawar {
136*c83a76b0SSuyog Pawar     /* Upright diagonal scan */
137*c83a76b0SSuyog Pawar     {
138*c83a76b0SSuyog Pawar         0,    2,    1,    6,
139*c83a76b0SSuyog Pawar         3,    4,    7,    6,
140*c83a76b0SSuyog Pawar         4,    5,    7,    8,
141*c83a76b0SSuyog Pawar         5,    8,    8,    8,
142*c83a76b0SSuyog Pawar     },
143*c83a76b0SSuyog Pawar     /* Horizontal scan */
144*c83a76b0SSuyog Pawar     {
145*c83a76b0SSuyog Pawar         0,    1,    4,    5,
146*c83a76b0SSuyog Pawar         2,    3,    4,    5,
147*c83a76b0SSuyog Pawar         6,    6,    8,    8,
148*c83a76b0SSuyog Pawar         7,    7,    8,    8,
149*c83a76b0SSuyog Pawar     },
150*c83a76b0SSuyog Pawar     /* Vertical scan */
151*c83a76b0SSuyog Pawar     {
152*c83a76b0SSuyog Pawar         0,    2,    6,    7,
153*c83a76b0SSuyog Pawar         1,    3,    6,    7,
154*c83a76b0SSuyog Pawar         4,    4,    8,    8,
155*c83a76b0SSuyog Pawar         5,    5,    8,    8,
156*c83a76b0SSuyog Pawar     },
157*c83a76b0SSuyog Pawar };
158*c83a76b0SSuyog Pawar 
159*c83a76b0SSuyog Pawar 
160*c83a76b0SSuyog Pawar /**
161*c83a76b0SSuyog Pawar *******************************************************************************
162*c83a76b0SSuyog Pawar *
163*c83a76b0SSuyog Pawar * @brief
164*c83a76b0SSuyog Pawar *  Parses Residual coding
165*c83a76b0SSuyog Pawar *
166*c83a76b0SSuyog Pawar * @par Description:
167*c83a76b0SSuyog Pawar *  Parses Residual coding as per  Section:7.3.13
168*c83a76b0SSuyog Pawar *
169*c83a76b0SSuyog Pawar * @param[in] ps_codec
170*c83a76b0SSuyog Pawar *  Pointer to codec context
171*c83a76b0SSuyog Pawar *
172*c83a76b0SSuyog Pawar * @returns  error code from IHEVCD_ERROR_T
173*c83a76b0SSuyog Pawar *
174*c83a76b0SSuyog Pawar * @remarks
175*c83a76b0SSuyog Pawar *
176*c83a76b0SSuyog Pawar *
177*c83a76b0SSuyog Pawar *******************************************************************************
178*c83a76b0SSuyog Pawar */
179*c83a76b0SSuyog Pawar 
ihevcd_parse_residual_coding(codec_t * ps_codec,WORD32 x0,WORD32 y0,WORD32 log2_trafo_size,WORD32 c_idx,WORD32 intra_pred_mode)180*c83a76b0SSuyog Pawar WORD32 ihevcd_parse_residual_coding(codec_t *ps_codec,
181*c83a76b0SSuyog Pawar                                     WORD32 x0, WORD32 y0,
182*c83a76b0SSuyog Pawar                                     WORD32 log2_trafo_size,
183*c83a76b0SSuyog Pawar                                     WORD32 c_idx,
184*c83a76b0SSuyog Pawar                                     WORD32 intra_pred_mode)
185*c83a76b0SSuyog Pawar {
186*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
187*c83a76b0SSuyog Pawar     WORD32 transform_skip_flag;
188*c83a76b0SSuyog Pawar     WORD32 value;
189*c83a76b0SSuyog Pawar     pps_t *ps_pps;
190*c83a76b0SSuyog Pawar     WORD32 last_scan_pos, last_sub_blk;
191*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
192*c83a76b0SSuyog Pawar     WORD32 last_significant_coeff_x_prefix, last_significant_coeff_y_prefix;
193*c83a76b0SSuyog Pawar     WORD32 last_significant_coeff_x, last_significant_coeff_y;
194*c83a76b0SSuyog Pawar     const UWORD8 *pu1_scan_blk = NULL, *pu1_scan_coeff;
195*c83a76b0SSuyog Pawar     WORD32 scan_idx;
196*c83a76b0SSuyog Pawar     WORD32 i;
197*c83a76b0SSuyog Pawar     WORD32 sign_data_hiding_flag;
198*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_codec->s_parse.s_cabac;
199*c83a76b0SSuyog Pawar     WORD32 gt1_ctxt = 1;
200*c83a76b0SSuyog Pawar     WORD32 c_max;
201*c83a76b0SSuyog Pawar     UWORD16 au2_csbf[9];
202*c83a76b0SSuyog Pawar     tu_sblk_coeff_data_t *ps_tu_sblk_coeff_data;
203*c83a76b0SSuyog Pawar     WORD8 *pi1_num_coded_subblks;
204*c83a76b0SSuyog Pawar     WORD32 num_subblks;
205*c83a76b0SSuyog Pawar     WORD32 sig_coeff_base_ctxt, abs_gt1_base_ctxt;
206*c83a76b0SSuyog Pawar     UNUSED(x0);
207*c83a76b0SSuyog Pawar     UNUSED(y0);
208*c83a76b0SSuyog Pawar     ps_pps = ps_codec->s_parse.ps_pps;
209*c83a76b0SSuyog Pawar 
210*c83a76b0SSuyog Pawar     sign_data_hiding_flag = ps_pps->i1_sign_data_hiding_flag;
211*c83a76b0SSuyog Pawar     transform_skip_flag = 0;
212*c83a76b0SSuyog Pawar     if(ps_pps->i1_transform_skip_enabled_flag &&
213*c83a76b0SSuyog Pawar        !ps_codec->s_parse.s_cu.i4_cu_transquant_bypass &&
214*c83a76b0SSuyog Pawar        (log2_trafo_size == 2))
215*c83a76b0SSuyog Pawar     {
216*c83a76b0SSuyog Pawar         WORD32 ctxt_idx;
217*c83a76b0SSuyog Pawar 
218*c83a76b0SSuyog Pawar         if(!c_idx)
219*c83a76b0SSuyog Pawar         {
220*c83a76b0SSuyog Pawar             ctxt_idx = IHEVC_CAB_TFM_SKIP0;
221*c83a76b0SSuyog Pawar         }
222*c83a76b0SSuyog Pawar         else
223*c83a76b0SSuyog Pawar         {
224*c83a76b0SSuyog Pawar             ctxt_idx = IHEVC_CAB_TFM_SKIP12;
225*c83a76b0SSuyog Pawar         }
226*c83a76b0SSuyog Pawar         TRACE_CABAC_CTXT("transform_skip_flag", ps_cabac->u4_range, ctxt_idx);
227*c83a76b0SSuyog Pawar         value = ihevcd_cabac_decode_bin(ps_cabac,
228*c83a76b0SSuyog Pawar                                         ps_bitstrm,
229*c83a76b0SSuyog Pawar                                         ctxt_idx);
230*c83a76b0SSuyog Pawar         AEV_TRACE("transform_skip_flag", value, ps_cabac->u4_range);
231*c83a76b0SSuyog Pawar         transform_skip_flag = value;
232*c83a76b0SSuyog Pawar     }
233*c83a76b0SSuyog Pawar 
234*c83a76b0SSuyog Pawar     /* code the last_coeff_x_prefix as tunary binarized code */
235*c83a76b0SSuyog Pawar     {
236*c83a76b0SSuyog Pawar         WORD32 ctxt_idx_x, ctxt_idx_y, ctx_shift;
237*c83a76b0SSuyog Pawar         WORD32 ctx_offset;
238*c83a76b0SSuyog Pawar         c_max = (log2_trafo_size << 1) - 1;
239*c83a76b0SSuyog Pawar 
240*c83a76b0SSuyog Pawar         if(!c_idx)
241*c83a76b0SSuyog Pawar         {
242*c83a76b0SSuyog Pawar             ctx_offset = (3 * (log2_trafo_size - 2)) + ((log2_trafo_size - 1) >> 2);
243*c83a76b0SSuyog Pawar             ctxt_idx_x = IHEVC_CAB_COEFFX_PREFIX + ctx_offset;
244*c83a76b0SSuyog Pawar             ctxt_idx_y = IHEVC_CAB_COEFFY_PREFIX + ctx_offset;
245*c83a76b0SSuyog Pawar             ctx_shift  = (log2_trafo_size + 1) >> 2;
246*c83a76b0SSuyog Pawar         }
247*c83a76b0SSuyog Pawar         else
248*c83a76b0SSuyog Pawar         {
249*c83a76b0SSuyog Pawar             ctxt_idx_x = IHEVC_CAB_COEFFX_PREFIX + 15;
250*c83a76b0SSuyog Pawar             ctxt_idx_y = IHEVC_CAB_COEFFY_PREFIX + 15;
251*c83a76b0SSuyog Pawar             ctx_shift  = log2_trafo_size  - 2;
252*c83a76b0SSuyog Pawar         }
253*c83a76b0SSuyog Pawar 
254*c83a76b0SSuyog Pawar         TRACE_CABAC_CTXT("last_coeff_x_prefix", ps_cabac->u4_range, ctxt_idx_x);
255*c83a76b0SSuyog Pawar         last_significant_coeff_x_prefix = ihevcd_cabac_decode_bins_tunary(ps_cabac,
256*c83a76b0SSuyog Pawar                                                                           ps_bitstrm,
257*c83a76b0SSuyog Pawar                                                                           c_max,
258*c83a76b0SSuyog Pawar                                                                           ctxt_idx_x,
259*c83a76b0SSuyog Pawar                                                                           ctx_shift,
260*c83a76b0SSuyog Pawar                                                                           c_max);
261*c83a76b0SSuyog Pawar 
262*c83a76b0SSuyog Pawar         AEV_TRACE("last_coeff_x_prefix", last_significant_coeff_x_prefix, ps_cabac->u4_range);
263*c83a76b0SSuyog Pawar 
264*c83a76b0SSuyog Pawar         TRACE_CABAC_CTXT("last_coeff_y_prefix", ps_cabac->u4_range, ctxt_idx_y);
265*c83a76b0SSuyog Pawar         last_significant_coeff_y_prefix = ihevcd_cabac_decode_bins_tunary(ps_cabac,
266*c83a76b0SSuyog Pawar                                                                           ps_bitstrm,
267*c83a76b0SSuyog Pawar                                                                           c_max,
268*c83a76b0SSuyog Pawar                                                                           ctxt_idx_y,
269*c83a76b0SSuyog Pawar                                                                           ctx_shift,
270*c83a76b0SSuyog Pawar                                                                           c_max);
271*c83a76b0SSuyog Pawar 
272*c83a76b0SSuyog Pawar         AEV_TRACE("last_coeff_y_prefix", last_significant_coeff_y_prefix, ps_cabac->u4_range);
273*c83a76b0SSuyog Pawar 
274*c83a76b0SSuyog Pawar 
275*c83a76b0SSuyog Pawar         last_significant_coeff_x = last_significant_coeff_x_prefix;
276*c83a76b0SSuyog Pawar         if(last_significant_coeff_x_prefix > 3)
277*c83a76b0SSuyog Pawar         {
278*c83a76b0SSuyog Pawar             WORD32 suf_length = ((last_significant_coeff_x_prefix - 2) >> 1);
279*c83a76b0SSuyog Pawar 
280*c83a76b0SSuyog Pawar             value = ihevcd_cabac_decode_bypass_bins(ps_cabac,
281*c83a76b0SSuyog Pawar                                                     ps_bitstrm,
282*c83a76b0SSuyog Pawar                                                     suf_length);
283*c83a76b0SSuyog Pawar 
284*c83a76b0SSuyog Pawar             AEV_TRACE("last_coeff_x_suffix", value, ps_cabac->u4_range);
285*c83a76b0SSuyog Pawar 
286*c83a76b0SSuyog Pawar 
287*c83a76b0SSuyog Pawar             last_significant_coeff_x =
288*c83a76b0SSuyog Pawar                             (1 << ((last_significant_coeff_x_prefix >> 1) - 1)) *
289*c83a76b0SSuyog Pawar                             (2 + (last_significant_coeff_x_prefix & 1)) + value;
290*c83a76b0SSuyog Pawar         }
291*c83a76b0SSuyog Pawar 
292*c83a76b0SSuyog Pawar 
293*c83a76b0SSuyog Pawar         last_significant_coeff_y = last_significant_coeff_y_prefix;
294*c83a76b0SSuyog Pawar         if(last_significant_coeff_y_prefix > 3)
295*c83a76b0SSuyog Pawar         {
296*c83a76b0SSuyog Pawar             WORD32 suf_length = ((last_significant_coeff_y_prefix - 2) >> 1);
297*c83a76b0SSuyog Pawar             value = ihevcd_cabac_decode_bypass_bins(ps_cabac,
298*c83a76b0SSuyog Pawar                                                     ps_bitstrm,
299*c83a76b0SSuyog Pawar                                                     suf_length);
300*c83a76b0SSuyog Pawar 
301*c83a76b0SSuyog Pawar             AEV_TRACE("last_coeff_y_suffix", value, ps_cabac->u4_range);
302*c83a76b0SSuyog Pawar             last_significant_coeff_y =
303*c83a76b0SSuyog Pawar                             (1 << ((last_significant_coeff_y_prefix >> 1) - 1)) *
304*c83a76b0SSuyog Pawar                             (2 + (last_significant_coeff_y_prefix & 1)) + value;
305*c83a76b0SSuyog Pawar         }
306*c83a76b0SSuyog Pawar 
307*c83a76b0SSuyog Pawar     }
308*c83a76b0SSuyog Pawar 
309*c83a76b0SSuyog Pawar     /* Choose a scan matrix based on intra flag, intra pred mode, transform size
310*c83a76b0SSuyog Pawar      and luma/chroma */
311*c83a76b0SSuyog Pawar     scan_idx = SCAN_DIAG_UPRIGHT;
312*c83a76b0SSuyog Pawar     if(PRED_MODE_INTRA == ps_codec->s_parse.s_cu.i4_pred_mode)
313*c83a76b0SSuyog Pawar     {
314*c83a76b0SSuyog Pawar         if((2 == log2_trafo_size) || ((3 == log2_trafo_size) && (0 == c_idx)))
315*c83a76b0SSuyog Pawar         {
316*c83a76b0SSuyog Pawar             if((6 <= intra_pred_mode) &&
317*c83a76b0SSuyog Pawar                (14 >= intra_pred_mode))
318*c83a76b0SSuyog Pawar             {
319*c83a76b0SSuyog Pawar                 scan_idx = SCAN_VERT;
320*c83a76b0SSuyog Pawar             }
321*c83a76b0SSuyog Pawar             else if((22 <= intra_pred_mode) &&
322*c83a76b0SSuyog Pawar                     (30 >= intra_pred_mode))
323*c83a76b0SSuyog Pawar             {
324*c83a76b0SSuyog Pawar                 scan_idx = SCAN_HORZ;
325*c83a76b0SSuyog Pawar             }
326*c83a76b0SSuyog Pawar         }
327*c83a76b0SSuyog Pawar     }
328*c83a76b0SSuyog Pawar 
329*c83a76b0SSuyog Pawar     /* In case the scan is vertical, then swap  X and Y positions */
330*c83a76b0SSuyog Pawar     if(SCAN_VERT == scan_idx)
331*c83a76b0SSuyog Pawar     {
332*c83a76b0SSuyog Pawar         SWAP(last_significant_coeff_x, last_significant_coeff_y);
333*c83a76b0SSuyog Pawar     }
334*c83a76b0SSuyog Pawar 
335*c83a76b0SSuyog Pawar     {
336*c83a76b0SSuyog Pawar         WORD8 *pi1_scan_idx;
337*c83a76b0SSuyog Pawar         WORD8 *pi1_buf = (WORD8 *)ps_codec->s_parse.pv_tu_coeff_data;
338*c83a76b0SSuyog Pawar 
339*c83a76b0SSuyog Pawar         /* First WORD8 gives number of coded subblocks */
340*c83a76b0SSuyog Pawar         pi1_num_coded_subblks = pi1_buf++;
341*c83a76b0SSuyog Pawar 
342*c83a76b0SSuyog Pawar         /* Set number of coded subblocks in the current TU to zero */
343*c83a76b0SSuyog Pawar         /* This will be updated later */
344*c83a76b0SSuyog Pawar         *pi1_num_coded_subblks = 0;
345*c83a76b0SSuyog Pawar 
346*c83a76b0SSuyog Pawar         /* Second WORD8 gives (scan idx << 1) | trans_skip */
347*c83a76b0SSuyog Pawar         pi1_scan_idx = pi1_buf++;
348*c83a76b0SSuyog Pawar         *pi1_scan_idx = (scan_idx << 1) | transform_skip_flag;
349*c83a76b0SSuyog Pawar 
350*c83a76b0SSuyog Pawar         /* Store the incremented pointer in pv_tu_coeff_data */
351*c83a76b0SSuyog Pawar         ps_codec->s_parse.pv_tu_coeff_data = pi1_buf;
352*c83a76b0SSuyog Pawar 
353*c83a76b0SSuyog Pawar     }
354*c83a76b0SSuyog Pawar     /**
355*c83a76b0SSuyog Pawar      * Given last_significant_coeff_y and last_significant_coeff_x find last sub block
356*c83a76b0SSuyog Pawar      * This is done by ignoring lower two bits of last_significant_coeff_y and last_significant_coeff_x
357*c83a76b0SSuyog Pawar      * and using scan matrix for lookup
358*c83a76b0SSuyog Pawar      */
359*c83a76b0SSuyog Pawar 
360*c83a76b0SSuyog Pawar     /* If transform is 4x4, last_sub_blk is zero */
361*c83a76b0SSuyog Pawar     last_sub_blk = 0;
362*c83a76b0SSuyog Pawar 
363*c83a76b0SSuyog Pawar     /* If transform is larger than 4x4, then based on scan_idx and transform size, choose a scan table */
364*c83a76b0SSuyog Pawar 
365*c83a76b0SSuyog Pawar     if(log2_trafo_size > 2)
366*c83a76b0SSuyog Pawar     {
367*c83a76b0SSuyog Pawar         WORD32 scan_pos;
368*c83a76b0SSuyog Pawar         WORD32 scan_mat_size;
369*c83a76b0SSuyog Pawar         pu1_scan_blk = (UWORD8 *)gapv_ihevc_scan[scan_idx * 3 + (log2_trafo_size - 2 - 1)];
370*c83a76b0SSuyog Pawar 
371*c83a76b0SSuyog Pawar 
372*c83a76b0SSuyog Pawar         /* Divide the current transform to 4x4 subblocks and count number of 4x4 in the first row */
373*c83a76b0SSuyog Pawar         /* This will be size of scan matrix to be used for subblock scanning */
374*c83a76b0SSuyog Pawar         scan_mat_size = 1 << (log2_trafo_size - 2);
375*c83a76b0SSuyog Pawar         scan_pos = ((last_significant_coeff_y >> 2) * scan_mat_size) +
376*c83a76b0SSuyog Pawar                         (last_significant_coeff_x >> 2);
377*c83a76b0SSuyog Pawar 
378*c83a76b0SSuyog Pawar         last_sub_blk = pu1_scan_blk[scan_pos];
379*c83a76b0SSuyog Pawar     }
380*c83a76b0SSuyog Pawar     pu1_scan_coeff  = &gau1_ihevc_scan4x4[scan_idx][0];
381*c83a76b0SSuyog Pawar 
382*c83a76b0SSuyog Pawar     {
383*c83a76b0SSuyog Pawar         WORD32 scan_pos;
384*c83a76b0SSuyog Pawar 
385*c83a76b0SSuyog Pawar         scan_pos = ((last_significant_coeff_y & 3) << 2) +
386*c83a76b0SSuyog Pawar                         (last_significant_coeff_x & 3);
387*c83a76b0SSuyog Pawar 
388*c83a76b0SSuyog Pawar         last_scan_pos = pu1_scan_coeff[scan_pos];
389*c83a76b0SSuyog Pawar     }
390*c83a76b0SSuyog Pawar     if(log2_trafo_size > 2)
391*c83a76b0SSuyog Pawar         pu1_scan_blk = (UWORD8 *)gapv_ihevc_invscan[scan_idx * 3 + (log2_trafo_size - 2 - 1)];
392*c83a76b0SSuyog Pawar     pu1_scan_coeff  = &gau1_ihevc_invscan4x4[scan_idx][0];
393*c83a76b0SSuyog Pawar 
394*c83a76b0SSuyog Pawar     /* Set CSBF array to zero */
395*c83a76b0SSuyog Pawar     {
396*c83a76b0SSuyog Pawar         UWORD32 *pu4_csbf;
397*c83a76b0SSuyog Pawar         pu4_csbf = (void *)au2_csbf;
398*c83a76b0SSuyog Pawar         *pu4_csbf++ = 0;
399*c83a76b0SSuyog Pawar         *pu4_csbf++ = 0;
400*c83a76b0SSuyog Pawar         *pu4_csbf++ = 0;
401*c83a76b0SSuyog Pawar         *pu4_csbf = 0;
402*c83a76b0SSuyog Pawar         /* To avoid a check for y pos, 9th WORD16 in the array is set to zero */
403*c83a76b0SSuyog Pawar         au2_csbf[8] = 0;
404*c83a76b0SSuyog Pawar     }
405*c83a76b0SSuyog Pawar 
406*c83a76b0SSuyog Pawar     /*************************************************************************/
407*c83a76b0SSuyog Pawar     /* derive base context index for sig coeff as per section 9.3.3.1.4      */
408*c83a76b0SSuyog Pawar     /* TODO; convert to look up based on luma/chroma, scan type and tfr size */
409*c83a76b0SSuyog Pawar     /*************************************************************************/
410*c83a76b0SSuyog Pawar     if(!c_idx)
411*c83a76b0SSuyog Pawar     {
412*c83a76b0SSuyog Pawar         sig_coeff_base_ctxt = IHEVC_CAB_COEFF_FLAG;
413*c83a76b0SSuyog Pawar         abs_gt1_base_ctxt = IHEVC_CAB_COEFABS_GRTR1_FLAG;
414*c83a76b0SSuyog Pawar 
415*c83a76b0SSuyog Pawar         if(3 == log2_trafo_size)
416*c83a76b0SSuyog Pawar         {
417*c83a76b0SSuyog Pawar             /* 8x8 transform size */
418*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += (scan_idx == SCAN_DIAG_UPRIGHT) ? 9 : 15;
419*c83a76b0SSuyog Pawar         }
420*c83a76b0SSuyog Pawar         else  if(3 < log2_trafo_size)
421*c83a76b0SSuyog Pawar         {
422*c83a76b0SSuyog Pawar             /* larger transform sizes */
423*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 21;
424*c83a76b0SSuyog Pawar         }
425*c83a76b0SSuyog Pawar     }
426*c83a76b0SSuyog Pawar     else
427*c83a76b0SSuyog Pawar     {
428*c83a76b0SSuyog Pawar         /* chroma context initializations */
429*c83a76b0SSuyog Pawar         sig_coeff_base_ctxt = IHEVC_CAB_COEFF_FLAG + 27;
430*c83a76b0SSuyog Pawar         abs_gt1_base_ctxt = IHEVC_CAB_COEFABS_GRTR1_FLAG + 16;
431*c83a76b0SSuyog Pawar 
432*c83a76b0SSuyog Pawar         if(3 == log2_trafo_size)
433*c83a76b0SSuyog Pawar         {
434*c83a76b0SSuyog Pawar             /* 8x8 transform size */
435*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 9;
436*c83a76b0SSuyog Pawar         }
437*c83a76b0SSuyog Pawar         else  if(3 < log2_trafo_size)
438*c83a76b0SSuyog Pawar         {
439*c83a76b0SSuyog Pawar             /* larger transform sizes */
440*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 12;
441*c83a76b0SSuyog Pawar         }
442*c83a76b0SSuyog Pawar     }
443*c83a76b0SSuyog Pawar     num_subblks = 0;
444*c83a76b0SSuyog Pawar     /* Parse each 4x4 subblocks */
445*c83a76b0SSuyog Pawar     for(i = last_sub_blk; i >= 0; i--)
446*c83a76b0SSuyog Pawar     {
447*c83a76b0SSuyog Pawar         WORD32 sub_blk_pos;
448*c83a76b0SSuyog Pawar         WORD32 infer_sig_coeff_flag;
449*c83a76b0SSuyog Pawar         WORD32 cur_csbf;
450*c83a76b0SSuyog Pawar 
451*c83a76b0SSuyog Pawar         WORD32 n;
452*c83a76b0SSuyog Pawar         WORD32 num_coeff;
453*c83a76b0SSuyog Pawar         /* Sig coeff map for 16 entries in raster scan order. Upper 16 bits are used.
454*c83a76b0SSuyog Pawar          * MSB gives sig coeff flag for 0th coeff and so on
455*c83a76b0SSuyog Pawar          * UWORD16 would have been enough but kept as UWORD32 for code optimizations
456*c83a76b0SSuyog Pawar          * In arm unnecessary masking operations are saved
457*c83a76b0SSuyog Pawar          */
458*c83a76b0SSuyog Pawar         UWORD32 u4_sig_coeff_map_raster;
459*c83a76b0SSuyog Pawar         WORD32 sign_hidden;
460*c83a76b0SSuyog Pawar 
461*c83a76b0SSuyog Pawar         /* Sig coeff map in scan order */
462*c83a76b0SSuyog Pawar         UWORD32 u4_sig_coeff_map;
463*c83a76b0SSuyog Pawar         WORD32 coeff_abs_level_greater2_flag;
464*c83a76b0SSuyog Pawar         UWORD32 u4_coeff_abs_level_greater1_map;
465*c83a76b0SSuyog Pawar         UWORD32 u4_coeff_abs_level_greater2_map;
466*c83a76b0SSuyog Pawar         UWORD32 u4_coeff_sign_map;
467*c83a76b0SSuyog Pawar         WORD32 first_sig_scan_pos, last_sig_scan_pos, num_greater1_flag, first_greater1_scan_pos;
468*c83a76b0SSuyog Pawar         WORD32  num_sig_coeff, sum_abs_level;
469*c83a76b0SSuyog Pawar         WORD32 nbr_csbf;
470*c83a76b0SSuyog Pawar 
471*c83a76b0SSuyog Pawar 
472*c83a76b0SSuyog Pawar         WORD32 ctxt_set;
473*c83a76b0SSuyog Pawar         WORD32 rice_param;
474*c83a76b0SSuyog Pawar         WORD32 xs, ys;
475*c83a76b0SSuyog Pawar 
476*c83a76b0SSuyog Pawar 
477*c83a76b0SSuyog Pawar         sub_blk_pos  = 0;
478*c83a76b0SSuyog Pawar         if(i && (log2_trafo_size > 2))
479*c83a76b0SSuyog Pawar             sub_blk_pos = pu1_scan_blk[i];
480*c83a76b0SSuyog Pawar 
481*c83a76b0SSuyog Pawar         /* Get xs and ys from scan position */
482*c83a76b0SSuyog Pawar         /* This is needed for context modelling of significant coeff flag */
483*c83a76b0SSuyog Pawar         xs = sub_blk_pos & ((1 << (log2_trafo_size - 2)) - 1);
484*c83a76b0SSuyog Pawar         ys = sub_blk_pos >> (log2_trafo_size - 2);
485*c83a76b0SSuyog Pawar 
486*c83a76b0SSuyog Pawar 
487*c83a76b0SSuyog Pawar         /* Check if neighbor subblocks are coded */
488*c83a76b0SSuyog Pawar         {
489*c83a76b0SSuyog Pawar 
490*c83a76b0SSuyog Pawar             nbr_csbf = 0;
491*c83a76b0SSuyog Pawar 
492*c83a76b0SSuyog Pawar             /* Get Bottom sub blocks CSBF */
493*c83a76b0SSuyog Pawar             nbr_csbf |= (au2_csbf[ys + 1] >> xs) & 1;
494*c83a76b0SSuyog Pawar             nbr_csbf <<= 1;
495*c83a76b0SSuyog Pawar 
496*c83a76b0SSuyog Pawar             /* Get Right sub blocks CSBF */
497*c83a76b0SSuyog Pawar             /* Even if xs is equal to (1 << (log2_trafo_size - 2 )) - 1,
498*c83a76b0SSuyog Pawar                since au2_csbf is set to zero at the beginning, csbf for
499*c83a76b0SSuyog Pawar                neighbor will be read as 0 */
500*c83a76b0SSuyog Pawar 
501*c83a76b0SSuyog Pawar             nbr_csbf |= (au2_csbf[ys] >> (xs + 1)) & 1;
502*c83a76b0SSuyog Pawar 
503*c83a76b0SSuyog Pawar 
504*c83a76b0SSuyog Pawar         }
505*c83a76b0SSuyog Pawar         cur_csbf = 0;
506*c83a76b0SSuyog Pawar 
507*c83a76b0SSuyog Pawar         /* DC coeff is inferred, only if coded_sub_block is explicitly parsed as 1 */
508*c83a76b0SSuyog Pawar         /* i.e. it is not inferred for first and last subblock */
509*c83a76b0SSuyog Pawar         infer_sig_coeff_flag = 0;
510*c83a76b0SSuyog Pawar         if((i < last_sub_blk) && (i > 0))
511*c83a76b0SSuyog Pawar         {
512*c83a76b0SSuyog Pawar             WORD32 ctxt_idx  = IHEVC_CAB_CODED_SUBLK_IDX;
513*c83a76b0SSuyog Pawar 
514*c83a76b0SSuyog Pawar             /* ctxt based on right / bottom avail csbf, section 9.3.3.1.3 */
515*c83a76b0SSuyog Pawar             ctxt_idx += (nbr_csbf) ? 1 : 0;
516*c83a76b0SSuyog Pawar 
517*c83a76b0SSuyog Pawar             /* Ctxt based on luma or chroma */
518*c83a76b0SSuyog Pawar             ctxt_idx += c_idx  ? 2 : 0;
519*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("coded_sub_block_flag", ps_cabac->u4_range, ctxt_idx);
520*c83a76b0SSuyog Pawar             IHEVCD_CABAC_DECODE_BIN(cur_csbf, ps_cabac, ps_bitstrm, ctxt_idx);
521*c83a76b0SSuyog Pawar             AEV_TRACE("coded_sub_block_flag", cur_csbf, ps_cabac->u4_range);
522*c83a76b0SSuyog Pawar 
523*c83a76b0SSuyog Pawar             infer_sig_coeff_flag = 1;
524*c83a76b0SSuyog Pawar         }
525*c83a76b0SSuyog Pawar         else /* if((i == last_sub_blk) || (sub_blk_pos == 0)) */
526*c83a76b0SSuyog Pawar         {
527*c83a76b0SSuyog Pawar             /* CSBF is set to 1 for first and last subblock */
528*c83a76b0SSuyog Pawar             /* Note for these subblocks sig_coeff_map is not inferred but instead parsed */
529*c83a76b0SSuyog Pawar             cur_csbf = 1;
530*c83a76b0SSuyog Pawar         }
531*c83a76b0SSuyog Pawar 
532*c83a76b0SSuyog Pawar         /* Set current sub blocks CSBF */
533*c83a76b0SSuyog Pawar         {
534*c83a76b0SSuyog Pawar             UWORD32 u4_mask = 1 << xs;
535*c83a76b0SSuyog Pawar             if(cur_csbf)
536*c83a76b0SSuyog Pawar                 au2_csbf[ys] |= u4_mask;
537*c83a76b0SSuyog Pawar             else
538*c83a76b0SSuyog Pawar                 au2_csbf[ys] &= ~u4_mask;
539*c83a76b0SSuyog Pawar 
540*c83a76b0SSuyog Pawar         }
541*c83a76b0SSuyog Pawar 
542*c83a76b0SSuyog Pawar         /* If current subblock is not coded, proceed to the next subblock */
543*c83a76b0SSuyog Pawar         if(0 == cur_csbf)
544*c83a76b0SSuyog Pawar             continue;
545*c83a76b0SSuyog Pawar 
546*c83a76b0SSuyog Pawar         n = 15;
547*c83a76b0SSuyog Pawar         u4_sig_coeff_map_raster = 0;
548*c83a76b0SSuyog Pawar         u4_sig_coeff_map = 0;
549*c83a76b0SSuyog Pawar         num_coeff = 0;
550*c83a76b0SSuyog Pawar         if(i == last_sub_blk)
551*c83a76b0SSuyog Pawar         {
552*c83a76b0SSuyog Pawar             WORD32 pos = ((last_significant_coeff_y & 3) << 2) +
553*c83a76b0SSuyog Pawar                             (last_significant_coeff_x & 3);
554*c83a76b0SSuyog Pawar             n = (last_scan_pos - 1);
555*c83a76b0SSuyog Pawar             /* Set Significant coeff map for last significant coeff flag as 1 */
556*c83a76b0SSuyog Pawar             u4_sig_coeff_map_raster = 1 << pos;
557*c83a76b0SSuyog Pawar             u4_sig_coeff_map = 1 << last_scan_pos;
558*c83a76b0SSuyog Pawar             num_coeff = 1;
559*c83a76b0SSuyog Pawar         }
560*c83a76b0SSuyog Pawar 
561*c83a76b0SSuyog Pawar         for(; n >= 0; n--)
562*c83a76b0SSuyog Pawar         {
563*c83a76b0SSuyog Pawar             WORD32 significant_coeff_flag;
564*c83a76b0SSuyog Pawar 
565*c83a76b0SSuyog Pawar             if((n > 0 || !infer_sig_coeff_flag))
566*c83a76b0SSuyog Pawar             {
567*c83a76b0SSuyog Pawar                 //WORD32 coeff_pos;
568*c83a76b0SSuyog Pawar                 WORD32 sig_ctxinc;
569*c83a76b0SSuyog Pawar                 WORD32 ctxt_idx;
570*c83a76b0SSuyog Pawar 
571*c83a76b0SSuyog Pawar                 /* Coefficient position is needed for deriving context index for significant_coeff_flag */
572*c83a76b0SSuyog Pawar                 //coeff_pos = pu1_scan_coeff[n];
573*c83a76b0SSuyog Pawar                 /* derive the context inc as per section 9.3.3.1.4 */
574*c83a76b0SSuyog Pawar                 sig_ctxinc = 0;
575*c83a76b0SSuyog Pawar                 if(2 == log2_trafo_size)
576*c83a76b0SSuyog Pawar                 {
577*c83a76b0SSuyog Pawar 
578*c83a76b0SSuyog Pawar                     /* 4x4 transform size increment uses lookup */
579*c83a76b0SSuyog Pawar                     sig_ctxinc = gau1_ihevcd_sigcoeff_ctxtinc_tr4[scan_idx][n];
580*c83a76b0SSuyog Pawar                 }
581*c83a76b0SSuyog Pawar                 else if(n || i)
582*c83a76b0SSuyog Pawar                 {
583*c83a76b0SSuyog Pawar                     /* ctxt for AC coeff depends on curpos and neigbour csbf */
584*c83a76b0SSuyog Pawar                     sig_ctxinc = gau1_ihevcd_sigcoeff_ctxtinc[scan_idx][nbr_csbf][n];
585*c83a76b0SSuyog Pawar 
586*c83a76b0SSuyog Pawar                     /* based on luma subblock pos */
587*c83a76b0SSuyog Pawar                     sig_ctxinc += (i && (!c_idx)) ? 3 : 0;
588*c83a76b0SSuyog Pawar 
589*c83a76b0SSuyog Pawar                 }
590*c83a76b0SSuyog Pawar                 else
591*c83a76b0SSuyog Pawar                 {
592*c83a76b0SSuyog Pawar                     /* DC coeff has fixed context for luma and chroma */
593*c83a76b0SSuyog Pawar                     sig_coeff_base_ctxt = (0 == c_idx) ? IHEVC_CAB_COEFF_FLAG :
594*c83a76b0SSuyog Pawar                                                          (IHEVC_CAB_COEFF_FLAG + 27);
595*c83a76b0SSuyog Pawar                 }
596*c83a76b0SSuyog Pawar 
597*c83a76b0SSuyog Pawar                 ctxt_idx = sig_ctxinc + sig_coeff_base_ctxt;
598*c83a76b0SSuyog Pawar                 TRACE_CABAC_CTXT("significant_coeff_flag", ps_cabac->u4_range, ctxt_idx);
599*c83a76b0SSuyog Pawar                 IHEVCD_CABAC_DECODE_BIN(significant_coeff_flag, ps_cabac,
600*c83a76b0SSuyog Pawar                                         ps_bitstrm,
601*c83a76b0SSuyog Pawar                                         ctxt_idx);
602*c83a76b0SSuyog Pawar                 AEV_TRACE("significant_coeff_flag", significant_coeff_flag, ps_cabac->u4_range);
603*c83a76b0SSuyog Pawar 
604*c83a76b0SSuyog Pawar 
605*c83a76b0SSuyog Pawar                 /* If at least one non-zero coeff is signalled then do not infer sig coeff map */
606*c83a76b0SSuyog Pawar                 /* for (0,0) coeff in the current sub block */
607*c83a76b0SSuyog Pawar                 if(significant_coeff_flag)
608*c83a76b0SSuyog Pawar                     infer_sig_coeff_flag = 0;
609*c83a76b0SSuyog Pawar 
610*c83a76b0SSuyog Pawar //                u4_sig_coeff_map_raster |= significant_coeff_flag
611*c83a76b0SSuyog Pawar //                              << coeff_pos;
612*c83a76b0SSuyog Pawar                 u4_sig_coeff_map |= significant_coeff_flag << n;
613*c83a76b0SSuyog Pawar                 num_coeff += significant_coeff_flag;
614*c83a76b0SSuyog Pawar             }
615*c83a76b0SSuyog Pawar 
616*c83a76b0SSuyog Pawar 
617*c83a76b0SSuyog Pawar         }
618*c83a76b0SSuyog Pawar         /*********************************************************************/
619*c83a76b0SSuyog Pawar         /* If infer_sig_coeff_flag is 1 then treat the 0th coeff as non zero */
620*c83a76b0SSuyog Pawar         /* If infer_sig_coeff_flag is zero, then last significant_coeff_flag */
621*c83a76b0SSuyog Pawar         /* is parsed in the above loop                                       */
622*c83a76b0SSuyog Pawar         /*********************************************************************/
623*c83a76b0SSuyog Pawar         if(infer_sig_coeff_flag)
624*c83a76b0SSuyog Pawar         {
625*c83a76b0SSuyog Pawar             u4_sig_coeff_map_raster |= 1;
626*c83a76b0SSuyog Pawar             u4_sig_coeff_map |= 1;
627*c83a76b0SSuyog Pawar             num_coeff++;
628*c83a76b0SSuyog Pawar         }
629*c83a76b0SSuyog Pawar 
630*c83a76b0SSuyog Pawar         /*********************************************************************/
631*c83a76b0SSuyog Pawar         /* First subblock does not get an explicit csbf. It is assumed to    */
632*c83a76b0SSuyog Pawar         /* be 1. For this subblock there is chance of getting all            */
633*c83a76b0SSuyog Pawar         /* sig_coeff_flags to be zero. In such a case proceed to the next    */
634*c83a76b0SSuyog Pawar         /* subblock(which is end of parsing for the current transform block) */
635*c83a76b0SSuyog Pawar         /*********************************************************************/
636*c83a76b0SSuyog Pawar 
637*c83a76b0SSuyog Pawar         if(0 == num_coeff)
638*c83a76b0SSuyog Pawar             continue;
639*c83a76b0SSuyog Pawar 
640*c83a76b0SSuyog Pawar         /* Increment number of coded subblocks for the current TU */
641*c83a76b0SSuyog Pawar         num_subblks++;
642*c83a76b0SSuyog Pawar 
643*c83a76b0SSuyog Pawar         /* Set sig coeff map and subblock position */
644*c83a76b0SSuyog Pawar         ps_tu_sblk_coeff_data = (tu_sblk_coeff_data_t *)ps_codec->s_parse.pv_tu_coeff_data;
645*c83a76b0SSuyog Pawar         ps_tu_sblk_coeff_data->u2_sig_coeff_map = u4_sig_coeff_map;
646*c83a76b0SSuyog Pawar         ps_tu_sblk_coeff_data->u2_subblk_pos = (ys << 8) | xs;
647*c83a76b0SSuyog Pawar 
648*c83a76b0SSuyog Pawar         first_sig_scan_pos = 16;
649*c83a76b0SSuyog Pawar         last_sig_scan_pos = -1;
650*c83a76b0SSuyog Pawar         num_greater1_flag = 0;
651*c83a76b0SSuyog Pawar         first_greater1_scan_pos = -1;
652*c83a76b0SSuyog Pawar         u4_coeff_abs_level_greater1_map = 0;
653*c83a76b0SSuyog Pawar 
654*c83a76b0SSuyog Pawar 
655*c83a76b0SSuyog Pawar         /* context set based on luma subblock pos */
656*c83a76b0SSuyog Pawar         ctxt_set = (i && (!c_idx)) ? 2 : 0;
657*c83a76b0SSuyog Pawar 
658*c83a76b0SSuyog Pawar         /* See section 9.3.3.1.5           */
659*c83a76b0SSuyog Pawar         ctxt_set += (0 == gt1_ctxt) ? 1 : 0;
660*c83a76b0SSuyog Pawar 
661*c83a76b0SSuyog Pawar         gt1_ctxt = 1;
662*c83a76b0SSuyog Pawar         /* Instead of initializing n to 15, set it to 31-CLZ(sig coeff map) */
663*c83a76b0SSuyog Pawar         {
664*c83a76b0SSuyog Pawar             UWORD32 u4_sig_coeff_map_shift;
665*c83a76b0SSuyog Pawar             UWORD32 clz;
666*c83a76b0SSuyog Pawar             clz = CLZ(u4_sig_coeff_map);
667*c83a76b0SSuyog Pawar             n = 31 - clz;
668*c83a76b0SSuyog Pawar             u4_sig_coeff_map_shift = u4_sig_coeff_map << clz;
669*c83a76b0SSuyog Pawar             /* For loop for n changed to do while to break early if sig_coeff_map_shift becomes zero */
670*c83a76b0SSuyog Pawar             do
671*c83a76b0SSuyog Pawar             {
672*c83a76b0SSuyog Pawar                 //WORD32 coeff_pos;
673*c83a76b0SSuyog Pawar                 WORD32 ctxt_idx;
674*c83a76b0SSuyog Pawar 
675*c83a76b0SSuyog Pawar                 //TODO: Scan lookup will be removed later and instead u4_sig_coeff_map will be used
676*c83a76b0SSuyog Pawar                 //coeff_pos = pu1_scan_coeff[n];
677*c83a76b0SSuyog Pawar 
678*c83a76b0SSuyog Pawar                 if((u4_sig_coeff_map_shift >> 31) & 1)
679*c83a76b0SSuyog Pawar                 {
680*c83a76b0SSuyog Pawar 
681*c83a76b0SSuyog Pawar                     /* abs_level_greater1_flag is sent for only first 8 non-zero levels in a subblock */
682*c83a76b0SSuyog Pawar                     if(num_greater1_flag < 8)
683*c83a76b0SSuyog Pawar                     {
684*c83a76b0SSuyog Pawar                         WORD32 coeff_abs_level_greater1_flag;
685*c83a76b0SSuyog Pawar 
686*c83a76b0SSuyog Pawar                         ctxt_idx = (ctxt_set * 4) + abs_gt1_base_ctxt + gt1_ctxt;
687*c83a76b0SSuyog Pawar 
688*c83a76b0SSuyog Pawar                         TRACE_CABAC_CTXT("coeff_abs_level_greater1_flag", ps_cabac->u4_range, ctxt_idx);
689*c83a76b0SSuyog Pawar                         IHEVCD_CABAC_DECODE_BIN(coeff_abs_level_greater1_flag, ps_cabac, ps_bitstrm, ctxt_idx);
690*c83a76b0SSuyog Pawar                         AEV_TRACE("coeff_abs_level_greater1_flag", coeff_abs_level_greater1_flag, ps_cabac->u4_range);
691*c83a76b0SSuyog Pawar 
692*c83a76b0SSuyog Pawar                         u4_coeff_abs_level_greater1_map |= coeff_abs_level_greater1_flag << n;
693*c83a76b0SSuyog Pawar                         num_greater1_flag++;
694*c83a76b0SSuyog Pawar 
695*c83a76b0SSuyog Pawar                         /* first_greater1_scan_pos is obtained using CLZ on u4_coeff_abs_level_greater1_map*/
696*c83a76b0SSuyog Pawar                         /*  outside the loop instead of the following check inside the loop                */
697*c83a76b0SSuyog Pawar                         /* if( coeff_abs_level_greater1_flag && first_greater1_scan_pos == -1) */
698*c83a76b0SSuyog Pawar                         /*    first_greater1_scan_pos = n;                                     */
699*c83a76b0SSuyog Pawar 
700*c83a76b0SSuyog Pawar                         if(coeff_abs_level_greater1_flag)
701*c83a76b0SSuyog Pawar                         {
702*c83a76b0SSuyog Pawar                             gt1_ctxt = 0;
703*c83a76b0SSuyog Pawar                         }
704*c83a76b0SSuyog Pawar                         else if(gt1_ctxt && (gt1_ctxt < 3))
705*c83a76b0SSuyog Pawar                         {
706*c83a76b0SSuyog Pawar                             gt1_ctxt++;
707*c83a76b0SSuyog Pawar                         }
708*c83a76b0SSuyog Pawar 
709*c83a76b0SSuyog Pawar                     }
710*c83a76b0SSuyog Pawar                     else
711*c83a76b0SSuyog Pawar                         break;
712*c83a76b0SSuyog Pawar 
713*c83a76b0SSuyog Pawar                     /* instead of computing last and first significan scan position using checks below */
714*c83a76b0SSuyog Pawar                     /* They are computed outside the loop using CLZ and CTZ on sig_coeff_map */
715*c83a76b0SSuyog Pawar                     /* if(last_sig_scan_pos == -1)                          */
716*c83a76b0SSuyog Pawar                     /*    last_sig_scan_pos = n;                            */
717*c83a76b0SSuyog Pawar                     /*  first_sig_scan_pos = n;                             */
718*c83a76b0SSuyog Pawar                 }
719*c83a76b0SSuyog Pawar                 u4_sig_coeff_map_shift <<= 1;
720*c83a76b0SSuyog Pawar                 n--;
721*c83a76b0SSuyog Pawar                 /* If there are zero coeffs, then shift by as many zero coeffs and decrement n */
722*c83a76b0SSuyog Pawar                 clz = CLZ(u4_sig_coeff_map_shift);
723*c83a76b0SSuyog Pawar                 u4_sig_coeff_map_shift <<= clz;
724*c83a76b0SSuyog Pawar                 n -= (WORD32)clz;
725*c83a76b0SSuyog Pawar             }while(u4_sig_coeff_map_shift);
726*c83a76b0SSuyog Pawar         }
727*c83a76b0SSuyog Pawar         /* At this level u4_sig_coeff_map is non-zero i.e. has atleast one non-zero coeff */
728*c83a76b0SSuyog Pawar         last_sig_scan_pos = (31 - CLZ(u4_sig_coeff_map));
729*c83a76b0SSuyog Pawar         first_sig_scan_pos = CTZ(u4_sig_coeff_map);
730*c83a76b0SSuyog Pawar         sign_hidden = (((last_sig_scan_pos - first_sig_scan_pos) > 3) && !ps_codec->s_parse.s_cu.i4_cu_transquant_bypass);
731*c83a76b0SSuyog Pawar 
732*c83a76b0SSuyog Pawar         u4_coeff_abs_level_greater2_map = 0;
733*c83a76b0SSuyog Pawar 
734*c83a76b0SSuyog Pawar         if(u4_coeff_abs_level_greater1_map)
735*c83a76b0SSuyog Pawar         {
736*c83a76b0SSuyog Pawar             /* Check if the first level > 1 is greater than 2 */
737*c83a76b0SSuyog Pawar             WORD32 ctxt_idx;
738*c83a76b0SSuyog Pawar             first_greater1_scan_pos = (31 - CLZ(u4_coeff_abs_level_greater1_map));
739*c83a76b0SSuyog Pawar 
740*c83a76b0SSuyog Pawar 
741*c83a76b0SSuyog Pawar             ctxt_idx = IHEVC_CAB_COEFABS_GRTR2_FLAG;
742*c83a76b0SSuyog Pawar 
743*c83a76b0SSuyog Pawar             ctxt_idx += (!c_idx) ? ctxt_set : (ctxt_set + 4);
744*c83a76b0SSuyog Pawar             TRACE_CABAC_CTXT("coeff_abs_level_greater2_flag", ps_cabac->u4_range, ctxt_idx);
745*c83a76b0SSuyog Pawar             IHEVCD_CABAC_DECODE_BIN(coeff_abs_level_greater2_flag, ps_cabac, ps_bitstrm, ctxt_idx);
746*c83a76b0SSuyog Pawar             AEV_TRACE("coeff_abs_level_greater2_flag", coeff_abs_level_greater2_flag, ps_cabac->u4_range);
747*c83a76b0SSuyog Pawar             u4_coeff_abs_level_greater2_map = coeff_abs_level_greater2_flag << first_greater1_scan_pos;
748*c83a76b0SSuyog Pawar         }
749*c83a76b0SSuyog Pawar 
750*c83a76b0SSuyog Pawar 
751*c83a76b0SSuyog Pawar         u4_coeff_sign_map = 0;
752*c83a76b0SSuyog Pawar 
753*c83a76b0SSuyog Pawar         /* Parse sign flags */
754*c83a76b0SSuyog Pawar         if(!sign_data_hiding_flag || !sign_hidden)
755*c83a76b0SSuyog Pawar         {
756*c83a76b0SSuyog Pawar             IHEVCD_CABAC_DECODE_BYPASS_BINS(value, ps_cabac, ps_bitstrm, num_coeff);
757*c83a76b0SSuyog Pawar             AEV_TRACE("sign_flags", value, ps_cabac->u4_range);
758*c83a76b0SSuyog Pawar             u4_coeff_sign_map = value << (32 - num_coeff);
759*c83a76b0SSuyog Pawar         }
760*c83a76b0SSuyog Pawar         else
761*c83a76b0SSuyog Pawar         {
762*c83a76b0SSuyog Pawar             IHEVCD_CABAC_DECODE_BYPASS_BINS(value, ps_cabac, ps_bitstrm, (num_coeff - 1));
763*c83a76b0SSuyog Pawar             AEV_TRACE("sign_flags", value, ps_cabac->u4_range);
764*c83a76b0SSuyog Pawar             u4_coeff_sign_map = value << (32 - (num_coeff - 1));
765*c83a76b0SSuyog Pawar         }
766*c83a76b0SSuyog Pawar 
767*c83a76b0SSuyog Pawar         num_sig_coeff = 0;
768*c83a76b0SSuyog Pawar         sum_abs_level = 0;
769*c83a76b0SSuyog Pawar         rice_param = 0;
770*c83a76b0SSuyog Pawar         {
771*c83a76b0SSuyog Pawar             UWORD32 clz;
772*c83a76b0SSuyog Pawar             UWORD32 u4_sig_coeff_map_shift;
773*c83a76b0SSuyog Pawar             clz = CLZ(u4_sig_coeff_map);
774*c83a76b0SSuyog Pawar             n = 31 - clz;
775*c83a76b0SSuyog Pawar             u4_sig_coeff_map_shift = u4_sig_coeff_map << clz;
776*c83a76b0SSuyog Pawar             /* For loop for n changed to do while to break early if sig_coeff_map_shift becomes zero */
777*c83a76b0SSuyog Pawar             do
778*c83a76b0SSuyog Pawar             {
779*c83a76b0SSuyog Pawar 
780*c83a76b0SSuyog Pawar                 if((u4_sig_coeff_map_shift >> 31) & 1)
781*c83a76b0SSuyog Pawar                 {
782*c83a76b0SSuyog Pawar                     WORD32 base_lvl;
783*c83a76b0SSuyog Pawar                     WORD32 coeff_abs_level_remaining;
784*c83a76b0SSuyog Pawar                     WORD32 level;
785*c83a76b0SSuyog Pawar                     base_lvl = 1;
786*c83a76b0SSuyog Pawar 
787*c83a76b0SSuyog Pawar                     /* Update base_lvl if it is greater than 1 */
788*c83a76b0SSuyog Pawar                     if((u4_coeff_abs_level_greater1_map >> n) & 1)
789*c83a76b0SSuyog Pawar                         base_lvl++;
790*c83a76b0SSuyog Pawar 
791*c83a76b0SSuyog Pawar                     /* Update base_lvl if it is greater than 2 */
792*c83a76b0SSuyog Pawar                     if((u4_coeff_abs_level_greater2_map >> n) & 1)
793*c83a76b0SSuyog Pawar                         base_lvl++;
794*c83a76b0SSuyog Pawar 
795*c83a76b0SSuyog Pawar                     /* If level is greater than 3/2/1 based on the greater1 and greater2 maps,
796*c83a76b0SSuyog Pawar                      * decode remaining level (level - base_lvl) will be signalled as bypass bins
797*c83a76b0SSuyog Pawar                      */
798*c83a76b0SSuyog Pawar                     coeff_abs_level_remaining = 0;
799*c83a76b0SSuyog Pawar                     if(base_lvl == ((num_sig_coeff < 8) ? ((n == first_greater1_scan_pos) ? 3 : 2) : 1))
800*c83a76b0SSuyog Pawar                     {
801*c83a76b0SSuyog Pawar                         UWORD32 u4_prefix;
802*c83a76b0SSuyog Pawar                         WORD32 bin;
803*c83a76b0SSuyog Pawar 
804*c83a76b0SSuyog Pawar                         u4_prefix = 0;
805*c83a76b0SSuyog Pawar 
806*c83a76b0SSuyog Pawar                         do
807*c83a76b0SSuyog Pawar                         {
808*c83a76b0SSuyog Pawar                             IHEVCD_CABAC_DECODE_BYPASS_BIN(bin, ps_cabac, ps_bitstrm);
809*c83a76b0SSuyog Pawar                             u4_prefix++;
810*c83a76b0SSuyog Pawar 
811*c83a76b0SSuyog Pawar                             if((WORD32)u4_prefix == 19 - rice_param)
812*c83a76b0SSuyog Pawar                             {
813*c83a76b0SSuyog Pawar                                 bin = 1;
814*c83a76b0SSuyog Pawar                                 break;
815*c83a76b0SSuyog Pawar                             }
816*c83a76b0SSuyog Pawar 
817*c83a76b0SSuyog Pawar                         }while(bin);
818*c83a76b0SSuyog Pawar 
819*c83a76b0SSuyog Pawar                         u4_prefix = u4_prefix - 1;
820*c83a76b0SSuyog Pawar                         if(u4_prefix < 3)
821*c83a76b0SSuyog Pawar                         {
822*c83a76b0SSuyog Pawar                             UWORD32 u4_suffix;
823*c83a76b0SSuyog Pawar 
824*c83a76b0SSuyog Pawar                             coeff_abs_level_remaining = (u4_prefix << rice_param);
825*c83a76b0SSuyog Pawar                             if(rice_param)
826*c83a76b0SSuyog Pawar                             {
827*c83a76b0SSuyog Pawar                                 IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_suffix, ps_cabac, ps_bitstrm, rice_param);
828*c83a76b0SSuyog Pawar 
829*c83a76b0SSuyog Pawar                                 coeff_abs_level_remaining |= u4_suffix;
830*c83a76b0SSuyog Pawar                             }
831*c83a76b0SSuyog Pawar                         }
832*c83a76b0SSuyog Pawar                         else
833*c83a76b0SSuyog Pawar                         {
834*c83a76b0SSuyog Pawar                             UWORD32 u4_suffix;
835*c83a76b0SSuyog Pawar                             UWORD32 u4_numbins;
836*c83a76b0SSuyog Pawar 
837*c83a76b0SSuyog Pawar                             //u4_prefix = CLIP3(u4_prefix, 0, 19 - rice_param);
838*c83a76b0SSuyog Pawar 
839*c83a76b0SSuyog Pawar                             u4_numbins = (u4_prefix - 3 + rice_param);
840*c83a76b0SSuyog Pawar                             coeff_abs_level_remaining = (((1 << (u4_prefix - 3)) + 3 - 1) << rice_param);
841*c83a76b0SSuyog Pawar                             if(u4_numbins)
842*c83a76b0SSuyog Pawar                             {
843*c83a76b0SSuyog Pawar                                 IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_suffix, ps_cabac, ps_bitstrm, u4_numbins);
844*c83a76b0SSuyog Pawar                                 coeff_abs_level_remaining += u4_suffix;
845*c83a76b0SSuyog Pawar                             }
846*c83a76b0SSuyog Pawar                         }
847*c83a76b0SSuyog Pawar 
848*c83a76b0SSuyog Pawar 
849*c83a76b0SSuyog Pawar                         AEV_TRACE("coeff_abs_level_remaining", coeff_abs_level_remaining, ps_cabac->u4_range);
850*c83a76b0SSuyog Pawar                         base_lvl += coeff_abs_level_remaining;
851*c83a76b0SSuyog Pawar 
852*c83a76b0SSuyog Pawar                     }
853*c83a76b0SSuyog Pawar 
854*c83a76b0SSuyog Pawar                     /* update the rice param based on coeff level */
855*c83a76b0SSuyog Pawar                     if((base_lvl > (3 << rice_param)) && (rice_param < 4))
856*c83a76b0SSuyog Pawar                     {
857*c83a76b0SSuyog Pawar                         rice_param++;
858*c83a76b0SSuyog Pawar                     }
859*c83a76b0SSuyog Pawar 
860*c83a76b0SSuyog Pawar                     /* Compute absolute level */
861*c83a76b0SSuyog Pawar                     level = base_lvl;
862*c83a76b0SSuyog Pawar 
863*c83a76b0SSuyog Pawar                     /* Update level with the sign */
864*c83a76b0SSuyog Pawar                     if((u4_coeff_sign_map >> 31) & 1)
865*c83a76b0SSuyog Pawar                         level = -level;
866*c83a76b0SSuyog Pawar 
867*c83a76b0SSuyog Pawar                     u4_coeff_sign_map <<= 1;
868*c83a76b0SSuyog Pawar                     /* Update sign in case sign is hidden */
869*c83a76b0SSuyog Pawar                     if(sign_data_hiding_flag && sign_hidden)
870*c83a76b0SSuyog Pawar                     {
871*c83a76b0SSuyog Pawar                         sum_abs_level += base_lvl;
872*c83a76b0SSuyog Pawar 
873*c83a76b0SSuyog Pawar                         if(n == first_sig_scan_pos && ((sum_abs_level % 2) == 1))
874*c83a76b0SSuyog Pawar                             level = -level;
875*c83a76b0SSuyog Pawar                     }
876*c83a76b0SSuyog Pawar 
877*c83a76b0SSuyog Pawar                     /* Store the resulting level in non-zero level array */
878*c83a76b0SSuyog Pawar                     ps_tu_sblk_coeff_data->ai2_level[num_sig_coeff++] = level;
879*c83a76b0SSuyog Pawar                     //AEV_TRACE("level", level, 0);
880*c83a76b0SSuyog Pawar                 }
881*c83a76b0SSuyog Pawar                 u4_sig_coeff_map_shift <<= 1;
882*c83a76b0SSuyog Pawar                 n--;
883*c83a76b0SSuyog Pawar                 /* If there are zero coeffs, then shift by as many zero coeffs and decrement n */
884*c83a76b0SSuyog Pawar                 clz = CLZ(u4_sig_coeff_map_shift);
885*c83a76b0SSuyog Pawar                 u4_sig_coeff_map_shift <<= clz;
886*c83a76b0SSuyog Pawar                 n -= (WORD32)clz;
887*c83a76b0SSuyog Pawar 
888*c83a76b0SSuyog Pawar 
889*c83a76b0SSuyog Pawar             }while(u4_sig_coeff_map_shift);
890*c83a76b0SSuyog Pawar         }
891*c83a76b0SSuyog Pawar 
892*c83a76b0SSuyog Pawar         /* Increment the pv_tu_sblk_coeff_data */
893*c83a76b0SSuyog Pawar         {
894*c83a76b0SSuyog Pawar             UWORD8 *pu1_buf = (UWORD8 *)ps_codec->s_parse.pv_tu_coeff_data;
895*c83a76b0SSuyog Pawar             pu1_buf += sizeof(tu_sblk_coeff_data_t) - SUBBLK_COEFF_CNT * sizeof(WORD16);
896*c83a76b0SSuyog Pawar             pu1_buf += num_coeff * sizeof(WORD16);
897*c83a76b0SSuyog Pawar             ps_codec->s_parse.pv_tu_coeff_data = pu1_buf;
898*c83a76b0SSuyog Pawar 
899*c83a76b0SSuyog Pawar         }
900*c83a76b0SSuyog Pawar 
901*c83a76b0SSuyog Pawar     }
902*c83a76b0SSuyog Pawar     /* Set number of coded sub blocks in the current TU */
903*c83a76b0SSuyog Pawar     *pi1_num_coded_subblks = num_subblks;
904*c83a76b0SSuyog Pawar 
905*c83a76b0SSuyog Pawar     return ret;
906*c83a76b0SSuyog Pawar }
907