xref: /aosp_15_r20/external/libhevc/encoder/ihevce_cabac_tu.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar  *
3*c83a76b0SSuyog Pawar  * Copyright (C) 2018 The Android Open Source Project
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  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar /**
21*c83a76b0SSuyog Pawar ******************************************************************************
22*c83a76b0SSuyog Pawar * @file ihevce_cabac_tu.c
23*c83a76b0SSuyog Pawar *
24*c83a76b0SSuyog Pawar * @brief
25*c83a76b0SSuyog Pawar *  This file contains function definitions for cabac entropy coding of
26*c83a76b0SSuyog Pawar *  transform units of HEVC syntax
27*c83a76b0SSuyog Pawar *
28*c83a76b0SSuyog Pawar * @author
29*c83a76b0SSuyog Pawar *  ittiam
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * @List of Functions
32*c83a76b0SSuyog Pawar *  ihevce_cabac_encode_qp_delta()
33*c83a76b0SSuyog Pawar *  ihevce_cabac_encode_last_coeff_x_y()
34*c83a76b0SSuyog Pawar *  ihevce_encode_transform_tree()
35*c83a76b0SSuyog Pawar *  ihevce_cabac_residue_encode()
36*c83a76b0SSuyog Pawar *  ihevce_cabac_residue_encode_rdopt()
37*c83a76b0SSuyog Pawar *  ihevce_cabac_residue_encode_rdoq()
38*c83a76b0SSuyog Pawar *  ihevce_code_all_sig_coeffs_as_0_explicitly()
39*c83a76b0SSuyog Pawar *  ihevce_find_new_last_csb()
40*c83a76b0SSuyog Pawar *  ihevce_copy_backup_ctxt()
41*c83a76b0SSuyog Pawar *  ihevce_estimate_num_bits_till_next_non_zero_coeff()
42*c83a76b0SSuyog Pawar *
43*c83a76b0SSuyog Pawar ******************************************************************************
44*c83a76b0SSuyog Pawar */
45*c83a76b0SSuyog Pawar 
46*c83a76b0SSuyog Pawar /*****************************************************************************/
47*c83a76b0SSuyog Pawar /* File Includes                                                             */
48*c83a76b0SSuyog Pawar /*****************************************************************************/
49*c83a76b0SSuyog Pawar 
50*c83a76b0SSuyog Pawar /* System include files */
51*c83a76b0SSuyog Pawar #include <stdio.h>
52*c83a76b0SSuyog Pawar #include <string.h>
53*c83a76b0SSuyog Pawar #include <stdlib.h>
54*c83a76b0SSuyog Pawar #include <assert.h>
55*c83a76b0SSuyog Pawar #include <stdarg.h>
56*c83a76b0SSuyog Pawar #include <math.h>
57*c83a76b0SSuyog Pawar 
58*c83a76b0SSuyog Pawar /* User include files */
59*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
60*c83a76b0SSuyog Pawar #include "itt_video_api.h"
61*c83a76b0SSuyog Pawar #include "ihevce_api.h"
62*c83a76b0SSuyog Pawar 
63*c83a76b0SSuyog Pawar #include "rc_cntrl_param.h"
64*c83a76b0SSuyog Pawar #include "rc_frame_info_collector.h"
65*c83a76b0SSuyog Pawar #include "rc_look_ahead_params.h"
66*c83a76b0SSuyog Pawar 
67*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
68*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
69*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
70*c83a76b0SSuyog Pawar #include "ihevc_deblk.h"
71*c83a76b0SSuyog Pawar #include "ihevc_itrans_recon.h"
72*c83a76b0SSuyog Pawar #include "ihevc_chroma_itrans_recon.h"
73*c83a76b0SSuyog Pawar #include "ihevc_chroma_intra_pred.h"
74*c83a76b0SSuyog Pawar #include "ihevc_intra_pred.h"
75*c83a76b0SSuyog Pawar #include "ihevc_inter_pred.h"
76*c83a76b0SSuyog Pawar #include "ihevc_mem_fns.h"
77*c83a76b0SSuyog Pawar #include "ihevc_padding.h"
78*c83a76b0SSuyog Pawar #include "ihevc_weighted_pred.h"
79*c83a76b0SSuyog Pawar #include "ihevc_sao.h"
80*c83a76b0SSuyog Pawar #include "ihevc_resi_trans.h"
81*c83a76b0SSuyog Pawar #include "ihevc_quant_iquant_ssd.h"
82*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
83*c83a76b0SSuyog Pawar #include "ihevc_trans_macros.h"
84*c83a76b0SSuyog Pawar #include "ihevc_trans_tables.h"
85*c83a76b0SSuyog Pawar 
86*c83a76b0SSuyog Pawar #include "ihevce_defs.h"
87*c83a76b0SSuyog Pawar #include "ihevce_lap_enc_structs.h"
88*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_structs.h"
89*c83a76b0SSuyog Pawar #include "ihevce_me_common_defs.h"
90*c83a76b0SSuyog Pawar #include "ihevce_had_satd.h"
91*c83a76b0SSuyog Pawar #include "ihevce_error_codes.h"
92*c83a76b0SSuyog Pawar #include "ihevce_bitstream.h"
93*c83a76b0SSuyog Pawar #include "ihevce_cabac.h"
94*c83a76b0SSuyog Pawar #include "ihevce_rdoq_macros.h"
95*c83a76b0SSuyog Pawar #include "ihevce_function_selector.h"
96*c83a76b0SSuyog Pawar #include "ihevce_enc_structs.h"
97*c83a76b0SSuyog Pawar #include "ihevce_entropy_structs.h"
98*c83a76b0SSuyog Pawar #include "ihevce_cmn_utils_instr_set_router.h"
99*c83a76b0SSuyog Pawar #include "ihevce_enc_loop_structs.h"
100*c83a76b0SSuyog Pawar #include "ihevce_bs_compute_ctb.h"
101*c83a76b0SSuyog Pawar #include "ihevce_global_tables.h"
102*c83a76b0SSuyog Pawar #include "ihevce_common_utils.h"
103*c83a76b0SSuyog Pawar #include "ihevce_trace.h"
104*c83a76b0SSuyog Pawar 
105*c83a76b0SSuyog Pawar /*****************************************************************************/
106*c83a76b0SSuyog Pawar /* Globals                                                                   */
107*c83a76b0SSuyog Pawar /*****************************************************************************/
108*c83a76b0SSuyog Pawar extern UWORD16 gau2_ihevce_cabac_bin_to_bits[64 * 2];
109*c83a76b0SSuyog Pawar 
110*c83a76b0SSuyog Pawar /**
111*c83a76b0SSuyog Pawar ******************************************************************************
112*c83a76b0SSuyog Pawar * @brief  LUT for deriving of last significant coeff prefix.
113*c83a76b0SSuyog Pawar *
114*c83a76b0SSuyog Pawar * @input   : last_significant_coeff
115*c83a76b0SSuyog Pawar *
116*c83a76b0SSuyog Pawar * @output  : last_significant_prefix (does not include the
117*c83a76b0SSuyog Pawar *
118*c83a76b0SSuyog Pawar * @remarks Look up tables taken frm HM-8.0-dev
119*c83a76b0SSuyog Pawar ******************************************************************************
120*c83a76b0SSuyog Pawar */
121*c83a76b0SSuyog Pawar const UWORD8 gu1_hevce_last_coeff_prefix[32] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,
122*c83a76b0SSuyog Pawar                                                  8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9 };
123*c83a76b0SSuyog Pawar 
124*c83a76b0SSuyog Pawar /**
125*c83a76b0SSuyog Pawar *****************************************************************************
126*c83a76b0SSuyog Pawar * @brief  LUT for deriving of last significant coeff suffix
127*c83a76b0SSuyog Pawar *
128*c83a76b0SSuyog Pawar * @input   : last significant prefix
129*c83a76b0SSuyog Pawar *
130*c83a76b0SSuyog Pawar * @output  : prefix code that needs to be subtracted from last_pos to get
131*c83a76b0SSuyog Pawar *           suffix as per equation 7-55 in section 7.4.12.
132*c83a76b0SSuyog Pawar *
133*c83a76b0SSuyog Pawar *           It returns the following code for last_significant_prefix > 3
134*c83a76b0SSuyog Pawar *            ((1 << ((last_significant_coeff_x_prefix >> 1) - 1))  *
135*c83a76b0SSuyog Pawar *            (2 + (last_significant_coeff_x_prefix & 1))
136*c83a76b0SSuyog Pawar *
137*c83a76b0SSuyog Pawar *
138*c83a76b0SSuyog Pawar * @remarks Look up tables taken frm HM-8.0-dev
139*c83a76b0SSuyog Pawar *****************************************************************************
140*c83a76b0SSuyog Pawar */
141*c83a76b0SSuyog Pawar const UWORD8 gu1_hevce_last_coeff_prefix_code[10] = { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24 };
142*c83a76b0SSuyog Pawar 
143*c83a76b0SSuyog Pawar /**
144*c83a76b0SSuyog Pawar *****************************************************************************
145*c83a76b0SSuyog Pawar * @brief  returns raster index of 4x4 block for diag up-right/horz/vert scans
146*c83a76b0SSuyog Pawar *
147*c83a76b0SSuyog Pawar * @input   : scan type and scan idx
148*c83a76b0SSuyog Pawar *
149*c83a76b0SSuyog Pawar * @output  : packed y pos(msb 4bit) and x pos(lsb 2bit)
150*c83a76b0SSuyog Pawar *
151*c83a76b0SSuyog Pawar *****************************************************************************
152*c83a76b0SSuyog Pawar */
153*c83a76b0SSuyog Pawar const UWORD8 gu1_hevce_scan4x4[3][16] = {
154*c83a76b0SSuyog Pawar     /* diag up right */
155*c83a76b0SSuyog Pawar     { 0, 4, 1, 8, 5, 2, 12, 9, 6, 3, 13, 10, 7, 14, 11, 15 },
156*c83a76b0SSuyog Pawar 
157*c83a76b0SSuyog Pawar     /* horz */
158*c83a76b0SSuyog Pawar     { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
159*c83a76b0SSuyog Pawar 
160*c83a76b0SSuyog Pawar     /* vert */
161*c83a76b0SSuyog Pawar     { 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 }
162*c83a76b0SSuyog Pawar };
163*c83a76b0SSuyog Pawar 
164*c83a76b0SSuyog Pawar /**
165*c83a76b0SSuyog Pawar *****************************************************************************
166*c83a76b0SSuyog Pawar * @brief  returns context increment for sig coeff based on csbf neigbour
167*c83a76b0SSuyog Pawar *         flags (bottom and right) and current coeff postion in 4x4 block
168*c83a76b0SSuyog Pawar *         See section 9.3.3.1.4 for details on this context increment
169*c83a76b0SSuyog Pawar *
170*c83a76b0SSuyog Pawar * @input   : neigbour csbf flags(bit0:rightcsbf, bit1:bottom csbf)
171*c83a76b0SSuyog Pawar *           coeff idx in raster order (0-15)
172*c83a76b0SSuyog Pawar *
173*c83a76b0SSuyog Pawar * @output  : context increment for sig coeff flag
174*c83a76b0SSuyog Pawar *
175*c83a76b0SSuyog Pawar *****************************************************************************
176*c83a76b0SSuyog Pawar */
177*c83a76b0SSuyog Pawar const UWORD8 gu1_hevce_sigcoeff_ctxtinc[4][16] = {
178*c83a76b0SSuyog Pawar     /* nbr csbf = 0:  sigCtx = (xP+yP == 0) ? 2 : (xP+yP < 3) ? 1: 0 */
179*c83a76b0SSuyog Pawar     { 2, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
180*c83a76b0SSuyog Pawar 
181*c83a76b0SSuyog Pawar     /* nbr csbf = 1:  sigCtx = (yP == 0) ? 2 : (yP == 1) ? 1: 0      */
182*c83a76b0SSuyog Pawar     { 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
183*c83a76b0SSuyog Pawar 
184*c83a76b0SSuyog Pawar     /* nbr csbf = 2:  sigCtx = (xP == 0) ? 2 : (xP == 1) ? 1: 0      */
185*c83a76b0SSuyog Pawar     { 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0 },
186*c83a76b0SSuyog Pawar 
187*c83a76b0SSuyog Pawar     /* nbr csbf = 3:  sigCtx = 2                                     */
188*c83a76b0SSuyog Pawar     { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }
189*c83a76b0SSuyog Pawar };
190*c83a76b0SSuyog Pawar 
191*c83a76b0SSuyog Pawar const UWORD8 gu1_hevce_sigcoeff_ctxtinc_00[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
192*c83a76b0SSuyog Pawar 
193*c83a76b0SSuyog Pawar /**
194*c83a76b0SSuyog Pawar *****************************************************************************
195*c83a76b0SSuyog Pawar * @brief  returns context increment for sig coeff for 4x4 tranform size as
196*c83a76b0SSuyog Pawar *         per Table 9-39 in section 9.3.3.1.4
197*c83a76b0SSuyog Pawar *
198*c83a76b0SSuyog Pawar * @input   : coeff idx in raster order (0-15)
199*c83a76b0SSuyog Pawar *
200*c83a76b0SSuyog Pawar * @output  : context increment for sig coeff flag
201*c83a76b0SSuyog Pawar *
202*c83a76b0SSuyog Pawar *****************************************************************************
203*c83a76b0SSuyog Pawar */
204*c83a76b0SSuyog Pawar const UWORD8 gu1_hevce_sigcoeff_ctxtinc_tr4[16] = { 0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 0 };
205*c83a76b0SSuyog Pawar 
206*c83a76b0SSuyog Pawar #define DISABLE_ZCSBF 0
207*c83a76b0SSuyog Pawar 
208*c83a76b0SSuyog Pawar #define TEST_CABAC_BITESTIMATE 0
209*c83a76b0SSuyog Pawar 
210*c83a76b0SSuyog Pawar /*****************************************************************************/
211*c83a76b0SSuyog Pawar /* Function Definitions                                                      */
212*c83a76b0SSuyog Pawar /*****************************************************************************/
213*c83a76b0SSuyog Pawar /**
214*c83a76b0SSuyog Pawar ******************************************************************************
215*c83a76b0SSuyog Pawar *
216*c83a76b0SSuyog Pawar *  @brief Entropy encoding of qp_delta in a tu as per sec 9.3.2 Table 9-32
217*c83a76b0SSuyog Pawar *
218*c83a76b0SSuyog Pawar *  @par   Description
219*c83a76b0SSuyog Pawar *  trunacted unary binarization is done based upto abs_delta of 5 and the rest
220*c83a76b0SSuyog Pawar *  is coded as 0th order Exponential Golomb code
221*c83a76b0SSuyog Pawar *
222*c83a76b0SSuyog Pawar *  @param[inout]   ps_cabac
223*c83a76b0SSuyog Pawar *  pointer to cabac encoding context (handle)
224*c83a76b0SSuyog Pawar *
225*c83a76b0SSuyog Pawar *  @param[in]      qp_delta
226*c83a76b0SSuyog Pawar *  delta qp that needs to be encoded
227*c83a76b0SSuyog Pawar *
228*c83a76b0SSuyog Pawar *  @return      success or failure error code
229*c83a76b0SSuyog Pawar *
230*c83a76b0SSuyog Pawar ******************************************************************************
231*c83a76b0SSuyog Pawar */
ihevce_cabac_encode_qp_delta(cab_ctxt_t * ps_cabac,WORD32 qp_delta)232*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_encode_qp_delta(cab_ctxt_t *ps_cabac, WORD32 qp_delta)
233*c83a76b0SSuyog Pawar {
234*c83a76b0SSuyog Pawar     WORD32 qp_delta_abs = ABS(qp_delta);
235*c83a76b0SSuyog Pawar     WORD32 c_max = TU_MAX_QP_DELTA_ABS;
236*c83a76b0SSuyog Pawar     WORD32 ctxt_inc = IHEVC_CAB_QP_DELTA_ABS;
237*c83a76b0SSuyog Pawar     WORD32 ctxt_inc_max = CTXT_MAX_QP_DELTA_ABS;
238*c83a76b0SSuyog Pawar     WORD32 ret = IHEVCE_SUCCESS;
239*c83a76b0SSuyog Pawar 
240*c83a76b0SSuyog Pawar     /* qp_delta_abs is coded as combination of tunary and eg0 code  */
241*c83a76b0SSuyog Pawar     /* See Table 9-32 and Table 9-37 for details on cu_qp_delta_abs */
242*c83a76b0SSuyog Pawar     ret |= ihevce_cabac_encode_tunary(
243*c83a76b0SSuyog Pawar         ps_cabac, MIN(qp_delta_abs, c_max), c_max, ctxt_inc, 0, ctxt_inc_max);
244*c83a76b0SSuyog Pawar     if(qp_delta_abs >= c_max)
245*c83a76b0SSuyog Pawar     {
246*c83a76b0SSuyog Pawar         ret |= ihevce_cabac_encode_egk(ps_cabac, qp_delta_abs - c_max, 0);
247*c83a76b0SSuyog Pawar     }
248*c83a76b0SSuyog Pawar     AEV_TRACE("cu_qp_delta_abs", qp_delta_abs, ps_cabac->u4_range);
249*c83a76b0SSuyog Pawar 
250*c83a76b0SSuyog Pawar     /* code the qp delta sign flag */
251*c83a76b0SSuyog Pawar     if(qp_delta_abs)
252*c83a76b0SSuyog Pawar     {
253*c83a76b0SSuyog Pawar         WORD32 sign = (qp_delta < 0) ? 1 : 0;
254*c83a76b0SSuyog Pawar         ret |= ihevce_cabac_encode_bypass_bin(ps_cabac, sign);
255*c83a76b0SSuyog Pawar         AEV_TRACE("cu_qp_delta_sign", sign, ps_cabac->u4_range);
256*c83a76b0SSuyog Pawar     }
257*c83a76b0SSuyog Pawar 
258*c83a76b0SSuyog Pawar     return (ret);
259*c83a76b0SSuyog Pawar }
260*c83a76b0SSuyog Pawar 
261*c83a76b0SSuyog Pawar /**
262*c83a76b0SSuyog Pawar ******************************************************************************
263*c83a76b0SSuyog Pawar *
264*c83a76b0SSuyog Pawar *  @brief Encodes position of the last coded coeff (in scan order) of TU
265*c83a76b0SSuyog Pawar *
266*c83a76b0SSuyog Pawar *  @par   Description
267*c83a76b0SSuyog Pawar *  Entropy encode of last coded coeff of a TU as per section:7.3.13
268*c83a76b0SSuyog Pawar *
269*c83a76b0SSuyog Pawar *  @param[inout]   ps_cabac
270*c83a76b0SSuyog Pawar *  pointer to cabac context (handle)
271*c83a76b0SSuyog Pawar *
272*c83a76b0SSuyog Pawar *  @param[in]      last_coeff_x
273*c83a76b0SSuyog Pawar *  x co-ordinate of the last coded coeff of TU(in scan order)
274*c83a76b0SSuyog Pawar *
275*c83a76b0SSuyog Pawar *  @param[in]      last_coeff_y
276*c83a76b0SSuyog Pawar *  x co-ordinate of the last coded coeff of TU (in scan order
277*c83a76b0SSuyog Pawar *
278*c83a76b0SSuyog Pawar *  @param[in]      log2_tr_size
279*c83a76b0SSuyog Pawar *  transform block size corresponding to this node in quad tree
280*c83a76b0SSuyog Pawar *
281*c83a76b0SSuyog Pawar *  @param[in]      is_luma
282*c83a76b0SSuyog Pawar *  indicates if residual block corresponds to luma or chroma block
283*c83a76b0SSuyog Pawar *
284*c83a76b0SSuyog Pawar *  @return      success or failure error code
285*c83a76b0SSuyog Pawar *
286*c83a76b0SSuyog Pawar ******************************************************************************
287*c83a76b0SSuyog Pawar */
ihevce_cabac_encode_last_coeff_x_y(cab_ctxt_t * ps_cabac,WORD32 last_coeff_x,WORD32 last_coeff_y,WORD32 log2_tr_size,WORD32 is_luma)288*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_encode_last_coeff_x_y(
289*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac,
290*c83a76b0SSuyog Pawar     WORD32 last_coeff_x,
291*c83a76b0SSuyog Pawar     WORD32 last_coeff_y,
292*c83a76b0SSuyog Pawar     WORD32 log2_tr_size,
293*c83a76b0SSuyog Pawar     WORD32 is_luma)
294*c83a76b0SSuyog Pawar {
295*c83a76b0SSuyog Pawar     WORD32 ret = IHEVCE_SUCCESS;
296*c83a76b0SSuyog Pawar 
297*c83a76b0SSuyog Pawar     WORD32 last_coeff_x_prefix;
298*c83a76b0SSuyog Pawar     WORD32 last_coeff_y_prefix;
299*c83a76b0SSuyog Pawar     WORD32 suffix, suf_length;
300*c83a76b0SSuyog Pawar     WORD32 c_max;
301*c83a76b0SSuyog Pawar     WORD32 ctxt_idx_x, ctxt_idx_y, ctx_shift;
302*c83a76b0SSuyog Pawar 
303*c83a76b0SSuyog Pawar     /* derive the prefix code */
304*c83a76b0SSuyog Pawar     last_coeff_x_prefix = gu1_hevce_last_coeff_prefix[last_coeff_x];
305*c83a76b0SSuyog Pawar     last_coeff_y_prefix = gu1_hevce_last_coeff_prefix[last_coeff_y];
306*c83a76b0SSuyog Pawar 
307*c83a76b0SSuyog Pawar     c_max = gu1_hevce_last_coeff_prefix[(1 << log2_tr_size) - 1];
308*c83a76b0SSuyog Pawar 
309*c83a76b0SSuyog Pawar     /* context increment as per section 9.3.3.1.2 */
310*c83a76b0SSuyog Pawar     if(is_luma)
311*c83a76b0SSuyog Pawar     {
312*c83a76b0SSuyog Pawar         WORD32 ctx_offset = (3 * (log2_tr_size - 2)) + ((log2_tr_size - 1) >> 2);
313*c83a76b0SSuyog Pawar 
314*c83a76b0SSuyog Pawar         ctxt_idx_x = IHEVC_CAB_COEFFX_PREFIX + ctx_offset;
315*c83a76b0SSuyog Pawar         ctxt_idx_y = IHEVC_CAB_COEFFY_PREFIX + ctx_offset;
316*c83a76b0SSuyog Pawar         ctx_shift = (log2_tr_size + 1) >> 2;
317*c83a76b0SSuyog Pawar     }
318*c83a76b0SSuyog Pawar     else
319*c83a76b0SSuyog Pawar     {
320*c83a76b0SSuyog Pawar         ctxt_idx_x = IHEVC_CAB_COEFFX_PREFIX + 15;
321*c83a76b0SSuyog Pawar         ctxt_idx_y = IHEVC_CAB_COEFFY_PREFIX + 15;
322*c83a76b0SSuyog Pawar         ctx_shift = log2_tr_size - 2;
323*c83a76b0SSuyog Pawar     }
324*c83a76b0SSuyog Pawar 
325*c83a76b0SSuyog Pawar     /* code the last_coeff_x_prefix as tunary binarized code */
326*c83a76b0SSuyog Pawar     ret |= ihevce_cabac_encode_tunary(
327*c83a76b0SSuyog Pawar         ps_cabac, last_coeff_x_prefix, c_max, ctxt_idx_x, ctx_shift, c_max);
328*c83a76b0SSuyog Pawar 
329*c83a76b0SSuyog Pawar     AEV_TRACE("last_coeff_x_prefix", last_coeff_x_prefix, ps_cabac->u4_range);
330*c83a76b0SSuyog Pawar 
331*c83a76b0SSuyog Pawar     /* code the last_coeff_y_prefix as tunary binarized code */
332*c83a76b0SSuyog Pawar     ret |= ihevce_cabac_encode_tunary(
333*c83a76b0SSuyog Pawar         ps_cabac, last_coeff_y_prefix, c_max, ctxt_idx_y, ctx_shift, c_max);
334*c83a76b0SSuyog Pawar 
335*c83a76b0SSuyog Pawar     AEV_TRACE("last_coeff_y_prefix", last_coeff_y_prefix, ps_cabac->u4_range);
336*c83a76b0SSuyog Pawar 
337*c83a76b0SSuyog Pawar     if(last_coeff_x_prefix > 3)
338*c83a76b0SSuyog Pawar     {
339*c83a76b0SSuyog Pawar         /* code the last_coeff_x_suffix as FLC bypass code */
340*c83a76b0SSuyog Pawar         suffix = last_coeff_x - gu1_hevce_last_coeff_prefix_code[last_coeff_x_prefix];
341*c83a76b0SSuyog Pawar 
342*c83a76b0SSuyog Pawar         suf_length = ((last_coeff_x_prefix - 2) >> 1);
343*c83a76b0SSuyog Pawar 
344*c83a76b0SSuyog Pawar         ret |= ihevce_cabac_encode_bypass_bins(ps_cabac, suffix, suf_length);
345*c83a76b0SSuyog Pawar 
346*c83a76b0SSuyog Pawar         AEV_TRACE("last_coeff_x_suffix", suffix, ps_cabac->u4_range);
347*c83a76b0SSuyog Pawar     }
348*c83a76b0SSuyog Pawar 
349*c83a76b0SSuyog Pawar     if(last_coeff_y_prefix > 3)
350*c83a76b0SSuyog Pawar     {
351*c83a76b0SSuyog Pawar         /* code the last_coeff_y_suffix as FLC bypass code */
352*c83a76b0SSuyog Pawar         suffix = last_coeff_y - gu1_hevce_last_coeff_prefix_code[last_coeff_y_prefix];
353*c83a76b0SSuyog Pawar 
354*c83a76b0SSuyog Pawar         suf_length = ((last_coeff_y_prefix - 2) >> 1);
355*c83a76b0SSuyog Pawar 
356*c83a76b0SSuyog Pawar         ret |= ihevce_cabac_encode_bypass_bins(ps_cabac, suffix, suf_length);
357*c83a76b0SSuyog Pawar 
358*c83a76b0SSuyog Pawar         AEV_TRACE("last_coeff_y_suffix", suffix, ps_cabac->u4_range);
359*c83a76b0SSuyog Pawar     }
360*c83a76b0SSuyog Pawar 
361*c83a76b0SSuyog Pawar     return (ret);
362*c83a76b0SSuyog Pawar }
363*c83a76b0SSuyog Pawar 
364*c83a76b0SSuyog Pawar /**
365*c83a76b0SSuyog Pawar ******************************************************************************
366*c83a76b0SSuyog Pawar *
367*c83a76b0SSuyog Pawar *  @brief Encodes a transform tree as per section 7.3.11
368*c83a76b0SSuyog Pawar *
369*c83a76b0SSuyog Pawar *  @par   Description
370*c83a76b0SSuyog Pawar *  Uses recursion till a leaf node is reached where a transform unit
371*c83a76b0SSuyog Pawar *  is coded. While recursing split_transform_flag and parent chroma cbf flags
372*c83a76b0SSuyog Pawar *  are coded before recursing to leaf node
373*c83a76b0SSuyog Pawar *
374*c83a76b0SSuyog Pawar *  @param[inout]   ps_entropy_ctxt
375*c83a76b0SSuyog Pawar *  pointer to entropy context (handle)
376*c83a76b0SSuyog Pawar *
377*c83a76b0SSuyog Pawar *  @param[in]      x0_ctb
378*c83a76b0SSuyog Pawar *  x co-ordinate w.r.t ctb start of current tu node of coding tree
379*c83a76b0SSuyog Pawar *
380*c83a76b0SSuyog Pawar *  @param[in]      y0_ctb
381*c83a76b0SSuyog Pawar *  y co-ordinate w.r.t ctb start of current cu node of coding tree
382*c83a76b0SSuyog Pawar *
383*c83a76b0SSuyog Pawar *  @param[in]      log2_tr_size
384*c83a76b0SSuyog Pawar *  transform block size corresponding to this node in quad tree
385*c83a76b0SSuyog Pawar *
386*c83a76b0SSuyog Pawar *  @param[in]      tr_depth
387*c83a76b0SSuyog Pawar *  current depth of the tree
388*c83a76b0SSuyog Pawar *
389*c83a76b0SSuyog Pawar *  @param[in]      tr_depth
390*c83a76b0SSuyog Pawar *  current depth of the tree
391*c83a76b0SSuyog Pawar *
392*c83a76b0SSuyog Pawar *  @param[in]      blk_num
393*c83a76b0SSuyog Pawar *  current block number in the quad tree (required for chorma 4x4 coding)
394*c83a76b0SSuyog Pawar *
395*c83a76b0SSuyog Pawar *  @return      success or failure error code
396*c83a76b0SSuyog Pawar *
397*c83a76b0SSuyog Pawar ******************************************************************************
398*c83a76b0SSuyog Pawar */
ihevce_encode_transform_tree(entropy_context_t * ps_entropy_ctxt,WORD32 x0_ctb,WORD32 y0_ctb,WORD32 log2_tr_size,WORD32 tr_depth,WORD32 blk_num,cu_enc_loop_out_t * ps_enc_cu)399*c83a76b0SSuyog Pawar WORD32 ihevce_encode_transform_tree(
400*c83a76b0SSuyog Pawar     entropy_context_t *ps_entropy_ctxt,
401*c83a76b0SSuyog Pawar     WORD32 x0_ctb,
402*c83a76b0SSuyog Pawar     WORD32 y0_ctb,
403*c83a76b0SSuyog Pawar     WORD32 log2_tr_size,
404*c83a76b0SSuyog Pawar     WORD32 tr_depth,
405*c83a76b0SSuyog Pawar     WORD32 blk_num,
406*c83a76b0SSuyog Pawar     cu_enc_loop_out_t *ps_enc_cu)
407*c83a76b0SSuyog Pawar {
408*c83a76b0SSuyog Pawar     WORD32 ret = IHEVCE_SUCCESS;
409*c83a76b0SSuyog Pawar     sps_t *ps_sps = ps_entropy_ctxt->ps_sps;
410*c83a76b0SSuyog Pawar     WORD32 split_tr_flag;
411*c83a76b0SSuyog Pawar 
412*c83a76b0SSuyog Pawar     WORD32 tu_idx = ps_entropy_ctxt->i4_tu_idx;
413*c83a76b0SSuyog Pawar     tu_enc_loop_out_t *ps_enc_tu = ps_enc_cu->ps_enc_tu + tu_idx;
414*c83a76b0SSuyog Pawar 
415*c83a76b0SSuyog Pawar     /* TU size in pels */
416*c83a76b0SSuyog Pawar     WORD32 tu_size = 4 << ps_enc_tu->s_tu.b3_size;
417*c83a76b0SSuyog Pawar 
418*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_entropy_ctxt->s_cabac_ctxt;
419*c83a76b0SSuyog Pawar 
420*c83a76b0SSuyog Pawar     WORD32 max_tr_depth;
421*c83a76b0SSuyog Pawar     WORD32 is_intra = (ps_enc_cu->b1_pred_mode_flag == PRED_MODE_INTRA);
422*c83a76b0SSuyog Pawar     WORD32 log2_min_trafo_size, log2_max_trafo_size;
423*c83a76b0SSuyog Pawar     UWORD32 u4_bits_estimated_prev;
424*c83a76b0SSuyog Pawar 
425*c83a76b0SSuyog Pawar     WORD32 intra_nxn_pu = 0;
426*c83a76b0SSuyog Pawar     WORD32 ctxt_inc;
427*c83a76b0SSuyog Pawar     WORD32 cbf_luma = 0;
428*c83a76b0SSuyog Pawar     WORD32 ai4_cbf_cb[2] = { 0, 0 };
429*c83a76b0SSuyog Pawar     WORD32 ai4_cbf_cr[2] = { 0, 0 };
430*c83a76b0SSuyog Pawar     UWORD32 tu_split_bits = 0;
431*c83a76b0SSuyog Pawar     UWORD8 u1_is_422 = (ps_sps->i1_chroma_format_idc == 2);
432*c83a76b0SSuyog Pawar 
433*c83a76b0SSuyog Pawar     tu_split_bits = ps_cabac->u4_bits_estimated_q12;
434*c83a76b0SSuyog Pawar     /* intialize min / max transform sizes based on sps */
435*c83a76b0SSuyog Pawar     log2_min_trafo_size = ps_sps->i1_log2_min_transform_block_size;
436*c83a76b0SSuyog Pawar 
437*c83a76b0SSuyog Pawar     log2_max_trafo_size = log2_min_trafo_size + ps_sps->i1_log2_diff_max_min_transform_block_size;
438*c83a76b0SSuyog Pawar 
439*c83a76b0SSuyog Pawar     /* intialize max transform depth for intra / inter signalled in sps */
440*c83a76b0SSuyog Pawar     if(is_intra)
441*c83a76b0SSuyog Pawar     {
442*c83a76b0SSuyog Pawar         max_tr_depth = ps_sps->i1_max_transform_hierarchy_depth_intra;
443*c83a76b0SSuyog Pawar         intra_nxn_pu = ps_enc_cu->b3_part_mode == PART_NxN;
444*c83a76b0SSuyog Pawar     }
445*c83a76b0SSuyog Pawar     else
446*c83a76b0SSuyog Pawar     {
447*c83a76b0SSuyog Pawar         max_tr_depth = ps_sps->i1_max_transform_hierarchy_depth_inter;
448*c83a76b0SSuyog Pawar     }
449*c83a76b0SSuyog Pawar 
450*c83a76b0SSuyog Pawar     /* Sanity checks */
451*c83a76b0SSuyog Pawar     ASSERT(tr_depth <= 4);
452*c83a76b0SSuyog Pawar     ASSERT(log2_min_trafo_size >= 2);
453*c83a76b0SSuyog Pawar     ASSERT(log2_max_trafo_size <= 5);
454*c83a76b0SSuyog Pawar     ASSERT((tu_idx >= 0) && (tu_idx < ps_enc_cu->u2_num_tus_in_cu));
455*c83a76b0SSuyog Pawar     ASSERT((tu_size >= 4) && (tu_size <= (1 << log2_tr_size)));
456*c83a76b0SSuyog Pawar 
457*c83a76b0SSuyog Pawar     /* Encode split transform flag based on following conditions; sec 7.3.11 */
458*c83a76b0SSuyog Pawar     if((log2_tr_size <= log2_max_trafo_size) && (log2_tr_size > log2_min_trafo_size) &&
459*c83a76b0SSuyog Pawar        (tr_depth < max_tr_depth) && (!(intra_nxn_pu && (tr_depth == 0))))
460*c83a76b0SSuyog Pawar     {
461*c83a76b0SSuyog Pawar         /* encode the split transform flag, context derived as per Table9-37 */
462*c83a76b0SSuyog Pawar         ctxt_inc = IHEVC_CAB_SPLIT_TFM + (5 - log2_tr_size);
463*c83a76b0SSuyog Pawar 
464*c83a76b0SSuyog Pawar         /* split if actual tu size is smaller than target tu size */
465*c83a76b0SSuyog Pawar         split_tr_flag = tu_size < (1 << log2_tr_size);
466*c83a76b0SSuyog Pawar         u4_bits_estimated_prev = ps_cabac->u4_bits_estimated_q12;
467*c83a76b0SSuyog Pawar         ret |= ihevce_cabac_encode_bin(ps_cabac, split_tr_flag, ctxt_inc);
468*c83a76b0SSuyog Pawar 
469*c83a76b0SSuyog Pawar         if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
470*c83a76b0SSuyog Pawar         {  // clang-format off
471*c83a76b0SSuyog Pawar             /*PIC INFO : populate cu split flag*/
472*c83a76b0SSuyog Pawar             ps_entropy_ctxt->ps_pic_level_info->u8_bits_estimated_split_tu_flag +=
473*c83a76b0SSuyog Pawar                 (ps_cabac->u4_bits_estimated_q12 - u4_bits_estimated_prev);
474*c83a76b0SSuyog Pawar         }  // clang-format on
475*c83a76b0SSuyog Pawar 
476*c83a76b0SSuyog Pawar         AEV_TRACE("split_transform_flag", split_tr_flag, ps_cabac->u4_range);
477*c83a76b0SSuyog Pawar     }
478*c83a76b0SSuyog Pawar     else
479*c83a76b0SSuyog Pawar     {
480*c83a76b0SSuyog Pawar         WORD32 inter_split;
481*c83a76b0SSuyog Pawar         /*********************************************************************/
482*c83a76b0SSuyog Pawar         /*                                                                   */
483*c83a76b0SSuyog Pawar         /* split tr is implicitly derived as 1 if  (see section 7.4.10)      */
484*c83a76b0SSuyog Pawar         /*  a. log2_tr_size > log2_max_trafo_size                            */
485*c83a76b0SSuyog Pawar         /*  b. intra cu has NXN pu                                           */
486*c83a76b0SSuyog Pawar         /*  c. inter cu is not 2Nx2N && max_transform_hierarchy_depth_inter=0*/
487*c83a76b0SSuyog Pawar         /*                                                                   */
488*c83a76b0SSuyog Pawar         /* split tu is implicitly derived as 0 otherwise                     */
489*c83a76b0SSuyog Pawar         /*********************************************************************/
490*c83a76b0SSuyog Pawar         inter_split = (!is_intra) && (max_tr_depth == 0) && (tr_depth == 0) &&
491*c83a76b0SSuyog Pawar                       (ps_enc_cu->b3_part_mode != PART_2Nx2N);
492*c83a76b0SSuyog Pawar 
493*c83a76b0SSuyog Pawar         if((log2_tr_size > log2_max_trafo_size) || (intra_nxn_pu && (tr_depth == 0)) ||
494*c83a76b0SSuyog Pawar            (inter_split))
495*c83a76b0SSuyog Pawar         {
496*c83a76b0SSuyog Pawar             split_tr_flag = 1;
497*c83a76b0SSuyog Pawar         }
498*c83a76b0SSuyog Pawar         else
499*c83a76b0SSuyog Pawar         {
500*c83a76b0SSuyog Pawar             split_tr_flag = 0;
501*c83a76b0SSuyog Pawar         }
502*c83a76b0SSuyog Pawar     }
503*c83a76b0SSuyog Pawar     /*accumulate only tu tree bits*/
504*c83a76b0SSuyog Pawar     ps_cabac->u4_true_tu_split_flag_q12 += ps_cabac->u4_bits_estimated_q12 - tu_split_bits;
505*c83a76b0SSuyog Pawar 
506*c83a76b0SSuyog Pawar     /* Encode the cbf flags for chroma before the split as per sec 7.3.11   */
507*c83a76b0SSuyog Pawar     if(log2_tr_size > 2)
508*c83a76b0SSuyog Pawar     {
509*c83a76b0SSuyog Pawar         /* encode the cbf cb, context derived as per Table 9-37 */
510*c83a76b0SSuyog Pawar         ctxt_inc = IHEVC_CAB_CBCR_IDX + tr_depth;
511*c83a76b0SSuyog Pawar 
512*c83a76b0SSuyog Pawar         /* Note chroma cbf is coded for depth=0 or if parent cbf was coded */
513*c83a76b0SSuyog Pawar         if((tr_depth == 0) || (ps_entropy_ctxt->apu1_cbf_cb[0][tr_depth - 1]) ||
514*c83a76b0SSuyog Pawar            (ps_entropy_ctxt->apu1_cbf_cb[1][tr_depth - 1]))
515*c83a76b0SSuyog Pawar         {
516*c83a76b0SSuyog Pawar #if CABAC_BIT_EFFICIENT_CHROMA_PARENT_CBF
517*c83a76b0SSuyog Pawar             /*************************************************************/
518*c83a76b0SSuyog Pawar             /* Bit-Efficient chroma cbf signalling                       */
519*c83a76b0SSuyog Pawar             /* if children nodes have 0 cbf parent cbf can be coded as 0 */
520*c83a76b0SSuyog Pawar             /* peeking through all the child nodes for cb to check if    */
521*c83a76b0SSuyog Pawar             /* parent can be coded as 0                                  */
522*c83a76b0SSuyog Pawar             /*************************************************************/
523*c83a76b0SSuyog Pawar             WORD32 tu_cnt = 0;
524*c83a76b0SSuyog Pawar             while(1)
525*c83a76b0SSuyog Pawar             {
526*c83a76b0SSuyog Pawar                 WORD32 trans_size = 1 << (ps_enc_tu[tu_cnt].s_tu.b3_size + 2);
527*c83a76b0SSuyog Pawar                 WORD32 tu_x = (ps_enc_tu[tu_cnt].s_tu.b4_pos_x << 2);
528*c83a76b0SSuyog Pawar                 WORD32 tu_y = (ps_enc_tu[tu_cnt].s_tu.b4_pos_y << 2);
529*c83a76b0SSuyog Pawar 
530*c83a76b0SSuyog Pawar                 ASSERT(tu_cnt < ps_enc_cu->u2_num_tus_in_cu);
531*c83a76b0SSuyog Pawar 
532*c83a76b0SSuyog Pawar                 if((ps_enc_tu[tu_cnt].s_tu.b1_cb_cbf) || (ps_enc_tu[tu_cnt].s_tu.b1_cb_cbf_subtu1))
533*c83a76b0SSuyog Pawar                 {
534*c83a76b0SSuyog Pawar                     ai4_cbf_cb[0] = ps_enc_tu[tu_cnt].s_tu.b1_cb_cbf;
535*c83a76b0SSuyog Pawar                     ai4_cbf_cb[1] = ps_enc_tu[tu_cnt].s_tu.b1_cb_cbf_subtu1;
536*c83a76b0SSuyog Pawar                     break;
537*c83a76b0SSuyog Pawar                 }
538*c83a76b0SSuyog Pawar 
539*c83a76b0SSuyog Pawar                 /* 8x8 parent has only one 4x4 valid chroma block for 420 */
540*c83a76b0SSuyog Pawar                 if(3 == log2_tr_size)
541*c83a76b0SSuyog Pawar                     break;
542*c83a76b0SSuyog Pawar 
543*c83a76b0SSuyog Pawar                 if((tu_x + trans_size == (x0_ctb + (1 << log2_tr_size))) &&
544*c83a76b0SSuyog Pawar                    (tu_y + trans_size == (y0_ctb + (1 << log2_tr_size))))
545*c83a76b0SSuyog Pawar                 {
546*c83a76b0SSuyog Pawar                     ai4_cbf_cb[0] = ps_enc_tu[tu_cnt].s_tu.b1_cb_cbf;
547*c83a76b0SSuyog Pawar                     ai4_cbf_cb[1] = ps_enc_tu[tu_cnt].s_tu.b1_cb_cbf_subtu1;
548*c83a76b0SSuyog Pawar                     ASSERT(
549*c83a76b0SSuyog Pawar                         (0 == ps_enc_tu[tu_cnt].s_tu.b1_cb_cbf) &&
550*c83a76b0SSuyog Pawar                         (0 == ps_enc_tu[tu_cnt].s_tu.b1_cb_cbf_subtu1));
551*c83a76b0SSuyog Pawar                     break;
552*c83a76b0SSuyog Pawar                 }
553*c83a76b0SSuyog Pawar 
554*c83a76b0SSuyog Pawar                 tu_cnt++;
555*c83a76b0SSuyog Pawar             }
556*c83a76b0SSuyog Pawar #else
557*c83a76b0SSuyog Pawar             /* read cbf only when split is 0 (child node) else force cbf=1 */
558*c83a76b0SSuyog Pawar             ai4_cbf_cb[0] = (split_tr_flag && (log2_tr_size > 3)) ? 1 : ps_enc_tu->s_tu.b1_cb_cbf;
559*c83a76b0SSuyog Pawar             ai4_cbf_cb[1] =
560*c83a76b0SSuyog Pawar                 (split_tr_flag && (log2_tr_size > 3)) ? 1 : ps_enc_tu->s_tu.b1_cb_cbf_subtu1;
561*c83a76b0SSuyog Pawar 
562*c83a76b0SSuyog Pawar #endif
563*c83a76b0SSuyog Pawar             if((u1_is_422) && ((!split_tr_flag) || (3 == log2_tr_size)))
564*c83a76b0SSuyog Pawar             {
565*c83a76b0SSuyog Pawar                 u4_bits_estimated_prev = ps_cabac->u4_bits_estimated_q12;
566*c83a76b0SSuyog Pawar                 ret |= ihevce_cabac_encode_bin(ps_cabac, ai4_cbf_cb[0], ctxt_inc);
567*c83a76b0SSuyog Pawar 
568*c83a76b0SSuyog Pawar                 if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
569*c83a76b0SSuyog Pawar                 {  // clang-format off
570*c83a76b0SSuyog Pawar                     /*PIC INFO : Populate CBF cr bits*/
571*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->ps_pic_level_info->u8_bits_estimated_cbf_chroma_bits +=
572*c83a76b0SSuyog Pawar                         (ps_cabac->u4_bits_estimated_q12 -
573*c83a76b0SSuyog Pawar                             u4_bits_estimated_prev);
574*c83a76b0SSuyog Pawar                 }  // clang-format on
575*c83a76b0SSuyog Pawar 
576*c83a76b0SSuyog Pawar                 AEV_TRACE("cbf_cb", ai4_cbf_cb[0], ps_cabac->u4_range);
577*c83a76b0SSuyog Pawar 
578*c83a76b0SSuyog Pawar                 u4_bits_estimated_prev = ps_cabac->u4_bits_estimated_q12;
579*c83a76b0SSuyog Pawar                 ret |= ihevce_cabac_encode_bin(ps_cabac, ai4_cbf_cb[1], ctxt_inc);
580*c83a76b0SSuyog Pawar 
581*c83a76b0SSuyog Pawar                 if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
582*c83a76b0SSuyog Pawar                 {  // clang-format off
583*c83a76b0SSuyog Pawar                     /*PIC INFO : Populate CBF cr bits*/
584*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->ps_pic_level_info->u8_bits_estimated_cbf_chroma_bits +=
585*c83a76b0SSuyog Pawar                         (ps_cabac->u4_bits_estimated_q12 -
586*c83a76b0SSuyog Pawar                             u4_bits_estimated_prev);
587*c83a76b0SSuyog Pawar                 }  // clang-format on
588*c83a76b0SSuyog Pawar 
589*c83a76b0SSuyog Pawar                 AEV_TRACE("cbf_cb", ai4_cbf_cb[1], ps_cabac->u4_range);
590*c83a76b0SSuyog Pawar             }
591*c83a76b0SSuyog Pawar             else
592*c83a76b0SSuyog Pawar             {
593*c83a76b0SSuyog Pawar                 u4_bits_estimated_prev = ps_cabac->u4_bits_estimated_q12;
594*c83a76b0SSuyog Pawar                 ret |= ihevce_cabac_encode_bin(ps_cabac, ai4_cbf_cb[0] || ai4_cbf_cb[1], ctxt_inc);
595*c83a76b0SSuyog Pawar 
596*c83a76b0SSuyog Pawar                 if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
597*c83a76b0SSuyog Pawar                 {  // clang-format off
598*c83a76b0SSuyog Pawar                     /*PIC INFO : Populate CBF cr bits*/
599*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->ps_pic_level_info->u8_bits_estimated_cbf_chroma_bits +=
600*c83a76b0SSuyog Pawar                         (ps_cabac->u4_bits_estimated_q12 -
601*c83a76b0SSuyog Pawar                             u4_bits_estimated_prev);
602*c83a76b0SSuyog Pawar                 }  // clang-format on
603*c83a76b0SSuyog Pawar 
604*c83a76b0SSuyog Pawar                 AEV_TRACE("cbf_cb", ai4_cbf_cb[0] || ai4_cbf_cb[1], ps_cabac->u4_range);
605*c83a76b0SSuyog Pawar             }
606*c83a76b0SSuyog Pawar         }
607*c83a76b0SSuyog Pawar         else
608*c83a76b0SSuyog Pawar         {
609*c83a76b0SSuyog Pawar             ai4_cbf_cb[0] = ps_entropy_ctxt->apu1_cbf_cb[0][tr_depth - 1];
610*c83a76b0SSuyog Pawar             ai4_cbf_cb[1] = ps_entropy_ctxt->apu1_cbf_cb[1][tr_depth - 1];
611*c83a76b0SSuyog Pawar         }
612*c83a76b0SSuyog Pawar 
613*c83a76b0SSuyog Pawar         if((tr_depth == 0) || (ps_entropy_ctxt->apu1_cbf_cr[0][tr_depth - 1]) ||
614*c83a76b0SSuyog Pawar            (ps_entropy_ctxt->apu1_cbf_cr[1][tr_depth - 1]))
615*c83a76b0SSuyog Pawar         {
616*c83a76b0SSuyog Pawar #if CABAC_BIT_EFFICIENT_CHROMA_PARENT_CBF
617*c83a76b0SSuyog Pawar             /*************************************************************/
618*c83a76b0SSuyog Pawar             /* Bit-Efficient chroma cbf signalling                       */
619*c83a76b0SSuyog Pawar             /* if children nodes have 0 cbf parent cbf can be coded as 0 */
620*c83a76b0SSuyog Pawar             /* peeking through all the child nodes for cr to check if    */
621*c83a76b0SSuyog Pawar             /* parent can be coded as 0                                  */
622*c83a76b0SSuyog Pawar             /*************************************************************/
623*c83a76b0SSuyog Pawar             WORD32 tu_cnt = 0;
624*c83a76b0SSuyog Pawar             while(1)
625*c83a76b0SSuyog Pawar             {
626*c83a76b0SSuyog Pawar                 WORD32 trans_size = 1 << (ps_enc_tu[tu_cnt].s_tu.b3_size + 2);
627*c83a76b0SSuyog Pawar                 WORD32 tu_x = (ps_enc_tu[tu_cnt].s_tu.b4_pos_x << 2);
628*c83a76b0SSuyog Pawar                 WORD32 tu_y = (ps_enc_tu[tu_cnt].s_tu.b4_pos_y << 2);
629*c83a76b0SSuyog Pawar 
630*c83a76b0SSuyog Pawar                 ASSERT(tu_cnt < ps_enc_cu->u2_num_tus_in_cu);
631*c83a76b0SSuyog Pawar 
632*c83a76b0SSuyog Pawar                 if((ps_enc_tu[tu_cnt].s_tu.b1_cr_cbf) || (ps_enc_tu[tu_cnt].s_tu.b1_cr_cbf_subtu1))
633*c83a76b0SSuyog Pawar                 {
634*c83a76b0SSuyog Pawar                     ai4_cbf_cr[0] = ps_enc_tu[tu_cnt].s_tu.b1_cr_cbf;
635*c83a76b0SSuyog Pawar                     ai4_cbf_cr[1] = ps_enc_tu[tu_cnt].s_tu.b1_cr_cbf_subtu1;
636*c83a76b0SSuyog Pawar                     break;
637*c83a76b0SSuyog Pawar                 }
638*c83a76b0SSuyog Pawar 
639*c83a76b0SSuyog Pawar                 /* 8x8 parent has only one 4x4 valid chroma block for 420 */
640*c83a76b0SSuyog Pawar                 if(3 == log2_tr_size)
641*c83a76b0SSuyog Pawar                     break;
642*c83a76b0SSuyog Pawar 
643*c83a76b0SSuyog Pawar                 if((tu_x + trans_size == (x0_ctb + (1 << log2_tr_size))) &&
644*c83a76b0SSuyog Pawar                    (tu_y + trans_size == (y0_ctb + (1 << log2_tr_size))))
645*c83a76b0SSuyog Pawar                 {
646*c83a76b0SSuyog Pawar                     ai4_cbf_cr[0] = ps_enc_tu[tu_cnt].s_tu.b1_cr_cbf;
647*c83a76b0SSuyog Pawar                     ai4_cbf_cr[1] = ps_enc_tu[tu_cnt].s_tu.b1_cr_cbf_subtu1;
648*c83a76b0SSuyog Pawar                     ASSERT(
649*c83a76b0SSuyog Pawar                         (0 == ps_enc_tu[tu_cnt].s_tu.b1_cr_cbf) &&
650*c83a76b0SSuyog Pawar                         (0 == ps_enc_tu[tu_cnt].s_tu.b1_cr_cbf_subtu1));
651*c83a76b0SSuyog Pawar                     break;
652*c83a76b0SSuyog Pawar                 }
653*c83a76b0SSuyog Pawar 
654*c83a76b0SSuyog Pawar                 tu_cnt++;
655*c83a76b0SSuyog Pawar             }
656*c83a76b0SSuyog Pawar #else
657*c83a76b0SSuyog Pawar             /* read cbf only when split is 0 (child node) else force cbf=1 */
658*c83a76b0SSuyog Pawar             ai4_cbf_cr[0] = (split_tr_flag && (log2_tr_size > 3)) ? 1 : ps_enc_tu->s_tu.b1_cr_cbf;
659*c83a76b0SSuyog Pawar             ai4_cbf_cr[1] =
660*c83a76b0SSuyog Pawar                 (split_tr_flag && (log2_tr_size > 3)) ? 1 : ps_enc_tu->s_tu.b1_cr_cbf_subtu1;
661*c83a76b0SSuyog Pawar #endif
662*c83a76b0SSuyog Pawar 
663*c83a76b0SSuyog Pawar             if((u1_is_422) && ((!split_tr_flag) || (3 == log2_tr_size)))
664*c83a76b0SSuyog Pawar             {
665*c83a76b0SSuyog Pawar                 u4_bits_estimated_prev = ps_cabac->u4_bits_estimated_q12;
666*c83a76b0SSuyog Pawar                 ret |= ihevce_cabac_encode_bin(ps_cabac, ai4_cbf_cr[0], ctxt_inc);
667*c83a76b0SSuyog Pawar 
668*c83a76b0SSuyog Pawar                 if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
669*c83a76b0SSuyog Pawar                 {  // clang-format off
670*c83a76b0SSuyog Pawar                     /*PIC INFO : Populate CBF cr bits*/
671*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->ps_pic_level_info->u8_bits_estimated_cbf_chroma_bits +=
672*c83a76b0SSuyog Pawar                         (ps_cabac->u4_bits_estimated_q12 -
673*c83a76b0SSuyog Pawar                             u4_bits_estimated_prev);
674*c83a76b0SSuyog Pawar                 }  // clang-format on
675*c83a76b0SSuyog Pawar 
676*c83a76b0SSuyog Pawar                 AEV_TRACE("cbf_cr", ai4_cbf_cr[0], ps_cabac->u4_range);
677*c83a76b0SSuyog Pawar 
678*c83a76b0SSuyog Pawar                 u4_bits_estimated_prev = ps_cabac->u4_bits_estimated_q12;
679*c83a76b0SSuyog Pawar                 ret |= ihevce_cabac_encode_bin(ps_cabac, ai4_cbf_cr[1], ctxt_inc);
680*c83a76b0SSuyog Pawar 
681*c83a76b0SSuyog Pawar                 if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
682*c83a76b0SSuyog Pawar                 {  // clang-format off
683*c83a76b0SSuyog Pawar                     /*PIC INFO : Populate CBF cr bits*/
684*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->ps_pic_level_info->u8_bits_estimated_cbf_chroma_bits +=
685*c83a76b0SSuyog Pawar                         (ps_cabac->u4_bits_estimated_q12 -
686*c83a76b0SSuyog Pawar                             u4_bits_estimated_prev);
687*c83a76b0SSuyog Pawar                 }  // clang-format on
688*c83a76b0SSuyog Pawar 
689*c83a76b0SSuyog Pawar                 AEV_TRACE("cbf_cr", ai4_cbf_cr[1], ps_cabac->u4_range);
690*c83a76b0SSuyog Pawar             }
691*c83a76b0SSuyog Pawar             else
692*c83a76b0SSuyog Pawar             {
693*c83a76b0SSuyog Pawar                 u4_bits_estimated_prev = ps_cabac->u4_bits_estimated_q12;
694*c83a76b0SSuyog Pawar                 ret |= ihevce_cabac_encode_bin(ps_cabac, ai4_cbf_cr[0] || ai4_cbf_cr[1], ctxt_inc);
695*c83a76b0SSuyog Pawar 
696*c83a76b0SSuyog Pawar                 if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
697*c83a76b0SSuyog Pawar                 {  // clang-format off
698*c83a76b0SSuyog Pawar                     /*PIC INFO : Populate CBF cr bits*/
699*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->ps_pic_level_info->u8_bits_estimated_cbf_chroma_bits +=
700*c83a76b0SSuyog Pawar                         (ps_cabac->u4_bits_estimated_q12 -
701*c83a76b0SSuyog Pawar                             u4_bits_estimated_prev);
702*c83a76b0SSuyog Pawar                 }  // clang-format on
703*c83a76b0SSuyog Pawar 
704*c83a76b0SSuyog Pawar                 AEV_TRACE("cbf_cr", ai4_cbf_cr[0] || ai4_cbf_cr[1], ps_cabac->u4_range);
705*c83a76b0SSuyog Pawar             }
706*c83a76b0SSuyog Pawar         }
707*c83a76b0SSuyog Pawar         else
708*c83a76b0SSuyog Pawar         {
709*c83a76b0SSuyog Pawar             ai4_cbf_cr[0] = ps_entropy_ctxt->apu1_cbf_cr[0][tr_depth - 1];
710*c83a76b0SSuyog Pawar             ai4_cbf_cr[1] = ps_entropy_ctxt->apu1_cbf_cr[1][tr_depth - 1];
711*c83a76b0SSuyog Pawar         }
712*c83a76b0SSuyog Pawar 
713*c83a76b0SSuyog Pawar         ps_entropy_ctxt->apu1_cbf_cb[0][tr_depth] = ai4_cbf_cb[0];
714*c83a76b0SSuyog Pawar         ps_entropy_ctxt->apu1_cbf_cr[0][tr_depth] = ai4_cbf_cr[0];
715*c83a76b0SSuyog Pawar         ps_entropy_ctxt->apu1_cbf_cb[1][tr_depth] = ai4_cbf_cb[1];
716*c83a76b0SSuyog Pawar         ps_entropy_ctxt->apu1_cbf_cr[1][tr_depth] = ai4_cbf_cr[1];
717*c83a76b0SSuyog Pawar     }
718*c83a76b0SSuyog Pawar     else
719*c83a76b0SSuyog Pawar     {
720*c83a76b0SSuyog Pawar         ai4_cbf_cb[0] = ps_entropy_ctxt->apu1_cbf_cb[0][tr_depth - 1];
721*c83a76b0SSuyog Pawar         ai4_cbf_cr[0] = ps_entropy_ctxt->apu1_cbf_cr[0][tr_depth - 1];
722*c83a76b0SSuyog Pawar         ai4_cbf_cb[1] = ps_entropy_ctxt->apu1_cbf_cb[1][tr_depth - 1];
723*c83a76b0SSuyog Pawar         ai4_cbf_cr[1] = ps_entropy_ctxt->apu1_cbf_cr[1][tr_depth - 1];
724*c83a76b0SSuyog Pawar     }
725*c83a76b0SSuyog Pawar 
726*c83a76b0SSuyog Pawar     if(split_tr_flag)
727*c83a76b0SSuyog Pawar     {
728*c83a76b0SSuyog Pawar         /* recurse into quad child nodes till a leaf node is reached */
729*c83a76b0SSuyog Pawar         WORD32 x1_ctb = x0_ctb + ((1 << log2_tr_size) >> 1);
730*c83a76b0SSuyog Pawar         WORD32 y1_ctb = y0_ctb + ((1 << log2_tr_size) >> 1);
731*c83a76b0SSuyog Pawar 
732*c83a76b0SSuyog Pawar         /* node0 of quad tree */
733*c83a76b0SSuyog Pawar         ret |= ihevce_encode_transform_tree(
734*c83a76b0SSuyog Pawar             ps_entropy_ctxt,
735*c83a76b0SSuyog Pawar             x0_ctb,
736*c83a76b0SSuyog Pawar             y0_ctb,
737*c83a76b0SSuyog Pawar             log2_tr_size - 1,
738*c83a76b0SSuyog Pawar             tr_depth + 1,
739*c83a76b0SSuyog Pawar             0, /* block 0 */
740*c83a76b0SSuyog Pawar             ps_enc_cu);
741*c83a76b0SSuyog Pawar 
742*c83a76b0SSuyog Pawar         /* node1 of quad tree */
743*c83a76b0SSuyog Pawar         ret |= ihevce_encode_transform_tree(
744*c83a76b0SSuyog Pawar             ps_entropy_ctxt,
745*c83a76b0SSuyog Pawar             x1_ctb,
746*c83a76b0SSuyog Pawar             y0_ctb,
747*c83a76b0SSuyog Pawar             log2_tr_size - 1,
748*c83a76b0SSuyog Pawar             tr_depth + 1,
749*c83a76b0SSuyog Pawar             1, /* block 1 */
750*c83a76b0SSuyog Pawar             ps_enc_cu);
751*c83a76b0SSuyog Pawar 
752*c83a76b0SSuyog Pawar         /* node2 of quad tree */
753*c83a76b0SSuyog Pawar         ret |= ihevce_encode_transform_tree(
754*c83a76b0SSuyog Pawar             ps_entropy_ctxt,
755*c83a76b0SSuyog Pawar             x0_ctb,
756*c83a76b0SSuyog Pawar             y1_ctb,
757*c83a76b0SSuyog Pawar             log2_tr_size - 1,
758*c83a76b0SSuyog Pawar             tr_depth + 1,
759*c83a76b0SSuyog Pawar             2, /* block 2 */
760*c83a76b0SSuyog Pawar             ps_enc_cu);
761*c83a76b0SSuyog Pawar 
762*c83a76b0SSuyog Pawar         /* node3 of quad tree */
763*c83a76b0SSuyog Pawar         ret |= ihevce_encode_transform_tree(
764*c83a76b0SSuyog Pawar             ps_entropy_ctxt,
765*c83a76b0SSuyog Pawar             x1_ctb,
766*c83a76b0SSuyog Pawar             y1_ctb,
767*c83a76b0SSuyog Pawar             log2_tr_size - 1,
768*c83a76b0SSuyog Pawar             tr_depth + 1,
769*c83a76b0SSuyog Pawar             3, /* block 3 */
770*c83a76b0SSuyog Pawar             ps_enc_cu);
771*c83a76b0SSuyog Pawar     }
772*c83a76b0SSuyog Pawar     else
773*c83a76b0SSuyog Pawar     {
774*c83a76b0SSuyog Pawar         /* leaf node is reached! Encode the TU */
775*c83a76b0SSuyog Pawar         WORD32 encode_delta_qp;
776*c83a76b0SSuyog Pawar         void *pv_coeff;
777*c83a76b0SSuyog Pawar         void *pv_cu_coeff = ps_enc_cu->pv_coeff;
778*c83a76b0SSuyog Pawar 
779*c83a76b0SSuyog Pawar         /* condition to encode qp of cu in first coded tu */
780*c83a76b0SSuyog Pawar         encode_delta_qp = ps_entropy_ctxt->i1_encode_qp_delta &&
781*c83a76b0SSuyog Pawar                           (ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS);
782*c83a76b0SSuyog Pawar 
783*c83a76b0SSuyog Pawar         if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
784*c83a76b0SSuyog Pawar         {  // clang-format off
785*c83a76b0SSuyog Pawar             /*PIC INFO : Tota TUs based on size*/
786*c83a76b0SSuyog Pawar             if(32 == tu_size)
787*c83a76b0SSuyog Pawar             {
788*c83a76b0SSuyog Pawar                 ps_entropy_ctxt->ps_pic_level_info->i8_total_tu_based_on_size[3]++;
789*c83a76b0SSuyog Pawar             }
790*c83a76b0SSuyog Pawar             else
791*c83a76b0SSuyog Pawar             {
792*c83a76b0SSuyog Pawar                 ps_entropy_ctxt->ps_pic_level_info->i8_total_tu_based_on_size[tu_size >> 3]++;
793*c83a76b0SSuyog Pawar             }
794*c83a76b0SSuyog Pawar         }  // clang-format on
795*c83a76b0SSuyog Pawar 
796*c83a76b0SSuyog Pawar         /* sanity checks */
797*c83a76b0SSuyog Pawar         ASSERT(ps_entropy_ctxt->i1_ctb_num_pcm_blks == 0);
798*c83a76b0SSuyog Pawar         ASSERT((ps_enc_tu->s_tu.b4_pos_x << 2) == x0_ctb);
799*c83a76b0SSuyog Pawar         ASSERT((ps_enc_tu->s_tu.b4_pos_y << 2) == y0_ctb);
800*c83a76b0SSuyog Pawar         ASSERT(tu_size == (1 << log2_tr_size));
801*c83a76b0SSuyog Pawar 
802*c83a76b0SSuyog Pawar         /********************************************************************/
803*c83a76b0SSuyog Pawar         /* encode luma cbf if any of following conditions are true          */
804*c83a76b0SSuyog Pawar         /* intra cu | transform depth > 0 | any of chroma cbfs are coded    */
805*c83a76b0SSuyog Pawar         /*                                                                  */
806*c83a76b0SSuyog Pawar         /* Note that these conditions mean that cbf_luma need not be        */
807*c83a76b0SSuyog Pawar         /* signalled and implicitly derived as 1 for inter cu whose tfr size*/
808*c83a76b0SSuyog Pawar         /* is same as cu size and cbf for cb+cr are zero as no_residue_flag */
809*c83a76b0SSuyog Pawar         /* at cu level = 1 indicated cbf luma is coded                      */
810*c83a76b0SSuyog Pawar         /********************************************************************/
811*c83a76b0SSuyog Pawar         if(is_intra || (tr_depth != 0) || ai4_cbf_cb[0] || ai4_cbf_cr[0] ||
812*c83a76b0SSuyog Pawar            ((u1_is_422) && (ai4_cbf_cb[1] || ai4_cbf_cr[1])))
813*c83a76b0SSuyog Pawar         {
814*c83a76b0SSuyog Pawar             /* encode  cbf luma, context derived as per Table 9-37 */
815*c83a76b0SSuyog Pawar             cbf_luma = ps_enc_tu->s_tu.b1_y_cbf;
816*c83a76b0SSuyog Pawar 
817*c83a76b0SSuyog Pawar             ctxt_inc = IHEVC_CAB_CBF_LUMA_IDX;
818*c83a76b0SSuyog Pawar             ctxt_inc += (tr_depth == 0) ? 1 : 0;
819*c83a76b0SSuyog Pawar 
820*c83a76b0SSuyog Pawar             if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
821*c83a76b0SSuyog Pawar             {
822*c83a76b0SSuyog Pawar                 if(1 == cbf_luma)
823*c83a76b0SSuyog Pawar                 {
824*c83a76b0SSuyog Pawar                     // clang-format off
825*c83a76b0SSuyog Pawar                     /*PIC INFO: Populated coded Intra/Inter TUs in CU*/
826*c83a76b0SSuyog Pawar                     if(1 == is_intra)
827*c83a76b0SSuyog Pawar                         ps_entropy_ctxt->ps_pic_level_info->i8_total_intra_coded_tu++;
828*c83a76b0SSuyog Pawar                     else
829*c83a76b0SSuyog Pawar                         ps_entropy_ctxt->ps_pic_level_info->i8_total_inter_coded_tu++;
830*c83a76b0SSuyog Pawar                     // clang-format on
831*c83a76b0SSuyog Pawar                 }
832*c83a76b0SSuyog Pawar                 else
833*c83a76b0SSuyog Pawar                 { /*PIC INFO: Populated coded non-coded TUs in CU*/
834*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->ps_pic_level_info->i8_total_non_coded_tu++;
835*c83a76b0SSuyog Pawar                 }
836*c83a76b0SSuyog Pawar             }
837*c83a76b0SSuyog Pawar             u4_bits_estimated_prev = ps_cabac->u4_bits_estimated_q12;
838*c83a76b0SSuyog Pawar             ret |= ihevce_cabac_encode_bin(ps_cabac, cbf_luma, ctxt_inc);
839*c83a76b0SSuyog Pawar 
840*c83a76b0SSuyog Pawar             if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
841*c83a76b0SSuyog Pawar             {  // clang-format off
842*c83a76b0SSuyog Pawar                 /*PIC INFO : Populate CBF luma bits*/
843*c83a76b0SSuyog Pawar                 ps_entropy_ctxt->ps_pic_level_info->u8_bits_estimated_cbf_luma_bits +=
844*c83a76b0SSuyog Pawar                     (ps_cabac->u4_bits_estimated_q12 - u4_bits_estimated_prev);
845*c83a76b0SSuyog Pawar             }  // clang-format on
846*c83a76b0SSuyog Pawar             AEV_TRACE("cbf_luma", cbf_luma, ps_cabac->u4_range);
847*c83a76b0SSuyog Pawar         }
848*c83a76b0SSuyog Pawar         else
849*c83a76b0SSuyog Pawar         {
850*c83a76b0SSuyog Pawar             if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
851*c83a76b0SSuyog Pawar             {
852*c83a76b0SSuyog Pawar                 /*PIC INFO: Populated coded Inter TUs in CU*/
853*c83a76b0SSuyog Pawar                 ps_entropy_ctxt->ps_pic_level_info->i8_total_inter_coded_tu++;
854*c83a76b0SSuyog Pawar             }
855*c83a76b0SSuyog Pawar 
856*c83a76b0SSuyog Pawar             /* shall be 1 as no_residue_flag was encoded as 1 in inter cu */
857*c83a76b0SSuyog Pawar             ASSERT(1 == ps_enc_tu->s_tu.b1_y_cbf);
858*c83a76b0SSuyog Pawar             cbf_luma = ps_enc_tu->s_tu.b1_y_cbf;
859*c83a76b0SSuyog Pawar         }
860*c83a76b0SSuyog Pawar 
861*c83a76b0SSuyog Pawar         /*******************************************************************/
862*c83a76b0SSuyog Pawar         /* code qp delta conditionally if following conditions are true    */
863*c83a76b0SSuyog Pawar         /* any cbf coded (luma/cb/cr) and qp_delta_coded is 0 for this cu  */
864*c83a76b0SSuyog Pawar         /* see section 7.3.12 Transform unit Syntax                        */
865*c83a76b0SSuyog Pawar         /*******************************************************************/
866*c83a76b0SSuyog Pawar         {
867*c83a76b0SSuyog Pawar             WORD32 cbf_chroma = (ai4_cbf_cb[0] || ai4_cbf_cr[0]) ||
868*c83a76b0SSuyog Pawar                                 (u1_is_422 && (ai4_cbf_cb[1] || ai4_cbf_cr[1]));
869*c83a76b0SSuyog Pawar 
870*c83a76b0SSuyog Pawar             if((cbf_luma || cbf_chroma) && encode_delta_qp)
871*c83a76b0SSuyog Pawar             {
872*c83a76b0SSuyog Pawar                 WORD32 tu_qp = ps_enc_tu->s_tu.b7_qp;
873*c83a76b0SSuyog Pawar                 WORD32 qp_pred, qp_left, qp_top;
874*c83a76b0SSuyog Pawar                 WORD32 qp_delta = tu_qp - ps_entropy_ctxt->i1_cur_qp;
875*c83a76b0SSuyog Pawar                 WORD32 x_nbr_indx, y_nbr_indx;
876*c83a76b0SSuyog Pawar 
877*c83a76b0SSuyog Pawar                 /* Added code for handling the QP neighbour population depending
878*c83a76b0SSuyog Pawar                    on the diff_cu_qp_delta_depth: Lokesh  */
879*c83a76b0SSuyog Pawar                 /* minus 2 becoz the pos_x and pos_y are given in the order of
880*c83a76b0SSuyog Pawar                  * 8x8 blocks rather than pixels */
881*c83a76b0SSuyog Pawar                 WORD32 log2_min_cu_qp_delta_size =
882*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->i1_log2_ctb_size -
883*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->ps_pps->i1_diff_cu_qp_delta_depth;
884*c83a76b0SSuyog Pawar                 //WORD32 min_cu_qp_delta_size = 1 << log2_min_cu_qp_delta_size;
885*c83a76b0SSuyog Pawar 
886*c83a76b0SSuyog Pawar                 //WORD32 curr_pos_x = ps_enc_cu->b3_cu_pos_x << 3;
887*c83a76b0SSuyog Pawar                 //WORD32 curr_pos_y = ps_enc_cu->b3_cu_pos_y << 3;
888*c83a76b0SSuyog Pawar 
889*c83a76b0SSuyog Pawar                 WORD32 block_addr_align = 15 << (log2_min_cu_qp_delta_size - 3);
890*c83a76b0SSuyog Pawar 
891*c83a76b0SSuyog Pawar                 ps_entropy_ctxt->i4_qg_pos_x = ps_enc_cu->b3_cu_pos_x & block_addr_align;
892*c83a76b0SSuyog Pawar                 ps_entropy_ctxt->i4_qg_pos_y = ps_enc_cu->b3_cu_pos_y & block_addr_align;
893*c83a76b0SSuyog Pawar 
894*c83a76b0SSuyog Pawar                 x_nbr_indx = ps_entropy_ctxt->i4_qg_pos_x - 1;
895*c83a76b0SSuyog Pawar                 y_nbr_indx = ps_entropy_ctxt->i4_qg_pos_y - 1;
896*c83a76b0SSuyog Pawar 
897*c83a76b0SSuyog Pawar                 if(ps_entropy_ctxt->i4_qg_pos_x > 0)
898*c83a76b0SSuyog Pawar                 {
899*c83a76b0SSuyog Pawar                     // clang-format off
900*c83a76b0SSuyog Pawar                     qp_left =
901*c83a76b0SSuyog Pawar                         ps_entropy_ctxt->ai4_8x8_cu_qp[x_nbr_indx +
902*c83a76b0SSuyog Pawar                                             (ps_entropy_ctxt->i4_qg_pos_y * 8)];
903*c83a76b0SSuyog Pawar                     // clang-format on
904*c83a76b0SSuyog Pawar                 }
905*c83a76b0SSuyog Pawar                 if(ps_entropy_ctxt->i4_qg_pos_y > 0)
906*c83a76b0SSuyog Pawar                 {
907*c83a76b0SSuyog Pawar                     // clang-format off
908*c83a76b0SSuyog Pawar                     qp_top = ps_entropy_ctxt->ai4_8x8_cu_qp[ps_entropy_ctxt->i4_qg_pos_x +
909*c83a76b0SSuyog Pawar                                                  y_nbr_indx * 8];
910*c83a76b0SSuyog Pawar                     // clang-format on
911*c83a76b0SSuyog Pawar                 }
912*c83a76b0SSuyog Pawar                 if(ps_entropy_ctxt->i4_qg_pos_x == 0)
913*c83a76b0SSuyog Pawar                 {
914*c83a76b0SSuyog Pawar                     /*previous coded Qp*/
915*c83a76b0SSuyog Pawar                     qp_left = ps_entropy_ctxt->i1_cur_qp;
916*c83a76b0SSuyog Pawar                 }
917*c83a76b0SSuyog Pawar                 if(ps_entropy_ctxt->i4_qg_pos_y == 0)
918*c83a76b0SSuyog Pawar                 {
919*c83a76b0SSuyog Pawar                     /*previous coded Qp*/
920*c83a76b0SSuyog Pawar                     qp_top = ps_entropy_ctxt->i1_cur_qp;
921*c83a76b0SSuyog Pawar                 }
922*c83a76b0SSuyog Pawar 
923*c83a76b0SSuyog Pawar                 qp_pred = (qp_left + qp_top + 1) >> 1;
924*c83a76b0SSuyog Pawar                 // clang-format off
925*c83a76b0SSuyog Pawar                 /* start of every frame encode qp delta wrt slice qp when entrop
926*c83a76b0SSuyog Pawar                  * sync is enabled */
927*c83a76b0SSuyog Pawar                 if(ps_entropy_ctxt->i4_ctb_x == 0 &&
928*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->i4_qg_pos_x == 0 &&
929*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->i4_qg_pos_y == 0 &&
930*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->s_cabac_ctxt.i1_entropy_coding_sync_enabled_flag)
931*c83a76b0SSuyog Pawar                 // clang-format on
932*c83a76b0SSuyog Pawar                 {
933*c83a76b0SSuyog Pawar                     qp_pred = ps_entropy_ctxt->ps_slice_hdr->i1_slice_qp_delta +
934*c83a76b0SSuyog Pawar                               ps_entropy_ctxt->ps_pps->i1_pic_init_qp;
935*c83a76b0SSuyog Pawar                 }
936*c83a76b0SSuyog Pawar                 qp_delta = tu_qp - qp_pred;
937*c83a76b0SSuyog Pawar 
938*c83a76b0SSuyog Pawar                 /*PIC INFO : Populate QP delta bits*/
939*c83a76b0SSuyog Pawar                 u4_bits_estimated_prev = ps_cabac->u4_bits_estimated_q12;
940*c83a76b0SSuyog Pawar 
941*c83a76b0SSuyog Pawar                 /* code the qp delta */
942*c83a76b0SSuyog Pawar                 ret |= ihevce_cabac_encode_qp_delta(ps_cabac, qp_delta);
943*c83a76b0SSuyog Pawar 
944*c83a76b0SSuyog Pawar                 if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
945*c83a76b0SSuyog Pawar                 {
946*c83a76b0SSuyog Pawar                     // clang-format off
947*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->ps_pic_level_info->u8_bits_estimated_qp_delta_bits +=
948*c83a76b0SSuyog Pawar                         (ps_cabac->u4_bits_estimated_q12 -
949*c83a76b0SSuyog Pawar                             u4_bits_estimated_prev);
950*c83a76b0SSuyog Pawar                     // clang-format on
951*c83a76b0SSuyog Pawar                 }
952*c83a76b0SSuyog Pawar 
953*c83a76b0SSuyog Pawar                 ps_entropy_ctxt->i1_cur_qp = tu_qp;
954*c83a76b0SSuyog Pawar                 //ps_entropy_ctxt->i1_cur_qp = Qp_pred;
955*c83a76b0SSuyog Pawar                 ps_entropy_ctxt->i1_encode_qp_delta = 0;
956*c83a76b0SSuyog Pawar                 //ps_entropy_ctxt->i4_is_cu_cbf_zero = 0;
957*c83a76b0SSuyog Pawar             }
958*c83a76b0SSuyog Pawar 
959*c83a76b0SSuyog Pawar             if(cbf_luma || cbf_chroma)
960*c83a76b0SSuyog Pawar             {
961*c83a76b0SSuyog Pawar                 ps_entropy_ctxt->i4_is_cu_cbf_zero = 0;
962*c83a76b0SSuyog Pawar             }
963*c83a76b0SSuyog Pawar 
964*c83a76b0SSuyog Pawar             /* code the residue of for luma and chroma tu based on cbf */
965*c83a76b0SSuyog Pawar             if((cbf_luma) && (1 == ps_entropy_ctxt->i4_enable_res_encode))
966*c83a76b0SSuyog Pawar             {
967*c83a76b0SSuyog Pawar                 u4_bits_estimated_prev = ps_entropy_ctxt->s_cabac_ctxt.u4_bits_estimated_q12;
968*c83a76b0SSuyog Pawar                 /* code the luma residue */
969*c83a76b0SSuyog Pawar                 pv_coeff = (void *)((UWORD8 *)pv_cu_coeff + ps_enc_tu->i4_luma_coeff_offset);
970*c83a76b0SSuyog Pawar 
971*c83a76b0SSuyog Pawar                 ret |= ihevce_cabac_residue_encode(ps_entropy_ctxt, pv_coeff, log2_tr_size, 1);
972*c83a76b0SSuyog Pawar 
973*c83a76b0SSuyog Pawar                 if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
974*c83a76b0SSuyog Pawar                 {  // clang-format off
975*c83a76b0SSuyog Pawar                     /*PIC INFO : Populate Residue Luma Bits*/
976*c83a76b0SSuyog Pawar                     ps_entropy_ctxt->ps_pic_level_info->u8_bits_estimated_res_luma_bits +=
977*c83a76b0SSuyog Pawar                         (ps_entropy_ctxt->s_cabac_ctxt.u4_bits_estimated_q12 -
978*c83a76b0SSuyog Pawar                             u4_bits_estimated_prev);
979*c83a76b0SSuyog Pawar                 }  // clang-format on
980*c83a76b0SSuyog Pawar             }
981*c83a76b0SSuyog Pawar 
982*c83a76b0SSuyog Pawar             /* code chroma residue based on tranform size                  */
983*c83a76b0SSuyog Pawar             /* For Inta 4x4 pu chroma is coded after all 4 luma blks coded */
984*c83a76b0SSuyog Pawar             /* Note: chroma not encoded in rdopt mode                      */
985*c83a76b0SSuyog Pawar             if(((log2_tr_size > 2) || (3 == blk_num)) /* &&
986*c83a76b0SSuyog Pawar                 (CABAC_MODE_ENCODE_BITS == ps_cabac->e_cabac_op_mode) */
987*c83a76b0SSuyog Pawar             )
988*c83a76b0SSuyog Pawar             {
989*c83a76b0SSuyog Pawar                 WORD32 log2_chroma_tr_size;
990*c83a76b0SSuyog Pawar                 WORD32 i4_subtu_idx;
991*c83a76b0SSuyog Pawar                 void *pv_coeff_cb, *pv_coeff_cr;
992*c83a76b0SSuyog Pawar 
993*c83a76b0SSuyog Pawar                 WORD32 i4_num_subtus = u1_is_422 + 1;
994*c83a76b0SSuyog Pawar 
995*c83a76b0SSuyog Pawar                 if(1 == ps_entropy_ctxt->i4_enable_res_encode)
996*c83a76b0SSuyog Pawar                 {
997*c83a76b0SSuyog Pawar                     for(i4_subtu_idx = 0; i4_subtu_idx < i4_num_subtus; i4_subtu_idx++)
998*c83a76b0SSuyog Pawar                     {
999*c83a76b0SSuyog Pawar                         if(ai4_cbf_cb[i4_subtu_idx])
1000*c83a76b0SSuyog Pawar                         {
1001*c83a76b0SSuyog Pawar                             /* initailize chroma transform size and coeff based
1002*c83a76b0SSuyog Pawar                              * on luma size */
1003*c83a76b0SSuyog Pawar                             if(2 == log2_tr_size)
1004*c83a76b0SSuyog Pawar                             {
1005*c83a76b0SSuyog Pawar                                 /*********************************************************/
1006*c83a76b0SSuyog Pawar                                 /* For Intra 4x4, chroma transform size is 4 and chroma  */
1007*c83a76b0SSuyog Pawar                                 /* coeff offset is present  in the first Luma block      */
1008*c83a76b0SSuyog Pawar                                 /*********************************************************/
1009*c83a76b0SSuyog Pawar                                 log2_chroma_tr_size = 2;
1010*c83a76b0SSuyog Pawar 
1011*c83a76b0SSuyog Pawar                                 /* -3 is for going to first luma tu of the 4 TUs in min CU */
1012*c83a76b0SSuyog Pawar                                 pv_coeff_cb =
1013*c83a76b0SSuyog Pawar                                     (void
1014*c83a76b0SSuyog Pawar                                          *)((UWORD8 *)pv_cu_coeff + ps_enc_tu[-3].ai4_cb_coeff_offset[i4_subtu_idx]);
1015*c83a76b0SSuyog Pawar                             }
1016*c83a76b0SSuyog Pawar                             else
1017*c83a76b0SSuyog Pawar                             {
1018*c83a76b0SSuyog Pawar                                 log2_chroma_tr_size = (log2_tr_size - 1);
1019*c83a76b0SSuyog Pawar 
1020*c83a76b0SSuyog Pawar                                 pv_coeff_cb =
1021*c83a76b0SSuyog Pawar                                     (void
1022*c83a76b0SSuyog Pawar                                          *)((UWORD8 *)pv_cu_coeff + ps_enc_tu->ai4_cb_coeff_offset[i4_subtu_idx]);
1023*c83a76b0SSuyog Pawar                             }
1024*c83a76b0SSuyog Pawar                             // clang-format off
1025*c83a76b0SSuyog Pawar                             u4_bits_estimated_prev =
1026*c83a76b0SSuyog Pawar                                 ps_entropy_ctxt->s_cabac_ctxt.u4_bits_estimated_q12;
1027*c83a76b0SSuyog Pawar                             // clang-format on
1028*c83a76b0SSuyog Pawar                             /* code the cb residue */
1029*c83a76b0SSuyog Pawar                             ret |= ihevce_cabac_residue_encode(
1030*c83a76b0SSuyog Pawar                                 ps_entropy_ctxt, pv_coeff_cb, log2_chroma_tr_size, 0);
1031*c83a76b0SSuyog Pawar 
1032*c83a76b0SSuyog Pawar                             if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
1033*c83a76b0SSuyog Pawar                             {  // clang-format off
1034*c83a76b0SSuyog Pawar                                 /*PIC INFO : Populate Residue Chroma cr Bits*/
1035*c83a76b0SSuyog Pawar                                 ps_entropy_ctxt->ps_pic_level_info->u8_bits_estimated_res_chroma_bits +=
1036*c83a76b0SSuyog Pawar                                     (ps_entropy_ctxt->s_cabac_ctxt.u4_bits_estimated_q12 -
1037*c83a76b0SSuyog Pawar                                         u4_bits_estimated_prev);
1038*c83a76b0SSuyog Pawar                             }  // clang-format on
1039*c83a76b0SSuyog Pawar                         }
1040*c83a76b0SSuyog Pawar                     }
1041*c83a76b0SSuyog Pawar                 }
1042*c83a76b0SSuyog Pawar 
1043*c83a76b0SSuyog Pawar                 if(1 == ps_entropy_ctxt->i4_enable_res_encode)
1044*c83a76b0SSuyog Pawar                 {
1045*c83a76b0SSuyog Pawar                     for(i4_subtu_idx = 0; i4_subtu_idx < i4_num_subtus; i4_subtu_idx++)
1046*c83a76b0SSuyog Pawar                     {
1047*c83a76b0SSuyog Pawar                         if(ai4_cbf_cr[i4_subtu_idx])
1048*c83a76b0SSuyog Pawar                         {
1049*c83a76b0SSuyog Pawar                             /* initailize chroma transform size and coeff based on luma size */
1050*c83a76b0SSuyog Pawar                             if(2 == log2_tr_size)
1051*c83a76b0SSuyog Pawar                             {
1052*c83a76b0SSuyog Pawar                                 /*********************************************************/
1053*c83a76b0SSuyog Pawar                                 /* For Intra 4x4, chroma transform size is 4 and chroma  */
1054*c83a76b0SSuyog Pawar                                 /* coeff offset is present  in the first Luma block      */
1055*c83a76b0SSuyog Pawar                                 /*********************************************************/
1056*c83a76b0SSuyog Pawar                                 log2_chroma_tr_size = 2;
1057*c83a76b0SSuyog Pawar 
1058*c83a76b0SSuyog Pawar                                 pv_coeff_cr =
1059*c83a76b0SSuyog Pawar                                     (void
1060*c83a76b0SSuyog Pawar                                          *)((UWORD8 *)pv_cu_coeff + ps_enc_tu[-3].ai4_cr_coeff_offset[i4_subtu_idx]);
1061*c83a76b0SSuyog Pawar                             }
1062*c83a76b0SSuyog Pawar                             else
1063*c83a76b0SSuyog Pawar                             {
1064*c83a76b0SSuyog Pawar                                 log2_chroma_tr_size = (log2_tr_size - 1);
1065*c83a76b0SSuyog Pawar 
1066*c83a76b0SSuyog Pawar                                 pv_coeff_cr =
1067*c83a76b0SSuyog Pawar                                     (void
1068*c83a76b0SSuyog Pawar                                          *)((UWORD8 *)pv_cu_coeff + ps_enc_tu->ai4_cr_coeff_offset[i4_subtu_idx]);
1069*c83a76b0SSuyog Pawar                             }
1070*c83a76b0SSuyog Pawar                             // clang-format off
1071*c83a76b0SSuyog Pawar                             u4_bits_estimated_prev =
1072*c83a76b0SSuyog Pawar                                 ps_entropy_ctxt->s_cabac_ctxt.u4_bits_estimated_q12;
1073*c83a76b0SSuyog Pawar                             // clang-format on
1074*c83a76b0SSuyog Pawar                             /* code the cb residue */
1075*c83a76b0SSuyog Pawar                             ret |= ihevce_cabac_residue_encode(
1076*c83a76b0SSuyog Pawar                                 ps_entropy_ctxt, pv_coeff_cr, log2_chroma_tr_size, 0);
1077*c83a76b0SSuyog Pawar                             if(ps_cabac->e_cabac_op_mode == CABAC_MODE_ENCODE_BITS)
1078*c83a76b0SSuyog Pawar                             {  // clang-format off
1079*c83a76b0SSuyog Pawar                                 /*PIC INFO : Populate Residue Chroma cr Bits*/
1080*c83a76b0SSuyog Pawar                                 ps_entropy_ctxt->ps_pic_level_info->u8_bits_estimated_res_chroma_bits +=
1081*c83a76b0SSuyog Pawar                                     (ps_entropy_ctxt->s_cabac_ctxt.u4_bits_estimated_q12 -
1082*c83a76b0SSuyog Pawar                                         u4_bits_estimated_prev);
1083*c83a76b0SSuyog Pawar                             }  // clang-format on
1084*c83a76b0SSuyog Pawar                         }
1085*c83a76b0SSuyog Pawar                     }
1086*c83a76b0SSuyog Pawar                 }
1087*c83a76b0SSuyog Pawar             }
1088*c83a76b0SSuyog Pawar         }
1089*c83a76b0SSuyog Pawar 
1090*c83a76b0SSuyog Pawar         /* update tu_idx after encoding current tu */
1091*c83a76b0SSuyog Pawar         ps_entropy_ctxt->i4_tu_idx++;
1092*c83a76b0SSuyog Pawar     }
1093*c83a76b0SSuyog Pawar 
1094*c83a76b0SSuyog Pawar     return ret;
1095*c83a76b0SSuyog Pawar }
1096*c83a76b0SSuyog Pawar 
1097*c83a76b0SSuyog Pawar /**
1098*c83a76b0SSuyog Pawar ******************************************************************************
1099*c83a76b0SSuyog Pawar *
1100*c83a76b0SSuyog Pawar *  @brief Encodes a transform residual block as per section 7.3.13
1101*c83a76b0SSuyog Pawar *
1102*c83a76b0SSuyog Pawar *  @par   Description
1103*c83a76b0SSuyog Pawar *   The residual block is read from a compressed coeff buffer populated during
1104*c83a76b0SSuyog Pawar *   the scanning of the quantized coeffs. The contents of the buffer are
1105*c83a76b0SSuyog Pawar *   breifly explained in param description of pv_coeff
1106*c83a76b0SSuyog Pawar *
1107*c83a76b0SSuyog Pawar *  @remarks Does not support sign data hiding and transform skip flag currently
1108*c83a76b0SSuyog Pawar *
1109*c83a76b0SSuyog Pawar *  @remarks Need to resolve the differences between JVT-J1003_d7 spec and
1110*c83a76b0SSuyog Pawar *           HM.8.0-dev for related abs_greater_than_1 context initialization
1111*c83a76b0SSuyog Pawar *           and rice_max paramtere used for coeff abs level remaining
1112*c83a76b0SSuyog Pawar *
1113*c83a76b0SSuyog Pawar *  @param[inout]   ps_entropy_ctxt
1114*c83a76b0SSuyog Pawar *  pointer to entropy context (handle)
1115*c83a76b0SSuyog Pawar *
1116*c83a76b0SSuyog Pawar *  @param[in]      pv_coeff
1117*c83a76b0SSuyog Pawar *  Compressed residue buffer containing following information:
1118*c83a76b0SSuyog Pawar *
1119*c83a76b0SSuyog Pawar *  HEADER(4 bytes) : last_coeff_x, last_coeff_y, scantype, last_subblock_num
1120*c83a76b0SSuyog Pawar *
1121*c83a76b0SSuyog Pawar *  For each 4x4 subblock starting from last_subblock_num (in scan order)
1122*c83a76b0SSuyog Pawar *     Read 2 bytes  : MSB 12bits (0xBAD marker), bit0 cur_csbf, bit1-2 nbr csbf
1123*c83a76b0SSuyog Pawar *
1124*c83a76b0SSuyog Pawar *    `If cur_csbf
1125*c83a76b0SSuyog Pawar *      Read 2 bytes : sig_coeff_map (16bits in scan_order 1:coded, 0:not coded)
1126*c83a76b0SSuyog Pawar *      Read 2 bytes : abs_gt1_flags (max of 8 only)
1127*c83a76b0SSuyog Pawar *      Read 2 bytes : coeff_sign_flags
1128*c83a76b0SSuyog Pawar *
1129*c83a76b0SSuyog Pawar *      Based on abs_gt1_flags and sig_coeff_map read remaining abs levels
1130*c83a76b0SSuyog Pawar *      Read 2 bytes : remaining_abs_coeffs_minus1 (this is in a loop)
1131*c83a76b0SSuyog Pawar *
1132*c83a76b0SSuyog Pawar *  @param[in]      log2_tr_size
1133*c83a76b0SSuyog Pawar *  transform size of the current TU
1134*c83a76b0SSuyog Pawar *
1135*c83a76b0SSuyog Pawar *  @param[in]      is_luma
1136*c83a76b0SSuyog Pawar *  boolean indicating if the texture type is luma / chroma
1137*c83a76b0SSuyog Pawar *
1138*c83a76b0SSuyog Pawar *
1139*c83a76b0SSuyog Pawar *  @return      success or failure error code
1140*c83a76b0SSuyog Pawar *
1141*c83a76b0SSuyog Pawar ******************************************************************************
1142*c83a76b0SSuyog Pawar */
ihevce_cabac_residue_encode(entropy_context_t * ps_entropy_ctxt,void * pv_coeff,WORD32 log2_tr_size,WORD32 is_luma)1143*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_residue_encode(
1144*c83a76b0SSuyog Pawar     entropy_context_t *ps_entropy_ctxt, void *pv_coeff, WORD32 log2_tr_size, WORD32 is_luma)
1145*c83a76b0SSuyog Pawar {
1146*c83a76b0SSuyog Pawar     WORD32 ret = IHEVCE_SUCCESS;
1147*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_entropy_ctxt->s_cabac_ctxt;
1148*c83a76b0SSuyog Pawar     WORD32 i4_sign_data_hiding_flag, cu_tq_bypass_flag;
1149*c83a76b0SSuyog Pawar 
1150*c83a76b0SSuyog Pawar     UWORD8 *pu1_coeff_buf_hdr = (UWORD8 *)pv_coeff;
1151*c83a76b0SSuyog Pawar     UWORD16 *pu2_sig_coeff_buf = (UWORD16 *)pv_coeff;
1152*c83a76b0SSuyog Pawar 
1153*c83a76b0SSuyog Pawar     /* last sig coeff indices in scan order */
1154*c83a76b0SSuyog Pawar     WORD32 last_sig_coeff_x = pu1_coeff_buf_hdr[0];
1155*c83a76b0SSuyog Pawar     WORD32 last_sig_coeff_y = pu1_coeff_buf_hdr[1];
1156*c83a76b0SSuyog Pawar 
1157*c83a76b0SSuyog Pawar     /* read the scan type : upright diag / horz / vert */
1158*c83a76b0SSuyog Pawar     WORD32 scan_type = pu1_coeff_buf_hdr[2];
1159*c83a76b0SSuyog Pawar 
1160*c83a76b0SSuyog Pawar     /************************************************************************/
1161*c83a76b0SSuyog Pawar     /* position of the last coded sub block. This sub block contains coeff  */
1162*c83a76b0SSuyog Pawar     /* corresponding to last_sig_coeff_x, last_sig_coeff_y. Althoug this can*/
1163*c83a76b0SSuyog Pawar     /* be derived here it better to be populated by scanning module         */
1164*c83a76b0SSuyog Pawar     /************************************************************************/
1165*c83a76b0SSuyog Pawar     WORD32 last_csb = pu1_coeff_buf_hdr[3];
1166*c83a76b0SSuyog Pawar 
1167*c83a76b0SSuyog Pawar     WORD32 cur_csbf = 0, nbr_csbf;
1168*c83a76b0SSuyog Pawar     WORD32 sig_coeff_base_ctxt; /* cabac context for sig coeff flag    */
1169*c83a76b0SSuyog Pawar     WORD32 abs_gt1_base_ctxt; /* cabac context for abslevel > 1 flag */
1170*c83a76b0SSuyog Pawar 
1171*c83a76b0SSuyog Pawar     WORD32 gt1_ctxt = 1; /* required for abs_gt1_ctxt modelling */
1172*c83a76b0SSuyog Pawar 
1173*c83a76b0SSuyog Pawar     WORD32 i;
1174*c83a76b0SSuyog Pawar 
1175*c83a76b0SSuyog Pawar     /* sanity checks */
1176*c83a76b0SSuyog Pawar     /* transform skip not supported */
1177*c83a76b0SSuyog Pawar     ASSERT(0 == ps_entropy_ctxt->ps_pps->i1_transform_skip_enabled_flag);
1178*c83a76b0SSuyog Pawar 
1179*c83a76b0SSuyog Pawar     cu_tq_bypass_flag = ps_entropy_ctxt->ps_pps->i1_transform_skip_enabled_flag;
1180*c83a76b0SSuyog Pawar 
1181*c83a76b0SSuyog Pawar     i4_sign_data_hiding_flag = ps_entropy_ctxt->ps_pps->i1_sign_data_hiding_flag;
1182*c83a76b0SSuyog Pawar 
1183*c83a76b0SSuyog Pawar     if(SCAN_VERT == scan_type)
1184*c83a76b0SSuyog Pawar     {
1185*c83a76b0SSuyog Pawar         /* last coeff x and y are swapped for vertical scan */
1186*c83a76b0SSuyog Pawar         SWAP(last_sig_coeff_x, last_sig_coeff_y);
1187*c83a76b0SSuyog Pawar     }
1188*c83a76b0SSuyog Pawar 
1189*c83a76b0SSuyog Pawar     /* Encode the last_sig_coeff_x and last_sig_coeff_y */
1190*c83a76b0SSuyog Pawar     ret |= ihevce_cabac_encode_last_coeff_x_y(
1191*c83a76b0SSuyog Pawar         ps_cabac, last_sig_coeff_x, last_sig_coeff_y, log2_tr_size, is_luma);
1192*c83a76b0SSuyog Pawar 
1193*c83a76b0SSuyog Pawar     /*************************************************************************/
1194*c83a76b0SSuyog Pawar     /* derive base context index for sig coeff as per section 9.3.3.1.4      */
1195*c83a76b0SSuyog Pawar     /* TODO; convert to look up based on luma/chroma, scan type and tfr size */
1196*c83a76b0SSuyog Pawar     /*************************************************************************/
1197*c83a76b0SSuyog Pawar     if(is_luma)
1198*c83a76b0SSuyog Pawar     {
1199*c83a76b0SSuyog Pawar         sig_coeff_base_ctxt = IHEVC_CAB_COEFF_FLAG;
1200*c83a76b0SSuyog Pawar         abs_gt1_base_ctxt = IHEVC_CAB_COEFABS_GRTR1_FLAG;
1201*c83a76b0SSuyog Pawar 
1202*c83a76b0SSuyog Pawar         if(3 == log2_tr_size)
1203*c83a76b0SSuyog Pawar         {
1204*c83a76b0SSuyog Pawar             /* 8x8 transform size */
1205*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += (scan_type == SCAN_DIAG_UPRIGHT) ? 9 : 15;
1206*c83a76b0SSuyog Pawar         }
1207*c83a76b0SSuyog Pawar         else if(3 < log2_tr_size)
1208*c83a76b0SSuyog Pawar         {
1209*c83a76b0SSuyog Pawar             /* larger transform sizes */
1210*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 21;
1211*c83a76b0SSuyog Pawar         }
1212*c83a76b0SSuyog Pawar     }
1213*c83a76b0SSuyog Pawar     else
1214*c83a76b0SSuyog Pawar     {
1215*c83a76b0SSuyog Pawar         /* chroma context initializations */
1216*c83a76b0SSuyog Pawar         sig_coeff_base_ctxt = IHEVC_CAB_COEFF_FLAG + 27;
1217*c83a76b0SSuyog Pawar         abs_gt1_base_ctxt = IHEVC_CAB_COEFABS_GRTR1_FLAG + 16;
1218*c83a76b0SSuyog Pawar 
1219*c83a76b0SSuyog Pawar         if(3 == log2_tr_size)
1220*c83a76b0SSuyog Pawar         {
1221*c83a76b0SSuyog Pawar             /* 8x8 transform size */
1222*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 9;
1223*c83a76b0SSuyog Pawar         }
1224*c83a76b0SSuyog Pawar         else if(3 < log2_tr_size)
1225*c83a76b0SSuyog Pawar         {
1226*c83a76b0SSuyog Pawar             /* larger transform sizes */
1227*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 12;
1228*c83a76b0SSuyog Pawar         }
1229*c83a76b0SSuyog Pawar     }
1230*c83a76b0SSuyog Pawar 
1231*c83a76b0SSuyog Pawar     /* go to csbf flags */
1232*c83a76b0SSuyog Pawar     pu2_sig_coeff_buf = (UWORD16 *)(pu1_coeff_buf_hdr + COEFF_BUF_HEADER_LEN);
1233*c83a76b0SSuyog Pawar 
1234*c83a76b0SSuyog Pawar     /************************************************************************/
1235*c83a76b0SSuyog Pawar     /* encode the csbf, sig_coeff_map, abs_grt1_flags, abs_grt2_flag, sign  */
1236*c83a76b0SSuyog Pawar     /* and abs_coeff_remaining for each 4x4 starting from last scan to first*/
1237*c83a76b0SSuyog Pawar     /************************************************************************/
1238*c83a76b0SSuyog Pawar     for(i = last_csb; i >= 0; i--)
1239*c83a76b0SSuyog Pawar     {
1240*c83a76b0SSuyog Pawar         UWORD16 u2_marker_csbf;
1241*c83a76b0SSuyog Pawar         WORD32 ctxt_idx;
1242*c83a76b0SSuyog Pawar 
1243*c83a76b0SSuyog Pawar         u2_marker_csbf = *pu2_sig_coeff_buf;
1244*c83a76b0SSuyog Pawar         pu2_sig_coeff_buf++;
1245*c83a76b0SSuyog Pawar 
1246*c83a76b0SSuyog Pawar         /* sanity checks for marker present in every csbf flag */
1247*c83a76b0SSuyog Pawar         ASSERT((u2_marker_csbf >> 4) == 0xBAD);
1248*c83a76b0SSuyog Pawar 
1249*c83a76b0SSuyog Pawar         /* extract the current and neigbour csbf flags */
1250*c83a76b0SSuyog Pawar         cur_csbf = u2_marker_csbf & 0x1;
1251*c83a76b0SSuyog Pawar         nbr_csbf = (u2_marker_csbf >> 1) & 0x3;
1252*c83a76b0SSuyog Pawar 
1253*c83a76b0SSuyog Pawar         /*********************************************************************/
1254*c83a76b0SSuyog Pawar         /* code the csbf flags; last and first csb not sent as it is derived */
1255*c83a76b0SSuyog Pawar         /*********************************************************************/
1256*c83a76b0SSuyog Pawar         if((i < last_csb) && (i > 0))
1257*c83a76b0SSuyog Pawar         {
1258*c83a76b0SSuyog Pawar             ctxt_idx = IHEVC_CAB_CODED_SUBLK_IDX;
1259*c83a76b0SSuyog Pawar 
1260*c83a76b0SSuyog Pawar             /* ctxt based on right / bottom avail csbf, section 9.3.3.1.3 */
1261*c83a76b0SSuyog Pawar             ctxt_idx += nbr_csbf ? 1 : 0;
1262*c83a76b0SSuyog Pawar             ctxt_idx += is_luma ? 0 : 2;
1263*c83a76b0SSuyog Pawar 
1264*c83a76b0SSuyog Pawar             ret |= ihevce_cabac_encode_bin(ps_cabac, cur_csbf, ctxt_idx);
1265*c83a76b0SSuyog Pawar             AEV_TRACE("coded_sub_block_flag", cur_csbf, ps_cabac->u4_range);
1266*c83a76b0SSuyog Pawar         }
1267*c83a76b0SSuyog Pawar         else
1268*c83a76b0SSuyog Pawar         {
1269*c83a76b0SSuyog Pawar             /* sanity check, this csb contains the last_sig_coeff */
1270*c83a76b0SSuyog Pawar             if(i == last_csb)
1271*c83a76b0SSuyog Pawar             {
1272*c83a76b0SSuyog Pawar                 ASSERT(cur_csbf == 1);
1273*c83a76b0SSuyog Pawar             }
1274*c83a76b0SSuyog Pawar         }
1275*c83a76b0SSuyog Pawar 
1276*c83a76b0SSuyog Pawar         if(cur_csbf)
1277*c83a76b0SSuyog Pawar         {
1278*c83a76b0SSuyog Pawar             /*****************************************************************/
1279*c83a76b0SSuyog Pawar             /* encode the sig coeff map as per section 7.3.13                */
1280*c83a76b0SSuyog Pawar             /* significant_coeff_flags: msb=coeff15-lsb=coeff0 in scan order */
1281*c83a76b0SSuyog Pawar             /*****************************************************************/
1282*c83a76b0SSuyog Pawar 
1283*c83a76b0SSuyog Pawar             /* Added for Sign bit data hiding*/
1284*c83a76b0SSuyog Pawar             WORD32 first_scan_pos = 16;
1285*c83a76b0SSuyog Pawar             WORD32 last_scan_pos = -1;
1286*c83a76b0SSuyog Pawar             WORD32 sign_hidden = 0;
1287*c83a76b0SSuyog Pawar 
1288*c83a76b0SSuyog Pawar             UWORD16 u2_gt0_flags = *pu2_sig_coeff_buf;
1289*c83a76b0SSuyog Pawar             WORD32 gt1_flags = *(pu2_sig_coeff_buf + 1);
1290*c83a76b0SSuyog Pawar             WORD32 sign_flags = *(pu2_sig_coeff_buf + 2);
1291*c83a76b0SSuyog Pawar 
1292*c83a76b0SSuyog Pawar             WORD32 sig_coeff_map = u2_gt0_flags;
1293*c83a76b0SSuyog Pawar 
1294*c83a76b0SSuyog Pawar             WORD32 gt1_bins = 0; /* bins for coeffs with abslevel > 1 */
1295*c83a76b0SSuyog Pawar 
1296*c83a76b0SSuyog Pawar             WORD32 sign_bins = 0; /* bins for sign flags of coded coeffs  */
1297*c83a76b0SSuyog Pawar             WORD32 num_coded = 0; /* total coeffs coded in 4x4            */
1298*c83a76b0SSuyog Pawar 
1299*c83a76b0SSuyog Pawar             WORD32 infer_coeff; /* infer when 0,0 is the only coded coeff */
1300*c83a76b0SSuyog Pawar             WORD32 bit; /* temp boolean */
1301*c83a76b0SSuyog Pawar 
1302*c83a76b0SSuyog Pawar             /* total count of coeffs to be coded as abs level remaining */
1303*c83a76b0SSuyog Pawar             WORD32 num_coeffs_remaining = 0;
1304*c83a76b0SSuyog Pawar 
1305*c83a76b0SSuyog Pawar             /* count of coeffs to be coded as  abslevel-1 */
1306*c83a76b0SSuyog Pawar             WORD32 num_coeffs_base1 = 0;
1307*c83a76b0SSuyog Pawar             WORD32 scan_pos;
1308*c83a76b0SSuyog Pawar             WORD32 first_gt1_coeff = 0;
1309*c83a76b0SSuyog Pawar 
1310*c83a76b0SSuyog Pawar             if((i != 0) || (0 == last_csb))
1311*c83a76b0SSuyog Pawar             {
1312*c83a76b0SSuyog Pawar                 /* sanity check, atleast one coeff is coded as csbf is set */
1313*c83a76b0SSuyog Pawar                 ASSERT(sig_coeff_map != 0);
1314*c83a76b0SSuyog Pawar             }
1315*c83a76b0SSuyog Pawar 
1316*c83a76b0SSuyog Pawar             pu2_sig_coeff_buf += 3;
1317*c83a76b0SSuyog Pawar 
1318*c83a76b0SSuyog Pawar             scan_pos = 15;
1319*c83a76b0SSuyog Pawar             if(i == last_csb)
1320*c83a76b0SSuyog Pawar             {
1321*c83a76b0SSuyog Pawar                 /*************************************************************/
1322*c83a76b0SSuyog Pawar                 /* clear last_scan_pos for last block in scan order as this  */
1323*c83a76b0SSuyog Pawar                 /* is communicated  throught last_coeff_x and last_coeff_y   */
1324*c83a76b0SSuyog Pawar                 /*************************************************************/
1325*c83a76b0SSuyog Pawar                 WORD32 next_sig = CLZ(sig_coeff_map) + 1;
1326*c83a76b0SSuyog Pawar 
1327*c83a76b0SSuyog Pawar                 scan_pos = WORD_SIZE - next_sig;
1328*c83a76b0SSuyog Pawar 
1329*c83a76b0SSuyog Pawar                 /* prepare the bins for gt1 flags */
1330*c83a76b0SSuyog Pawar                 EXTRACT_BIT(bit, gt1_flags, scan_pos);
1331*c83a76b0SSuyog Pawar 
1332*c83a76b0SSuyog Pawar                 /* insert gt1 bin in lsb */
1333*c83a76b0SSuyog Pawar                 gt1_bins |= bit;
1334*c83a76b0SSuyog Pawar 
1335*c83a76b0SSuyog Pawar                 /* prepare the bins for sign flags */
1336*c83a76b0SSuyog Pawar                 EXTRACT_BIT(bit, sign_flags, scan_pos);
1337*c83a76b0SSuyog Pawar 
1338*c83a76b0SSuyog Pawar                 /* insert sign bin in lsb */
1339*c83a76b0SSuyog Pawar                 sign_bins |= bit;
1340*c83a76b0SSuyog Pawar 
1341*c83a76b0SSuyog Pawar                 sig_coeff_map = CLEAR_BIT(sig_coeff_map, scan_pos);
1342*c83a76b0SSuyog Pawar 
1343*c83a76b0SSuyog Pawar                 if(-1 == last_scan_pos)
1344*c83a76b0SSuyog Pawar                     last_scan_pos = scan_pos;
1345*c83a76b0SSuyog Pawar 
1346*c83a76b0SSuyog Pawar                 scan_pos--;
1347*c83a76b0SSuyog Pawar                 num_coded++;
1348*c83a76b0SSuyog Pawar             }
1349*c83a76b0SSuyog Pawar 
1350*c83a76b0SSuyog Pawar             /* infer 0,0 coeff for all 4x4 blocks except fitst and last */
1351*c83a76b0SSuyog Pawar             infer_coeff = (i < last_csb) && (i > 0);
1352*c83a76b0SSuyog Pawar 
1353*c83a76b0SSuyog Pawar             /* encode the required sigcoeff flags (abslevel > 0)   */
1354*c83a76b0SSuyog Pawar             while(scan_pos >= 0)
1355*c83a76b0SSuyog Pawar             {
1356*c83a76b0SSuyog Pawar                 WORD32 y_pos_x_pos;
1357*c83a76b0SSuyog Pawar                 WORD32 sig_ctxinc = 0; /* 0 is default inc for DC coeff */
1358*c83a76b0SSuyog Pawar 
1359*c83a76b0SSuyog Pawar                 WORD32 sig_coeff;
1360*c83a76b0SSuyog Pawar 
1361*c83a76b0SSuyog Pawar                 EXTRACT_BIT(sig_coeff, sig_coeff_map, scan_pos);
1362*c83a76b0SSuyog Pawar 
1363*c83a76b0SSuyog Pawar                 /* derive the x,y pos */
1364*c83a76b0SSuyog Pawar                 y_pos_x_pos = gu1_hevce_scan4x4[scan_type][scan_pos];
1365*c83a76b0SSuyog Pawar 
1366*c83a76b0SSuyog Pawar                 /* derive the context inc as per section 9.3.3.1.4 */
1367*c83a76b0SSuyog Pawar                 if(2 == log2_tr_size)
1368*c83a76b0SSuyog Pawar                 {
1369*c83a76b0SSuyog Pawar                     /* 4x4 transform size increment uses lookup */
1370*c83a76b0SSuyog Pawar                     sig_ctxinc = gu1_hevce_sigcoeff_ctxtinc_tr4[y_pos_x_pos];
1371*c83a76b0SSuyog Pawar                 }
1372*c83a76b0SSuyog Pawar                 else if(scan_pos || i)
1373*c83a76b0SSuyog Pawar                 {
1374*c83a76b0SSuyog Pawar                     /* ctxt for AC coeff depends on curpos and neigbour csbf */
1375*c83a76b0SSuyog Pawar                     sig_ctxinc = gu1_hevce_sigcoeff_ctxtinc[nbr_csbf][y_pos_x_pos];
1376*c83a76b0SSuyog Pawar 
1377*c83a76b0SSuyog Pawar                     /* based on luma subblock pos */
1378*c83a76b0SSuyog Pawar                     sig_ctxinc += (i && is_luma) ? 3 : 0;
1379*c83a76b0SSuyog Pawar                 }
1380*c83a76b0SSuyog Pawar                 else
1381*c83a76b0SSuyog Pawar                 {
1382*c83a76b0SSuyog Pawar                     /* DC coeff has fixed context for luma and chroma */
1383*c83a76b0SSuyog Pawar                     sig_coeff_base_ctxt = is_luma ? IHEVC_CAB_COEFF_FLAG
1384*c83a76b0SSuyog Pawar                                                   : IHEVC_CAB_COEFF_FLAG + 27;
1385*c83a76b0SSuyog Pawar                 }
1386*c83a76b0SSuyog Pawar 
1387*c83a76b0SSuyog Pawar                 /*************************************************************/
1388*c83a76b0SSuyog Pawar                 /* encode sig coeff only if required                         */
1389*c83a76b0SSuyog Pawar                 /* decoder infers 0,0 coeff when all the other coeffs are 0  */
1390*c83a76b0SSuyog Pawar                 /*************************************************************/
1391*c83a76b0SSuyog Pawar                 if(scan_pos || (!infer_coeff))
1392*c83a76b0SSuyog Pawar                 {
1393*c83a76b0SSuyog Pawar                     ctxt_idx = sig_ctxinc + sig_coeff_base_ctxt;
1394*c83a76b0SSuyog Pawar                     ret |= ihevce_cabac_encode_bin(ps_cabac, sig_coeff, ctxt_idx);
1395*c83a76b0SSuyog Pawar                     AEV_TRACE("significant_coeff_flag", sig_coeff, ps_cabac->u4_range);
1396*c83a76b0SSuyog Pawar                 }
1397*c83a76b0SSuyog Pawar 
1398*c83a76b0SSuyog Pawar                 if(sig_coeff)
1399*c83a76b0SSuyog Pawar                 {
1400*c83a76b0SSuyog Pawar                     /* prepare the bins for gt1 flags */
1401*c83a76b0SSuyog Pawar                     EXTRACT_BIT(bit, gt1_flags, scan_pos);
1402*c83a76b0SSuyog Pawar 
1403*c83a76b0SSuyog Pawar                     /* shift and insert gt1 bin in lsb */
1404*c83a76b0SSuyog Pawar                     gt1_bins <<= 1;
1405*c83a76b0SSuyog Pawar                     gt1_bins |= bit;
1406*c83a76b0SSuyog Pawar 
1407*c83a76b0SSuyog Pawar                     /* prepare the bins for sign flags */
1408*c83a76b0SSuyog Pawar                     EXTRACT_BIT(bit, sign_flags, scan_pos);
1409*c83a76b0SSuyog Pawar 
1410*c83a76b0SSuyog Pawar                     /* shift and insert sign bin in lsb */
1411*c83a76b0SSuyog Pawar                     sign_bins <<= 1;
1412*c83a76b0SSuyog Pawar                     sign_bins |= bit;
1413*c83a76b0SSuyog Pawar 
1414*c83a76b0SSuyog Pawar                     num_coded++;
1415*c83a76b0SSuyog Pawar 
1416*c83a76b0SSuyog Pawar                     /* 0,0 coeff can no more be inferred :( */
1417*c83a76b0SSuyog Pawar                     infer_coeff = 0;
1418*c83a76b0SSuyog Pawar 
1419*c83a76b0SSuyog Pawar                     if(-1 == last_scan_pos)
1420*c83a76b0SSuyog Pawar                         last_scan_pos = scan_pos;
1421*c83a76b0SSuyog Pawar 
1422*c83a76b0SSuyog Pawar                     first_scan_pos = scan_pos;
1423*c83a76b0SSuyog Pawar                 }
1424*c83a76b0SSuyog Pawar 
1425*c83a76b0SSuyog Pawar                 scan_pos--;
1426*c83a76b0SSuyog Pawar             }
1427*c83a76b0SSuyog Pawar 
1428*c83a76b0SSuyog Pawar             /* Added for sign bit hiding*/
1429*c83a76b0SSuyog Pawar             sign_hidden = ((last_scan_pos - first_scan_pos) > 3 && !cu_tq_bypass_flag);
1430*c83a76b0SSuyog Pawar 
1431*c83a76b0SSuyog Pawar             /****************************************************************/
1432*c83a76b0SSuyog Pawar             /* encode the abs level greater than 1 bins; Section 7.3.13     */
1433*c83a76b0SSuyog Pawar             /* These have already been prepared during sig_coeff_map encode */
1434*c83a76b0SSuyog Pawar             /* Context modelling done as per section 9.3.3.1.5              */
1435*c83a76b0SSuyog Pawar             /****************************************************************/
1436*c83a76b0SSuyog Pawar             {
1437*c83a76b0SSuyog Pawar                 WORD32 j;
1438*c83a76b0SSuyog Pawar 
1439*c83a76b0SSuyog Pawar                 /* context set based on luma subblock pos */
1440*c83a76b0SSuyog Pawar                 WORD32 ctxt_set = (i && is_luma) ? 2 : 0;
1441*c83a76b0SSuyog Pawar 
1442*c83a76b0SSuyog Pawar                 /* count of coeffs with abslevel > 1; max of 8 to be coded */
1443*c83a76b0SSuyog Pawar                 WORD32 num_gt1_bins = MIN(8, num_coded);
1444*c83a76b0SSuyog Pawar 
1445*c83a76b0SSuyog Pawar                 if(num_coded > 8)
1446*c83a76b0SSuyog Pawar                 {
1447*c83a76b0SSuyog Pawar                     /* pull back the bins to required number */
1448*c83a76b0SSuyog Pawar                     gt1_bins >>= (num_coded - 8);
1449*c83a76b0SSuyog Pawar 
1450*c83a76b0SSuyog Pawar                     num_coeffs_remaining += (num_coded - 8);
1451*c83a76b0SSuyog Pawar                     num_coeffs_base1 = (num_coded - 8);
1452*c83a76b0SSuyog Pawar                 }
1453*c83a76b0SSuyog Pawar 
1454*c83a76b0SSuyog Pawar                 /* See section 9.3.3.1.5           */
1455*c83a76b0SSuyog Pawar                 ctxt_set += (0 == gt1_ctxt) ? 1 : 0;
1456*c83a76b0SSuyog Pawar 
1457*c83a76b0SSuyog Pawar                 gt1_ctxt = 1;
1458*c83a76b0SSuyog Pawar 
1459*c83a76b0SSuyog Pawar                 for(j = num_gt1_bins - 1; j >= 0; j--)
1460*c83a76b0SSuyog Pawar                 {
1461*c83a76b0SSuyog Pawar                     /* Encodet the abs level gt1 bins */
1462*c83a76b0SSuyog Pawar                     ctxt_idx = (ctxt_set * 4) + abs_gt1_base_ctxt + gt1_ctxt;
1463*c83a76b0SSuyog Pawar 
1464*c83a76b0SSuyog Pawar                     EXTRACT_BIT(bit, gt1_bins, j);
1465*c83a76b0SSuyog Pawar 
1466*c83a76b0SSuyog Pawar                     ret |= ihevce_cabac_encode_bin(ps_cabac, bit, ctxt_idx);
1467*c83a76b0SSuyog Pawar 
1468*c83a76b0SSuyog Pawar                     AEV_TRACE("coeff_abs_level_greater1_flag", bit, ps_cabac->u4_range);
1469*c83a76b0SSuyog Pawar 
1470*c83a76b0SSuyog Pawar                     if(bit)
1471*c83a76b0SSuyog Pawar                     {
1472*c83a76b0SSuyog Pawar                         gt1_ctxt = 0;
1473*c83a76b0SSuyog Pawar                         num_coeffs_remaining++;
1474*c83a76b0SSuyog Pawar                     }
1475*c83a76b0SSuyog Pawar                     else if(gt1_ctxt && (gt1_ctxt < 3))
1476*c83a76b0SSuyog Pawar                     {
1477*c83a76b0SSuyog Pawar                         gt1_ctxt++;
1478*c83a76b0SSuyog Pawar                     }
1479*c83a76b0SSuyog Pawar                 }
1480*c83a76b0SSuyog Pawar 
1481*c83a76b0SSuyog Pawar                 /*************************************************************/
1482*c83a76b0SSuyog Pawar                 /* encode abs level greater than 2 bin; Section 7.3.13       */
1483*c83a76b0SSuyog Pawar                 /*************************************************************/
1484*c83a76b0SSuyog Pawar                 if(gt1_bins)
1485*c83a76b0SSuyog Pawar                 {
1486*c83a76b0SSuyog Pawar                     WORD32 gt2_bin;
1487*c83a76b0SSuyog Pawar 
1488*c83a76b0SSuyog Pawar                     first_gt1_coeff = pu2_sig_coeff_buf[0] + 1;
1489*c83a76b0SSuyog Pawar                     gt2_bin = (first_gt1_coeff > 2);
1490*c83a76b0SSuyog Pawar 
1491*c83a76b0SSuyog Pawar                     /* atleast one level > 2 */
1492*c83a76b0SSuyog Pawar                     ctxt_idx = IHEVC_CAB_COEFABS_GRTR2_FLAG;
1493*c83a76b0SSuyog Pawar 
1494*c83a76b0SSuyog Pawar                     ctxt_idx += (is_luma) ? ctxt_set : (ctxt_set + 4);
1495*c83a76b0SSuyog Pawar 
1496*c83a76b0SSuyog Pawar                     ret |= ihevce_cabac_encode_bin(ps_cabac, gt2_bin, ctxt_idx);
1497*c83a76b0SSuyog Pawar 
1498*c83a76b0SSuyog Pawar                     if(!gt2_bin)
1499*c83a76b0SSuyog Pawar                     {
1500*c83a76b0SSuyog Pawar                         /* sanity check */
1501*c83a76b0SSuyog Pawar                         ASSERT(first_gt1_coeff == 2);
1502*c83a76b0SSuyog Pawar 
1503*c83a76b0SSuyog Pawar                         /* no need to send this coeff as bypass bins */
1504*c83a76b0SSuyog Pawar                         pu2_sig_coeff_buf++;
1505*c83a76b0SSuyog Pawar                         num_coeffs_remaining--;
1506*c83a76b0SSuyog Pawar                     }
1507*c83a76b0SSuyog Pawar 
1508*c83a76b0SSuyog Pawar                     AEV_TRACE("coeff_abs_level_greater2_flag", gt2_bin, ps_cabac->u4_range);
1509*c83a76b0SSuyog Pawar                 }
1510*c83a76b0SSuyog Pawar             }
1511*c83a76b0SSuyog Pawar 
1512*c83a76b0SSuyog Pawar             /*************************************************************/
1513*c83a76b0SSuyog Pawar             /* encode the coeff signs and abs remaing levels             */
1514*c83a76b0SSuyog Pawar             /*************************************************************/
1515*c83a76b0SSuyog Pawar             if(num_coded)
1516*c83a76b0SSuyog Pawar             {
1517*c83a76b0SSuyog Pawar                 WORD32 base_level;
1518*c83a76b0SSuyog Pawar                 WORD32 rice_param = 0;
1519*c83a76b0SSuyog Pawar                 WORD32 j;
1520*c83a76b0SSuyog Pawar 
1521*c83a76b0SSuyog Pawar                 /*************************************************************/
1522*c83a76b0SSuyog Pawar                 /* encode the coeff signs populated in sign_bins             */
1523*c83a76b0SSuyog Pawar                 /*************************************************************/
1524*c83a76b0SSuyog Pawar 
1525*c83a76b0SSuyog Pawar                 if(sign_hidden && i4_sign_data_hiding_flag)
1526*c83a76b0SSuyog Pawar                 {
1527*c83a76b0SSuyog Pawar                     sign_bins >>= 1;
1528*c83a76b0SSuyog Pawar                     num_coded--;
1529*c83a76b0SSuyog Pawar                 }
1530*c83a76b0SSuyog Pawar 
1531*c83a76b0SSuyog Pawar                 if(num_coded > 0)
1532*c83a76b0SSuyog Pawar                 {
1533*c83a76b0SSuyog Pawar                     ret |= ihevce_cabac_encode_bypass_bins(ps_cabac, sign_bins, num_coded);
1534*c83a76b0SSuyog Pawar                 }
1535*c83a76b0SSuyog Pawar 
1536*c83a76b0SSuyog Pawar                 AEV_TRACE("sign_flags", sign_bins, ps_cabac->u4_range);
1537*c83a76b0SSuyog Pawar 
1538*c83a76b0SSuyog Pawar                 /*************************************************************/
1539*c83a76b0SSuyog Pawar                 /* encode the coeff_abs_level_remaining as TR / EGK bins     */
1540*c83a76b0SSuyog Pawar                 /* See section 9.3.2.7 for details                           */
1541*c83a76b0SSuyog Pawar                 /*************************************************************/
1542*c83a76b0SSuyog Pawar 
1543*c83a76b0SSuyog Pawar                 /* first remaining coeff baselevel */
1544*c83a76b0SSuyog Pawar                 if(first_gt1_coeff > 2)
1545*c83a76b0SSuyog Pawar                 {
1546*c83a76b0SSuyog Pawar                     base_level = 3;
1547*c83a76b0SSuyog Pawar                 }
1548*c83a76b0SSuyog Pawar                 else if(num_coeffs_remaining > num_coeffs_base1)
1549*c83a76b0SSuyog Pawar                 {
1550*c83a76b0SSuyog Pawar                     /* atleast one coeff in first 8 is gt > 1 */
1551*c83a76b0SSuyog Pawar                     base_level = 2;
1552*c83a76b0SSuyog Pawar                 }
1553*c83a76b0SSuyog Pawar                 else
1554*c83a76b0SSuyog Pawar                 {
1555*c83a76b0SSuyog Pawar                     /* all coeffs have base of 1 */
1556*c83a76b0SSuyog Pawar                     base_level = 1;
1557*c83a76b0SSuyog Pawar                 }
1558*c83a76b0SSuyog Pawar 
1559*c83a76b0SSuyog Pawar                 for(j = 0; j < num_coeffs_remaining; j++)
1560*c83a76b0SSuyog Pawar                 {
1561*c83a76b0SSuyog Pawar                     WORD32 abs_coeff = pu2_sig_coeff_buf[0] + 1;
1562*c83a76b0SSuyog Pawar                     WORD32 abs_coeff_rem;
1563*c83a76b0SSuyog Pawar                     WORD32 rice_max = (4 << rice_param);
1564*c83a76b0SSuyog Pawar 
1565*c83a76b0SSuyog Pawar                     pu2_sig_coeff_buf++;
1566*c83a76b0SSuyog Pawar 
1567*c83a76b0SSuyog Pawar                     /* sanity check */
1568*c83a76b0SSuyog Pawar                     ASSERT(abs_coeff >= base_level);
1569*c83a76b0SSuyog Pawar 
1570*c83a76b0SSuyog Pawar                     abs_coeff_rem = (abs_coeff - base_level);
1571*c83a76b0SSuyog Pawar 
1572*c83a76b0SSuyog Pawar                     /* TODO://HM-8.0-dev uses (3 << rice_param) as rice_max */
1573*c83a76b0SSuyog Pawar                     /* TODO://HM-8.0-dev does either TR or EGK but not both */
1574*c83a76b0SSuyog Pawar                     if(abs_coeff_rem >= rice_max)
1575*c83a76b0SSuyog Pawar                     {
1576*c83a76b0SSuyog Pawar                         UWORD32 u4_suffix = (abs_coeff_rem - rice_max);
1577*c83a76b0SSuyog Pawar 
1578*c83a76b0SSuyog Pawar                         /* coeff exceeds max rice limit                    */
1579*c83a76b0SSuyog Pawar                         /* encode the TR prefix as tunary code             */
1580*c83a76b0SSuyog Pawar                         /* prefix = 1111 as (rice_max >> rice_praram) = 4  */
1581*c83a76b0SSuyog Pawar                         ret |= ihevce_cabac_encode_bypass_bins(ps_cabac, 0xF, 4);
1582*c83a76b0SSuyog Pawar 
1583*c83a76b0SSuyog Pawar                         /* encode the exponential golomb code suffix */
1584*c83a76b0SSuyog Pawar                         ret |= ihevce_cabac_encode_egk(ps_cabac, u4_suffix, (rice_param + 1));
1585*c83a76b0SSuyog Pawar                     }
1586*c83a76b0SSuyog Pawar                     else
1587*c83a76b0SSuyog Pawar                     {
1588*c83a76b0SSuyog Pawar                         /* code coeff as truncated rice code  */
1589*c83a76b0SSuyog Pawar                         ret |= ihevce_cabac_encode_trunc_rice(
1590*c83a76b0SSuyog Pawar                             ps_cabac, abs_coeff_rem, rice_param, rice_max);
1591*c83a76b0SSuyog Pawar                     }
1592*c83a76b0SSuyog Pawar 
1593*c83a76b0SSuyog Pawar                     AEV_TRACE("coeff_abs_level_remaining", abs_coeff_rem, ps_cabac->u4_range);
1594*c83a76b0SSuyog Pawar 
1595*c83a76b0SSuyog Pawar                     /* update the rice param based on coeff level */
1596*c83a76b0SSuyog Pawar                     if((abs_coeff > (3 << rice_param)) && (rice_param < 4))
1597*c83a76b0SSuyog Pawar                     {
1598*c83a76b0SSuyog Pawar                         rice_param++;
1599*c83a76b0SSuyog Pawar                     }
1600*c83a76b0SSuyog Pawar 
1601*c83a76b0SSuyog Pawar                     /* change base level to 1 if more than 8 coded coeffs */
1602*c83a76b0SSuyog Pawar                     if((j + 1) < (num_coeffs_remaining - num_coeffs_base1))
1603*c83a76b0SSuyog Pawar                     {
1604*c83a76b0SSuyog Pawar                         base_level = 2;
1605*c83a76b0SSuyog Pawar                     }
1606*c83a76b0SSuyog Pawar                     else
1607*c83a76b0SSuyog Pawar                     {
1608*c83a76b0SSuyog Pawar                         base_level = 1;
1609*c83a76b0SSuyog Pawar                     }
1610*c83a76b0SSuyog Pawar                 }
1611*c83a76b0SSuyog Pawar             }
1612*c83a76b0SSuyog Pawar         }
1613*c83a76b0SSuyog Pawar     }
1614*c83a76b0SSuyog Pawar     /*tap texture bits*/
1615*c83a76b0SSuyog Pawar     if(ps_cabac->e_cabac_op_mode == CABAC_MODE_COMPUTE_BITS)
1616*c83a76b0SSuyog Pawar     {  // clang-format off
1617*c83a76b0SSuyog Pawar         ps_cabac->u4_texture_bits_estimated_q12 +=
1618*c83a76b0SSuyog Pawar             (ps_cabac->u4_bits_estimated_q12 -
1619*c83a76b0SSuyog Pawar                 ps_cabac->u4_header_bits_estimated_q12);  //(ps_cabac->u4_bits_estimated_q12 - temp_tex_bits_q12);
1620*c83a76b0SSuyog Pawar     }  // clang-format on
1621*c83a76b0SSuyog Pawar 
1622*c83a76b0SSuyog Pawar     return (ret);
1623*c83a76b0SSuyog Pawar }
1624*c83a76b0SSuyog Pawar 
1625*c83a76b0SSuyog Pawar /**
1626*c83a76b0SSuyog Pawar ******************************************************************************
1627*c83a76b0SSuyog Pawar *
1628*c83a76b0SSuyog Pawar *  @brief Get the bits estimate for a transform residual block as per section
1629*c83a76b0SSuyog Pawar *   7.3.13
1630*c83a76b0SSuyog Pawar *
1631*c83a76b0SSuyog Pawar *  @par   Description
1632*c83a76b0SSuyog Pawar *   The residual block is read from a compressed coeff buffer populated during
1633*c83a76b0SSuyog Pawar *   the scanning of the quantized coeffs. The contents of the buffer are
1634*c83a76b0SSuyog Pawar *   breifly explained in param description of pv_coeff
1635*c83a76b0SSuyog Pawar *
1636*c83a76b0SSuyog Pawar *  @remarks Does not support sign data hiding and transform skip flag currently
1637*c83a76b0SSuyog Pawar *
1638*c83a76b0SSuyog Pawar *  @remarks Need to resolve the differences between JVT-J1003_d7 spec and
1639*c83a76b0SSuyog Pawar *           HM.8.0-dev for related abs_greater_than_1 context initialization
1640*c83a76b0SSuyog Pawar *           and rice_max paramtere used for coeff abs level remaining
1641*c83a76b0SSuyog Pawar *
1642*c83a76b0SSuyog Pawar *  @param[inout]   ps_entropy_ctxt
1643*c83a76b0SSuyog Pawar *  pointer to entropy context (handle)
1644*c83a76b0SSuyog Pawar *
1645*c83a76b0SSuyog Pawar *  @param[in]      pv_coeff
1646*c83a76b0SSuyog Pawar *  Compressed residue buffer containing following information:
1647*c83a76b0SSuyog Pawar *
1648*c83a76b0SSuyog Pawar *  HEADER(4 bytes) : last_coeff_x, last_coeff_y, scantype, last_subblock_num
1649*c83a76b0SSuyog Pawar *
1650*c83a76b0SSuyog Pawar *  For each 4x4 subblock starting from last_subblock_num (in scan order)
1651*c83a76b0SSuyog Pawar *     Read 2 bytes  : MSB 12bits (0xBAD marker), bit0 cur_csbf, bit1-2 nbr csbf
1652*c83a76b0SSuyog Pawar *
1653*c83a76b0SSuyog Pawar *    `If cur_csbf
1654*c83a76b0SSuyog Pawar *      Read 2 bytes : sig_coeff_map (16bits in scan_order 1:coded, 0:not coded)
1655*c83a76b0SSuyog Pawar *      Read 2 bytes : abs_gt1_flags (max of 8 only)
1656*c83a76b0SSuyog Pawar *      Read 2 bytes : coeff_sign_flags
1657*c83a76b0SSuyog Pawar *
1658*c83a76b0SSuyog Pawar *      Based on abs_gt1_flags and sig_coeff_map read remaining abs levels
1659*c83a76b0SSuyog Pawar *      Read 2 bytes : remaining_abs_coeffs_minus1 (this is in a loop)
1660*c83a76b0SSuyog Pawar *
1661*c83a76b0SSuyog Pawar *  @param[in]      log2_tr_size
1662*c83a76b0SSuyog Pawar *  transform size of the current TU
1663*c83a76b0SSuyog Pawar *
1664*c83a76b0SSuyog Pawar *  @param[in]      is_luma
1665*c83a76b0SSuyog Pawar *  boolean indicating if the texture type is luma / chroma
1666*c83a76b0SSuyog Pawar *
1667*c83a76b0SSuyog Pawar *
1668*c83a76b0SSuyog Pawar *  @return      success or failure error code
1669*c83a76b0SSuyog Pawar *
1670*c83a76b0SSuyog Pawar ******************************************************************************
1671*c83a76b0SSuyog Pawar */
ihevce_cabac_residue_encode_rdopt(entropy_context_t * ps_entropy_ctxt,void * pv_coeff,WORD32 log2_tr_size,WORD32 is_luma,WORD32 perform_sbh)1672*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_residue_encode_rdopt(
1673*c83a76b0SSuyog Pawar     entropy_context_t *ps_entropy_ctxt,
1674*c83a76b0SSuyog Pawar     void *pv_coeff,
1675*c83a76b0SSuyog Pawar     WORD32 log2_tr_size,
1676*c83a76b0SSuyog Pawar     WORD32 is_luma,
1677*c83a76b0SSuyog Pawar     WORD32 perform_sbh)
1678*c83a76b0SSuyog Pawar {
1679*c83a76b0SSuyog Pawar     WORD32 ret = IHEVCE_SUCCESS;
1680*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_entropy_ctxt->s_cabac_ctxt;
1681*c83a76b0SSuyog Pawar     UWORD32 temp_tex_bits_q12;
1682*c83a76b0SSuyog Pawar     WORD32 i4_sign_data_hiding_flag, cu_tq_bypass_flag;
1683*c83a76b0SSuyog Pawar 
1684*c83a76b0SSuyog Pawar     UWORD8 *pu1_coeff_buf_hdr = (UWORD8 *)pv_coeff;
1685*c83a76b0SSuyog Pawar     UWORD16 *pu2_sig_coeff_buf = (UWORD16 *)pv_coeff;
1686*c83a76b0SSuyog Pawar 
1687*c83a76b0SSuyog Pawar     /* last sig coeff indices in scan order */
1688*c83a76b0SSuyog Pawar     WORD32 last_sig_coeff_x = pu1_coeff_buf_hdr[0];
1689*c83a76b0SSuyog Pawar     WORD32 last_sig_coeff_y = pu1_coeff_buf_hdr[1];
1690*c83a76b0SSuyog Pawar 
1691*c83a76b0SSuyog Pawar     /* read the scan type : upright diag / horz / vert */
1692*c83a76b0SSuyog Pawar     WORD32 scan_type = pu1_coeff_buf_hdr[2];
1693*c83a76b0SSuyog Pawar 
1694*c83a76b0SSuyog Pawar     /************************************************************************/
1695*c83a76b0SSuyog Pawar     /* position of the last coded sub block. This sub block contains coeff  */
1696*c83a76b0SSuyog Pawar     /* corresponding to last_sig_coeff_x, last_sig_coeff_y. Althoug this can*/
1697*c83a76b0SSuyog Pawar     /* be derived here it better to be populated by scanning module         */
1698*c83a76b0SSuyog Pawar     /************************************************************************/
1699*c83a76b0SSuyog Pawar     WORD32 last_csb = pu1_coeff_buf_hdr[3];
1700*c83a76b0SSuyog Pawar 
1701*c83a76b0SSuyog Pawar     WORD32 cur_csbf = 0, nbr_csbf;
1702*c83a76b0SSuyog Pawar     WORD32 sig_coeff_base_ctxt; /* cabac context for sig coeff flag    */
1703*c83a76b0SSuyog Pawar     WORD32 abs_gt1_base_ctxt; /* cabac context for abslevel > 1 flag */
1704*c83a76b0SSuyog Pawar 
1705*c83a76b0SSuyog Pawar     WORD32 gt1_ctxt = 1; /* required for abs_gt1_ctxt modelling */
1706*c83a76b0SSuyog Pawar 
1707*c83a76b0SSuyog Pawar     WORD32 i;
1708*c83a76b0SSuyog Pawar 
1709*c83a76b0SSuyog Pawar     UWORD8 *pu1_ctxt_model = &ps_cabac->au1_ctxt_models[0];
1710*c83a76b0SSuyog Pawar 
1711*c83a76b0SSuyog Pawar     /* sanity checks */
1712*c83a76b0SSuyog Pawar     /* transform skip not supported */
1713*c83a76b0SSuyog Pawar     ASSERT(0 == ps_entropy_ctxt->ps_pps->i1_transform_skip_enabled_flag);
1714*c83a76b0SSuyog Pawar 
1715*c83a76b0SSuyog Pawar     cu_tq_bypass_flag = ps_entropy_ctxt->ps_pps->i1_transform_skip_enabled_flag;
1716*c83a76b0SSuyog Pawar 
1717*c83a76b0SSuyog Pawar     i4_sign_data_hiding_flag = ps_entropy_ctxt->ps_pps->i1_sign_data_hiding_flag;
1718*c83a76b0SSuyog Pawar 
1719*c83a76b0SSuyog Pawar     {
1720*c83a76b0SSuyog Pawar         temp_tex_bits_q12 = ps_cabac->u4_bits_estimated_q12;
1721*c83a76b0SSuyog Pawar     }
1722*c83a76b0SSuyog Pawar 
1723*c83a76b0SSuyog Pawar     if(SCAN_VERT == scan_type)
1724*c83a76b0SSuyog Pawar     {
1725*c83a76b0SSuyog Pawar         /* last coeff x and y are swapped for vertical scan */
1726*c83a76b0SSuyog Pawar         SWAP(last_sig_coeff_x, last_sig_coeff_y);
1727*c83a76b0SSuyog Pawar     }
1728*c83a76b0SSuyog Pawar 
1729*c83a76b0SSuyog Pawar     /* Encode the last_sig_coeff_x and last_sig_coeff_y */
1730*c83a76b0SSuyog Pawar     ret |= ihevce_cabac_encode_last_coeff_x_y(
1731*c83a76b0SSuyog Pawar         ps_cabac, last_sig_coeff_x, last_sig_coeff_y, log2_tr_size, is_luma);
1732*c83a76b0SSuyog Pawar 
1733*c83a76b0SSuyog Pawar     /*************************************************************************/
1734*c83a76b0SSuyog Pawar     /* derive base context index for sig coeff as per section 9.3.3.1.4      */
1735*c83a76b0SSuyog Pawar     /* TODO; convert to look up based on luma/chroma, scan type and tfr size */
1736*c83a76b0SSuyog Pawar     /*************************************************************************/
1737*c83a76b0SSuyog Pawar     if(is_luma)
1738*c83a76b0SSuyog Pawar     {
1739*c83a76b0SSuyog Pawar         sig_coeff_base_ctxt = IHEVC_CAB_COEFF_FLAG;
1740*c83a76b0SSuyog Pawar         abs_gt1_base_ctxt = IHEVC_CAB_COEFABS_GRTR1_FLAG;
1741*c83a76b0SSuyog Pawar 
1742*c83a76b0SSuyog Pawar         if(3 == log2_tr_size)
1743*c83a76b0SSuyog Pawar         {
1744*c83a76b0SSuyog Pawar             /* 8x8 transform size */
1745*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += (scan_type == SCAN_DIAG_UPRIGHT) ? 9 : 15;
1746*c83a76b0SSuyog Pawar         }
1747*c83a76b0SSuyog Pawar         else if(3 < log2_tr_size)
1748*c83a76b0SSuyog Pawar         {
1749*c83a76b0SSuyog Pawar             /* larger transform sizes */
1750*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 21;
1751*c83a76b0SSuyog Pawar         }
1752*c83a76b0SSuyog Pawar     }
1753*c83a76b0SSuyog Pawar     else
1754*c83a76b0SSuyog Pawar     {
1755*c83a76b0SSuyog Pawar         /* chroma context initializations */
1756*c83a76b0SSuyog Pawar         sig_coeff_base_ctxt = IHEVC_CAB_COEFF_FLAG + 27;
1757*c83a76b0SSuyog Pawar         abs_gt1_base_ctxt = IHEVC_CAB_COEFABS_GRTR1_FLAG + 16;
1758*c83a76b0SSuyog Pawar 
1759*c83a76b0SSuyog Pawar         if(3 == log2_tr_size)
1760*c83a76b0SSuyog Pawar         {
1761*c83a76b0SSuyog Pawar             /* 8x8 transform size */
1762*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 9;
1763*c83a76b0SSuyog Pawar         }
1764*c83a76b0SSuyog Pawar         else if(3 < log2_tr_size)
1765*c83a76b0SSuyog Pawar         {
1766*c83a76b0SSuyog Pawar             /* larger transform sizes */
1767*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 12;
1768*c83a76b0SSuyog Pawar         }
1769*c83a76b0SSuyog Pawar     }
1770*c83a76b0SSuyog Pawar 
1771*c83a76b0SSuyog Pawar     /* go to csbf flags */
1772*c83a76b0SSuyog Pawar     pu2_sig_coeff_buf = (UWORD16 *)(pu1_coeff_buf_hdr + COEFF_BUF_HEADER_LEN);
1773*c83a76b0SSuyog Pawar 
1774*c83a76b0SSuyog Pawar     /************************************************************************/
1775*c83a76b0SSuyog Pawar     /* encode the csbf, sig_coeff_map, abs_grt1_flags, abs_grt2_flag, sign  */
1776*c83a76b0SSuyog Pawar     /* and abs_coeff_remaining for each 4x4 starting from last scan to first*/
1777*c83a76b0SSuyog Pawar     /************************************************************************/
1778*c83a76b0SSuyog Pawar     for(i = last_csb; i >= 0; i--)
1779*c83a76b0SSuyog Pawar     {
1780*c83a76b0SSuyog Pawar         UWORD16 u2_marker_csbf;
1781*c83a76b0SSuyog Pawar         WORD32 ctxt_idx;
1782*c83a76b0SSuyog Pawar 
1783*c83a76b0SSuyog Pawar         u2_marker_csbf = *pu2_sig_coeff_buf;
1784*c83a76b0SSuyog Pawar         pu2_sig_coeff_buf++;
1785*c83a76b0SSuyog Pawar 
1786*c83a76b0SSuyog Pawar         /* sanity checks for marker present in every csbf flag */
1787*c83a76b0SSuyog Pawar         ASSERT((u2_marker_csbf >> 4) == 0xBAD);
1788*c83a76b0SSuyog Pawar 
1789*c83a76b0SSuyog Pawar         /* extract the current and neigbour csbf flags */
1790*c83a76b0SSuyog Pawar         cur_csbf = u2_marker_csbf & 0x1;
1791*c83a76b0SSuyog Pawar         nbr_csbf = (u2_marker_csbf >> 1) & 0x3;
1792*c83a76b0SSuyog Pawar 
1793*c83a76b0SSuyog Pawar         /*********************************************************************/
1794*c83a76b0SSuyog Pawar         /* code the csbf flags; last and first csb not sent as it is derived */
1795*c83a76b0SSuyog Pawar         /*********************************************************************/
1796*c83a76b0SSuyog Pawar         if((i < last_csb) && (i > 0))
1797*c83a76b0SSuyog Pawar         {
1798*c83a76b0SSuyog Pawar             ctxt_idx = IHEVC_CAB_CODED_SUBLK_IDX;
1799*c83a76b0SSuyog Pawar 
1800*c83a76b0SSuyog Pawar             /* ctxt based on right / bottom avail csbf, section 9.3.3.1.3 */
1801*c83a76b0SSuyog Pawar             ctxt_idx += nbr_csbf ? 1 : 0;
1802*c83a76b0SSuyog Pawar             ctxt_idx += is_luma ? 0 : 2;
1803*c83a76b0SSuyog Pawar 
1804*c83a76b0SSuyog Pawar             {
1805*c83a76b0SSuyog Pawar                 WORD32 state_mps = pu1_ctxt_model[ctxt_idx];
1806*c83a76b0SSuyog Pawar 
1807*c83a76b0SSuyog Pawar                 /* increment bits generated based on state and bin encoded */
1808*c83a76b0SSuyog Pawar                 ps_cabac->u4_bits_estimated_q12 +=
1809*c83a76b0SSuyog Pawar                     gau2_ihevce_cabac_bin_to_bits[state_mps ^ cur_csbf];
1810*c83a76b0SSuyog Pawar 
1811*c83a76b0SSuyog Pawar                 /* update the context model from state transition LUT */
1812*c83a76b0SSuyog Pawar                 pu1_ctxt_model[ctxt_idx] = gau1_ihevc_next_state[(state_mps << 1) | cur_csbf];
1813*c83a76b0SSuyog Pawar             }
1814*c83a76b0SSuyog Pawar         }
1815*c83a76b0SSuyog Pawar         else
1816*c83a76b0SSuyog Pawar         {
1817*c83a76b0SSuyog Pawar             /* sanity check, this csb contains the last_sig_coeff */
1818*c83a76b0SSuyog Pawar             if(i == last_csb)
1819*c83a76b0SSuyog Pawar             {
1820*c83a76b0SSuyog Pawar                 ASSERT(cur_csbf == 1);
1821*c83a76b0SSuyog Pawar             }
1822*c83a76b0SSuyog Pawar         }
1823*c83a76b0SSuyog Pawar 
1824*c83a76b0SSuyog Pawar         if(cur_csbf)
1825*c83a76b0SSuyog Pawar         {
1826*c83a76b0SSuyog Pawar             /*****************************************************************/
1827*c83a76b0SSuyog Pawar             /* encode the sig coeff map as per section 7.3.13                */
1828*c83a76b0SSuyog Pawar             /* significant_coeff_flags: msb=coeff15-lsb=coeff0 in scan order */
1829*c83a76b0SSuyog Pawar             /*****************************************************************/
1830*c83a76b0SSuyog Pawar 
1831*c83a76b0SSuyog Pawar             /* Added for Sign bit data hiding*/
1832*c83a76b0SSuyog Pawar             WORD32 first_scan_pos = 16;
1833*c83a76b0SSuyog Pawar             WORD32 last_scan_pos = -1;
1834*c83a76b0SSuyog Pawar             WORD32 sign_hidden;
1835*c83a76b0SSuyog Pawar 
1836*c83a76b0SSuyog Pawar             UWORD16 u2_gt0_flags = *pu2_sig_coeff_buf;
1837*c83a76b0SSuyog Pawar             WORD32 gt1_flags = *(pu2_sig_coeff_buf + 1);
1838*c83a76b0SSuyog Pawar             WORD32 sign_flags = *(pu2_sig_coeff_buf + 2);
1839*c83a76b0SSuyog Pawar 
1840*c83a76b0SSuyog Pawar             WORD32 sig_coeff_map = u2_gt0_flags;
1841*c83a76b0SSuyog Pawar 
1842*c83a76b0SSuyog Pawar             WORD32 gt1_bins = 0; /* bins for coeffs with abslevel > 1 */
1843*c83a76b0SSuyog Pawar 
1844*c83a76b0SSuyog Pawar             WORD32 sign_bins = 0; /* bins for sign flags of coded coeffs  */
1845*c83a76b0SSuyog Pawar             WORD32 num_coded = 0; /* total coeffs coded in 4x4            */
1846*c83a76b0SSuyog Pawar 
1847*c83a76b0SSuyog Pawar             WORD32 infer_coeff; /* infer when 0,0 is the only coded coeff */
1848*c83a76b0SSuyog Pawar             WORD32 bit; /* temp boolean */
1849*c83a76b0SSuyog Pawar 
1850*c83a76b0SSuyog Pawar             /* total count of coeffs to be coded as abs level remaining */
1851*c83a76b0SSuyog Pawar             WORD32 num_coeffs_remaining = 0;
1852*c83a76b0SSuyog Pawar 
1853*c83a76b0SSuyog Pawar             /* count of coeffs to be coded as  abslevel-1 */
1854*c83a76b0SSuyog Pawar             WORD32 num_coeffs_base1 = 0;
1855*c83a76b0SSuyog Pawar             WORD32 scan_pos;
1856*c83a76b0SSuyog Pawar             WORD32 first_gt1_coeff = 0;
1857*c83a76b0SSuyog Pawar 
1858*c83a76b0SSuyog Pawar             if((i != 0) || (0 == last_csb))
1859*c83a76b0SSuyog Pawar             {
1860*c83a76b0SSuyog Pawar                 /* sanity check, atleast one coeff is coded as csbf is set */
1861*c83a76b0SSuyog Pawar                 ASSERT(sig_coeff_map != 0);
1862*c83a76b0SSuyog Pawar             }
1863*c83a76b0SSuyog Pawar 
1864*c83a76b0SSuyog Pawar             pu2_sig_coeff_buf += 3;
1865*c83a76b0SSuyog Pawar 
1866*c83a76b0SSuyog Pawar             scan_pos = 15;
1867*c83a76b0SSuyog Pawar             if(i == last_csb)
1868*c83a76b0SSuyog Pawar             {
1869*c83a76b0SSuyog Pawar                 /*************************************************************/
1870*c83a76b0SSuyog Pawar                 /* clear last_scan_pos for last block in scan order as this  */
1871*c83a76b0SSuyog Pawar                 /* is communicated  throught last_coeff_x and last_coeff_y   */
1872*c83a76b0SSuyog Pawar                 /*************************************************************/
1873*c83a76b0SSuyog Pawar                 WORD32 next_sig = CLZ(sig_coeff_map) + 1;
1874*c83a76b0SSuyog Pawar 
1875*c83a76b0SSuyog Pawar                 scan_pos = WORD_SIZE - next_sig;
1876*c83a76b0SSuyog Pawar 
1877*c83a76b0SSuyog Pawar                 /* prepare the bins for gt1 flags */
1878*c83a76b0SSuyog Pawar                 EXTRACT_BIT(bit, gt1_flags, scan_pos);
1879*c83a76b0SSuyog Pawar 
1880*c83a76b0SSuyog Pawar                 /* insert gt1 bin in lsb */
1881*c83a76b0SSuyog Pawar                 gt1_bins |= bit;
1882*c83a76b0SSuyog Pawar 
1883*c83a76b0SSuyog Pawar                 /* prepare the bins for sign flags */
1884*c83a76b0SSuyog Pawar                 EXTRACT_BIT(bit, sign_flags, scan_pos);
1885*c83a76b0SSuyog Pawar 
1886*c83a76b0SSuyog Pawar                 /* insert sign bin in lsb */
1887*c83a76b0SSuyog Pawar                 sign_bins |= bit;
1888*c83a76b0SSuyog Pawar 
1889*c83a76b0SSuyog Pawar                 sig_coeff_map = CLEAR_BIT(sig_coeff_map, scan_pos);
1890*c83a76b0SSuyog Pawar 
1891*c83a76b0SSuyog Pawar                 if(-1 == last_scan_pos)
1892*c83a76b0SSuyog Pawar                     last_scan_pos = scan_pos;
1893*c83a76b0SSuyog Pawar 
1894*c83a76b0SSuyog Pawar                 scan_pos--;
1895*c83a76b0SSuyog Pawar                 num_coded++;
1896*c83a76b0SSuyog Pawar             }
1897*c83a76b0SSuyog Pawar 
1898*c83a76b0SSuyog Pawar             /* infer 0,0 coeff for all 4x4 blocks except fitst and last */
1899*c83a76b0SSuyog Pawar             infer_coeff = (i < last_csb) && (i > 0);
1900*c83a76b0SSuyog Pawar 
1901*c83a76b0SSuyog Pawar             /* encode the required sigcoeff flags (abslevel > 0)   */
1902*c83a76b0SSuyog Pawar             while(scan_pos >= 0)
1903*c83a76b0SSuyog Pawar             {
1904*c83a76b0SSuyog Pawar                 WORD32 y_pos_x_pos;
1905*c83a76b0SSuyog Pawar                 WORD32 sig_ctxinc = 0; /* 0 is default inc for DC coeff */
1906*c83a76b0SSuyog Pawar 
1907*c83a76b0SSuyog Pawar                 WORD32 sig_coeff;
1908*c83a76b0SSuyog Pawar 
1909*c83a76b0SSuyog Pawar                 EXTRACT_BIT(sig_coeff, sig_coeff_map, scan_pos);
1910*c83a76b0SSuyog Pawar 
1911*c83a76b0SSuyog Pawar                 /* derive the x,y pos */
1912*c83a76b0SSuyog Pawar                 y_pos_x_pos = gu1_hevce_scan4x4[scan_type][scan_pos];
1913*c83a76b0SSuyog Pawar 
1914*c83a76b0SSuyog Pawar                 /* derive the context inc as per section 9.3.3.1.4 */
1915*c83a76b0SSuyog Pawar                 if(2 == log2_tr_size)
1916*c83a76b0SSuyog Pawar                 {
1917*c83a76b0SSuyog Pawar                     /* 4x4 transform size increment uses lookup */
1918*c83a76b0SSuyog Pawar                     sig_ctxinc = gu1_hevce_sigcoeff_ctxtinc_tr4[y_pos_x_pos];
1919*c83a76b0SSuyog Pawar                 }
1920*c83a76b0SSuyog Pawar                 else if(scan_pos || i)
1921*c83a76b0SSuyog Pawar                 {
1922*c83a76b0SSuyog Pawar                     /* ctxt for AC coeff depends on curpos and neigbour csbf */
1923*c83a76b0SSuyog Pawar                     sig_ctxinc = gu1_hevce_sigcoeff_ctxtinc[nbr_csbf][y_pos_x_pos];
1924*c83a76b0SSuyog Pawar 
1925*c83a76b0SSuyog Pawar                     /* based on luma subblock pos */
1926*c83a76b0SSuyog Pawar                     sig_ctxinc += (i && is_luma) ? 3 : 0;
1927*c83a76b0SSuyog Pawar                 }
1928*c83a76b0SSuyog Pawar                 else
1929*c83a76b0SSuyog Pawar                 {
1930*c83a76b0SSuyog Pawar                     /* DC coeff has fixed context for luma and chroma */
1931*c83a76b0SSuyog Pawar                     sig_coeff_base_ctxt = is_luma ? IHEVC_CAB_COEFF_FLAG
1932*c83a76b0SSuyog Pawar                                                   : IHEVC_CAB_COEFF_FLAG + 27;
1933*c83a76b0SSuyog Pawar                 }
1934*c83a76b0SSuyog Pawar 
1935*c83a76b0SSuyog Pawar                 /*************************************************************/
1936*c83a76b0SSuyog Pawar                 /* encode sig coeff only if required                         */
1937*c83a76b0SSuyog Pawar                 /* decoder infers 0,0 coeff when all the other coeffs are 0  */
1938*c83a76b0SSuyog Pawar                 /*************************************************************/
1939*c83a76b0SSuyog Pawar                 if(scan_pos || (!infer_coeff))
1940*c83a76b0SSuyog Pawar                 {
1941*c83a76b0SSuyog Pawar                     ctxt_idx = sig_ctxinc + sig_coeff_base_ctxt;
1942*c83a76b0SSuyog Pawar 
1943*c83a76b0SSuyog Pawar                     //ret |= ihevce_cabac_encode_bin(ps_cabac, sig_coeff, ctxt_idx);
1944*c83a76b0SSuyog Pawar                     {
1945*c83a76b0SSuyog Pawar                         WORD32 state_mps = pu1_ctxt_model[ctxt_idx];
1946*c83a76b0SSuyog Pawar 
1947*c83a76b0SSuyog Pawar                         /* increment bits generated based on state and bin encoded */
1948*c83a76b0SSuyog Pawar                         ps_cabac->u4_bits_estimated_q12 +=
1949*c83a76b0SSuyog Pawar                             gau2_ihevce_cabac_bin_to_bits[state_mps ^ sig_coeff];
1950*c83a76b0SSuyog Pawar 
1951*c83a76b0SSuyog Pawar                         /* update the context model from state transition LUT */
1952*c83a76b0SSuyog Pawar                         pu1_ctxt_model[ctxt_idx] =
1953*c83a76b0SSuyog Pawar                             gau1_ihevc_next_state[(state_mps << 1) | sig_coeff];
1954*c83a76b0SSuyog Pawar                     }
1955*c83a76b0SSuyog Pawar                 }
1956*c83a76b0SSuyog Pawar 
1957*c83a76b0SSuyog Pawar                 if(sig_coeff)
1958*c83a76b0SSuyog Pawar                 {
1959*c83a76b0SSuyog Pawar                     /* prepare the bins for gt1 flags */
1960*c83a76b0SSuyog Pawar                     EXTRACT_BIT(bit, gt1_flags, scan_pos);
1961*c83a76b0SSuyog Pawar 
1962*c83a76b0SSuyog Pawar                     /* shift and insert gt1 bin in lsb */
1963*c83a76b0SSuyog Pawar                     gt1_bins <<= 1;
1964*c83a76b0SSuyog Pawar                     gt1_bins |= bit;
1965*c83a76b0SSuyog Pawar 
1966*c83a76b0SSuyog Pawar                     /* prepare the bins for sign flags */
1967*c83a76b0SSuyog Pawar                     EXTRACT_BIT(bit, sign_flags, scan_pos);
1968*c83a76b0SSuyog Pawar 
1969*c83a76b0SSuyog Pawar                     /* shift and insert sign bin in lsb */
1970*c83a76b0SSuyog Pawar                     sign_bins <<= 1;
1971*c83a76b0SSuyog Pawar                     sign_bins |= bit;
1972*c83a76b0SSuyog Pawar 
1973*c83a76b0SSuyog Pawar                     num_coded++;
1974*c83a76b0SSuyog Pawar 
1975*c83a76b0SSuyog Pawar                     /* 0,0 coeff can no more be inferred :( */
1976*c83a76b0SSuyog Pawar                     infer_coeff = 0;
1977*c83a76b0SSuyog Pawar 
1978*c83a76b0SSuyog Pawar                     if(-1 == last_scan_pos)
1979*c83a76b0SSuyog Pawar                         last_scan_pos = scan_pos;
1980*c83a76b0SSuyog Pawar 
1981*c83a76b0SSuyog Pawar                     first_scan_pos = scan_pos;
1982*c83a76b0SSuyog Pawar                 }
1983*c83a76b0SSuyog Pawar 
1984*c83a76b0SSuyog Pawar                 scan_pos--;
1985*c83a76b0SSuyog Pawar             }
1986*c83a76b0SSuyog Pawar 
1987*c83a76b0SSuyog Pawar             /* Added for sign bit hiding*/
1988*c83a76b0SSuyog Pawar             sign_hidden =
1989*c83a76b0SSuyog Pawar                 (((last_scan_pos - first_scan_pos) > 3 && !cu_tq_bypass_flag) && (perform_sbh));
1990*c83a76b0SSuyog Pawar 
1991*c83a76b0SSuyog Pawar             /****************************************************************/
1992*c83a76b0SSuyog Pawar             /* encode the abs level greater than 1 bins; Section 7.3.13     */
1993*c83a76b0SSuyog Pawar             /* These have already been prepared during sig_coeff_map encode */
1994*c83a76b0SSuyog Pawar             /* Context modelling done as per section 9.3.3.1.5              */
1995*c83a76b0SSuyog Pawar             /****************************************************************/
1996*c83a76b0SSuyog Pawar             {
1997*c83a76b0SSuyog Pawar                 WORD32 j;
1998*c83a76b0SSuyog Pawar 
1999*c83a76b0SSuyog Pawar                 /* context set based on luma subblock pos */
2000*c83a76b0SSuyog Pawar                 WORD32 ctxt_set = (i && is_luma) ? 2 : 0;
2001*c83a76b0SSuyog Pawar 
2002*c83a76b0SSuyog Pawar                 /* count of coeffs with abslevel > 1; max of 8 to be coded */
2003*c83a76b0SSuyog Pawar                 WORD32 num_gt1_bins = MIN(8, num_coded);
2004*c83a76b0SSuyog Pawar 
2005*c83a76b0SSuyog Pawar                 if(num_coded > 8)
2006*c83a76b0SSuyog Pawar                 {
2007*c83a76b0SSuyog Pawar                     /* pull back the bins to required number */
2008*c83a76b0SSuyog Pawar                     gt1_bins >>= (num_coded - 8);
2009*c83a76b0SSuyog Pawar 
2010*c83a76b0SSuyog Pawar                     num_coeffs_remaining += (num_coded - 8);
2011*c83a76b0SSuyog Pawar                     num_coeffs_base1 = (num_coded - 8);
2012*c83a76b0SSuyog Pawar                 }
2013*c83a76b0SSuyog Pawar 
2014*c83a76b0SSuyog Pawar                 /* See section 9.3.3.1.5           */
2015*c83a76b0SSuyog Pawar                 ctxt_set += (0 == gt1_ctxt) ? 1 : 0;
2016*c83a76b0SSuyog Pawar 
2017*c83a76b0SSuyog Pawar                 gt1_ctxt = 1;
2018*c83a76b0SSuyog Pawar 
2019*c83a76b0SSuyog Pawar                 for(j = num_gt1_bins - 1; j >= 0; j--)
2020*c83a76b0SSuyog Pawar                 {
2021*c83a76b0SSuyog Pawar                     /* Encodet the abs level gt1 bins */
2022*c83a76b0SSuyog Pawar                     ctxt_idx = (ctxt_set * 4) + abs_gt1_base_ctxt + gt1_ctxt;
2023*c83a76b0SSuyog Pawar 
2024*c83a76b0SSuyog Pawar                     EXTRACT_BIT(bit, gt1_bins, j);
2025*c83a76b0SSuyog Pawar 
2026*c83a76b0SSuyog Pawar                     //ret |= ihevce_cabac_encode_bin(ps_cabac, bit, ctxt_idx);
2027*c83a76b0SSuyog Pawar                     {
2028*c83a76b0SSuyog Pawar                         WORD32 state_mps = pu1_ctxt_model[ctxt_idx];
2029*c83a76b0SSuyog Pawar 
2030*c83a76b0SSuyog Pawar                         /* increment bits generated based on state and bin encoded */
2031*c83a76b0SSuyog Pawar                         ps_cabac->u4_bits_estimated_q12 +=
2032*c83a76b0SSuyog Pawar                             gau2_ihevce_cabac_bin_to_bits[state_mps ^ bit];
2033*c83a76b0SSuyog Pawar 
2034*c83a76b0SSuyog Pawar                         /* update the context model from state transition LUT */
2035*c83a76b0SSuyog Pawar                         pu1_ctxt_model[ctxt_idx] = gau1_ihevc_next_state[(state_mps << 1) | bit];
2036*c83a76b0SSuyog Pawar                     }
2037*c83a76b0SSuyog Pawar 
2038*c83a76b0SSuyog Pawar                     if(bit)
2039*c83a76b0SSuyog Pawar                     {
2040*c83a76b0SSuyog Pawar                         gt1_ctxt = 0;
2041*c83a76b0SSuyog Pawar                         num_coeffs_remaining++;
2042*c83a76b0SSuyog Pawar                     }
2043*c83a76b0SSuyog Pawar                     else if(gt1_ctxt && (gt1_ctxt < 3))
2044*c83a76b0SSuyog Pawar                     {
2045*c83a76b0SSuyog Pawar                         gt1_ctxt++;
2046*c83a76b0SSuyog Pawar                     }
2047*c83a76b0SSuyog Pawar                 }
2048*c83a76b0SSuyog Pawar 
2049*c83a76b0SSuyog Pawar                 /*************************************************************/
2050*c83a76b0SSuyog Pawar                 /* encode abs level greater than 2 bin; Section 7.3.13       */
2051*c83a76b0SSuyog Pawar                 /*************************************************************/
2052*c83a76b0SSuyog Pawar                 if(gt1_bins)
2053*c83a76b0SSuyog Pawar                 {
2054*c83a76b0SSuyog Pawar                     WORD32 gt2_bin;
2055*c83a76b0SSuyog Pawar 
2056*c83a76b0SSuyog Pawar                     first_gt1_coeff = pu2_sig_coeff_buf[0] + 1;
2057*c83a76b0SSuyog Pawar                     gt2_bin = (first_gt1_coeff > 2);
2058*c83a76b0SSuyog Pawar 
2059*c83a76b0SSuyog Pawar                     /* atleast one level > 2 */
2060*c83a76b0SSuyog Pawar                     ctxt_idx = IHEVC_CAB_COEFABS_GRTR2_FLAG;
2061*c83a76b0SSuyog Pawar 
2062*c83a76b0SSuyog Pawar                     ctxt_idx += (is_luma) ? ctxt_set : (ctxt_set + 4);
2063*c83a76b0SSuyog Pawar 
2064*c83a76b0SSuyog Pawar                     //ret |= ihevce_cabac_encode_bin(ps_cabac, gt2_bin, ctxt_idx);
2065*c83a76b0SSuyog Pawar                     {
2066*c83a76b0SSuyog Pawar                         WORD32 state_mps = pu1_ctxt_model[ctxt_idx];
2067*c83a76b0SSuyog Pawar 
2068*c83a76b0SSuyog Pawar                         /* increment bits generated based on state and bin encoded */
2069*c83a76b0SSuyog Pawar                         ps_cabac->u4_bits_estimated_q12 +=
2070*c83a76b0SSuyog Pawar                             gau2_ihevce_cabac_bin_to_bits[state_mps ^ gt2_bin];
2071*c83a76b0SSuyog Pawar 
2072*c83a76b0SSuyog Pawar                         /* update the context model from state transition LUT */
2073*c83a76b0SSuyog Pawar                         pu1_ctxt_model[ctxt_idx] =
2074*c83a76b0SSuyog Pawar                             gau1_ihevc_next_state[(state_mps << 1) | gt2_bin];
2075*c83a76b0SSuyog Pawar                     }
2076*c83a76b0SSuyog Pawar 
2077*c83a76b0SSuyog Pawar                     if(!gt2_bin)
2078*c83a76b0SSuyog Pawar                     {
2079*c83a76b0SSuyog Pawar                         /* sanity check */
2080*c83a76b0SSuyog Pawar                         ASSERT(first_gt1_coeff == 2);
2081*c83a76b0SSuyog Pawar 
2082*c83a76b0SSuyog Pawar                         /* no need to send this coeff as bypass bins */
2083*c83a76b0SSuyog Pawar                         pu2_sig_coeff_buf++;
2084*c83a76b0SSuyog Pawar                         num_coeffs_remaining--;
2085*c83a76b0SSuyog Pawar                     }
2086*c83a76b0SSuyog Pawar                 }
2087*c83a76b0SSuyog Pawar             }
2088*c83a76b0SSuyog Pawar 
2089*c83a76b0SSuyog Pawar             /*************************************************************/
2090*c83a76b0SSuyog Pawar             /* encode the coeff signs and abs remaing levels             */
2091*c83a76b0SSuyog Pawar             /*************************************************************/
2092*c83a76b0SSuyog Pawar             if(num_coded)
2093*c83a76b0SSuyog Pawar             {
2094*c83a76b0SSuyog Pawar                 WORD32 base_level;
2095*c83a76b0SSuyog Pawar                 WORD32 rice_param = 0;
2096*c83a76b0SSuyog Pawar                 WORD32 j;
2097*c83a76b0SSuyog Pawar 
2098*c83a76b0SSuyog Pawar                 /*************************************************************/
2099*c83a76b0SSuyog Pawar                 /* encode the coeff signs populated in sign_bins             */
2100*c83a76b0SSuyog Pawar                 /*************************************************************/
2101*c83a76b0SSuyog Pawar                 if(sign_hidden && i4_sign_data_hiding_flag)
2102*c83a76b0SSuyog Pawar                 {
2103*c83a76b0SSuyog Pawar                     sign_bins >>= 1;
2104*c83a76b0SSuyog Pawar                     num_coded--;
2105*c83a76b0SSuyog Pawar                 }
2106*c83a76b0SSuyog Pawar 
2107*c83a76b0SSuyog Pawar                 if(num_coded > 0)
2108*c83a76b0SSuyog Pawar                 {
2109*c83a76b0SSuyog Pawar                     /* ret |= ihevce_cabac_encode_bypass_bins(ps_cabac,
2110*c83a76b0SSuyog Pawar                                                        sign_bins,
2111*c83a76b0SSuyog Pawar                                                        num_coded);
2112*c83a76b0SSuyog Pawar                     */
2113*c83a76b0SSuyog Pawar 
2114*c83a76b0SSuyog Pawar                     /* increment bits generated based on num bypass bins */
2115*c83a76b0SSuyog Pawar                     ps_cabac->u4_bits_estimated_q12 += (num_coded << CABAC_FRAC_BITS_Q);
2116*c83a76b0SSuyog Pawar                 }
2117*c83a76b0SSuyog Pawar 
2118*c83a76b0SSuyog Pawar                 /*************************************************************/
2119*c83a76b0SSuyog Pawar                 /* encode the coeff_abs_level_remaining as TR / EGK bins     */
2120*c83a76b0SSuyog Pawar                 /* See section 9.3.2.7 for details                           */
2121*c83a76b0SSuyog Pawar                 /*************************************************************/
2122*c83a76b0SSuyog Pawar 
2123*c83a76b0SSuyog Pawar                 /* first remaining coeff baselevel */
2124*c83a76b0SSuyog Pawar                 if(first_gt1_coeff > 2)
2125*c83a76b0SSuyog Pawar                 {
2126*c83a76b0SSuyog Pawar                     base_level = 3;
2127*c83a76b0SSuyog Pawar                 }
2128*c83a76b0SSuyog Pawar                 else if(num_coeffs_remaining > num_coeffs_base1)
2129*c83a76b0SSuyog Pawar                 {
2130*c83a76b0SSuyog Pawar                     /* atleast one coeff in first 8 is gt > 1 */
2131*c83a76b0SSuyog Pawar                     base_level = 2;
2132*c83a76b0SSuyog Pawar                 }
2133*c83a76b0SSuyog Pawar                 else
2134*c83a76b0SSuyog Pawar                 {
2135*c83a76b0SSuyog Pawar                     /* all coeffs have base of 1 */
2136*c83a76b0SSuyog Pawar                     base_level = 1;
2137*c83a76b0SSuyog Pawar                 }
2138*c83a76b0SSuyog Pawar 
2139*c83a76b0SSuyog Pawar                 for(j = 0; j < num_coeffs_remaining; j++)
2140*c83a76b0SSuyog Pawar                 {
2141*c83a76b0SSuyog Pawar                     WORD32 abs_coeff = pu2_sig_coeff_buf[0] + 1;
2142*c83a76b0SSuyog Pawar                     WORD32 abs_coeff_rem;
2143*c83a76b0SSuyog Pawar                     WORD32 rice_max = (4 << rice_param);
2144*c83a76b0SSuyog Pawar                     WORD32 num_bins, unary_length;
2145*c83a76b0SSuyog Pawar                     UWORD32 u4_sym_shiftk_plus1;
2146*c83a76b0SSuyog Pawar 
2147*c83a76b0SSuyog Pawar                     pu2_sig_coeff_buf++;
2148*c83a76b0SSuyog Pawar 
2149*c83a76b0SSuyog Pawar                     /* sanity check */
2150*c83a76b0SSuyog Pawar                     ASSERT(abs_coeff >= base_level);
2151*c83a76b0SSuyog Pawar 
2152*c83a76b0SSuyog Pawar                     abs_coeff_rem = (abs_coeff - base_level);
2153*c83a76b0SSuyog Pawar 
2154*c83a76b0SSuyog Pawar                     /* TODO://HM-8.0-dev uses (3 << rice_param) as rice_max */
2155*c83a76b0SSuyog Pawar                     /* TODO://HM-8.0-dev does either TR or EGK but not both */
2156*c83a76b0SSuyog Pawar                     if(abs_coeff_rem >= rice_max)
2157*c83a76b0SSuyog Pawar                     {
2158*c83a76b0SSuyog Pawar                         UWORD32 u4_suffix = (abs_coeff_rem - rice_max);
2159*c83a76b0SSuyog Pawar 
2160*c83a76b0SSuyog Pawar                         /* coeff exceeds max rice limit                    */
2161*c83a76b0SSuyog Pawar                         /* encode the TR prefix as tunary code             */
2162*c83a76b0SSuyog Pawar                         /* prefix = 1111 as (rice_max >> rice_praram) = 4  */
2163*c83a76b0SSuyog Pawar                         /* ret |= ihevce_cabac_encode_bypass_bins(ps_cabac, 0xF, 4); */
2164*c83a76b0SSuyog Pawar 
2165*c83a76b0SSuyog Pawar                         /* increment bits generated based on num bypass bins */
2166*c83a76b0SSuyog Pawar                         ps_cabac->u4_bits_estimated_q12 += (4 << CABAC_FRAC_BITS_Q);
2167*c83a76b0SSuyog Pawar 
2168*c83a76b0SSuyog Pawar                         /* encode the exponential golomb code suffix */
2169*c83a76b0SSuyog Pawar                         /*ret |= ihevce_cabac_encode_egk(ps_cabac,
2170*c83a76b0SSuyog Pawar                                                        u4_suffix,
2171*c83a76b0SSuyog Pawar                                                        (rice_param+1)
2172*c83a76b0SSuyog Pawar                                                       ); */
2173*c83a76b0SSuyog Pawar 
2174*c83a76b0SSuyog Pawar                         /* k = rice_param+1 */
2175*c83a76b0SSuyog Pawar                         /************************************************************************/
2176*c83a76b0SSuyog Pawar                         /* shift symbol by k bits to find unary code prefix (111110)            */
2177*c83a76b0SSuyog Pawar                         /* Use GETRANGE to elminate the while loop in sec 9.3.2.4 of HEVC spec  */
2178*c83a76b0SSuyog Pawar                         /************************************************************************/
2179*c83a76b0SSuyog Pawar                         u4_sym_shiftk_plus1 = (u4_suffix >> (rice_param + 1)) + 1;
2180*c83a76b0SSuyog Pawar 
2181*c83a76b0SSuyog Pawar                         /* GETRANGE(unary_length, (u4_sym_shiftk_plus1 + 1)); */
2182*c83a76b0SSuyog Pawar                         GETRANGE(unary_length, u4_sym_shiftk_plus1);
2183*c83a76b0SSuyog Pawar 
2184*c83a76b0SSuyog Pawar                         /* length of the code = 2 *(unary_length - 1) + 1 + k */
2185*c83a76b0SSuyog Pawar                         num_bins = (2 * unary_length) + rice_param;
2186*c83a76b0SSuyog Pawar 
2187*c83a76b0SSuyog Pawar                         /* increment bits generated based on num bypass bins */
2188*c83a76b0SSuyog Pawar                         ps_cabac->u4_bits_estimated_q12 += (num_bins << CABAC_FRAC_BITS_Q);
2189*c83a76b0SSuyog Pawar                     }
2190*c83a76b0SSuyog Pawar                     else
2191*c83a76b0SSuyog Pawar                     {
2192*c83a76b0SSuyog Pawar                         /* code coeff as truncated rice code  */
2193*c83a76b0SSuyog Pawar                         /* ret |= ihevce_cabac_encode_trunc_rice(ps_cabac,
2194*c83a76b0SSuyog Pawar                                                               abs_coeff_rem,
2195*c83a76b0SSuyog Pawar                                                               rice_param,
2196*c83a76b0SSuyog Pawar                                                               rice_max);
2197*c83a76b0SSuyog Pawar                                                               */
2198*c83a76b0SSuyog Pawar 
2199*c83a76b0SSuyog Pawar                         /************************************************************************/
2200*c83a76b0SSuyog Pawar                         /* shift symbol by c_rice_param bits to find unary code prefix (111.10) */
2201*c83a76b0SSuyog Pawar                         /************************************************************************/
2202*c83a76b0SSuyog Pawar                         unary_length = (abs_coeff_rem >> rice_param) + 1;
2203*c83a76b0SSuyog Pawar 
2204*c83a76b0SSuyog Pawar                         /* length of the code */
2205*c83a76b0SSuyog Pawar                         num_bins = unary_length + rice_param;
2206*c83a76b0SSuyog Pawar 
2207*c83a76b0SSuyog Pawar                         /* increment bits generated based on num bypass bins */
2208*c83a76b0SSuyog Pawar                         ps_cabac->u4_bits_estimated_q12 += (num_bins << CABAC_FRAC_BITS_Q);
2209*c83a76b0SSuyog Pawar                     }
2210*c83a76b0SSuyog Pawar 
2211*c83a76b0SSuyog Pawar                     /* update the rice param based on coeff level */
2212*c83a76b0SSuyog Pawar                     if((abs_coeff > (3 << rice_param)) && (rice_param < 4))
2213*c83a76b0SSuyog Pawar                     {
2214*c83a76b0SSuyog Pawar                         rice_param++;
2215*c83a76b0SSuyog Pawar                     }
2216*c83a76b0SSuyog Pawar 
2217*c83a76b0SSuyog Pawar                     /* change base level to 1 if more than 8 coded coeffs */
2218*c83a76b0SSuyog Pawar                     if((j + 1) < (num_coeffs_remaining - num_coeffs_base1))
2219*c83a76b0SSuyog Pawar                     {
2220*c83a76b0SSuyog Pawar                         base_level = 2;
2221*c83a76b0SSuyog Pawar                     }
2222*c83a76b0SSuyog Pawar                     else
2223*c83a76b0SSuyog Pawar                     {
2224*c83a76b0SSuyog Pawar                         base_level = 1;
2225*c83a76b0SSuyog Pawar                     }
2226*c83a76b0SSuyog Pawar                 }
2227*c83a76b0SSuyog Pawar             }
2228*c83a76b0SSuyog Pawar         }
2229*c83a76b0SSuyog Pawar     }
2230*c83a76b0SSuyog Pawar     /*tap texture bits*/
2231*c83a76b0SSuyog Pawar     {
2232*c83a76b0SSuyog Pawar         ps_cabac->u4_texture_bits_estimated_q12 +=
2233*c83a76b0SSuyog Pawar             (ps_cabac->u4_bits_estimated_q12 - temp_tex_bits_q12);
2234*c83a76b0SSuyog Pawar     }
2235*c83a76b0SSuyog Pawar 
2236*c83a76b0SSuyog Pawar     return (ret);
2237*c83a76b0SSuyog Pawar }
2238*c83a76b0SSuyog Pawar 
2239*c83a76b0SSuyog Pawar /**
2240*c83a76b0SSuyog Pawar ******************************************************************************
2241*c83a76b0SSuyog Pawar *
2242*c83a76b0SSuyog Pawar *  @brief Encodes a transform residual block as per section 7.3.13
2243*c83a76b0SSuyog Pawar *
2244*c83a76b0SSuyog Pawar *  @par   Description
2245*c83a76b0SSuyog Pawar *  RDOQ optimization is carried out here. When sub-blk RDOQ is turned on, we calculate
2246*c83a76b0SSuyog Pawar *  the distortion(D) and bits(R) for when the sub blk is coded and when not coded. We
2247*c83a76b0SSuyog Pawar *  then use the D+lambdaR metric to decide whether the sub-blk should be coded or not, and
2248*c83a76b0SSuyog Pawar *  aprropriately signal it. When coeff RDOQ is turned on, we traverse through the TU to
2249*c83a76b0SSuyog Pawar *  find all non-zero coeffs. If the non zero coeff is a 1, then we make a decision(based on D+lambdaR)
2250*c83a76b0SSuyog Pawar *  metric as to whether to code it as a 0 or 1. In case the coeff is > 1(say L where L>1) we choose betweem
2251*c83a76b0SSuyog Pawar *  L and L+1
2252*c83a76b0SSuyog Pawar *
2253*c83a76b0SSuyog Pawar *  @remarks Does not support sign data hiding and transform skip flag currently
2254*c83a76b0SSuyog Pawar *
2255*c83a76b0SSuyog Pawar *  @remarks Need to resolve the differences between JVT-J1003_d7 spec and
2256*c83a76b0SSuyog Pawar *           HM.8.0-dev for related abs_greater_than_1 context initialization
2257*c83a76b0SSuyog Pawar *           and rice_max paramtere used for coeff abs level remaining
2258*c83a76b0SSuyog Pawar *
2259*c83a76b0SSuyog Pawar *  @param[inout]   ps_entropy_ctxt
2260*c83a76b0SSuyog Pawar *  pointer to entropy context (handle)
2261*c83a76b0SSuyog Pawar *
2262*c83a76b0SSuyog Pawar *  @param[in]      pv_coeff
2263*c83a76b0SSuyog Pawar *  Compressed residue buffer containing following information:
2264*c83a76b0SSuyog Pawar *
2265*c83a76b0SSuyog Pawar *
2266*c83a76b0SSuyog Pawar *  HEADER(4 bytes) : last_coeff_x, last_coeff_y, scantype, last_subblock_num
2267*c83a76b0SSuyog Pawar *
2268*c83a76b0SSuyog Pawar *  For each 4x4 subblock starting from last_subblock_num (in scan order)
2269*c83a76b0SSuyog Pawar *     Read 2 bytes  : MSB 12bits (0xBAD marker), bit0 cur_csbf, bit1-2 nbr csbf
2270*c83a76b0SSuyog Pawar *
2271*c83a76b0SSuyog Pawar *    `If cur_csbf
2272*c83a76b0SSuyog Pawar *      Read 2 bytes : sig_coeff_map (16bits in scan_order 1:coded, 0:not coded)
2273*c83a76b0SSuyog Pawar *      Read 2 bytes : abs_gt1_flags (max of 8 only)
2274*c83a76b0SSuyog Pawar *      Read 2 bytes : coeff_sign_flags
2275*c83a76b0SSuyog Pawar *
2276*c83a76b0SSuyog Pawar *      Based on abs_gt1_flags and sig_coeff_map read remaining abs levels
2277*c83a76b0SSuyog Pawar *      Read 2 bytes : remaining_abs_coeffs_minus1 (this is in a loop)
2278*c83a76b0SSuyog Pawar *
2279*c83a76b0SSuyog Pawar *  @param[in]      log2_tr_size
2280*c83a76b0SSuyog Pawar *  transform size of the current TU
2281*c83a76b0SSuyog Pawar *
2282*c83a76b0SSuyog Pawar *  @param[in]      is_luma
2283*c83a76b0SSuyog Pawar *  boolean indicating if the texture type is luma / chroma
2284*c83a76b0SSuyog Pawar *
2285*c83a76b0SSuyog Pawar *  @param[out]    pi4_tu_coded_dist
2286*c83a76b0SSuyog Pawar *  The distortion when the TU is coded(not all coeffs are set to 0) is stored here
2287*c83a76b0SSuyog Pawar *
2288*c83a76b0SSuyog Pawar *  @param[out]    pi4_tu_not_coded_dist
2289*c83a76b0SSuyog Pawar *  The distortion when the entire TU is not coded(all coeffs are set to 0) is stored here
2290*c83a76b0SSuyog Pawar *
2291*c83a76b0SSuyog Pawar *
2292*c83a76b0SSuyog Pawar *  @return      success or failure error code
2293*c83a76b0SSuyog Pawar *
2294*c83a76b0SSuyog Pawar ******************************************************************************
2295*c83a76b0SSuyog Pawar */
2296*c83a76b0SSuyog Pawar 
ihevce_cabac_residue_encode_rdoq(entropy_context_t * ps_entropy_ctxt,void * pv_coeff,WORD32 log2_tr_size,WORD32 is_luma,void * pv_rdoq_ctxt,LWORD64 * pi8_tu_coded_dist,LWORD64 * pi8_tu_not_coded_dist,WORD32 perform_sbh)2297*c83a76b0SSuyog Pawar WORD32 ihevce_cabac_residue_encode_rdoq(
2298*c83a76b0SSuyog Pawar     entropy_context_t *ps_entropy_ctxt,
2299*c83a76b0SSuyog Pawar     void *pv_coeff,
2300*c83a76b0SSuyog Pawar     WORD32 log2_tr_size,
2301*c83a76b0SSuyog Pawar     WORD32 is_luma,
2302*c83a76b0SSuyog Pawar     void *pv_rdoq_ctxt,
2303*c83a76b0SSuyog Pawar     LWORD64 *pi8_tu_coded_dist,
2304*c83a76b0SSuyog Pawar     LWORD64 *pi8_tu_not_coded_dist,
2305*c83a76b0SSuyog Pawar     WORD32 perform_sbh)
2306*c83a76b0SSuyog Pawar {
2307*c83a76b0SSuyog Pawar     WORD32 *pi4_subBlock2csbfId_map;
2308*c83a76b0SSuyog Pawar 
2309*c83a76b0SSuyog Pawar     WORD32 ret = IHEVCE_SUCCESS;
2310*c83a76b0SSuyog Pawar 
2311*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac = &ps_entropy_ctxt->s_cabac_ctxt;
2312*c83a76b0SSuyog Pawar     cab_ctxt_t s_sub_blk_not_coded_cabac_ctxt;
2313*c83a76b0SSuyog Pawar     backup_ctxt_t s_backup_ctxt;
2314*c83a76b0SSuyog Pawar     backup_ctxt_t s_backup_ctxt_sub_blk_not_coded;
2315*c83a76b0SSuyog Pawar 
2316*c83a76b0SSuyog Pawar     UWORD32 temp_tex_bits_q12;
2317*c83a76b0SSuyog Pawar 
2318*c83a76b0SSuyog Pawar     UWORD8 *pu1_coeff_buf_hdr = (UWORD8 *)pv_coeff;
2319*c83a76b0SSuyog Pawar     UWORD16 *pu2_sig_coeff_buf = (UWORD16 *)pv_coeff;
2320*c83a76b0SSuyog Pawar 
2321*c83a76b0SSuyog Pawar     LWORD64 i8_sub_blk_not_coded_dist = 0, i8_sub_blk_coded_dist = 0;
2322*c83a76b0SSuyog Pawar     WORD32 i4_sub_blk_not_coded_bits = 0, i4_sub_blk_coded_bits = 0;
2323*c83a76b0SSuyog Pawar     LWORD64 i8_sub_blk_not_coded_metric, i8_sub_blk_coded_metric;
2324*c83a76b0SSuyog Pawar     LWORD64 i8_tu_not_coded_dist = 0, i8_tu_coded_dist = 0;
2325*c83a76b0SSuyog Pawar     WORD32 i4_tu_coded_bits = 0;
2326*c83a76b0SSuyog Pawar     WORD32 temp_zero_col = 0, temp_zero_row = 0;
2327*c83a76b0SSuyog Pawar 
2328*c83a76b0SSuyog Pawar     UWORD8 *pu1_last_sig_coeff_x;
2329*c83a76b0SSuyog Pawar     UWORD8 *pu1_last_sig_coeff_y;
2330*c83a76b0SSuyog Pawar     WORD32 scan_type;
2331*c83a76b0SSuyog Pawar     WORD32 last_csb;
2332*c83a76b0SSuyog Pawar 
2333*c83a76b0SSuyog Pawar     WORD32 cur_csbf = 0, nbr_csbf;
2334*c83a76b0SSuyog Pawar     // WORD32 i4_temp_bits;
2335*c83a76b0SSuyog Pawar 
2336*c83a76b0SSuyog Pawar     WORD32 sig_coeff_base_ctxt; /* cabac context for sig coeff flag    */
2337*c83a76b0SSuyog Pawar     WORD32 abs_gt1_base_ctxt; /* cabac context for abslevel > 1 flag */
2338*c83a76b0SSuyog Pawar 
2339*c83a76b0SSuyog Pawar     UWORD8 *pu1_ctxt_model = &ps_cabac->au1_ctxt_models[0];
2340*c83a76b0SSuyog Pawar 
2341*c83a76b0SSuyog Pawar     rdoq_sbh_ctxt_t *ps_rdoq_ctxt = (rdoq_sbh_ctxt_t *)pv_rdoq_ctxt;
2342*c83a76b0SSuyog Pawar     WORD16 *pi2_coeffs = ps_rdoq_ctxt->pi2_quant_coeffs;
2343*c83a76b0SSuyog Pawar     WORD16 *pi2_tr_coeffs = ps_rdoq_ctxt->pi2_trans_values;
2344*c83a76b0SSuyog Pawar     WORD32 trans_size = ps_rdoq_ctxt->i4_trans_size;
2345*c83a76b0SSuyog Pawar     WORD32 i4_round_val = ps_rdoq_ctxt->i4_round_val_ssd_in_td;
2346*c83a76b0SSuyog Pawar     WORD32 i4_shift_val = ps_rdoq_ctxt->i4_shift_val_ssd_in_td;
2347*c83a76b0SSuyog Pawar     WORD32 scan_idx = ps_rdoq_ctxt->i4_scan_idx;
2348*c83a76b0SSuyog Pawar 
2349*c83a76b0SSuyog Pawar     UWORD8 *pu1_csb_table, *pu1_trans_table;
2350*c83a76b0SSuyog Pawar     WORD32 shift_value, mask_value;
2351*c83a76b0SSuyog Pawar 
2352*c83a76b0SSuyog Pawar     WORD32 gt1_ctxt = 1; /* required for abs_gt1_ctxt modelling */
2353*c83a76b0SSuyog Pawar     WORD32 temp_gt1_ctxt = gt1_ctxt;
2354*c83a76b0SSuyog Pawar 
2355*c83a76b0SSuyog Pawar     WORD32 i;
2356*c83a76b0SSuyog Pawar #if DISABLE_ZCSBF
2357*c83a76b0SSuyog Pawar     WORD32 i4_skip_zero_cbf = 0;
2358*c83a76b0SSuyog Pawar     WORD32 i4_skip_zero_csbf = 0;
2359*c83a76b0SSuyog Pawar     WORD32 i4_num_abs_1_coeffs = 0;
2360*c83a76b0SSuyog Pawar #endif
2361*c83a76b0SSuyog Pawar     (void)perform_sbh;
2362*c83a76b0SSuyog Pawar     pi4_subBlock2csbfId_map = ps_rdoq_ctxt->pi4_subBlock2csbfId_map;
2363*c83a76b0SSuyog Pawar 
2364*c83a76b0SSuyog Pawar     /* scan order inside a csb */
2365*c83a76b0SSuyog Pawar     pu1_csb_table = (UWORD8 *)&(g_u1_scan_table_4x4[scan_idx][0]);
2366*c83a76b0SSuyog Pawar     /*Initializing the backup_ctxt structures*/
2367*c83a76b0SSuyog Pawar     s_backup_ctxt.i4_num_bits = 0;
2368*c83a76b0SSuyog Pawar     s_backup_ctxt_sub_blk_not_coded.i4_num_bits = 0;
2369*c83a76b0SSuyog Pawar 
2370*c83a76b0SSuyog Pawar     memset(&s_backup_ctxt.au1_ctxt_to_backup, 0, MAX_NUM_CONTEXT_ELEMENTS);
2371*c83a76b0SSuyog Pawar     memset(&s_backup_ctxt_sub_blk_not_coded.au1_ctxt_to_backup, 0, MAX_NUM_CONTEXT_ELEMENTS);
2372*c83a76b0SSuyog Pawar 
2373*c83a76b0SSuyog Pawar     pu1_coeff_buf_hdr = (UWORD8 *)pv_coeff;
2374*c83a76b0SSuyog Pawar     pu2_sig_coeff_buf = (UWORD16 *)pv_coeff;
2375*c83a76b0SSuyog Pawar 
2376*c83a76b0SSuyog Pawar     /* last sig coeff indices in scan order */
2377*c83a76b0SSuyog Pawar     pu1_last_sig_coeff_x = &pu1_coeff_buf_hdr[0];
2378*c83a76b0SSuyog Pawar     pu1_last_sig_coeff_y = &pu1_coeff_buf_hdr[1];
2379*c83a76b0SSuyog Pawar 
2380*c83a76b0SSuyog Pawar     /* read the scan type : upright diag / horz / vert */
2381*c83a76b0SSuyog Pawar     scan_type = pu1_coeff_buf_hdr[2];
2382*c83a76b0SSuyog Pawar 
2383*c83a76b0SSuyog Pawar     /************************************************************************/
2384*c83a76b0SSuyog Pawar     /* position of the last coded sub block. This sub block contains coeff  */
2385*c83a76b0SSuyog Pawar     /* corresponding to last_sig_coeff_x, last_sig_coeff_y. Althoug this can*/
2386*c83a76b0SSuyog Pawar     /* be derived here it better to be populated by scanning module         */
2387*c83a76b0SSuyog Pawar     /************************************************************************/
2388*c83a76b0SSuyog Pawar     last_csb = pu1_coeff_buf_hdr[3];
2389*c83a76b0SSuyog Pawar 
2390*c83a76b0SSuyog Pawar     shift_value = ps_rdoq_ctxt->i4_log2_trans_size + 1;
2391*c83a76b0SSuyog Pawar     /* for finding. row no. from scan index */
2392*c83a76b0SSuyog Pawar     shift_value = shift_value - 3;
2393*c83a76b0SSuyog Pawar     /*for finding the col. no. from scan index*/
2394*c83a76b0SSuyog Pawar     mask_value = (ps_rdoq_ctxt->i4_trans_size / 4) - 1;
2395*c83a76b0SSuyog Pawar 
2396*c83a76b0SSuyog Pawar     switch(ps_rdoq_ctxt->i4_trans_size)
2397*c83a76b0SSuyog Pawar     {
2398*c83a76b0SSuyog Pawar     case 32:
2399*c83a76b0SSuyog Pawar         pu1_trans_table = (UWORD8 *)&(g_u1_scan_table_8x8[scan_idx][0]);
2400*c83a76b0SSuyog Pawar         break;
2401*c83a76b0SSuyog Pawar     case 16:
2402*c83a76b0SSuyog Pawar         pu1_trans_table = (UWORD8 *)&(g_u1_scan_table_4x4[scan_idx][0]);
2403*c83a76b0SSuyog Pawar         break;
2404*c83a76b0SSuyog Pawar     case 8:
2405*c83a76b0SSuyog Pawar         pu1_trans_table = (UWORD8 *)&(g_u1_scan_table_2x2[scan_idx][0]);
2406*c83a76b0SSuyog Pawar         break;
2407*c83a76b0SSuyog Pawar     case 4:
2408*c83a76b0SSuyog Pawar         pu1_trans_table = (UWORD8 *)&(g_u1_scan_table_1x1[0]);
2409*c83a76b0SSuyog Pawar         break;
2410*c83a76b0SSuyog Pawar     default:
2411*c83a76b0SSuyog Pawar         DBG_PRINTF("Invalid Trans Size\n");
2412*c83a76b0SSuyog Pawar         return -1;
2413*c83a76b0SSuyog Pawar         break;
2414*c83a76b0SSuyog Pawar     }
2415*c83a76b0SSuyog Pawar 
2416*c83a76b0SSuyog Pawar     /* sanity checks */
2417*c83a76b0SSuyog Pawar     /* transform skip not supported */
2418*c83a76b0SSuyog Pawar     ASSERT(0 == ps_entropy_ctxt->ps_pps->i1_transform_skip_enabled_flag);
2419*c83a76b0SSuyog Pawar     {
2420*c83a76b0SSuyog Pawar         temp_tex_bits_q12 = ps_cabac->u4_bits_estimated_q12;
2421*c83a76b0SSuyog Pawar     }
2422*c83a76b0SSuyog Pawar     /*************************************************************************/
2423*c83a76b0SSuyog Pawar     /* derive base context index for sig coeff as per section 9.3.3.1.4      */
2424*c83a76b0SSuyog Pawar     /* TODO; convert to look up based on luma/chroma, scan type and tfr size */
2425*c83a76b0SSuyog Pawar     /*************************************************************************/
2426*c83a76b0SSuyog Pawar     if(is_luma)
2427*c83a76b0SSuyog Pawar     {
2428*c83a76b0SSuyog Pawar         sig_coeff_base_ctxt = IHEVC_CAB_COEFF_FLAG;
2429*c83a76b0SSuyog Pawar         abs_gt1_base_ctxt = IHEVC_CAB_COEFABS_GRTR1_FLAG;
2430*c83a76b0SSuyog Pawar 
2431*c83a76b0SSuyog Pawar         if(3 == log2_tr_size)
2432*c83a76b0SSuyog Pawar         {
2433*c83a76b0SSuyog Pawar             /* 8x8 transform size */
2434*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += (scan_type == SCAN_DIAG_UPRIGHT) ? 9 : 15;
2435*c83a76b0SSuyog Pawar         }
2436*c83a76b0SSuyog Pawar         else if(3 < log2_tr_size)
2437*c83a76b0SSuyog Pawar         {
2438*c83a76b0SSuyog Pawar             /* larger transform sizes */
2439*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 21;
2440*c83a76b0SSuyog Pawar         }
2441*c83a76b0SSuyog Pawar     }
2442*c83a76b0SSuyog Pawar     else
2443*c83a76b0SSuyog Pawar     {
2444*c83a76b0SSuyog Pawar         /* chroma context initializations */
2445*c83a76b0SSuyog Pawar         sig_coeff_base_ctxt = IHEVC_CAB_COEFF_FLAG + 27;
2446*c83a76b0SSuyog Pawar         abs_gt1_base_ctxt = IHEVC_CAB_COEFABS_GRTR1_FLAG + 16;
2447*c83a76b0SSuyog Pawar 
2448*c83a76b0SSuyog Pawar         if(3 == log2_tr_size)
2449*c83a76b0SSuyog Pawar         {
2450*c83a76b0SSuyog Pawar             /* 8x8 transform size */
2451*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 9;
2452*c83a76b0SSuyog Pawar         }
2453*c83a76b0SSuyog Pawar         else if(3 < log2_tr_size)
2454*c83a76b0SSuyog Pawar         {
2455*c83a76b0SSuyog Pawar             /* larger transform sizes */
2456*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 12;
2457*c83a76b0SSuyog Pawar         }
2458*c83a76b0SSuyog Pawar     }
2459*c83a76b0SSuyog Pawar 
2460*c83a76b0SSuyog Pawar     /* go to csbf flags */
2461*c83a76b0SSuyog Pawar     pu2_sig_coeff_buf = (UWORD16 *)(pu1_coeff_buf_hdr + COEFF_BUF_HEADER_LEN);
2462*c83a76b0SSuyog Pawar 
2463*c83a76b0SSuyog Pawar     /*Calculating the distortion produced by all the zero coeffs in the TU*/
2464*c83a76b0SSuyog Pawar     for(i = (trans_size * trans_size) - 1; i >= 0; i--)
2465*c83a76b0SSuyog Pawar     {
2466*c83a76b0SSuyog Pawar         WORD32 i4_dist;
2467*c83a76b0SSuyog Pawar         WORD16 *pi2_orig_coeff = ps_rdoq_ctxt->pi2_trans_values;
2468*c83a76b0SSuyog Pawar 
2469*c83a76b0SSuyog Pawar         if(pi2_coeffs[i] == 0)
2470*c83a76b0SSuyog Pawar         {
2471*c83a76b0SSuyog Pawar             i4_dist = CALC_SSD_IN_TRANS_DOMAIN(pi2_orig_coeff[i], 0, 0, 0);
2472*c83a76b0SSuyog Pawar             i8_tu_not_coded_dist += i4_dist;
2473*c83a76b0SSuyog Pawar             i8_tu_coded_dist += i4_dist;
2474*c83a76b0SSuyog Pawar         }
2475*c83a76b0SSuyog Pawar     }
2476*c83a76b0SSuyog Pawar 
2477*c83a76b0SSuyog Pawar     /*Backup of the various cabac ctxts*/
2478*c83a76b0SSuyog Pawar     memcpy(&s_sub_blk_not_coded_cabac_ctxt, ps_cabac, sizeof(cab_ctxt_t));
2479*c83a76b0SSuyog Pawar     /************************************************************************/
2480*c83a76b0SSuyog Pawar     /* encode the csbf, sig_coeff_map, abs_grt1_flags, abs_grt2_flag, sign  */
2481*c83a76b0SSuyog Pawar     /* and abs_coeff_remaining for each 4x4 starting from last scan to first*/
2482*c83a76b0SSuyog Pawar     /************************************************************************/
2483*c83a76b0SSuyog Pawar 
2484*c83a76b0SSuyog Pawar     for(i = last_csb; i >= 0; i--)
2485*c83a76b0SSuyog Pawar     {
2486*c83a76b0SSuyog Pawar         UWORD16 u2_marker_csbf;
2487*c83a76b0SSuyog Pawar         WORD32 ctxt_idx;
2488*c83a76b0SSuyog Pawar         WORD32 i4_sub_blk_is_coded = 0;
2489*c83a76b0SSuyog Pawar         WORD32 blk_row, blk_col;
2490*c83a76b0SSuyog Pawar         WORD32 scaled_blk_row;
2491*c83a76b0SSuyog Pawar         WORD32 scaled_blk_col;
2492*c83a76b0SSuyog Pawar         WORD32 infer_coeff;
2493*c83a76b0SSuyog Pawar 
2494*c83a76b0SSuyog Pawar         gt1_ctxt = temp_gt1_ctxt;
2495*c83a76b0SSuyog Pawar #if DISABLE_ZCSBF
2496*c83a76b0SSuyog Pawar         /*Initialize skip zero cbf flag to 0*/
2497*c83a76b0SSuyog Pawar         i4_skip_zero_csbf = 0;
2498*c83a76b0SSuyog Pawar         i4_num_abs_1_coeffs = 0;
2499*c83a76b0SSuyog Pawar #endif
2500*c83a76b0SSuyog Pawar 
2501*c83a76b0SSuyog Pawar #if OPT_MEMCPY
2502*c83a76b0SSuyog Pawar         ihevce_copy_backup_ctxt(
2503*c83a76b0SSuyog Pawar             (void *)&s_sub_blk_not_coded_cabac_ctxt,
2504*c83a76b0SSuyog Pawar             (void *)ps_cabac,
2505*c83a76b0SSuyog Pawar             (void *)&s_backup_ctxt_sub_blk_not_coded,
2506*c83a76b0SSuyog Pawar             (void *)&s_backup_ctxt);
2507*c83a76b0SSuyog Pawar         memset(s_backup_ctxt_sub_blk_not_coded.au1_ctxt_to_backup, 0, 5);
2508*c83a76b0SSuyog Pawar         memset(s_backup_ctxt.au1_ctxt_to_backup, 0, 5);
2509*c83a76b0SSuyog Pawar #else
2510*c83a76b0SSuyog Pawar         memcpy(&s_sub_blk_not_coded_cabac_ctxt, ps_cabac, sizeof(cab_ctxt_t));
2511*c83a76b0SSuyog Pawar #endif
2512*c83a76b0SSuyog Pawar         // i4_temp_bits = s_sub_blk_not_coded_cabac_ctxt.u4_bits_estimated_q12;
2513*c83a76b0SSuyog Pawar 
2514*c83a76b0SSuyog Pawar         blk_row = pu1_trans_table[i] >> shift_value; /*row of csb*/
2515*c83a76b0SSuyog Pawar         blk_col = pu1_trans_table[i] & mask_value; /*col of csb*/
2516*c83a76b0SSuyog Pawar 
2517*c83a76b0SSuyog Pawar         scaled_blk_row = blk_row << 2;
2518*c83a76b0SSuyog Pawar         scaled_blk_col = blk_col << 2;
2519*c83a76b0SSuyog Pawar 
2520*c83a76b0SSuyog Pawar         infer_coeff = (i < last_csb) && (i > 0);
2521*c83a76b0SSuyog Pawar         u2_marker_csbf = *pu2_sig_coeff_buf;
2522*c83a76b0SSuyog Pawar 
2523*c83a76b0SSuyog Pawar         if((blk_col + 1 < trans_size / 4)) /* checking right boundary */
2524*c83a76b0SSuyog Pawar         {
2525*c83a76b0SSuyog Pawar             if(!ps_rdoq_ctxt
2526*c83a76b0SSuyog Pawar                     ->pu1_csbf_buf[pi4_subBlock2csbfId_map[blk_row * trans_size / 4 + blk_col + 1]])
2527*c83a76b0SSuyog Pawar             {
2528*c83a76b0SSuyog Pawar                 /* clear the 2nd bit if the right csb is 0 */
2529*c83a76b0SSuyog Pawar                 u2_marker_csbf = u2_marker_csbf & (~(1 << 1));
2530*c83a76b0SSuyog Pawar             }
2531*c83a76b0SSuyog Pawar         }
2532*c83a76b0SSuyog Pawar         if((blk_row + 1 < trans_size / 4)) /* checking bottom boundary */
2533*c83a76b0SSuyog Pawar         {
2534*c83a76b0SSuyog Pawar             if(!ps_rdoq_ctxt
2535*c83a76b0SSuyog Pawar                     ->pu1_csbf_buf[pi4_subBlock2csbfId_map[(blk_row + 1) * trans_size / 4 + blk_col]])
2536*c83a76b0SSuyog Pawar             {
2537*c83a76b0SSuyog Pawar                 /* clear the 3rd bit if the bottom csb is 0*/
2538*c83a76b0SSuyog Pawar                 u2_marker_csbf = u2_marker_csbf & (~(1 << 2));
2539*c83a76b0SSuyog Pawar             }
2540*c83a76b0SSuyog Pawar         }
2541*c83a76b0SSuyog Pawar         pu2_sig_coeff_buf++;
2542*c83a76b0SSuyog Pawar 
2543*c83a76b0SSuyog Pawar         /* sanity checks for marker present in every csbf flag */
2544*c83a76b0SSuyog Pawar         ASSERT((u2_marker_csbf >> 4) == 0xBAD);
2545*c83a76b0SSuyog Pawar 
2546*c83a76b0SSuyog Pawar         /* extract the current and neigbour csbf flags */
2547*c83a76b0SSuyog Pawar         cur_csbf = u2_marker_csbf & 0x1;
2548*c83a76b0SSuyog Pawar         nbr_csbf = (u2_marker_csbf >> 1) & 0x3;
2549*c83a76b0SSuyog Pawar 
2550*c83a76b0SSuyog Pawar         if((i < last_csb) && (i > 0))
2551*c83a76b0SSuyog Pawar         {
2552*c83a76b0SSuyog Pawar             ctxt_idx = IHEVC_CAB_CODED_SUBLK_IDX;
2553*c83a76b0SSuyog Pawar 
2554*c83a76b0SSuyog Pawar             /* ctxt based on right / bottom avail csbf, section 9.3.3.1.3 */
2555*c83a76b0SSuyog Pawar             ctxt_idx += nbr_csbf ? 1 : 0;
2556*c83a76b0SSuyog Pawar             ctxt_idx += is_luma ? 0 : 2;
2557*c83a76b0SSuyog Pawar 
2558*c83a76b0SSuyog Pawar             ret |= ihevce_cabac_encode_bin(ps_cabac, cur_csbf, ctxt_idx);
2559*c83a76b0SSuyog Pawar 
2560*c83a76b0SSuyog Pawar             s_backup_ctxt.au1_ctxt_to_backup[SUB_BLK_CODED_FLAG] = 1;
2561*c83a76b0SSuyog Pawar 
2562*c83a76b0SSuyog Pawar             if(cur_csbf)
2563*c83a76b0SSuyog Pawar             {
2564*c83a76b0SSuyog Pawar                 ret |= ihevce_cabac_encode_bin(&s_sub_blk_not_coded_cabac_ctxt, 0, ctxt_idx);
2565*c83a76b0SSuyog Pawar                 // clang-format off
2566*c83a76b0SSuyog Pawar                 i4_sub_blk_not_coded_bits =
2567*c83a76b0SSuyog Pawar                     s_sub_blk_not_coded_cabac_ctxt.u4_bits_estimated_q12;  // - i4_temp_bits;
2568*c83a76b0SSuyog Pawar                 s_backup_ctxt_sub_blk_not_coded.au1_ctxt_to_backup[SUB_BLK_CODED_FLAG] = 1;
2569*c83a76b0SSuyog Pawar                 // clang-format on
2570*c83a76b0SSuyog Pawar             }
2571*c83a76b0SSuyog Pawar         }
2572*c83a76b0SSuyog Pawar         else
2573*c83a76b0SSuyog Pawar         {
2574*c83a76b0SSuyog Pawar             /* sanity check, this csb contains the last_sig_coeff */
2575*c83a76b0SSuyog Pawar             if(i == last_csb)
2576*c83a76b0SSuyog Pawar             {
2577*c83a76b0SSuyog Pawar                 ASSERT(cur_csbf == 1);
2578*c83a76b0SSuyog Pawar             }
2579*c83a76b0SSuyog Pawar         }
2580*c83a76b0SSuyog Pawar         /*If any block in the TU is coded and the 0th block is not coded, the 0th
2581*c83a76b0SSuyog Pawar           block is still signalled as csbf = 1, and with all sig_coeffs sent as
2582*c83a76b0SSuyog Pawar           0(HEVC requirement)*/
2583*c83a76b0SSuyog Pawar         if((ps_rdoq_ctxt->i1_tu_is_coded == 1) && (i == 0))
2584*c83a76b0SSuyog Pawar         {
2585*c83a76b0SSuyog Pawar             i4_sub_blk_not_coded_bits = ihevce_code_all_sig_coeffs_as_0_explicitly(
2586*c83a76b0SSuyog Pawar                 (void *)ps_rdoq_ctxt,
2587*c83a76b0SSuyog Pawar                 i,
2588*c83a76b0SSuyog Pawar                 pu1_trans_table,
2589*c83a76b0SSuyog Pawar                 is_luma,
2590*c83a76b0SSuyog Pawar                 scan_type,
2591*c83a76b0SSuyog Pawar                 infer_coeff,
2592*c83a76b0SSuyog Pawar                 nbr_csbf,
2593*c83a76b0SSuyog Pawar                 &s_sub_blk_not_coded_cabac_ctxt);
2594*c83a76b0SSuyog Pawar         }
2595*c83a76b0SSuyog Pawar 
2596*c83a76b0SSuyog Pawar         if(i == last_csb)
2597*c83a76b0SSuyog Pawar         {
2598*c83a76b0SSuyog Pawar             WORD32 i4_last_x = *pu1_last_sig_coeff_x;
2599*c83a76b0SSuyog Pawar             WORD32 i4_last_y = *pu1_last_sig_coeff_y;
2600*c83a76b0SSuyog Pawar             if(SCAN_VERT == scan_type)
2601*c83a76b0SSuyog Pawar             {
2602*c83a76b0SSuyog Pawar                 /* last coeff x and y are swapped for vertical scan */
2603*c83a76b0SSuyog Pawar                 SWAP(i4_last_x, i4_last_y);
2604*c83a76b0SSuyog Pawar             }
2605*c83a76b0SSuyog Pawar             /* Encode the last_sig_coeff_x and last_sig_coeff_y */
2606*c83a76b0SSuyog Pawar             ret |= ihevce_cabac_encode_last_coeff_x_y(
2607*c83a76b0SSuyog Pawar                 ps_cabac, i4_last_x, i4_last_y, log2_tr_size, is_luma);
2608*c83a76b0SSuyog Pawar             s_backup_ctxt.au1_ctxt_to_backup[LASTXY] = 1;
2609*c83a76b0SSuyog Pawar         }
2610*c83a76b0SSuyog Pawar 
2611*c83a76b0SSuyog Pawar         if(cur_csbf)
2612*c83a76b0SSuyog Pawar         {
2613*c83a76b0SSuyog Pawar             /*****************************************************************/
2614*c83a76b0SSuyog Pawar             /* encode the sig coeff map as per section 7.3.13                */
2615*c83a76b0SSuyog Pawar             /* significant_coeff_flags: msb=coeff15-lsb=coeff0 in scan order */
2616*c83a76b0SSuyog Pawar             /*****************************************************************/
2617*c83a76b0SSuyog Pawar 
2618*c83a76b0SSuyog Pawar             WORD32 i4_bit_depth;
2619*c83a76b0SSuyog Pawar             WORD32 i4_shift_iq;
2620*c83a76b0SSuyog Pawar             WORD32 i4_dequant_val;
2621*c83a76b0SSuyog Pawar             WORD32 bit; /* temp boolean */
2622*c83a76b0SSuyog Pawar 
2623*c83a76b0SSuyog Pawar             UWORD16 u2_gt0_flags = *pu2_sig_coeff_buf;
2624*c83a76b0SSuyog Pawar             WORD32 sig_coeff_map = u2_gt0_flags;
2625*c83a76b0SSuyog Pawar             WORD32 gt1_flags = *(pu2_sig_coeff_buf + 1);
2626*c83a76b0SSuyog Pawar             WORD32 sign_flags = *(pu2_sig_coeff_buf + 2);
2627*c83a76b0SSuyog Pawar 
2628*c83a76b0SSuyog Pawar             WORD32 gt1_bins = 0; /* bins for coeffs with abslevel > 1 */
2629*c83a76b0SSuyog Pawar 
2630*c83a76b0SSuyog Pawar             WORD16 *pi2_dequant_coeff = ps_rdoq_ctxt->pi2_dequant_coeff;
2631*c83a76b0SSuyog Pawar             WORD16 i2_qp_rem = ps_rdoq_ctxt->i2_qp_rem;
2632*c83a76b0SSuyog Pawar             WORD32 i4_qp_div = ps_rdoq_ctxt->i4_qp_div;
2633*c83a76b0SSuyog Pawar 
2634*c83a76b0SSuyog Pawar             WORD32 sign_bins = 0; /* bins for sign flags of coded coeffs  */
2635*c83a76b0SSuyog Pawar             WORD32 num_coded = 0; /* total coeffs coded in 4x4            */
2636*c83a76b0SSuyog Pawar 
2637*c83a76b0SSuyog Pawar             /* total count of coeffs to be coded as abs level remaining */
2638*c83a76b0SSuyog Pawar             WORD32 num_coeffs_remaining = 0;
2639*c83a76b0SSuyog Pawar 
2640*c83a76b0SSuyog Pawar             /* count of coeffs to be coded as  abslevel-1 */
2641*c83a76b0SSuyog Pawar             WORD32 num_coeffs_base1 = 0;
2642*c83a76b0SSuyog Pawar             WORD32 scan_pos;
2643*c83a76b0SSuyog Pawar             WORD32 first_gt1_coeff = 0;
2644*c83a76b0SSuyog Pawar 
2645*c83a76b0SSuyog Pawar             i4_bit_depth = ps_entropy_ctxt->ps_sps->i1_bit_depth_luma_minus8 + 8;
2646*c83a76b0SSuyog Pawar             i4_shift_iq = i4_bit_depth + ps_rdoq_ctxt->i4_log2_trans_size - 5;
2647*c83a76b0SSuyog Pawar 
2648*c83a76b0SSuyog Pawar             i4_sub_blk_is_coded = 1;
2649*c83a76b0SSuyog Pawar 
2650*c83a76b0SSuyog Pawar             if((i != 0) || (0 == last_csb))
2651*c83a76b0SSuyog Pawar             {
2652*c83a76b0SSuyog Pawar                 /* sanity check, atleast one coeff is coded as csbf is set */
2653*c83a76b0SSuyog Pawar                 ASSERT(sig_coeff_map != 0);
2654*c83a76b0SSuyog Pawar             }
2655*c83a76b0SSuyog Pawar             /*Calculating the distortions produced*/
2656*c83a76b0SSuyog Pawar             {
2657*c83a76b0SSuyog Pawar                 WORD32 k, j;
2658*c83a76b0SSuyog Pawar                 WORD16 *pi2_temp_coeff =
2659*c83a76b0SSuyog Pawar                     &pi2_coeffs[scaled_blk_col + (scaled_blk_row * trans_size)];
2660*c83a76b0SSuyog Pawar                 WORD16 *pi2_temp_tr_coeff =
2661*c83a76b0SSuyog Pawar                     &pi2_tr_coeffs[scaled_blk_col + (scaled_blk_row * trans_size)];
2662*c83a76b0SSuyog Pawar                 WORD16 *pi2_temp_dequant_coeff =
2663*c83a76b0SSuyog Pawar                     &pi2_dequant_coeff[scaled_blk_col + (scaled_blk_row * trans_size)];
2664*c83a76b0SSuyog Pawar 
2665*c83a76b0SSuyog Pawar                 for(k = 0; k < 4; k++)
2666*c83a76b0SSuyog Pawar                 {
2667*c83a76b0SSuyog Pawar                     for(j = 0; j < 4; j++)
2668*c83a76b0SSuyog Pawar                     {
2669*c83a76b0SSuyog Pawar                         if(*pi2_temp_coeff)
2670*c83a76b0SSuyog Pawar                         {
2671*c83a76b0SSuyog Pawar                             /*Inverse quantizing for distortion calculation*/
2672*c83a76b0SSuyog Pawar                             if(ps_rdoq_ctxt->i4_trans_size != 4)
2673*c83a76b0SSuyog Pawar                             {
2674*c83a76b0SSuyog Pawar                                 IQUANT(
2675*c83a76b0SSuyog Pawar                                     i4_dequant_val,
2676*c83a76b0SSuyog Pawar                                     *pi2_temp_coeff,
2677*c83a76b0SSuyog Pawar                                     *pi2_temp_dequant_coeff * g_ihevc_iquant_scales[i2_qp_rem],
2678*c83a76b0SSuyog Pawar                                     i4_shift_iq,
2679*c83a76b0SSuyog Pawar                                     i4_qp_div);
2680*c83a76b0SSuyog Pawar                             }
2681*c83a76b0SSuyog Pawar                             else
2682*c83a76b0SSuyog Pawar                             {
2683*c83a76b0SSuyog Pawar                                 IQUANT_4x4(
2684*c83a76b0SSuyog Pawar                                     i4_dequant_val,
2685*c83a76b0SSuyog Pawar                                     *pi2_temp_coeff,
2686*c83a76b0SSuyog Pawar                                     *pi2_temp_dequant_coeff * g_ihevc_iquant_scales[i2_qp_rem],
2687*c83a76b0SSuyog Pawar                                     i4_shift_iq,
2688*c83a76b0SSuyog Pawar                                     i4_qp_div);
2689*c83a76b0SSuyog Pawar                             }
2690*c83a76b0SSuyog Pawar 
2691*c83a76b0SSuyog Pawar                             i8_sub_blk_coded_dist +=
2692*c83a76b0SSuyog Pawar                                 CALC_SSD_IN_TRANS_DOMAIN(*pi2_temp_tr_coeff, i4_dequant_val, 0, 0);
2693*c83a76b0SSuyog Pawar 
2694*c83a76b0SSuyog Pawar                             i8_sub_blk_not_coded_dist +=
2695*c83a76b0SSuyog Pawar                                 CALC_SSD_IN_TRANS_DOMAIN(*pi2_temp_tr_coeff, 0, 0, 0);
2696*c83a76b0SSuyog Pawar                         }
2697*c83a76b0SSuyog Pawar #if DISABLE_ZCSBF
2698*c83a76b0SSuyog Pawar                         if(abs(*pi2_temp_coeff) > 1)
2699*c83a76b0SSuyog Pawar                         {
2700*c83a76b0SSuyog Pawar                             i4_skip_zero_csbf = 1;
2701*c83a76b0SSuyog Pawar                         }
2702*c83a76b0SSuyog Pawar                         else if(abs(*pi2_temp_coeff) == 1)
2703*c83a76b0SSuyog Pawar                         {
2704*c83a76b0SSuyog Pawar                             i4_num_abs_1_coeffs++;
2705*c83a76b0SSuyog Pawar                         }
2706*c83a76b0SSuyog Pawar #endif
2707*c83a76b0SSuyog Pawar                         pi2_temp_coeff++;
2708*c83a76b0SSuyog Pawar                         pi2_temp_tr_coeff++;
2709*c83a76b0SSuyog Pawar                         pi2_temp_dequant_coeff++;
2710*c83a76b0SSuyog Pawar                     }
2711*c83a76b0SSuyog Pawar                     pi2_temp_tr_coeff += ps_rdoq_ctxt->i4_trans_size - 4;
2712*c83a76b0SSuyog Pawar                     pi2_temp_coeff += ps_rdoq_ctxt->i4_q_data_strd - 4;
2713*c83a76b0SSuyog Pawar                     pi2_dequant_coeff += ps_rdoq_ctxt->i4_trans_size - 4;
2714*c83a76b0SSuyog Pawar                 }
2715*c83a76b0SSuyog Pawar             }
2716*c83a76b0SSuyog Pawar 
2717*c83a76b0SSuyog Pawar #if DISABLE_ZCSBF
2718*c83a76b0SSuyog Pawar             i4_skip_zero_csbf = i4_skip_zero_csbf || (i4_num_abs_1_coeffs > 3);
2719*c83a76b0SSuyog Pawar #endif
2720*c83a76b0SSuyog Pawar             pu2_sig_coeff_buf += 3;
2721*c83a76b0SSuyog Pawar 
2722*c83a76b0SSuyog Pawar             scan_pos = 15;
2723*c83a76b0SSuyog Pawar             if(i == last_csb)
2724*c83a76b0SSuyog Pawar             {
2725*c83a76b0SSuyog Pawar                 /*************************************************************/
2726*c83a76b0SSuyog Pawar                 /* clear last_scan_pos for last block in scan order as this  */
2727*c83a76b0SSuyog Pawar                 /* is communicated  throught last_coeff_x and last_coeff_y   */
2728*c83a76b0SSuyog Pawar                 /*************************************************************/
2729*c83a76b0SSuyog Pawar                 WORD32 next_sig = CLZ(sig_coeff_map) + 1;
2730*c83a76b0SSuyog Pawar 
2731*c83a76b0SSuyog Pawar                 scan_pos = WORD_SIZE - next_sig;
2732*c83a76b0SSuyog Pawar 
2733*c83a76b0SSuyog Pawar                 /* prepare the bins for gt1 flags */
2734*c83a76b0SSuyog Pawar                 EXTRACT_BIT(bit, gt1_flags, scan_pos);
2735*c83a76b0SSuyog Pawar 
2736*c83a76b0SSuyog Pawar                 /* insert gt1 bin in lsb */
2737*c83a76b0SSuyog Pawar                 gt1_bins |= bit;
2738*c83a76b0SSuyog Pawar 
2739*c83a76b0SSuyog Pawar                 /* prepare the bins for sign flags */
2740*c83a76b0SSuyog Pawar                 EXTRACT_BIT(bit, sign_flags, scan_pos);
2741*c83a76b0SSuyog Pawar 
2742*c83a76b0SSuyog Pawar                 /* insert sign bin in lsb */
2743*c83a76b0SSuyog Pawar                 sign_bins |= bit;
2744*c83a76b0SSuyog Pawar 
2745*c83a76b0SSuyog Pawar                 sig_coeff_map = CLEAR_BIT(sig_coeff_map, scan_pos);
2746*c83a76b0SSuyog Pawar 
2747*c83a76b0SSuyog Pawar                 scan_pos--;
2748*c83a76b0SSuyog Pawar                 num_coded++;
2749*c83a76b0SSuyog Pawar             }
2750*c83a76b0SSuyog Pawar 
2751*c83a76b0SSuyog Pawar             /* encode the required sigcoeff flags (abslevel > 0)   */
2752*c83a76b0SSuyog Pawar             while(scan_pos >= 0)
2753*c83a76b0SSuyog Pawar             {
2754*c83a76b0SSuyog Pawar                 WORD32 y_pos_x_pos;
2755*c83a76b0SSuyog Pawar                 WORD32 sig_ctxinc = 0; /* 0 is default inc for DC coeff */
2756*c83a76b0SSuyog Pawar 
2757*c83a76b0SSuyog Pawar                 WORD32 sig_coeff;
2758*c83a76b0SSuyog Pawar 
2759*c83a76b0SSuyog Pawar                 EXTRACT_BIT(sig_coeff, sig_coeff_map, scan_pos);
2760*c83a76b0SSuyog Pawar 
2761*c83a76b0SSuyog Pawar                 /* derive the x,y pos */
2762*c83a76b0SSuyog Pawar                 y_pos_x_pos = gu1_hevce_scan4x4[scan_type][scan_pos];
2763*c83a76b0SSuyog Pawar 
2764*c83a76b0SSuyog Pawar                 /* derive the context inc as per section 9.3.3.1.4 */
2765*c83a76b0SSuyog Pawar                 if(2 == log2_tr_size)
2766*c83a76b0SSuyog Pawar                 {
2767*c83a76b0SSuyog Pawar                     /* 4x4 transform size increment uses lookup */
2768*c83a76b0SSuyog Pawar                     sig_ctxinc = gu1_hevce_sigcoeff_ctxtinc_tr4[y_pos_x_pos];
2769*c83a76b0SSuyog Pawar                 }
2770*c83a76b0SSuyog Pawar                 else if(scan_pos || i)
2771*c83a76b0SSuyog Pawar                 {
2772*c83a76b0SSuyog Pawar                     /* ctxt for AC coeff depends on curpos and neigbour csbf */
2773*c83a76b0SSuyog Pawar                     sig_ctxinc = gu1_hevce_sigcoeff_ctxtinc[nbr_csbf][y_pos_x_pos];
2774*c83a76b0SSuyog Pawar 
2775*c83a76b0SSuyog Pawar                     /* based on luma subblock pos */
2776*c83a76b0SSuyog Pawar                     sig_ctxinc += (i && is_luma) ? 3 : 0;
2777*c83a76b0SSuyog Pawar                 }
2778*c83a76b0SSuyog Pawar                 else
2779*c83a76b0SSuyog Pawar                 {
2780*c83a76b0SSuyog Pawar                     /* DC coeff has fixed context for luma and chroma */
2781*c83a76b0SSuyog Pawar                     sig_coeff_base_ctxt = is_luma ? IHEVC_CAB_COEFF_FLAG
2782*c83a76b0SSuyog Pawar                                                   : IHEVC_CAB_COEFF_FLAG + 27;
2783*c83a76b0SSuyog Pawar                 }
2784*c83a76b0SSuyog Pawar 
2785*c83a76b0SSuyog Pawar                 /*************************************************************/
2786*c83a76b0SSuyog Pawar                 /* encode sig coeff only if required                         */
2787*c83a76b0SSuyog Pawar                 /* decoder infers 0,0 coeff when all the other coeffs are 0  */
2788*c83a76b0SSuyog Pawar                 /*************************************************************/
2789*c83a76b0SSuyog Pawar                 if(scan_pos || (!infer_coeff))
2790*c83a76b0SSuyog Pawar                 {
2791*c83a76b0SSuyog Pawar                     ctxt_idx = sig_ctxinc + sig_coeff_base_ctxt;
2792*c83a76b0SSuyog Pawar                     //ret |= ihevce_cabac_encode_bin(ps_cabac, sig_coeff, ctxt_idx);
2793*c83a76b0SSuyog Pawar                     {
2794*c83a76b0SSuyog Pawar                         WORD32 state_mps = pu1_ctxt_model[ctxt_idx];
2795*c83a76b0SSuyog Pawar 
2796*c83a76b0SSuyog Pawar                         /* increment bits generated based on state and bin encoded */
2797*c83a76b0SSuyog Pawar                         ps_cabac->u4_bits_estimated_q12 +=
2798*c83a76b0SSuyog Pawar                             gau2_ihevce_cabac_bin_to_bits[state_mps ^ sig_coeff];
2799*c83a76b0SSuyog Pawar 
2800*c83a76b0SSuyog Pawar                         /* update the context model from state transition LUT */
2801*c83a76b0SSuyog Pawar                         pu1_ctxt_model[ctxt_idx] =
2802*c83a76b0SSuyog Pawar                             gau1_ihevc_next_state[(state_mps << 1) | sig_coeff];
2803*c83a76b0SSuyog Pawar                     }
2804*c83a76b0SSuyog Pawar                 }
2805*c83a76b0SSuyog Pawar 
2806*c83a76b0SSuyog Pawar                 if(sig_coeff)
2807*c83a76b0SSuyog Pawar                 {
2808*c83a76b0SSuyog Pawar                     /* prepare the bins for gt1 flags */
2809*c83a76b0SSuyog Pawar                     EXTRACT_BIT(bit, gt1_flags, scan_pos);
2810*c83a76b0SSuyog Pawar 
2811*c83a76b0SSuyog Pawar                     /* shift and insert gt1 bin in lsb */
2812*c83a76b0SSuyog Pawar                     gt1_bins <<= 1;
2813*c83a76b0SSuyog Pawar                     gt1_bins |= bit;
2814*c83a76b0SSuyog Pawar 
2815*c83a76b0SSuyog Pawar                     /* prepare the bins for sign flags */
2816*c83a76b0SSuyog Pawar                     EXTRACT_BIT(bit, sign_flags, scan_pos);
2817*c83a76b0SSuyog Pawar 
2818*c83a76b0SSuyog Pawar                     /* shift and insert sign bin in lsb */
2819*c83a76b0SSuyog Pawar                     sign_bins <<= 1;
2820*c83a76b0SSuyog Pawar                     sign_bins |= bit;
2821*c83a76b0SSuyog Pawar 
2822*c83a76b0SSuyog Pawar                     num_coded++;
2823*c83a76b0SSuyog Pawar 
2824*c83a76b0SSuyog Pawar                     /* 0,0 coeff can no more be inferred :( */
2825*c83a76b0SSuyog Pawar                     infer_coeff = 0;
2826*c83a76b0SSuyog Pawar                 }
2827*c83a76b0SSuyog Pawar 
2828*c83a76b0SSuyog Pawar                 scan_pos--;
2829*c83a76b0SSuyog Pawar             }
2830*c83a76b0SSuyog Pawar 
2831*c83a76b0SSuyog Pawar             s_backup_ctxt.au1_ctxt_to_backup[SIG_COEFF] = 1;
2832*c83a76b0SSuyog Pawar 
2833*c83a76b0SSuyog Pawar             /****************************************************************/
2834*c83a76b0SSuyog Pawar             /* encode the abs level greater than 1 bins; Section 7.3.13     */
2835*c83a76b0SSuyog Pawar             /* These have already been prepared during sig_coeff_map encode */
2836*c83a76b0SSuyog Pawar             /* Context modelling done as per section 9.3.3.1.5              */
2837*c83a76b0SSuyog Pawar             /****************************************************************/
2838*c83a76b0SSuyog Pawar             {
2839*c83a76b0SSuyog Pawar                 WORD32 j;
2840*c83a76b0SSuyog Pawar 
2841*c83a76b0SSuyog Pawar                 /* context set based on luma subblock pos */
2842*c83a76b0SSuyog Pawar                 WORD32 ctxt_set = (i && is_luma) ? 2 : 0;
2843*c83a76b0SSuyog Pawar 
2844*c83a76b0SSuyog Pawar                 /* count of coeffs with abslevel > 1; max of 8 to be coded */
2845*c83a76b0SSuyog Pawar                 WORD32 num_gt1_bins = MIN(8, num_coded);
2846*c83a76b0SSuyog Pawar 
2847*c83a76b0SSuyog Pawar                 if(num_coded > 8)
2848*c83a76b0SSuyog Pawar                 {
2849*c83a76b0SSuyog Pawar                     /* pull back the bins to required number */
2850*c83a76b0SSuyog Pawar                     gt1_bins >>= (num_coded - 8);
2851*c83a76b0SSuyog Pawar 
2852*c83a76b0SSuyog Pawar                     num_coeffs_remaining += (num_coded - 8);
2853*c83a76b0SSuyog Pawar                     num_coeffs_base1 = (num_coded - 8);
2854*c83a76b0SSuyog Pawar                 }
2855*c83a76b0SSuyog Pawar 
2856*c83a76b0SSuyog Pawar                 /* See section 9.3.3.1.5           */
2857*c83a76b0SSuyog Pawar                 ctxt_set += (0 == gt1_ctxt) ? 1 : 0;
2858*c83a76b0SSuyog Pawar 
2859*c83a76b0SSuyog Pawar                 gt1_ctxt = 1;
2860*c83a76b0SSuyog Pawar 
2861*c83a76b0SSuyog Pawar                 for(j = num_gt1_bins - 1; j >= 0; j--)
2862*c83a76b0SSuyog Pawar                 {
2863*c83a76b0SSuyog Pawar                     /* Encodet the abs level gt1 bins */
2864*c83a76b0SSuyog Pawar                     ctxt_idx = (ctxt_set * 4) + abs_gt1_base_ctxt + gt1_ctxt;
2865*c83a76b0SSuyog Pawar 
2866*c83a76b0SSuyog Pawar                     EXTRACT_BIT(bit, gt1_bins, j);
2867*c83a76b0SSuyog Pawar 
2868*c83a76b0SSuyog Pawar                     //ret |= ihevce_cabac_encode_bin(ps_cabac, bit, ctxt_idx);
2869*c83a76b0SSuyog Pawar                     {
2870*c83a76b0SSuyog Pawar                         WORD32 state_mps = pu1_ctxt_model[ctxt_idx];
2871*c83a76b0SSuyog Pawar 
2872*c83a76b0SSuyog Pawar                         /* increment bits generated based on state and bin encoded */
2873*c83a76b0SSuyog Pawar                         ps_cabac->u4_bits_estimated_q12 +=
2874*c83a76b0SSuyog Pawar                             gau2_ihevce_cabac_bin_to_bits[state_mps ^ bit];
2875*c83a76b0SSuyog Pawar 
2876*c83a76b0SSuyog Pawar                         /* update the context model from state transition LUT */
2877*c83a76b0SSuyog Pawar                         pu1_ctxt_model[ctxt_idx] = gau1_ihevc_next_state[(state_mps << 1) | bit];
2878*c83a76b0SSuyog Pawar                     }
2879*c83a76b0SSuyog Pawar 
2880*c83a76b0SSuyog Pawar                     if(bit)
2881*c83a76b0SSuyog Pawar                     {
2882*c83a76b0SSuyog Pawar                         gt1_ctxt = 0;
2883*c83a76b0SSuyog Pawar                         num_coeffs_remaining++;
2884*c83a76b0SSuyog Pawar                     }
2885*c83a76b0SSuyog Pawar                     else if(gt1_ctxt && (gt1_ctxt < 3))
2886*c83a76b0SSuyog Pawar                     {
2887*c83a76b0SSuyog Pawar                         gt1_ctxt++;
2888*c83a76b0SSuyog Pawar                     }
2889*c83a76b0SSuyog Pawar                 }
2890*c83a76b0SSuyog Pawar                 s_backup_ctxt.au1_ctxt_to_backup[GRTR_THAN_1] = 1;
2891*c83a76b0SSuyog Pawar                 /*************************************************************/
2892*c83a76b0SSuyog Pawar                 /* encode abs level greater than 2 bin; Section 7.3.13       */
2893*c83a76b0SSuyog Pawar                 /*************************************************************/
2894*c83a76b0SSuyog Pawar                 if(gt1_bins)
2895*c83a76b0SSuyog Pawar                 {
2896*c83a76b0SSuyog Pawar                     WORD32 gt2_bin;
2897*c83a76b0SSuyog Pawar 
2898*c83a76b0SSuyog Pawar                     first_gt1_coeff = pu2_sig_coeff_buf[0] + 1;
2899*c83a76b0SSuyog Pawar                     gt2_bin = (first_gt1_coeff > 2);
2900*c83a76b0SSuyog Pawar 
2901*c83a76b0SSuyog Pawar                     /* atleast one level > 2 */
2902*c83a76b0SSuyog Pawar                     ctxt_idx = IHEVC_CAB_COEFABS_GRTR2_FLAG;
2903*c83a76b0SSuyog Pawar 
2904*c83a76b0SSuyog Pawar                     ctxt_idx += (is_luma) ? ctxt_set : (ctxt_set + 4);
2905*c83a76b0SSuyog Pawar 
2906*c83a76b0SSuyog Pawar                     //ret |= ihevce_cabac_encode_bin(ps_cabac, gt2_bin, ctxt_idx);
2907*c83a76b0SSuyog Pawar                     {
2908*c83a76b0SSuyog Pawar                         WORD32 state_mps = pu1_ctxt_model[ctxt_idx];
2909*c83a76b0SSuyog Pawar 
2910*c83a76b0SSuyog Pawar                         /* increment bits generated based on state and bin encoded */
2911*c83a76b0SSuyog Pawar                         ps_cabac->u4_bits_estimated_q12 +=
2912*c83a76b0SSuyog Pawar                             gau2_ihevce_cabac_bin_to_bits[state_mps ^ gt2_bin];
2913*c83a76b0SSuyog Pawar 
2914*c83a76b0SSuyog Pawar                         /* update the context model from state transition LUT */
2915*c83a76b0SSuyog Pawar                         pu1_ctxt_model[ctxt_idx] =
2916*c83a76b0SSuyog Pawar                             gau1_ihevc_next_state[(state_mps << 1) | gt2_bin];
2917*c83a76b0SSuyog Pawar                     }
2918*c83a76b0SSuyog Pawar 
2919*c83a76b0SSuyog Pawar                     if(!gt2_bin)
2920*c83a76b0SSuyog Pawar                     {
2921*c83a76b0SSuyog Pawar                         /* sanity check */
2922*c83a76b0SSuyog Pawar                         ASSERT(first_gt1_coeff == 2);
2923*c83a76b0SSuyog Pawar 
2924*c83a76b0SSuyog Pawar                         /* no need to send this coeff as bypass bins */
2925*c83a76b0SSuyog Pawar                         pu2_sig_coeff_buf++;
2926*c83a76b0SSuyog Pawar                         num_coeffs_remaining--;
2927*c83a76b0SSuyog Pawar                     }
2928*c83a76b0SSuyog Pawar                     s_backup_ctxt.au1_ctxt_to_backup[GRTR_THAN_2] = 1;
2929*c83a76b0SSuyog Pawar                 }
2930*c83a76b0SSuyog Pawar             }
2931*c83a76b0SSuyog Pawar 
2932*c83a76b0SSuyog Pawar             /*************************************************************/
2933*c83a76b0SSuyog Pawar             /* encode the coeff signs and abs remaing levels             */
2934*c83a76b0SSuyog Pawar             /*************************************************************/
2935*c83a76b0SSuyog Pawar             if(num_coded)
2936*c83a76b0SSuyog Pawar             {
2937*c83a76b0SSuyog Pawar                 WORD32 base_level;
2938*c83a76b0SSuyog Pawar                 WORD32 rice_param = 0;
2939*c83a76b0SSuyog Pawar                 WORD32 j;
2940*c83a76b0SSuyog Pawar 
2941*c83a76b0SSuyog Pawar                 /*************************************************************/
2942*c83a76b0SSuyog Pawar                 /* encode the coeff signs populated in sign_bins             */
2943*c83a76b0SSuyog Pawar                 /*************************************************************/
2944*c83a76b0SSuyog Pawar                 if(num_coded > 0)
2945*c83a76b0SSuyog Pawar                 {
2946*c83a76b0SSuyog Pawar                     ret |= ihevce_cabac_encode_bypass_bins(ps_cabac, sign_bins, num_coded);
2947*c83a76b0SSuyog Pawar                 }
2948*c83a76b0SSuyog Pawar                 /*************************************************************/
2949*c83a76b0SSuyog Pawar                 /* encode the coeff_abs_level_remaining as TR / EGK bins     */
2950*c83a76b0SSuyog Pawar                 /* See section 9.3.2.7 for details                           */
2951*c83a76b0SSuyog Pawar                 /*************************************************************/
2952*c83a76b0SSuyog Pawar 
2953*c83a76b0SSuyog Pawar                 /* first remaining coeff baselevel */
2954*c83a76b0SSuyog Pawar                 if(first_gt1_coeff > 2)
2955*c83a76b0SSuyog Pawar                 {
2956*c83a76b0SSuyog Pawar                     base_level = 3;
2957*c83a76b0SSuyog Pawar                 }
2958*c83a76b0SSuyog Pawar                 else if(num_coeffs_remaining > num_coeffs_base1)
2959*c83a76b0SSuyog Pawar                 {
2960*c83a76b0SSuyog Pawar                     /* atleast one coeff in first 8 is gt > 1 */
2961*c83a76b0SSuyog Pawar                     base_level = 2;
2962*c83a76b0SSuyog Pawar                 }
2963*c83a76b0SSuyog Pawar                 else
2964*c83a76b0SSuyog Pawar                 {
2965*c83a76b0SSuyog Pawar                     /* all coeffs have base of 1 */
2966*c83a76b0SSuyog Pawar                     base_level = 1;
2967*c83a76b0SSuyog Pawar                 }
2968*c83a76b0SSuyog Pawar 
2969*c83a76b0SSuyog Pawar                 for(j = 0; j < num_coeffs_remaining; j++)
2970*c83a76b0SSuyog Pawar                 {
2971*c83a76b0SSuyog Pawar                     WORD32 abs_coeff = pu2_sig_coeff_buf[0] + 1;
2972*c83a76b0SSuyog Pawar                     WORD32 abs_coeff_rem;
2973*c83a76b0SSuyog Pawar                     WORD32 rice_max = (4 << rice_param);
2974*c83a76b0SSuyog Pawar 
2975*c83a76b0SSuyog Pawar                     pu2_sig_coeff_buf++;
2976*c83a76b0SSuyog Pawar 
2977*c83a76b0SSuyog Pawar                     /* sanity check */
2978*c83a76b0SSuyog Pawar                     ASSERT(abs_coeff >= base_level);
2979*c83a76b0SSuyog Pawar 
2980*c83a76b0SSuyog Pawar                     abs_coeff_rem = (abs_coeff - base_level);
2981*c83a76b0SSuyog Pawar 
2982*c83a76b0SSuyog Pawar                     /* TODO://HM-8.0-dev uses (3 << rice_param) as rice_max */
2983*c83a76b0SSuyog Pawar                     /* TODO://HM-8.0-dev does either TR or EGK but not both */
2984*c83a76b0SSuyog Pawar                     if(abs_coeff_rem >= rice_max)
2985*c83a76b0SSuyog Pawar                     {
2986*c83a76b0SSuyog Pawar                         UWORD32 u4_suffix = (abs_coeff_rem - rice_max);
2987*c83a76b0SSuyog Pawar 
2988*c83a76b0SSuyog Pawar                         /* coeff exceeds max rice limit                    */
2989*c83a76b0SSuyog Pawar                         /* encode the TR prefix as tunary code             */
2990*c83a76b0SSuyog Pawar                         /* prefix = 1111 as (rice_max >> rice_praram) = 4  */
2991*c83a76b0SSuyog Pawar                         ret |= ihevce_cabac_encode_bypass_bins(ps_cabac, 0xF, 4);
2992*c83a76b0SSuyog Pawar 
2993*c83a76b0SSuyog Pawar                         /* encode the exponential golomb code suffix */
2994*c83a76b0SSuyog Pawar                         ret |= ihevce_cabac_encode_egk(ps_cabac, u4_suffix, (rice_param + 1));
2995*c83a76b0SSuyog Pawar                     }
2996*c83a76b0SSuyog Pawar                     else
2997*c83a76b0SSuyog Pawar                     {
2998*c83a76b0SSuyog Pawar                         /* code coeff as truncated rice code  */
2999*c83a76b0SSuyog Pawar                         ret |= ihevce_cabac_encode_trunc_rice(
3000*c83a76b0SSuyog Pawar                             ps_cabac, abs_coeff_rem, rice_param, rice_max);
3001*c83a76b0SSuyog Pawar                     }
3002*c83a76b0SSuyog Pawar 
3003*c83a76b0SSuyog Pawar                     /* update the rice param based on coeff level */
3004*c83a76b0SSuyog Pawar                     if((abs_coeff > (3 << rice_param)) && (rice_param < 4))
3005*c83a76b0SSuyog Pawar                     {
3006*c83a76b0SSuyog Pawar                         rice_param++;
3007*c83a76b0SSuyog Pawar                     }
3008*c83a76b0SSuyog Pawar 
3009*c83a76b0SSuyog Pawar                     /* change base level to 1 if more than 8 coded coeffs */
3010*c83a76b0SSuyog Pawar                     if((j + 1) < (num_coeffs_remaining - num_coeffs_base1))
3011*c83a76b0SSuyog Pawar                     {
3012*c83a76b0SSuyog Pawar                         base_level = 2;
3013*c83a76b0SSuyog Pawar                     }
3014*c83a76b0SSuyog Pawar                     else
3015*c83a76b0SSuyog Pawar                     {
3016*c83a76b0SSuyog Pawar                         base_level = 1;
3017*c83a76b0SSuyog Pawar                     }
3018*c83a76b0SSuyog Pawar                 }
3019*c83a76b0SSuyog Pawar             }
3020*c83a76b0SSuyog Pawar 
3021*c83a76b0SSuyog Pawar             i4_sub_blk_coded_bits = ps_cabac->u4_bits_estimated_q12;
3022*c83a76b0SSuyog Pawar             /**********************************************************/
3023*c83a76b0SSuyog Pawar             /**********************************************************/
3024*c83a76b0SSuyog Pawar             /**********************************************************/
3025*c83a76b0SSuyog Pawar             /*Decide whether sub block should be coded or not*/
3026*c83a76b0SSuyog Pawar             /**********************************************************/
3027*c83a76b0SSuyog Pawar             /**********************************************************/
3028*c83a76b0SSuyog Pawar             /**********************************************************/
3029*c83a76b0SSuyog Pawar             i8_sub_blk_coded_metric = CALC_CUMMUL_SSD_IN_TRANS_DOMAIN(
3030*c83a76b0SSuyog Pawar                                           i8_sub_blk_coded_dist, 0, i4_round_val, i4_shift_val) +
3031*c83a76b0SSuyog Pawar                                       COMPUTE_RATE_COST_CLIP30_RDOQ(
3032*c83a76b0SSuyog Pawar                                           i4_sub_blk_coded_bits,
3033*c83a76b0SSuyog Pawar                                           ps_rdoq_ctxt->i8_cl_ssd_lambda_qf,
3034*c83a76b0SSuyog Pawar                                           (LAMBDA_Q_SHIFT + CABAC_FRAC_BITS_Q));
3035*c83a76b0SSuyog Pawar             i8_sub_blk_not_coded_metric =
3036*c83a76b0SSuyog Pawar                 CALC_CUMMUL_SSD_IN_TRANS_DOMAIN(
3037*c83a76b0SSuyog Pawar                     i8_sub_blk_not_coded_dist, 0, i4_round_val, i4_shift_val) +
3038*c83a76b0SSuyog Pawar                 COMPUTE_RATE_COST_CLIP30_RDOQ(
3039*c83a76b0SSuyog Pawar                     i4_sub_blk_not_coded_bits,
3040*c83a76b0SSuyog Pawar                     ps_rdoq_ctxt->i8_cl_ssd_lambda_qf,
3041*c83a76b0SSuyog Pawar                     (LAMBDA_Q_SHIFT + CABAC_FRAC_BITS_Q));
3042*c83a76b0SSuyog Pawar 
3043*c83a76b0SSuyog Pawar #if DISABLE_ZCSBF
3044*c83a76b0SSuyog Pawar             if(((i8_sub_blk_not_coded_metric < i8_sub_blk_coded_metric) ||
3045*c83a76b0SSuyog Pawar                 (i4_sub_blk_is_coded == 0)) &&
3046*c83a76b0SSuyog Pawar                (i4_skip_zero_csbf == 0))
3047*c83a76b0SSuyog Pawar #else
3048*c83a76b0SSuyog Pawar             if((i8_sub_blk_not_coded_metric < i8_sub_blk_coded_metric) ||
3049*c83a76b0SSuyog Pawar                (i4_sub_blk_is_coded == 0))
3050*c83a76b0SSuyog Pawar #endif
3051*c83a76b0SSuyog Pawar             {
3052*c83a76b0SSuyog Pawar #if OPT_MEMCPY
3053*c83a76b0SSuyog Pawar                 ihevce_copy_backup_ctxt(
3054*c83a76b0SSuyog Pawar                     (void *)ps_cabac,
3055*c83a76b0SSuyog Pawar                     (void *)&s_sub_blk_not_coded_cabac_ctxt,
3056*c83a76b0SSuyog Pawar                     (void *)&s_backup_ctxt,
3057*c83a76b0SSuyog Pawar                     (void *)&s_backup_ctxt_sub_blk_not_coded);
3058*c83a76b0SSuyog Pawar #else
3059*c83a76b0SSuyog Pawar                 memcpy(ps_cabac, &s_sub_blk_not_coded_cabac_ctxt, sizeof(cab_ctxt_t));
3060*c83a76b0SSuyog Pawar #endif
3061*c83a76b0SSuyog Pawar                 scan_pos = 15;
3062*c83a76b0SSuyog Pawar                 i4_sub_blk_is_coded = 0;
3063*c83a76b0SSuyog Pawar 
3064*c83a76b0SSuyog Pawar                 {
3065*c83a76b0SSuyog Pawar                     WORD32 k, j;
3066*c83a76b0SSuyog Pawar                     WORD16 *pi2_temp_coeff =
3067*c83a76b0SSuyog Pawar                         &pi2_coeffs[scaled_blk_col + (scaled_blk_row * ps_rdoq_ctxt->i4_q_data_strd)];
3068*c83a76b0SSuyog Pawar                     WORD16 *pi2_temp_iquant_coeff =
3069*c83a76b0SSuyog Pawar                         &ps_rdoq_ctxt->pi2_iquant_coeffs
3070*c83a76b0SSuyog Pawar                              [scaled_blk_col + (scaled_blk_row * ps_rdoq_ctxt->i4_iq_data_strd)];
3071*c83a76b0SSuyog Pawar                     for(k = 0; k < 4; k++)
3072*c83a76b0SSuyog Pawar                     {
3073*c83a76b0SSuyog Pawar                         for(j = 0; j < 4; j++)
3074*c83a76b0SSuyog Pawar                         {
3075*c83a76b0SSuyog Pawar                             *pi2_temp_coeff = 0;
3076*c83a76b0SSuyog Pawar                             *pi2_temp_iquant_coeff = 0;
3077*c83a76b0SSuyog Pawar 
3078*c83a76b0SSuyog Pawar                             pi2_temp_coeff++;
3079*c83a76b0SSuyog Pawar                             pi2_temp_iquant_coeff++;
3080*c83a76b0SSuyog Pawar                         }
3081*c83a76b0SSuyog Pawar                         pi2_temp_coeff += ps_rdoq_ctxt->i4_q_data_strd - 4;
3082*c83a76b0SSuyog Pawar                         pi2_temp_iquant_coeff += ps_rdoq_ctxt->i4_iq_data_strd - 4;
3083*c83a76b0SSuyog Pawar                     }
3084*c83a76b0SSuyog Pawar                 }
3085*c83a76b0SSuyog Pawar 
3086*c83a76b0SSuyog Pawar                 /* If the csb to be masked is the last csb, then we should
3087*c83a76b0SSuyog Pawar                  * signal last x and last y from the next coded sub_blk */
3088*c83a76b0SSuyog Pawar                 if(i == last_csb)
3089*c83a76b0SSuyog Pawar                 {
3090*c83a76b0SSuyog Pawar                     pu1_coeff_buf_hdr = (UWORD8 *)pu2_sig_coeff_buf;
3091*c83a76b0SSuyog Pawar 
3092*c83a76b0SSuyog Pawar                     ps_rdoq_ctxt->pu1_csbf_buf[pi4_subBlock2csbfId_map[pu1_trans_table[i]]] = 0;
3093*c83a76b0SSuyog Pawar                     last_csb = ihevce_find_new_last_csb(
3094*c83a76b0SSuyog Pawar                         pi4_subBlock2csbfId_map,
3095*c83a76b0SSuyog Pawar                         i,
3096*c83a76b0SSuyog Pawar                         (void *)ps_rdoq_ctxt,
3097*c83a76b0SSuyog Pawar                         pu1_trans_table,
3098*c83a76b0SSuyog Pawar                         pu1_csb_table,
3099*c83a76b0SSuyog Pawar                         pi2_coeffs,
3100*c83a76b0SSuyog Pawar                         shift_value,
3101*c83a76b0SSuyog Pawar                         mask_value,
3102*c83a76b0SSuyog Pawar                         &pu1_coeff_buf_hdr);
3103*c83a76b0SSuyog Pawar                     /*We are in a for loop. This means that the decrement to i happens immediately right
3104*c83a76b0SSuyog Pawar                       at the end of the for loop. This would decrement the value of i to (last_csb - 1).
3105*c83a76b0SSuyog Pawar                       Hence we increment i by 1, so that after the decrement i becomes last_csb.*/
3106*c83a76b0SSuyog Pawar                     i = last_csb + 1;
3107*c83a76b0SSuyog Pawar                     pu1_last_sig_coeff_x = &pu1_coeff_buf_hdr[0];
3108*c83a76b0SSuyog Pawar                     pu1_last_sig_coeff_y = &pu1_coeff_buf_hdr[1];
3109*c83a76b0SSuyog Pawar                     scan_type = pu1_coeff_buf_hdr[2];
3110*c83a76b0SSuyog Pawar                     pu2_sig_coeff_buf = (UWORD16 *)(pu1_coeff_buf_hdr + 4);
3111*c83a76b0SSuyog Pawar                 }
3112*c83a76b0SSuyog Pawar                 i8_tu_coded_dist += i8_sub_blk_not_coded_dist;
3113*c83a76b0SSuyog Pawar                 i4_tu_coded_bits += i4_sub_blk_not_coded_bits;
3114*c83a76b0SSuyog Pawar             }
3115*c83a76b0SSuyog Pawar             else
3116*c83a76b0SSuyog Pawar             {
3117*c83a76b0SSuyog Pawar                 ps_rdoq_ctxt->i1_tu_is_coded = 1;
3118*c83a76b0SSuyog Pawar                 temp_gt1_ctxt = gt1_ctxt;
3119*c83a76b0SSuyog Pawar 
3120*c83a76b0SSuyog Pawar                 i8_tu_coded_dist += i8_sub_blk_coded_dist;
3121*c83a76b0SSuyog Pawar                 i4_tu_coded_bits += i4_sub_blk_coded_bits;
3122*c83a76b0SSuyog Pawar             }
3123*c83a76b0SSuyog Pawar #if DISABLE_ZCSBF
3124*c83a76b0SSuyog Pawar             i4_skip_zero_cbf = i4_skip_zero_cbf || i4_skip_zero_csbf;
3125*c83a76b0SSuyog Pawar #endif
3126*c83a76b0SSuyog Pawar             /*Cumulating the distortion for the entire TU*/
3127*c83a76b0SSuyog Pawar             i8_tu_not_coded_dist += i8_sub_blk_not_coded_dist;
3128*c83a76b0SSuyog Pawar             //i4_tu_coded_dist                += i4_sub_blk_coded_dist;
3129*c83a76b0SSuyog Pawar             //i4_tu_coded_bits                += i4_sub_blk_coded_bits;
3130*c83a76b0SSuyog Pawar             i8_sub_blk_not_coded_dist = 0;
3131*c83a76b0SSuyog Pawar             i4_sub_blk_not_coded_bits = 0;
3132*c83a76b0SSuyog Pawar             i8_sub_blk_coded_dist = 0;
3133*c83a76b0SSuyog Pawar             i4_sub_blk_coded_bits = 0;
3134*c83a76b0SSuyog Pawar 
3135*c83a76b0SSuyog Pawar             if(i4_sub_blk_is_coded)
3136*c83a76b0SSuyog Pawar             {
3137*c83a76b0SSuyog Pawar                 ps_rdoq_ctxt->pu1_csbf_buf[pi4_subBlock2csbfId_map[pu1_trans_table[i]]] = 1;
3138*c83a76b0SSuyog Pawar                 temp_zero_col = (temp_zero_col) | (0xF << scaled_blk_col);
3139*c83a76b0SSuyog Pawar                 temp_zero_row = (temp_zero_row) | (0xF << scaled_blk_row);
3140*c83a76b0SSuyog Pawar             }
3141*c83a76b0SSuyog Pawar             else
3142*c83a76b0SSuyog Pawar             {
3143*c83a76b0SSuyog Pawar                 if(!((ps_rdoq_ctxt->i1_tu_is_coded == 1) && (i == 0)))
3144*c83a76b0SSuyog Pawar                 {
3145*c83a76b0SSuyog Pawar                     ps_rdoq_ctxt->pu1_csbf_buf[pi4_subBlock2csbfId_map[pu1_trans_table[i]]] = 0;
3146*c83a76b0SSuyog Pawar                 }
3147*c83a76b0SSuyog Pawar             }
3148*c83a76b0SSuyog Pawar         }
3149*c83a76b0SSuyog Pawar     }
3150*c83a76b0SSuyog Pawar 
3151*c83a76b0SSuyog Pawar     /*tap texture bits*/
3152*c83a76b0SSuyog Pawar     {
3153*c83a76b0SSuyog Pawar         ps_cabac->u4_texture_bits_estimated_q12 +=
3154*c83a76b0SSuyog Pawar             (ps_cabac->u4_bits_estimated_q12 - temp_tex_bits_q12);
3155*c83a76b0SSuyog Pawar     }
3156*c83a76b0SSuyog Pawar 
3157*c83a76b0SSuyog Pawar     i8_tu_not_coded_dist =
3158*c83a76b0SSuyog Pawar         CALC_CUMMUL_SSD_IN_TRANS_DOMAIN(i8_tu_not_coded_dist, 0, i4_round_val, i4_shift_val);
3159*c83a76b0SSuyog Pawar 
3160*c83a76b0SSuyog Pawar     /* i4_tu_coded_dist = CALC_CUMMUL_SSD_IN_TRANS_DOMAIN(
3161*c83a76b0SSuyog Pawar         i4_tu_coded_dist, 0, i4_round_val, i4_shift_val); */
3162*c83a76b0SSuyog Pawar     *pi8_tu_coded_dist = i8_tu_coded_dist;
3163*c83a76b0SSuyog Pawar     *pi8_tu_not_coded_dist = i8_tu_not_coded_dist;
3164*c83a76b0SSuyog Pawar #if DISABLE_ZCSBF
3165*c83a76b0SSuyog Pawar     if(i4_skip_zero_cbf == 1)
3166*c83a76b0SSuyog Pawar     {
3167*c83a76b0SSuyog Pawar         *pi8_tu_not_coded_dist = 0x7FFFFFFF;
3168*c83a76b0SSuyog Pawar     }
3169*c83a76b0SSuyog Pawar #endif
3170*c83a76b0SSuyog Pawar 
3171*c83a76b0SSuyog Pawar     *ps_rdoq_ctxt->pi4_zero_col = ~temp_zero_col;
3172*c83a76b0SSuyog Pawar     *ps_rdoq_ctxt->pi4_zero_row = ~temp_zero_row;
3173*c83a76b0SSuyog Pawar 
3174*c83a76b0SSuyog Pawar     return (ret);
3175*c83a76b0SSuyog Pawar }
3176*c83a76b0SSuyog Pawar 
3177*c83a76b0SSuyog Pawar /**
3178*c83a76b0SSuyog Pawar ******************************************************************************
3179*c83a76b0SSuyog Pawar *
3180*c83a76b0SSuyog Pawar *  @brief Codes all the sig coeffs as 0
3181*c83a76b0SSuyog Pawar *
3182*c83a76b0SSuyog Pawar *  @param[in]   i
3183*c83a76b0SSuyog Pawar *  Index of the current csb
3184*c83a76b0SSuyog Pawar *
3185*c83a76b0SSuyog Pawar *  @param[in]   pu1_trans_table
3186*c83a76b0SSuyog Pawar *  Pointer to the trans table
3187*c83a76b0SSuyog Pawar *
3188*c83a76b0SSuyog Pawar *  @param[in]  scan_type
3189*c83a76b0SSuyog Pawar *  Determines the scan order
3190*c83a76b0SSuyog Pawar *
3191*c83a76b0SSuyog Pawar *  @param[in]  infer_coeff
3192*c83a76b0SSuyog Pawar *  Indicates whether the 0,0 coeff can be inferred or not
3193*c83a76b0SSuyog Pawar *
3194*c83a76b0SSuyog Pawar *  @param[in]   nbr_csbf
3195*c83a76b0SSuyog Pawar *  Talks about if the neighboour csbs(right and bottom) are coded or not
3196*c83a76b0SSuyog Pawar *
3197*c83a76b0SSuyog Pawar *  @param[in]    ps_cabac
3198*c83a76b0SSuyog Pawar *  Cabac state
3199*c83a76b0SSuyog Pawar *
3200*c83a76b0SSuyog Pawar *  @param[out]    pi4_tu_not_coded_dist
3201*c83a76b0SSuyog Pawar *  The distortion when the entire TU is not coded(all coeffs are set to 0) is stored here
3202*c83a76b0SSuyog Pawar *
3203*c83a76b0SSuyog Pawar *  @return    The number of bits generated when the 0th sub blk is coded as all 0s
3204*c83a76b0SSuyog Pawar *             This is the cumulate bits(i.e. for all blocks in the TU), and not only
3205*c83a76b0SSuyog Pawar *             the bits generated for this block
3206*c83a76b0SSuyog Pawar *
3207*c83a76b0SSuyog Pawar ******************************************************************************
3208*c83a76b0SSuyog Pawar */
ihevce_code_all_sig_coeffs_as_0_explicitly(void * pv_rdoq_ctxt,WORD32 i,UWORD8 * pu1_trans_table,WORD32 is_luma,WORD32 scan_type,WORD32 infer_coeff,WORD32 nbr_csbf,cab_ctxt_t * ps_cabac)3209*c83a76b0SSuyog Pawar WORD32 ihevce_code_all_sig_coeffs_as_0_explicitly(
3210*c83a76b0SSuyog Pawar     void *pv_rdoq_ctxt,
3211*c83a76b0SSuyog Pawar     WORD32 i,
3212*c83a76b0SSuyog Pawar     UWORD8 *pu1_trans_table,
3213*c83a76b0SSuyog Pawar     WORD32 is_luma,
3214*c83a76b0SSuyog Pawar     WORD32 scan_type,
3215*c83a76b0SSuyog Pawar     WORD32 infer_coeff,
3216*c83a76b0SSuyog Pawar     WORD32 nbr_csbf,
3217*c83a76b0SSuyog Pawar     cab_ctxt_t *ps_cabac)
3218*c83a76b0SSuyog Pawar {
3219*c83a76b0SSuyog Pawar     WORD32 sig_coeff_base_ctxt;
3220*c83a76b0SSuyog Pawar     WORD32 scan_pos = 15;
3221*c83a76b0SSuyog Pawar     WORD32 ctxt_idx;
3222*c83a76b0SSuyog Pawar     WORD32 ret = 0;
3223*c83a76b0SSuyog Pawar 
3224*c83a76b0SSuyog Pawar     rdoq_sbh_ctxt_t *ps_rdoq_ctxt = (rdoq_sbh_ctxt_t *)pv_rdoq_ctxt;
3225*c83a76b0SSuyog Pawar 
3226*c83a76b0SSuyog Pawar     WORD32 log2_tr_size = ps_rdoq_ctxt->i4_log2_trans_size;
3227*c83a76b0SSuyog Pawar 
3228*c83a76b0SSuyog Pawar     (void)pu1_trans_table;
3229*c83a76b0SSuyog Pawar     if(is_luma)
3230*c83a76b0SSuyog Pawar     {
3231*c83a76b0SSuyog Pawar         sig_coeff_base_ctxt = IHEVC_CAB_COEFF_FLAG;
3232*c83a76b0SSuyog Pawar         if(3 == log2_tr_size)
3233*c83a76b0SSuyog Pawar         {
3234*c83a76b0SSuyog Pawar             /* 8x8 transform size */
3235*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += (scan_type == SCAN_DIAG_UPRIGHT) ? 9 : 15;
3236*c83a76b0SSuyog Pawar         }
3237*c83a76b0SSuyog Pawar         else if(3 < log2_tr_size)
3238*c83a76b0SSuyog Pawar         {
3239*c83a76b0SSuyog Pawar             /* larger transform sizes */
3240*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 21;
3241*c83a76b0SSuyog Pawar         }
3242*c83a76b0SSuyog Pawar     }
3243*c83a76b0SSuyog Pawar     else
3244*c83a76b0SSuyog Pawar     {
3245*c83a76b0SSuyog Pawar         /* chroma context initializations */
3246*c83a76b0SSuyog Pawar         sig_coeff_base_ctxt = IHEVC_CAB_COEFF_FLAG + 27;
3247*c83a76b0SSuyog Pawar 
3248*c83a76b0SSuyog Pawar         if(3 == log2_tr_size)
3249*c83a76b0SSuyog Pawar         {
3250*c83a76b0SSuyog Pawar             /* 8x8 transform size */
3251*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 9;
3252*c83a76b0SSuyog Pawar         }
3253*c83a76b0SSuyog Pawar         else if(3 < log2_tr_size)
3254*c83a76b0SSuyog Pawar         {
3255*c83a76b0SSuyog Pawar             /* larger transform sizes */
3256*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt += 12;
3257*c83a76b0SSuyog Pawar         }
3258*c83a76b0SSuyog Pawar     }
3259*c83a76b0SSuyog Pawar     while(scan_pos >= 0)
3260*c83a76b0SSuyog Pawar     {
3261*c83a76b0SSuyog Pawar         WORD32 sig_ctxinc = 0; /* 0 is default inc for DC coeff */
3262*c83a76b0SSuyog Pawar         WORD32 sig_coeff = 0;
3263*c83a76b0SSuyog Pawar         /* derive the x,y pos */
3264*c83a76b0SSuyog Pawar         WORD32 y_pos_x_pos = gu1_hevce_scan4x4[scan_type][scan_pos];
3265*c83a76b0SSuyog Pawar 
3266*c83a76b0SSuyog Pawar         /* derive the context inc as per section 9.3.3.1.4 */
3267*c83a76b0SSuyog Pawar         if(2 == log2_tr_size)
3268*c83a76b0SSuyog Pawar         {
3269*c83a76b0SSuyog Pawar             /* 4x4 transform size increment uses lookup */
3270*c83a76b0SSuyog Pawar             sig_ctxinc = gu1_hevce_sigcoeff_ctxtinc_tr4[y_pos_x_pos];
3271*c83a76b0SSuyog Pawar         }
3272*c83a76b0SSuyog Pawar         else if(scan_pos || i)
3273*c83a76b0SSuyog Pawar         {
3274*c83a76b0SSuyog Pawar             /* ctxt for AC coeff depends on curpos and neigbour csbf */
3275*c83a76b0SSuyog Pawar             sig_ctxinc = gu1_hevce_sigcoeff_ctxtinc[nbr_csbf][y_pos_x_pos];
3276*c83a76b0SSuyog Pawar 
3277*c83a76b0SSuyog Pawar             /* based on luma subblock pos */
3278*c83a76b0SSuyog Pawar             sig_ctxinc += (i && is_luma) ? 3 : 0;
3279*c83a76b0SSuyog Pawar         }
3280*c83a76b0SSuyog Pawar         else
3281*c83a76b0SSuyog Pawar         {
3282*c83a76b0SSuyog Pawar             /* DC coeff has fixed context for luma and chroma */
3283*c83a76b0SSuyog Pawar             sig_coeff_base_ctxt = is_luma ? IHEVC_CAB_COEFF_FLAG : IHEVC_CAB_COEFF_FLAG + 27;
3284*c83a76b0SSuyog Pawar         }
3285*c83a76b0SSuyog Pawar 
3286*c83a76b0SSuyog Pawar         if(scan_pos || (!infer_coeff))
3287*c83a76b0SSuyog Pawar         {
3288*c83a76b0SSuyog Pawar             ctxt_idx = sig_ctxinc + sig_coeff_base_ctxt;
3289*c83a76b0SSuyog Pawar             ret |= ihevce_cabac_encode_bin(ps_cabac, sig_coeff, ctxt_idx);
3290*c83a76b0SSuyog Pawar             AEV_TRACE("significant_coeff_flag", sig_coeff, ps_cabac->u4_range);
3291*c83a76b0SSuyog Pawar         }
3292*c83a76b0SSuyog Pawar         scan_pos--;
3293*c83a76b0SSuyog Pawar     }
3294*c83a76b0SSuyog Pawar     return (ps_cabac->u4_bits_estimated_q12);  // - i4_temp_bits);
3295*c83a76b0SSuyog Pawar }
3296*c83a76b0SSuyog Pawar 
3297*c83a76b0SSuyog Pawar /**
3298*c83a76b0SSuyog Pawar ******************************************************************************
3299*c83a76b0SSuyog Pawar *
3300*c83a76b0SSuyog Pawar *  @brief Finds the next csb with a non-zero coeff
3301*c83a76b0SSuyog Pawar *
3302*c83a76b0SSuyog Pawar *  @paramp[in]  cur_last_csb_pos
3303*c83a76b0SSuyog Pawar *  The index of the current csb with a non-zero coeff
3304*c83a76b0SSuyog Pawar *
3305*c83a76b0SSuyog Pawar *  @param[inout]   pv_rdoq_ctxt
3306*c83a76b0SSuyog Pawar *  RODQ context structure
3307*c83a76b0SSuyog Pawar *
3308*c83a76b0SSuyog Pawar *  @param[in]   pu1_trans_table
3309*c83a76b0SSuyog Pawar *  Pointer to the trans table
3310*c83a76b0SSuyog Pawar *
3311*c83a76b0SSuyog Pawar *  @param[in]   pi2_coeffs
3312*c83a76b0SSuyog Pawar *  Pointer to all the quantized coefficients
3313*c83a76b0SSuyog Pawar *
3314*c83a76b0SSuyog Pawar *  @param[in]  shift_value
3315*c83a76b0SSuyog Pawar *  Determines the shifting value for determining appropriate position of coeff
3316*c83a76b0SSuyog Pawar *
3317*c83a76b0SSuyog Pawar *  @param[in]  mask_value
3318*c83a76b0SSuyog Pawar *  Determines the masking value for determining appropriate position of coeff
3319*c83a76b0SSuyog Pawar *
3320*c83a76b0SSuyog Pawar *  @param[in]   nbr_csbf
3321*c83a76b0SSuyog Pawar *  Talks about if the neighboour csbs(right and bottom) are coded or not
3322*c83a76b0SSuyog Pawar *
3323*c83a76b0SSuyog Pawar *  @param[in]    ps_cabac
3324*c83a76b0SSuyog Pawar *  Cabac state
3325*c83a76b0SSuyog Pawar *
3326*c83a76b0SSuyog Pawar *  @param[inout] ppu1_addr
3327*c83a76b0SSuyog Pawar *  Pointer to the header(i.e. pointer used for traversing the ecd data generated
3328*c83a76b0SSuyog Pawar *  in ihevce_scan_coeffs)
3329*c83a76b0SSuyog Pawar *
3330*c83a76b0SSuyog Pawar *  @return    The index of the csb with the next non-zero coeff
3331*c83a76b0SSuyog Pawar *
3332*c83a76b0SSuyog Pawar ******************************************************************************
3333*c83a76b0SSuyog Pawar */
ihevce_find_new_last_csb(WORD32 * pi4_subBlock2csbfId_map,WORD32 cur_last_csb_pos,void * pv_rdoq_ctxt,UWORD8 * pu1_trans_table,UWORD8 * pu1_csb_table,WORD16 * pi2_coeffs,WORD32 shift_value,WORD32 mask_value,UWORD8 ** ppu1_addr)3334*c83a76b0SSuyog Pawar WORD32 ihevce_find_new_last_csb(
3335*c83a76b0SSuyog Pawar     WORD32 *pi4_subBlock2csbfId_map,
3336*c83a76b0SSuyog Pawar     WORD32 cur_last_csb_pos,
3337*c83a76b0SSuyog Pawar     void *pv_rdoq_ctxt,
3338*c83a76b0SSuyog Pawar     UWORD8 *pu1_trans_table,
3339*c83a76b0SSuyog Pawar     UWORD8 *pu1_csb_table,
3340*c83a76b0SSuyog Pawar     WORD16 *pi2_coeffs,
3341*c83a76b0SSuyog Pawar     WORD32 shift_value,
3342*c83a76b0SSuyog Pawar     WORD32 mask_value,
3343*c83a76b0SSuyog Pawar     UWORD8 **ppu1_addr)
3344*c83a76b0SSuyog Pawar {
3345*c83a76b0SSuyog Pawar     WORD32 blk_row;
3346*c83a76b0SSuyog Pawar     WORD32 blk_col;
3347*c83a76b0SSuyog Pawar     WORD32 x_pos;
3348*c83a76b0SSuyog Pawar     WORD32 y_pos;
3349*c83a76b0SSuyog Pawar     WORD32 i;
3350*c83a76b0SSuyog Pawar     WORD32 j;
3351*c83a76b0SSuyog Pawar     UWORD16 *pu2_out_data_coeff;
3352*c83a76b0SSuyog Pawar     rdoq_sbh_ctxt_t *ps_rdoq_ctxt = (rdoq_sbh_ctxt_t *)pv_rdoq_ctxt;
3353*c83a76b0SSuyog Pawar     WORD32 trans_size = ps_rdoq_ctxt->i4_trans_size;
3354*c83a76b0SSuyog Pawar     UWORD8 *pu1_out_data_header = *ppu1_addr;
3355*c83a76b0SSuyog Pawar 
3356*c83a76b0SSuyog Pawar     for(i = cur_last_csb_pos - 1; i >= 0; i--)
3357*c83a76b0SSuyog Pawar     {
3358*c83a76b0SSuyog Pawar         /* check for the first csb flag in our scan order */
3359*c83a76b0SSuyog Pawar         if(ps_rdoq_ctxt->pu1_csbf_buf[pi4_subBlock2csbfId_map[pu1_trans_table[i]]])
3360*c83a76b0SSuyog Pawar         {
3361*c83a76b0SSuyog Pawar             UWORD8 u1_last_x, u1_last_y;
3362*c83a76b0SSuyog Pawar             WORD32 quant_coeff;
3363*c83a76b0SSuyog Pawar 
3364*c83a76b0SSuyog Pawar             pu1_out_data_header -= 4;  //To move the pointer back to the appropriate position
3365*c83a76b0SSuyog Pawar             /* row of csb */
3366*c83a76b0SSuyog Pawar             blk_row = pu1_trans_table[i] >> shift_value;
3367*c83a76b0SSuyog Pawar             /* col of csb */
3368*c83a76b0SSuyog Pawar             blk_col = pu1_trans_table[i] & mask_value;
3369*c83a76b0SSuyog Pawar 
3370*c83a76b0SSuyog Pawar             /*check for the 1st non-0 values inside the csb in our scan order*/
3371*c83a76b0SSuyog Pawar             for(j = 15; j >= 0; j--)
3372*c83a76b0SSuyog Pawar             {
3373*c83a76b0SSuyog Pawar                 x_pos = (pu1_csb_table[j] & 0x3) + blk_col * 4;
3374*c83a76b0SSuyog Pawar                 y_pos = (pu1_csb_table[j] >> 2) + blk_row * 4;
3375*c83a76b0SSuyog Pawar 
3376*c83a76b0SSuyog Pawar                 quant_coeff = pi2_coeffs[x_pos + (y_pos * trans_size)];
3377*c83a76b0SSuyog Pawar 
3378*c83a76b0SSuyog Pawar                 if(quant_coeff != 0)
3379*c83a76b0SSuyog Pawar                     break;
3380*c83a76b0SSuyog Pawar             }
3381*c83a76b0SSuyog Pawar 
3382*c83a76b0SSuyog Pawar             ASSERT(j >= 0);
3383*c83a76b0SSuyog Pawar 
3384*c83a76b0SSuyog Pawar             u1_last_x = x_pos;
3385*c83a76b0SSuyog Pawar             u1_last_y = y_pos;
3386*c83a76b0SSuyog Pawar 
3387*c83a76b0SSuyog Pawar             /* storing last_x and last_y */
3388*c83a76b0SSuyog Pawar             *(pu1_out_data_header) = u1_last_x;
3389*c83a76b0SSuyog Pawar             *(pu1_out_data_header + 1) = u1_last_y;
3390*c83a76b0SSuyog Pawar 
3391*c83a76b0SSuyog Pawar             /* storing the scan order */
3392*c83a76b0SSuyog Pawar             *(pu1_out_data_header + 2) = ps_rdoq_ctxt->i4_scan_idx;
3393*c83a76b0SSuyog Pawar 
3394*c83a76b0SSuyog Pawar             /* storing last_sub_block pos. in scan order count */
3395*c83a76b0SSuyog Pawar             *(pu1_out_data_header + 3) = i;
3396*c83a76b0SSuyog Pawar 
3397*c83a76b0SSuyog Pawar             /*stored the first 4 bytes, now all are word16. So word16 pointer*/
3398*c83a76b0SSuyog Pawar             pu2_out_data_coeff = (UWORD16 *)(pu1_out_data_header + 4);
3399*c83a76b0SSuyog Pawar 
3400*c83a76b0SSuyog Pawar             *pu2_out_data_coeff = 0xBAD0 | 1; /*since right&bottom csbf is 0*/
3401*c83a76b0SSuyog Pawar             *ppu1_addr = pu1_out_data_header;
3402*c83a76b0SSuyog Pawar 
3403*c83a76b0SSuyog Pawar             break; /*We just need this loop for finding 1st non-zero csb only*/
3404*c83a76b0SSuyog Pawar         }
3405*c83a76b0SSuyog Pawar         else
3406*c83a76b0SSuyog Pawar             pu1_out_data_header += 2;
3407*c83a76b0SSuyog Pawar     }
3408*c83a76b0SSuyog Pawar     return i;
3409*c83a76b0SSuyog Pawar }
3410*c83a76b0SSuyog Pawar 
3411*c83a76b0SSuyog Pawar /**
3412*c83a76b0SSuyog Pawar ******************************************************************************
3413*c83a76b0SSuyog Pawar *
3414*c83a76b0SSuyog Pawar *  @brief Used to optimize the memcpy of cabac states. It copies only those
3415*c83a76b0SSuyog Pawar *  states in the cabac context which have been altered.
3416*c83a76b0SSuyog Pawar *
3417*c83a76b0SSuyog Pawar *  @paramp[inout]  pv_dest
3418*c83a76b0SSuyog Pawar *  Pointer to desitination cabac state.
3419*c83a76b0SSuyog Pawar *
3420*c83a76b0SSuyog Pawar *  @param[inout]   pv_backup_ctxt_dest
3421*c83a76b0SSuyog Pawar *  Pointer to destination backup context
3422*c83a76b0SSuyog Pawar *
3423*c83a76b0SSuyog Pawar *  @param[inout]   pv_backup_ctxt_src
3424*c83a76b0SSuyog Pawar *  Pointer to source backup context
3425*c83a76b0SSuyog Pawar *
3426*c83a76b0SSuyog Pawar *  @Desc:
3427*c83a76b0SSuyog Pawar *  We go through each element in the backup_ctxt structure which will tell us
3428*c83a76b0SSuyog Pawar *  if the states corresponding to lastxlasty, sigcoeffs, grtr_than_1_bins,
3429*c83a76b0SSuyog Pawar *  grtr_than_2_bins and sub_blk_coded_flag(i.e. 0xBAD0) context elements
3430*c83a76b0SSuyog Pawar *  have been altered. If they have been altered, we will memcpy the states
3431*c83a76b0SSuyog Pawar *  corresponding to these context elements alone
3432*c83a76b0SSuyog Pawar *
3433*c83a76b0SSuyog Pawar *  @return  Nothing
3434*c83a76b0SSuyog Pawar *
3435*c83a76b0SSuyog Pawar ******************************************************************************
3436*c83a76b0SSuyog Pawar */
ihevce_copy_backup_ctxt(void * pv_dest,void * pv_src,void * pv_backup_ctxt_dest,void * pv_backup_ctxt_src)3437*c83a76b0SSuyog Pawar void ihevce_copy_backup_ctxt(
3438*c83a76b0SSuyog Pawar     void *pv_dest, void *pv_src, void *pv_backup_ctxt_dest, void *pv_backup_ctxt_src)
3439*c83a76b0SSuyog Pawar {
3440*c83a76b0SSuyog Pawar     UWORD8 *pu1_dest = (UWORD8 *)(((cab_ctxt_t *)pv_dest)->au1_ctxt_models);
3441*c83a76b0SSuyog Pawar     UWORD8 *pu1_src = (UWORD8 *)(((cab_ctxt_t *)pv_src)->au1_ctxt_models);
3442*c83a76b0SSuyog Pawar     backup_ctxt_t *ps_backup_dest_ctxt = ((backup_ctxt_t *)pv_backup_ctxt_dest);
3443*c83a76b0SSuyog Pawar     backup_ctxt_t *ps_backup_src_ctxt = ((backup_ctxt_t *)pv_backup_ctxt_src);
3444*c83a76b0SSuyog Pawar     WORD32 i4_i;
3445*c83a76b0SSuyog Pawar 
3446*c83a76b0SSuyog Pawar     /*
3447*c83a76b0SSuyog Pawar     0       IHEVC_CAB_COEFFX_PREFIX         lastx last y has been coded
3448*c83a76b0SSuyog Pawar     1       IHEVC_CAB_CODED_SUBLK_IDX       sub-blk coded or not flag has been coded
3449*c83a76b0SSuyog Pawar     2       IHEVC_CAB_COEFF_FLAG            sigcoeff has been coded
3450*c83a76b0SSuyog Pawar     3       IHEVC_CAB_COEFABS_GRTR1_FLAG    greater than 1 bin has been coded
3451*c83a76b0SSuyog Pawar     4       IHEVC_CAB_COEFABS_GRTR2_FLAG    greater than 2 bin has been coded*/
3452*c83a76b0SSuyog Pawar     assert(MAX_NUM_CONTEXT_ELEMENTS == 5);
3453*c83a76b0SSuyog Pawar     for(i4_i = 0; i4_i < MAX_NUM_CONTEXT_ELEMENTS; i4_i++)
3454*c83a76b0SSuyog Pawar     {
3455*c83a76b0SSuyog Pawar         if((ps_backup_src_ctxt->au1_ctxt_to_backup[SIG_COEFF]) ||
3456*c83a76b0SSuyog Pawar            (ps_backup_dest_ctxt->au1_ctxt_to_backup[SIG_COEFF]))
3457*c83a76b0SSuyog Pawar         {
3458*c83a76b0SSuyog Pawar             memcpy(&pu1_dest[IHEVC_CAB_COEFF_FLAG], &pu1_src[IHEVC_CAB_COEFF_FLAG], 42);
3459*c83a76b0SSuyog Pawar             ps_backup_dest_ctxt->au1_ctxt_to_backup[SIG_COEFF] = 0;
3460*c83a76b0SSuyog Pawar             ps_backup_src_ctxt->au1_ctxt_to_backup[SIG_COEFF] = 0;
3461*c83a76b0SSuyog Pawar         }
3462*c83a76b0SSuyog Pawar         if((ps_backup_src_ctxt->au1_ctxt_to_backup[GRTR_THAN_1]) ||
3463*c83a76b0SSuyog Pawar            (ps_backup_dest_ctxt->au1_ctxt_to_backup[GRTR_THAN_1]))
3464*c83a76b0SSuyog Pawar         {
3465*c83a76b0SSuyog Pawar             memcpy(
3466*c83a76b0SSuyog Pawar                 &pu1_dest[IHEVC_CAB_COEFABS_GRTR1_FLAG],
3467*c83a76b0SSuyog Pawar                 &pu1_src[IHEVC_CAB_COEFABS_GRTR1_FLAG],
3468*c83a76b0SSuyog Pawar                 24);
3469*c83a76b0SSuyog Pawar             ps_backup_dest_ctxt->au1_ctxt_to_backup[GRTR_THAN_1] = 0;
3470*c83a76b0SSuyog Pawar             ps_backup_src_ctxt->au1_ctxt_to_backup[GRTR_THAN_1] = 0;
3471*c83a76b0SSuyog Pawar         }
3472*c83a76b0SSuyog Pawar         if((ps_backup_src_ctxt->au1_ctxt_to_backup[GRTR_THAN_2]) ||
3473*c83a76b0SSuyog Pawar            (ps_backup_dest_ctxt->au1_ctxt_to_backup[GRTR_THAN_2]))
3474*c83a76b0SSuyog Pawar         {
3475*c83a76b0SSuyog Pawar             memcpy(
3476*c83a76b0SSuyog Pawar                 &pu1_dest[IHEVC_CAB_COEFABS_GRTR2_FLAG], &pu1_src[IHEVC_CAB_COEFABS_GRTR2_FLAG], 6);
3477*c83a76b0SSuyog Pawar             ps_backup_dest_ctxt->au1_ctxt_to_backup[GRTR_THAN_2] = 0;
3478*c83a76b0SSuyog Pawar             ps_backup_src_ctxt->au1_ctxt_to_backup[GRTR_THAN_2] = 0;
3479*c83a76b0SSuyog Pawar         }
3480*c83a76b0SSuyog Pawar         if((ps_backup_src_ctxt->au1_ctxt_to_backup[SUB_BLK_CODED_FLAG]) ||
3481*c83a76b0SSuyog Pawar            (ps_backup_dest_ctxt->au1_ctxt_to_backup[SUB_BLK_CODED_FLAG]))
3482*c83a76b0SSuyog Pawar         {
3483*c83a76b0SSuyog Pawar             memcpy(&pu1_dest[IHEVC_CAB_CODED_SUBLK_IDX], &pu1_src[IHEVC_CAB_CODED_SUBLK_IDX], 4);
3484*c83a76b0SSuyog Pawar             ps_backup_dest_ctxt->au1_ctxt_to_backup[SUB_BLK_CODED_FLAG] = 0;
3485*c83a76b0SSuyog Pawar             ps_backup_src_ctxt->au1_ctxt_to_backup[SUB_BLK_CODED_FLAG] = 0;
3486*c83a76b0SSuyog Pawar         }
3487*c83a76b0SSuyog Pawar         if((ps_backup_src_ctxt->au1_ctxt_to_backup[LASTXY]) ||
3488*c83a76b0SSuyog Pawar            (ps_backup_dest_ctxt->au1_ctxt_to_backup[LASTXY]))
3489*c83a76b0SSuyog Pawar         {
3490*c83a76b0SSuyog Pawar             memcpy(&pu1_dest[IHEVC_CAB_COEFFX_PREFIX], &pu1_src[IHEVC_CAB_COEFFX_PREFIX], 36);
3491*c83a76b0SSuyog Pawar             ps_backup_dest_ctxt->au1_ctxt_to_backup[LASTXY] = 0;
3492*c83a76b0SSuyog Pawar             ps_backup_src_ctxt->au1_ctxt_to_backup[LASTXY] = 0;
3493*c83a76b0SSuyog Pawar         }
3494*c83a76b0SSuyog Pawar     }
3495*c83a76b0SSuyog Pawar     ((cab_ctxt_t *)pv_dest)->u4_bits_estimated_q12 = ((cab_ctxt_t *)pv_src)->u4_bits_estimated_q12;
3496*c83a76b0SSuyog Pawar }
3497