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 }