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