xref: /aosp_15_r20/external/libhevc/encoder/ihevce_enc_sbh_funcs.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 ******************************************************************************
23*c83a76b0SSuyog Pawar * \file ihevce_enc_sbh_funcs.c
24*c83a76b0SSuyog Pawar *
25*c83a76b0SSuyog Pawar * \brief
26*c83a76b0SSuyog Pawar *    This file contains utility functions for sbh
27*c83a76b0SSuyog Pawar *
28*c83a76b0SSuyog Pawar * \date
29*c83a76b0SSuyog Pawar *    31/08/2012
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * \author
32*c83a76b0SSuyog Pawar *    Ittiam
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar * List of Functions
35*c83a76b0SSuyog Pawar *    ihevce_sign_data_hiding()
36*c83a76b0SSuyog Pawar *
37*c83a76b0SSuyog Pawar ******************************************************************************
38*c83a76b0SSuyog Pawar */
39*c83a76b0SSuyog Pawar 
40*c83a76b0SSuyog Pawar /*****************************************************************************/
41*c83a76b0SSuyog Pawar /* File Includes                                                             */
42*c83a76b0SSuyog Pawar /*****************************************************************************/
43*c83a76b0SSuyog Pawar /* System include files */
44*c83a76b0SSuyog Pawar #include <stdio.h>
45*c83a76b0SSuyog Pawar #include <string.h>
46*c83a76b0SSuyog Pawar #include <stdlib.h>
47*c83a76b0SSuyog Pawar #include <assert.h>
48*c83a76b0SSuyog Pawar #include <stdarg.h>
49*c83a76b0SSuyog Pawar #include <math.h>
50*c83a76b0SSuyog Pawar 
51*c83a76b0SSuyog Pawar /* User include files */
52*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
53*c83a76b0SSuyog Pawar #include "itt_video_api.h"
54*c83a76b0SSuyog Pawar #include "ihevce_api.h"
55*c83a76b0SSuyog Pawar 
56*c83a76b0SSuyog Pawar #include "rc_cntrl_param.h"
57*c83a76b0SSuyog Pawar #include "rc_frame_info_collector.h"
58*c83a76b0SSuyog Pawar #include "rc_look_ahead_params.h"
59*c83a76b0SSuyog Pawar 
60*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
61*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
62*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
63*c83a76b0SSuyog Pawar #include "ihevc_deblk.h"
64*c83a76b0SSuyog Pawar #include "ihevc_itrans_recon.h"
65*c83a76b0SSuyog Pawar #include "ihevc_chroma_itrans_recon.h"
66*c83a76b0SSuyog Pawar #include "ihevc_chroma_intra_pred.h"
67*c83a76b0SSuyog Pawar #include "ihevc_intra_pred.h"
68*c83a76b0SSuyog Pawar #include "ihevc_inter_pred.h"
69*c83a76b0SSuyog Pawar #include "ihevc_mem_fns.h"
70*c83a76b0SSuyog Pawar #include "ihevc_padding.h"
71*c83a76b0SSuyog Pawar #include "ihevc_weighted_pred.h"
72*c83a76b0SSuyog Pawar #include "ihevc_sao.h"
73*c83a76b0SSuyog Pawar #include "ihevc_resi_trans.h"
74*c83a76b0SSuyog Pawar #include "ihevc_quant_iquant_ssd.h"
75*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
76*c83a76b0SSuyog Pawar #include "ihevc_trans_tables.h"
77*c83a76b0SSuyog Pawar #include "ihevc_trans_macros.h"
78*c83a76b0SSuyog Pawar 
79*c83a76b0SSuyog Pawar #include "ihevce_defs.h"
80*c83a76b0SSuyog Pawar #include "ihevce_lap_enc_structs.h"
81*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_structs.h"
82*c83a76b0SSuyog Pawar #include "ihevce_multi_thrd_funcs.h"
83*c83a76b0SSuyog Pawar #include "ihevce_me_common_defs.h"
84*c83a76b0SSuyog Pawar #include "ihevce_had_satd.h"
85*c83a76b0SSuyog Pawar #include "ihevce_error_codes.h"
86*c83a76b0SSuyog Pawar #include "ihevce_bitstream.h"
87*c83a76b0SSuyog Pawar #include "ihevce_cabac.h"
88*c83a76b0SSuyog Pawar #include "ihevce_rdoq_macros.h"
89*c83a76b0SSuyog Pawar #include "ihevce_function_selector.h"
90*c83a76b0SSuyog Pawar #include "ihevce_enc_structs.h"
91*c83a76b0SSuyog Pawar #include "ihevce_global_tables.h"
92*c83a76b0SSuyog Pawar #include "ihevce_enc_sbh_utils.h"
93*c83a76b0SSuyog Pawar 
94*c83a76b0SSuyog Pawar /*****************************************************************************/
95*c83a76b0SSuyog Pawar /* Function Definitions                                                      */
96*c83a76b0SSuyog Pawar /*****************************************************************************/
97*c83a76b0SSuyog Pawar 
98*c83a76b0SSuyog Pawar /**
99*c83a76b0SSuyog Pawar *******************************************************************************
100*c83a76b0SSuyog Pawar *
101*c83a76b0SSuyog Pawar * @brief
102*c83a76b0SSuyog Pawar *  This function find the coefficient that needs to be modified for SBH
103*c83a76b0SSuyog Pawar *  for each sub block, if required
104*c83a76b0SSuyog Pawar *
105*c83a76b0SSuyog Pawar * @par Description:
106*c83a76b0SSuyog Pawar *  Checks the validity for applying SBH
107*c83a76b0SSuyog Pawar *
108*c83a76b0SSuyog Pawar * @param[inout] ps_rdoq_sbh_params
109*c83a76b0SSuyog Pawar *  All the necessary parameters for SBH
110*c83a76b0SSuyog Pawar *
111*c83a76b0SSuyog Pawar * @returns  None
112*c83a76b0SSuyog Pawar *
113*c83a76b0SSuyog Pawar * @remarks  None
114*c83a76b0SSuyog Pawar *
115*c83a76b0SSuyog Pawar ********************************************************************************
116*c83a76b0SSuyog Pawar */
ihevce_sign_data_hiding(rdoq_sbh_ctxt_t * ps_rdoq_sbh_params)117*c83a76b0SSuyog Pawar void ihevce_sign_data_hiding(rdoq_sbh_ctxt_t *ps_rdoq_sbh_params)
118*c83a76b0SSuyog Pawar {
119*c83a76b0SSuyog Pawar     WORD32 i, trans_unit_idx;
120*c83a76b0SSuyog Pawar     UWORD8 *pu1_trans_table = NULL;
121*c83a76b0SSuyog Pawar     UWORD8 *pu1_csb_table;
122*c83a76b0SSuyog Pawar     WORD32 shift_value, mask_value;
123*c83a76b0SSuyog Pawar     WORD32 blk_row, blk_col;
124*c83a76b0SSuyog Pawar 
125*c83a76b0SSuyog Pawar     WORD32 x_pos, y_pos;
126*c83a76b0SSuyog Pawar     WORD16 i2_quant_coeff;
127*c83a76b0SSuyog Pawar     WORD32 best_pos = -1;
128*c83a76b0SSuyog Pawar 
129*c83a76b0SSuyog Pawar     WORD16 *pi2_quant_coeffs = ps_rdoq_sbh_params->pi2_quant_coeffs;
130*c83a76b0SSuyog Pawar     WORD16 *pi2_iquant_data = ps_rdoq_sbh_params->pi2_iquant_coeffs;
131*c83a76b0SSuyog Pawar     WORD16 *pi2_tr_coeffs = ps_rdoq_sbh_params->pi2_trans_values;
132*c83a76b0SSuyog Pawar     WORD32 *pi4_subBlock2csbfId_map = ps_rdoq_sbh_params->pi4_subBlock2csbfId_map;
133*c83a76b0SSuyog Pawar     WORD16 *pi2_dequant_coeff = ps_rdoq_sbh_params->pi2_dequant_coeff;
134*c83a76b0SSuyog Pawar     UWORD8 *pu1_csbf_buf = ps_rdoq_sbh_params->pu1_csbf_buf;
135*c83a76b0SSuyog Pawar     WORD32 dst_iq_strd = ps_rdoq_sbh_params->i4_iq_data_strd;
136*c83a76b0SSuyog Pawar     WORD32 dst_q_strd = ps_rdoq_sbh_params->i4_q_data_strd;
137*c83a76b0SSuyog Pawar 
138*c83a76b0SSuyog Pawar     WORD32 scan_idx = ps_rdoq_sbh_params->i4_scan_idx;
139*c83a76b0SSuyog Pawar     WORD32 qp_div = ps_rdoq_sbh_params->i4_qp_div;
140*c83a76b0SSuyog Pawar     WORD32 trans_size = ps_rdoq_sbh_params->i4_trans_size;
141*c83a76b0SSuyog Pawar     WORD32 qp_rem = ps_rdoq_sbh_params->i2_qp_rem;
142*c83a76b0SSuyog Pawar     LWORD64 ssd_cost = ps_rdoq_sbh_params->i8_ssd_cost;
143*c83a76b0SSuyog Pawar 
144*c83a76b0SSuyog Pawar     WORD32 last_cg = -1;
145*c83a76b0SSuyog Pawar 
146*c83a76b0SSuyog Pawar     WORD32 log2_size, bit_depth, shift_iq;
147*c83a76b0SSuyog Pawar 
148*c83a76b0SSuyog Pawar     GETRANGE(log2_size, trans_size);
149*c83a76b0SSuyog Pawar     log2_size -= 1;
150*c83a76b0SSuyog Pawar     bit_depth = ps_rdoq_sbh_params->i4_bit_depth;
151*c83a76b0SSuyog Pawar     shift_iq = bit_depth + log2_size - 5;
152*c83a76b0SSuyog Pawar 
153*c83a76b0SSuyog Pawar     /* Select proper order for your transform unit and csb based on scan_idx*/
154*c83a76b0SSuyog Pawar     /* and the trans_size */
155*c83a76b0SSuyog Pawar 
156*c83a76b0SSuyog Pawar     /* scan order inside a csb */
157*c83a76b0SSuyog Pawar     pu1_csb_table = (UWORD8 *)&(g_u1_scan_table_4x4[scan_idx][0]);
158*c83a76b0SSuyog Pawar 
159*c83a76b0SSuyog Pawar     /* GETRANGE will give the log_2 of trans_size to shift_value */
160*c83a76b0SSuyog Pawar     GETRANGE(shift_value, trans_size);
161*c83a76b0SSuyog Pawar     shift_value = shift_value - 3; /* for finding. row no. from scan index */
162*c83a76b0SSuyog Pawar     mask_value = (trans_size / 4) - 1; /*for finding the col. no. from scan index*/
163*c83a76b0SSuyog Pawar     switch(trans_size)
164*c83a76b0SSuyog Pawar     {
165*c83a76b0SSuyog Pawar     case 32:
166*c83a76b0SSuyog Pawar         pu1_trans_table = (UWORD8 *)&(g_u1_scan_table_8x8[scan_idx][0]);
167*c83a76b0SSuyog Pawar         break;
168*c83a76b0SSuyog Pawar     case 16:
169*c83a76b0SSuyog Pawar         pu1_trans_table = (UWORD8 *)&(g_u1_scan_table_4x4[scan_idx][0]);
170*c83a76b0SSuyog Pawar         break;
171*c83a76b0SSuyog Pawar     case 8:
172*c83a76b0SSuyog Pawar         pu1_trans_table = (UWORD8 *)&(g_u1_scan_table_2x2[scan_idx][0]);
173*c83a76b0SSuyog Pawar         break;
174*c83a76b0SSuyog Pawar     case 4:
175*c83a76b0SSuyog Pawar         pu1_trans_table = (UWORD8 *)&(g_u1_scan_table_1x1[0]);
176*c83a76b0SSuyog Pawar         break;
177*c83a76b0SSuyog Pawar     default:
178*c83a76b0SSuyog Pawar         ASSERT(0);
179*c83a76b0SSuyog Pawar         break;
180*c83a76b0SSuyog Pawar     }
181*c83a76b0SSuyog Pawar     for(trans_unit_idx = (trans_size * trans_size / 16) - 1; trans_unit_idx >= 0; trans_unit_idx--)
182*c83a76b0SSuyog Pawar     {
183*c83a76b0SSuyog Pawar         WORD32 last_scan_pos = -1, first_scan_pos = 16, sign_first_coeff, sum_abs_level = 0,
184*c83a76b0SSuyog Pawar                quant_coeff_first;
185*c83a76b0SSuyog Pawar 
186*c83a76b0SSuyog Pawar         if(pu1_csbf_buf[pi4_subBlock2csbfId_map[pu1_trans_table[trans_unit_idx]]])
187*c83a76b0SSuyog Pawar         {
188*c83a76b0SSuyog Pawar             /* row of csb */
189*c83a76b0SSuyog Pawar             blk_row = (pu1_trans_table[trans_unit_idx] >> shift_value) * 4;
190*c83a76b0SSuyog Pawar             /* col of csb */
191*c83a76b0SSuyog Pawar             blk_col = (pu1_trans_table[trans_unit_idx] & mask_value) * 4;
192*c83a76b0SSuyog Pawar 
193*c83a76b0SSuyog Pawar             if(last_cg == -1)
194*c83a76b0SSuyog Pawar             {
195*c83a76b0SSuyog Pawar                 last_cg = 1;
196*c83a76b0SSuyog Pawar             }
197*c83a76b0SSuyog Pawar 
198*c83a76b0SSuyog Pawar             for(i = 15; i >= 0; i--)
199*c83a76b0SSuyog Pawar             {
200*c83a76b0SSuyog Pawar                 x_pos = (pu1_csb_table[i] & 0x3) + blk_col;
201*c83a76b0SSuyog Pawar                 y_pos = (pu1_csb_table[i] >> 2) + blk_row;
202*c83a76b0SSuyog Pawar 
203*c83a76b0SSuyog Pawar                 i2_quant_coeff = pi2_quant_coeffs[x_pos + (y_pos * trans_size)];
204*c83a76b0SSuyog Pawar 
205*c83a76b0SSuyog Pawar                 if(i2_quant_coeff)
206*c83a76b0SSuyog Pawar                 {
207*c83a76b0SSuyog Pawar                     first_scan_pos = i;
208*c83a76b0SSuyog Pawar                     if(-1 == last_scan_pos)
209*c83a76b0SSuyog Pawar                     {
210*c83a76b0SSuyog Pawar                         last_scan_pos = i;
211*c83a76b0SSuyog Pawar                     }
212*c83a76b0SSuyog Pawar 
213*c83a76b0SSuyog Pawar                     sum_abs_level += abs(i2_quant_coeff);
214*c83a76b0SSuyog Pawar                 }
215*c83a76b0SSuyog Pawar             }
216*c83a76b0SSuyog Pawar 
217*c83a76b0SSuyog Pawar             if((last_scan_pos - first_scan_pos) >= 4)
218*c83a76b0SSuyog Pawar             {
219*c83a76b0SSuyog Pawar                 x_pos = (pu1_csb_table[first_scan_pos] & 0x3) + blk_col;
220*c83a76b0SSuyog Pawar                 y_pos = (pu1_csb_table[first_scan_pos] >> 2) + blk_row;
221*c83a76b0SSuyog Pawar 
222*c83a76b0SSuyog Pawar                 quant_coeff_first = pi2_quant_coeffs[x_pos + (y_pos * trans_size)];
223*c83a76b0SSuyog Pawar 
224*c83a76b0SSuyog Pawar                 sign_first_coeff = (quant_coeff_first > 0) ? 0 : 1;
225*c83a76b0SSuyog Pawar 
226*c83a76b0SSuyog Pawar                 if(sign_first_coeff != (sum_abs_level & 0x1))
227*c83a76b0SSuyog Pawar                 {
228*c83a76b0SSuyog Pawar                     WORD32 q_err;
229*c83a76b0SSuyog Pawar                     WORD32 min_cost = MAX_INT;
230*c83a76b0SSuyog Pawar                     WORD32 final_change = 0, cur_cost = 0, cur_change = 0;
231*c83a76b0SSuyog Pawar                     WORD16 i2_tr_coeff;
232*c83a76b0SSuyog Pawar                     WORD16 i2_iquant_coeff;
233*c83a76b0SSuyog Pawar 
234*c83a76b0SSuyog Pawar                     for(i = (last_cg == 1) ? last_scan_pos : 15; i >= 0; i--)
235*c83a76b0SSuyog Pawar                     {
236*c83a76b0SSuyog Pawar                         x_pos = (pu1_csb_table[i] & 0x3) + blk_col;
237*c83a76b0SSuyog Pawar                         y_pos = (pu1_csb_table[i] >> 2) + blk_row;
238*c83a76b0SSuyog Pawar 
239*c83a76b0SSuyog Pawar                         i2_quant_coeff = pi2_quant_coeffs[x_pos + (y_pos * trans_size)];
240*c83a76b0SSuyog Pawar                         i2_tr_coeff = pi2_tr_coeffs[x_pos + (y_pos * trans_size)];
241*c83a76b0SSuyog Pawar                         i2_iquant_coeff = pi2_iquant_data[x_pos + (y_pos * dst_iq_strd)];
242*c83a76b0SSuyog Pawar 
243*c83a76b0SSuyog Pawar                         q_err = abs(i2_tr_coeff) - abs(i2_iquant_coeff);
244*c83a76b0SSuyog Pawar 
245*c83a76b0SSuyog Pawar                         if(i2_quant_coeff != 0)
246*c83a76b0SSuyog Pawar                         {
247*c83a76b0SSuyog Pawar                             cur_cost = -1 * SIGN(q_err) * q_err;
248*c83a76b0SSuyog Pawar 
249*c83a76b0SSuyog Pawar                             if(q_err <= 0)
250*c83a76b0SSuyog Pawar                             {
251*c83a76b0SSuyog Pawar                                 if(i == first_scan_pos && abs(i2_quant_coeff) == 1)
252*c83a76b0SSuyog Pawar                                 {
253*c83a76b0SSuyog Pawar                                     cur_cost = MAX_INT;
254*c83a76b0SSuyog Pawar                                 }
255*c83a76b0SSuyog Pawar                             }
256*c83a76b0SSuyog Pawar                         }
257*c83a76b0SSuyog Pawar                         else
258*c83a76b0SSuyog Pawar                         {
259*c83a76b0SSuyog Pawar                             cur_cost = -q_err;
260*c83a76b0SSuyog Pawar                             if(i < first_scan_pos)
261*c83a76b0SSuyog Pawar                             {
262*c83a76b0SSuyog Pawar                                 WORD32 sign_bit = (i2_tr_coeff >= 0 ? 0 : 1);
263*c83a76b0SSuyog Pawar 
264*c83a76b0SSuyog Pawar                                 if(sign_first_coeff != sign_bit)
265*c83a76b0SSuyog Pawar                                 {
266*c83a76b0SSuyog Pawar                                     cur_cost = MAX_INT;
267*c83a76b0SSuyog Pawar                                 }
268*c83a76b0SSuyog Pawar                             }
269*c83a76b0SSuyog Pawar                         }
270*c83a76b0SSuyog Pawar 
271*c83a76b0SSuyog Pawar                         cur_change = (i2_quant_coeff == 0) ? 1 : (q_err > 0 ? 1 : -1);
272*c83a76b0SSuyog Pawar 
273*c83a76b0SSuyog Pawar                         if(cur_cost < min_cost)
274*c83a76b0SSuyog Pawar                         {
275*c83a76b0SSuyog Pawar                             min_cost = cur_cost;
276*c83a76b0SSuyog Pawar                             final_change = cur_change;
277*c83a76b0SSuyog Pawar                             best_pos = i;
278*c83a76b0SSuyog Pawar                         }
279*c83a76b0SSuyog Pawar                     }
280*c83a76b0SSuyog Pawar                     if((i2_quant_coeff == 32767) || (i2_quant_coeff == -32768))
281*c83a76b0SSuyog Pawar                     {
282*c83a76b0SSuyog Pawar                         final_change = -1;
283*c83a76b0SSuyog Pawar                     }
284*c83a76b0SSuyog Pawar 
285*c83a76b0SSuyog Pawar                     x_pos = (pu1_csb_table[best_pos] & 0x3) + blk_col;
286*c83a76b0SSuyog Pawar                     y_pos = (pu1_csb_table[best_pos] >> 2) + blk_row;
287*c83a76b0SSuyog Pawar                     i2_iquant_coeff = pi2_iquant_data[x_pos + (y_pos * dst_iq_strd)];
288*c83a76b0SSuyog Pawar                     i2_tr_coeff = pi2_tr_coeffs[x_pos + (y_pos * trans_size)];
289*c83a76b0SSuyog Pawar 
290*c83a76b0SSuyog Pawar                     if(i2_tr_coeff >= 0)
291*c83a76b0SSuyog Pawar                     {
292*c83a76b0SSuyog Pawar                         pi2_quant_coeffs[x_pos + (y_pos * trans_size)] += final_change;
293*c83a76b0SSuyog Pawar                     }
294*c83a76b0SSuyog Pawar                     else
295*c83a76b0SSuyog Pawar                     {
296*c83a76b0SSuyog Pawar                         pi2_quant_coeffs[x_pos + (y_pos * trans_size)] -= final_change;
297*c83a76b0SSuyog Pawar                     }
298*c83a76b0SSuyog Pawar 
299*c83a76b0SSuyog Pawar                     {
300*c83a76b0SSuyog Pawar                         WORD32 i4_err1, i4_err2;
301*c83a76b0SSuyog Pawar 
302*c83a76b0SSuyog Pawar                         /*  Inverse Quantization    */
303*c83a76b0SSuyog Pawar                         IQUANT(
304*c83a76b0SSuyog Pawar                             pi2_iquant_data[y_pos * dst_iq_strd + x_pos],
305*c83a76b0SSuyog Pawar                             pi2_quant_coeffs[y_pos * dst_q_strd + x_pos],
306*c83a76b0SSuyog Pawar                             pi2_dequant_coeff[y_pos * trans_size + x_pos] *
307*c83a76b0SSuyog Pawar                                 g_ihevc_iquant_scales[qp_rem],
308*c83a76b0SSuyog Pawar                             shift_iq,
309*c83a76b0SSuyog Pawar                             qp_div);
310*c83a76b0SSuyog Pawar 
311*c83a76b0SSuyog Pawar                         i4_err1 = (i2_tr_coeff - i2_iquant_coeff);
312*c83a76b0SSuyog Pawar                         i4_err1 = i4_err1 * i4_err1;
313*c83a76b0SSuyog Pawar                         ssd_cost = ssd_cost - i4_err1;
314*c83a76b0SSuyog Pawar                         i4_err2 = (i2_tr_coeff - pi2_iquant_data[y_pos * dst_iq_strd + x_pos]);
315*c83a76b0SSuyog Pawar                         i4_err2 = i4_err2 * i4_err2;
316*c83a76b0SSuyog Pawar                         ssd_cost = ssd_cost + i4_err2;
317*c83a76b0SSuyog Pawar                     }
318*c83a76b0SSuyog Pawar                 }
319*c83a76b0SSuyog Pawar             }
320*c83a76b0SSuyog Pawar             if(last_cg == 1)
321*c83a76b0SSuyog Pawar             {
322*c83a76b0SSuyog Pawar                 last_cg = 0;
323*c83a76b0SSuyog Pawar             }
324*c83a76b0SSuyog Pawar         }
325*c83a76b0SSuyog Pawar     }
326*c83a76b0SSuyog Pawar 
327*c83a76b0SSuyog Pawar     ps_rdoq_sbh_params->i8_ssd_cost = ssd_cost;
328*c83a76b0SSuyog Pawar }
329