xref: /aosp_15_r20/external/libavc/decoder/svc/isvcd_residual_resamp.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker  */
20*495ae853SAndroid Build Coastguard Worker /**
21*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
22*495ae853SAndroid Build Coastguard Worker  * @file
23*495ae853SAndroid Build Coastguard Worker  *  isvcd_residual_resamp.c
24*495ae853SAndroid Build Coastguard Worker  *
25*495ae853SAndroid Build Coastguard Worker  * @brief
26*495ae853SAndroid Build Coastguard Worker  *  Contains routines that resample for SVC resampling
27*495ae853SAndroid Build Coastguard Worker  *
28*495ae853SAndroid Build Coastguard Worker  * @author
29*495ae853SAndroid Build Coastguard Worker  *  Kishore
30*495ae853SAndroid Build Coastguard Worker  *
31*495ae853SAndroid Build Coastguard Worker  * @par List of Functions:
32*495ae853SAndroid Build Coastguard Worker  *  - isvcd_residual_chroma_dyadic_alt()
33*495ae853SAndroid Build Coastguard Worker  *  - isvcd_residual_chroma_dyadic()
34*495ae853SAndroid Build Coastguard Worker  *  - isvcd_residual_luma_dyadic()
35*495ae853SAndroid Build Coastguard Worker  *  - isvcd_ref_layer_ptr_incr()
36*495ae853SAndroid Build Coastguard Worker  *  - isvcd_residual_reflayer_const_non_boundary_mb()
37*495ae853SAndroid Build Coastguard Worker  *  - isvcd_residual_reflayer_const_boundary_mb()
38*495ae853SAndroid Build Coastguard Worker  *  - isvcd_residual_reflayer_const()
39*495ae853SAndroid Build Coastguard Worker  *  - isvcd_interpolate_residual()
40*495ae853SAndroid Build Coastguard Worker  *  - isvcd_residual_samp_mb()
41*495ae853SAndroid Build Coastguard Worker  *  - isvcd_residual_samp_mb_dyadic()
42*495ae853SAndroid Build Coastguard Worker  *  - isvcd_residual_samp_populate_list()
43*495ae853SAndroid Build Coastguard Worker  *  - isvcd_residual_samp_res_init()
44*495ae853SAndroid Build Coastguard Worker  *
45*495ae853SAndroid Build Coastguard Worker  * @remarks
46*495ae853SAndroid Build Coastguard Worker  *  None
47*495ae853SAndroid Build Coastguard Worker  *
48*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
49*495ae853SAndroid Build Coastguard Worker  */
50*495ae853SAndroid Build Coastguard Worker 
51*495ae853SAndroid Build Coastguard Worker #include <assert.h>
52*495ae853SAndroid Build Coastguard Worker #include <string.h>
53*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
54*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
55*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
56*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
57*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
58*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
59*495ae853SAndroid Build Coastguard Worker #include "isvcd_structs.h"
60*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
61*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
62*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
63*495ae853SAndroid Build Coastguard Worker #include "ih264d_deblocking.h"
64*495ae853SAndroid Build Coastguard Worker #include "ih264d_dpb_manager.h"
65*495ae853SAndroid Build Coastguard Worker #include "ih264d_mvpred.h"
66*495ae853SAndroid Build Coastguard Worker #include "ih264d_inter_pred.h"
67*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_pslice.h"
68*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
69*495ae853SAndroid Build Coastguard Worker #include "ih264d_cabac.h"
70*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
71*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
72*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_slice.h"
73*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
74*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_islice.h"
75*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_bslice.h"
76*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_intra_mb.h"
77*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
78*495ae853SAndroid Build Coastguard Worker 
79*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
80*495ae853SAndroid Build Coastguard Worker /*                                                                           */
81*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_residual_chroma_dyadic_alt                          */
82*495ae853SAndroid Build Coastguard Worker /*                                                                           */
83*495ae853SAndroid Build Coastguard Worker /*  Description   : this fucntion does the upsampling of chroma residuals for*/
84*495ae853SAndroid Build Coastguard Worker /*                  Dyadic cases and specific chroma phase cases             */
85*495ae853SAndroid Build Coastguard Worker /*                                                                           */
86*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_residual_samp_ctxt : Residual upsampling context      */
87*495ae853SAndroid Build Coastguard Worker /*                  pu1_inp_data : input 8 bit data pointer                  */
88*495ae853SAndroid Build Coastguard Worker /*                  i4_inp_data_stride : input buffer stride                 */
89*495ae853SAndroid Build Coastguard Worker /*                  pi2_out_res : output 16 bit buffer pointer               */
90*495ae853SAndroid Build Coastguard Worker /*                  i4_out_res_stride : Output buffer stride                 */
91*495ae853SAndroid Build Coastguard Worker /*                  pu1_inp_bitmap : input packed sign bit data pointer      */
92*495ae853SAndroid Build Coastguard Worker /*                  i4_inp_bitmap_stride : sign bit buffer stride            */
93*495ae853SAndroid Build Coastguard Worker /*                  i4_start_bit_pos : bit position in the byte of packed    */
94*495ae853SAndroid Build Coastguard Worker /*                                      sign values                          */
95*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
96*495ae853SAndroid Build Coastguard Worker /*  Processing    : it does the upsampling with intial phase values          */
97*495ae853SAndroid Build Coastguard Worker /*                                                                           */
98*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Upsampled residuals for chroma                           */
99*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
100*495ae853SAndroid Build Coastguard Worker /*                                                                           */
101*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
102*495ae853SAndroid Build Coastguard Worker /*                                                                           */
103*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
104*495ae853SAndroid Build Coastguard Worker /*                                                                           */
105*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
106*495ae853SAndroid Build Coastguard Worker /*         25 09 2021   vijayakumar          creation                        */
107*495ae853SAndroid Build Coastguard Worker /*                                                                           */
108*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_residual_chroma_dyadic_alt(void * pv_residual_samp_ctxt,UWORD16 u2_mb_x,UWORD16 u2_mb_y,mem_element_t * ps_ref_mb_mode,WORD16 * pi2_inp_data,WORD32 i4_inp_data_stride,WORD16 * pi2_out_res,WORD32 i4_out_res_stride,WORD32 i4_cr_flag)109*495ae853SAndroid Build Coastguard Worker void isvcd_residual_chroma_dyadic_alt(void *pv_residual_samp_ctxt, UWORD16 u2_mb_x, UWORD16 u2_mb_y,
110*495ae853SAndroid Build Coastguard Worker                                       mem_element_t *ps_ref_mb_mode, WORD16 *pi2_inp_data,
111*495ae853SAndroid Build Coastguard Worker                                       WORD32 i4_inp_data_stride, WORD16 *pi2_out_res,
112*495ae853SAndroid Build Coastguard Worker                                       WORD32 i4_out_res_stride, WORD32 i4_cr_flag)
113*495ae853SAndroid Build Coastguard Worker {
114*495ae853SAndroid Build Coastguard Worker     residual_sampling_ctxt_t *ps_ctxt;
115*495ae853SAndroid Build Coastguard Worker     res_lyr_ctxt *ps_lyr_ctxt;
116*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt;
117*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
118*495ae853SAndroid Build Coastguard Worker     /* ----------------- Processing ------------------------------- */
119*495ae853SAndroid Build Coastguard Worker     {
120*495ae853SAndroid Build Coastguard Worker         ref_pixel_map_t *ps_pos_phase;
121*495ae853SAndroid Build Coastguard Worker         residual_samp_map_ctxt_t *ps_chroma_map;
122*495ae853SAndroid Build Coastguard Worker         ref_mb_map_t *ps_x_off_len_chroma;
123*495ae853SAndroid Build Coastguard Worker         ref_mb_map_t *ps_y_off_len_chroma;
124*495ae853SAndroid Build Coastguard Worker         WORD32 i4_i;
125*495ae853SAndroid Build Coastguard Worker         WORD16 *pi2_ref_data_byte;
126*495ae853SAndroid Build Coastguard Worker         WORD32 *pi4_ref_array;
127*495ae853SAndroid Build Coastguard Worker         WORD32 i4_phase1, i4_phase2;
128*495ae853SAndroid Build Coastguard Worker         WORD32 i4_offset_x, i4_offset_y;
129*495ae853SAndroid Build Coastguard Worker         WORD32 i4_chrm_horz_int_mode, i4_chrm_vert_int_mode;
130*495ae853SAndroid Build Coastguard Worker         WORD32 i4_horz_intp_ctr = SUB_BLOCK_HEIGHT;
131*495ae853SAndroid Build Coastguard Worker 
132*495ae853SAndroid Build Coastguard Worker         ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
133*495ae853SAndroid Build Coastguard Worker         ps_x_off_len_chroma = ps_chroma_map->ps_x_offset_length;
134*495ae853SAndroid Build Coastguard Worker         ps_y_off_len_chroma = ps_chroma_map->ps_y_offset_length;
135*495ae853SAndroid Build Coastguard Worker 
136*495ae853SAndroid Build Coastguard Worker         /* get the actual offset for the buffers */
137*495ae853SAndroid Build Coastguard Worker         i4_offset_x = ps_x_off_len_chroma[u2_mb_x].i2_offset;
138*495ae853SAndroid Build Coastguard Worker         i4_offset_y = ps_y_off_len_chroma[u2_mb_y].i2_offset;
139*495ae853SAndroid Build Coastguard Worker 
140*495ae853SAndroid Build Coastguard Worker         {
141*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_mask;
142*495ae853SAndroid Build Coastguard Worker             WORD32 i4_mb_x, i4_mb_y;
143*495ae853SAndroid Build Coastguard Worker             WORD32 i4_chrm_nnz;
144*495ae853SAndroid Build Coastguard Worker             WORD32 i4_num_element_stride;
145*495ae853SAndroid Build Coastguard Worker             inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms, *ps_inter_lyr_mb_prms_curr;
146*495ae853SAndroid Build Coastguard Worker 
147*495ae853SAndroid Build Coastguard Worker             u1_mask = (SVCD_TRUE == i4_cr_flag) ? 0xF0 : 0x0F;
148*495ae853SAndroid Build Coastguard Worker 
149*495ae853SAndroid Build Coastguard Worker             /* Top Left */
150*495ae853SAndroid Build Coastguard Worker             i4_mb_x = i4_offset_x >> 3;
151*495ae853SAndroid Build Coastguard Worker             i4_mb_y = i4_offset_y >> 3;
152*495ae853SAndroid Build Coastguard Worker 
153*495ae853SAndroid Build Coastguard Worker             /* get the location of the byte which has the current mb mode */
154*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms = ps_ref_mb_mode->pv_buffer;
155*495ae853SAndroid Build Coastguard Worker             i4_num_element_stride = ps_ref_mb_mode->i4_num_element_stride;
156*495ae853SAndroid Build Coastguard Worker 
157*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms_curr = ps_inter_lyr_mb_prms + i4_mb_x;
158*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms_curr += i4_mb_y * i4_num_element_stride;
159*495ae853SAndroid Build Coastguard Worker             i4_chrm_nnz = ps_inter_lyr_mb_prms_curr->u1_chroma_nnz & u1_mask;
160*495ae853SAndroid Build Coastguard Worker 
161*495ae853SAndroid Build Coastguard Worker             /* Top Right */
162*495ae853SAndroid Build Coastguard Worker             i4_mb_x = (i4_offset_x + 4) >> 3;
163*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms_curr = ps_inter_lyr_mb_prms + i4_mb_x;
164*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms_curr += i4_mb_y * i4_num_element_stride;
165*495ae853SAndroid Build Coastguard Worker             i4_chrm_nnz |= ps_inter_lyr_mb_prms_curr->u1_chroma_nnz & u1_mask;
166*495ae853SAndroid Build Coastguard Worker 
167*495ae853SAndroid Build Coastguard Worker             /* Bottom Left */
168*495ae853SAndroid Build Coastguard Worker             i4_mb_x = i4_offset_x >> 3;
169*495ae853SAndroid Build Coastguard Worker             i4_mb_y = (i4_offset_y + 4) >> 3;
170*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms_curr = ps_inter_lyr_mb_prms + i4_mb_x;
171*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms_curr += i4_mb_y * i4_num_element_stride;
172*495ae853SAndroid Build Coastguard Worker             i4_chrm_nnz |= ps_inter_lyr_mb_prms_curr->u1_chroma_nnz & u1_mask;
173*495ae853SAndroid Build Coastguard Worker 
174*495ae853SAndroid Build Coastguard Worker             /* Bottom Right */
175*495ae853SAndroid Build Coastguard Worker             i4_mb_x = (i4_offset_x + 4) >> 3;
176*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms_curr = ps_inter_lyr_mb_prms + i4_mb_x;
177*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms_curr += i4_mb_y * i4_num_element_stride;
178*495ae853SAndroid Build Coastguard Worker 
179*495ae853SAndroid Build Coastguard Worker             i4_chrm_nnz |= ps_inter_lyr_mb_prms_curr->u1_chroma_nnz & u1_mask;
180*495ae853SAndroid Build Coastguard Worker             if(0 == i4_chrm_nnz)
181*495ae853SAndroid Build Coastguard Worker             {
182*495ae853SAndroid Build Coastguard Worker                 return;
183*495ae853SAndroid Build Coastguard Worker             }
184*495ae853SAndroid Build Coastguard Worker         }
185*495ae853SAndroid Build Coastguard Worker 
186*495ae853SAndroid Build Coastguard Worker         i4_chrm_horz_int_mode = ps_lyr_ctxt->i4_chrm_horz_int_mode;
187*495ae853SAndroid Build Coastguard Worker         i4_chrm_vert_int_mode = ps_lyr_ctxt->i4_chrm_vert_int_mode;
188*495ae853SAndroid Build Coastguard Worker 
189*495ae853SAndroid Build Coastguard Worker         if(0 == i4_chrm_horz_int_mode)
190*495ae853SAndroid Build Coastguard Worker         {
191*495ae853SAndroid Build Coastguard Worker             if(i4_offset_x >= 0)
192*495ae853SAndroid Build Coastguard Worker             {
193*495ae853SAndroid Build Coastguard Worker                 pi2_inp_data++;
194*495ae853SAndroid Build Coastguard Worker             }
195*495ae853SAndroid Build Coastguard Worker         }
196*495ae853SAndroid Build Coastguard Worker 
197*495ae853SAndroid Build Coastguard Worker         if(0 == i4_chrm_vert_int_mode)
198*495ae853SAndroid Build Coastguard Worker         {
199*495ae853SAndroid Build Coastguard Worker             if(i4_offset_y >= 0)
200*495ae853SAndroid Build Coastguard Worker             {
201*495ae853SAndroid Build Coastguard Worker                 pi2_inp_data += i4_inp_data_stride;
202*495ae853SAndroid Build Coastguard Worker             }
203*495ae853SAndroid Build Coastguard Worker         }
204*495ae853SAndroid Build Coastguard Worker         else
205*495ae853SAndroid Build Coastguard Worker         {
206*495ae853SAndroid Build Coastguard Worker             /* extra additional row of interpolation required for this case */
207*495ae853SAndroid Build Coastguard Worker             i4_horz_intp_ctr++;
208*495ae853SAndroid Build Coastguard Worker         }
209*495ae853SAndroid Build Coastguard Worker 
210*495ae853SAndroid Build Coastguard Worker         /* ----------- Horizontal Interpolation ---------------- */
211*495ae853SAndroid Build Coastguard Worker         pi2_ref_data_byte = pi2_inp_data;
212*495ae853SAndroid Build Coastguard Worker         ps_pos_phase = ps_lyr_ctxt->s_chroma_map_ctxt.ps_x_pos_phase;
213*495ae853SAndroid Build Coastguard Worker 
214*495ae853SAndroid Build Coastguard Worker         pi4_ref_array = (WORD32 *) ps_ctxt->pi2_refarray_buffer;
215*495ae853SAndroid Build Coastguard Worker         i4_phase1 = ps_pos_phase[0].i2_phase;
216*495ae853SAndroid Build Coastguard Worker         i4_phase2 = (i4_phase1 + 8) & 0x0F;
217*495ae853SAndroid Build Coastguard Worker 
218*495ae853SAndroid Build Coastguard Worker         /* interchange the phase values for corner case */
219*495ae853SAndroid Build Coastguard Worker         if(1 == i4_chrm_horz_int_mode)
220*495ae853SAndroid Build Coastguard Worker         {
221*495ae853SAndroid Build Coastguard Worker             WORD32 i4_temp;
222*495ae853SAndroid Build Coastguard Worker             i4_temp = i4_phase1;
223*495ae853SAndroid Build Coastguard Worker             i4_phase1 = i4_phase2;
224*495ae853SAndroid Build Coastguard Worker             i4_phase2 = i4_temp;
225*495ae853SAndroid Build Coastguard Worker         }
226*495ae853SAndroid Build Coastguard Worker 
227*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < i4_horz_intp_ctr; i4_i++)
228*495ae853SAndroid Build Coastguard Worker         {
229*495ae853SAndroid Build Coastguard Worker             WORD16 i2_coeff1, i2_coeff2;
230*495ae853SAndroid Build Coastguard Worker 
231*495ae853SAndroid Build Coastguard Worker             i2_coeff1 = (WORD16) (pi2_ref_data_byte[0]);
232*495ae853SAndroid Build Coastguard Worker 
233*495ae853SAndroid Build Coastguard Worker             if(0 == i4_chrm_horz_int_mode)
234*495ae853SAndroid Build Coastguard Worker             {
235*495ae853SAndroid Build Coastguard Worker                 /* populate the first inter sample */
236*495ae853SAndroid Build Coastguard Worker                 *pi4_ref_array++ = i2_coeff1 << 4;
237*495ae853SAndroid Build Coastguard Worker             }
238*495ae853SAndroid Build Coastguard Worker 
239*495ae853SAndroid Build Coastguard Worker             /* unroll count 1 */
240*495ae853SAndroid Build Coastguard Worker             i2_coeff2 = (WORD16) (pi2_ref_data_byte[2]);
241*495ae853SAndroid Build Coastguard Worker 
242*495ae853SAndroid Build Coastguard Worker             /* populate 2 samples based on current coeffs */
243*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff1 + i4_phase2 * i2_coeff2);
244*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff1 + i4_phase1 * i2_coeff2);
245*495ae853SAndroid Build Coastguard Worker 
246*495ae853SAndroid Build Coastguard Worker             /* unroll count 2 */
247*495ae853SAndroid Build Coastguard Worker             i2_coeff1 = (WORD16) (pi2_ref_data_byte[4]);
248*495ae853SAndroid Build Coastguard Worker 
249*495ae853SAndroid Build Coastguard Worker             /* populate 2 samples based on current coeffs */
250*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff2 + i4_phase2 * i2_coeff1);
251*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff2 + i4_phase1 * i2_coeff1);
252*495ae853SAndroid Build Coastguard Worker 
253*495ae853SAndroid Build Coastguard Worker             /* unroll count 3 */
254*495ae853SAndroid Build Coastguard Worker             i2_coeff2 = (WORD16) (pi2_ref_data_byte[6]);
255*495ae853SAndroid Build Coastguard Worker 
256*495ae853SAndroid Build Coastguard Worker             /* populate 2 samples based on current coeffs */
257*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff1 + i4_phase2 * i2_coeff2);
258*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff1 + i4_phase1 * i2_coeff2);
259*495ae853SAndroid Build Coastguard Worker 
260*495ae853SAndroid Build Coastguard Worker             /* populate the last inter sample */
261*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = i2_coeff2 << 4;
262*495ae853SAndroid Build Coastguard Worker 
263*495ae853SAndroid Build Coastguard Worker             if(1 == i4_chrm_horz_int_mode)
264*495ae853SAndroid Build Coastguard Worker             {
265*495ae853SAndroid Build Coastguard Worker                 i2_coeff1 = (WORD16) (pi2_ref_data_byte[4]);
266*495ae853SAndroid Build Coastguard Worker 
267*495ae853SAndroid Build Coastguard Worker                 /* populate the last inter sample */
268*495ae853SAndroid Build Coastguard Worker                 *pi4_ref_array++ = i2_coeff1 << 4;
269*495ae853SAndroid Build Coastguard Worker             }
270*495ae853SAndroid Build Coastguard Worker 
271*495ae853SAndroid Build Coastguard Worker             /* vertical loop updates */
272*495ae853SAndroid Build Coastguard Worker             pi2_ref_data_byte = pi2_inp_data + ((i4_i + 1) * i4_inp_data_stride);
273*495ae853SAndroid Build Coastguard Worker         }
274*495ae853SAndroid Build Coastguard Worker 
275*495ae853SAndroid Build Coastguard Worker         /* ----------- Vertical Interpolation ---------------- */
276*495ae853SAndroid Build Coastguard Worker         pi4_ref_array = (WORD32 *) ps_ctxt->pi2_refarray_buffer;
277*495ae853SAndroid Build Coastguard Worker         ps_pos_phase = ps_lyr_ctxt->s_chroma_map_ctxt.ps_y_pos_phase;
278*495ae853SAndroid Build Coastguard Worker         i4_phase1 = ps_pos_phase[0].i2_phase;
279*495ae853SAndroid Build Coastguard Worker         i4_phase2 = (i4_phase1 + 8) & 0x0F;
280*495ae853SAndroid Build Coastguard Worker 
281*495ae853SAndroid Build Coastguard Worker         /* interchange the phase values for corner case */
282*495ae853SAndroid Build Coastguard Worker         if(0 != i4_chrm_vert_int_mode)
283*495ae853SAndroid Build Coastguard Worker         {
284*495ae853SAndroid Build Coastguard Worker             WORD32 i4_temp;
285*495ae853SAndroid Build Coastguard Worker             i4_temp = i4_phase1;
286*495ae853SAndroid Build Coastguard Worker             i4_phase1 = i4_phase2;
287*495ae853SAndroid Build Coastguard Worker             i4_phase2 = i4_temp;
288*495ae853SAndroid Build Coastguard Worker         }
289*495ae853SAndroid Build Coastguard Worker 
290*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < BLOCK_WIDTH; i4_i++)
291*495ae853SAndroid Build Coastguard Worker         {
292*495ae853SAndroid Build Coastguard Worker             WORD16 *pi2_out;
293*495ae853SAndroid Build Coastguard Worker             WORD32 *pi4_ref_array_temp;
294*495ae853SAndroid Build Coastguard Worker             WORD32 i4_horz_samp_1, i4_horz_samp_2;
295*495ae853SAndroid Build Coastguard Worker             pi2_out = pi2_out_res;
296*495ae853SAndroid Build Coastguard Worker             pi4_ref_array_temp = pi4_ref_array;
297*495ae853SAndroid Build Coastguard Worker 
298*495ae853SAndroid Build Coastguard Worker             /* populate the first inter sample */
299*495ae853SAndroid Build Coastguard Worker             i4_horz_samp_1 = *pi4_ref_array_temp;
300*495ae853SAndroid Build Coastguard Worker             pi4_ref_array_temp += BLOCK_WIDTH;
301*495ae853SAndroid Build Coastguard Worker 
302*495ae853SAndroid Build Coastguard Worker             if(1 != i4_chrm_vert_int_mode)
303*495ae853SAndroid Build Coastguard Worker             {
304*495ae853SAndroid Build Coastguard Worker                 *pi2_out = (i4_horz_samp_1 + 8) >> 4;
305*495ae853SAndroid Build Coastguard Worker                 pi2_out += i4_out_res_stride;
306*495ae853SAndroid Build Coastguard Worker             }
307*495ae853SAndroid Build Coastguard Worker 
308*495ae853SAndroid Build Coastguard Worker             if(2 == i4_chrm_vert_int_mode)
309*495ae853SAndroid Build Coastguard Worker             {
310*495ae853SAndroid Build Coastguard Worker                 i4_horz_samp_1 = *pi4_ref_array_temp;
311*495ae853SAndroid Build Coastguard Worker                 pi4_ref_array_temp += BLOCK_WIDTH;
312*495ae853SAndroid Build Coastguard Worker                 *pi2_out = (i4_horz_samp_1 + 8) >> 4;
313*495ae853SAndroid Build Coastguard Worker                 pi2_out += i4_out_res_stride;
314*495ae853SAndroid Build Coastguard Worker             }
315*495ae853SAndroid Build Coastguard Worker 
316*495ae853SAndroid Build Coastguard Worker             /* unroll count 1 */
317*495ae853SAndroid Build Coastguard Worker             i4_horz_samp_2 = *pi4_ref_array_temp;
318*495ae853SAndroid Build Coastguard Worker             pi4_ref_array_temp += BLOCK_WIDTH;
319*495ae853SAndroid Build Coastguard Worker 
320*495ae853SAndroid Build Coastguard Worker             /* populate 2 samples based on current coeffs */
321*495ae853SAndroid Build Coastguard Worker             *pi2_out = ((16 - i4_phase2) * i4_horz_samp_1 + i4_phase2 * i4_horz_samp_2 + 128) >> 8;
322*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
323*495ae853SAndroid Build Coastguard Worker 
324*495ae853SAndroid Build Coastguard Worker             /* unroll count 2 */
325*495ae853SAndroid Build Coastguard Worker             *pi2_out = ((16 - i4_phase1) * i4_horz_samp_1 + i4_phase1 * i4_horz_samp_2 + 128) >> 8;
326*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
327*495ae853SAndroid Build Coastguard Worker 
328*495ae853SAndroid Build Coastguard Worker             /* unroll count 3 */
329*495ae853SAndroid Build Coastguard Worker             i4_horz_samp_1 = *pi4_ref_array_temp;
330*495ae853SAndroid Build Coastguard Worker             pi4_ref_array_temp += BLOCK_WIDTH;
331*495ae853SAndroid Build Coastguard Worker 
332*495ae853SAndroid Build Coastguard Worker             /* populate 2 samples based on current coeffs */
333*495ae853SAndroid Build Coastguard Worker             *pi2_out = ((16 - i4_phase2) * i4_horz_samp_2 + i4_phase2 * i4_horz_samp_1 + 128) >> 8;
334*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
335*495ae853SAndroid Build Coastguard Worker 
336*495ae853SAndroid Build Coastguard Worker             /* unroll count 4 */
337*495ae853SAndroid Build Coastguard Worker             *pi2_out = ((16 - i4_phase1) * i4_horz_samp_2 + i4_phase1 * i4_horz_samp_1 + 128) >> 8;
338*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
339*495ae853SAndroid Build Coastguard Worker 
340*495ae853SAndroid Build Coastguard Worker             /* unroll count 5 */
341*495ae853SAndroid Build Coastguard Worker             i4_horz_samp_2 = *pi4_ref_array_temp;
342*495ae853SAndroid Build Coastguard Worker 
343*495ae853SAndroid Build Coastguard Worker             /* populate 2 samples based on current coeffs */
344*495ae853SAndroid Build Coastguard Worker             *pi2_out = ((16 - i4_phase2) * i4_horz_samp_1 + i4_phase2 * i4_horz_samp_2 + 128) >> 8;
345*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
346*495ae853SAndroid Build Coastguard Worker 
347*495ae853SAndroid Build Coastguard Worker             /* unroll count 6 */
348*495ae853SAndroid Build Coastguard Worker             *pi2_out = ((16 - i4_phase1) * i4_horz_samp_1 + i4_phase1 * i4_horz_samp_2 + 128) >> 8;
349*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
350*495ae853SAndroid Build Coastguard Worker 
351*495ae853SAndroid Build Coastguard Worker             if(2 != i4_chrm_vert_int_mode)
352*495ae853SAndroid Build Coastguard Worker             {
353*495ae853SAndroid Build Coastguard Worker                 /* populate the last inter sample */
354*495ae853SAndroid Build Coastguard Worker                 *pi2_out = (i4_horz_samp_2 + 8) >> 4;
355*495ae853SAndroid Build Coastguard Worker 
356*495ae853SAndroid Build Coastguard Worker                 if(1 == i4_chrm_vert_int_mode)
357*495ae853SAndroid Build Coastguard Worker                 {
358*495ae853SAndroid Build Coastguard Worker                     pi2_out += i4_out_res_stride;
359*495ae853SAndroid Build Coastguard Worker                     pi4_ref_array_temp += BLOCK_WIDTH;
360*495ae853SAndroid Build Coastguard Worker                     i4_horz_samp_1 = *pi4_ref_array_temp;
361*495ae853SAndroid Build Coastguard Worker 
362*495ae853SAndroid Build Coastguard Worker                     /* populate the last inter sample */
363*495ae853SAndroid Build Coastguard Worker                     *pi2_out = (i4_horz_samp_1 + 8) >> 4;
364*495ae853SAndroid Build Coastguard Worker                 }
365*495ae853SAndroid Build Coastguard Worker             }
366*495ae853SAndroid Build Coastguard Worker             /* horizontal loop updates */
367*495ae853SAndroid Build Coastguard Worker             pi4_ref_array++;
368*495ae853SAndroid Build Coastguard Worker             pi2_out_res += 2;
369*495ae853SAndroid Build Coastguard Worker         }
370*495ae853SAndroid Build Coastguard Worker     }
371*495ae853SAndroid Build Coastguard Worker     return;
372*495ae853SAndroid Build Coastguard Worker }
373*495ae853SAndroid Build Coastguard Worker 
374*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
375*495ae853SAndroid Build Coastguard Worker /*                                                                           */
376*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_residual_chroma_dyadic                              */
377*495ae853SAndroid Build Coastguard Worker /*                                                                           */
378*495ae853SAndroid Build Coastguard Worker /*  Description   : this fucntion does the upsampling of chroma residuals for*/
379*495ae853SAndroid Build Coastguard Worker /*                  Dyadic cases                                             */
380*495ae853SAndroid Build Coastguard Worker /*                                                                           */
381*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_residual_samp_ctxt : Residual upsampling context      */
382*495ae853SAndroid Build Coastguard Worker /*                  pu1_inp_data : input 8 bit data pointer                  */
383*495ae853SAndroid Build Coastguard Worker /*                  i4_inp_data_stride : input buffer stride                 */
384*495ae853SAndroid Build Coastguard Worker /*                  pi2_out_res : output 16 bit buffer pointer               */
385*495ae853SAndroid Build Coastguard Worker /*                  i4_out_res_stride : Output buffer stride                 */
386*495ae853SAndroid Build Coastguard Worker /*                  pu1_inp_bitmap : input packed sign bit data pointer      */
387*495ae853SAndroid Build Coastguard Worker /*                  i4_inp_bitmap_stride : sign bit buffer stride            */
388*495ae853SAndroid Build Coastguard Worker /*                  i4_start_bit_pos : bit position in the byte of packed    */
389*495ae853SAndroid Build Coastguard Worker /*                                      sign values                          */
390*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
391*495ae853SAndroid Build Coastguard Worker /*  Processing    : it does the upsampling with intial phase values          */
392*495ae853SAndroid Build Coastguard Worker /*                                                                           */
393*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Upsampled residuals for chroma                           */
394*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
395*495ae853SAndroid Build Coastguard Worker /*                                                                           */
396*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
397*495ae853SAndroid Build Coastguard Worker /*                                                                           */
398*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
399*495ae853SAndroid Build Coastguard Worker /*                                                                           */
400*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
401*495ae853SAndroid Build Coastguard Worker /*         25 09 2021   vijayakumar          creation                        */
402*495ae853SAndroid Build Coastguard Worker /*                                                                           */
403*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_residual_chroma_dyadic(void * pv_residual_samp_ctxt,WORD16 * pi2_inp_data,WORD32 i4_inp_data_stride,WORD16 * pi2_out_res,WORD32 i4_out_res_stride)404*495ae853SAndroid Build Coastguard Worker void isvcd_residual_chroma_dyadic(void *pv_residual_samp_ctxt, WORD16 *pi2_inp_data,
405*495ae853SAndroid Build Coastguard Worker                                   WORD32 i4_inp_data_stride, WORD16 *pi2_out_res,
406*495ae853SAndroid Build Coastguard Worker                                   WORD32 i4_out_res_stride)
407*495ae853SAndroid Build Coastguard Worker {
408*495ae853SAndroid Build Coastguard Worker     residual_sampling_ctxt_t *ps_ctxt;
409*495ae853SAndroid Build Coastguard Worker     res_lyr_ctxt *ps_lyr_ctxt;
410*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt;
411*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
412*495ae853SAndroid Build Coastguard Worker     /* ----------------- Processing ------------------------------- */
413*495ae853SAndroid Build Coastguard Worker     {
414*495ae853SAndroid Build Coastguard Worker         WORD32 i4_i;
415*495ae853SAndroid Build Coastguard Worker         WORD16 *pi2_ref_data_byte;
416*495ae853SAndroid Build Coastguard Worker         WORD32 *pi4_ref_array;
417*495ae853SAndroid Build Coastguard Worker         ref_pixel_map_t *ps_pos_phase;
418*495ae853SAndroid Build Coastguard Worker         WORD32 i4_phase1, i4_phase2;
419*495ae853SAndroid Build Coastguard Worker 
420*495ae853SAndroid Build Coastguard Worker         pi2_ref_data_byte = pi2_inp_data;
421*495ae853SAndroid Build Coastguard Worker         ps_pos_phase = ps_lyr_ctxt->s_chroma_map_ctxt.ps_x_pos_phase;
422*495ae853SAndroid Build Coastguard Worker 
423*495ae853SAndroid Build Coastguard Worker         /* ----------- Horizontal Interpolation ---------------- */
424*495ae853SAndroid Build Coastguard Worker         pi4_ref_array = (WORD32 *) ps_ctxt->pi2_refarray_buffer;
425*495ae853SAndroid Build Coastguard Worker         i4_phase1 = ps_pos_phase[0].i2_phase;
426*495ae853SAndroid Build Coastguard Worker         i4_phase2 = (i4_phase1 + 8) & 0x0F;
427*495ae853SAndroid Build Coastguard Worker 
428*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < SUB_BLOCK_HEIGHT; i4_i++)
429*495ae853SAndroid Build Coastguard Worker         {
430*495ae853SAndroid Build Coastguard Worker             WORD16 i2_coeff1, i2_coeff2;
431*495ae853SAndroid Build Coastguard Worker             i2_coeff1 = (WORD16) (pi2_ref_data_byte[0]);
432*495ae853SAndroid Build Coastguard Worker 
433*495ae853SAndroid Build Coastguard Worker             /* populate the first inter sample */
434*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = i2_coeff1 << 4;
435*495ae853SAndroid Build Coastguard Worker 
436*495ae853SAndroid Build Coastguard Worker             /* unroll count 1 */
437*495ae853SAndroid Build Coastguard Worker             i2_coeff2 = (WORD16) (pi2_ref_data_byte[2]);
438*495ae853SAndroid Build Coastguard Worker 
439*495ae853SAndroid Build Coastguard Worker             /* populate 2 samples based on current coeffs */
440*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff1 + i4_phase2 * i2_coeff2);
441*495ae853SAndroid Build Coastguard Worker 
442*495ae853SAndroid Build Coastguard Worker             /* unroll count 2 */
443*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff1 + i4_phase1 * i2_coeff2);
444*495ae853SAndroid Build Coastguard Worker 
445*495ae853SAndroid Build Coastguard Worker             /* unroll count 3 */
446*495ae853SAndroid Build Coastguard Worker             i2_coeff1 = (WORD16) (pi2_ref_data_byte[4]);
447*495ae853SAndroid Build Coastguard Worker 
448*495ae853SAndroid Build Coastguard Worker             /* populate 2 samples based on current coeffs */
449*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff2 + i4_phase2 * i2_coeff1);
450*495ae853SAndroid Build Coastguard Worker 
451*495ae853SAndroid Build Coastguard Worker             /* unroll count 4 */
452*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff2 + i4_phase1 * i2_coeff1);
453*495ae853SAndroid Build Coastguard Worker 
454*495ae853SAndroid Build Coastguard Worker             /* unroll count 5 */
455*495ae853SAndroid Build Coastguard Worker             i2_coeff2 = (WORD16) (pi2_ref_data_byte[6]);
456*495ae853SAndroid Build Coastguard Worker 
457*495ae853SAndroid Build Coastguard Worker             /* populate 2 samples based on current coeffs */
458*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff1 + i4_phase2 * i2_coeff2);
459*495ae853SAndroid Build Coastguard Worker 
460*495ae853SAndroid Build Coastguard Worker             /* unroll count 6 */
461*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff1 + i4_phase1 * i2_coeff2);
462*495ae853SAndroid Build Coastguard Worker 
463*495ae853SAndroid Build Coastguard Worker             /* populate the last inter sample */
464*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = i2_coeff2 << 4;
465*495ae853SAndroid Build Coastguard Worker 
466*495ae853SAndroid Build Coastguard Worker             /* vertical loop uopdates */
467*495ae853SAndroid Build Coastguard Worker             pi2_ref_data_byte = pi2_inp_data + ((i4_i + 1) * i4_inp_data_stride);
468*495ae853SAndroid Build Coastguard Worker         }
469*495ae853SAndroid Build Coastguard Worker 
470*495ae853SAndroid Build Coastguard Worker         /* ----------- Vertical Interpolation ---------------- */
471*495ae853SAndroid Build Coastguard Worker         pi4_ref_array = (WORD32 *) ps_ctxt->pi2_refarray_buffer;
472*495ae853SAndroid Build Coastguard Worker         ps_pos_phase = ps_lyr_ctxt->s_chroma_map_ctxt.ps_y_pos_phase;
473*495ae853SAndroid Build Coastguard Worker         i4_phase1 = ps_pos_phase[0].i2_phase;
474*495ae853SAndroid Build Coastguard Worker         i4_phase2 = (i4_phase1 + 8) & 0x0F;
475*495ae853SAndroid Build Coastguard Worker 
476*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < BLOCK_WIDTH; i4_i++)
477*495ae853SAndroid Build Coastguard Worker         {
478*495ae853SAndroid Build Coastguard Worker             WORD16 *pi2_out;
479*495ae853SAndroid Build Coastguard Worker             WORD32 *pi4_ref_array_temp;
480*495ae853SAndroid Build Coastguard Worker             WORD32 i4_horz_samp_1, i4_horz_samp_2;
481*495ae853SAndroid Build Coastguard Worker             pi2_out = pi2_out_res;
482*495ae853SAndroid Build Coastguard Worker             pi4_ref_array_temp = pi4_ref_array;
483*495ae853SAndroid Build Coastguard Worker 
484*495ae853SAndroid Build Coastguard Worker             /* populate the first inter sample */
485*495ae853SAndroid Build Coastguard Worker             i4_horz_samp_1 = *pi4_ref_array_temp;
486*495ae853SAndroid Build Coastguard Worker             pi4_ref_array_temp += BLOCK_WIDTH;
487*495ae853SAndroid Build Coastguard Worker             *pi2_out = (i4_horz_samp_1 + 8) >> 4;
488*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
489*495ae853SAndroid Build Coastguard Worker 
490*495ae853SAndroid Build Coastguard Worker             /* unroll count 1 */
491*495ae853SAndroid Build Coastguard Worker             i4_horz_samp_2 = *pi4_ref_array_temp;
492*495ae853SAndroid Build Coastguard Worker             pi4_ref_array_temp += BLOCK_WIDTH;
493*495ae853SAndroid Build Coastguard Worker 
494*495ae853SAndroid Build Coastguard Worker             /* populate 2 samples based on current coeffs */
495*495ae853SAndroid Build Coastguard Worker             *pi2_out = ((16 - i4_phase2) * i4_horz_samp_1 + i4_phase2 * i4_horz_samp_2 + 128) >> 8;
496*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
497*495ae853SAndroid Build Coastguard Worker 
498*495ae853SAndroid Build Coastguard Worker             /* unroll count 2 */
499*495ae853SAndroid Build Coastguard Worker             *pi2_out = ((16 - i4_phase1) * i4_horz_samp_1 + i4_phase1 * i4_horz_samp_2 + 128) >> 8;
500*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
501*495ae853SAndroid Build Coastguard Worker 
502*495ae853SAndroid Build Coastguard Worker             /* unroll count 3 */
503*495ae853SAndroid Build Coastguard Worker             i4_horz_samp_1 = *pi4_ref_array_temp;
504*495ae853SAndroid Build Coastguard Worker             pi4_ref_array_temp += BLOCK_WIDTH;
505*495ae853SAndroid Build Coastguard Worker 
506*495ae853SAndroid Build Coastguard Worker             /* populate 2 samples based on current coeffs */
507*495ae853SAndroid Build Coastguard Worker             *pi2_out = ((16 - i4_phase2) * i4_horz_samp_2 + i4_phase2 * i4_horz_samp_1 + 128) >> 8;
508*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
509*495ae853SAndroid Build Coastguard Worker 
510*495ae853SAndroid Build Coastguard Worker             /* unroll count 4 */
511*495ae853SAndroid Build Coastguard Worker             *pi2_out = ((16 - i4_phase1) * i4_horz_samp_2 + i4_phase1 * i4_horz_samp_1 + 128) >> 8;
512*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
513*495ae853SAndroid Build Coastguard Worker 
514*495ae853SAndroid Build Coastguard Worker             /* unroll count 5 */
515*495ae853SAndroid Build Coastguard Worker             i4_horz_samp_2 = *pi4_ref_array_temp;
516*495ae853SAndroid Build Coastguard Worker 
517*495ae853SAndroid Build Coastguard Worker             /* populate 2 samples based on current coeffs */
518*495ae853SAndroid Build Coastguard Worker             *pi2_out = ((16 - i4_phase2) * i4_horz_samp_1 + i4_phase2 * i4_horz_samp_2 + 128) >> 8;
519*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
520*495ae853SAndroid Build Coastguard Worker 
521*495ae853SAndroid Build Coastguard Worker             /* unroll count 6 */
522*495ae853SAndroid Build Coastguard Worker             *pi2_out = ((16 - i4_phase1) * i4_horz_samp_1 + i4_phase1 * i4_horz_samp_2 + 128) >> 8;
523*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
524*495ae853SAndroid Build Coastguard Worker 
525*495ae853SAndroid Build Coastguard Worker             /* populate the last inter sample */
526*495ae853SAndroid Build Coastguard Worker             *pi2_out = (i4_horz_samp_2 + 8) >> 4;
527*495ae853SAndroid Build Coastguard Worker 
528*495ae853SAndroid Build Coastguard Worker             /* horizontal loop updates */
529*495ae853SAndroid Build Coastguard Worker             pi4_ref_array++;
530*495ae853SAndroid Build Coastguard Worker             pi2_out_res += 2;
531*495ae853SAndroid Build Coastguard Worker         }
532*495ae853SAndroid Build Coastguard Worker     }
533*495ae853SAndroid Build Coastguard Worker     return;
534*495ae853SAndroid Build Coastguard Worker }
535*495ae853SAndroid Build Coastguard Worker 
536*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
537*495ae853SAndroid Build Coastguard Worker /*                                                                           */
538*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_residual_luma_dyadic                                */
539*495ae853SAndroid Build Coastguard Worker /*                                                                           */
540*495ae853SAndroid Build Coastguard Worker /*  Description   : this fucntion does the upsampling of luma residuals for  */
541*495ae853SAndroid Build Coastguard Worker /*                  Dyadic cases                                             */
542*495ae853SAndroid Build Coastguard Worker /*                                                                           */
543*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_residual_samp_ctxt : Residual upsampling context      */
544*495ae853SAndroid Build Coastguard Worker /*                  pu1_inp_data : input 8 bit data pointer                  */
545*495ae853SAndroid Build Coastguard Worker /*                  i4_inp_data_stride : input buffer stride                 */
546*495ae853SAndroid Build Coastguard Worker /*                  pi2_out_res : output 16 bit buffer pointer               */
547*495ae853SAndroid Build Coastguard Worker /*                  i4_out_res_stride : Output buffer stride                 */
548*495ae853SAndroid Build Coastguard Worker /*                  pu1_inp_bitmap : input packed sign bit data pointer      */
549*495ae853SAndroid Build Coastguard Worker /*                  i4_inp_bitmap_stride : sign bit buffer stride            */
550*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_mb_mode : reference mb mode pointer of base layer */
551*495ae853SAndroid Build Coastguard Worker /*                  ps_coord : mb co-ordinate pointer                        */
552*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
553*495ae853SAndroid Build Coastguard Worker /*  Processing    : it does the upsampling with fixed phase values and       */
554*495ae853SAndroid Build Coastguard Worker /*                  reference layer transform size                           */
555*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Upsampled residuals for luma                             */
556*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
557*495ae853SAndroid Build Coastguard Worker /*                                                                           */
558*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
559*495ae853SAndroid Build Coastguard Worker /*                                                                           */
560*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
561*495ae853SAndroid Build Coastguard Worker /*                                                                           */
562*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
563*495ae853SAndroid Build Coastguard Worker /*         25 09 2021   vijayakumar          creation                        */
564*495ae853SAndroid Build Coastguard Worker /*                                                                           */
565*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_residual_luma_dyadic(void * pv_residual_samp_ctxt,WORD16 * pi2_inp_data,WORD32 i4_inp_data_stride,WORD16 * pi2_out_res,WORD32 i4_out_res_stride,mem_element_t * ps_ref_mb_mode,UWORD16 u2_mb_x,UWORD16 u2_mb_y,WORD32 i4_ref_nnz,WORD32 i4_ref_tx_size)566*495ae853SAndroid Build Coastguard Worker void isvcd_residual_luma_dyadic(void *pv_residual_samp_ctxt, WORD16 *pi2_inp_data,
567*495ae853SAndroid Build Coastguard Worker                                 WORD32 i4_inp_data_stride, WORD16 *pi2_out_res,
568*495ae853SAndroid Build Coastguard Worker                                 WORD32 i4_out_res_stride, mem_element_t *ps_ref_mb_mode,
569*495ae853SAndroid Build Coastguard Worker                                 UWORD16 u2_mb_x, UWORD16 u2_mb_y, WORD32 i4_ref_nnz,
570*495ae853SAndroid Build Coastguard Worker                                 WORD32 i4_ref_tx_size)
571*495ae853SAndroid Build Coastguard Worker 
572*495ae853SAndroid Build Coastguard Worker {
573*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_refarray_buffer;
574*495ae853SAndroid Build Coastguard Worker     WORD32 i4_blk_ctr;
575*495ae853SAndroid Build Coastguard Worker     residual_sampling_ctxt_t *ps_ctxt;
576*495ae853SAndroid Build Coastguard Worker 
577*495ae853SAndroid Build Coastguard Worker     UNUSED(ps_ref_mb_mode);
578*495ae853SAndroid Build Coastguard Worker     UNUSED(u2_mb_x);
579*495ae853SAndroid Build Coastguard Worker     UNUSED(u2_mb_y);
580*495ae853SAndroid Build Coastguard Worker 
581*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt;
582*495ae853SAndroid Build Coastguard Worker     pi2_refarray_buffer = ps_ctxt->pi2_refarray_buffer;
583*495ae853SAndroid Build Coastguard Worker 
584*495ae853SAndroid Build Coastguard Worker     /* based on transform size the counter and interpolation width and */
585*495ae853SAndroid Build Coastguard Worker     /* height are intialised as follows                                */
586*495ae853SAndroid Build Coastguard Worker     if((i4_ref_tx_size) && (0 != i4_ref_nnz))
587*495ae853SAndroid Build Coastguard Worker     {
588*495ae853SAndroid Build Coastguard Worker         WORD16 *pi2_ref_data_byte;
589*495ae853SAndroid Build Coastguard Worker         WORD32 *pi4_ref_array;
590*495ae853SAndroid Build Coastguard Worker         WORD32 i4_i, i4_j;
591*495ae853SAndroid Build Coastguard Worker 
592*495ae853SAndroid Build Coastguard Worker         pi2_ref_data_byte = pi2_inp_data;
593*495ae853SAndroid Build Coastguard Worker 
594*495ae853SAndroid Build Coastguard Worker         /* ----------- Horizontal Interpolation ---------------- */
595*495ae853SAndroid Build Coastguard Worker         pi4_ref_array = (WORD32 *) pi2_refarray_buffer;
596*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < BLOCK_HEIGHT; i4_i++)
597*495ae853SAndroid Build Coastguard Worker         {
598*495ae853SAndroid Build Coastguard Worker             WORD16 i2_coeff1, i2_coeff2;
599*495ae853SAndroid Build Coastguard Worker             i2_coeff1 = (WORD16) (*pi2_ref_data_byte++);
600*495ae853SAndroid Build Coastguard Worker 
601*495ae853SAndroid Build Coastguard Worker             /* populate the first inter sample */
602*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = i2_coeff1 << 2;
603*495ae853SAndroid Build Coastguard Worker 
604*495ae853SAndroid Build Coastguard Worker             for(i4_j = 0; i4_j < 14; i4_j += 2)
605*495ae853SAndroid Build Coastguard Worker             {
606*495ae853SAndroid Build Coastguard Worker                 i2_coeff2 = (WORD16) (*pi2_ref_data_byte++);
607*495ae853SAndroid Build Coastguard Worker 
608*495ae853SAndroid Build Coastguard Worker                 /* populate 2 samples based on current coeffs */
609*495ae853SAndroid Build Coastguard Worker                 *pi4_ref_array++ = ((i2_coeff1 << 1) + (i2_coeff1) + (i2_coeff2));
610*495ae853SAndroid Build Coastguard Worker                 *pi4_ref_array++ = ((i2_coeff2 << 1) + (i2_coeff2) + (i2_coeff1));
611*495ae853SAndroid Build Coastguard Worker 
612*495ae853SAndroid Build Coastguard Worker                 /* store the coeff 2 to coeff 1 */
613*495ae853SAndroid Build Coastguard Worker                 /* (used in next iteration)     */
614*495ae853SAndroid Build Coastguard Worker                 i2_coeff1 = i2_coeff2;
615*495ae853SAndroid Build Coastguard Worker             }
616*495ae853SAndroid Build Coastguard Worker 
617*495ae853SAndroid Build Coastguard Worker             /* populate the last inter sample */
618*495ae853SAndroid Build Coastguard Worker             *pi4_ref_array++ = i2_coeff1 << 2;
619*495ae853SAndroid Build Coastguard Worker 
620*495ae853SAndroid Build Coastguard Worker             /* vertical loop uopdates */
621*495ae853SAndroid Build Coastguard Worker             pi2_ref_data_byte = pi2_inp_data + ((i4_i + 1) * i4_inp_data_stride);
622*495ae853SAndroid Build Coastguard Worker         }
623*495ae853SAndroid Build Coastguard Worker 
624*495ae853SAndroid Build Coastguard Worker         /* ----------- Vertical Interpolation ---------------- */
625*495ae853SAndroid Build Coastguard Worker         pi4_ref_array = (WORD32 *) pi2_refarray_buffer;
626*495ae853SAndroid Build Coastguard Worker 
627*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < MB_WIDTH; i4_i++)
628*495ae853SAndroid Build Coastguard Worker         {
629*495ae853SAndroid Build Coastguard Worker             WORD32 *pi4_ref_array_temp;
630*495ae853SAndroid Build Coastguard Worker             WORD16 *pi2_out;
631*495ae853SAndroid Build Coastguard Worker             WORD32 i4_horz_samp_1, i4_horz_samp_2;
632*495ae853SAndroid Build Coastguard Worker 
633*495ae853SAndroid Build Coastguard Worker             pi4_ref_array_temp = pi4_ref_array;
634*495ae853SAndroid Build Coastguard Worker             pi2_out = pi2_out_res;
635*495ae853SAndroid Build Coastguard Worker             i4_horz_samp_1 = *pi4_ref_array_temp;
636*495ae853SAndroid Build Coastguard Worker 
637*495ae853SAndroid Build Coastguard Worker             /* populate the first inter sample */
638*495ae853SAndroid Build Coastguard Worker             *pi2_out = (i4_horz_samp_1 + 2) >> 2;
639*495ae853SAndroid Build Coastguard Worker             pi2_out += i4_out_res_stride;
640*495ae853SAndroid Build Coastguard Worker 
641*495ae853SAndroid Build Coastguard Worker             for(i4_j = 0; i4_j < 14; i4_j += 2)
642*495ae853SAndroid Build Coastguard Worker             {
643*495ae853SAndroid Build Coastguard Worker                 pi4_ref_array_temp += MB_WIDTH;
644*495ae853SAndroid Build Coastguard Worker                 i4_horz_samp_2 = *pi4_ref_array_temp;
645*495ae853SAndroid Build Coastguard Worker 
646*495ae853SAndroid Build Coastguard Worker                 /* populate 2 samples based on current coeffs */
647*495ae853SAndroid Build Coastguard Worker                 *pi2_out = ((i4_horz_samp_1 << 1) + (i4_horz_samp_1) + (i4_horz_samp_2) + 8) >> 4;
648*495ae853SAndroid Build Coastguard Worker                 pi2_out += i4_out_res_stride;
649*495ae853SAndroid Build Coastguard Worker                 *pi2_out = ((i4_horz_samp_2 << 1) + (i4_horz_samp_2) + (i4_horz_samp_1) + 8) >> 4;
650*495ae853SAndroid Build Coastguard Worker                 pi2_out += i4_out_res_stride;
651*495ae853SAndroid Build Coastguard Worker 
652*495ae853SAndroid Build Coastguard Worker                 /* store the coeff 2 to coeff 1 */
653*495ae853SAndroid Build Coastguard Worker                 /* (used in next iteration)     */
654*495ae853SAndroid Build Coastguard Worker                 i4_horz_samp_1 = i4_horz_samp_2;
655*495ae853SAndroid Build Coastguard Worker             }
656*495ae853SAndroid Build Coastguard Worker 
657*495ae853SAndroid Build Coastguard Worker             /* populate the first inter sample */
658*495ae853SAndroid Build Coastguard Worker             *pi2_out = (i4_horz_samp_1 + 2) >> 2;
659*495ae853SAndroid Build Coastguard Worker 
660*495ae853SAndroid Build Coastguard Worker             /* horizontal loop updates */
661*495ae853SAndroid Build Coastguard Worker             pi4_ref_array++;
662*495ae853SAndroid Build Coastguard Worker             pi2_out_res++;
663*495ae853SAndroid Build Coastguard Worker         }
664*495ae853SAndroid Build Coastguard Worker     }
665*495ae853SAndroid Build Coastguard Worker     else
666*495ae853SAndroid Build Coastguard Worker     {
667*495ae853SAndroid Build Coastguard Worker         /* ----------------------------------------------------------------- */
668*495ae853SAndroid Build Coastguard Worker         /* LOOP over number of blocks                                        */
669*495ae853SAndroid Build Coastguard Worker         /* ----------------------------------------------------------------- */
670*495ae853SAndroid Build Coastguard Worker         for(i4_blk_ctr = 0; i4_blk_ctr < 4; i4_blk_ctr++)
671*495ae853SAndroid Build Coastguard Worker         {
672*495ae853SAndroid Build Coastguard Worker             WORD16 *pi2_ref_data_byte;
673*495ae853SAndroid Build Coastguard Worker             WORD32 *pi4_ref_array;
674*495ae853SAndroid Build Coastguard Worker             WORD32 i4_i;
675*495ae853SAndroid Build Coastguard Worker 
676*495ae853SAndroid Build Coastguard Worker             /* if reference layer is not coded then no processing */
677*495ae853SAndroid Build Coastguard Worker             if(0 != (i4_ref_nnz & 0x1))
678*495ae853SAndroid Build Coastguard Worker             {
679*495ae853SAndroid Build Coastguard Worker                 pi2_ref_data_byte = pi2_inp_data;
680*495ae853SAndroid Build Coastguard Worker 
681*495ae853SAndroid Build Coastguard Worker                 /* ----------- Horizontal Interpolation ---------------- */
682*495ae853SAndroid Build Coastguard Worker                 pi4_ref_array = (WORD32 *) pi2_refarray_buffer;
683*495ae853SAndroid Build Coastguard Worker 
684*495ae853SAndroid Build Coastguard Worker                 for(i4_i = 0; i4_i < SUB_BLOCK_HEIGHT; i4_i++)
685*495ae853SAndroid Build Coastguard Worker                 {
686*495ae853SAndroid Build Coastguard Worker                     WORD16 i2_coeff1, i2_coeff2;
687*495ae853SAndroid Build Coastguard Worker                     i2_coeff1 = (WORD16) (*pi2_ref_data_byte++);
688*495ae853SAndroid Build Coastguard Worker 
689*495ae853SAndroid Build Coastguard Worker                     /* populate the first inter sample */
690*495ae853SAndroid Build Coastguard Worker                     *pi4_ref_array++ = i2_coeff1 << 2;
691*495ae853SAndroid Build Coastguard Worker 
692*495ae853SAndroid Build Coastguard Worker                     i2_coeff2 = (WORD16) (*pi2_ref_data_byte++);
693*495ae853SAndroid Build Coastguard Worker 
694*495ae853SAndroid Build Coastguard Worker                     /* populate 2 samples based on current coeffs */
695*495ae853SAndroid Build Coastguard Worker                     *pi4_ref_array++ = ((i2_coeff1 << 1) + (i2_coeff1) + (i2_coeff2));
696*495ae853SAndroid Build Coastguard Worker                     *pi4_ref_array++ = ((i2_coeff2 << 1) + (i2_coeff2) + (i2_coeff1));
697*495ae853SAndroid Build Coastguard Worker 
698*495ae853SAndroid Build Coastguard Worker                     i2_coeff1 = (WORD16) (*pi2_ref_data_byte++);
699*495ae853SAndroid Build Coastguard Worker 
700*495ae853SAndroid Build Coastguard Worker                     /* populate 2 samples based on current coeffs */
701*495ae853SAndroid Build Coastguard Worker                     *pi4_ref_array++ = ((i2_coeff2 << 1) + (i2_coeff2) + (i2_coeff1));
702*495ae853SAndroid Build Coastguard Worker                     *pi4_ref_array++ = ((i2_coeff1 << 1) + (i2_coeff1) + (i2_coeff2));
703*495ae853SAndroid Build Coastguard Worker 
704*495ae853SAndroid Build Coastguard Worker                     i2_coeff2 = (WORD16) (*pi2_ref_data_byte++);
705*495ae853SAndroid Build Coastguard Worker 
706*495ae853SAndroid Build Coastguard Worker                     /* populate 2 samples based on current coeffs */
707*495ae853SAndroid Build Coastguard Worker                     *pi4_ref_array++ = ((i2_coeff1 << 1) + (i2_coeff1) + (i2_coeff2));
708*495ae853SAndroid Build Coastguard Worker                     *pi4_ref_array++ = ((i2_coeff2 << 1) + (i2_coeff2) + (i2_coeff1));
709*495ae853SAndroid Build Coastguard Worker 
710*495ae853SAndroid Build Coastguard Worker                     /* populate the last inter sample */
711*495ae853SAndroid Build Coastguard Worker                     *pi4_ref_array++ = i2_coeff2 << 2;
712*495ae853SAndroid Build Coastguard Worker 
713*495ae853SAndroid Build Coastguard Worker                     /* vertical loop uopdates */
714*495ae853SAndroid Build Coastguard Worker                     pi2_ref_data_byte = pi2_inp_data + ((i4_i + 1) * i4_inp_data_stride);
715*495ae853SAndroid Build Coastguard Worker                 }
716*495ae853SAndroid Build Coastguard Worker 
717*495ae853SAndroid Build Coastguard Worker                 /* ----------- Vertical Interpolation ---------------- */
718*495ae853SAndroid Build Coastguard Worker                 pi4_ref_array = (WORD32 *) pi2_refarray_buffer;
719*495ae853SAndroid Build Coastguard Worker 
720*495ae853SAndroid Build Coastguard Worker                 for(i4_i = 0; i4_i < BLOCK_WIDTH; i4_i++)
721*495ae853SAndroid Build Coastguard Worker                 {
722*495ae853SAndroid Build Coastguard Worker                     WORD32 *pi4_ref_array_temp;
723*495ae853SAndroid Build Coastguard Worker                     WORD16 *pi2_out;
724*495ae853SAndroid Build Coastguard Worker                     WORD32 i4_horz_samp_1, i4_horz_samp_2;
725*495ae853SAndroid Build Coastguard Worker 
726*495ae853SAndroid Build Coastguard Worker                     pi4_ref_array_temp = pi4_ref_array;
727*495ae853SAndroid Build Coastguard Worker                     pi2_out = pi2_out_res;
728*495ae853SAndroid Build Coastguard Worker                     i4_horz_samp_1 = *pi4_ref_array_temp;
729*495ae853SAndroid Build Coastguard Worker 
730*495ae853SAndroid Build Coastguard Worker                     /* populate the first inter sample */
731*495ae853SAndroid Build Coastguard Worker                     *pi2_out = (i4_horz_samp_1 + 2) >> 2;
732*495ae853SAndroid Build Coastguard Worker                     pi2_out += i4_out_res_stride;
733*495ae853SAndroid Build Coastguard Worker 
734*495ae853SAndroid Build Coastguard Worker                     /* unroll loop count 1 */
735*495ae853SAndroid Build Coastguard Worker                     pi4_ref_array_temp += BLOCK_WIDTH;
736*495ae853SAndroid Build Coastguard Worker                     i4_horz_samp_2 = *pi4_ref_array_temp;
737*495ae853SAndroid Build Coastguard Worker 
738*495ae853SAndroid Build Coastguard Worker                     /* populate 2 samples based on current coeffs */
739*495ae853SAndroid Build Coastguard Worker                     *pi2_out =
740*495ae853SAndroid Build Coastguard Worker                         ((i4_horz_samp_1 << 1) + (i4_horz_samp_1) + (i4_horz_samp_2) + 8) >> 4;
741*495ae853SAndroid Build Coastguard Worker                     pi2_out += i4_out_res_stride;
742*495ae853SAndroid Build Coastguard Worker                     *pi2_out =
743*495ae853SAndroid Build Coastguard Worker                         ((i4_horz_samp_2 << 1) + (i4_horz_samp_2) + (i4_horz_samp_1) + 8) >> 4;
744*495ae853SAndroid Build Coastguard Worker                     pi2_out += i4_out_res_stride;
745*495ae853SAndroid Build Coastguard Worker 
746*495ae853SAndroid Build Coastguard Worker                     /* unroll loop count 2 */
747*495ae853SAndroid Build Coastguard Worker                     pi4_ref_array_temp += BLOCK_WIDTH;
748*495ae853SAndroid Build Coastguard Worker                     i4_horz_samp_1 = *pi4_ref_array_temp;
749*495ae853SAndroid Build Coastguard Worker 
750*495ae853SAndroid Build Coastguard Worker                     /* populate 2 samples based on current coeffs */
751*495ae853SAndroid Build Coastguard Worker                     *pi2_out =
752*495ae853SAndroid Build Coastguard Worker                         ((i4_horz_samp_2 << 1) + (i4_horz_samp_2) + (i4_horz_samp_1) + 8) >> 4;
753*495ae853SAndroid Build Coastguard Worker                     pi2_out += i4_out_res_stride;
754*495ae853SAndroid Build Coastguard Worker                     *pi2_out =
755*495ae853SAndroid Build Coastguard Worker                         ((i4_horz_samp_1 << 1) + (i4_horz_samp_1) + (i4_horz_samp_2) + 8) >> 4;
756*495ae853SAndroid Build Coastguard Worker                     pi2_out += i4_out_res_stride;
757*495ae853SAndroid Build Coastguard Worker 
758*495ae853SAndroid Build Coastguard Worker                     /* unroll loop count 3 */
759*495ae853SAndroid Build Coastguard Worker                     pi4_ref_array_temp += BLOCK_WIDTH;
760*495ae853SAndroid Build Coastguard Worker                     i4_horz_samp_2 = *pi4_ref_array_temp;
761*495ae853SAndroid Build Coastguard Worker 
762*495ae853SAndroid Build Coastguard Worker                     /* populate 2 samples based on current coeffs */
763*495ae853SAndroid Build Coastguard Worker                     *pi2_out =
764*495ae853SAndroid Build Coastguard Worker                         ((i4_horz_samp_1 << 1) + (i4_horz_samp_1) + (i4_horz_samp_2) + 8) >> 4;
765*495ae853SAndroid Build Coastguard Worker                     pi2_out += i4_out_res_stride;
766*495ae853SAndroid Build Coastguard Worker                     *pi2_out =
767*495ae853SAndroid Build Coastguard Worker                         ((i4_horz_samp_2 << 1) + (i4_horz_samp_2) + (i4_horz_samp_1) + 8) >> 4;
768*495ae853SAndroid Build Coastguard Worker                     pi2_out += i4_out_res_stride;
769*495ae853SAndroid Build Coastguard Worker 
770*495ae853SAndroid Build Coastguard Worker                     /* populate the last inter sample */
771*495ae853SAndroid Build Coastguard Worker                     *pi2_out = (i4_horz_samp_2 + 2) >> 2;
772*495ae853SAndroid Build Coastguard Worker 
773*495ae853SAndroid Build Coastguard Worker                     /* horizontal loop updates */
774*495ae853SAndroid Build Coastguard Worker                     pi4_ref_array++;
775*495ae853SAndroid Build Coastguard Worker                     pi2_out_res++;
776*495ae853SAndroid Build Coastguard Worker                 }
777*495ae853SAndroid Build Coastguard Worker             }
778*495ae853SAndroid Build Coastguard Worker             else
779*495ae853SAndroid Build Coastguard Worker             {
780*495ae853SAndroid Build Coastguard Worker                 pi2_out_res += BLOCK_WIDTH;
781*495ae853SAndroid Build Coastguard Worker             }
782*495ae853SAndroid Build Coastguard Worker 
783*495ae853SAndroid Build Coastguard Worker             /* Block level loop updates */
784*495ae853SAndroid Build Coastguard Worker             if(1 == i4_blk_ctr)
785*495ae853SAndroid Build Coastguard Worker             {
786*495ae853SAndroid Build Coastguard Worker                 pi2_inp_data -= SUB_BLOCK_WIDTH;
787*495ae853SAndroid Build Coastguard Worker                 pi2_inp_data += (i4_inp_data_stride * SUB_BLOCK_HEIGHT);
788*495ae853SAndroid Build Coastguard Worker                 pi2_out_res -= MB_WIDTH;
789*495ae853SAndroid Build Coastguard Worker                 pi2_out_res += (i4_out_res_stride * BLOCK_HEIGHT);
790*495ae853SAndroid Build Coastguard Worker                 i4_ref_nnz >>= 2;
791*495ae853SAndroid Build Coastguard Worker             }
792*495ae853SAndroid Build Coastguard Worker             else
793*495ae853SAndroid Build Coastguard Worker             {
794*495ae853SAndroid Build Coastguard Worker                 pi2_inp_data += SUB_BLOCK_WIDTH;
795*495ae853SAndroid Build Coastguard Worker             }
796*495ae853SAndroid Build Coastguard Worker 
797*495ae853SAndroid Build Coastguard Worker             i4_ref_nnz >>= 1;
798*495ae853SAndroid Build Coastguard Worker 
799*495ae853SAndroid Build Coastguard Worker         } /* end of loop over all the blocks */
800*495ae853SAndroid Build Coastguard Worker     }
801*495ae853SAndroid Build Coastguard Worker     return;
802*495ae853SAndroid Build Coastguard Worker }
803*495ae853SAndroid Build Coastguard Worker 
804*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
805*495ae853SAndroid Build Coastguard Worker /*                                                                           */
806*495ae853SAndroid Build Coastguard Worker /*  Function Name :  isvcd_ref_layer_ptr_incr                                 */
807*495ae853SAndroid Build Coastguard Worker /*                                                                           */
808*495ae853SAndroid Build Coastguard Worker /*  Description   :  this function returns the pointer increments for        */
809*495ae853SAndroid Build Coastguard Worker /*                   the operand2 of the bilinear interpolation              */
810*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pi1_ref_mb_modes : reference mb modes                    */
811*495ae853SAndroid Build Coastguard Worker /*                  i4_ref_mode_stride : mb mode buffer stride               */
812*495ae853SAndroid Build Coastguard Worker /*                    i4_element_size : size of reference mb mode            */
813*495ae853SAndroid Build Coastguard Worker /*                  i4_x_offset : ref offset x                               */
814*495ae853SAndroid Build Coastguard Worker /*                  i4_y_offset : ref offset y                               */
815*495ae853SAndroid Build Coastguard Worker /*                    i4_refary_wd : reference array width                   */
816*495ae853SAndroid Build Coastguard Worker /*                    i4_refary_ht : reference array height                  */
817*495ae853SAndroid Build Coastguard Worker /*                  pu1_ref_x_ptr_incr : ptr increment buffer for x          */
818*495ae853SAndroid Build Coastguard Worker /*                  pu1_ref_y_ptr_incr : ptr increment buffer for y          */
819*495ae853SAndroid Build Coastguard Worker /*                    i4_chroma_flag : chroma processing flag                */
820*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
821*495ae853SAndroid Build Coastguard Worker /*  Processing    : it calculates the increment as per the transform size    */
822*495ae853SAndroid Build Coastguard Worker /*                                                                           */
823*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
824*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
825*495ae853SAndroid Build Coastguard Worker /*                                                                           */
826*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
827*495ae853SAndroid Build Coastguard Worker /*                                                                           */
828*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
829*495ae853SAndroid Build Coastguard Worker /*                                                                           */
830*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
831*495ae853SAndroid Build Coastguard Worker /*         18 08 2021   Kishore              creation                        */
832*495ae853SAndroid Build Coastguard Worker /*                                                                           */
833*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_ref_layer_ptr_incr(WORD8 * pi1_ref_mb_modes,WORD32 i4_ref_mode_stride,WORD32 i4_element_size,WORD32 i4_x_offset,WORD32 i4_y_offset,WORD32 i4_refary_wd,WORD32 i4_refary_ht,UWORD8 * pu1_ref_x_ptr_incr,UWORD8 * pu1_ref_y_ptr_incr,WORD32 i4_chroma_flag)834*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_ref_layer_ptr_incr(WORD8 *pi1_ref_mb_modes, WORD32 i4_ref_mode_stride,
835*495ae853SAndroid Build Coastguard Worker                                 WORD32 i4_element_size, WORD32 i4_x_offset, WORD32 i4_y_offset,
836*495ae853SAndroid Build Coastguard Worker                                 WORD32 i4_refary_wd, WORD32 i4_refary_ht,
837*495ae853SAndroid Build Coastguard Worker                                 UWORD8 *pu1_ref_x_ptr_incr, UWORD8 *pu1_ref_y_ptr_incr,
838*495ae853SAndroid Build Coastguard Worker                                 WORD32 i4_chroma_flag)
839*495ae853SAndroid Build Coastguard Worker {
840*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
841*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x_idx, i4_y_idx;
842*495ae853SAndroid Build Coastguard Worker     WORD32 i4_prev_x, i4_prev_y;
843*495ae853SAndroid Build Coastguard Worker     WORD32 i4_const_val;
844*495ae853SAndroid Build Coastguard Worker     WORD32 i4_pos_x, i4_pos_y;
845*495ae853SAndroid Build Coastguard Worker     WORD32 i4_trans_size;
846*495ae853SAndroid Build Coastguard Worker     WORD32 i4_act_ary_wd, i4_act_ary_ht;
847*495ae853SAndroid Build Coastguard Worker     WORD32 i4_and_const;
848*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_incr_x, *pu1_incr_y;
849*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_sft;
850*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_x, i4_mb_y;
851*495ae853SAndroid Build Coastguard Worker     WORD8 *pi1_ref_mb_modes_incr;
852*495ae853SAndroid Build Coastguard Worker     WORD8 *pi1_ref_mb_modes_incr_temp;
853*495ae853SAndroid Build Coastguard Worker     inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms;
854*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_x_strt, i4_mb_y_strt;
855*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_quard1_part_x, i4_mb_quard1_part_y;
856*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x_ref, i4_y_ref;
857*495ae853SAndroid Build Coastguard Worker     WORD32 i4_tx_size, i4_tx_size_q0, i4_tx_size_q1, i4_tx_size_q2, i4_tx_size_q3;
858*495ae853SAndroid Build Coastguard Worker     WORD8 i1_mb_mode_q0, i1_mb_mode_q1, i1_mb_mode_q2, i1_mb_mode_q3;
859*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_wd;
860*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_ht;
861*495ae853SAndroid Build Coastguard Worker 
862*495ae853SAndroid Build Coastguard Worker     i4_mb_wd = MB_WIDTH >> i4_chroma_flag;
863*495ae853SAndroid Build Coastguard Worker     i4_mb_ht = MB_HEIGHT >> i4_chroma_flag;
864*495ae853SAndroid Build Coastguard Worker 
865*495ae853SAndroid Build Coastguard Worker     /* Memset to 1 the increment buffers */
866*495ae853SAndroid Build Coastguard Worker     memset(pu1_ref_x_ptr_incr, 1, (i4_refary_wd * i4_refary_ht));
867*495ae853SAndroid Build Coastguard Worker     memset(pu1_ref_y_ptr_incr, 1, (i4_refary_wd * i4_refary_ht));
868*495ae853SAndroid Build Coastguard Worker 
869*495ae853SAndroid Build Coastguard Worker     /* Initialise actual width and height */
870*495ae853SAndroid Build Coastguard Worker     i4_act_ary_wd = i4_refary_wd;
871*495ae853SAndroid Build Coastguard Worker     i4_act_ary_ht = i4_refary_ht;
872*495ae853SAndroid Build Coastguard Worker 
873*495ae853SAndroid Build Coastguard Worker     /* Initialize x and y */
874*495ae853SAndroid Build Coastguard Worker     i4_x = 0;
875*495ae853SAndroid Build Coastguard Worker     i4_y = 0;
876*495ae853SAndroid Build Coastguard Worker     i4_prev_y = 0;
877*495ae853SAndroid Build Coastguard Worker     i4_mb_sft = (MB_WIDTH_SHIFT - i4_chroma_flag);
878*495ae853SAndroid Build Coastguard Worker 
879*495ae853SAndroid Build Coastguard Worker     /* Loop over all MBs in the reference array */
880*495ae853SAndroid Build Coastguard Worker     if(0 == i4_chroma_flag)
881*495ae853SAndroid Build Coastguard Worker     {
882*495ae853SAndroid Build Coastguard Worker         i4_x_ref = i4_x_offset + 0;
883*495ae853SAndroid Build Coastguard Worker         i4_y_ref = i4_y_offset + 0;
884*495ae853SAndroid Build Coastguard Worker         i4_mb_x_strt = i4_x_ref % i4_mb_wd;
885*495ae853SAndroid Build Coastguard Worker         i4_mb_y_strt = i4_y_ref % i4_mb_ht;
886*495ae853SAndroid Build Coastguard Worker         i4_mb_quard1_part_x = i4_mb_wd - i4_mb_x_strt;
887*495ae853SAndroid Build Coastguard Worker         i4_mb_quard1_part_y = i4_mb_ht - i4_mb_y_strt;
888*495ae853SAndroid Build Coastguard Worker 
889*495ae853SAndroid Build Coastguard Worker         if(!(i4_mb_quard1_part_x >= 0))
890*495ae853SAndroid Build Coastguard Worker         {
891*495ae853SAndroid Build Coastguard Worker             return NOT_OK;
892*495ae853SAndroid Build Coastguard Worker         }
893*495ae853SAndroid Build Coastguard Worker         if(!(i4_mb_quard1_part_y >= 0))
894*495ae853SAndroid Build Coastguard Worker         {
895*495ae853SAndroid Build Coastguard Worker             return NOT_OK;
896*495ae853SAndroid Build Coastguard Worker         }
897*495ae853SAndroid Build Coastguard Worker 
898*495ae853SAndroid Build Coastguard Worker         /* Take care of negative offsets */
899*495ae853SAndroid Build Coastguard Worker         if(i4_x_ref > 0)
900*495ae853SAndroid Build Coastguard Worker         {
901*495ae853SAndroid Build Coastguard Worker             i4_mb_x = (i4_x_ref >> i4_mb_sft);
902*495ae853SAndroid Build Coastguard Worker         }
903*495ae853SAndroid Build Coastguard Worker         else
904*495ae853SAndroid Build Coastguard Worker         {
905*495ae853SAndroid Build Coastguard Worker             i4_mb_x = 0;
906*495ae853SAndroid Build Coastguard Worker         }
907*495ae853SAndroid Build Coastguard Worker         if(i4_y_ref > 0)
908*495ae853SAndroid Build Coastguard Worker         {
909*495ae853SAndroid Build Coastguard Worker             i4_mb_y = (i4_y_ref >> i4_mb_sft);
910*495ae853SAndroid Build Coastguard Worker         }
911*495ae853SAndroid Build Coastguard Worker         else
912*495ae853SAndroid Build Coastguard Worker         {
913*495ae853SAndroid Build Coastguard Worker             i4_mb_y = 0;
914*495ae853SAndroid Build Coastguard Worker         }
915*495ae853SAndroid Build Coastguard Worker 
916*495ae853SAndroid Build Coastguard Worker         /* get the location of the byte which has the current mb mode */
917*495ae853SAndroid Build Coastguard Worker         pi1_ref_mb_modes_incr = pi1_ref_mb_modes + (i4_mb_y * i4_ref_mode_stride * i4_element_size);
918*495ae853SAndroid Build Coastguard Worker         pi1_ref_mb_modes_incr += (i4_mb_x * i4_element_size);
919*495ae853SAndroid Build Coastguard Worker         ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr;
920*495ae853SAndroid Build Coastguard Worker         i1_mb_mode_q0 = ps_inter_lyr_mb_prms->i1_mb_mode;
921*495ae853SAndroid Build Coastguard Worker         i4_tx_size_q0 =
922*495ae853SAndroid Build Coastguard Worker             (i1_mb_mode_q0 <= SVC_INTER_MB)
923*495ae853SAndroid Build Coastguard Worker                 ? ((ps_inter_lyr_mb_prms->i1_tx_size < 0) ? 1 : ps_inter_lyr_mb_prms->i1_tx_size)
924*495ae853SAndroid Build Coastguard Worker                 : 1;
925*495ae853SAndroid Build Coastguard Worker 
926*495ae853SAndroid Build Coastguard Worker         pi1_ref_mb_modes_incr_temp = pi1_ref_mb_modes_incr;
927*495ae853SAndroid Build Coastguard Worker         if(i4_mb_quard1_part_x > 0)
928*495ae853SAndroid Build Coastguard Worker         {
929*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_modes_incr_temp = pi1_ref_mb_modes_incr + i4_element_size;
930*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr_temp;
931*495ae853SAndroid Build Coastguard Worker             i1_mb_mode_q1 = ps_inter_lyr_mb_prms->i1_mb_mode;
932*495ae853SAndroid Build Coastguard Worker             i4_tx_size_q1 =
933*495ae853SAndroid Build Coastguard Worker                 (i1_mb_mode_q1 <= SVC_INTER_MB)
934*495ae853SAndroid Build Coastguard Worker                     ? ((ps_inter_lyr_mb_prms->i1_tx_size < 0) ? 1
935*495ae853SAndroid Build Coastguard Worker                                                               : ps_inter_lyr_mb_prms->i1_tx_size)
936*495ae853SAndroid Build Coastguard Worker                     : 1;
937*495ae853SAndroid Build Coastguard Worker         }
938*495ae853SAndroid Build Coastguard Worker 
939*495ae853SAndroid Build Coastguard Worker         if(i4_mb_quard1_part_y > 0)
940*495ae853SAndroid Build Coastguard Worker         {
941*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_modes_incr_temp =
942*495ae853SAndroid Build Coastguard Worker                 pi1_ref_mb_modes_incr + (i4_ref_mode_stride * i4_element_size);
943*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr_temp;
944*495ae853SAndroid Build Coastguard Worker             i1_mb_mode_q2 = ps_inter_lyr_mb_prms->i1_mb_mode;
945*495ae853SAndroid Build Coastguard Worker             i4_tx_size_q2 =
946*495ae853SAndroid Build Coastguard Worker                 (i1_mb_mode_q2 <= SVC_INTER_MB)
947*495ae853SAndroid Build Coastguard Worker                     ? ((ps_inter_lyr_mb_prms->i1_tx_size < 0) ? 1
948*495ae853SAndroid Build Coastguard Worker                                                               : ps_inter_lyr_mb_prms->i1_tx_size)
949*495ae853SAndroid Build Coastguard Worker                     : 1;
950*495ae853SAndroid Build Coastguard Worker         }
951*495ae853SAndroid Build Coastguard Worker 
952*495ae853SAndroid Build Coastguard Worker         if((i4_mb_quard1_part_x > 0) && (i4_mb_quard1_part_y > 0))
953*495ae853SAndroid Build Coastguard Worker         {
954*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_modes_incr_temp =
955*495ae853SAndroid Build Coastguard Worker                 pi1_ref_mb_modes_incr + (i4_ref_mode_stride * i4_element_size) + i4_element_size;
956*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr_temp;
957*495ae853SAndroid Build Coastguard Worker             i1_mb_mode_q3 = ps_inter_lyr_mb_prms->i1_mb_mode;
958*495ae853SAndroid Build Coastguard Worker             i4_tx_size_q3 =
959*495ae853SAndroid Build Coastguard Worker                 (i1_mb_mode_q3 <= SVC_INTER_MB)
960*495ae853SAndroid Build Coastguard Worker                     ? ((ps_inter_lyr_mb_prms->i1_tx_size < 0) ? 1
961*495ae853SAndroid Build Coastguard Worker                                                               : ps_inter_lyr_mb_prms->i1_tx_size)
962*495ae853SAndroid Build Coastguard Worker                     : 1;
963*495ae853SAndroid Build Coastguard Worker         }
964*495ae853SAndroid Build Coastguard Worker 
965*495ae853SAndroid Build Coastguard Worker         do
966*495ae853SAndroid Build Coastguard Worker         {
967*495ae853SAndroid Build Coastguard Worker             WORD32 i4_idx;
968*495ae853SAndroid Build Coastguard Worker             WORD32 i4_wd, i4_ht;
969*495ae853SAndroid Build Coastguard Worker             WORD32 i4_max_pos_x, i4_max_pos_y;
970*495ae853SAndroid Build Coastguard Worker 
971*495ae853SAndroid Build Coastguard Worker             i4_prev_x = i4_x;
972*495ae853SAndroid Build Coastguard Worker             i4_x_ref = i4_x_offset + i4_x;
973*495ae853SAndroid Build Coastguard Worker             i4_y_ref = i4_y_offset + i4_y;
974*495ae853SAndroid Build Coastguard Worker             i4_tx_size = i4_tx_size_q0;
975*495ae853SAndroid Build Coastguard Worker             if(i4_x >= i4_mb_quard1_part_x)
976*495ae853SAndroid Build Coastguard Worker             {
977*495ae853SAndroid Build Coastguard Worker                 if(i4_y < i4_mb_quard1_part_y)
978*495ae853SAndroid Build Coastguard Worker                 {
979*495ae853SAndroid Build Coastguard Worker                     i4_tx_size = i4_tx_size_q1;
980*495ae853SAndroid Build Coastguard Worker                 }
981*495ae853SAndroid Build Coastguard Worker                 else if(i4_y >= i4_mb_quard1_part_y)
982*495ae853SAndroid Build Coastguard Worker                 {
983*495ae853SAndroid Build Coastguard Worker                     i4_tx_size = i4_tx_size_q3;
984*495ae853SAndroid Build Coastguard Worker                 }
985*495ae853SAndroid Build Coastguard Worker             }
986*495ae853SAndroid Build Coastguard Worker             else if(i4_x < i4_mb_quard1_part_x)
987*495ae853SAndroid Build Coastguard Worker             {
988*495ae853SAndroid Build Coastguard Worker                 if(i4_y >= i4_mb_quard1_part_y)
989*495ae853SAndroid Build Coastguard Worker                 {
990*495ae853SAndroid Build Coastguard Worker                     i4_tx_size = i4_tx_size_q2;
991*495ae853SAndroid Build Coastguard Worker                 }
992*495ae853SAndroid Build Coastguard Worker             }
993*495ae853SAndroid Build Coastguard Worker 
994*495ae853SAndroid Build Coastguard Worker             /* Get the transform size as 4 or 8 */
995*495ae853SAndroid Build Coastguard Worker             i4_trans_size = ((i4_tx_size + 1) << 2);
996*495ae853SAndroid Build Coastguard Worker             i4_const_val = i4_trans_size - 1;
997*495ae853SAndroid Build Coastguard Worker             i4_and_const = i4_const_val;
998*495ae853SAndroid Build Coastguard Worker 
999*495ae853SAndroid Build Coastguard Worker             /* Fill horizontal tx block edges of current reference mb with 0 */
1000*495ae853SAndroid Build Coastguard Worker             pu1_incr_x = pu1_ref_x_ptr_incr + i4_x;
1001*495ae853SAndroid Build Coastguard Worker             pu1_incr_x += (i4_y * i4_refary_wd);
1002*495ae853SAndroid Build Coastguard Worker             i4_ht = (16 - (i4_y_ref & 0xF));
1003*495ae853SAndroid Build Coastguard Worker             i4_ht = MIN((i4_act_ary_ht - i4_y), i4_ht);
1004*495ae853SAndroid Build Coastguard Worker 
1005*495ae853SAndroid Build Coastguard Worker             i4_x_idx = i4_x;
1006*495ae853SAndroid Build Coastguard Worker             i4_pos_x = i4_x_ref & 0xF;
1007*495ae853SAndroid Build Coastguard Worker             i4_max_pos_x = 16;
1008*495ae853SAndroid Build Coastguard Worker             i4_x += (16 - i4_pos_x);
1009*495ae853SAndroid Build Coastguard Worker 
1010*495ae853SAndroid Build Coastguard Worker             /* Get the transform block edge pos */
1011*495ae853SAndroid Build Coastguard Worker             i4_idx = (i4_const_val - (i4_pos_x & i4_and_const));
1012*495ae853SAndroid Build Coastguard Worker             i4_x_idx += i4_idx;
1013*495ae853SAndroid Build Coastguard Worker 
1014*495ae853SAndroid Build Coastguard Worker             while((i4_pos_x < i4_max_pos_x) && (i4_x_idx < i4_act_ary_wd))
1015*495ae853SAndroid Build Coastguard Worker             {
1016*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_i;
1017*495ae853SAndroid Build Coastguard Worker                 UWORD8 *pu1_incr;
1018*495ae853SAndroid Build Coastguard Worker 
1019*495ae853SAndroid Build Coastguard Worker                 pu1_incr = pu1_incr_x + i4_idx;
1020*495ae853SAndroid Build Coastguard Worker                 for(i4_i = 0; i4_i < i4_ht; i4_i++)
1021*495ae853SAndroid Build Coastguard Worker                 {
1022*495ae853SAndroid Build Coastguard Worker                     /* Fill the block edge with 0s */
1023*495ae853SAndroid Build Coastguard Worker                     *pu1_incr = 0;
1024*495ae853SAndroid Build Coastguard Worker                     pu1_incr += i4_refary_wd;
1025*495ae853SAndroid Build Coastguard Worker                 }
1026*495ae853SAndroid Build Coastguard Worker 
1027*495ae853SAndroid Build Coastguard Worker                 /* Updates */
1028*495ae853SAndroid Build Coastguard Worker                 i4_pos_x += i4_trans_size;
1029*495ae853SAndroid Build Coastguard Worker                 pu1_incr_x += i4_trans_size;
1030*495ae853SAndroid Build Coastguard Worker                 i4_x_idx += MIN(i4_trans_size, (i4_act_ary_wd - i4_x_idx));
1031*495ae853SAndroid Build Coastguard Worker             }
1032*495ae853SAndroid Build Coastguard Worker 
1033*495ae853SAndroid Build Coastguard Worker             /* Fill vertical tx block edges of current reference mb with 0 */
1034*495ae853SAndroid Build Coastguard Worker             pu1_incr_y = pu1_ref_y_ptr_incr + i4_prev_x;
1035*495ae853SAndroid Build Coastguard Worker             pu1_incr_y += (i4_y * i4_refary_wd);
1036*495ae853SAndroid Build Coastguard Worker             i4_wd = (16 - (i4_x_ref & 0xF));
1037*495ae853SAndroid Build Coastguard Worker             i4_wd = MIN((i4_act_ary_wd - i4_prev_x), i4_wd);
1038*495ae853SAndroid Build Coastguard Worker             i4_y_idx = i4_y;
1039*495ae853SAndroid Build Coastguard Worker             i4_pos_y = i4_y_ref & 0xF;
1040*495ae853SAndroid Build Coastguard Worker             i4_max_pos_y = 16;
1041*495ae853SAndroid Build Coastguard Worker             i4_y += (16 - i4_pos_y);
1042*495ae853SAndroid Build Coastguard Worker 
1043*495ae853SAndroid Build Coastguard Worker             /* Get the transform block edge pos */
1044*495ae853SAndroid Build Coastguard Worker             i4_idx = (i4_const_val - (i4_pos_y & i4_and_const));
1045*495ae853SAndroid Build Coastguard Worker             i4_y_idx += i4_idx;
1046*495ae853SAndroid Build Coastguard Worker 
1047*495ae853SAndroid Build Coastguard Worker             while((i4_pos_y < i4_max_pos_y) && (i4_y_idx < i4_act_ary_ht))
1048*495ae853SAndroid Build Coastguard Worker             {
1049*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_i;
1050*495ae853SAndroid Build Coastguard Worker                 UWORD8 *pu1_incr;
1051*495ae853SAndroid Build Coastguard Worker 
1052*495ae853SAndroid Build Coastguard Worker                 pu1_incr = pu1_incr_y + i4_idx * i4_refary_wd;
1053*495ae853SAndroid Build Coastguard Worker                 for(i4_i = 0; i4_i < i4_wd; i4_i++)
1054*495ae853SAndroid Build Coastguard Worker                 {
1055*495ae853SAndroid Build Coastguard Worker                     /* Fill the block edge with 0s */
1056*495ae853SAndroid Build Coastguard Worker                     *pu1_incr = 0;
1057*495ae853SAndroid Build Coastguard Worker                     pu1_incr++;
1058*495ae853SAndroid Build Coastguard Worker                 }
1059*495ae853SAndroid Build Coastguard Worker 
1060*495ae853SAndroid Build Coastguard Worker                 /* Updates */
1061*495ae853SAndroid Build Coastguard Worker                 i4_pos_y += i4_trans_size;
1062*495ae853SAndroid Build Coastguard Worker                 pu1_incr_y += i4_trans_size * i4_refary_wd;
1063*495ae853SAndroid Build Coastguard Worker                 i4_y_idx += MIN(i4_trans_size, (i4_act_ary_ht - i4_y_idx));
1064*495ae853SAndroid Build Coastguard Worker             }
1065*495ae853SAndroid Build Coastguard Worker 
1066*495ae853SAndroid Build Coastguard Worker             /* Loop updates */
1067*495ae853SAndroid Build Coastguard Worker             if(i4_x < i4_act_ary_wd)
1068*495ae853SAndroid Build Coastguard Worker             {
1069*495ae853SAndroid Build Coastguard Worker                 i4_y = i4_prev_y;
1070*495ae853SAndroid Build Coastguard Worker             }
1071*495ae853SAndroid Build Coastguard Worker             else if(i4_y < i4_act_ary_ht)
1072*495ae853SAndroid Build Coastguard Worker             {
1073*495ae853SAndroid Build Coastguard Worker                 i4_prev_y = i4_y;
1074*495ae853SAndroid Build Coastguard Worker                 i4_x = 0;
1075*495ae853SAndroid Build Coastguard Worker             }
1076*495ae853SAndroid Build Coastguard Worker 
1077*495ae853SAndroid Build Coastguard Worker         } while((i4_y < i4_act_ary_ht) || (i4_x < i4_act_ary_wd));
1078*495ae853SAndroid Build Coastguard Worker 
1079*495ae853SAndroid Build Coastguard Worker     } /* End of if 0 == i4_chroma_flag */
1080*495ae853SAndroid Build Coastguard Worker     else
1081*495ae853SAndroid Build Coastguard Worker     {
1082*495ae853SAndroid Build Coastguard Worker         /* Set the transform size as 4 */
1083*495ae853SAndroid Build Coastguard Worker         i4_trans_size = 4;
1084*495ae853SAndroid Build Coastguard Worker         i4_const_val = 3;
1085*495ae853SAndroid Build Coastguard Worker 
1086*495ae853SAndroid Build Coastguard Worker         do
1087*495ae853SAndroid Build Coastguard Worker         {
1088*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_ref, i4_y_ref;
1089*495ae853SAndroid Build Coastguard Worker             WORD32 i4_idx;
1090*495ae853SAndroid Build Coastguard Worker             WORD32 i4_wd, i4_ht;
1091*495ae853SAndroid Build Coastguard Worker             WORD32 i4_max_pos_x, i4_max_pos_y;
1092*495ae853SAndroid Build Coastguard Worker 
1093*495ae853SAndroid Build Coastguard Worker             i4_prev_x = i4_x;
1094*495ae853SAndroid Build Coastguard Worker             i4_x_ref = i4_x_offset + i4_x;
1095*495ae853SAndroid Build Coastguard Worker             i4_y_ref = i4_y_offset + i4_y;
1096*495ae853SAndroid Build Coastguard Worker 
1097*495ae853SAndroid Build Coastguard Worker             /* Fill horizontal tx block edges of current reference mb with 0 */
1098*495ae853SAndroid Build Coastguard Worker             pu1_incr_x = pu1_ref_x_ptr_incr + i4_x;
1099*495ae853SAndroid Build Coastguard Worker             pu1_incr_x += (i4_y * i4_refary_wd);
1100*495ae853SAndroid Build Coastguard Worker             i4_ht = (8 - (i4_y_ref & 0x7));
1101*495ae853SAndroid Build Coastguard Worker             i4_ht = MIN((i4_act_ary_ht - i4_y), i4_ht);
1102*495ae853SAndroid Build Coastguard Worker             i4_x_idx = i4_x;
1103*495ae853SAndroid Build Coastguard Worker             i4_pos_x = i4_x_ref & 0x7;
1104*495ae853SAndroid Build Coastguard Worker             i4_max_pos_x = 8;
1105*495ae853SAndroid Build Coastguard Worker             i4_x += (8 - i4_pos_x);
1106*495ae853SAndroid Build Coastguard Worker 
1107*495ae853SAndroid Build Coastguard Worker             /* Get the transform block edge pos */
1108*495ae853SAndroid Build Coastguard Worker             i4_idx = (i4_const_val - (i4_pos_x & 0x3));
1109*495ae853SAndroid Build Coastguard Worker             i4_x_idx += i4_idx;
1110*495ae853SAndroid Build Coastguard Worker 
1111*495ae853SAndroid Build Coastguard Worker             while((i4_pos_x < i4_max_pos_x) && (i4_x_idx < i4_act_ary_wd))
1112*495ae853SAndroid Build Coastguard Worker             {
1113*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_i;
1114*495ae853SAndroid Build Coastguard Worker                 UWORD8 *pu1_incr;
1115*495ae853SAndroid Build Coastguard Worker 
1116*495ae853SAndroid Build Coastguard Worker                 pu1_incr = pu1_incr_x + i4_idx;
1117*495ae853SAndroid Build Coastguard Worker                 for(i4_i = 0; i4_i < i4_ht; i4_i++)
1118*495ae853SAndroid Build Coastguard Worker                 {
1119*495ae853SAndroid Build Coastguard Worker                     /* Fill the block edge with 0s */
1120*495ae853SAndroid Build Coastguard Worker                     *pu1_incr = 0;
1121*495ae853SAndroid Build Coastguard Worker                     pu1_incr += i4_refary_wd;
1122*495ae853SAndroid Build Coastguard Worker                 }
1123*495ae853SAndroid Build Coastguard Worker 
1124*495ae853SAndroid Build Coastguard Worker                 /* Updates */
1125*495ae853SAndroid Build Coastguard Worker                 i4_pos_x += i4_trans_size;
1126*495ae853SAndroid Build Coastguard Worker                 pu1_incr_x += i4_trans_size;
1127*495ae853SAndroid Build Coastguard Worker                 i4_x_idx += MIN(i4_trans_size, (i4_act_ary_wd - i4_x_idx));
1128*495ae853SAndroid Build Coastguard Worker             }
1129*495ae853SAndroid Build Coastguard Worker 
1130*495ae853SAndroid Build Coastguard Worker             /* Fill vertical tx block edges of current reference mb with 0 */
1131*495ae853SAndroid Build Coastguard Worker             pu1_incr_y = pu1_ref_y_ptr_incr + i4_prev_x;
1132*495ae853SAndroid Build Coastguard Worker             pu1_incr_y += (i4_y * i4_refary_wd);
1133*495ae853SAndroid Build Coastguard Worker             i4_wd = (8 - (i4_x_ref & 0x7));
1134*495ae853SAndroid Build Coastguard Worker             i4_wd = MIN((i4_act_ary_wd - i4_prev_x), i4_wd);
1135*495ae853SAndroid Build Coastguard Worker             i4_y_idx = i4_y;
1136*495ae853SAndroid Build Coastguard Worker             i4_pos_y = i4_y_ref & 0x7;
1137*495ae853SAndroid Build Coastguard Worker             i4_max_pos_y = 8;
1138*495ae853SAndroid Build Coastguard Worker             i4_y += (8 - i4_pos_y);
1139*495ae853SAndroid Build Coastguard Worker 
1140*495ae853SAndroid Build Coastguard Worker             /* Get the transform block edge pos */
1141*495ae853SAndroid Build Coastguard Worker             i4_idx = (i4_const_val - (i4_pos_y & 0x3));
1142*495ae853SAndroid Build Coastguard Worker             i4_y_idx += i4_idx;
1143*495ae853SAndroid Build Coastguard Worker 
1144*495ae853SAndroid Build Coastguard Worker             while((i4_pos_y < i4_max_pos_y) && (i4_y_idx < i4_act_ary_ht))
1145*495ae853SAndroid Build Coastguard Worker             {
1146*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_i;
1147*495ae853SAndroid Build Coastguard Worker                 UWORD8 *pu1_incr;
1148*495ae853SAndroid Build Coastguard Worker 
1149*495ae853SAndroid Build Coastguard Worker                 pu1_incr = pu1_incr_y + i4_idx * i4_refary_wd;
1150*495ae853SAndroid Build Coastguard Worker                 for(i4_i = 0; i4_i < i4_wd; i4_i++)
1151*495ae853SAndroid Build Coastguard Worker                 {
1152*495ae853SAndroid Build Coastguard Worker                     /* Fill the block edge with 0s */
1153*495ae853SAndroid Build Coastguard Worker                     *pu1_incr = 0;
1154*495ae853SAndroid Build Coastguard Worker                     pu1_incr++;
1155*495ae853SAndroid Build Coastguard Worker                 }
1156*495ae853SAndroid Build Coastguard Worker 
1157*495ae853SAndroid Build Coastguard Worker                 /* Updates */
1158*495ae853SAndroid Build Coastguard Worker                 i4_pos_y += i4_trans_size;
1159*495ae853SAndroid Build Coastguard Worker                 pu1_incr_y += i4_trans_size * i4_refary_wd;
1160*495ae853SAndroid Build Coastguard Worker                 i4_y_idx += MIN(i4_trans_size, (i4_act_ary_ht - i4_y_idx));
1161*495ae853SAndroid Build Coastguard Worker             }
1162*495ae853SAndroid Build Coastguard Worker 
1163*495ae853SAndroid Build Coastguard Worker             /* Loop updates */
1164*495ae853SAndroid Build Coastguard Worker             if(i4_x < i4_act_ary_wd)
1165*495ae853SAndroid Build Coastguard Worker             {
1166*495ae853SAndroid Build Coastguard Worker                 i4_y = i4_prev_y;
1167*495ae853SAndroid Build Coastguard Worker             }
1168*495ae853SAndroid Build Coastguard Worker             else if(i4_y < i4_act_ary_ht)
1169*495ae853SAndroid Build Coastguard Worker             {
1170*495ae853SAndroid Build Coastguard Worker                 i4_prev_y = i4_y;
1171*495ae853SAndroid Build Coastguard Worker                 i4_x = 0;
1172*495ae853SAndroid Build Coastguard Worker             }
1173*495ae853SAndroid Build Coastguard Worker 
1174*495ae853SAndroid Build Coastguard Worker         } while((i4_y < i4_act_ary_ht) || (i4_x < i4_act_ary_wd));
1175*495ae853SAndroid Build Coastguard Worker 
1176*495ae853SAndroid Build Coastguard Worker     } /* End of chroma */
1177*495ae853SAndroid Build Coastguard Worker     return OK;
1178*495ae853SAndroid Build Coastguard Worker 
1179*495ae853SAndroid Build Coastguard Worker } /* End of "isvcd_ref_layer_ptr_incr" */
1180*495ae853SAndroid Build Coastguard Worker 
isvcd_residual_reflayer_const_non_boundary_mb(WORD16 * pi2_inp_data,WORD32 i4_inp_data_stride,WORD16 * pi2_ref_array,WORD32 i4_refarray_wd,WORD32 i4_refarray_ht,WORD32 i4_ref_mb_type_q0,WORD32 i4_ref_mb_type_q1,WORD32 i4_ref_mb_type_q2,WORD32 i4_ref_mb_type_q3,WORD32 i4_mb_quard1_part_x,WORD32 i4_mb_quard1_part_y,WORD32 i4_chroma_flag)1181*495ae853SAndroid Build Coastguard Worker void isvcd_residual_reflayer_const_non_boundary_mb(
1182*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_inp_data, WORD32 i4_inp_data_stride, WORD16 *pi2_ref_array, WORD32 i4_refarray_wd,
1183*495ae853SAndroid Build Coastguard Worker     WORD32 i4_refarray_ht, WORD32 i4_ref_mb_type_q0, WORD32 i4_ref_mb_type_q1,
1184*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_mb_type_q2, WORD32 i4_ref_mb_type_q3, WORD32 i4_mb_quard1_part_x,
1185*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_quard1_part_y, WORD32 i4_chroma_flag)
1186*495ae853SAndroid Build Coastguard Worker {
1187*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x_ref, i4_y_ref;
1188*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
1189*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_mb_type;
1190*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_ref_data_byte;
1191*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_ref_array_temp;
1192*495ae853SAndroid Build Coastguard Worker 
1193*495ae853SAndroid Build Coastguard Worker     for(i4_y = 0; i4_y < i4_refarray_ht; i4_y++)
1194*495ae853SAndroid Build Coastguard Worker     {
1195*495ae853SAndroid Build Coastguard Worker         for(i4_x = 0; i4_x < i4_refarray_wd; i4_x++)
1196*495ae853SAndroid Build Coastguard Worker         {
1197*495ae853SAndroid Build Coastguard Worker             i4_y_ref = i4_y;
1198*495ae853SAndroid Build Coastguard Worker             i4_x_ref = i4_x;
1199*495ae853SAndroid Build Coastguard Worker 
1200*495ae853SAndroid Build Coastguard Worker             i4_ref_mb_type = i4_ref_mb_type_q0;
1201*495ae853SAndroid Build Coastguard Worker             if(i4_x >= i4_mb_quard1_part_x)
1202*495ae853SAndroid Build Coastguard Worker             {
1203*495ae853SAndroid Build Coastguard Worker                 if(i4_y < i4_mb_quard1_part_y)
1204*495ae853SAndroid Build Coastguard Worker                 {
1205*495ae853SAndroid Build Coastguard Worker                     i4_ref_mb_type = i4_ref_mb_type_q1;
1206*495ae853SAndroid Build Coastguard Worker                 }
1207*495ae853SAndroid Build Coastguard Worker                 else if(i4_y >= i4_mb_quard1_part_y)
1208*495ae853SAndroid Build Coastguard Worker                 {
1209*495ae853SAndroid Build Coastguard Worker                     i4_ref_mb_type = i4_ref_mb_type_q3;
1210*495ae853SAndroid Build Coastguard Worker                 }
1211*495ae853SAndroid Build Coastguard Worker             }
1212*495ae853SAndroid Build Coastguard Worker             else if(i4_x < i4_mb_quard1_part_x)
1213*495ae853SAndroid Build Coastguard Worker             {
1214*495ae853SAndroid Build Coastguard Worker                 if(i4_y >= i4_mb_quard1_part_y)
1215*495ae853SAndroid Build Coastguard Worker                 {
1216*495ae853SAndroid Build Coastguard Worker                     i4_ref_mb_type = i4_ref_mb_type_q2;
1217*495ae853SAndroid Build Coastguard Worker                 }
1218*495ae853SAndroid Build Coastguard Worker             }
1219*495ae853SAndroid Build Coastguard Worker 
1220*495ae853SAndroid Build Coastguard Worker             /****************************************************************/
1221*495ae853SAndroid Build Coastguard Worker             /* Reference layer Residual Buffer is maintained as 8-bit data  */
1222*495ae853SAndroid Build Coastguard Worker             /* Buffer and 1-bit sign bit packed buffer. Sign Byte is read   */
1223*495ae853SAndroid Build Coastguard Worker             /* and sign of the data sample is extracted depending upon bit  */
1224*495ae853SAndroid Build Coastguard Worker             /* postition.                                                   */
1225*495ae853SAndroid Build Coastguard Worker             /****************************************************************/
1226*495ae853SAndroid Build Coastguard Worker 
1227*495ae853SAndroid Build Coastguard Worker             /* update the buffer pointers to appropriate locations */
1228*495ae853SAndroid Build Coastguard Worker             pi2_ref_array_temp = pi2_ref_array + i4_x;
1229*495ae853SAndroid Build Coastguard Worker             pi2_ref_array_temp += i4_y * i4_refarray_wd;
1230*495ae853SAndroid Build Coastguard Worker 
1231*495ae853SAndroid Build Coastguard Worker             /* extract the residual value and fill the buffer */
1232*495ae853SAndroid Build Coastguard Worker             if(SVC_INTER_MB == i4_ref_mb_type)
1233*495ae853SAndroid Build Coastguard Worker             {
1234*495ae853SAndroid Build Coastguard Worker                 /* derive the reference data pointers */
1235*495ae853SAndroid Build Coastguard Worker                 pi2_ref_data_byte = pi2_inp_data + (i4_x_ref << i4_chroma_flag);
1236*495ae853SAndroid Build Coastguard Worker                 pi2_ref_data_byte += i4_y_ref * i4_inp_data_stride;
1237*495ae853SAndroid Build Coastguard Worker 
1238*495ae853SAndroid Build Coastguard Worker                 /* store the residual value */
1239*495ae853SAndroid Build Coastguard Worker                 *pi2_ref_array_temp = (WORD16) (*pi2_ref_data_byte);
1240*495ae853SAndroid Build Coastguard Worker             }
1241*495ae853SAndroid Build Coastguard Worker             else
1242*495ae853SAndroid Build Coastguard Worker             {
1243*495ae853SAndroid Build Coastguard Worker                 /* if non inter MB then store the 0 */
1244*495ae853SAndroid Build Coastguard Worker                 *pi2_ref_array_temp = 0;
1245*495ae853SAndroid Build Coastguard Worker             }
1246*495ae853SAndroid Build Coastguard Worker         }
1247*495ae853SAndroid Build Coastguard Worker     }
1248*495ae853SAndroid Build Coastguard Worker }
1249*495ae853SAndroid Build Coastguard Worker 
isvcd_residual_reflayer_const_boundary_mb(WORD16 * pi2_inp_data,WORD32 i4_inp_data_stride,WORD16 * pi2_ref_array,WORD32 i4_refarray_wd,WORD32 i4_refarray_ht,WORD32 i4_ref_wd,WORD32 i4_ref_ht,WORD32 i4_x_offset,WORD32 i4_y_offset,WORD32 i4_ref_mb_type_q0,WORD32 i4_ref_mb_type_q1,WORD32 i4_ref_mb_type_q2,WORD32 i4_ref_mb_type_q3,WORD32 i4_mb_quard1_part_x,WORD32 i4_mb_quard1_part_y,WORD32 i4_chroma_flag)1250*495ae853SAndroid Build Coastguard Worker void isvcd_residual_reflayer_const_boundary_mb(WORD16 *pi2_inp_data, WORD32 i4_inp_data_stride,
1251*495ae853SAndroid Build Coastguard Worker                                                WORD16 *pi2_ref_array, WORD32 i4_refarray_wd,
1252*495ae853SAndroid Build Coastguard Worker                                                WORD32 i4_refarray_ht, WORD32 i4_ref_wd,
1253*495ae853SAndroid Build Coastguard Worker                                                WORD32 i4_ref_ht, WORD32 i4_x_offset,
1254*495ae853SAndroid Build Coastguard Worker                                                WORD32 i4_y_offset, WORD32 i4_ref_mb_type_q0,
1255*495ae853SAndroid Build Coastguard Worker                                                WORD32 i4_ref_mb_type_q1, WORD32 i4_ref_mb_type_q2,
1256*495ae853SAndroid Build Coastguard Worker                                                WORD32 i4_ref_mb_type_q3, WORD32 i4_mb_quard1_part_x,
1257*495ae853SAndroid Build Coastguard Worker                                                WORD32 i4_mb_quard1_part_y, WORD32 i4_chroma_flag)
1258*495ae853SAndroid Build Coastguard Worker {
1259*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x_ref, i4_y_ref;
1260*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
1261*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_ref_data_byte;
1262*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_ref_array_temp;
1263*495ae853SAndroid Build Coastguard Worker 
1264*495ae853SAndroid Build Coastguard Worker     /*Quard 0*/
1265*495ae853SAndroid Build Coastguard Worker     for(i4_y = 0; i4_y < i4_mb_quard1_part_y; i4_y++)
1266*495ae853SAndroid Build Coastguard Worker     {
1267*495ae853SAndroid Build Coastguard Worker         for(i4_x = 0; i4_x < i4_mb_quard1_part_x; i4_x++)
1268*495ae853SAndroid Build Coastguard Worker         {
1269*495ae853SAndroid Build Coastguard Worker             i4_y_ref = MAX(0, MIN(i4_ref_ht - 1, i4_y + i4_y_offset));
1270*495ae853SAndroid Build Coastguard Worker             i4_x_ref = MAX(0, MIN(i4_ref_wd - 1, i4_x + i4_x_offset));
1271*495ae853SAndroid Build Coastguard Worker 
1272*495ae853SAndroid Build Coastguard Worker             /****************************************************************/
1273*495ae853SAndroid Build Coastguard Worker             /* Reference layer Residual Buffer is maintained as 8-bit data  */
1274*495ae853SAndroid Build Coastguard Worker             /* Buffer and 1-bit sign bit packed buffer. Sign Byte is read   */
1275*495ae853SAndroid Build Coastguard Worker             /* and sign of the data sample is extracted depending upon bit  */
1276*495ae853SAndroid Build Coastguard Worker             /* postition.                                                   */
1277*495ae853SAndroid Build Coastguard Worker             /****************************************************************/
1278*495ae853SAndroid Build Coastguard Worker 
1279*495ae853SAndroid Build Coastguard Worker             /* update the buffer pointers to appropriate locations */
1280*495ae853SAndroid Build Coastguard Worker             pi2_ref_array_temp = pi2_ref_array + i4_x;
1281*495ae853SAndroid Build Coastguard Worker             pi2_ref_array_temp += i4_y * i4_refarray_wd;
1282*495ae853SAndroid Build Coastguard Worker 
1283*495ae853SAndroid Build Coastguard Worker             /* extract the residual value and fill the buffer */
1284*495ae853SAndroid Build Coastguard Worker             if(SVC_INTER_MB == i4_ref_mb_type_q0)
1285*495ae853SAndroid Build Coastguard Worker             {
1286*495ae853SAndroid Build Coastguard Worker                 /* input pointer will be pointing to (xoffset,yoffset) */
1287*495ae853SAndroid Build Coastguard Worker                 /* So subtract the correction to reference location    */
1288*495ae853SAndroid Build Coastguard Worker                 if(0 <= i4_x_offset)
1289*495ae853SAndroid Build Coastguard Worker                 {
1290*495ae853SAndroid Build Coastguard Worker                     /* if only inside frame dimension */
1291*495ae853SAndroid Build Coastguard Worker                     i4_x_ref = i4_x_ref - i4_x_offset;
1292*495ae853SAndroid Build Coastguard Worker                 }
1293*495ae853SAndroid Build Coastguard Worker 
1294*495ae853SAndroid Build Coastguard Worker                 if(0 <= i4_y_offset)
1295*495ae853SAndroid Build Coastguard Worker                 {
1296*495ae853SAndroid Build Coastguard Worker                     /* if only inside frame dimension */
1297*495ae853SAndroid Build Coastguard Worker                     i4_y_ref = i4_y_ref - i4_y_offset;
1298*495ae853SAndroid Build Coastguard Worker                 }
1299*495ae853SAndroid Build Coastguard Worker                 /* derive the reference data pointers */
1300*495ae853SAndroid Build Coastguard Worker 
1301*495ae853SAndroid Build Coastguard Worker                 pi2_ref_data_byte = pi2_inp_data + (i4_x_ref << i4_chroma_flag);
1302*495ae853SAndroid Build Coastguard Worker                 pi2_ref_data_byte += i4_y_ref * i4_inp_data_stride;
1303*495ae853SAndroid Build Coastguard Worker 
1304*495ae853SAndroid Build Coastguard Worker                 /* store the residual value */
1305*495ae853SAndroid Build Coastguard Worker                 *pi2_ref_array_temp = (WORD16) (*pi2_ref_data_byte);
1306*495ae853SAndroid Build Coastguard Worker             }
1307*495ae853SAndroid Build Coastguard Worker             else
1308*495ae853SAndroid Build Coastguard Worker             {
1309*495ae853SAndroid Build Coastguard Worker                 /* if non inter MB then store the 0 */
1310*495ae853SAndroid Build Coastguard Worker                 *pi2_ref_array_temp = 0;
1311*495ae853SAndroid Build Coastguard Worker             }
1312*495ae853SAndroid Build Coastguard Worker         }
1313*495ae853SAndroid Build Coastguard Worker     }
1314*495ae853SAndroid Build Coastguard Worker 
1315*495ae853SAndroid Build Coastguard Worker     /*Quard 1*/
1316*495ae853SAndroid Build Coastguard Worker     for(i4_y = 0; i4_y < i4_mb_quard1_part_y; i4_y++)
1317*495ae853SAndroid Build Coastguard Worker     {
1318*495ae853SAndroid Build Coastguard Worker         for(i4_x = i4_mb_quard1_part_x; i4_x < i4_refarray_wd; i4_x++)
1319*495ae853SAndroid Build Coastguard Worker         {
1320*495ae853SAndroid Build Coastguard Worker             i4_y_ref = MAX(0, MIN(i4_ref_ht - 1, i4_y + i4_y_offset));
1321*495ae853SAndroid Build Coastguard Worker             i4_x_ref = MAX(0, MIN(i4_ref_wd - 1, i4_x + i4_x_offset));
1322*495ae853SAndroid Build Coastguard Worker 
1323*495ae853SAndroid Build Coastguard Worker             /****************************************************************/
1324*495ae853SAndroid Build Coastguard Worker             /* Reference layer Residual Buffer is maintained as 8-bit data  */
1325*495ae853SAndroid Build Coastguard Worker             /* Buffer and 1-bit sign bit packed buffer. Sign Byte is read   */
1326*495ae853SAndroid Build Coastguard Worker             /* and sign of the data sample is extracted depending upon bit  */
1327*495ae853SAndroid Build Coastguard Worker             /* postition.                                                   */
1328*495ae853SAndroid Build Coastguard Worker             /****************************************************************/
1329*495ae853SAndroid Build Coastguard Worker 
1330*495ae853SAndroid Build Coastguard Worker             /* update the buffer pointers to appropriate locations */
1331*495ae853SAndroid Build Coastguard Worker             pi2_ref_array_temp = pi2_ref_array + i4_x;
1332*495ae853SAndroid Build Coastguard Worker             pi2_ref_array_temp += i4_y * i4_refarray_wd;
1333*495ae853SAndroid Build Coastguard Worker 
1334*495ae853SAndroid Build Coastguard Worker             /* extract the residual value and fill the buffer */
1335*495ae853SAndroid Build Coastguard Worker             if(SVC_INTER_MB == i4_ref_mb_type_q1)
1336*495ae853SAndroid Build Coastguard Worker             {
1337*495ae853SAndroid Build Coastguard Worker                 /* input pointer will be pointing to (xoffset,yoffset) */
1338*495ae853SAndroid Build Coastguard Worker                 /* So subtract the correction to reference location    */
1339*495ae853SAndroid Build Coastguard Worker                 if(0 <= i4_x_offset)
1340*495ae853SAndroid Build Coastguard Worker                 {
1341*495ae853SAndroid Build Coastguard Worker                     /* if only inside frame dimension */
1342*495ae853SAndroid Build Coastguard Worker                     i4_x_ref = i4_x_ref - i4_x_offset;
1343*495ae853SAndroid Build Coastguard Worker                 }
1344*495ae853SAndroid Build Coastguard Worker                 if(0 <= i4_y_offset)
1345*495ae853SAndroid Build Coastguard Worker                 {
1346*495ae853SAndroid Build Coastguard Worker                     /* if only inside frame dimension */
1347*495ae853SAndroid Build Coastguard Worker                     i4_y_ref = i4_y_ref - i4_y_offset;
1348*495ae853SAndroid Build Coastguard Worker                 }
1349*495ae853SAndroid Build Coastguard Worker                 /* derive the reference data pointers */
1350*495ae853SAndroid Build Coastguard Worker 
1351*495ae853SAndroid Build Coastguard Worker                 pi2_ref_data_byte = pi2_inp_data + (i4_x_ref << i4_chroma_flag);
1352*495ae853SAndroid Build Coastguard Worker                 pi2_ref_data_byte += i4_y_ref * i4_inp_data_stride;
1353*495ae853SAndroid Build Coastguard Worker 
1354*495ae853SAndroid Build Coastguard Worker                 /* store the residual value */
1355*495ae853SAndroid Build Coastguard Worker                 *pi2_ref_array_temp = (WORD16) (*pi2_ref_data_byte);
1356*495ae853SAndroid Build Coastguard Worker             }
1357*495ae853SAndroid Build Coastguard Worker             else
1358*495ae853SAndroid Build Coastguard Worker             {
1359*495ae853SAndroid Build Coastguard Worker                 /* if non inter MB then store the 0 */
1360*495ae853SAndroid Build Coastguard Worker                 *pi2_ref_array_temp = 0;
1361*495ae853SAndroid Build Coastguard Worker             }
1362*495ae853SAndroid Build Coastguard Worker         }
1363*495ae853SAndroid Build Coastguard Worker     }
1364*495ae853SAndroid Build Coastguard Worker 
1365*495ae853SAndroid Build Coastguard Worker     /*Quard 2*/
1366*495ae853SAndroid Build Coastguard Worker     for(i4_y = i4_mb_quard1_part_y; i4_y < i4_refarray_ht; i4_y++)
1367*495ae853SAndroid Build Coastguard Worker     {
1368*495ae853SAndroid Build Coastguard Worker         for(i4_x = 0; i4_x < i4_mb_quard1_part_x; i4_x++)
1369*495ae853SAndroid Build Coastguard Worker         {
1370*495ae853SAndroid Build Coastguard Worker             i4_y_ref = MAX(0, MIN(i4_ref_ht - 1, i4_y + i4_y_offset));
1371*495ae853SAndroid Build Coastguard Worker             i4_x_ref = MAX(0, MIN(i4_ref_wd - 1, i4_x + i4_x_offset));
1372*495ae853SAndroid Build Coastguard Worker 
1373*495ae853SAndroid Build Coastguard Worker             /****************************************************************/
1374*495ae853SAndroid Build Coastguard Worker             /* Reference layer Residual Buffer is maintained as 8-bit data  */
1375*495ae853SAndroid Build Coastguard Worker             /* Buffer and 1-bit sign bit packed buffer. Sign Byte is read   */
1376*495ae853SAndroid Build Coastguard Worker             /* and sign of the data sample is extracted depending upon bit  */
1377*495ae853SAndroid Build Coastguard Worker             /* postition.                                                   */
1378*495ae853SAndroid Build Coastguard Worker             /****************************************************************/
1379*495ae853SAndroid Build Coastguard Worker 
1380*495ae853SAndroid Build Coastguard Worker             /* update the buffer pointers to appropriate locations */
1381*495ae853SAndroid Build Coastguard Worker             pi2_ref_array_temp = pi2_ref_array + i4_x;
1382*495ae853SAndroid Build Coastguard Worker             pi2_ref_array_temp += i4_y * i4_refarray_wd;
1383*495ae853SAndroid Build Coastguard Worker 
1384*495ae853SAndroid Build Coastguard Worker             /* extract the residual value and fill the buffer */
1385*495ae853SAndroid Build Coastguard Worker             if(SVC_INTER_MB == i4_ref_mb_type_q2)
1386*495ae853SAndroid Build Coastguard Worker             {
1387*495ae853SAndroid Build Coastguard Worker                 /* input pointer will be pointing to (xoffset,yoffset) */
1388*495ae853SAndroid Build Coastguard Worker                 /* So subtract the correction to reference location    */
1389*495ae853SAndroid Build Coastguard Worker                 if(0 <= i4_x_offset)
1390*495ae853SAndroid Build Coastguard Worker                 {
1391*495ae853SAndroid Build Coastguard Worker                     /* if only inside frame dimension */
1392*495ae853SAndroid Build Coastguard Worker                     i4_x_ref = i4_x_ref - i4_x_offset;
1393*495ae853SAndroid Build Coastguard Worker                 }
1394*495ae853SAndroid Build Coastguard Worker                 if(0 <= i4_y_offset)
1395*495ae853SAndroid Build Coastguard Worker                 {
1396*495ae853SAndroid Build Coastguard Worker                     /* if only inside frame dimension */
1397*495ae853SAndroid Build Coastguard Worker                     i4_y_ref = i4_y_ref - i4_y_offset;
1398*495ae853SAndroid Build Coastguard Worker                 }
1399*495ae853SAndroid Build Coastguard Worker                 /* derive the reference data pointers */
1400*495ae853SAndroid Build Coastguard Worker                 pi2_ref_data_byte = pi2_inp_data + (i4_x_ref << i4_chroma_flag);
1401*495ae853SAndroid Build Coastguard Worker                 pi2_ref_data_byte += i4_y_ref * i4_inp_data_stride;
1402*495ae853SAndroid Build Coastguard Worker 
1403*495ae853SAndroid Build Coastguard Worker                 /* store the residual value */
1404*495ae853SAndroid Build Coastguard Worker                 *pi2_ref_array_temp = (WORD16) (*pi2_ref_data_byte);
1405*495ae853SAndroid Build Coastguard Worker             }
1406*495ae853SAndroid Build Coastguard Worker             else
1407*495ae853SAndroid Build Coastguard Worker             {
1408*495ae853SAndroid Build Coastguard Worker                 /* if non inter MB then store the 0 */
1409*495ae853SAndroid Build Coastguard Worker                 *pi2_ref_array_temp = 0;
1410*495ae853SAndroid Build Coastguard Worker             }
1411*495ae853SAndroid Build Coastguard Worker         }
1412*495ae853SAndroid Build Coastguard Worker     }
1413*495ae853SAndroid Build Coastguard Worker 
1414*495ae853SAndroid Build Coastguard Worker     /*Quard 3*/
1415*495ae853SAndroid Build Coastguard Worker     for(i4_y = i4_mb_quard1_part_y; i4_y < i4_refarray_ht; i4_y++)
1416*495ae853SAndroid Build Coastguard Worker     {
1417*495ae853SAndroid Build Coastguard Worker         for(i4_x = i4_mb_quard1_part_x; i4_x < i4_refarray_wd; i4_x++)
1418*495ae853SAndroid Build Coastguard Worker         {
1419*495ae853SAndroid Build Coastguard Worker             i4_y_ref = MAX(0, MIN(i4_ref_ht - 1, i4_y + i4_y_offset));
1420*495ae853SAndroid Build Coastguard Worker             i4_x_ref = MAX(0, MIN(i4_ref_wd - 1, i4_x + i4_x_offset));
1421*495ae853SAndroid Build Coastguard Worker 
1422*495ae853SAndroid Build Coastguard Worker             /****************************************************************/
1423*495ae853SAndroid Build Coastguard Worker             /* Reference layer Residual Buffer is maintained as 8-bit data  */
1424*495ae853SAndroid Build Coastguard Worker             /* Buffer and 1-bit sign bit packed buffer. Sign Byte is read   */
1425*495ae853SAndroid Build Coastguard Worker             /* and sign of the data sample is extracted depending upon bit  */
1426*495ae853SAndroid Build Coastguard Worker             /* postition.                                                   */
1427*495ae853SAndroid Build Coastguard Worker             /****************************************************************/
1428*495ae853SAndroid Build Coastguard Worker 
1429*495ae853SAndroid Build Coastguard Worker             /* update the buffer pointers to appropriate locations */
1430*495ae853SAndroid Build Coastguard Worker             pi2_ref_array_temp = pi2_ref_array + i4_x;
1431*495ae853SAndroid Build Coastguard Worker             pi2_ref_array_temp += i4_y * i4_refarray_wd;
1432*495ae853SAndroid Build Coastguard Worker 
1433*495ae853SAndroid Build Coastguard Worker             /* extract the residual value and fill the buffer */
1434*495ae853SAndroid Build Coastguard Worker             if(SVC_INTER_MB == i4_ref_mb_type_q3)
1435*495ae853SAndroid Build Coastguard Worker             {
1436*495ae853SAndroid Build Coastguard Worker                 /* input pointer will be pointing to (xoffset,yoffset) */
1437*495ae853SAndroid Build Coastguard Worker                 /* So subtract the correction to reference location    */
1438*495ae853SAndroid Build Coastguard Worker                 if(0 <= i4_x_offset)
1439*495ae853SAndroid Build Coastguard Worker                 {
1440*495ae853SAndroid Build Coastguard Worker                     /* if only inside frame dimension */
1441*495ae853SAndroid Build Coastguard Worker                     i4_x_ref = i4_x_ref - i4_x_offset;
1442*495ae853SAndroid Build Coastguard Worker                 }
1443*495ae853SAndroid Build Coastguard Worker                 if(0 <= i4_y_offset)
1444*495ae853SAndroid Build Coastguard Worker                 {
1445*495ae853SAndroid Build Coastguard Worker                     /* if only inside frame dimension */
1446*495ae853SAndroid Build Coastguard Worker                     i4_y_ref = i4_y_ref - i4_y_offset;
1447*495ae853SAndroid Build Coastguard Worker                 }
1448*495ae853SAndroid Build Coastguard Worker                 /* derive the reference data pointers */
1449*495ae853SAndroid Build Coastguard Worker                 pi2_ref_data_byte = pi2_inp_data + (i4_x_ref << i4_chroma_flag);
1450*495ae853SAndroid Build Coastguard Worker                 pi2_ref_data_byte += i4_y_ref * i4_inp_data_stride;
1451*495ae853SAndroid Build Coastguard Worker 
1452*495ae853SAndroid Build Coastguard Worker                 /* store the residual value */
1453*495ae853SAndroid Build Coastguard Worker                 *pi2_ref_array_temp = (WORD16) (*pi2_ref_data_byte);
1454*495ae853SAndroid Build Coastguard Worker             }
1455*495ae853SAndroid Build Coastguard Worker             else
1456*495ae853SAndroid Build Coastguard Worker             {
1457*495ae853SAndroid Build Coastguard Worker                 /* if non inter MB then store the 0 */
1458*495ae853SAndroid Build Coastguard Worker                 *pi2_ref_array_temp = 0;
1459*495ae853SAndroid Build Coastguard Worker             }
1460*495ae853SAndroid Build Coastguard Worker         }
1461*495ae853SAndroid Build Coastguard Worker     }
1462*495ae853SAndroid Build Coastguard Worker }
1463*495ae853SAndroid Build Coastguard Worker 
1464*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1465*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1466*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_residual_reflayer_const                             */
1467*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1468*495ae853SAndroid Build Coastguard Worker /*  Description   :  This function constructs the reference array buffer     */
1469*495ae853SAndroid Build Coastguard Worker /*                    used for residual resampling of a component in an MB   */
1470*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1471*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_residual_samp_ctxt: intra sampling context            */
1472*495ae853SAndroid Build Coastguard Worker /*                  pu1_inp : input (reference layer data)                   */
1473*495ae853SAndroid Build Coastguard Worker /*                  i4_inp_stride : input buffer stride                      */
1474*495ae853SAndroid Build Coastguard Worker /*                  pu1_inp_bitmap : input (reference layer sign bits)       */
1475*495ae853SAndroid Build Coastguard Worker /*                  i4_inp_stride : input buffer stride                      */
1476*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_mb_mode : ref layer mb mode buffer desc           */
1477*495ae853SAndroid Build Coastguard Worker /*                  pi4_refarr_wd : pointer to store the reference array WD  */
1478*495ae853SAndroid Build Coastguard Worker /*                  pi4_refarr_ht : pointer to store the reference array HT  */
1479*495ae853SAndroid Build Coastguard Worker /*                  pi4_x_offset : pointer to store the reference X offset   */
1480*495ae853SAndroid Build Coastguard Worker /*                  pi4_y_offset : pointer to store the reference Y offset   */
1481*495ae853SAndroid Build Coastguard Worker /*                  ps_coord     : mb co-ordinate structure                  */
1482*495ae853SAndroid Build Coastguard Worker /*                  i4_chroma_flag : chroma processing flag                  */
1483*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1484*495ae853SAndroid Build Coastguard Worker /*  Processing    : it fills the reference layer data if they are falling in */
1485*495ae853SAndroid Build Coastguard Worker /*                  INTRA MB region. If all the pixels are not filled  it    */
1486*495ae853SAndroid Build Coastguard Worker /*                  calls the border extension algorithm to fill them        */
1487*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
1488*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1489*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1490*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1491*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1492*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1493*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1494*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1495*495ae853SAndroid Build Coastguard Worker /*         06 07 2021   vijayakumar          creation                        */
1496*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1497*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_residual_reflayer_const(void * pv_residual_samp_ctxt,WORD16 * pi2_inp_data,WORD32 i4_inp_data_stride,mem_element_t * ps_ref_mb_mode,WORD32 * pi4_refarr_wd,mb_coord_t * ps_coord,WORD32 i4_chroma_flag)1498*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_residual_reflayer_const(void *pv_residual_samp_ctxt, WORD16 *pi2_inp_data,
1499*495ae853SAndroid Build Coastguard Worker                                      WORD32 i4_inp_data_stride, mem_element_t *ps_ref_mb_mode,
1500*495ae853SAndroid Build Coastguard Worker                                      WORD32 *pi4_refarr_wd, mb_coord_t *ps_coord,
1501*495ae853SAndroid Build Coastguard Worker                                      WORD32 i4_chroma_flag)
1502*495ae853SAndroid Build Coastguard Worker {
1503*495ae853SAndroid Build Coastguard Worker     residual_sampling_ctxt_t *ps_ctxt;
1504*495ae853SAndroid Build Coastguard Worker     res_lyr_ctxt *ps_lyr_ctxt;
1505*495ae853SAndroid Build Coastguard Worker     WORD8 *pi1_ref_mb_modes;
1506*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_mode_stride;
1507*495ae853SAndroid Build Coastguard Worker     WORD32 i4_element_size;
1508*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_wd;
1509*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_ht;
1510*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x_offset;
1511*495ae853SAndroid Build Coastguard Worker     WORD32 i4_y_offset;
1512*495ae853SAndroid Build Coastguard Worker     WORD32 i4_refarray_wd;
1513*495ae853SAndroid Build Coastguard Worker     WORD32 i4_refarray_ht;
1514*495ae853SAndroid Build Coastguard Worker     WORD8 i1_edge_mb;
1515*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_ref_array;
1516*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_sft;
1517*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_x, i4_mb_y;
1518*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_x_strt, i4_mb_y_strt;
1519*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_quard1_part_x, i4_mb_quard1_part_y;
1520*495ae853SAndroid Build Coastguard Worker     WORD8 *pi1_ref_mb_modes_incr;
1521*495ae853SAndroid Build Coastguard Worker     WORD8 *pi1_ref_mb_modes_incr_temp;
1522*495ae853SAndroid Build Coastguard Worker     inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms;
1523*495ae853SAndroid Build Coastguard Worker 
1524*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_wd;
1525*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_ht;
1526*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x_ref, i4_y_ref;
1527*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_mb_type_q0, i4_ref_mb_type_q1, i4_ref_mb_type_q2, i4_ref_mb_type_q3;
1528*495ae853SAndroid Build Coastguard Worker     WORD8 i1_mb_mode_q0, i1_mb_mode_q1, i1_mb_mode_q2, i1_mb_mode_q3;
1529*495ae853SAndroid Build Coastguard Worker     WORD32 ret;
1530*495ae853SAndroid Build Coastguard Worker 
1531*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt;
1532*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
1533*495ae853SAndroid Build Coastguard Worker     pi2_ref_array = ps_ctxt->pi2_refarray_buffer;
1534*495ae853SAndroid Build Coastguard Worker 
1535*495ae853SAndroid Build Coastguard Worker     pi1_ref_mb_modes = (WORD8 *) ps_ref_mb_mode->pv_buffer;
1536*495ae853SAndroid Build Coastguard Worker     i4_ref_mode_stride = ps_ref_mb_mode->i4_num_element_stride;
1537*495ae853SAndroid Build Coastguard Worker     i4_element_size = ps_ref_mb_mode->i4_element_size;
1538*495ae853SAndroid Build Coastguard Worker 
1539*495ae853SAndroid Build Coastguard Worker     if(NULL == pi1_ref_mb_modes)
1540*495ae853SAndroid Build Coastguard Worker     {
1541*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
1542*495ae853SAndroid Build Coastguard Worker     }
1543*495ae853SAndroid Build Coastguard Worker 
1544*495ae853SAndroid Build Coastguard Worker     i4_mb_wd = MB_WIDTH >> i4_chroma_flag;
1545*495ae853SAndroid Build Coastguard Worker     i4_mb_ht = MB_HEIGHT >> i4_chroma_flag;
1546*495ae853SAndroid Build Coastguard Worker 
1547*495ae853SAndroid Build Coastguard Worker     /* ----------------------------------------------------------------- */
1548*495ae853SAndroid Build Coastguard Worker     /* Deriving the parameters required for further processing           */
1549*495ae853SAndroid Build Coastguard Worker     /* ----------------------------------------------------------------- */
1550*495ae853SAndroid Build Coastguard Worker     {
1551*495ae853SAndroid Build Coastguard Worker         ref_mb_map_t *ps_x_off_len;
1552*495ae853SAndroid Build Coastguard Worker         ref_mb_map_t *ps_y_off_len;
1553*495ae853SAndroid Build Coastguard Worker         WORD32 i4_mbaddr_x;
1554*495ae853SAndroid Build Coastguard Worker         WORD32 i4_mbaddr_y;
1555*495ae853SAndroid Build Coastguard Worker         WORD32 i4_base_width;
1556*495ae853SAndroid Build Coastguard Worker         WORD32 i4_base_height;
1557*495ae853SAndroid Build Coastguard Worker         residual_samp_map_ctxt_t *ps_map_ctxt;
1558*495ae853SAndroid Build Coastguard Worker 
1559*495ae853SAndroid Build Coastguard Worker         if(1 == i4_chroma_flag)
1560*495ae853SAndroid Build Coastguard Worker             ps_map_ctxt = &ps_lyr_ctxt->s_chroma_map_ctxt;
1561*495ae853SAndroid Build Coastguard Worker         else
1562*495ae853SAndroid Build Coastguard Worker             ps_map_ctxt = &ps_lyr_ctxt->s_luma_map_ctxt;
1563*495ae853SAndroid Build Coastguard Worker 
1564*495ae853SAndroid Build Coastguard Worker         i4_mbaddr_y = ps_coord->u2_mb_y;
1565*495ae853SAndroid Build Coastguard Worker         i4_mbaddr_x = ps_coord->u2_mb_x;
1566*495ae853SAndroid Build Coastguard Worker         i4_base_width = ps_lyr_ctxt->i4_ref_width;
1567*495ae853SAndroid Build Coastguard Worker         i4_base_height = ps_lyr_ctxt->i4_ref_height;
1568*495ae853SAndroid Build Coastguard Worker         i4_ref_wd = i4_base_width >> i4_chroma_flag;
1569*495ae853SAndroid Build Coastguard Worker         i4_ref_ht = i4_base_height >> i4_chroma_flag;
1570*495ae853SAndroid Build Coastguard Worker 
1571*495ae853SAndroid Build Coastguard Worker         /* --------------------------------------------------------------------- */
1572*495ae853SAndroid Build Coastguard Worker         /* Extracting information from the mapping context                       */
1573*495ae853SAndroid Build Coastguard Worker         /* --------------------------------------------------------------------- */
1574*495ae853SAndroid Build Coastguard Worker         ps_x_off_len = ps_map_ctxt->ps_x_offset_length;
1575*495ae853SAndroid Build Coastguard Worker         ps_y_off_len = ps_map_ctxt->ps_y_offset_length;
1576*495ae853SAndroid Build Coastguard Worker         i4_x_offset = ps_x_off_len[i4_mbaddr_x].i2_offset;
1577*495ae853SAndroid Build Coastguard Worker         i4_y_offset = ps_y_off_len[i4_mbaddr_y].i2_offset;
1578*495ae853SAndroid Build Coastguard Worker         i4_refarray_wd = ps_x_off_len[i4_mbaddr_x].i2_length;
1579*495ae853SAndroid Build Coastguard Worker         i4_refarray_ht = ps_y_off_len[i4_mbaddr_y].i2_length;
1580*495ae853SAndroid Build Coastguard Worker     }
1581*495ae853SAndroid Build Coastguard Worker 
1582*495ae853SAndroid Build Coastguard Worker     /* Call the module to fill the increments based on transform blocks */
1583*495ae853SAndroid Build Coastguard Worker     ret = isvcd_ref_layer_ptr_incr(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size,
1584*495ae853SAndroid Build Coastguard Worker                                    i4_x_offset, i4_y_offset, i4_refarray_wd, i4_refarray_ht,
1585*495ae853SAndroid Build Coastguard Worker                                    ps_ctxt->pu1_ref_x_ptr_incr, ps_ctxt->pu1_ref_y_ptr_incr,
1586*495ae853SAndroid Build Coastguard Worker                                    i4_chroma_flag);
1587*495ae853SAndroid Build Coastguard Worker 
1588*495ae853SAndroid Build Coastguard Worker     if(ret != OK)
1589*495ae853SAndroid Build Coastguard Worker     {
1590*495ae853SAndroid Build Coastguard Worker         return ret;
1591*495ae853SAndroid Build Coastguard Worker     }
1592*495ae853SAndroid Build Coastguard Worker     i4_mb_sft = (MB_WIDTH_SHIFT - i4_chroma_flag);
1593*495ae853SAndroid Build Coastguard Worker 
1594*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1595*495ae853SAndroid Build Coastguard Worker     /* MB Level Resampling for the MB - Pointers sent for MB in both layers  */
1596*495ae853SAndroid Build Coastguard Worker     /* This has been written according to the dyadic case                    */
1597*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1598*495ae853SAndroid Build Coastguard Worker     i4_y_ref = MAX(0, MIN(i4_ref_ht - 1, 0 + i4_y_offset));
1599*495ae853SAndroid Build Coastguard Worker     i4_x_ref = MAX(0, MIN(i4_ref_wd - 1, 0 + i4_x_offset));
1600*495ae853SAndroid Build Coastguard Worker     i4_mb_x_strt = i4_x_ref % i4_mb_wd;
1601*495ae853SAndroid Build Coastguard Worker     i4_mb_y_strt = i4_y_ref % i4_mb_ht;
1602*495ae853SAndroid Build Coastguard Worker 
1603*495ae853SAndroid Build Coastguard Worker     i4_mb_quard1_part_x = i4_mb_wd - i4_mb_x_strt;
1604*495ae853SAndroid Build Coastguard Worker     i4_mb_quard1_part_y = i4_mb_ht - i4_mb_y_strt;
1605*495ae853SAndroid Build Coastguard Worker     if(!(i4_mb_quard1_part_x >= 0))
1606*495ae853SAndroid Build Coastguard Worker     {
1607*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
1608*495ae853SAndroid Build Coastguard Worker     }
1609*495ae853SAndroid Build Coastguard Worker     if(!(i4_mb_quard1_part_y >= 0))
1610*495ae853SAndroid Build Coastguard Worker     {
1611*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
1612*495ae853SAndroid Build Coastguard Worker     }
1613*495ae853SAndroid Build Coastguard Worker 
1614*495ae853SAndroid Build Coastguard Worker     i4_mb_x = (i4_x_ref >> i4_mb_sft);
1615*495ae853SAndroid Build Coastguard Worker     i4_mb_y = (i4_y_ref >> i4_mb_sft);
1616*495ae853SAndroid Build Coastguard Worker 
1617*495ae853SAndroid Build Coastguard Worker     /* get the location of the byte which has the current mb mode */
1618*495ae853SAndroid Build Coastguard Worker     pi1_ref_mb_modes_incr = pi1_ref_mb_modes + (i4_mb_y * i4_ref_mode_stride * i4_element_size);
1619*495ae853SAndroid Build Coastguard Worker     pi1_ref_mb_modes_incr += (i4_mb_x * i4_element_size);
1620*495ae853SAndroid Build Coastguard Worker     ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr;
1621*495ae853SAndroid Build Coastguard Worker     i1_mb_mode_q0 = ps_inter_lyr_mb_prms->i1_mb_mode;
1622*495ae853SAndroid Build Coastguard Worker     i1_mb_mode_q1 = i1_mb_mode_q0;
1623*495ae853SAndroid Build Coastguard Worker     i1_mb_mode_q2 = i1_mb_mode_q0;
1624*495ae853SAndroid Build Coastguard Worker     i1_mb_mode_q3 = i1_mb_mode_q0;
1625*495ae853SAndroid Build Coastguard Worker 
1626*495ae853SAndroid Build Coastguard Worker     pi1_ref_mb_modes_incr_temp = pi1_ref_mb_modes_incr;
1627*495ae853SAndroid Build Coastguard Worker     if(i4_mb_quard1_part_x > 0)
1628*495ae853SAndroid Build Coastguard Worker     {
1629*495ae853SAndroid Build Coastguard Worker         pi1_ref_mb_modes_incr_temp = pi1_ref_mb_modes_incr + i4_element_size;
1630*495ae853SAndroid Build Coastguard Worker         ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr_temp;
1631*495ae853SAndroid Build Coastguard Worker         i1_mb_mode_q1 = ps_inter_lyr_mb_prms->i1_mb_mode;
1632*495ae853SAndroid Build Coastguard Worker     }
1633*495ae853SAndroid Build Coastguard Worker 
1634*495ae853SAndroid Build Coastguard Worker     if(i4_mb_quard1_part_y > 0)
1635*495ae853SAndroid Build Coastguard Worker     {
1636*495ae853SAndroid Build Coastguard Worker         pi1_ref_mb_modes_incr_temp = pi1_ref_mb_modes_incr + (i4_ref_mode_stride * i4_element_size);
1637*495ae853SAndroid Build Coastguard Worker         ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr_temp;
1638*495ae853SAndroid Build Coastguard Worker         i1_mb_mode_q2 = ps_inter_lyr_mb_prms->i1_mb_mode;
1639*495ae853SAndroid Build Coastguard Worker     }
1640*495ae853SAndroid Build Coastguard Worker 
1641*495ae853SAndroid Build Coastguard Worker     if((i4_mb_quard1_part_x > 0) && (i4_mb_quard1_part_y > 0))
1642*495ae853SAndroid Build Coastguard Worker     {
1643*495ae853SAndroid Build Coastguard Worker         pi1_ref_mb_modes_incr_temp =
1644*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_modes_incr + (i4_ref_mode_stride * i4_element_size) + i4_element_size;
1645*495ae853SAndroid Build Coastguard Worker         ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes_incr_temp;
1646*495ae853SAndroid Build Coastguard Worker         i1_mb_mode_q3 = ps_inter_lyr_mb_prms->i1_mb_mode;
1647*495ae853SAndroid Build Coastguard Worker     }
1648*495ae853SAndroid Build Coastguard Worker 
1649*495ae853SAndroid Build Coastguard Worker     i4_ref_mb_type_q0 = (i1_mb_mode_q0 <= SVC_INTER_MB) ? SVC_INTER_MB : SVC_INTRA_MB;
1650*495ae853SAndroid Build Coastguard Worker     i4_ref_mb_type_q1 = (i1_mb_mode_q1 <= SVC_INTER_MB) ? SVC_INTER_MB : SVC_INTRA_MB;
1651*495ae853SAndroid Build Coastguard Worker     i4_ref_mb_type_q2 = (i1_mb_mode_q2 <= SVC_INTER_MB) ? SVC_INTER_MB : SVC_INTRA_MB;
1652*495ae853SAndroid Build Coastguard Worker     i4_ref_mb_type_q3 = (i1_mb_mode_q3 <= SVC_INTER_MB) ? SVC_INTER_MB : SVC_INTRA_MB;
1653*495ae853SAndroid Build Coastguard Worker 
1654*495ae853SAndroid Build Coastguard Worker     i1_edge_mb = (ps_coord->u2_mb_x == 0 || ps_coord->u2_mb_y == 0 ||
1655*495ae853SAndroid Build Coastguard Worker                   (ps_coord->u2_mb_x == ((ps_lyr_ctxt->i4_curr_width >> MB_WIDTH_SHIFT) - 1)) ||
1656*495ae853SAndroid Build Coastguard Worker                   (ps_coord->u2_mb_y == ((ps_lyr_ctxt->i4_curr_height >> MB_HEIGHT_SHIFT) - 1)));
1657*495ae853SAndroid Build Coastguard Worker     if(i1_edge_mb)
1658*495ae853SAndroid Build Coastguard Worker     {
1659*495ae853SAndroid Build Coastguard Worker         ps_ctxt->pf_residual_reflayer_const_boundary_mb(
1660*495ae853SAndroid Build Coastguard Worker             pi2_inp_data, i4_inp_data_stride, pi2_ref_array, i4_refarray_wd, i4_refarray_ht,
1661*495ae853SAndroid Build Coastguard Worker             i4_ref_wd, i4_ref_ht, i4_x_offset, i4_y_offset, i4_ref_mb_type_q0, i4_ref_mb_type_q1,
1662*495ae853SAndroid Build Coastguard Worker             i4_ref_mb_type_q2, i4_ref_mb_type_q3, i4_mb_quard1_part_x, i4_mb_quard1_part_y,
1663*495ae853SAndroid Build Coastguard Worker             i4_chroma_flag);
1664*495ae853SAndroid Build Coastguard Worker     }
1665*495ae853SAndroid Build Coastguard Worker     else
1666*495ae853SAndroid Build Coastguard Worker     {
1667*495ae853SAndroid Build Coastguard Worker         ps_ctxt->pf_residual_reflayer_const_non_boundary_mb(
1668*495ae853SAndroid Build Coastguard Worker             pi2_inp_data, i4_inp_data_stride, pi2_ref_array, i4_refarray_wd, i4_refarray_ht,
1669*495ae853SAndroid Build Coastguard Worker             i4_ref_mb_type_q0, i4_ref_mb_type_q1, i4_ref_mb_type_q2, i4_ref_mb_type_q3,
1670*495ae853SAndroid Build Coastguard Worker             i4_mb_quard1_part_x, i4_mb_quard1_part_y, i4_chroma_flag);
1671*495ae853SAndroid Build Coastguard Worker     }
1672*495ae853SAndroid Build Coastguard Worker     /* store the values into the place holders */
1673*495ae853SAndroid Build Coastguard Worker     *pi4_refarr_wd = i4_refarray_wd;
1674*495ae853SAndroid Build Coastguard Worker 
1675*495ae853SAndroid Build Coastguard Worker     return OK;
1676*495ae853SAndroid Build Coastguard Worker }
1677*495ae853SAndroid Build Coastguard Worker 
1678*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1679*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1680*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_interpolate_residual                                */
1681*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1682*495ae853SAndroid Build Coastguard Worker /*  Description   : This function takes the refernce array buffer and perform*/
1683*495ae853SAndroid Build Coastguard Worker /*                    interpolation of a component to find the residual      */
1684*495ae853SAndroid Build Coastguard Worker /*                     resampled value                                       */
1685*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_residual_samp_ctxt : residual sampling context        */
1686*495ae853SAndroid Build Coastguard Worker /*                  pi2_out : output buffer pointer                          */
1687*495ae853SAndroid Build Coastguard Worker /*                  i4_out_stride : output buffer stride                     */
1688*495ae853SAndroid Build Coastguard Worker /*                  i4_refarray_wd : reference array width                   */
1689*495ae853SAndroid Build Coastguard Worker /*                  i4_x_offset : offset in reference layer in horz direction*/
1690*495ae853SAndroid Build Coastguard Worker /*                  ps_coord : current mb co-ordinate                        */
1691*495ae853SAndroid Build Coastguard Worker /*                  i4_chroma_flag : chroma processing flag                  */
1692*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1693*495ae853SAndroid Build Coastguard Worker /*  Processing    : it does the interpolation in vertical direction followed */
1694*495ae853SAndroid Build Coastguard Worker /*                  by horizontal direction                                  */
1695*495ae853SAndroid Build Coastguard Worker /*  Outputs       : resampled pixels                                         */
1696*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1697*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1698*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1699*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1700*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1701*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1702*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1703*495ae853SAndroid Build Coastguard Worker /*         06 07 2021   vijayakumar          creation                        */
1704*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1705*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_interpolate_residual(void * pv_residual_samp_ctxt,WORD16 * pi2_out,WORD32 i4_out_stride,WORD32 i4_refarray_wd,UWORD16 u2_mb_x,UWORD16 u2_mb_y,WORD32 i4_chroma_flag)1706*495ae853SAndroid Build Coastguard Worker void isvcd_interpolate_residual(void *pv_residual_samp_ctxt, WORD16 *pi2_out, WORD32 i4_out_stride,
1707*495ae853SAndroid Build Coastguard Worker                                 WORD32 i4_refarray_wd, UWORD16 u2_mb_x, UWORD16 u2_mb_y,
1708*495ae853SAndroid Build Coastguard Worker                                 WORD32 i4_chroma_flag)
1709*495ae853SAndroid Build Coastguard Worker {
1710*495ae853SAndroid Build Coastguard Worker     residual_sampling_ctxt_t *ps_ctxt;
1711*495ae853SAndroid Build Coastguard Worker     residual_samp_map_ctxt_t *ps_map_ctxt;
1712*495ae853SAndroid Build Coastguard Worker     res_lyr_ctxt *ps_lyr_ctxt;
1713*495ae853SAndroid Build Coastguard Worker     ref_pixel_map_t *ps_x_pos_phase;
1714*495ae853SAndroid Build Coastguard Worker     ref_pixel_map_t *ps_y_pos_phase;
1715*495ae853SAndroid Build Coastguard Worker 
1716*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
1717*495ae853SAndroid Build Coastguard Worker     WORD32 i4_frm_mb_x, i4_frm_mb_y;
1718*495ae853SAndroid Build Coastguard Worker     WORD32 i4_temp_array_ht;
1719*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_wd;
1720*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_ht;
1721*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_ref_array;
1722*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_ref_x_ptr_incr, *pu1_ref_y_ptr_incr;
1723*495ae853SAndroid Build Coastguard Worker 
1724*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt;
1725*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
1726*495ae853SAndroid Build Coastguard Worker     pi2_ref_array = ps_ctxt->pi2_refarray_buffer;
1727*495ae853SAndroid Build Coastguard Worker     pu1_ref_x_ptr_incr = ps_ctxt->pu1_ref_x_ptr_incr;
1728*495ae853SAndroid Build Coastguard Worker     pu1_ref_y_ptr_incr = ps_ctxt->pu1_ref_y_ptr_incr;
1729*495ae853SAndroid Build Coastguard Worker 
1730*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1731*495ae853SAndroid Build Coastguard Worker     /* Extracting information from the mapping context                       */
1732*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1733*495ae853SAndroid Build Coastguard Worker     if(1 == i4_chroma_flag)
1734*495ae853SAndroid Build Coastguard Worker         ps_map_ctxt = &ps_lyr_ctxt->s_chroma_map_ctxt;
1735*495ae853SAndroid Build Coastguard Worker     else
1736*495ae853SAndroid Build Coastguard Worker         ps_map_ctxt = &ps_lyr_ctxt->s_luma_map_ctxt;
1737*495ae853SAndroid Build Coastguard Worker 
1738*495ae853SAndroid Build Coastguard Worker     i4_mb_wd = MB_WIDTH >> i4_chroma_flag;
1739*495ae853SAndroid Build Coastguard Worker     i4_mb_ht = MB_HEIGHT >> i4_chroma_flag;
1740*495ae853SAndroid Build Coastguard Worker 
1741*495ae853SAndroid Build Coastguard Worker     ps_x_pos_phase = ps_map_ctxt->ps_x_pos_phase;
1742*495ae853SAndroid Build Coastguard Worker     ps_y_pos_phase = ps_map_ctxt->ps_y_pos_phase;
1743*495ae853SAndroid Build Coastguard Worker     i4_temp_array_ht = i4_mb_ht;
1744*495ae853SAndroid Build Coastguard Worker     i4_frm_mb_y = u2_mb_y * i4_mb_ht;
1745*495ae853SAndroid Build Coastguard Worker     i4_frm_mb_x = u2_mb_x * i4_mb_wd;
1746*495ae853SAndroid Build Coastguard Worker 
1747*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1748*495ae853SAndroid Build Coastguard Worker     /* Loop for interpolation                                                */
1749*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1750*495ae853SAndroid Build Coastguard Worker     for(i4_y = 0; i4_y < (i4_temp_array_ht); i4_y++)
1751*495ae853SAndroid Build Coastguard Worker     {
1752*495ae853SAndroid Build Coastguard Worker         for(i4_x = 0; i4_x < (i4_mb_wd); i4_x++)
1753*495ae853SAndroid Build Coastguard Worker         {
1754*495ae853SAndroid Build Coastguard Worker             WORD32 i4_i;
1755*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_ref;
1756*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_phase;
1757*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_ref;
1758*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_phase;
1759*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_ref_round;
1760*495ae853SAndroid Build Coastguard Worker             WORD16 *pi2_out_curr;
1761*495ae853SAndroid Build Coastguard Worker             WORD32 ai4_temp_pred[2] = {0};
1762*495ae853SAndroid Build Coastguard Worker             UWORD8 *pu1_ref_y_ptr_incr_temp;
1763*495ae853SAndroid Build Coastguard Worker             WORD32 *pi4_temp_pred;
1764*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_incr_y;
1765*495ae853SAndroid Build Coastguard Worker             WORD16 i2_res;
1766*495ae853SAndroid Build Coastguard Worker 
1767*495ae853SAndroid Build Coastguard Worker             /* derive the current output pointer */
1768*495ae853SAndroid Build Coastguard Worker             pi2_out_curr = pi2_out + (i4_x << i4_chroma_flag) + (i4_y * i4_out_stride);
1769*495ae853SAndroid Build Coastguard Worker 
1770*495ae853SAndroid Build Coastguard Worker             /* -------------------------------------------------------------- */
1771*495ae853SAndroid Build Coastguard Worker             /* Finding the offset                                             */
1772*495ae853SAndroid Build Coastguard Worker             /* -------------------------------------------------------------- */
1773*495ae853SAndroid Build Coastguard Worker             i4_y_ref = ps_y_pos_phase[i4_y + i4_frm_mb_y].i2_ref_pos;
1774*495ae853SAndroid Build Coastguard Worker             i4_y_phase = ps_y_pos_phase[i4_y + i4_frm_mb_y].i2_phase;
1775*495ae853SAndroid Build Coastguard Worker             i4_x_ref = ps_x_pos_phase[i4_x + i4_frm_mb_x].i2_ref_pos;
1776*495ae853SAndroid Build Coastguard Worker             i4_x_phase = ps_x_pos_phase[i4_x + i4_frm_mb_x].i2_phase;
1777*495ae853SAndroid Build Coastguard Worker 
1778*495ae853SAndroid Build Coastguard Worker             /* horizontal processing*/
1779*495ae853SAndroid Build Coastguard Worker             for(i4_i = 0; i4_i < 2; i4_i++)
1780*495ae853SAndroid Build Coastguard Worker             {
1781*495ae853SAndroid Build Coastguard Worker                 UWORD8 *pu1_ref_x_ptr_incr_temp;
1782*495ae853SAndroid Build Coastguard Worker                 UWORD8 u1_incr;
1783*495ae853SAndroid Build Coastguard Worker                 WORD16 *pi2_ref_array_1, *pi2_ref_array_2;
1784*495ae853SAndroid Build Coastguard Worker 
1785*495ae853SAndroid Build Coastguard Worker                 /* derive appropriate pointers */
1786*495ae853SAndroid Build Coastguard Worker                 pu1_ref_x_ptr_incr_temp = pu1_ref_x_ptr_incr + i4_x_ref;
1787*495ae853SAndroid Build Coastguard Worker                 pu1_ref_x_ptr_incr_temp += ((i4_y_ref + i4_i) * i4_refarray_wd);
1788*495ae853SAndroid Build Coastguard Worker                 u1_incr = *pu1_ref_x_ptr_incr_temp;
1789*495ae853SAndroid Build Coastguard Worker                 pi2_ref_array_1 = pi2_ref_array + i4_x_ref;
1790*495ae853SAndroid Build Coastguard Worker                 pi2_ref_array_1 += ((i4_y_ref + i4_i) * i4_refarray_wd);
1791*495ae853SAndroid Build Coastguard Worker 
1792*495ae853SAndroid Build Coastguard Worker                 if(!u1_incr)
1793*495ae853SAndroid Build Coastguard Worker                 {
1794*495ae853SAndroid Build Coastguard Worker                     pi2_ref_array_1 += (i4_x_phase >> 3);
1795*495ae853SAndroid Build Coastguard Worker                 }
1796*495ae853SAndroid Build Coastguard Worker 
1797*495ae853SAndroid Build Coastguard Worker                 pi2_ref_array_2 = pi2_ref_array_1 + u1_incr;
1798*495ae853SAndroid Build Coastguard Worker                 ai4_temp_pred[i4_i] =
1799*495ae853SAndroid Build Coastguard Worker                     (16 - i4_x_phase) * (*pi2_ref_array_1) + i4_x_phase * (*pi2_ref_array_2);
1800*495ae853SAndroid Build Coastguard Worker             }
1801*495ae853SAndroid Build Coastguard Worker 
1802*495ae853SAndroid Build Coastguard Worker             /* vertical processing */
1803*495ae853SAndroid Build Coastguard Worker             i4_x_ref_round = (i4_x_ref + (i4_x_phase >> 3));
1804*495ae853SAndroid Build Coastguard Worker             pu1_ref_y_ptr_incr_temp =
1805*495ae853SAndroid Build Coastguard Worker                 pu1_ref_y_ptr_incr + i4_x_ref_round + (i4_y_ref * i4_refarray_wd);
1806*495ae853SAndroid Build Coastguard Worker             u1_incr_y = *pu1_ref_y_ptr_incr_temp;
1807*495ae853SAndroid Build Coastguard Worker 
1808*495ae853SAndroid Build Coastguard Worker             pi4_temp_pred = &ai4_temp_pred[0];
1809*495ae853SAndroid Build Coastguard Worker             if(!u1_incr_y)
1810*495ae853SAndroid Build Coastguard Worker             {
1811*495ae853SAndroid Build Coastguard Worker                 pi4_temp_pred += (i4_y_phase >> 3);
1812*495ae853SAndroid Build Coastguard Worker             }
1813*495ae853SAndroid Build Coastguard Worker 
1814*495ae853SAndroid Build Coastguard Worker             i2_res = (((16 - i4_y_phase) * pi4_temp_pred[0] +
1815*495ae853SAndroid Build Coastguard Worker                        i4_y_phase * pi4_temp_pred[u1_incr_y] + 128) >>
1816*495ae853SAndroid Build Coastguard Worker                       8);
1817*495ae853SAndroid Build Coastguard Worker 
1818*495ae853SAndroid Build Coastguard Worker             /* store back the final residual */
1819*495ae853SAndroid Build Coastguard Worker             *pi2_out_curr = i2_res;
1820*495ae853SAndroid Build Coastguard Worker         } /* end of loop over width */
1821*495ae853SAndroid Build Coastguard Worker     }     /* end of loop over height */
1822*495ae853SAndroid Build Coastguard Worker 
1823*495ae853SAndroid Build Coastguard Worker     return;
1824*495ae853SAndroid Build Coastguard Worker } /* End of Interpolation Function */
1825*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1826*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1827*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_residual_samp_mb                                    */
1828*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1829*495ae853SAndroid Build Coastguard Worker /*  Description   : MB level function whcih perform the residual resampling  */
1830*495ae853SAndroid Build Coastguard Worker /*                  of data of an MB (luma and chroma insclusive)            */
1831*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1832*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_residual_samp_ctxt : residual sampling context        */
1833*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_luma : reference layer luma data buffer desc      */
1834*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_chroma : reference layer chroma data buffer desc  */
1835*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_luma_bitmap : ref layer luma bit map buffer desc  */
1836*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_chroma_bitmap : ref layer chroma bit map buff des */
1837*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_mb_mode : ref layer mb mode map buff desc         */
1838*495ae853SAndroid Build Coastguard Worker /*                  ps_out_luma : current layer out luma buffer desc         */
1839*495ae853SAndroid Build Coastguard Worker /*                  ps_out_chroma : current layer out chroma buffer desc     */
1840*495ae853SAndroid Build Coastguard Worker /*                  ps_mb_coord : current mb coorinate                       */
1841*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1842*495ae853SAndroid Build Coastguard Worker /*  Processing    : it calls the reference layer construction followed by    */
1843*495ae853SAndroid Build Coastguard Worker /*                   interplaotion function for luma and cb and cr           */
1844*495ae853SAndroid Build Coastguard Worker /*  Outputs       : inter resampled data of current MB                       */
1845*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1846*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1847*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1848*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1849*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1850*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1851*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1852*495ae853SAndroid Build Coastguard Worker /*         26 06 2021   vijayakumar          creation                        */
1853*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1854*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_residual_samp_mb(void * pv_residual_samp_ctxt,mem_element_t * ps_ref_luma,mem_element_t * ps_ref_chroma,mem_element_t * ps_ref_mb_mode,mem_element_t * ps_out_luma,mem_element_t * ps_out_chroma,UWORD16 u2_mb_x,UWORD16 u2_mb_y)1855*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_residual_samp_mb(void *pv_residual_samp_ctxt, mem_element_t *ps_ref_luma,
1856*495ae853SAndroid Build Coastguard Worker                               mem_element_t *ps_ref_chroma, mem_element_t *ps_ref_mb_mode,
1857*495ae853SAndroid Build Coastguard Worker                               mem_element_t *ps_out_luma, mem_element_t *ps_out_chroma,
1858*495ae853SAndroid Build Coastguard Worker                               UWORD16 u2_mb_x, UWORD16 u2_mb_y)
1859*495ae853SAndroid Build Coastguard Worker {
1860*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1861*495ae853SAndroid Build Coastguard Worker     /* I/O buffer params                                                     */
1862*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1863*495ae853SAndroid Build Coastguard Worker     residual_sampling_ctxt_t *ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt;
1864*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_inp;
1865*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_out;
1866*495ae853SAndroid Build Coastguard Worker     WORD32 i4_inp_stride;
1867*495ae853SAndroid Build Coastguard Worker     WORD32 i4_out_stride;
1868*495ae853SAndroid Build Coastguard Worker     WORD32 i4_refarray_wd;
1869*495ae853SAndroid Build Coastguard Worker     mb_coord_t s_mb_coord = {0};
1870*495ae853SAndroid Build Coastguard Worker     WORD32 ret;
1871*495ae853SAndroid Build Coastguard Worker     s_mb_coord.u2_mb_x = u2_mb_x;
1872*495ae853SAndroid Build Coastguard Worker     s_mb_coord.u2_mb_y = u2_mb_y;
1873*495ae853SAndroid Build Coastguard Worker 
1874*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1875*495ae853SAndroid Build Coastguard Worker     /* LUMA PROCESSING                                                        */
1876*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1877*495ae853SAndroid Build Coastguard Worker     pi2_inp = (WORD16 *) ps_ref_luma->pv_buffer;
1878*495ae853SAndroid Build Coastguard Worker     pi2_out = (WORD16 *) ps_out_luma->pv_buffer;
1879*495ae853SAndroid Build Coastguard Worker     i4_inp_stride = ps_ref_luma->i4_num_element_stride;
1880*495ae853SAndroid Build Coastguard Worker     i4_out_stride = ps_out_luma->i4_num_element_stride;
1881*495ae853SAndroid Build Coastguard Worker 
1882*495ae853SAndroid Build Coastguard Worker     /* ------- Constructing refSampleArray ----------------------- */
1883*495ae853SAndroid Build Coastguard Worker     ret = isvcd_residual_reflayer_const(pv_residual_samp_ctxt, pi2_inp, i4_inp_stride,
1884*495ae853SAndroid Build Coastguard Worker                                         ps_ref_mb_mode, &i4_refarray_wd, &s_mb_coord, 0);
1885*495ae853SAndroid Build Coastguard Worker 
1886*495ae853SAndroid Build Coastguard Worker     if(ret != OK) return ret;
1887*495ae853SAndroid Build Coastguard Worker     /* ---- Interpolation process for Residual prediction     ------ */
1888*495ae853SAndroid Build Coastguard Worker     ps_ctxt->pf_interpolate_residual(pv_residual_samp_ctxt, pi2_out, i4_out_stride, i4_refarray_wd,
1889*495ae853SAndroid Build Coastguard Worker                                      s_mb_coord.u2_mb_x, s_mb_coord.u2_mb_y, 0);
1890*495ae853SAndroid Build Coastguard Worker 
1891*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1892*495ae853SAndroid Build Coastguard Worker     /* CHROMA PROCESSING                                                       */
1893*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1894*495ae853SAndroid Build Coastguard Worker     /* CB */
1895*495ae853SAndroid Build Coastguard Worker     pi2_inp = (WORD16 *) ps_ref_chroma->pv_buffer;
1896*495ae853SAndroid Build Coastguard Worker     pi2_out = (WORD16 *) ps_out_chroma->pv_buffer;
1897*495ae853SAndroid Build Coastguard Worker     i4_inp_stride = ps_ref_chroma->i4_num_element_stride;
1898*495ae853SAndroid Build Coastguard Worker     i4_out_stride = ps_out_chroma->i4_num_element_stride;
1899*495ae853SAndroid Build Coastguard Worker 
1900*495ae853SAndroid Build Coastguard Worker     /* ------- Constructing refSampleArray ----------------------- */
1901*495ae853SAndroid Build Coastguard Worker     ret = isvcd_residual_reflayer_const(pv_residual_samp_ctxt, pi2_inp, i4_inp_stride,
1902*495ae853SAndroid Build Coastguard Worker                                         ps_ref_mb_mode, &i4_refarray_wd, &s_mb_coord, 1);
1903*495ae853SAndroid Build Coastguard Worker 
1904*495ae853SAndroid Build Coastguard Worker     if(ret != OK) return ret;
1905*495ae853SAndroid Build Coastguard Worker     /* ---- Interpolation process for Residual prediction     ------ */
1906*495ae853SAndroid Build Coastguard Worker     ps_ctxt->pf_interpolate_residual(pv_residual_samp_ctxt, pi2_out, i4_out_stride, i4_refarray_wd,
1907*495ae853SAndroid Build Coastguard Worker                                      s_mb_coord.u2_mb_x, s_mb_coord.u2_mb_y, 1);
1908*495ae853SAndroid Build Coastguard Worker 
1909*495ae853SAndroid Build Coastguard Worker     /* CR */
1910*495ae853SAndroid Build Coastguard Worker     pi2_inp += 1;
1911*495ae853SAndroid Build Coastguard Worker     pi2_out += 1;
1912*495ae853SAndroid Build Coastguard Worker 
1913*495ae853SAndroid Build Coastguard Worker     /* ------- Constructing refSampleArray ----------------------- */
1914*495ae853SAndroid Build Coastguard Worker     ret = isvcd_residual_reflayer_const(pv_residual_samp_ctxt, pi2_inp, i4_inp_stride,
1915*495ae853SAndroid Build Coastguard Worker                                         ps_ref_mb_mode, &i4_refarray_wd, &s_mb_coord, 1);
1916*495ae853SAndroid Build Coastguard Worker 
1917*495ae853SAndroid Build Coastguard Worker     if(ret != OK) return ret;
1918*495ae853SAndroid Build Coastguard Worker     /* ---- Interpolation process for Residual prediction --------- */
1919*495ae853SAndroid Build Coastguard Worker     ps_ctxt->pf_interpolate_residual(pv_residual_samp_ctxt, pi2_out, i4_out_stride, i4_refarray_wd,
1920*495ae853SAndroid Build Coastguard Worker                                      s_mb_coord.u2_mb_x, s_mb_coord.u2_mb_y, 1);
1921*495ae853SAndroid Build Coastguard Worker     return OK;
1922*495ae853SAndroid Build Coastguard Worker }
1923*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1924*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1925*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_residual_samp_mb_dyadic                             */
1926*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1927*495ae853SAndroid Build Coastguard Worker /*  Description   : MB level function whcih perform the residual resampling  */
1928*495ae853SAndroid Build Coastguard Worker /*                  of data of an MB (luma and chroma insclusive)            */
1929*495ae853SAndroid Build Coastguard Worker /*                  for Dyadic cases                                         */
1930*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_residual_samp_ctxt : residual sampling context        */
1931*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_luma : reference layer luma data buffer desc      */
1932*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_chroma : reference layer chroma data buffer desc  */
1933*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_luma_bitmap : ref layer luma bit map buffer desc  */
1934*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_chroma_bitmap : ref layer chroma bit map buff des */
1935*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_mb_mode : ref layer mb mode map buff desc         */
1936*495ae853SAndroid Build Coastguard Worker /*                  ps_out_luma : current layer out luma buffer desc         */
1937*495ae853SAndroid Build Coastguard Worker /*                  ps_out_chroma : current layer out chroma buffer desc     */
1938*495ae853SAndroid Build Coastguard Worker /*                  ps_mb_coord : current mb coorinate                       */
1939*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1940*495ae853SAndroid Build Coastguard Worker /*  Processing    : it calls the reference layer construction followed by    */
1941*495ae853SAndroid Build Coastguard Worker /*                   interplaotion function for luma and cb and cr           */
1942*495ae853SAndroid Build Coastguard Worker /*  Outputs       : inter resampled data of current MB                       */
1943*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1944*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1945*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1946*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1947*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1948*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1949*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1950*495ae853SAndroid Build Coastguard Worker /*         26 06 2021   vijayakumar          creation                        */
1951*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1952*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_residual_samp_mb_dyadic(void * pv_residual_samp_ctxt,mem_element_t * ps_ref_luma,mem_element_t * ps_ref_chroma,mem_element_t * ps_ref_mb_mode,mem_element_t * ps_out_luma,mem_element_t * ps_out_chroma,UWORD16 u2_mb_x,UWORD16 u2_mb_y)1953*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_residual_samp_mb_dyadic(void *pv_residual_samp_ctxt, mem_element_t *ps_ref_luma,
1954*495ae853SAndroid Build Coastguard Worker                                      mem_element_t *ps_ref_chroma, mem_element_t *ps_ref_mb_mode,
1955*495ae853SAndroid Build Coastguard Worker                                      mem_element_t *ps_out_luma, mem_element_t *ps_out_chroma,
1956*495ae853SAndroid Build Coastguard Worker                                      UWORD16 u2_mb_x, UWORD16 u2_mb_y)
1957*495ae853SAndroid Build Coastguard Worker {
1958*495ae853SAndroid Build Coastguard Worker     residual_sampling_ctxt_t *ps_ctxt;
1959*495ae853SAndroid Build Coastguard Worker     res_lyr_ctxt *ps_lyr_ctxt;
1960*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1961*495ae853SAndroid Build Coastguard Worker     /* I/O buffer params                                                     */
1962*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1963*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_inp;
1964*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_out;
1965*495ae853SAndroid Build Coastguard Worker     WORD32 i4_inp_stride;
1966*495ae853SAndroid Build Coastguard Worker     WORD32 i4_out_stride;
1967*495ae853SAndroid Build Coastguard Worker     WORD32 i4_luma_nnz;
1968*495ae853SAndroid Build Coastguard Worker     WORD32 i4_chroma_nnz;
1969*495ae853SAndroid Build Coastguard Worker     WORD32 i4_tx_size;
1970*495ae853SAndroid Build Coastguard Worker 
1971*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt;
1972*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
1973*495ae853SAndroid Build Coastguard Worker 
1974*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1975*495ae853SAndroid Build Coastguard Worker     /* LUMA PROCESSING                                                        */
1976*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1977*495ae853SAndroid Build Coastguard Worker     pi2_inp = (WORD16 *) ps_ref_luma->pv_buffer;
1978*495ae853SAndroid Build Coastguard Worker     pi2_out = (WORD16 *) ps_out_luma->pv_buffer;
1979*495ae853SAndroid Build Coastguard Worker     i4_inp_stride = ps_ref_luma->i4_num_element_stride;
1980*495ae853SAndroid Build Coastguard Worker     i4_out_stride = ps_out_luma->i4_num_element_stride;
1981*495ae853SAndroid Build Coastguard Worker 
1982*495ae853SAndroid Build Coastguard Worker     {
1983*495ae853SAndroid Build Coastguard Worker         WORD32 i4_offset_x, i4_offset_y;
1984*495ae853SAndroid Build Coastguard Worker         residual_samp_map_ctxt_t *ps_luma_map;
1985*495ae853SAndroid Build Coastguard Worker         ref_mb_map_t *ps_x_off_len_luma;
1986*495ae853SAndroid Build Coastguard Worker         ref_mb_map_t *ps_y_off_len_luma;
1987*495ae853SAndroid Build Coastguard Worker 
1988*495ae853SAndroid Build Coastguard Worker         ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
1989*495ae853SAndroid Build Coastguard Worker         ps_x_off_len_luma = ps_luma_map->ps_x_offset_length;
1990*495ae853SAndroid Build Coastguard Worker         ps_y_off_len_luma = ps_luma_map->ps_y_offset_length;
1991*495ae853SAndroid Build Coastguard Worker 
1992*495ae853SAndroid Build Coastguard Worker         /* get the actual offset for the buffers */
1993*495ae853SAndroid Build Coastguard Worker         i4_offset_x = ps_x_off_len_luma[u2_mb_x].i2_offset;
1994*495ae853SAndroid Build Coastguard Worker         i4_offset_y = ps_y_off_len_luma[u2_mb_y].i2_offset;
1995*495ae853SAndroid Build Coastguard Worker 
1996*495ae853SAndroid Build Coastguard Worker         {
1997*495ae853SAndroid Build Coastguard Worker             inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms;
1998*495ae853SAndroid Build Coastguard Worker             WORD32 i4_mb_x, i4_mb_y;
1999*495ae853SAndroid Build Coastguard Worker             UWORD16 u2_luma_mask = 0x0033;
2000*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_chrm_mask = 0x11;
2001*495ae853SAndroid Build Coastguard Worker             WORD32 i4_luma_rt_sft_amt = 0;
2002*495ae853SAndroid Build Coastguard Worker             WORD32 i4_chrm_rt_sft_amt = 0;
2003*495ae853SAndroid Build Coastguard Worker 
2004*495ae853SAndroid Build Coastguard Worker             i4_mb_x = ((i4_offset_x + 1) >> MB_WIDTH_SHIFT);
2005*495ae853SAndroid Build Coastguard Worker             i4_mb_y = ((i4_offset_y + 1) >> MB_HEIGHT_SHIFT);
2006*495ae853SAndroid Build Coastguard Worker 
2007*495ae853SAndroid Build Coastguard Worker             /* get the location of the byte which has the current mb mode */
2008*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) ps_ref_mb_mode->pv_buffer;
2009*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms += i4_mb_x;
2010*495ae853SAndroid Build Coastguard Worker             ps_inter_lyr_mb_prms += i4_mb_y * ps_ref_mb_mode->i4_num_element_stride;
2011*495ae853SAndroid Build Coastguard Worker 
2012*495ae853SAndroid Build Coastguard Worker             /* get the approp block in base layer in horz direction */
2013*495ae853SAndroid Build Coastguard Worker             if(0 != ((i4_offset_x + 1) & 15))
2014*495ae853SAndroid Build Coastguard Worker             {
2015*495ae853SAndroid Build Coastguard Worker                 u2_luma_mask <<= 2;
2016*495ae853SAndroid Build Coastguard Worker                 i4_luma_rt_sft_amt += 2;
2017*495ae853SAndroid Build Coastguard Worker                 u1_chrm_mask <<= 1;
2018*495ae853SAndroid Build Coastguard Worker                 i4_chrm_rt_sft_amt += 1;
2019*495ae853SAndroid Build Coastguard Worker             }
2020*495ae853SAndroid Build Coastguard Worker             /* get the approp block in base layer in vert direction */
2021*495ae853SAndroid Build Coastguard Worker             if(0 != ((i4_offset_y + 1) & 15))
2022*495ae853SAndroid Build Coastguard Worker             {
2023*495ae853SAndroid Build Coastguard Worker                 u2_luma_mask <<= 8;
2024*495ae853SAndroid Build Coastguard Worker                 i4_luma_rt_sft_amt += 8;
2025*495ae853SAndroid Build Coastguard Worker 
2026*495ae853SAndroid Build Coastguard Worker                 u1_chrm_mask <<= 2;
2027*495ae853SAndroid Build Coastguard Worker                 i4_chrm_rt_sft_amt += 2;
2028*495ae853SAndroid Build Coastguard Worker             }
2029*495ae853SAndroid Build Coastguard Worker 
2030*495ae853SAndroid Build Coastguard Worker             /* extract the nnz and store it */
2031*495ae853SAndroid Build Coastguard Worker             i4_luma_nnz = (ps_inter_lyr_mb_prms->u2_luma_nnz & u2_luma_mask) >> i4_luma_rt_sft_amt;
2032*495ae853SAndroid Build Coastguard Worker             i4_chroma_nnz =
2033*495ae853SAndroid Build Coastguard Worker                 (ps_inter_lyr_mb_prms->u1_chroma_nnz & u1_chrm_mask) >> i4_chrm_rt_sft_amt;
2034*495ae853SAndroid Build Coastguard Worker             i4_tx_size =
2035*495ae853SAndroid Build Coastguard Worker                 (ps_inter_lyr_mb_prms->i1_tx_size < 0) ? 1 : ps_inter_lyr_mb_prms->i1_tx_size;
2036*495ae853SAndroid Build Coastguard Worker         }
2037*495ae853SAndroid Build Coastguard Worker 
2038*495ae853SAndroid Build Coastguard Worker         /* since in dyadic case the window width and height will be 10x10   */
2039*495ae853SAndroid Build Coastguard Worker         /* and the window start offsets will be always 1 column left and    */
2040*495ae853SAndroid Build Coastguard Worker         /* 1 row above the block boundary. so the pointer and the required  */
2041*495ae853SAndroid Build Coastguard Worker         /* positions are appropriately modified                             */
2042*495ae853SAndroid Build Coastguard Worker         if(i4_offset_x >= 0)
2043*495ae853SAndroid Build Coastguard Worker         {
2044*495ae853SAndroid Build Coastguard Worker             pi2_inp++;
2045*495ae853SAndroid Build Coastguard Worker         }
2046*495ae853SAndroid Build Coastguard Worker 
2047*495ae853SAndroid Build Coastguard Worker         if(i4_offset_y >= 0)
2048*495ae853SAndroid Build Coastguard Worker         {
2049*495ae853SAndroid Build Coastguard Worker             pi2_inp += i4_inp_stride;
2050*495ae853SAndroid Build Coastguard Worker         }
2051*495ae853SAndroid Build Coastguard Worker 
2052*495ae853SAndroid Build Coastguard Worker         ps_ctxt->pf_residual_luma_dyadic(pv_residual_samp_ctxt, pi2_inp, i4_inp_stride, pi2_out,
2053*495ae853SAndroid Build Coastguard Worker                                          i4_out_stride, ps_ref_mb_mode, u2_mb_x, u2_mb_y,
2054*495ae853SAndroid Build Coastguard Worker                                          i4_luma_nnz, i4_tx_size);
2055*495ae853SAndroid Build Coastguard Worker     }
2056*495ae853SAndroid Build Coastguard Worker 
2057*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2058*495ae853SAndroid Build Coastguard Worker     /* CHROMA PROCESSING                                                       */
2059*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2060*495ae853SAndroid Build Coastguard Worker     /* CB */
2061*495ae853SAndroid Build Coastguard Worker     pi2_inp = (WORD16 *) ps_ref_chroma->pv_buffer;
2062*495ae853SAndroid Build Coastguard Worker     pi2_out = (WORD16 *) ps_out_chroma->pv_buffer;
2063*495ae853SAndroid Build Coastguard Worker     i4_inp_stride = ps_ref_chroma->i4_num_element_stride;
2064*495ae853SAndroid Build Coastguard Worker     i4_out_stride = ps_out_chroma->i4_num_element_stride;
2065*495ae853SAndroid Build Coastguard Worker 
2066*495ae853SAndroid Build Coastguard Worker     /* choose the appropriate chroma processing routine */
2067*495ae853SAndroid Build Coastguard Worker     if(SVCD_FALSE == ps_lyr_ctxt->i4_chrm_alt_proc)
2068*495ae853SAndroid Build Coastguard Worker     {
2069*495ae853SAndroid Build Coastguard Worker         WORD32 i4_offset_x, i4_offset_y;
2070*495ae853SAndroid Build Coastguard Worker         residual_samp_map_ctxt_t *ps_chroma_map;
2071*495ae853SAndroid Build Coastguard Worker         ref_mb_map_t *ps_x_off_len_chroma;
2072*495ae853SAndroid Build Coastguard Worker         ref_mb_map_t *ps_y_off_len_chroma;
2073*495ae853SAndroid Build Coastguard Worker 
2074*495ae853SAndroid Build Coastguard Worker         ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
2075*495ae853SAndroid Build Coastguard Worker         ps_x_off_len_chroma = ps_chroma_map->ps_x_offset_length;
2076*495ae853SAndroid Build Coastguard Worker         ps_y_off_len_chroma = ps_chroma_map->ps_y_offset_length;
2077*495ae853SAndroid Build Coastguard Worker 
2078*495ae853SAndroid Build Coastguard Worker         /* get the actual offset for the buffers */
2079*495ae853SAndroid Build Coastguard Worker         i4_offset_x = ps_x_off_len_chroma[u2_mb_x].i2_offset;
2080*495ae853SAndroid Build Coastguard Worker         i4_offset_y = ps_y_off_len_chroma[u2_mb_y].i2_offset;
2081*495ae853SAndroid Build Coastguard Worker 
2082*495ae853SAndroid Build Coastguard Worker         /* since in dyadic case the window width and height will be 6x6     */
2083*495ae853SAndroid Build Coastguard Worker         /* and the window start offsets will be always 1 column left and    */
2084*495ae853SAndroid Build Coastguard Worker         /* 1 row above the block boundary. so the pointer and the required  */
2085*495ae853SAndroid Build Coastguard Worker         /* positions are appropriately modified                             */
2086*495ae853SAndroid Build Coastguard Worker         if(i4_offset_x >= 0)
2087*495ae853SAndroid Build Coastguard Worker         {
2088*495ae853SAndroid Build Coastguard Worker             pi2_inp += 2;
2089*495ae853SAndroid Build Coastguard Worker         }
2090*495ae853SAndroid Build Coastguard Worker 
2091*495ae853SAndroid Build Coastguard Worker         if(i4_offset_y >= 0)
2092*495ae853SAndroid Build Coastguard Worker         {
2093*495ae853SAndroid Build Coastguard Worker             pi2_inp += i4_inp_stride;
2094*495ae853SAndroid Build Coastguard Worker         }
2095*495ae853SAndroid Build Coastguard Worker 
2096*495ae853SAndroid Build Coastguard Worker         if(0 != (i4_chroma_nnz & 0x01))
2097*495ae853SAndroid Build Coastguard Worker         {
2098*495ae853SAndroid Build Coastguard Worker             ps_ctxt->pf_residual_chroma_dyadic(pv_residual_samp_ctxt, pi2_inp, i4_inp_stride,
2099*495ae853SAndroid Build Coastguard Worker                                                pi2_out, i4_out_stride);
2100*495ae853SAndroid Build Coastguard Worker         }
2101*495ae853SAndroid Build Coastguard Worker     }
2102*495ae853SAndroid Build Coastguard Worker     else
2103*495ae853SAndroid Build Coastguard Worker     {
2104*495ae853SAndroid Build Coastguard Worker         ps_ctxt->pf_residual_chroma_dyadic_alt(pv_residual_samp_ctxt, u2_mb_x, u2_mb_y,
2105*495ae853SAndroid Build Coastguard Worker                                                ps_ref_mb_mode, pi2_inp, i4_inp_stride, pi2_out,
2106*495ae853SAndroid Build Coastguard Worker                                                i4_out_stride, SVCD_FALSE);
2107*495ae853SAndroid Build Coastguard Worker     }
2108*495ae853SAndroid Build Coastguard Worker 
2109*495ae853SAndroid Build Coastguard Worker     /* CR */
2110*495ae853SAndroid Build Coastguard Worker     pi2_inp += 1;
2111*495ae853SAndroid Build Coastguard Worker     pi2_out += 1;
2112*495ae853SAndroid Build Coastguard Worker 
2113*495ae853SAndroid Build Coastguard Worker     if(SVCD_FALSE == ps_lyr_ctxt->i4_chrm_alt_proc)
2114*495ae853SAndroid Build Coastguard Worker     {
2115*495ae853SAndroid Build Coastguard Worker         if(0 != (i4_chroma_nnz & 0x10))
2116*495ae853SAndroid Build Coastguard Worker         {
2117*495ae853SAndroid Build Coastguard Worker             ps_ctxt->pf_residual_chroma_dyadic(pv_residual_samp_ctxt, pi2_inp, i4_inp_stride,
2118*495ae853SAndroid Build Coastguard Worker                                                pi2_out, i4_out_stride);
2119*495ae853SAndroid Build Coastguard Worker         }
2120*495ae853SAndroid Build Coastguard Worker     }
2121*495ae853SAndroid Build Coastguard Worker     else
2122*495ae853SAndroid Build Coastguard Worker     {
2123*495ae853SAndroid Build Coastguard Worker         ps_ctxt->pf_residual_chroma_dyadic_alt(pv_residual_samp_ctxt, u2_mb_x, u2_mb_y,
2124*495ae853SAndroid Build Coastguard Worker                                                ps_ref_mb_mode, pi2_inp, i4_inp_stride, pi2_out,
2125*495ae853SAndroid Build Coastguard Worker                                                i4_out_stride, SVCD_TRUE);
2126*495ae853SAndroid Build Coastguard Worker     }
2127*495ae853SAndroid Build Coastguard Worker     return OK;
2128*495ae853SAndroid Build Coastguard Worker }
2129*495ae853SAndroid Build Coastguard Worker 
2130*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2131*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2132*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_residual_samp_populate_list                         */
2133*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2134*495ae853SAndroid Build Coastguard Worker /*  Description   : This is a seq or frame level init function which fills   */
2135*495ae853SAndroid Build Coastguard Worker /*                  all offsets, projected locations arrays based on         */
2136*495ae853SAndroid Build Coastguard Worker /*                  the two resolutions  and cropping parameters             */
2137*495ae853SAndroid Build Coastguard Worker /*  Inputs        : refer to doxygen comments below                          */
2138*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
2139*495ae853SAndroid Build Coastguard Worker /*  Processing    : it projects the locations and computes the values        */
2140*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2141*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
2142*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
2143*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2144*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
2145*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2146*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
2147*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2148*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
2149*495ae853SAndroid Build Coastguard Worker /*         06 07 2021   vijayakumar          creation                        */
2150*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2151*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_residual_samp_populate_list(residual_samp_map_ctxt_t * ps_map_ctxt,dec_seq_params_t * ps_sps,dec_svc_seq_params_t * ps_subset_sps,res_prms_t * ps_curr_res_prms,res_prms_t * ps_ref_res_prms,WORD32 i4_chroma_flag)2152*495ae853SAndroid Build Coastguard Worker void isvcd_residual_samp_populate_list(residual_samp_map_ctxt_t *ps_map_ctxt,
2153*495ae853SAndroid Build Coastguard Worker                                        dec_seq_params_t *ps_sps,
2154*495ae853SAndroid Build Coastguard Worker                                        dec_svc_seq_params_t *ps_subset_sps,
2155*495ae853SAndroid Build Coastguard Worker                                        res_prms_t *ps_curr_res_prms, res_prms_t *ps_ref_res_prms,
2156*495ae853SAndroid Build Coastguard Worker                                        WORD32 i4_chroma_flag)
2157*495ae853SAndroid Build Coastguard Worker {
2158*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2159*495ae853SAndroid Build Coastguard Worker     /* Local variables required for finding the mapping between the layers     */
2160*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2161*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_shift_x;
2162*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_shift_y;
2163*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_scale_x;
2164*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_scale_y;
2165*495ae853SAndroid Build Coastguard Worker     WORD32 i4_offset_x;
2166*495ae853SAndroid Build Coastguard Worker     WORD32 i4_offset_y;
2167*495ae853SAndroid Build Coastguard Worker     WORD32 i4_add_x;
2168*495ae853SAndroid Build Coastguard Worker     WORD32 i4_add_y;
2169*495ae853SAndroid Build Coastguard Worker     WORD32 i4_delta_x;
2170*495ae853SAndroid Build Coastguard Worker     WORD32 i4_delta_y;
2171*495ae853SAndroid Build Coastguard Worker     WORD32 i4_refphase_x;
2172*495ae853SAndroid Build Coastguard Worker     WORD32 i4_refphase_y;
2173*495ae853SAndroid Build Coastguard Worker     WORD32 i4_phase_x;
2174*495ae853SAndroid Build Coastguard Worker     WORD32 i4_phase_y;
2175*495ae853SAndroid Build Coastguard Worker     WORD32 i4_sub_wd;
2176*495ae853SAndroid Build Coastguard Worker     WORD32 i4_sub_ht;
2177*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_wd;
2178*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_ht;
2179*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2180*495ae853SAndroid Build Coastguard Worker     /* Local Pointer Declaration for arrays in Mapping context                 */
2181*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2182*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t *ps_x_off_len;
2183*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t *ps_y_off_len;
2184*495ae853SAndroid Build Coastguard Worker     UWORD32 i4_ref_wd;
2185*495ae853SAndroid Build Coastguard Worker     UWORD32 i4_ref_ht;
2186*495ae853SAndroid Build Coastguard Worker     UWORD32 i4_scaled_wd;
2187*495ae853SAndroid Build Coastguard Worker     UWORD32 i4_scaled_ht;
2188*495ae853SAndroid Build Coastguard Worker     WORD32 i4_curr_lyr_width;
2189*495ae853SAndroid Build Coastguard Worker     WORD32 i4_curr_lyr_height;
2190*495ae853SAndroid Build Coastguard Worker 
2191*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2192*495ae853SAndroid Build Coastguard Worker     /* Local Flag Declaration                                                 */
2193*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2194*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_layer_field_pic_flag;
2195*495ae853SAndroid Build Coastguard Worker     WORD32 i4_field_pic_flag;
2196*495ae853SAndroid Build Coastguard Worker     WORD32 i4_frame_mbs_only_flag;
2197*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_layer_frame_Mbs_only_flag;
2198*495ae853SAndroid Build Coastguard Worker     WORD32 i4_field_Mb_flag;
2199*495ae853SAndroid Build Coastguard Worker     WORD32 i4_bot_field_flag;
2200*495ae853SAndroid Build Coastguard Worker 
2201*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2202*495ae853SAndroid Build Coastguard Worker     /* Cropping Parameters Declaration                                         */
2203*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2204*495ae853SAndroid Build Coastguard Worker     WORD32 i4_scaled_ref_layer_left_offset;
2205*495ae853SAndroid Build Coastguard Worker     WORD32 i4_scaled_ref_layer_top_offset;
2206*495ae853SAndroid Build Coastguard Worker 
2207*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2208*495ae853SAndroid Build Coastguard Worker     /* Hardcoding flag information    (assuming no field support) */
2209*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2210*495ae853SAndroid Build Coastguard Worker     i4_ref_layer_field_pic_flag = SVCD_FALSE;
2211*495ae853SAndroid Build Coastguard Worker     i4_field_pic_flag = SVCD_FALSE;
2212*495ae853SAndroid Build Coastguard Worker     i4_frame_mbs_only_flag = SVCD_TRUE;
2213*495ae853SAndroid Build Coastguard Worker     i4_field_Mb_flag = SVCD_FALSE;
2214*495ae853SAndroid Build Coastguard Worker     i4_bot_field_flag = SVCD_FALSE;
2215*495ae853SAndroid Build Coastguard Worker     i4_ref_layer_frame_Mbs_only_flag = SVCD_TRUE;
2216*495ae853SAndroid Build Coastguard Worker 
2217*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2218*495ae853SAndroid Build Coastguard Worker     /* Pointer and Paramater are intialized    - Chroma and Luma */
2219*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2220*495ae853SAndroid Build Coastguard Worker     {
2221*495ae853SAndroid Build Coastguard Worker         WORD32 i4_base_width;
2222*495ae853SAndroid Build Coastguard Worker         WORD32 i4_base_height;
2223*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ref_layer_chroma_phase_x_plus1_flag;
2224*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ref_layer_chroma_phase_y_plus1;
2225*495ae853SAndroid Build Coastguard Worker         WORD32 i4_chroma_phase_x_plus1_flag;
2226*495ae853SAndroid Build Coastguard Worker         WORD32 i4_chroma_phase_y_plus1;
2227*495ae853SAndroid Build Coastguard Worker 
2228*495ae853SAndroid Build Coastguard Worker         /* ------------------------------------------------------------- */
2229*495ae853SAndroid Build Coastguard Worker         /* HARD CODED FOR 420                                             */
2230*495ae853SAndroid Build Coastguard Worker         /* ------------------------------------------------------------- */
2231*495ae853SAndroid Build Coastguard Worker         WORD32 i4_sub_wd_chroma = 2;
2232*495ae853SAndroid Build Coastguard Worker         WORD32 i4_sub_ht_chroma = 2;
2233*495ae853SAndroid Build Coastguard Worker 
2234*495ae853SAndroid Build Coastguard Worker         i4_base_width = ps_ref_res_prms->i4_res_width;
2235*495ae853SAndroid Build Coastguard Worker         i4_base_height = ps_ref_res_prms->i4_res_height;
2236*495ae853SAndroid Build Coastguard Worker 
2237*495ae853SAndroid Build Coastguard Worker         i4_ref_layer_chroma_phase_x_plus1_flag =
2238*495ae853SAndroid Build Coastguard Worker             ps_curr_res_prms->i1_ref_lyr_chroma_phase_x_plus1_flag;
2239*495ae853SAndroid Build Coastguard Worker         i4_ref_layer_chroma_phase_y_plus1 = ps_curr_res_prms->i1_ref_lyr_chroma_phase_y_plus1;
2240*495ae853SAndroid Build Coastguard Worker         i4_chroma_phase_x_plus1_flag =
2241*495ae853SAndroid Build Coastguard Worker             ps_subset_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_x_plus1_flag;
2242*495ae853SAndroid Build Coastguard Worker         i4_chroma_phase_y_plus1 =
2243*495ae853SAndroid Build Coastguard Worker             ps_subset_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_y_plus1;
2244*495ae853SAndroid Build Coastguard Worker         i4_scaled_ref_layer_left_offset = ps_curr_res_prms->s_ref_lyr_scaled_offset.i2_left;
2245*495ae853SAndroid Build Coastguard Worker         i4_scaled_ref_layer_top_offset = ps_curr_res_prms->s_ref_lyr_scaled_offset.i2_top;
2246*495ae853SAndroid Build Coastguard Worker 
2247*495ae853SAndroid Build Coastguard Worker         /* ----------------------------------------------------------------- */
2248*495ae853SAndroid Build Coastguard Worker         /* Computing Effective Frame Dimensions                                 */
2249*495ae853SAndroid Build Coastguard Worker         /* ------------------------------------------------------------------*/
2250*495ae853SAndroid Build Coastguard Worker         i4_ref_wd = (i4_base_width >> i4_chroma_flag);
2251*495ae853SAndroid Build Coastguard Worker         i4_ref_ht = (i4_base_height >> i4_chroma_flag) * (1 + i4_ref_layer_field_pic_flag);
2252*495ae853SAndroid Build Coastguard Worker         i4_scaled_wd = ps_curr_res_prms->u2_scaled_ref_width;
2253*495ae853SAndroid Build Coastguard Worker         i4_scaled_ht = ps_curr_res_prms->u2_scaled_ref_height;
2254*495ae853SAndroid Build Coastguard Worker         i4_scaled_wd = (i4_scaled_wd >> i4_chroma_flag);
2255*495ae853SAndroid Build Coastguard Worker         i4_scaled_ht = (i4_scaled_ht >> i4_chroma_flag) * (1 + i4_field_pic_flag);
2256*495ae853SAndroid Build Coastguard Worker 
2257*495ae853SAndroid Build Coastguard Worker         if(1 == i4_chroma_flag)
2258*495ae853SAndroid Build Coastguard Worker         {
2259*495ae853SAndroid Build Coastguard Worker             i4_refphase_x = i4_ref_layer_chroma_phase_x_plus1_flag - 1;
2260*495ae853SAndroid Build Coastguard Worker             i4_refphase_y = i4_ref_layer_chroma_phase_y_plus1 - 1;
2261*495ae853SAndroid Build Coastguard Worker             i4_phase_x = i4_chroma_phase_x_plus1_flag - 1;
2262*495ae853SAndroid Build Coastguard Worker             i4_phase_y = i4_chroma_phase_y_plus1 - 1;
2263*495ae853SAndroid Build Coastguard Worker             i4_sub_wd = i4_sub_wd_chroma;
2264*495ae853SAndroid Build Coastguard Worker             i4_sub_ht = i4_sub_ht_chroma;
2265*495ae853SAndroid Build Coastguard Worker             i4_mb_wd = MB_WIDTH >> 1;
2266*495ae853SAndroid Build Coastguard Worker             i4_mb_ht = MB_HEIGHT >> 1;
2267*495ae853SAndroid Build Coastguard Worker         }
2268*495ae853SAndroid Build Coastguard Worker         else
2269*495ae853SAndroid Build Coastguard Worker         {
2270*495ae853SAndroid Build Coastguard Worker             i4_refphase_x = 0;
2271*495ae853SAndroid Build Coastguard Worker             i4_refphase_y = 0;
2272*495ae853SAndroid Build Coastguard Worker             i4_phase_x = 0;
2273*495ae853SAndroid Build Coastguard Worker             i4_phase_y = 0;
2274*495ae853SAndroid Build Coastguard Worker             i4_sub_wd = 1;
2275*495ae853SAndroid Build Coastguard Worker             i4_sub_ht = 1;
2276*495ae853SAndroid Build Coastguard Worker             i4_mb_wd = MB_WIDTH;
2277*495ae853SAndroid Build Coastguard Worker             i4_mb_ht = MB_HEIGHT;
2278*495ae853SAndroid Build Coastguard Worker         }
2279*495ae853SAndroid Build Coastguard Worker     }
2280*495ae853SAndroid Build Coastguard Worker 
2281*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2282*495ae853SAndroid Build Coastguard Worker     /* Derive shift x and y based on level idd                               */
2283*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2284*495ae853SAndroid Build Coastguard Worker     if(ps_sps->u1_level_idc <= 30)
2285*495ae853SAndroid Build Coastguard Worker     {
2286*495ae853SAndroid Build Coastguard Worker         u4_shift_x = 16;
2287*495ae853SAndroid Build Coastguard Worker         u4_shift_y = 16;
2288*495ae853SAndroid Build Coastguard Worker     }
2289*495ae853SAndroid Build Coastguard Worker     else
2290*495ae853SAndroid Build Coastguard Worker     {
2291*495ae853SAndroid Build Coastguard Worker         u4_shift_x = 31 - isvcd_get_ceil_log2(i4_ref_wd);
2292*495ae853SAndroid Build Coastguard Worker         u4_shift_y = 31 - isvcd_get_ceil_log2(i4_ref_ht);
2293*495ae853SAndroid Build Coastguard Worker     }
2294*495ae853SAndroid Build Coastguard Worker 
2295*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2296*495ae853SAndroid Build Coastguard Worker     /* The following condition is not true in our case for time being         */
2297*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2298*495ae853SAndroid Build Coastguard Worker     if((SVCD_FALSE == i4_frame_mbs_only_flag) || (SVCD_FALSE == i4_ref_layer_frame_Mbs_only_flag))
2299*495ae853SAndroid Build Coastguard Worker     {
2300*495ae853SAndroid Build Coastguard Worker         i4_phase_y = i4_phase_y + 4 * i4_bot_field_flag;
2301*495ae853SAndroid Build Coastguard Worker 
2302*495ae853SAndroid Build Coastguard Worker         if(1 == i4_ref_layer_frame_Mbs_only_flag)
2303*495ae853SAndroid Build Coastguard Worker             i4_refphase_y = (2 * i4_refphase_y) + 2;
2304*495ae853SAndroid Build Coastguard Worker         else
2305*495ae853SAndroid Build Coastguard Worker             i4_refphase_y = i4_refphase_y + (4 * i4_bot_field_flag);
2306*495ae853SAndroid Build Coastguard Worker     }
2307*495ae853SAndroid Build Coastguard Worker 
2308*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2309*495ae853SAndroid Build Coastguard Worker     /* Dx and Dy Computation - Ratio of the base and enhance layer width     */
2310*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2311*495ae853SAndroid Build Coastguard Worker     u4_scale_x = ((i4_ref_wd << u4_shift_x) + (i4_scaled_wd >> 1)) / (i4_scaled_wd);
2312*495ae853SAndroid Build Coastguard Worker 
2313*495ae853SAndroid Build Coastguard Worker     u4_scale_y = ((i4_ref_ht << u4_shift_y) + (i4_scaled_ht >> 1)) / (i4_scaled_ht);
2314*495ae853SAndroid Build Coastguard Worker 
2315*495ae853SAndroid Build Coastguard Worker     i4_offset_x = i4_scaled_ref_layer_left_offset / i4_sub_wd;
2316*495ae853SAndroid Build Coastguard Worker     i4_add_x = (((i4_ref_wd * (2 + i4_phase_x)) << (u4_shift_x - 2)) + (i4_scaled_wd >> 1)) /
2317*495ae853SAndroid Build Coastguard Worker                    i4_scaled_wd +
2318*495ae853SAndroid Build Coastguard Worker                (1 << (u4_shift_x - 5));
2319*495ae853SAndroid Build Coastguard Worker     i4_delta_x = 4 * (2 + i4_refphase_x);
2320*495ae853SAndroid Build Coastguard Worker 
2321*495ae853SAndroid Build Coastguard Worker     if((SVCD_TRUE == i4_frame_mbs_only_flag) && (SVCD_TRUE == i4_ref_layer_frame_Mbs_only_flag))
2322*495ae853SAndroid Build Coastguard Worker     {
2323*495ae853SAndroid Build Coastguard Worker         i4_offset_y = i4_scaled_ref_layer_top_offset / i4_sub_ht;
2324*495ae853SAndroid Build Coastguard Worker         i4_add_y = (((i4_ref_ht * (2 + i4_phase_y)) << (u4_shift_y - 2)) + (i4_scaled_ht >> 1)) /
2325*495ae853SAndroid Build Coastguard Worker                        i4_scaled_ht +
2326*495ae853SAndroid Build Coastguard Worker                    (1 << (u4_shift_y - 5));
2327*495ae853SAndroid Build Coastguard Worker         i4_delta_y = 4 * (2 + i4_refphase_y);
2328*495ae853SAndroid Build Coastguard Worker     }
2329*495ae853SAndroid Build Coastguard Worker     else
2330*495ae853SAndroid Build Coastguard Worker     {
2331*495ae853SAndroid Build Coastguard Worker         i4_offset_y = i4_scaled_ref_layer_top_offset / (2 * i4_sub_ht);
2332*495ae853SAndroid Build Coastguard Worker         i4_add_y = (((i4_ref_ht * (2 + i4_phase_y)) << (u4_shift_y - 3)) + (i4_scaled_ht >> 1)) /
2333*495ae853SAndroid Build Coastguard Worker                        i4_scaled_ht +
2334*495ae853SAndroid Build Coastguard Worker                    (1 << (u4_shift_y - 5));
2335*495ae853SAndroid Build Coastguard Worker         i4_delta_y = 2 * (2 + i4_refphase_y);
2336*495ae853SAndroid Build Coastguard Worker     }
2337*495ae853SAndroid Build Coastguard Worker 
2338*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2339*495ae853SAndroid Build Coastguard Worker     /* Intializing Local Pointers    - Chroma and Luma                       */
2340*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2341*495ae853SAndroid Build Coastguard Worker     ps_x_off_len = ps_map_ctxt->ps_x_offset_length;
2342*495ae853SAndroid Build Coastguard Worker     ps_y_off_len = ps_map_ctxt->ps_y_offset_length;
2343*495ae853SAndroid Build Coastguard Worker     i4_curr_lyr_width = ps_curr_res_prms->i4_res_width >> i4_chroma_flag;
2344*495ae853SAndroid Build Coastguard Worker     i4_curr_lyr_height = ps_curr_res_prms->i4_res_height >> i4_chroma_flag;
2345*495ae853SAndroid Build Coastguard Worker 
2346*495ae853SAndroid Build Coastguard Worker     {
2347*495ae853SAndroid Build Coastguard Worker         WORD32 i4_i, i4_j;
2348*495ae853SAndroid Build Coastguard Worker 
2349*495ae853SAndroid Build Coastguard Worker         /* ----------------------------------------------------------------- */
2350*495ae853SAndroid Build Coastguard Worker         /* Computation of offsetX refArrayW Xmin and Xmax Lists               */
2351*495ae853SAndroid Build Coastguard Worker         /* ----------------------------------------------------------------- */
2352*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < i4_curr_lyr_width; i4_i = i4_i + i4_mb_wd)
2353*495ae853SAndroid Build Coastguard Worker         {
2354*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_refmin16;
2355*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_refmax16;
2356*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_offset;
2357*495ae853SAndroid Build Coastguard Worker 
2358*495ae853SAndroid Build Coastguard Worker             i4_x_refmin16 = (WORD64) (((WORD64) ((i4_i - i4_offset_x) * u4_scale_x) + i4_add_x) >>
2359*495ae853SAndroid Build Coastguard Worker                                       ((WORD32) (u4_shift_x - 4))) -
2360*495ae853SAndroid Build Coastguard Worker                             i4_delta_x;
2361*495ae853SAndroid Build Coastguard Worker 
2362*495ae853SAndroid Build Coastguard Worker             i4_x_refmax16 =
2363*495ae853SAndroid Build Coastguard Worker                 (WORD64) (((WORD64) (i4_i + i4_mb_wd - 1 - i4_offset_x) * u4_scale_x + i4_add_x) >>
2364*495ae853SAndroid Build Coastguard Worker                           ((WORD32) (u4_shift_x - 4))) -
2365*495ae853SAndroid Build Coastguard Worker                 i4_delta_x;
2366*495ae853SAndroid Build Coastguard Worker 
2367*495ae853SAndroid Build Coastguard Worker             /* AC205 */
2368*495ae853SAndroid Build Coastguard Worker             i4_x_offset = i4_x_refmin16 >> 4;
2369*495ae853SAndroid Build Coastguard Worker             ps_x_off_len->i2_offset = i4_x_offset;
2370*495ae853SAndroid Build Coastguard Worker             ps_x_off_len->i2_length = (i4_x_refmax16 >> 4) - i4_x_offset + 2;
2371*495ae853SAndroid Build Coastguard Worker 
2372*495ae853SAndroid Build Coastguard Worker             /* increment the pointer */
2373*495ae853SAndroid Build Coastguard Worker             ps_x_off_len++;
2374*495ae853SAndroid Build Coastguard Worker 
2375*495ae853SAndroid Build Coastguard Worker         } /* end of loop over current layer width */
2376*495ae853SAndroid Build Coastguard Worker 
2377*495ae853SAndroid Build Coastguard Worker         /* ----------------------------------------------------------------- */
2378*495ae853SAndroid Build Coastguard Worker         /* Computation of offsetY refArrayH Ymin and Ymax Lists              */
2379*495ae853SAndroid Build Coastguard Worker         /* ----------------------------------------------------------------- */
2380*495ae853SAndroid Build Coastguard Worker         for(i4_j = 0; i4_j < i4_curr_lyr_height; i4_j = i4_j + i4_mb_ht)
2381*495ae853SAndroid Build Coastguard Worker         {
2382*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_refmin16;
2383*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_refmax16;
2384*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_offset;
2385*495ae853SAndroid Build Coastguard Worker 
2386*495ae853SAndroid Build Coastguard Worker             i4_y_refmin16 = (WORD64) (((WORD64) (i4_j - i4_offset_y) * u4_scale_y + i4_add_y) >>
2387*495ae853SAndroid Build Coastguard Worker                                       ((WORD32) (u4_shift_y - 4))) -
2388*495ae853SAndroid Build Coastguard Worker                             i4_delta_y;
2389*495ae853SAndroid Build Coastguard Worker 
2390*495ae853SAndroid Build Coastguard Worker             i4_y_refmax16 =
2391*495ae853SAndroid Build Coastguard Worker                 (WORD64) (((WORD64) (i4_j + i4_mb_ht - 1 - i4_offset_y) * u4_scale_y + i4_add_y) >>
2392*495ae853SAndroid Build Coastguard Worker                           ((WORD32) (u4_shift_y - 4))) -
2393*495ae853SAndroid Build Coastguard Worker                 i4_delta_y;
2394*495ae853SAndroid Build Coastguard Worker 
2395*495ae853SAndroid Build Coastguard Worker             /* AC205 */
2396*495ae853SAndroid Build Coastguard Worker             i4_y_offset = i4_y_refmin16 >> 4;
2397*495ae853SAndroid Build Coastguard Worker             ps_y_off_len->i2_offset = i4_y_offset;
2398*495ae853SAndroid Build Coastguard Worker             ps_y_off_len->i2_length = (i4_y_refmax16 >> 4) - i4_y_offset + 2;
2399*495ae853SAndroid Build Coastguard Worker 
2400*495ae853SAndroid Build Coastguard Worker             /* increment the pointer */
2401*495ae853SAndroid Build Coastguard Worker             ps_y_off_len++;
2402*495ae853SAndroid Build Coastguard Worker 
2403*495ae853SAndroid Build Coastguard Worker         } /* end of loop over current layer height */
2404*495ae853SAndroid Build Coastguard Worker     }
2405*495ae853SAndroid Build Coastguard Worker 
2406*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2407*495ae853SAndroid Build Coastguard Worker     /* Computation of Xref and Xphase List as per standard                     */
2408*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2409*495ae853SAndroid Build Coastguard Worker     ps_x_off_len = ps_map_ctxt->ps_x_offset_length;
2410*495ae853SAndroid Build Coastguard Worker     ps_y_off_len = ps_map_ctxt->ps_y_offset_length;
2411*495ae853SAndroid Build Coastguard Worker 
2412*495ae853SAndroid Build Coastguard Worker     {
2413*495ae853SAndroid Build Coastguard Worker         WORD32 i4_xc;
2414*495ae853SAndroid Build Coastguard Worker         WORD32 i4_offset_x_index;
2415*495ae853SAndroid Build Coastguard Worker         ref_pixel_map_t *ps_x_pos_phase;
2416*495ae853SAndroid Build Coastguard Worker 
2417*495ae853SAndroid Build Coastguard Worker         ps_x_pos_phase = ps_map_ctxt->ps_x_pos_phase;
2418*495ae853SAndroid Build Coastguard Worker 
2419*495ae853SAndroid Build Coastguard Worker         for(i4_xc = 0; i4_xc < i4_curr_lyr_width; i4_xc++)
2420*495ae853SAndroid Build Coastguard Worker         {
2421*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_offset;
2422*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_ref16;
2423*495ae853SAndroid Build Coastguard Worker 
2424*495ae853SAndroid Build Coastguard Worker             i4_offset_x_index = i4_xc / i4_mb_wd;
2425*495ae853SAndroid Build Coastguard Worker             i4_x_offset = ps_x_off_len[i4_offset_x_index].i2_offset;
2426*495ae853SAndroid Build Coastguard Worker             i4_x_ref16 = (WORD64) (((WORD64) (i4_xc - i4_offset_x) * u4_scale_x + i4_add_x) >>
2427*495ae853SAndroid Build Coastguard Worker                                    ((WORD32) (u4_shift_x - 4))) -
2428*495ae853SAndroid Build Coastguard Worker                          i4_delta_x;
2429*495ae853SAndroid Build Coastguard Worker 
2430*495ae853SAndroid Build Coastguard Worker             /* store the values */
2431*495ae853SAndroid Build Coastguard Worker             ps_x_pos_phase->i2_ref_pos = (i4_x_ref16 >> 4) - i4_x_offset;
2432*495ae853SAndroid Build Coastguard Worker             ps_x_pos_phase->i2_phase = (i4_x_ref16 - (16 * i4_x_offset)) & 15;
2433*495ae853SAndroid Build Coastguard Worker 
2434*495ae853SAndroid Build Coastguard Worker             /* increment the pointer */
2435*495ae853SAndroid Build Coastguard Worker             ps_x_pos_phase++;
2436*495ae853SAndroid Build Coastguard Worker         } /* end of loop over scaled width */
2437*495ae853SAndroid Build Coastguard Worker     }
2438*495ae853SAndroid Build Coastguard Worker 
2439*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2440*495ae853SAndroid Build Coastguard Worker     /* Computation of Yref and Yphase List as per standard                     */
2441*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2442*495ae853SAndroid Build Coastguard Worker     {
2443*495ae853SAndroid Build Coastguard Worker         WORD32 i4_yc;
2444*495ae853SAndroid Build Coastguard Worker         WORD32 i4_offset_y_index;
2445*495ae853SAndroid Build Coastguard Worker         ref_pixel_map_t *ps_y_pos_phase;
2446*495ae853SAndroid Build Coastguard Worker 
2447*495ae853SAndroid Build Coastguard Worker         ps_y_pos_phase = ps_map_ctxt->ps_y_pos_phase;
2448*495ae853SAndroid Build Coastguard Worker 
2449*495ae853SAndroid Build Coastguard Worker         for(i4_yc = 0; i4_yc < i4_curr_lyr_height; i4_yc++)
2450*495ae853SAndroid Build Coastguard Worker         {
2451*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_offset;
2452*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_ref16;
2453*495ae853SAndroid Build Coastguard Worker 
2454*495ae853SAndroid Build Coastguard Worker             i4_offset_y_index = i4_yc / i4_mb_ht;
2455*495ae853SAndroid Build Coastguard Worker             i4_y_offset = ps_y_off_len[i4_offset_y_index].i2_offset;
2456*495ae853SAndroid Build Coastguard Worker 
2457*495ae853SAndroid Build Coastguard Worker             if((SVCD_FALSE == i4_frame_mbs_only_flag) ||
2458*495ae853SAndroid Build Coastguard Worker                (SVCD_FALSE == i4_ref_layer_frame_Mbs_only_flag))
2459*495ae853SAndroid Build Coastguard Worker             {
2460*495ae853SAndroid Build Coastguard Worker                 i4_yc = i4_yc >> (1 - i4_field_Mb_flag);
2461*495ae853SAndroid Build Coastguard Worker             }
2462*495ae853SAndroid Build Coastguard Worker 
2463*495ae853SAndroid Build Coastguard Worker             i4_y_ref16 = (WORD64) ((((WORD64) (i4_yc - i4_offset_y) * u4_scale_y + i4_add_y) >>
2464*495ae853SAndroid Build Coastguard Worker                                     ((WORD32) (u4_shift_y - 4))) -
2465*495ae853SAndroid Build Coastguard Worker                                    i4_delta_y);
2466*495ae853SAndroid Build Coastguard Worker             ps_y_pos_phase->i2_ref_pos = (i4_y_ref16 >> 4) - i4_y_offset;
2467*495ae853SAndroid Build Coastguard Worker             ps_y_pos_phase->i2_phase = (i4_y_ref16 - (16 * i4_y_offset)) & 15;
2468*495ae853SAndroid Build Coastguard Worker 
2469*495ae853SAndroid Build Coastguard Worker             /* increment the pointer */
2470*495ae853SAndroid Build Coastguard Worker             ps_y_pos_phase++;
2471*495ae853SAndroid Build Coastguard Worker         } /* end of loop over scaled height */
2472*495ae853SAndroid Build Coastguard Worker     }
2473*495ae853SAndroid Build Coastguard Worker     return;
2474*495ae853SAndroid Build Coastguard Worker }
2475*495ae853SAndroid Build Coastguard Worker 
2476*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2477*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2478*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_residual_samp_res_init                              */
2479*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2480*495ae853SAndroid Build Coastguard Worker /*  Description   : this function calculates the scale factors and initialise*/
2481*495ae853SAndroid Build Coastguard Worker /*                  the context structure                                    */
2482*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2483*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_residual_samp_ctxt: handle to private structure       */
2484*495ae853SAndroid Build Coastguard Worker /*                  ps_curr_lyr_res_prms: pointer to current resolution      */
2485*495ae853SAndroid Build Coastguard Worker /*                                               params                      */
2486*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
2487*495ae853SAndroid Build Coastguard Worker /*  Processing    : it stores the layer dimensions                           */
2488*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2489*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
2490*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
2491*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2492*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
2493*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2494*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
2495*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2496*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
2497*495ae853SAndroid Build Coastguard Worker /*         26 06 2021   vijayakumar          creation                        */
2498*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2499*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_residual_samp_res_init(void * pv_svc_dec)2500*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_residual_samp_res_init(void *pv_svc_dec)
2501*495ae853SAndroid Build Coastguard Worker {
2502*495ae853SAndroid Build Coastguard Worker     residual_sampling_ctxt_t *ps_ctxt;
2503*495ae853SAndroid Build Coastguard Worker     res_lyr_ctxt *ps_lyr_ctxt;
2504*495ae853SAndroid Build Coastguard Worker     dec_seq_params_t *ps_sps;
2505*495ae853SAndroid Build Coastguard Worker     dec_svc_seq_params_t *ps_subset_sps;
2506*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) pv_svc_dec;
2507*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
2508*495ae853SAndroid Build Coastguard Worker 
2509*495ae853SAndroid Build Coastguard Worker     void *pv_residual_samp_ctxt = ps_svc_lyr_dec->pv_residual_sample_ctxt;
2510*495ae853SAndroid Build Coastguard Worker     res_prms_t *ps_curr_lyr_res_prms = &ps_svc_lyr_dec->s_res_prms;
2511*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t **pps_luma_map_horz = &ps_svc_lyr_dec->ps_ressam_luma_map_horz;
2512*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t **pps_chroma_map_horz = &ps_svc_lyr_dec->ps_ressam_chroma_map_horz;
2513*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t **pps_luma_map_vert = &ps_svc_lyr_dec->ps_ressam_luma_map_vert;
2514*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t **pps_chroma_map_vert = &ps_svc_lyr_dec->ps_ressam_chroma_map_vert;
2515*495ae853SAndroid Build Coastguard Worker 
2516*495ae853SAndroid Build Coastguard Worker     if((NULL == pv_residual_samp_ctxt) || (NULL == ps_curr_lyr_res_prms) ||
2517*495ae853SAndroid Build Coastguard Worker        (NULL == pps_luma_map_horz) || (NULL == pps_chroma_map_horz) ||
2518*495ae853SAndroid Build Coastguard Worker        (NULL == pps_luma_map_vert) || (NULL == pps_chroma_map_vert))
2519*495ae853SAndroid Build Coastguard Worker     {
2520*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
2521*495ae853SAndroid Build Coastguard Worker     }
2522*495ae853SAndroid Build Coastguard Worker 
2523*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt;
2524*495ae853SAndroid Build Coastguard Worker 
2525*495ae853SAndroid Build Coastguard Worker     /* if called for base resolution store deafult values */
2526*495ae853SAndroid Build Coastguard Worker     if(SVCD_TRUE == ps_svc_lyr_dec->u1_base_res_flag)
2527*495ae853SAndroid Build Coastguard Worker     {
2528*495ae853SAndroid Build Coastguard Worker         *pps_luma_map_horz = NULL;
2529*495ae853SAndroid Build Coastguard Worker         *pps_chroma_map_horz = NULL;
2530*495ae853SAndroid Build Coastguard Worker         *pps_luma_map_vert = NULL;
2531*495ae853SAndroid Build Coastguard Worker         *pps_chroma_map_vert = NULL;
2532*495ae853SAndroid Build Coastguard Worker         ps_ctxt->i4_res_lyr_id = -1;
2533*495ae853SAndroid Build Coastguard Worker         ps_ctxt->i4_ref_width = ps_curr_lyr_res_prms->i4_res_width;
2534*495ae853SAndroid Build Coastguard Worker         ps_ctxt->i4_ref_height = ps_curr_lyr_res_prms->i4_res_height;
2535*495ae853SAndroid Build Coastguard Worker         return OK;
2536*495ae853SAndroid Build Coastguard Worker     }
2537*495ae853SAndroid Build Coastguard Worker 
2538*495ae853SAndroid Build Coastguard Worker     /* derive the current sps */
2539*495ae853SAndroid Build Coastguard Worker     ps_sps = ps_dec->ps_cur_sps;
2540*495ae853SAndroid Build Coastguard Worker     ps_subset_sps = ps_svc_lyr_dec->ps_cur_subset_sps;
2541*495ae853SAndroid Build Coastguard Worker 
2542*495ae853SAndroid Build Coastguard Worker     /* store the res id appropriately */
2543*495ae853SAndroid Build Coastguard Worker     ps_ctxt->i4_res_lyr_id = ps_svc_lyr_dec->u1_layer_id - 1;
2544*495ae853SAndroid Build Coastguard Worker 
2545*495ae853SAndroid Build Coastguard Worker     /* get the current layer ctxt */
2546*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_svc_lyr_dec->u1_layer_id - 1];
2547*495ae853SAndroid Build Coastguard Worker 
2548*495ae853SAndroid Build Coastguard Worker     /* get the width and heights */
2549*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->i4_curr_width = ps_curr_lyr_res_prms->i4_res_width;
2550*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->i4_curr_height = ps_curr_lyr_res_prms->i4_res_height;
2551*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->i4_ref_width = ps_ctxt->i4_ref_width;
2552*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->i4_ref_height = ps_ctxt->i4_ref_height;
2553*495ae853SAndroid Build Coastguard Worker 
2554*495ae853SAndroid Build Coastguard Worker     /* store the strcuture pointer containing projected locations */
2555*495ae853SAndroid Build Coastguard Worker     *pps_luma_map_horz = ps_lyr_ctxt->s_luma_map_ctxt.ps_x_offset_length;
2556*495ae853SAndroid Build Coastguard Worker     *pps_chroma_map_horz = ps_lyr_ctxt->s_chroma_map_ctxt.ps_x_offset_length;
2557*495ae853SAndroid Build Coastguard Worker     *pps_luma_map_vert = ps_lyr_ctxt->s_luma_map_ctxt.ps_y_offset_length;
2558*495ae853SAndroid Build Coastguard Worker     *pps_chroma_map_vert = ps_lyr_ctxt->s_chroma_map_ctxt.ps_y_offset_length;
2559*495ae853SAndroid Build Coastguard Worker 
2560*495ae853SAndroid Build Coastguard Worker     /* check for recomputation of mapping required */
2561*495ae853SAndroid Build Coastguard Worker     if(SVCD_TRUE == ps_curr_lyr_res_prms->u1_remap_req_flag)
2562*495ae853SAndroid Build Coastguard Worker     {
2563*495ae853SAndroid Build Coastguard Worker         res_prms_t s_ref_res_prms = {0};
2564*495ae853SAndroid Build Coastguard Worker 
2565*495ae853SAndroid Build Coastguard Worker         /* store the reference layer resolution width and height */
2566*495ae853SAndroid Build Coastguard Worker         s_ref_res_prms.i4_res_width = ps_ctxt->i4_ref_width;
2567*495ae853SAndroid Build Coastguard Worker         s_ref_res_prms.i4_res_height = ps_ctxt->i4_ref_height;
2568*495ae853SAndroid Build Coastguard Worker 
2569*495ae853SAndroid Build Coastguard Worker         /* call the frame level projections calculation function */
2570*495ae853SAndroid Build Coastguard Worker         isvcd_residual_samp_populate_list(&ps_lyr_ctxt->s_luma_map_ctxt, ps_sps, ps_subset_sps,
2571*495ae853SAndroid Build Coastguard Worker                                           ps_curr_lyr_res_prms, &s_ref_res_prms, 0);
2572*495ae853SAndroid Build Coastguard Worker         isvcd_residual_samp_populate_list(&ps_lyr_ctxt->s_chroma_map_ctxt, ps_sps, ps_subset_sps,
2573*495ae853SAndroid Build Coastguard Worker                                           ps_curr_lyr_res_prms, &s_ref_res_prms, 1);
2574*495ae853SAndroid Build Coastguard Worker 
2575*495ae853SAndroid Build Coastguard Worker         /* default values for flags */
2576*495ae853SAndroid Build Coastguard Worker         ps_lyr_ctxt->pf_residual_samp_mb = &isvcd_residual_samp_mb;
2577*495ae853SAndroid Build Coastguard Worker         ps_lyr_ctxt->i4_chrm_horz_int_mode = 0;
2578*495ae853SAndroid Build Coastguard Worker         ps_lyr_ctxt->i4_chrm_vert_int_mode = 0;
2579*495ae853SAndroid Build Coastguard Worker         ps_lyr_ctxt->i4_chrm_alt_proc = SVCD_FALSE;
2580*495ae853SAndroid Build Coastguard Worker 
2581*495ae853SAndroid Build Coastguard Worker         /* Store the Dyadic flag */
2582*495ae853SAndroid Build Coastguard Worker         ps_lyr_ctxt->i4_dyadic_flag = ps_curr_lyr_res_prms->u1_dyadic_flag;
2583*495ae853SAndroid Build Coastguard Worker 
2584*495ae853SAndroid Build Coastguard Worker         /* set the appropriate chroma processing routine based on */
2585*495ae853SAndroid Build Coastguard Worker         /* phase values */
2586*495ae853SAndroid Build Coastguard Worker         if(SVCD_TRUE == ps_curr_lyr_res_prms->u1_dyadic_flag)
2587*495ae853SAndroid Build Coastguard Worker         {
2588*495ae853SAndroid Build Coastguard Worker             WORD32 i4_ref_layer_chroma_phase_x_plus1_flag;
2589*495ae853SAndroid Build Coastguard Worker             WORD32 i4_ref_layer_chroma_phase_y_plus1;
2590*495ae853SAndroid Build Coastguard Worker             WORD32 i4_chroma_phase_x_plus1_flag;
2591*495ae853SAndroid Build Coastguard Worker             WORD32 i4_chroma_phase_y_plus1;
2592*495ae853SAndroid Build Coastguard Worker 
2593*495ae853SAndroid Build Coastguard Worker             ps_lyr_ctxt->pf_residual_samp_mb = &isvcd_residual_samp_mb_dyadic;
2594*495ae853SAndroid Build Coastguard Worker             i4_ref_layer_chroma_phase_x_plus1_flag =
2595*495ae853SAndroid Build Coastguard Worker                 ps_curr_lyr_res_prms->i1_ref_lyr_chroma_phase_x_plus1_flag;
2596*495ae853SAndroid Build Coastguard Worker             i4_ref_layer_chroma_phase_y_plus1 =
2597*495ae853SAndroid Build Coastguard Worker                 ps_curr_lyr_res_prms->i1_ref_lyr_chroma_phase_y_plus1;
2598*495ae853SAndroid Build Coastguard Worker             i4_chroma_phase_x_plus1_flag =
2599*495ae853SAndroid Build Coastguard Worker                 ps_subset_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_x_plus1_flag;
2600*495ae853SAndroid Build Coastguard Worker             i4_chroma_phase_y_plus1 =
2601*495ae853SAndroid Build Coastguard Worker                 ps_subset_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_y_plus1;
2602*495ae853SAndroid Build Coastguard Worker             if((0 == i4_ref_layer_chroma_phase_x_plus1_flag) && (1 == i4_chroma_phase_x_plus1_flag))
2603*495ae853SAndroid Build Coastguard Worker             {
2604*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt->i4_chrm_horz_int_mode = 1;
2605*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt->i4_chrm_alt_proc = SVCD_TRUE;
2606*495ae853SAndroid Build Coastguard Worker             }
2607*495ae853SAndroid Build Coastguard Worker 
2608*495ae853SAndroid Build Coastguard Worker             if((0 == i4_ref_layer_chroma_phase_y_plus1) && (1 == i4_chroma_phase_y_plus1))
2609*495ae853SAndroid Build Coastguard Worker             {
2610*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt->i4_chrm_vert_int_mode = 1;
2611*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt->i4_chrm_alt_proc = SVCD_TRUE;
2612*495ae853SAndroid Build Coastguard Worker             }
2613*495ae853SAndroid Build Coastguard Worker 
2614*495ae853SAndroid Build Coastguard Worker             if((0 == i4_ref_layer_chroma_phase_y_plus1) && (2 == i4_chroma_phase_y_plus1))
2615*495ae853SAndroid Build Coastguard Worker             {
2616*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt->i4_chrm_vert_int_mode = 1;
2617*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt->i4_chrm_alt_proc = SVCD_TRUE;
2618*495ae853SAndroid Build Coastguard Worker             }
2619*495ae853SAndroid Build Coastguard Worker 
2620*495ae853SAndroid Build Coastguard Worker             if((2 == i4_ref_layer_chroma_phase_y_plus1) && (0 == i4_chroma_phase_y_plus1))
2621*495ae853SAndroid Build Coastguard Worker             {
2622*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt->i4_chrm_vert_int_mode = 2;
2623*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt->i4_chrm_alt_proc = SVCD_TRUE;
2624*495ae853SAndroid Build Coastguard Worker             }
2625*495ae853SAndroid Build Coastguard Worker         }
2626*495ae853SAndroid Build Coastguard Worker     }
2627*495ae853SAndroid Build Coastguard Worker     else
2628*495ae853SAndroid Build Coastguard Worker     {
2629*495ae853SAndroid Build Coastguard Worker         /* should take false value */
2630*495ae853SAndroid Build Coastguard Worker         if(SVCD_FALSE != ps_curr_lyr_res_prms->u1_remap_req_flag)
2631*495ae853SAndroid Build Coastguard Worker         {
2632*495ae853SAndroid Build Coastguard Worker             return NOT_OK;
2633*495ae853SAndroid Build Coastguard Worker         }
2634*495ae853SAndroid Build Coastguard Worker     }
2635*495ae853SAndroid Build Coastguard Worker 
2636*495ae853SAndroid Build Coastguard Worker     /* store the current layer width and height to context */
2637*495ae853SAndroid Build Coastguard Worker     ps_ctxt->i4_ref_width = ps_curr_lyr_res_prms->i4_res_width;
2638*495ae853SAndroid Build Coastguard Worker     ps_ctxt->i4_ref_height = ps_curr_lyr_res_prms->i4_res_height;
2639*495ae853SAndroid Build Coastguard Worker 
2640*495ae853SAndroid Build Coastguard Worker     /* assert on max ranges of width and shift values */
2641*495ae853SAndroid Build Coastguard Worker     if((ps_lyr_ctxt->i4_curr_width > H264_MAX_FRAME_WIDTH) ||
2642*495ae853SAndroid Build Coastguard Worker        (ps_lyr_ctxt->i4_ref_width > H264_MAX_FRAME_WIDTH) ||
2643*495ae853SAndroid Build Coastguard Worker        (ps_lyr_ctxt->i4_curr_height > H264_MAX_FRAME_HEIGHT) ||
2644*495ae853SAndroid Build Coastguard Worker        (ps_lyr_ctxt->i4_ref_height > H264_MAX_FRAME_HEIGHT))
2645*495ae853SAndroid Build Coastguard Worker     {
2646*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
2647*495ae853SAndroid Build Coastguard Worker     }
2648*495ae853SAndroid Build Coastguard Worker     return OK;
2649*495ae853SAndroid Build Coastguard Worker }