xref: /aosp_15_r20/external/libavc/decoder/svc/isvcd_intra_resamp.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker  */
20*495ae853SAndroid Build Coastguard Worker /**
21*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
22*495ae853SAndroid Build Coastguard Worker  * @file
23*495ae853SAndroid Build Coastguard Worker  *  isvcd_intra_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_get_ceil_log2()
33*495ae853SAndroid Build Coastguard Worker  *  - isvcd_2d_memset()
34*495ae853SAndroid Build Coastguard Worker  *  - isvcd_copy_data()
35*495ae853SAndroid Build Coastguard Worker  *  - isvcd_copy_data_semiplanr()
36*495ae853SAndroid Build Coastguard Worker  *  - isvcd_get_ref_layer_avlblty_dyadic()
37*495ae853SAndroid Build Coastguard Worker  *  - isvcd_diagonal_construct_dyadic()
38*495ae853SAndroid Build Coastguard Worker  *  - isvcd_left_right_padding()
39*495ae853SAndroid Build Coastguard Worker  *  - isvcd_left_right_padding_chroma()
40*495ae853SAndroid Build Coastguard Worker  *  - isvcd_top_bot_padding()
41*495ae853SAndroid Build Coastguard Worker  *  - isvcd_top_bot_padding_chroma()
42*495ae853SAndroid Build Coastguard Worker  *  - isvcd_diag_reconstruction()
43*495ae853SAndroid Build Coastguard Worker  *  - isvcd_diag_reconstruction_chroma()
44*495ae853SAndroid Build Coastguard Worker  *  - isvcd_diag_padding()
45*495ae853SAndroid Build Coastguard Worker  *  - isvcd_diag_padding_chroma()
46*495ae853SAndroid Build Coastguard Worker  *  - isvcd_corner_samp_dyadic()
47*495ae853SAndroid Build Coastguard Worker  *  - isvcd_fill_non_avail_pixel()
48*495ae853SAndroid Build Coastguard Worker  *  - isvcd_get_ref_layer_mbtype()
49*495ae853SAndroid Build Coastguard Worker  *  - isvcd_reflayer_construction()
50*495ae853SAndroid Build Coastguard Worker  *  - isvcd_reflayer_construction_dyadic()
51*495ae853SAndroid Build Coastguard Worker  *  - isvcd_interpolate_base_luma_dyadic()
52*495ae853SAndroid Build Coastguard Worker  *  - isvcd_vert_interpol_chroma_dyadic_1()
53*495ae853SAndroid Build Coastguard Worker  *  - isvcd_vert_interpol_chroma_dyadic_2()
54*495ae853SAndroid Build Coastguard Worker  *  - isvcd_vert_interpol_chroma_dyadic_3()
55*495ae853SAndroid Build Coastguard Worker  *  - isvcd_horz_interpol_chroma_dyadic_1()
56*495ae853SAndroid Build Coastguard Worker  *  - isvcd_horz_interpol_chroma_dyadic_2()
57*495ae853SAndroid Build Coastguard Worker  *  - isvcd_intra_resamp_mb_dyadic()
58*495ae853SAndroid Build Coastguard Worker  *  - isvcd_interpolate_intra_base()
59*495ae853SAndroid Build Coastguard Worker  *  - isvcd_intra_resamp_mb()
60*495ae853SAndroid Build Coastguard Worker  *  - isvcd_intra_resamp_generate_segment_lookup()
61*495ae853SAndroid Build Coastguard Worker  *  - isvcd_intra_resamp_populate_list()
62*495ae853SAndroid Build Coastguard Worker  *  - isvcd_populate_res_prms()
63*495ae853SAndroid Build Coastguard Worker  *  - isvcd_crop_wnd_flag_res_int()
64*495ae853SAndroid Build Coastguard Worker  *  - isvcd_intra_resamp_res_init()
65*495ae853SAndroid Build Coastguard Worker  *
66*495ae853SAndroid Build Coastguard Worker  * @remarks
67*495ae853SAndroid Build Coastguard Worker  *  None
68*495ae853SAndroid Build Coastguard Worker  *
69*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
70*495ae853SAndroid Build Coastguard Worker  */
71*495ae853SAndroid Build Coastguard Worker 
72*495ae853SAndroid Build Coastguard Worker #include <assert.h>
73*495ae853SAndroid Build Coastguard Worker #include <string.h>
74*495ae853SAndroid Build Coastguard Worker 
75*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
76*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
77*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
78*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
79*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
80*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
81*495ae853SAndroid Build Coastguard Worker #include "isvcd_structs.h"
82*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
83*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
84*495ae853SAndroid Build Coastguard Worker #include "ih264d_deblocking.h"
85*495ae853SAndroid Build Coastguard Worker #include "ih264d_dpb_manager.h"
86*495ae853SAndroid Build Coastguard Worker #include "ih264d_mvpred.h"
87*495ae853SAndroid Build Coastguard Worker #include "ih264d_inter_pred.h"
88*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_pslice.h"
89*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
90*495ae853SAndroid Build Coastguard Worker #include "ih264d_cabac.h"
91*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
92*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_slice.h"
93*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
94*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_islice.h"
95*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_bslice.h"
96*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_intra_mb.h"
97*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
98*495ae853SAndroid Build Coastguard Worker 
99*495ae853SAndroid Build Coastguard Worker ftype_intra_samp_padding *gpf_lookup_fxns_luma[32] = {
100*495ae853SAndroid Build Coastguard Worker     NULL,
101*495ae853SAndroid Build Coastguard Worker     NULL,
102*495ae853SAndroid Build Coastguard Worker     NULL,
103*495ae853SAndroid Build Coastguard Worker     NULL,
104*495ae853SAndroid Build Coastguard Worker     NULL,
105*495ae853SAndroid Build Coastguard Worker     NULL,
106*495ae853SAndroid Build Coastguard Worker     NULL,
107*495ae853SAndroid Build Coastguard Worker     NULL,
108*495ae853SAndroid Build Coastguard Worker     NULL,
109*495ae853SAndroid Build Coastguard Worker     &isvcd_left_right_padding,
110*495ae853SAndroid Build Coastguard Worker     NULL,
111*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_reconstruction,
112*495ae853SAndroid Build Coastguard Worker     NULL,
113*495ae853SAndroid Build Coastguard Worker     &isvcd_left_right_padding,
114*495ae853SAndroid Build Coastguard Worker     NULL,
115*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_reconstruction,
116*495ae853SAndroid Build Coastguard Worker     NULL,
117*495ae853SAndroid Build Coastguard Worker     NULL,
118*495ae853SAndroid Build Coastguard Worker     &isvcd_top_bot_padding,
119*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_reconstruction,
120*495ae853SAndroid Build Coastguard Worker     NULL,
121*495ae853SAndroid Build Coastguard Worker     NULL,
122*495ae853SAndroid Build Coastguard Worker     &isvcd_top_bot_padding,
123*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_reconstruction,
124*495ae853SAndroid Build Coastguard Worker     NULL,
125*495ae853SAndroid Build Coastguard Worker     &isvcd_left_right_padding,
126*495ae853SAndroid Build Coastguard Worker     &isvcd_top_bot_padding,
127*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_reconstruction,
128*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_padding,
129*495ae853SAndroid Build Coastguard Worker     &isvcd_left_right_padding,
130*495ae853SAndroid Build Coastguard Worker     &isvcd_top_bot_padding,
131*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_reconstruction,
132*495ae853SAndroid Build Coastguard Worker };
133*495ae853SAndroid Build Coastguard Worker 
134*495ae853SAndroid Build Coastguard Worker ftype_intra_samp_padding *gpf_lookup_fxns_chroma[32] = {
135*495ae853SAndroid Build Coastguard Worker     NULL,
136*495ae853SAndroid Build Coastguard Worker     NULL,
137*495ae853SAndroid Build Coastguard Worker     NULL,
138*495ae853SAndroid Build Coastguard Worker     NULL,
139*495ae853SAndroid Build Coastguard Worker     NULL,
140*495ae853SAndroid Build Coastguard Worker     NULL,
141*495ae853SAndroid Build Coastguard Worker     NULL,
142*495ae853SAndroid Build Coastguard Worker     NULL,
143*495ae853SAndroid Build Coastguard Worker     NULL,
144*495ae853SAndroid Build Coastguard Worker     &isvcd_left_right_padding_chroma,
145*495ae853SAndroid Build Coastguard Worker     NULL,
146*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_reconstruction_chroma,
147*495ae853SAndroid Build Coastguard Worker     NULL,
148*495ae853SAndroid Build Coastguard Worker     &isvcd_left_right_padding_chroma,
149*495ae853SAndroid Build Coastguard Worker     NULL,
150*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_reconstruction_chroma,
151*495ae853SAndroid Build Coastguard Worker     NULL,
152*495ae853SAndroid Build Coastguard Worker     NULL,
153*495ae853SAndroid Build Coastguard Worker     &isvcd_top_bot_padding_chroma,
154*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_reconstruction_chroma,
155*495ae853SAndroid Build Coastguard Worker     NULL,
156*495ae853SAndroid Build Coastguard Worker     NULL,
157*495ae853SAndroid Build Coastguard Worker     &isvcd_top_bot_padding_chroma,
158*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_reconstruction_chroma,
159*495ae853SAndroid Build Coastguard Worker     NULL,
160*495ae853SAndroid Build Coastguard Worker     &isvcd_left_right_padding_chroma,
161*495ae853SAndroid Build Coastguard Worker     &isvcd_top_bot_padding_chroma,
162*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_reconstruction_chroma,
163*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_padding_chroma,
164*495ae853SAndroid Build Coastguard Worker     &isvcd_left_right_padding_chroma,
165*495ae853SAndroid Build Coastguard Worker     &isvcd_top_bot_padding_chroma,
166*495ae853SAndroid Build Coastguard Worker     &isvcd_diag_reconstruction_chroma,
167*495ae853SAndroid Build Coastguard Worker };
168*495ae853SAndroid Build Coastguard Worker 
169*495ae853SAndroid Build Coastguard Worker const UWORD32 gu4_valid_segs_lookup[16] = {
170*495ae853SAndroid Build Coastguard Worker     0x0F000000, 0xCF000000, 0x3F000000, 0xFF000000, 0x0F000000, 0xCF000000, 0x3F000000, 0xFF000000,
171*495ae853SAndroid Build Coastguard Worker     0x0F000000, 0x8F000000, 0x6F000000, 0xEF000000, 0x1F000000, 0x9F000000, 0x7F000000, 0xFF000000};
172*495ae853SAndroid Build Coastguard Worker 
173*495ae853SAndroid Build Coastguard Worker const WORD8 g_ai1_interp_filter_luma[64] = {
174*495ae853SAndroid Build Coastguard Worker     0,  -1, -2, -3, -3, -4, -4, -3, -3, -3, -2, -1, -1, -1, -1, -1, 32, 32, 31, 30, 28, 26,
175*495ae853SAndroid Build Coastguard Worker     24, 22, 19, 16, 14, 11, 8,  6,  4,  2,  0,  2,  4,  6,  8,  11, 14, 16, 19, 22, 24, 26,
176*495ae853SAndroid Build Coastguard Worker     28, 30, 31, 32, 0,  -1, -1, -1, -1, -1, -2, -3, -3, -3, -4, -4, -3, -3, -2, -1};
177*495ae853SAndroid Build Coastguard Worker 
178*495ae853SAndroid Build Coastguard Worker const UWORD8 g_au1_interp_filter_chroma[32] = {32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12,
179*495ae853SAndroid Build Coastguard Worker                                                10, 8,  6,  4,  2,  0,  2,  4,  6,  8,  10,
180*495ae853SAndroid Build Coastguard Worker                                                12, 14, 16, 18, 20, 22, 24, 26, 28, 30};
181*495ae853SAndroid Build Coastguard Worker 
182*495ae853SAndroid Build Coastguard Worker WORD32 ref_pos_luma[4][16] = {{10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 18, 18, 19, 20, 20},
183*495ae853SAndroid Build Coastguard Worker                               {10, 10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 18, 18, 19, 20},
184*495ae853SAndroid Build Coastguard Worker                               {2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 12},
185*495ae853SAndroid Build Coastguard Worker                               {2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12}};
186*495ae853SAndroid Build Coastguard Worker WORD32 ref_pos_chroma[4][8] = {{6, 7, 8, 8, 9, 10, 10, 11},
187*495ae853SAndroid Build Coastguard Worker                                {6, 7, 7, 8, 9, 9, 10, 11},
188*495ae853SAndroid Build Coastguard Worker                                {6, 6, 7, 8, 8, 9, 10, 10},
189*495ae853SAndroid Build Coastguard Worker                                {2, 3, 4, 4, 5, 6, 6, 7}};
190*495ae853SAndroid Build Coastguard Worker 
191*495ae853SAndroid Build Coastguard Worker WORD32 phase_luma[3][16] = {{13, 8, 3, 13, 8, 3, 13, 8, 3, 13, 8, 3, 13, 8, 3, 13},
192*495ae853SAndroid Build Coastguard Worker                             {8, 3, 13, 8, 3, 13, 8, 3, 13, 8, 3, 13, 8, 3, 13, 8},
193*495ae853SAndroid Build Coastguard Worker                             {3, 13, 8, 3, 13, 8, 3, 13, 8, 3, 13, 8, 3, 13, 8, 3}};
194*495ae853SAndroid Build Coastguard Worker 
195*495ae853SAndroid Build Coastguard Worker UWORD8 phase_luma_u8[3][16] = {{13, 8, 3, 13, 8, 3, 13, 8, 3, 13, 8, 3, 13, 8, 3, 13},
196*495ae853SAndroid Build Coastguard Worker                                {8, 3, 13, 8, 3, 13, 8, 3, 13, 8, 3, 13, 8, 3, 13, 8},
197*495ae853SAndroid Build Coastguard Worker                                {3, 13, 8, 3, 13, 8, 3, 13, 8, 3, 13, 8, 3, 13, 8, 3}};
198*495ae853SAndroid Build Coastguard Worker 
199*495ae853SAndroid Build Coastguard Worker WORD8 phase_luma_x86[6][16] = {{13, 8, 3, 13, 8, 3, 13, 8, 0, 0, 0, 0, 0, 0, 0, 0},
200*495ae853SAndroid Build Coastguard Worker                                {3, 13, 8, 3, 13, 8, 3, 13, 0, 0, 0, 0, 0, 0, 0, 0},
201*495ae853SAndroid Build Coastguard Worker                                {8, 3, 13, 8, 3, 13, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0},
202*495ae853SAndroid Build Coastguard Worker                                {13, 8, 3, 13, 8, 3, 13, 8, 0, 0, 0, 0, 0, 0, 0, 0},
203*495ae853SAndroid Build Coastguard Worker                                {3, 13, 8, 3, 13, 8, 3, 13, 0, 0, 0, 0, 0, 0, 0, 0},
204*495ae853SAndroid Build Coastguard Worker                                {8, 3, 13, 8, 3, 13, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0}};
205*495ae853SAndroid Build Coastguard Worker 
206*495ae853SAndroid Build Coastguard Worker WORD32 phase_chroma[3][8] = {
207*495ae853SAndroid Build Coastguard Worker     {13, 8, 3, 13, 8, 3, 13, 8}, {3, 13, 8, 3, 13, 8, 3, 13}, {8, 3, 13, 8, 3, 13, 8, 3}};
208*495ae853SAndroid Build Coastguard Worker 
209*495ae853SAndroid Build Coastguard Worker UWORD8 phase_chroma_u8[3][8] = {
210*495ae853SAndroid Build Coastguard Worker     {13, 8, 3, 13, 8, 3, 13, 8}, {3, 13, 8, 3, 13, 8, 3, 13}, {8, 3, 13, 8, 3, 13, 8, 3}};
211*495ae853SAndroid Build Coastguard Worker 
212*495ae853SAndroid Build Coastguard Worker UWORD8 ref_pos_luma_mask_m48[8][16] = {{0, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11},
213*495ae853SAndroid Build Coastguard Worker                                        {2, 3, 2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11, 10, 11},
214*495ae853SAndroid Build Coastguard Worker                                        {2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11, 10, 11, 12, 13},
215*495ae853SAndroid Build Coastguard Worker                                        {4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13},
216*495ae853SAndroid Build Coastguard Worker                                        {4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15},
217*495ae853SAndroid Build Coastguard Worker                                        {6, 7, 6, 7, 8, 9, 10, 11, 10, 11, 12, 13, 14, 15, 14, 15},
218*495ae853SAndroid Build Coastguard Worker                                        {0, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11},
219*495ae853SAndroid Build Coastguard Worker                                        {4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13}};
220*495ae853SAndroid Build Coastguard Worker 
221*495ae853SAndroid Build Coastguard Worker UWORD8 ref_pos_luma_mask_m16[8][16] = {{0, 1, 2, 3, 2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11},
222*495ae853SAndroid Build Coastguard Worker                                        {0, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11},
223*495ae853SAndroid Build Coastguard Worker                                        {2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13},
224*495ae853SAndroid Build Coastguard Worker                                        {2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11, 10, 11, 12, 13},
225*495ae853SAndroid Build Coastguard Worker                                        {4, 5, 6, 7, 6, 7, 8, 9, 10, 11, 10, 11, 12, 13, 14, 15},
226*495ae853SAndroid Build Coastguard Worker                                        {4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15},
227*495ae853SAndroid Build Coastguard Worker                                        {0, 1, 2, 3, 2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11},
228*495ae853SAndroid Build Coastguard Worker                                        {2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11, 10, 11, 12, 13}};
229*495ae853SAndroid Build Coastguard Worker 
230*495ae853SAndroid Build Coastguard Worker UWORD8 ref_pos_luma_mask_m32[8][16] = {{0, 1, 0, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9},
231*495ae853SAndroid Build Coastguard Worker                                        {0, 1, 2, 3, 2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11},
232*495ae853SAndroid Build Coastguard Worker                                        {2, 3, 2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11, 10, 11},
233*495ae853SAndroid Build Coastguard Worker                                        {2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13},
234*495ae853SAndroid Build Coastguard Worker                                        {4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13},
235*495ae853SAndroid Build Coastguard Worker                                        {4, 5, 6, 7, 6, 7, 8, 9, 10, 11, 10, 11, 12, 13, 14, 15},
236*495ae853SAndroid Build Coastguard Worker                                        {0, 1, 0, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9},
237*495ae853SAndroid Build Coastguard Worker                                        {2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13}};
238*495ae853SAndroid Build Coastguard Worker 
239*495ae853SAndroid Build Coastguard Worker UWORD8 ref_pos_chroma_mask_m24[2][16] = {{0, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11},
240*495ae853SAndroid Build Coastguard Worker                                          {2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11, 10, 11, 12, 13}};
241*495ae853SAndroid Build Coastguard Worker UWORD8 ref_pos_chroma_mask_m8[2][16] = {{0, 1, 0, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9},
242*495ae853SAndroid Build Coastguard Worker                                         {2, 3, 2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11, 10, 11}};
243*495ae853SAndroid Build Coastguard Worker UWORD8 ref_pos_chroma_mask_m16[2][16] = {{0, 1, 2, 3, 2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11},
244*495ae853SAndroid Build Coastguard Worker                                          {2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13}};
245*495ae853SAndroid Build Coastguard Worker 
246*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
247*495ae853SAndroid Build Coastguard Worker /*                                                                           */
248*495ae853SAndroid Build Coastguard Worker /*  Function Name :  isvcd_get_ceil_log2                                      */
249*495ae853SAndroid Build Coastguard Worker /*                                                                           */
250*495ae853SAndroid Build Coastguard Worker /*  Description   : this function returns the CeilLog2 of the given number   */
251*495ae853SAndroid Build Coastguard Worker /*                                                                           */
252*495ae853SAndroid Build Coastguard Worker /*                                                                           */
253*495ae853SAndroid Build Coastguard Worker /*  Inputs        : i4_input : input number                                  */
254*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
255*495ae853SAndroid Build Coastguard Worker /*  Processing    : it calculate the bits and returns it                     */
256*495ae853SAndroid Build Coastguard Worker /*                                                                           */
257*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
258*495ae853SAndroid Build Coastguard Worker /*  Returns       : ceil of log to base 2                                    */
259*495ae853SAndroid Build Coastguard Worker /*                                                                           */
260*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
261*495ae853SAndroid Build Coastguard Worker /*                                                                           */
262*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
263*495ae853SAndroid Build Coastguard Worker /*                                                                           */
264*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
265*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   vijayakumar          creation                        */
266*495ae853SAndroid Build Coastguard Worker /*                                                                           */
267*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_get_ceil_log2(WORD32 i4_input)268*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_get_ceil_log2(WORD32 i4_input)
269*495ae853SAndroid Build Coastguard Worker {
270*495ae853SAndroid Build Coastguard Worker     WORD32 i4_bits = 0;
271*495ae853SAndroid Build Coastguard Worker 
272*495ae853SAndroid Build Coastguard Worker     i4_input--;
273*495ae853SAndroid Build Coastguard Worker     while(i4_input > 0)
274*495ae853SAndroid Build Coastguard Worker     {
275*495ae853SAndroid Build Coastguard Worker         i4_bits++;
276*495ae853SAndroid Build Coastguard Worker         i4_input >>= 1;
277*495ae853SAndroid Build Coastguard Worker     }
278*495ae853SAndroid Build Coastguard Worker     return (i4_bits);
279*495ae853SAndroid Build Coastguard Worker }
280*495ae853SAndroid Build Coastguard Worker 
281*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
282*495ae853SAndroid Build Coastguard Worker /*                                                                           */
283*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_2d_memset                                           */
284*495ae853SAndroid Build Coastguard Worker /*                                                                           */
285*495ae853SAndroid Build Coastguard Worker /*  Description   : Function performs 2D memset operation                    */
286*495ae853SAndroid Build Coastguard Worker /*                                                                           */
287*495ae853SAndroid Build Coastguard Worker /*                                                                           */
288*495ae853SAndroid Build Coastguard Worker /*  Inputs        : 1. Buffer pointer                                        */
289*495ae853SAndroid Build Coastguard Worker /*                  2. width                                                 */
290*495ae853SAndroid Build Coastguard Worker /*                  3. Height                                                */
291*495ae853SAndroid Build Coastguard Worker /*                  4. Stride                                                */
292*495ae853SAndroid Build Coastguard Worker /*                  5. value                                                 */
293*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
294*495ae853SAndroid Build Coastguard Worker /*  Processing    : calls memset fucntion                                    */
295*495ae853SAndroid Build Coastguard Worker /*                                                                           */
296*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Updates the buffer                                       */
297*495ae853SAndroid Build Coastguard Worker /*  Returns       : status                                                   */
298*495ae853SAndroid Build Coastguard Worker /*                                                                           */
299*495ae853SAndroid Build Coastguard Worker /*  Issues        : None                                                     */
300*495ae853SAndroid Build Coastguard Worker /*                                                                           */
301*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
302*495ae853SAndroid Build Coastguard Worker /*                                                                           */
303*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
304*495ae853SAndroid Build Coastguard Worker /*         24 09 2021   Vijay           Draft                                */
305*495ae853SAndroid Build Coastguard Worker /*                                                                           */
306*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_2d_memset(void * pv_buf,WORD32 i4_width,WORD32 i4_ht,WORD32 i4_stride,WORD32 i4_val)307*495ae853SAndroid Build Coastguard Worker void isvcd_2d_memset(void *pv_buf, WORD32 i4_width, WORD32 i4_ht, WORD32 i4_stride, WORD32 i4_val)
308*495ae853SAndroid Build Coastguard Worker {
309*495ae853SAndroid Build Coastguard Worker     WORD32 i4_y;
310*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_buf;
311*495ae853SAndroid Build Coastguard Worker 
312*495ae853SAndroid Build Coastguard Worker     pu1_buf = (UWORD8 *) pv_buf;
313*495ae853SAndroid Build Coastguard Worker 
314*495ae853SAndroid Build Coastguard Worker     for(i4_y = 0; i4_y < i4_ht; i4_y++)
315*495ae853SAndroid Build Coastguard Worker     {
316*495ae853SAndroid Build Coastguard Worker         memset(pu1_buf, i4_val, i4_width);
317*495ae853SAndroid Build Coastguard Worker         /* Increment the pointer */
318*495ae853SAndroid Build Coastguard Worker         pu1_buf += i4_stride;
319*495ae853SAndroid Build Coastguard Worker     }
320*495ae853SAndroid Build Coastguard Worker }
321*495ae853SAndroid Build Coastguard Worker 
322*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
323*495ae853SAndroid Build Coastguard Worker /*                                                                           */
324*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_copy_data                                           */
325*495ae853SAndroid Build Coastguard Worker /*                                                                           */
326*495ae853SAndroid Build Coastguard Worker /*  Description   : this module copies the data from source to destination   */
327*495ae853SAndroid Build Coastguard Worker /*                  the amount of data to be copied is passed as input       */
328*495ae853SAndroid Build Coastguard Worker /*                                                                           */
329*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pu1_src : pointer to the source buffer                   */
330*495ae853SAndroid Build Coastguard Worker /*                  u2_src_stride : source buffer stride                     */
331*495ae853SAndroid Build Coastguard Worker /*                  pu1_dst : pointer to the destination buffer              */
332*495ae853SAndroid Build Coastguard Worker /*                  u2_dst_stride : destination buffer stride                */
333*495ae853SAndroid Build Coastguard Worker /*                  u4_num_bytes : number of bytes to be copied              */
334*495ae853SAndroid Build Coastguard Worker /*                  u4_num_lines : number of lines to be copied              */
335*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
336*495ae853SAndroid Build Coastguard Worker /*  Processing    : it does a memcpy from source to destination              */
337*495ae853SAndroid Build Coastguard Worker /*                                                                           */
338*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
339*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
340*495ae853SAndroid Build Coastguard Worker /*  Issues        : both buffers are assumed to be 2-D buffers               */
341*495ae853SAndroid Build Coastguard Worker /*                                                                           */
342*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
343*495ae853SAndroid Build Coastguard Worker /*                                                                           */
344*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
345*495ae853SAndroid Build Coastguard Worker /*         29 09 2021   vijayakumar          creation                        */
346*495ae853SAndroid Build Coastguard Worker /*                                                                           */
347*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_copy_data(UWORD8 * pu1_src,WORD32 i4_src_stride,UWORD8 * pu1_dst,WORD32 i4_dst_stride,WORD32 i4_num_bytes,WORD32 i4_num_lines)348*495ae853SAndroid Build Coastguard Worker void isvcd_copy_data(UWORD8 *pu1_src, WORD32 i4_src_stride, UWORD8 *pu1_dst, WORD32 i4_dst_stride,
349*495ae853SAndroid Build Coastguard Worker                      WORD32 i4_num_bytes, WORD32 i4_num_lines)
350*495ae853SAndroid Build Coastguard Worker {
351*495ae853SAndroid Build Coastguard Worker     WORD32 i4_vert_lines;
352*495ae853SAndroid Build Coastguard Worker 
353*495ae853SAndroid Build Coastguard Worker     /* loop for copy all the lines requried */
354*495ae853SAndroid Build Coastguard Worker     for(i4_vert_lines = 0; i4_vert_lines < i4_num_lines; i4_vert_lines++)
355*495ae853SAndroid Build Coastguard Worker     {
356*495ae853SAndroid Build Coastguard Worker         memcpy(pu1_dst, pu1_src, i4_num_bytes);
357*495ae853SAndroid Build Coastguard Worker         pu1_src += i4_src_stride;
358*495ae853SAndroid Build Coastguard Worker         pu1_dst += i4_dst_stride;
359*495ae853SAndroid Build Coastguard Worker     }
360*495ae853SAndroid Build Coastguard Worker     return;
361*495ae853SAndroid Build Coastguard Worker }
362*495ae853SAndroid Build Coastguard Worker 
363*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
364*495ae853SAndroid Build Coastguard Worker /*                                                                           */
365*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_copy_data_semiplanr                                 */
366*495ae853SAndroid Build Coastguard Worker /*                                                                           */
367*495ae853SAndroid Build Coastguard Worker /*  Description   : this module copies the data from source to destination   */
368*495ae853SAndroid Build Coastguard Worker /*                  the amount of data to be copied is passed as input       */
369*495ae853SAndroid Build Coastguard Worker /*                                                                           */
370*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pu1_src : pointer to the source buffer                   */
371*495ae853SAndroid Build Coastguard Worker /*                  i4_src_stride : source buffer stride                     */
372*495ae853SAndroid Build Coastguard Worker /*                  pu1_dst1 : pointer to the destination buffer 1           */
373*495ae853SAndroid Build Coastguard Worker /*                  pu1_dst2 : pointer to the destination buffer 2           */
374*495ae853SAndroid Build Coastguard Worker /*                  i4_dst_stride : destination buffer stride                */
375*495ae853SAndroid Build Coastguard Worker /*                  i4_num_bytes : number of bytes to be copied              */
376*495ae853SAndroid Build Coastguard Worker /*                  i4_num_lines : number of lines to be copied              */
377*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
378*495ae853SAndroid Build Coastguard Worker /*  Processing    : it does a memcpy from source to destination              */
379*495ae853SAndroid Build Coastguard Worker /*                                                                           */
380*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
381*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
382*495ae853SAndroid Build Coastguard Worker /*  Issues        : both buffers are assumed to be 2-D buffers               */
383*495ae853SAndroid Build Coastguard Worker /*                                                                           */
384*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
385*495ae853SAndroid Build Coastguard Worker /*                                                                           */
386*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
387*495ae853SAndroid Build Coastguard Worker /*         29 09 2021   vijayakumar          creation                        */
388*495ae853SAndroid Build Coastguard Worker /*                                                                           */
389*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_copy_data_semiplanr(UWORD8 * pu1_src,WORD32 i4_src_stride,UWORD8 * pu1_dst1,UWORD8 * pu1_dst2,WORD32 i4_dst_stride,WORD32 i4_num_bytes,WORD32 i4_num_lines)390*495ae853SAndroid Build Coastguard Worker void isvcd_copy_data_semiplanr(UWORD8 *pu1_src, WORD32 i4_src_stride, UWORD8 *pu1_dst1,
391*495ae853SAndroid Build Coastguard Worker                                UWORD8 *pu1_dst2, WORD32 i4_dst_stride, WORD32 i4_num_bytes,
392*495ae853SAndroid Build Coastguard Worker                                WORD32 i4_num_lines)
393*495ae853SAndroid Build Coastguard Worker {
394*495ae853SAndroid Build Coastguard Worker     WORD32 i4_vert_lines, u4_i;
395*495ae853SAndroid Build Coastguard Worker 
396*495ae853SAndroid Build Coastguard Worker     /* loop for copy all the lines requried */
397*495ae853SAndroid Build Coastguard Worker     for(i4_vert_lines = 0; i4_vert_lines < i4_num_lines; i4_vert_lines++)
398*495ae853SAndroid Build Coastguard Worker     {
399*495ae853SAndroid Build Coastguard Worker         for(u4_i = 0; u4_i < i4_num_bytes; u4_i++)
400*495ae853SAndroid Build Coastguard Worker         {
401*495ae853SAndroid Build Coastguard Worker             *(pu1_dst1 + u4_i) = *(pu1_src + (2 * u4_i));
402*495ae853SAndroid Build Coastguard Worker             *(pu1_dst2 + u4_i) = *(pu1_src + (2 * u4_i) + 1);
403*495ae853SAndroid Build Coastguard Worker         }
404*495ae853SAndroid Build Coastguard Worker 
405*495ae853SAndroid Build Coastguard Worker         pu1_src += i4_src_stride;
406*495ae853SAndroid Build Coastguard Worker         pu1_dst1 += i4_dst_stride;
407*495ae853SAndroid Build Coastguard Worker         pu1_dst2 += i4_dst_stride;
408*495ae853SAndroid Build Coastguard Worker     }
409*495ae853SAndroid Build Coastguard Worker     return;
410*495ae853SAndroid Build Coastguard Worker }
411*495ae853SAndroid Build Coastguard Worker 
412*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
413*495ae853SAndroid Build Coastguard Worker /*                                                                           */
414*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_get_ref_layer_avlblty_dyadic                        */
415*495ae853SAndroid Build Coastguard Worker /*                                                                           */
416*495ae853SAndroid Build Coastguard Worker /*  Description   : This function is used to find the mb type of the         */
417*495ae853SAndroid Build Coastguard Worker /*                  corresponding MB in the reference layer for dyadic cases */
418*495ae853SAndroid Build Coastguard Worker /*                                                                           */
419*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_intra_samp_ctxt : intra samp context                  */
420*495ae853SAndroid Build Coastguard Worker /*                  pi1_ref_mb_modes : ref mb modes buffer pointer           */
421*495ae853SAndroid Build Coastguard Worker /*                  i4_ref_mode_stride : mb mode buffer stride               */
422*495ae853SAndroid Build Coastguard Worker /*                  i4_ref_mb_x : reference MB location X                    */
423*495ae853SAndroid Build Coastguard Worker /*                  i4_ref_mb_y : reference MB location Y                    */
424*495ae853SAndroid Build Coastguard Worker /*                  pi4_mb_type : pointer to store the mb type               */
425*495ae853SAndroid Build Coastguard Worker /*                  i1_curr_slice_id : slice id of current MB                */
426*495ae853SAndroid Build Coastguard Worker /*                  i1_cons_intr_samp_flag :constrained intra resampling flag*/
427*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
428*495ae853SAndroid Build Coastguard Worker /*  Processing    : it derives the bit corresponding to reference MB and     */
429*495ae853SAndroid Build Coastguard Worker /*                  stores the mbtype as INTRA if the bit is set             */
430*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
431*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
432*495ae853SAndroid Build Coastguard Worker /*                                                                           */
433*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
434*495ae853SAndroid Build Coastguard Worker /*                                                                           */
435*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
436*495ae853SAndroid Build Coastguard Worker /*                                                                           */
437*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
438*495ae853SAndroid Build Coastguard Worker /*         26 09 2021   vijayakumar          creation                        */
439*495ae853SAndroid Build Coastguard Worker /*                                                                           */
440*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_get_ref_layer_avlblty_dyadic(WORD8 * pi1_ref_mb_modes,WORD32 i4_ref_mode_stride,WORD32 i4_element_size,WORD32 i4_ref_mb_x,WORD32 i4_ref_mb_y,WORD32 * pi4_avlblty,WORD8 i1_curr_slice_id,WORD8 i1_cons_intr_samp_flag)441*495ae853SAndroid Build Coastguard Worker void isvcd_get_ref_layer_avlblty_dyadic(WORD8 *pi1_ref_mb_modes, WORD32 i4_ref_mode_stride,
442*495ae853SAndroid Build Coastguard Worker                                         WORD32 i4_element_size, WORD32 i4_ref_mb_x,
443*495ae853SAndroid Build Coastguard Worker                                         WORD32 i4_ref_mb_y, WORD32 *pi4_avlblty,
444*495ae853SAndroid Build Coastguard Worker                                         WORD8 i1_curr_slice_id, WORD8 i1_cons_intr_samp_flag)
445*495ae853SAndroid Build Coastguard Worker {
446*495ae853SAndroid Build Coastguard Worker     inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms;
447*495ae853SAndroid Build Coastguard Worker     WORD8 i1_mb_mode;
448*495ae853SAndroid Build Coastguard Worker 
449*495ae853SAndroid Build Coastguard Worker     /* get the location of the byte which has the current mb mode */
450*495ae853SAndroid Build Coastguard Worker     pi1_ref_mb_modes += (i4_ref_mb_y * i4_ref_mode_stride * i4_element_size);
451*495ae853SAndroid Build Coastguard Worker     pi1_ref_mb_modes += (i4_ref_mb_x * i4_element_size);
452*495ae853SAndroid Build Coastguard Worker     ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes;
453*495ae853SAndroid Build Coastguard Worker     i1_mb_mode = ps_inter_lyr_mb_prms->i1_mb_mode;
454*495ae853SAndroid Build Coastguard Worker 
455*495ae853SAndroid Build Coastguard Worker     if(i1_mb_mode <= SVC_INTER_MB)
456*495ae853SAndroid Build Coastguard Worker     {
457*495ae853SAndroid Build Coastguard Worker         /* INTER */
458*495ae853SAndroid Build Coastguard Worker         *pi4_avlblty = 0;
459*495ae853SAndroid Build Coastguard Worker     }
460*495ae853SAndroid Build Coastguard Worker     else
461*495ae853SAndroid Build Coastguard Worker     {
462*495ae853SAndroid Build Coastguard Worker         /* INTRA */
463*495ae853SAndroid Build Coastguard Worker         *pi4_avlblty = 1;
464*495ae853SAndroid Build Coastguard Worker     }
465*495ae853SAndroid Build Coastguard Worker 
466*495ae853SAndroid Build Coastguard Worker     /* if constrained intra flag is 1 then check for same slice id */
467*495ae853SAndroid Build Coastguard Worker     if(1 == i1_cons_intr_samp_flag)
468*495ae853SAndroid Build Coastguard Worker     {
469*495ae853SAndroid Build Coastguard Worker         if(1 == *pi4_avlblty)
470*495ae853SAndroid Build Coastguard Worker         {
471*495ae853SAndroid Build Coastguard Worker             /* check for different slice idc */
472*495ae853SAndroid Build Coastguard Worker             if(ps_inter_lyr_mb_prms->i1_slice_id != i1_curr_slice_id)
473*495ae853SAndroid Build Coastguard Worker             {
474*495ae853SAndroid Build Coastguard Worker                 /* store the mode as not available for upsampling */
475*495ae853SAndroid Build Coastguard Worker                 *pi4_avlblty = 0;
476*495ae853SAndroid Build Coastguard Worker             }
477*495ae853SAndroid Build Coastguard Worker         }
478*495ae853SAndroid Build Coastguard Worker     }
479*495ae853SAndroid Build Coastguard Worker }
480*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
481*495ae853SAndroid Build Coastguard Worker /*                                                                           */
482*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_diagonal_construct_dyadic                           */
483*495ae853SAndroid Build Coastguard Worker /*                                                                           */
484*495ae853SAndroid Build Coastguard Worker /*  Description   : This function fills the unavaible pixels in the reference*/
485*495ae853SAndroid Build Coastguard Worker /*                    array with diagonally constructed samples              */
486*495ae853SAndroid Build Coastguard Worker /*  Inputs        : i4_x :current position in reference array X to be filled */
487*495ae853SAndroid Build Coastguard Worker /*                  i4_y :current position in reference array Y to be filled */
488*495ae853SAndroid Build Coastguard Worker /*                  i4_xd_index : diagonal index in horizontal direction     */
489*495ae853SAndroid Build Coastguard Worker /*                  i4_yd_index : diagonal index in vertical direction       */
490*495ae853SAndroid Build Coastguard Worker /*                  pu1_refarray : popinter to reference array               */
491*495ae853SAndroid Build Coastguard Worker /*                  i4_refarray_wd: width of the reference array             */
492*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
493*495ae853SAndroid Build Coastguard Worker /*  Processing    : Fills the sample which is unavailable with filtered      */
494*495ae853SAndroid Build Coastguard Worker /*                    diagonal samples                                       */
495*495ae853SAndroid Build Coastguard Worker /*  Outputs       : pixel filled                                             */
496*495ae853SAndroid Build Coastguard Worker /*  Returns       : constructed pixel                                        */
497*495ae853SAndroid Build Coastguard Worker /*                                                                           */
498*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
499*495ae853SAndroid Build Coastguard Worker /*                                                                           */
500*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
501*495ae853SAndroid Build Coastguard Worker /*                                                                           */
502*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
503*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         creation                             */
504*495ae853SAndroid Build Coastguard Worker /*                                                                           */
505*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_diagonal_construct_dyadic(WORD32 i4_x,WORD32 i4_y,WORD32 i4_xd_index,WORD32 i4_yd_index,UWORD8 * pu1_refarray,WORD32 i4_refarray_wd)506*495ae853SAndroid Build Coastguard Worker UWORD8 isvcd_diagonal_construct_dyadic(WORD32 i4_x, WORD32 i4_y, WORD32 i4_xd_index,
507*495ae853SAndroid Build Coastguard Worker                                        WORD32 i4_yd_index, UWORD8 *pu1_refarray,
508*495ae853SAndroid Build Coastguard Worker                                        WORD32 i4_refarray_wd)
509*495ae853SAndroid Build Coastguard Worker {
510*495ae853SAndroid Build Coastguard Worker     WORD32 i4_diff_hor_ver, i4_sgn_xy;
511*495ae853SAndroid Build Coastguard Worker     WORD32 i4_xc, i4_yc;
512*495ae853SAndroid Build Coastguard Worker     WORD32 i4_samp1, i4_samp2, i4_samp3;
513*495ae853SAndroid Build Coastguard Worker     WORD32 i4_result;
514*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_tmp;
515*495ae853SAndroid Build Coastguard Worker 
516*495ae853SAndroid Build Coastguard Worker     i4_diff_hor_ver = ABS(i4_xd_index) - ABS(i4_yd_index);
517*495ae853SAndroid Build Coastguard Worker     i4_sgn_xy = SIGN(i4_xd_index * i4_yd_index);
518*495ae853SAndroid Build Coastguard Worker 
519*495ae853SAndroid Build Coastguard Worker     if(i4_diff_hor_ver > 0)
520*495ae853SAndroid Build Coastguard Worker     {
521*495ae853SAndroid Build Coastguard Worker         i4_xc = i4_x - (i4_sgn_xy * i4_yd_index);
522*495ae853SAndroid Build Coastguard Worker         i4_yc = i4_y - i4_yd_index;
523*495ae853SAndroid Build Coastguard Worker         pu1_tmp = pu1_refarray + (i4_yc * i4_refarray_wd);
524*495ae853SAndroid Build Coastguard Worker         i4_samp1 = pu1_tmp[i4_xc - 1];
525*495ae853SAndroid Build Coastguard Worker         i4_samp2 = pu1_tmp[i4_xc];
526*495ae853SAndroid Build Coastguard Worker         i4_samp3 = pu1_tmp[i4_xc + 1];
527*495ae853SAndroid Build Coastguard Worker     }
528*495ae853SAndroid Build Coastguard Worker     else if(i4_diff_hor_ver < 0)
529*495ae853SAndroid Build Coastguard Worker     {
530*495ae853SAndroid Build Coastguard Worker         i4_xc = i4_x - i4_xd_index;
531*495ae853SAndroid Build Coastguard Worker         i4_yc = i4_y - (i4_sgn_xy * i4_xd_index);
532*495ae853SAndroid Build Coastguard Worker         pu1_tmp = pu1_refarray + ((i4_yc - 1) * i4_refarray_wd);
533*495ae853SAndroid Build Coastguard Worker         i4_samp1 = pu1_tmp[i4_xc];
534*495ae853SAndroid Build Coastguard Worker         pu1_tmp += i4_refarray_wd;
535*495ae853SAndroid Build Coastguard Worker         i4_samp2 = pu1_tmp[i4_xc];
536*495ae853SAndroid Build Coastguard Worker         pu1_tmp += i4_refarray_wd;
537*495ae853SAndroid Build Coastguard Worker         i4_samp3 = pu1_tmp[i4_xc];
538*495ae853SAndroid Build Coastguard Worker     }
539*495ae853SAndroid Build Coastguard Worker     else
540*495ae853SAndroid Build Coastguard Worker     {
541*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ref_xd, i4_ref_yd;
542*495ae853SAndroid Build Coastguard Worker 
543*495ae853SAndroid Build Coastguard Worker         i4_ref_xd = i4_x - i4_xd_index;
544*495ae853SAndroid Build Coastguard Worker         i4_ref_yd = i4_y - i4_yd_index;
545*495ae853SAndroid Build Coastguard Worker         i4_xc = i4_ref_xd + SIGN(i4_xd_index);
546*495ae853SAndroid Build Coastguard Worker         i4_yc = i4_ref_yd + SIGN(i4_yd_index);
547*495ae853SAndroid Build Coastguard Worker         pu1_tmp = pu1_refarray + (i4_ref_yd * i4_refarray_wd);
548*495ae853SAndroid Build Coastguard Worker         i4_samp1 = pu1_tmp[i4_xc];
549*495ae853SAndroid Build Coastguard Worker         i4_samp2 = pu1_tmp[i4_ref_xd];
550*495ae853SAndroid Build Coastguard Worker         pu1_tmp = pu1_refarray + (i4_yc * i4_refarray_wd);
551*495ae853SAndroid Build Coastguard Worker         i4_samp3 = pu1_tmp[i4_ref_xd];
552*495ae853SAndroid Build Coastguard Worker     }
553*495ae853SAndroid Build Coastguard Worker 
554*495ae853SAndroid Build Coastguard Worker     i4_result = (i4_samp1 + (i4_samp2 << 1) + i4_samp3 + 2) >> 2;
555*495ae853SAndroid Build Coastguard Worker     pu1_tmp = pu1_refarray + (i4_y * i4_refarray_wd);
556*495ae853SAndroid Build Coastguard Worker     /* Store the filled sample */
557*495ae853SAndroid Build Coastguard Worker     pu1_tmp[i4_x] = i4_result;
558*495ae853SAndroid Build Coastguard Worker 
559*495ae853SAndroid Build Coastguard Worker     return (i4_result);
560*495ae853SAndroid Build Coastguard Worker }
561*495ae853SAndroid Build Coastguard Worker 
562*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
563*495ae853SAndroid Build Coastguard Worker /*                                                                           */
564*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_left_right_padding                                  */
565*495ae853SAndroid Build Coastguard Worker /*  Description   :  This function does the left/right padding for intra     */
566*495ae853SAndroid Build Coastguard Worker /*                      upsampling                                           */
567*495ae853SAndroid Build Coastguard Worker /*                                                                           */
568*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
569*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
570*495ae853SAndroid Build Coastguard Worker /*  Processing    : This function does the left/right padding for intra      */
571*495ae853SAndroid Build Coastguard Worker /*                      upsampling                                           */
572*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
573*495ae853SAndroid Build Coastguard Worker /*  Returns       : number of leading zeroes                                 */
574*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
575*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
576*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
577*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay                creation                        */
578*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_left_right_padding(WORD32 i4_x,WORD32 i4_y,WORD8 i1_xd_index,WORD8 i1_yd_index,UWORD8 u1_seg_wd,UWORD8 u1_seg_ht,UWORD8 * pu1_refarray_1,UWORD8 * pu1_refarray_2,WORD32 i4_refarray_stride,WORD32 i4_mb_adjoin_x,WORD32 i4_mb_adjoin_y,WORD32 i4_corner_pixel_available)579*495ae853SAndroid Build Coastguard Worker void isvcd_left_right_padding(WORD32 i4_x, WORD32 i4_y, WORD8 i1_xd_index, WORD8 i1_yd_index,
580*495ae853SAndroid Build Coastguard Worker                               UWORD8 u1_seg_wd, UWORD8 u1_seg_ht, UWORD8 *pu1_refarray_1,
581*495ae853SAndroid Build Coastguard Worker                               UWORD8 *pu1_refarray_2, WORD32 i4_refarray_stride,
582*495ae853SAndroid Build Coastguard Worker                               WORD32 i4_mb_adjoin_x, WORD32 i4_mb_adjoin_y,
583*495ae853SAndroid Build Coastguard Worker                               WORD32 i4_corner_pixel_available)
584*495ae853SAndroid Build Coastguard Worker {
585*495ae853SAndroid Build Coastguard Worker     WORD32 i4_idx_i;
586*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src, *pu1_dst;
587*495ae853SAndroid Build Coastguard Worker 
588*495ae853SAndroid Build Coastguard Worker     UNUSED(i1_yd_index);
589*495ae853SAndroid Build Coastguard Worker     UNUSED(pu1_refarray_2);
590*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_mb_adjoin_x);
591*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_mb_adjoin_y);
592*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_corner_pixel_available);
593*495ae853SAndroid Build Coastguard Worker 
594*495ae853SAndroid Build Coastguard Worker     pu1_dst = pu1_refarray_1 + i4_x + (i4_y * i4_refarray_stride);
595*495ae853SAndroid Build Coastguard Worker     pu1_src = pu1_dst + i1_xd_index;
596*495ae853SAndroid Build Coastguard Worker     i1_xd_index = MIN(i1_xd_index, MAX_PIX_FILL_LUMA);
597*495ae853SAndroid Build Coastguard Worker     u1_seg_wd = MIN(u1_seg_wd, MAX_PIX_FILL_LUMA);
598*495ae853SAndroid Build Coastguard Worker     pu1_dst = pu1_src - i1_xd_index;
599*495ae853SAndroid Build Coastguard Worker 
600*495ae853SAndroid Build Coastguard Worker     for(i4_idx_i = 0; i4_idx_i < u1_seg_ht; i4_idx_i++)
601*495ae853SAndroid Build Coastguard Worker     {
602*495ae853SAndroid Build Coastguard Worker         memset(pu1_dst, *pu1_src, u1_seg_wd);
603*495ae853SAndroid Build Coastguard Worker         pu1_dst += i4_refarray_stride;
604*495ae853SAndroid Build Coastguard Worker         pu1_src += i4_refarray_stride;
605*495ae853SAndroid Build Coastguard Worker     }
606*495ae853SAndroid Build Coastguard Worker }
607*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
608*495ae853SAndroid Build Coastguard Worker /*                                                                           */
609*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_left_right_padding_chroma                           */
610*495ae853SAndroid Build Coastguard Worker /*  Description   :  This function does the left/right padding for intra     */
611*495ae853SAndroid Build Coastguard Worker /*                      upsampling for chroma                                */
612*495ae853SAndroid Build Coastguard Worker /*                                                                           */
613*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
614*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
615*495ae853SAndroid Build Coastguard Worker /*  Processing    : This function does the left/right padding for intra      */
616*495ae853SAndroid Build Coastguard Worker /*                      upsampling for chroma                                */
617*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
618*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
619*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
620*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
621*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
622*495ae853SAndroid Build Coastguard Worker /*         06 09 2011   Vijay                creation                        */
623*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_left_right_padding_chroma(WORD32 i4_x,WORD32 i4_y,WORD8 i1_xd_index,WORD8 i1_yd_index,UWORD8 u1_seg_wd,UWORD8 u1_seg_ht,UWORD8 * pu1_refarray_1,UWORD8 * pu1_refarray_2,WORD32 i4_refarray_stride,WORD32 i4_mb_adjoin_x,WORD32 i4_mb_adjoin_y,WORD32 i4_corner_pixel_available)624*495ae853SAndroid Build Coastguard Worker void isvcd_left_right_padding_chroma(WORD32 i4_x, WORD32 i4_y, WORD8 i1_xd_index, WORD8 i1_yd_index,
625*495ae853SAndroid Build Coastguard Worker                                      UWORD8 u1_seg_wd, UWORD8 u1_seg_ht, UWORD8 *pu1_refarray_1,
626*495ae853SAndroid Build Coastguard Worker                                      UWORD8 *pu1_refarray_2, WORD32 i4_refarray_stride,
627*495ae853SAndroid Build Coastguard Worker                                      WORD32 i4_mb_adjoin_x, WORD32 i4_mb_adjoin_y,
628*495ae853SAndroid Build Coastguard Worker                                      WORD32 i4_corner_pixel_available)
629*495ae853SAndroid Build Coastguard Worker {
630*495ae853SAndroid Build Coastguard Worker     WORD32 i4_idx_i;
631*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_cb, *pu1_dst_cb;
632*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_cr, *pu1_dst_cr;
633*495ae853SAndroid Build Coastguard Worker     WORD32 i4_tmp;
634*495ae853SAndroid Build Coastguard Worker 
635*495ae853SAndroid Build Coastguard Worker     UNUSED(i1_yd_index);
636*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_mb_adjoin_x);
637*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_mb_adjoin_y);
638*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_corner_pixel_available);
639*495ae853SAndroid Build Coastguard Worker 
640*495ae853SAndroid Build Coastguard Worker     i4_tmp = i4_x + (i4_y * i4_refarray_stride);
641*495ae853SAndroid Build Coastguard Worker     pu1_dst_cb = pu1_refarray_1 + i4_tmp;
642*495ae853SAndroid Build Coastguard Worker     pu1_src_cb = pu1_dst_cb + i1_xd_index;
643*495ae853SAndroid Build Coastguard Worker     pu1_dst_cr = pu1_refarray_2 + i4_tmp;
644*495ae853SAndroid Build Coastguard Worker     pu1_src_cr = pu1_dst_cr + i1_xd_index;
645*495ae853SAndroid Build Coastguard Worker 
646*495ae853SAndroid Build Coastguard Worker     i1_xd_index = MIN(i1_xd_index, MAX_PIX_FILL_CHROMA);
647*495ae853SAndroid Build Coastguard Worker     u1_seg_wd = MIN(u1_seg_wd, MAX_PIX_FILL_CHROMA);
648*495ae853SAndroid Build Coastguard Worker     pu1_dst_cb = pu1_src_cb - i1_xd_index;
649*495ae853SAndroid Build Coastguard Worker     pu1_dst_cr = pu1_src_cr - i1_xd_index;
650*495ae853SAndroid Build Coastguard Worker 
651*495ae853SAndroid Build Coastguard Worker     for(i4_idx_i = 0; i4_idx_i < u1_seg_ht; i4_idx_i++)
652*495ae853SAndroid Build Coastguard Worker     {
653*495ae853SAndroid Build Coastguard Worker         memset(pu1_dst_cb, *pu1_src_cb, u1_seg_wd);
654*495ae853SAndroid Build Coastguard Worker         pu1_dst_cb += i4_refarray_stride;
655*495ae853SAndroid Build Coastguard Worker         pu1_src_cb += i4_refarray_stride;
656*495ae853SAndroid Build Coastguard Worker         memset(pu1_dst_cr, *pu1_src_cr, u1_seg_wd);
657*495ae853SAndroid Build Coastguard Worker         pu1_dst_cr += i4_refarray_stride;
658*495ae853SAndroid Build Coastguard Worker         pu1_src_cr += i4_refarray_stride;
659*495ae853SAndroid Build Coastguard Worker     }
660*495ae853SAndroid Build Coastguard Worker }
661*495ae853SAndroid Build Coastguard Worker 
662*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
663*495ae853SAndroid Build Coastguard Worker /*                                                                           */
664*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_top_bot_padding                                     */
665*495ae853SAndroid Build Coastguard Worker /*  Description   :  This function does the top/bottom padding for intra     */
666*495ae853SAndroid Build Coastguard Worker /*                      upsampling for chroma                                */
667*495ae853SAndroid Build Coastguard Worker /*                                                                           */
668*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
669*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
670*495ae853SAndroid Build Coastguard Worker /*  Processing    : This function does the top/bottom padding for intra      */
671*495ae853SAndroid Build Coastguard Worker /*                      upsampling for chroma                                */
672*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
673*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
674*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
675*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
676*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
677*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay                creation                        */
678*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_top_bot_padding(WORD32 i4_x,WORD32 i4_y,WORD8 i1_xd_index,WORD8 i1_yd_index,UWORD8 u1_seg_wd,UWORD8 u1_seg_ht,UWORD8 * pu1_refarray_1,UWORD8 * pu1_refarray_2,WORD32 i4_refarray_stride,WORD32 i4_mb_adjoin_x,WORD32 i4_mb_adjoin_y,WORD32 i4_corner_pixel_available)679*495ae853SAndroid Build Coastguard Worker void isvcd_top_bot_padding(WORD32 i4_x, WORD32 i4_y, WORD8 i1_xd_index, WORD8 i1_yd_index,
680*495ae853SAndroid Build Coastguard Worker                            UWORD8 u1_seg_wd, UWORD8 u1_seg_ht, UWORD8 *pu1_refarray_1,
681*495ae853SAndroid Build Coastguard Worker                            UWORD8 *pu1_refarray_2, WORD32 i4_refarray_stride, WORD32 i4_mb_adjoin_x,
682*495ae853SAndroid Build Coastguard Worker                            WORD32 i4_mb_adjoin_y, WORD32 i4_corner_pixel_available)
683*495ae853SAndroid Build Coastguard Worker {
684*495ae853SAndroid Build Coastguard Worker     WORD32 i4_idx_i;
685*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src, *pu1_dst;
686*495ae853SAndroid Build Coastguard Worker 
687*495ae853SAndroid Build Coastguard Worker     UNUSED(i1_xd_index);
688*495ae853SAndroid Build Coastguard Worker     UNUSED(pu1_refarray_2);
689*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_mb_adjoin_x);
690*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_mb_adjoin_y);
691*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_corner_pixel_available);
692*495ae853SAndroid Build Coastguard Worker 
693*495ae853SAndroid Build Coastguard Worker     pu1_dst = pu1_refarray_1 + i4_x + (i4_y * i4_refarray_stride);
694*495ae853SAndroid Build Coastguard Worker     pu1_src = pu1_dst + (i1_yd_index * i4_refarray_stride);
695*495ae853SAndroid Build Coastguard Worker     i1_yd_index = MIN(i1_yd_index, MAX_PIX_FILL_LUMA);
696*495ae853SAndroid Build Coastguard Worker     u1_seg_ht = MIN(u1_seg_ht, MAX_PIX_FILL_LUMA);
697*495ae853SAndroid Build Coastguard Worker     pu1_dst = pu1_src - (i1_yd_index * i4_refarray_stride);
698*495ae853SAndroid Build Coastguard Worker 
699*495ae853SAndroid Build Coastguard Worker     for(i4_idx_i = 0; i4_idx_i < u1_seg_ht; i4_idx_i++)
700*495ae853SAndroid Build Coastguard Worker     {
701*495ae853SAndroid Build Coastguard Worker         memcpy(pu1_dst, pu1_src, u1_seg_wd);
702*495ae853SAndroid Build Coastguard Worker         pu1_dst += i4_refarray_stride;
703*495ae853SAndroid Build Coastguard Worker     }
704*495ae853SAndroid Build Coastguard Worker }
705*495ae853SAndroid Build Coastguard Worker 
706*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
707*495ae853SAndroid Build Coastguard Worker /*                                                                           */
708*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_top_bot_padding                                     */
709*495ae853SAndroid Build Coastguard Worker /*  Description   :  This function does the top/bottom padding for intra     */
710*495ae853SAndroid Build Coastguard Worker /*                      upsampling for chroma                                */
711*495ae853SAndroid Build Coastguard Worker /*                                                                           */
712*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
713*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
714*495ae853SAndroid Build Coastguard Worker /*  Processing    : This function does the top/bottom padding for intra      */
715*495ae853SAndroid Build Coastguard Worker /*                      upsampling for chroma                                */
716*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
717*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
718*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
719*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
720*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
721*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay                creation                        */
722*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_top_bot_padding_chroma(WORD32 i4_x,WORD32 i4_y,WORD8 i1_xd_index,WORD8 i1_yd_index,UWORD8 u1_seg_wd,UWORD8 u1_seg_ht,UWORD8 * pu1_refarray_1,UWORD8 * pu1_refarray_2,WORD32 i4_refarray_stride,WORD32 i4_mb_adjoin_x,WORD32 i4_mb_adjoin_y,WORD32 i4_corner_pixel_available)723*495ae853SAndroid Build Coastguard Worker void isvcd_top_bot_padding_chroma(WORD32 i4_x, WORD32 i4_y, WORD8 i1_xd_index, WORD8 i1_yd_index,
724*495ae853SAndroid Build Coastguard Worker                                   UWORD8 u1_seg_wd, UWORD8 u1_seg_ht, UWORD8 *pu1_refarray_1,
725*495ae853SAndroid Build Coastguard Worker                                   UWORD8 *pu1_refarray_2, WORD32 i4_refarray_stride,
726*495ae853SAndroid Build Coastguard Worker                                   WORD32 i4_mb_adjoin_x, WORD32 i4_mb_adjoin_y,
727*495ae853SAndroid Build Coastguard Worker                                   WORD32 i4_corner_pixel_available)
728*495ae853SAndroid Build Coastguard Worker {
729*495ae853SAndroid Build Coastguard Worker     WORD32 i4_idx_i;
730*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_cb, *pu1_dst_cb;
731*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_cr, *pu1_dst_cr;
732*495ae853SAndroid Build Coastguard Worker     WORD32 i4_tmp;
733*495ae853SAndroid Build Coastguard Worker 
734*495ae853SAndroid Build Coastguard Worker     UNUSED(i1_xd_index);
735*495ae853SAndroid Build Coastguard Worker     UNUSED(pu1_refarray_2);
736*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_mb_adjoin_x);
737*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_mb_adjoin_y);
738*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_corner_pixel_available);
739*495ae853SAndroid Build Coastguard Worker 
740*495ae853SAndroid Build Coastguard Worker     i4_tmp = i4_x + (i4_y * i4_refarray_stride);
741*495ae853SAndroid Build Coastguard Worker     pu1_dst_cb = pu1_refarray_1 + i4_tmp;
742*495ae853SAndroid Build Coastguard Worker     pu1_dst_cr = pu1_refarray_2 + i4_tmp;
743*495ae853SAndroid Build Coastguard Worker 
744*495ae853SAndroid Build Coastguard Worker     i4_tmp = (i1_yd_index * i4_refarray_stride);
745*495ae853SAndroid Build Coastguard Worker     pu1_src_cb = pu1_dst_cb + i4_tmp;
746*495ae853SAndroid Build Coastguard Worker     pu1_src_cr = pu1_dst_cr + i4_tmp;
747*495ae853SAndroid Build Coastguard Worker     i1_yd_index = MIN(i1_yd_index, MAX_PIX_FILL_CHROMA);
748*495ae853SAndroid Build Coastguard Worker     u1_seg_ht = MIN(u1_seg_ht, MAX_PIX_FILL_CHROMA);
749*495ae853SAndroid Build Coastguard Worker 
750*495ae853SAndroid Build Coastguard Worker     i4_tmp = (i1_yd_index * i4_refarray_stride);
751*495ae853SAndroid Build Coastguard Worker     pu1_dst_cb = pu1_src_cb - i4_tmp;
752*495ae853SAndroid Build Coastguard Worker     pu1_dst_cr = pu1_src_cr - i4_tmp;
753*495ae853SAndroid Build Coastguard Worker 
754*495ae853SAndroid Build Coastguard Worker     for(i4_idx_i = 0; i4_idx_i < u1_seg_ht; i4_idx_i++)
755*495ae853SAndroid Build Coastguard Worker     {
756*495ae853SAndroid Build Coastguard Worker         memcpy(pu1_dst_cb, pu1_src_cb, u1_seg_wd);
757*495ae853SAndroid Build Coastguard Worker         pu1_dst_cb += i4_refarray_stride;
758*495ae853SAndroid Build Coastguard Worker         memcpy(pu1_dst_cr, pu1_src_cr, u1_seg_wd);
759*495ae853SAndroid Build Coastguard Worker         pu1_dst_cr += i4_refarray_stride;
760*495ae853SAndroid Build Coastguard Worker     }
761*495ae853SAndroid Build Coastguard Worker }
762*495ae853SAndroid Build Coastguard Worker 
763*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
764*495ae853SAndroid Build Coastguard Worker /*                                                                           */
765*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_diag_reconstruction                                 */
766*495ae853SAndroid Build Coastguard Worker /*  Description   :  This function does the diagonal reconstuction for intra */
767*495ae853SAndroid Build Coastguard Worker /*                      upsampling for luma                                  */
768*495ae853SAndroid Build Coastguard Worker /*                                                                           */
769*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
770*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
771*495ae853SAndroid Build Coastguard Worker /*  Processing    : This function does the diagonal reconstruction for intra */
772*495ae853SAndroid Build Coastguard Worker /*                      upsampling for luma                                  */
773*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
774*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
775*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
776*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
777*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
778*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay                creation                        */
779*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_diag_reconstruction(WORD32 i4_x,WORD32 i4_y,WORD8 i1_xd_index,WORD8 i1_yd_index,UWORD8 u1_seg_wd,UWORD8 u1_seg_ht,UWORD8 * pu1_refarray_1,UWORD8 * pu1_refarray_2,WORD32 i4_refarray_stride,WORD32 i4_mb_adjoin_x,WORD32 i4_mb_adjoin_y,WORD32 i4_corner_pixel_available)780*495ae853SAndroid Build Coastguard Worker void isvcd_diag_reconstruction(WORD32 i4_x, WORD32 i4_y, WORD8 i1_xd_index, WORD8 i1_yd_index,
781*495ae853SAndroid Build Coastguard Worker                                UWORD8 u1_seg_wd, UWORD8 u1_seg_ht, UWORD8 *pu1_refarray_1,
782*495ae853SAndroid Build Coastguard Worker                                UWORD8 *pu1_refarray_2, WORD32 i4_refarray_stride,
783*495ae853SAndroid Build Coastguard Worker                                WORD32 i4_mb_adjoin_x, WORD32 i4_mb_adjoin_y,
784*495ae853SAndroid Build Coastguard Worker                                WORD32 i4_corner_pixel_available)
785*495ae853SAndroid Build Coastguard Worker {
786*495ae853SAndroid Build Coastguard Worker     WORD32 i4_i;
787*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_1, *pu1_src_2, *pu1_dst;
788*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_filter_delay_buf[18] = {0};
789*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_out_buf[16] = {0};
790*495ae853SAndroid Build Coastguard Worker     WORD32 i4_width, i4_height;
791*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x_off, i4_y_off;
792*495ae853SAndroid Build Coastguard Worker     WORD32 i4_block_size = BLOCK_WIDTH;
793*495ae853SAndroid Build Coastguard Worker 
794*495ae853SAndroid Build Coastguard Worker     UNUSED(pu1_refarray_2);
795*495ae853SAndroid Build Coastguard Worker 
796*495ae853SAndroid Build Coastguard Worker     pu1_dst = pu1_refarray_1 + i4_x + (i4_y * i4_refarray_stride);
797*495ae853SAndroid Build Coastguard Worker     pu1_src_1 = pu1_dst + i1_xd_index;
798*495ae853SAndroid Build Coastguard Worker     pu1_src_2 = pu1_dst + (i1_yd_index * i4_refarray_stride);
799*495ae853SAndroid Build Coastguard Worker 
800*495ae853SAndroid Build Coastguard Worker     i4_width = MAX(u1_seg_wd, (((i4_mb_adjoin_x >> 3) ^ 1) * i4_block_size));
801*495ae853SAndroid Build Coastguard Worker     i4_height = MAX(u1_seg_ht, (((i4_mb_adjoin_y >> 4) ^ 1) * i4_block_size));
802*495ae853SAndroid Build Coastguard Worker     i4_x_off = (i4_width - u1_seg_wd);
803*495ae853SAndroid Build Coastguard Worker     i4_y_off = (i4_height - u1_seg_ht);
804*495ae853SAndroid Build Coastguard Worker 
805*495ae853SAndroid Build Coastguard Worker     if(i1_xd_index < 0 && i1_yd_index > 0)
806*495ae853SAndroid Build Coastguard Worker     {
807*495ae853SAndroid Build Coastguard Worker         /* Quadrant 1 Processing load the pixel in the filter delay buffer */
808*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (i4_height + 1); i4_i++)
809*495ae853SAndroid Build Coastguard Worker         {
810*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf[i4_i] = *pu1_src_1;
811*495ae853SAndroid Build Coastguard Worker             pu1_src_1 += i4_refarray_stride;
812*495ae853SAndroid Build Coastguard Worker         }
813*495ae853SAndroid Build Coastguard Worker 
814*495ae853SAndroid Build Coastguard Worker         pu1_src_2 -= i4_x_off;
815*495ae853SAndroid Build Coastguard Worker         memcpy(&u1_filter_delay_buf[i4_i], pu1_src_2, i4_width);
816*495ae853SAndroid Build Coastguard Worker 
817*495ae853SAndroid Build Coastguard Worker         if(0 == i4_corner_pixel_available)
818*495ae853SAndroid Build Coastguard Worker         {
819*495ae853SAndroid Build Coastguard Worker             /* interpolate the unavailable corner pixel */
820*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf[i4_i - 1] =
821*495ae853SAndroid Build Coastguard Worker                 (u1_filter_delay_buf[i4_i] + u1_filter_delay_buf[i4_i - 2] + 1) >> 1;
822*495ae853SAndroid Build Coastguard Worker         }
823*495ae853SAndroid Build Coastguard Worker 
824*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (i4_width + i4_height - 1); i4_i++)
825*495ae853SAndroid Build Coastguard Worker         {
826*495ae853SAndroid Build Coastguard Worker             /* get the filtered output */
827*495ae853SAndroid Build Coastguard Worker             u1_out_buf[i4_i] = ((u1_filter_delay_buf[i4_i]) + (u1_filter_delay_buf[i4_i + 1] * 2) +
828*495ae853SAndroid Build Coastguard Worker                                 (u1_filter_delay_buf[i4_i + 2]) + 2) >>
829*495ae853SAndroid Build Coastguard Worker                                2;
830*495ae853SAndroid Build Coastguard Worker         }
831*495ae853SAndroid Build Coastguard Worker 
832*495ae853SAndroid Build Coastguard Worker         /* fill the segment with diagonal reconstructed output */
833*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < u1_seg_ht; i4_i++)
834*495ae853SAndroid Build Coastguard Worker         {
835*495ae853SAndroid Build Coastguard Worker             memcpy(pu1_dst, &u1_out_buf[i4_x_off + i4_i], u1_seg_wd);
836*495ae853SAndroid Build Coastguard Worker             pu1_dst += i4_refarray_stride;
837*495ae853SAndroid Build Coastguard Worker         }
838*495ae853SAndroid Build Coastguard Worker     }
839*495ae853SAndroid Build Coastguard Worker     else if(i1_xd_index > 0 && i1_yd_index > 0)
840*495ae853SAndroid Build Coastguard Worker     {
841*495ae853SAndroid Build Coastguard Worker         /* Quadrant 2 Processing */
842*495ae853SAndroid Build Coastguard Worker         /* load the pixel in the filter delay buffer  */
843*495ae853SAndroid Build Coastguard Worker         memcpy(&u1_filter_delay_buf[0], pu1_src_2, (i4_width + 1));
844*495ae853SAndroid Build Coastguard Worker         for(i4_i = i4_height; i4_i > 0; i4_i--)
845*495ae853SAndroid Build Coastguard Worker         {
846*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf[i4_width + i4_i] = *pu1_src_1;
847*495ae853SAndroid Build Coastguard Worker             pu1_src_1 += i4_refarray_stride;
848*495ae853SAndroid Build Coastguard Worker         }
849*495ae853SAndroid Build Coastguard Worker 
850*495ae853SAndroid Build Coastguard Worker         if(0 == i4_corner_pixel_available)
851*495ae853SAndroid Build Coastguard Worker         {
852*495ae853SAndroid Build Coastguard Worker             /* interpolate the unavailable corner pixel */
853*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf[i4_width] =
854*495ae853SAndroid Build Coastguard Worker                 (u1_filter_delay_buf[i4_width - 1] + u1_filter_delay_buf[i4_width + 1] + 1) >> 1;
855*495ae853SAndroid Build Coastguard Worker         }
856*495ae853SAndroid Build Coastguard Worker 
857*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (i4_width + i4_height - 1); i4_i++)
858*495ae853SAndroid Build Coastguard Worker         {
859*495ae853SAndroid Build Coastguard Worker             /* get the filtered output */
860*495ae853SAndroid Build Coastguard Worker             u1_out_buf[i4_i] = ((u1_filter_delay_buf[i4_i]) + (u1_filter_delay_buf[i4_i + 1] * 2) +
861*495ae853SAndroid Build Coastguard Worker                                 (u1_filter_delay_buf[i4_i + 2]) + 2) >>
862*495ae853SAndroid Build Coastguard Worker                                2;
863*495ae853SAndroid Build Coastguard Worker         }
864*495ae853SAndroid Build Coastguard Worker 
865*495ae853SAndroid Build Coastguard Worker         /* fill the segment with diagonal reconstructed output */
866*495ae853SAndroid Build Coastguard Worker         for(i4_i = 1; i4_i <= u1_seg_ht; i4_i++)
867*495ae853SAndroid Build Coastguard Worker         {
868*495ae853SAndroid Build Coastguard Worker             memcpy(pu1_dst, &u1_out_buf[i4_height - i4_i], u1_seg_wd);
869*495ae853SAndroid Build Coastguard Worker             pu1_dst += i4_refarray_stride;
870*495ae853SAndroid Build Coastguard Worker         }
871*495ae853SAndroid Build Coastguard Worker     }
872*495ae853SAndroid Build Coastguard Worker     else if(i1_xd_index > 0 && i1_yd_index < 0)
873*495ae853SAndroid Build Coastguard Worker     {
874*495ae853SAndroid Build Coastguard Worker         /* Quadrant 3 Processing */
875*495ae853SAndroid Build Coastguard Worker         /* load the pixel in the filter delay buffer  */
876*495ae853SAndroid Build Coastguard Worker         memcpy(&u1_filter_delay_buf[0], pu1_src_2, (i4_width + 1));
877*495ae853SAndroid Build Coastguard Worker 
878*495ae853SAndroid Build Coastguard Worker         pu1_src_1 -= (i4_y_off * i4_refarray_stride);
879*495ae853SAndroid Build Coastguard Worker         for(i4_i = 1; i4_i <= i4_height; i4_i++)
880*495ae853SAndroid Build Coastguard Worker         {
881*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf[i4_width + i4_i] = *pu1_src_1;
882*495ae853SAndroid Build Coastguard Worker             pu1_src_1 += i4_refarray_stride;
883*495ae853SAndroid Build Coastguard Worker         }
884*495ae853SAndroid Build Coastguard Worker 
885*495ae853SAndroid Build Coastguard Worker         if(0 == i4_corner_pixel_available)
886*495ae853SAndroid Build Coastguard Worker         {
887*495ae853SAndroid Build Coastguard Worker             /* interpolate the unavailable corner pixel */
888*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf[i4_width] =
889*495ae853SAndroid Build Coastguard Worker                 (u1_filter_delay_buf[i4_width - 1] + u1_filter_delay_buf[i4_width + 1] + 1) >> 1;
890*495ae853SAndroid Build Coastguard Worker         }
891*495ae853SAndroid Build Coastguard Worker 
892*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (i4_width + i4_height - 1); i4_i++)
893*495ae853SAndroid Build Coastguard Worker         {
894*495ae853SAndroid Build Coastguard Worker             /* get the filtered output */
895*495ae853SAndroid Build Coastguard Worker             u1_out_buf[i4_i] = ((u1_filter_delay_buf[i4_i]) + (u1_filter_delay_buf[i4_i + 1] * 2) +
896*495ae853SAndroid Build Coastguard Worker                                 (u1_filter_delay_buf[i4_i + 2]) + 2) >>
897*495ae853SAndroid Build Coastguard Worker                                2;
898*495ae853SAndroid Build Coastguard Worker         }
899*495ae853SAndroid Build Coastguard Worker 
900*495ae853SAndroid Build Coastguard Worker         /* fill the segment with diagonal reconstructed output */
901*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < u1_seg_ht; i4_i++)
902*495ae853SAndroid Build Coastguard Worker         {
903*495ae853SAndroid Build Coastguard Worker             memcpy(pu1_dst, &u1_out_buf[i4_y_off + i4_i], u1_seg_wd);
904*495ae853SAndroid Build Coastguard Worker             pu1_dst += i4_refarray_stride;
905*495ae853SAndroid Build Coastguard Worker         }
906*495ae853SAndroid Build Coastguard Worker     }
907*495ae853SAndroid Build Coastguard Worker     else
908*495ae853SAndroid Build Coastguard Worker     {
909*495ae853SAndroid Build Coastguard Worker         /* Quadrant 4 Processing */
910*495ae853SAndroid Build Coastguard Worker         /* load the pixel in the filter delay buffer  */
911*495ae853SAndroid Build Coastguard Worker         pu1_src_1 += ((u1_seg_ht - 1) * i4_refarray_stride);
912*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i <= i4_height; i4_i++)
913*495ae853SAndroid Build Coastguard Worker         {
914*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf[i4_i] = *pu1_src_1;
915*495ae853SAndroid Build Coastguard Worker             pu1_src_1 -= i4_refarray_stride;
916*495ae853SAndroid Build Coastguard Worker         }
917*495ae853SAndroid Build Coastguard Worker 
918*495ae853SAndroid Build Coastguard Worker         pu1_src_2 -= i4_x_off;
919*495ae853SAndroid Build Coastguard Worker         memcpy(&u1_filter_delay_buf[i4_i], pu1_src_2, i4_width);
920*495ae853SAndroid Build Coastguard Worker 
921*495ae853SAndroid Build Coastguard Worker         if(0 == i4_corner_pixel_available)
922*495ae853SAndroid Build Coastguard Worker         {
923*495ae853SAndroid Build Coastguard Worker             /* interpolate the unavailable corner pixel */
924*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf[i4_i - 1] =
925*495ae853SAndroid Build Coastguard Worker                 (u1_filter_delay_buf[i4_i] + u1_filter_delay_buf[i4_i - 2] + 1) >> 1;
926*495ae853SAndroid Build Coastguard Worker         }
927*495ae853SAndroid Build Coastguard Worker 
928*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (i4_width + i4_height - 1); i4_i++)
929*495ae853SAndroid Build Coastguard Worker         {
930*495ae853SAndroid Build Coastguard Worker             /* get the filtered output */
931*495ae853SAndroid Build Coastguard Worker             u1_out_buf[i4_i] = ((u1_filter_delay_buf[i4_i]) + (u1_filter_delay_buf[i4_i + 1] * 2) +
932*495ae853SAndroid Build Coastguard Worker                                 (u1_filter_delay_buf[i4_i + 2]) + 2) >>
933*495ae853SAndroid Build Coastguard Worker                                2;
934*495ae853SAndroid Build Coastguard Worker         }
935*495ae853SAndroid Build Coastguard Worker 
936*495ae853SAndroid Build Coastguard Worker         /* fill the segment with diagonal reconstructed output */
937*495ae853SAndroid Build Coastguard Worker         for(i4_i = 1; i4_i <= u1_seg_ht; i4_i++)
938*495ae853SAndroid Build Coastguard Worker         {
939*495ae853SAndroid Build Coastguard Worker             memcpy(pu1_dst, &u1_out_buf[(u1_seg_ht + i4_x_off) - i4_i], u1_seg_wd);
940*495ae853SAndroid Build Coastguard Worker             pu1_dst += i4_refarray_stride;
941*495ae853SAndroid Build Coastguard Worker         }
942*495ae853SAndroid Build Coastguard Worker     }
943*495ae853SAndroid Build Coastguard Worker }
944*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
945*495ae853SAndroid Build Coastguard Worker /*                                                                           */
946*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_diag_reconstruction_chroma                          */
947*495ae853SAndroid Build Coastguard Worker /*  Description   :  This function does the diagonal reconstuction for intra */
948*495ae853SAndroid Build Coastguard Worker /*                      upsampling for chroma                                */
949*495ae853SAndroid Build Coastguard Worker /*                                                                           */
950*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
951*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
952*495ae853SAndroid Build Coastguard Worker /*  Processing    : This function does the diagonal reconstruction for intra */
953*495ae853SAndroid Build Coastguard Worker /*                      upsampling for chroma                                */
954*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
955*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
956*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
957*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
958*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
959*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay                creation                        */
960*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_diag_reconstruction_chroma(WORD32 i4_x,WORD32 i4_y,WORD8 i1_xd_index,WORD8 i1_yd_index,UWORD8 u1_seg_wd,UWORD8 u1_seg_ht,UWORD8 * pu1_refarray_1,UWORD8 * pu1_refarray_2,WORD32 i4_refarray_stride,WORD32 i4_mb_adjoin_x,WORD32 i4_mb_adjoin_y,WORD32 i4_corner_pixel_available)961*495ae853SAndroid Build Coastguard Worker void isvcd_diag_reconstruction_chroma(WORD32 i4_x, WORD32 i4_y, WORD8 i1_xd_index,
962*495ae853SAndroid Build Coastguard Worker                                       WORD8 i1_yd_index, UWORD8 u1_seg_wd, UWORD8 u1_seg_ht,
963*495ae853SAndroid Build Coastguard Worker                                       UWORD8 *pu1_refarray_1, UWORD8 *pu1_refarray_2,
964*495ae853SAndroid Build Coastguard Worker                                       WORD32 i4_refarray_stride, WORD32 i4_mb_adjoin_x,
965*495ae853SAndroid Build Coastguard Worker                                       WORD32 i4_mb_adjoin_y, WORD32 i4_corner_pixel_available)
966*495ae853SAndroid Build Coastguard Worker {
967*495ae853SAndroid Build Coastguard Worker     WORD32 i4_i;
968*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_filter_delay_buf_cb[18] = {0};
969*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_filter_delay_buf_cr[18] = {0};
970*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_out_buf_cb[16] = {0};
971*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_out_buf_cr[16] = {0};
972*495ae853SAndroid Build Coastguard Worker     WORD32 i4_width, i4_height;
973*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x_off, i4_y_off;
974*495ae853SAndroid Build Coastguard Worker     WORD32 i4_block_size = BLOCK_WIDTH >> 1;
975*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_1_cb, *pu1_src_2_cb, *pu1_dst_cb;
976*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_1_cr, *pu1_src_2_cr, *pu1_dst_cr;
977*495ae853SAndroid Build Coastguard Worker     WORD32 i4_tmp;
978*495ae853SAndroid Build Coastguard Worker 
979*495ae853SAndroid Build Coastguard Worker     i4_tmp = i4_x + (i4_y * i4_refarray_stride);
980*495ae853SAndroid Build Coastguard Worker     pu1_dst_cb = pu1_refarray_1 + i4_tmp;
981*495ae853SAndroid Build Coastguard Worker     pu1_dst_cr = pu1_refarray_2 + i4_tmp;
982*495ae853SAndroid Build Coastguard Worker 
983*495ae853SAndroid Build Coastguard Worker     pu1_src_1_cb = pu1_dst_cb + i1_xd_index;
984*495ae853SAndroid Build Coastguard Worker     pu1_src_1_cr = pu1_dst_cr + i1_xd_index;
985*495ae853SAndroid Build Coastguard Worker     i4_tmp = (i1_yd_index * i4_refarray_stride);
986*495ae853SAndroid Build Coastguard Worker     pu1_src_2_cb = pu1_dst_cb + i4_tmp;
987*495ae853SAndroid Build Coastguard Worker     pu1_src_2_cr = pu1_dst_cr + i4_tmp;
988*495ae853SAndroid Build Coastguard Worker 
989*495ae853SAndroid Build Coastguard Worker     i4_width = MAX(u1_seg_wd, (((i4_mb_adjoin_x >> 3) ^ 1) * i4_block_size));
990*495ae853SAndroid Build Coastguard Worker     i4_height = MAX(u1_seg_ht, (((i4_mb_adjoin_y >> 4) ^ 1) * i4_block_size));
991*495ae853SAndroid Build Coastguard Worker     i4_x_off = (i4_width - u1_seg_wd);
992*495ae853SAndroid Build Coastguard Worker     i4_y_off = (i4_height - u1_seg_ht);
993*495ae853SAndroid Build Coastguard Worker 
994*495ae853SAndroid Build Coastguard Worker     if(i1_xd_index < 0 && i1_yd_index > 0)
995*495ae853SAndroid Build Coastguard Worker     {
996*495ae853SAndroid Build Coastguard Worker         /* Quadrant 1 Processing load the pixel in the filter delay buffer */
997*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (i4_height + 1); i4_i++)
998*495ae853SAndroid Build Coastguard Worker         {
999*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cb[i4_i] = *pu1_src_1_cb;
1000*495ae853SAndroid Build Coastguard Worker             pu1_src_1_cb += i4_refarray_stride;
1001*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cr[i4_i] = *pu1_src_1_cr;
1002*495ae853SAndroid Build Coastguard Worker             pu1_src_1_cr += i4_refarray_stride;
1003*495ae853SAndroid Build Coastguard Worker         }
1004*495ae853SAndroid Build Coastguard Worker 
1005*495ae853SAndroid Build Coastguard Worker         pu1_src_2_cb -= i4_x_off;
1006*495ae853SAndroid Build Coastguard Worker         pu1_src_2_cr -= i4_x_off;
1007*495ae853SAndroid Build Coastguard Worker         memcpy(&u1_filter_delay_buf_cb[i4_i], pu1_src_2_cb, i4_width);
1008*495ae853SAndroid Build Coastguard Worker         memcpy(&u1_filter_delay_buf_cr[i4_i], pu1_src_2_cr, i4_width);
1009*495ae853SAndroid Build Coastguard Worker 
1010*495ae853SAndroid Build Coastguard Worker         if(0 == i4_corner_pixel_available)
1011*495ae853SAndroid Build Coastguard Worker         {
1012*495ae853SAndroid Build Coastguard Worker             /* interpolate the unavailable corner pixel */
1013*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cb[i4_i - 1] =
1014*495ae853SAndroid Build Coastguard Worker                 (u1_filter_delay_buf_cb[i4_i] + u1_filter_delay_buf_cb[i4_i - 2] + 1) >> 1;
1015*495ae853SAndroid Build Coastguard Worker 
1016*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cr[i4_i - 1] =
1017*495ae853SAndroid Build Coastguard Worker                 (u1_filter_delay_buf_cr[i4_i] + u1_filter_delay_buf_cr[i4_i - 2] + 1) >> 1;
1018*495ae853SAndroid Build Coastguard Worker         }
1019*495ae853SAndroid Build Coastguard Worker 
1020*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (i4_width + i4_height - 1); i4_i++)
1021*495ae853SAndroid Build Coastguard Worker         {
1022*495ae853SAndroid Build Coastguard Worker             /* get the filtered output */
1023*495ae853SAndroid Build Coastguard Worker             u1_out_buf_cb[i4_i] =
1024*495ae853SAndroid Build Coastguard Worker                 ((u1_filter_delay_buf_cb[i4_i]) + (u1_filter_delay_buf_cb[i4_i + 1] * 2) +
1025*495ae853SAndroid Build Coastguard Worker                  (u1_filter_delay_buf_cb[i4_i + 2]) + 2) >>
1026*495ae853SAndroid Build Coastguard Worker                 2;
1027*495ae853SAndroid Build Coastguard Worker 
1028*495ae853SAndroid Build Coastguard Worker             u1_out_buf_cr[i4_i] =
1029*495ae853SAndroid Build Coastguard Worker                 ((u1_filter_delay_buf_cr[i4_i]) + (u1_filter_delay_buf_cr[i4_i + 1] * 2) +
1030*495ae853SAndroid Build Coastguard Worker                  (u1_filter_delay_buf_cr[i4_i + 2]) + 2) >>
1031*495ae853SAndroid Build Coastguard Worker                 2;
1032*495ae853SAndroid Build Coastguard Worker         }
1033*495ae853SAndroid Build Coastguard Worker 
1034*495ae853SAndroid Build Coastguard Worker         /* fill the segment with diagonal reconstructed output */
1035*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < u1_seg_ht; i4_i++)
1036*495ae853SAndroid Build Coastguard Worker         {
1037*495ae853SAndroid Build Coastguard Worker             memcpy(pu1_dst_cb, &u1_out_buf_cb[i4_x_off + i4_i], u1_seg_wd);
1038*495ae853SAndroid Build Coastguard Worker             pu1_dst_cb += i4_refarray_stride;
1039*495ae853SAndroid Build Coastguard Worker             memcpy(pu1_dst_cr, &u1_out_buf_cr[i4_x_off + i4_i], u1_seg_wd);
1040*495ae853SAndroid Build Coastguard Worker             pu1_dst_cr += i4_refarray_stride;
1041*495ae853SAndroid Build Coastguard Worker         }
1042*495ae853SAndroid Build Coastguard Worker     }
1043*495ae853SAndroid Build Coastguard Worker     else if(i1_xd_index > 0 && i1_yd_index > 0)
1044*495ae853SAndroid Build Coastguard Worker     {
1045*495ae853SAndroid Build Coastguard Worker         /* Quadrant 2 Processing load the pixel in the filter delay buffer  */
1046*495ae853SAndroid Build Coastguard Worker         memcpy(&u1_filter_delay_buf_cb[0], pu1_src_2_cb, (i4_width + 1));
1047*495ae853SAndroid Build Coastguard Worker         memcpy(&u1_filter_delay_buf_cr[0], pu1_src_2_cr, (i4_width + 1));
1048*495ae853SAndroid Build Coastguard Worker 
1049*495ae853SAndroid Build Coastguard Worker         for(i4_i = i4_height; i4_i > 0; i4_i--)
1050*495ae853SAndroid Build Coastguard Worker         {
1051*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cb[i4_width + i4_i] = *pu1_src_1_cb;
1052*495ae853SAndroid Build Coastguard Worker             pu1_src_1_cb += i4_refarray_stride;
1053*495ae853SAndroid Build Coastguard Worker 
1054*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cr[i4_width + i4_i] = *pu1_src_1_cr;
1055*495ae853SAndroid Build Coastguard Worker             pu1_src_1_cr += i4_refarray_stride;
1056*495ae853SAndroid Build Coastguard Worker         }
1057*495ae853SAndroid Build Coastguard Worker 
1058*495ae853SAndroid Build Coastguard Worker         if(0 == i4_corner_pixel_available)
1059*495ae853SAndroid Build Coastguard Worker         {
1060*495ae853SAndroid Build Coastguard Worker             /* interpolate the unavailable corner pixel */
1061*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cb[i4_width] =
1062*495ae853SAndroid Build Coastguard Worker                 (u1_filter_delay_buf_cb[i4_width - 1] + u1_filter_delay_buf_cb[i4_width + 1] + 1) >>
1063*495ae853SAndroid Build Coastguard Worker                 1;
1064*495ae853SAndroid Build Coastguard Worker 
1065*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cr[i4_width] =
1066*495ae853SAndroid Build Coastguard Worker                 (u1_filter_delay_buf_cr[i4_width - 1] + u1_filter_delay_buf_cr[i4_width + 1] + 1) >>
1067*495ae853SAndroid Build Coastguard Worker                 1;
1068*495ae853SAndroid Build Coastguard Worker         }
1069*495ae853SAndroid Build Coastguard Worker 
1070*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (i4_width + i4_height - 1); i4_i++)
1071*495ae853SAndroid Build Coastguard Worker         {
1072*495ae853SAndroid Build Coastguard Worker             /* get the filtered output */
1073*495ae853SAndroid Build Coastguard Worker             u1_out_buf_cb[i4_i] =
1074*495ae853SAndroid Build Coastguard Worker                 ((u1_filter_delay_buf_cb[i4_i]) + (u1_filter_delay_buf_cb[i4_i + 1] * 2) +
1075*495ae853SAndroid Build Coastguard Worker                  (u1_filter_delay_buf_cb[i4_i + 2]) + 2) >>
1076*495ae853SAndroid Build Coastguard Worker                 2;
1077*495ae853SAndroid Build Coastguard Worker 
1078*495ae853SAndroid Build Coastguard Worker             u1_out_buf_cr[i4_i] =
1079*495ae853SAndroid Build Coastguard Worker                 ((u1_filter_delay_buf_cr[i4_i]) + (u1_filter_delay_buf_cr[i4_i + 1] * 2) +
1080*495ae853SAndroid Build Coastguard Worker                  (u1_filter_delay_buf_cr[i4_i + 2]) + 2) >>
1081*495ae853SAndroid Build Coastguard Worker                 2;
1082*495ae853SAndroid Build Coastguard Worker         }
1083*495ae853SAndroid Build Coastguard Worker 
1084*495ae853SAndroid Build Coastguard Worker         /* fill the segment with diagonal reconstructed output */
1085*495ae853SAndroid Build Coastguard Worker         for(i4_i = 1; i4_i <= u1_seg_ht; i4_i++)
1086*495ae853SAndroid Build Coastguard Worker         {
1087*495ae853SAndroid Build Coastguard Worker             memcpy(pu1_dst_cb, &u1_out_buf_cb[i4_height - i4_i], u1_seg_wd);
1088*495ae853SAndroid Build Coastguard Worker             pu1_dst_cb += i4_refarray_stride;
1089*495ae853SAndroid Build Coastguard Worker 
1090*495ae853SAndroid Build Coastguard Worker             memcpy(pu1_dst_cr, &u1_out_buf_cr[i4_height - i4_i], u1_seg_wd);
1091*495ae853SAndroid Build Coastguard Worker             pu1_dst_cr += i4_refarray_stride;
1092*495ae853SAndroid Build Coastguard Worker         }
1093*495ae853SAndroid Build Coastguard Worker     }
1094*495ae853SAndroid Build Coastguard Worker     else if(i1_xd_index > 0 && i1_yd_index < 0)
1095*495ae853SAndroid Build Coastguard Worker     {
1096*495ae853SAndroid Build Coastguard Worker         /* Quadrant 3 Processing load the pixel in the filter delay buffer  */
1097*495ae853SAndroid Build Coastguard Worker         memcpy(&u1_filter_delay_buf_cb[0], pu1_src_2_cb, (i4_width + 1));
1098*495ae853SAndroid Build Coastguard Worker         memcpy(&u1_filter_delay_buf_cr[0], pu1_src_2_cr, (i4_width + 1));
1099*495ae853SAndroid Build Coastguard Worker 
1100*495ae853SAndroid Build Coastguard Worker         i4_tmp = (i4_y_off * i4_refarray_stride);
1101*495ae853SAndroid Build Coastguard Worker         pu1_src_1_cb -= i4_tmp;
1102*495ae853SAndroid Build Coastguard Worker         pu1_src_1_cr -= i4_tmp;
1103*495ae853SAndroid Build Coastguard Worker         for(i4_i = 1; i4_i <= i4_height; i4_i++)
1104*495ae853SAndroid Build Coastguard Worker         {
1105*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cb[i4_width + i4_i] = *pu1_src_1_cb;
1106*495ae853SAndroid Build Coastguard Worker             pu1_src_1_cb += i4_refarray_stride;
1107*495ae853SAndroid Build Coastguard Worker 
1108*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cr[i4_width + i4_i] = *pu1_src_1_cr;
1109*495ae853SAndroid Build Coastguard Worker             pu1_src_1_cr += i4_refarray_stride;
1110*495ae853SAndroid Build Coastguard Worker         }
1111*495ae853SAndroid Build Coastguard Worker 
1112*495ae853SAndroid Build Coastguard Worker         if(0 == i4_corner_pixel_available)
1113*495ae853SAndroid Build Coastguard Worker         {
1114*495ae853SAndroid Build Coastguard Worker             /* interpolate the unavailable corner pixel */
1115*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cb[i4_width] =
1116*495ae853SAndroid Build Coastguard Worker                 (u1_filter_delay_buf_cb[i4_width - 1] + u1_filter_delay_buf_cb[i4_width + 1] + 1) >>
1117*495ae853SAndroid Build Coastguard Worker                 1;
1118*495ae853SAndroid Build Coastguard Worker 
1119*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cr[i4_width] =
1120*495ae853SAndroid Build Coastguard Worker                 (u1_filter_delay_buf_cr[i4_width - 1] + u1_filter_delay_buf_cr[i4_width + 1] + 1) >>
1121*495ae853SAndroid Build Coastguard Worker                 1;
1122*495ae853SAndroid Build Coastguard Worker         }
1123*495ae853SAndroid Build Coastguard Worker 
1124*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (i4_width + i4_height - 1); i4_i++)
1125*495ae853SAndroid Build Coastguard Worker         {
1126*495ae853SAndroid Build Coastguard Worker             /* get the filtered output */
1127*495ae853SAndroid Build Coastguard Worker             u1_out_buf_cb[i4_i] =
1128*495ae853SAndroid Build Coastguard Worker                 ((u1_filter_delay_buf_cb[i4_i]) + (u1_filter_delay_buf_cb[i4_i + 1] * 2) +
1129*495ae853SAndroid Build Coastguard Worker                  (u1_filter_delay_buf_cb[i4_i + 2]) + 2) >>
1130*495ae853SAndroid Build Coastguard Worker                 2;
1131*495ae853SAndroid Build Coastguard Worker 
1132*495ae853SAndroid Build Coastguard Worker             u1_out_buf_cr[i4_i] =
1133*495ae853SAndroid Build Coastguard Worker                 ((u1_filter_delay_buf_cr[i4_i]) + (u1_filter_delay_buf_cr[i4_i + 1] * 2) +
1134*495ae853SAndroid Build Coastguard Worker                  (u1_filter_delay_buf_cr[i4_i + 2]) + 2) >>
1135*495ae853SAndroid Build Coastguard Worker                 2;
1136*495ae853SAndroid Build Coastguard Worker         }
1137*495ae853SAndroid Build Coastguard Worker 
1138*495ae853SAndroid Build Coastguard Worker         /* fill the segment with diagonal reconstructed output */
1139*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < u1_seg_ht; i4_i++)
1140*495ae853SAndroid Build Coastguard Worker         {
1141*495ae853SAndroid Build Coastguard Worker             memcpy(pu1_dst_cb, &u1_out_buf_cb[i4_y_off + i4_i], u1_seg_wd);
1142*495ae853SAndroid Build Coastguard Worker             pu1_dst_cb += i4_refarray_stride;
1143*495ae853SAndroid Build Coastguard Worker             memcpy(pu1_dst_cr, &u1_out_buf_cr[i4_y_off + i4_i], u1_seg_wd);
1144*495ae853SAndroid Build Coastguard Worker             pu1_dst_cr += i4_refarray_stride;
1145*495ae853SAndroid Build Coastguard Worker         }
1146*495ae853SAndroid Build Coastguard Worker     }
1147*495ae853SAndroid Build Coastguard Worker     else
1148*495ae853SAndroid Build Coastguard Worker     {
1149*495ae853SAndroid Build Coastguard Worker         /* Quadrant 4 Processing load the pixel in the filter delay buffer  */
1150*495ae853SAndroid Build Coastguard Worker         i4_tmp = ((u1_seg_ht - 1) * i4_refarray_stride);
1151*495ae853SAndroid Build Coastguard Worker         pu1_src_1_cb += i4_tmp;
1152*495ae853SAndroid Build Coastguard Worker         pu1_src_1_cr += i4_tmp;
1153*495ae853SAndroid Build Coastguard Worker 
1154*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i <= i4_height; i4_i++)
1155*495ae853SAndroid Build Coastguard Worker         {
1156*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cb[i4_i] = *pu1_src_1_cb;
1157*495ae853SAndroid Build Coastguard Worker             pu1_src_1_cb -= i4_refarray_stride;
1158*495ae853SAndroid Build Coastguard Worker 
1159*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cr[i4_i] = *pu1_src_1_cr;
1160*495ae853SAndroid Build Coastguard Worker             pu1_src_1_cr -= i4_refarray_stride;
1161*495ae853SAndroid Build Coastguard Worker         }
1162*495ae853SAndroid Build Coastguard Worker 
1163*495ae853SAndroid Build Coastguard Worker         pu1_src_2_cb -= i4_x_off;
1164*495ae853SAndroid Build Coastguard Worker         pu1_src_2_cr -= i4_x_off;
1165*495ae853SAndroid Build Coastguard Worker         memcpy(&u1_filter_delay_buf_cb[i4_i], pu1_src_2_cb, i4_width);
1166*495ae853SAndroid Build Coastguard Worker         memcpy(&u1_filter_delay_buf_cr[i4_i], pu1_src_2_cr, i4_width);
1167*495ae853SAndroid Build Coastguard Worker 
1168*495ae853SAndroid Build Coastguard Worker         if(0 == i4_corner_pixel_available)
1169*495ae853SAndroid Build Coastguard Worker         {
1170*495ae853SAndroid Build Coastguard Worker             /* interpolate the unavailable corner pixel */
1171*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cb[i4_i - 1] =
1172*495ae853SAndroid Build Coastguard Worker                 (u1_filter_delay_buf_cb[i4_i] + u1_filter_delay_buf_cb[i4_i - 2] + 1) >> 1;
1173*495ae853SAndroid Build Coastguard Worker 
1174*495ae853SAndroid Build Coastguard Worker             u1_filter_delay_buf_cr[i4_i - 1] =
1175*495ae853SAndroid Build Coastguard Worker                 (u1_filter_delay_buf_cr[i4_i] + u1_filter_delay_buf_cr[i4_i - 2] + 1) >> 1;
1176*495ae853SAndroid Build Coastguard Worker         }
1177*495ae853SAndroid Build Coastguard Worker 
1178*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (i4_width + i4_height - 1); i4_i++)
1179*495ae853SAndroid Build Coastguard Worker         {
1180*495ae853SAndroid Build Coastguard Worker             /* get the filtered output */
1181*495ae853SAndroid Build Coastguard Worker             u1_out_buf_cb[i4_i] =
1182*495ae853SAndroid Build Coastguard Worker                 ((u1_filter_delay_buf_cb[i4_i]) + (u1_filter_delay_buf_cb[i4_i + 1] * 2) +
1183*495ae853SAndroid Build Coastguard Worker                  (u1_filter_delay_buf_cb[i4_i + 2]) + 2) >>
1184*495ae853SAndroid Build Coastguard Worker                 2;
1185*495ae853SAndroid Build Coastguard Worker 
1186*495ae853SAndroid Build Coastguard Worker             u1_out_buf_cr[i4_i] =
1187*495ae853SAndroid Build Coastguard Worker                 ((u1_filter_delay_buf_cr[i4_i]) + (u1_filter_delay_buf_cr[i4_i + 1] * 2) +
1188*495ae853SAndroid Build Coastguard Worker                  (u1_filter_delay_buf_cr[i4_i + 2]) + 2) >>
1189*495ae853SAndroid Build Coastguard Worker                 2;
1190*495ae853SAndroid Build Coastguard Worker         }
1191*495ae853SAndroid Build Coastguard Worker 
1192*495ae853SAndroid Build Coastguard Worker         /* fill the segment with diagonal reconstructed output */
1193*495ae853SAndroid Build Coastguard Worker         for(i4_i = 1; i4_i <= u1_seg_ht; i4_i++)
1194*495ae853SAndroid Build Coastguard Worker         {
1195*495ae853SAndroid Build Coastguard Worker             memcpy(pu1_dst_cb, &u1_out_buf_cb[(u1_seg_ht + i4_x_off) - i4_i], u1_seg_wd);
1196*495ae853SAndroid Build Coastguard Worker             pu1_dst_cb += i4_refarray_stride;
1197*495ae853SAndroid Build Coastguard Worker             memcpy(pu1_dst_cr, &u1_out_buf_cr[(u1_seg_ht + i4_x_off) - i4_i], u1_seg_wd);
1198*495ae853SAndroid Build Coastguard Worker             pu1_dst_cr += i4_refarray_stride;
1199*495ae853SAndroid Build Coastguard Worker         }
1200*495ae853SAndroid Build Coastguard Worker     }
1201*495ae853SAndroid Build Coastguard Worker }
1202*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1203*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1204*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_diag_padding                                        */
1205*495ae853SAndroid Build Coastguard Worker /*  Description   :  This function does the diagonal padding for intra       */
1206*495ae853SAndroid Build Coastguard Worker /*                      upsampling for luma                                  */
1207*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1208*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
1209*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1210*495ae853SAndroid Build Coastguard Worker /*  Processing    : This function does the diagonal padding for intra        */
1211*495ae853SAndroid Build Coastguard Worker /*                      upsampling for luma                                  */
1212*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
1213*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1214*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1215*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1216*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1217*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay                creation                        */
1218*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_diag_padding(WORD32 i4_x,WORD32 i4_y,WORD8 i1_xd_index,WORD8 i1_yd_index,UWORD8 u1_seg_wd,UWORD8 u1_seg_ht,UWORD8 * pu1_refarray_1,UWORD8 * pu1_refarray_2,WORD32 i4_refarray_stride,WORD32 i4_mb_adjoin_x,WORD32 i4_mb_adjoin_y,WORD32 i4_corner_pixel_available)1219*495ae853SAndroid Build Coastguard Worker void isvcd_diag_padding(WORD32 i4_x, WORD32 i4_y, WORD8 i1_xd_index, WORD8 i1_yd_index,
1220*495ae853SAndroid Build Coastguard Worker                         UWORD8 u1_seg_wd, UWORD8 u1_seg_ht, UWORD8 *pu1_refarray_1,
1221*495ae853SAndroid Build Coastguard Worker                         UWORD8 *pu1_refarray_2, WORD32 i4_refarray_stride, WORD32 i4_mb_adjoin_x,
1222*495ae853SAndroid Build Coastguard Worker                         WORD32 i4_mb_adjoin_y, WORD32 i4_corner_pixel_available)
1223*495ae853SAndroid Build Coastguard Worker 
1224*495ae853SAndroid Build Coastguard Worker {
1225*495ae853SAndroid Build Coastguard Worker     WORD32 i4_idx_i;
1226*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src, *pu1_dst;
1227*495ae853SAndroid Build Coastguard Worker 
1228*495ae853SAndroid Build Coastguard Worker     UNUSED(pu1_refarray_2);
1229*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_mb_adjoin_x);
1230*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_mb_adjoin_y);
1231*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_corner_pixel_available);
1232*495ae853SAndroid Build Coastguard Worker 
1233*495ae853SAndroid Build Coastguard Worker     pu1_dst = pu1_refarray_1 + i4_x + (i4_y * i4_refarray_stride);
1234*495ae853SAndroid Build Coastguard Worker     pu1_src = pu1_dst + i1_xd_index + (i1_yd_index * i4_refarray_stride);
1235*495ae853SAndroid Build Coastguard Worker     i1_xd_index = MIN(i1_xd_index, MAX_PIX_FILL_LUMA);
1236*495ae853SAndroid Build Coastguard Worker     u1_seg_wd = MIN(u1_seg_wd, MAX_PIX_FILL_LUMA);
1237*495ae853SAndroid Build Coastguard Worker     i1_yd_index = MIN(i1_yd_index, MAX_PIX_FILL_LUMA);
1238*495ae853SAndroid Build Coastguard Worker     u1_seg_ht = MIN(u1_seg_ht, MAX_PIX_FILL_LUMA);
1239*495ae853SAndroid Build Coastguard Worker     pu1_dst = pu1_src - i1_xd_index - (i1_yd_index * i4_refarray_stride);
1240*495ae853SAndroid Build Coastguard Worker 
1241*495ae853SAndroid Build Coastguard Worker     for(i4_idx_i = 0; i4_idx_i < u1_seg_ht; i4_idx_i++)
1242*495ae853SAndroid Build Coastguard Worker     {
1243*495ae853SAndroid Build Coastguard Worker         memset(pu1_dst, *pu1_src, u1_seg_wd);
1244*495ae853SAndroid Build Coastguard Worker         pu1_dst += i4_refarray_stride;
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 /*                                                                           */
1250*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_diag_padding_chroma                                 */
1251*495ae853SAndroid Build Coastguard Worker /*  Description   :  This function does the diagonal padding for intra       */
1252*495ae853SAndroid Build Coastguard Worker /*                      upsampling for chroma                                */
1253*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1254*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
1255*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1256*495ae853SAndroid Build Coastguard Worker /*  Processing    : This function does the diagonal padding for intra        */
1257*495ae853SAndroid Build Coastguard Worker /*                      upsampling for chroma                                */
1258*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
1259*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1260*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1261*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1262*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1263*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay                creation                        */
1264*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_diag_padding_chroma(WORD32 i4_x,WORD32 i4_y,WORD8 i1_xd_index,WORD8 i1_yd_index,UWORD8 u1_seg_wd,UWORD8 u1_seg_ht,UWORD8 * pu1_refarray_1,UWORD8 * pu1_refarray_2,WORD32 i4_refarray_stride,WORD32 i4_mb_adjoin_x,WORD32 i4_mb_adjoin_y,WORD32 i4_corner_pixel_available)1265*495ae853SAndroid Build Coastguard Worker void isvcd_diag_padding_chroma(WORD32 i4_x, WORD32 i4_y, WORD8 i1_xd_index, WORD8 i1_yd_index,
1266*495ae853SAndroid Build Coastguard Worker                                UWORD8 u1_seg_wd, UWORD8 u1_seg_ht, UWORD8 *pu1_refarray_1,
1267*495ae853SAndroid Build Coastguard Worker                                UWORD8 *pu1_refarray_2, WORD32 i4_refarray_stride,
1268*495ae853SAndroid Build Coastguard Worker                                WORD32 i4_mb_adjoin_x, WORD32 i4_mb_adjoin_y,
1269*495ae853SAndroid Build Coastguard Worker                                WORD32 i4_corner_pixel_available)
1270*495ae853SAndroid Build Coastguard Worker 
1271*495ae853SAndroid Build Coastguard Worker {
1272*495ae853SAndroid Build Coastguard Worker     WORD32 i4_idx_i;
1273*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_cb, *pu1_dst_cb;
1274*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_cr, *pu1_dst_cr;
1275*495ae853SAndroid Build Coastguard Worker     WORD32 i4_tmp;
1276*495ae853SAndroid Build Coastguard Worker 
1277*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_mb_adjoin_x);
1278*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_mb_adjoin_y);
1279*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_corner_pixel_available);
1280*495ae853SAndroid Build Coastguard Worker 
1281*495ae853SAndroid Build Coastguard Worker     i4_tmp = i4_x + (i4_y * i4_refarray_stride);
1282*495ae853SAndroid Build Coastguard Worker     pu1_dst_cb = pu1_refarray_1 + i4_tmp;
1283*495ae853SAndroid Build Coastguard Worker     pu1_dst_cr = pu1_refarray_2 + i4_tmp;
1284*495ae853SAndroid Build Coastguard Worker     i4_tmp = i1_xd_index + (i1_yd_index * i4_refarray_stride);
1285*495ae853SAndroid Build Coastguard Worker     pu1_src_cb = pu1_dst_cb + i4_tmp;
1286*495ae853SAndroid Build Coastguard Worker     pu1_src_cr = pu1_dst_cr + i4_tmp;
1287*495ae853SAndroid Build Coastguard Worker 
1288*495ae853SAndroid Build Coastguard Worker     i1_xd_index = MIN(i1_xd_index, MAX_PIX_FILL_LUMA);
1289*495ae853SAndroid Build Coastguard Worker     u1_seg_wd = MIN(u1_seg_wd, MAX_PIX_FILL_LUMA);
1290*495ae853SAndroid Build Coastguard Worker     i1_yd_index = MIN(i1_yd_index, MAX_PIX_FILL_LUMA);
1291*495ae853SAndroid Build Coastguard Worker     u1_seg_ht = MIN(u1_seg_ht, MAX_PIX_FILL_LUMA);
1292*495ae853SAndroid Build Coastguard Worker 
1293*495ae853SAndroid Build Coastguard Worker     i4_tmp = (i1_xd_index + (i1_yd_index * i4_refarray_stride));
1294*495ae853SAndroid Build Coastguard Worker     pu1_dst_cb = pu1_src_cb - i4_tmp;
1295*495ae853SAndroid Build Coastguard Worker     pu1_dst_cr = pu1_src_cr - i4_tmp;
1296*495ae853SAndroid Build Coastguard Worker 
1297*495ae853SAndroid Build Coastguard Worker     for(i4_idx_i = 0; i4_idx_i < u1_seg_ht; i4_idx_i++)
1298*495ae853SAndroid Build Coastguard Worker     {
1299*495ae853SAndroid Build Coastguard Worker         memset(pu1_dst_cb, *pu1_src_cb, u1_seg_wd);
1300*495ae853SAndroid Build Coastguard Worker         pu1_dst_cb += i4_refarray_stride;
1301*495ae853SAndroid Build Coastguard Worker         memset(pu1_dst_cr, *pu1_src_cr, u1_seg_wd);
1302*495ae853SAndroid Build Coastguard Worker         pu1_dst_cr += i4_refarray_stride;
1303*495ae853SAndroid Build Coastguard Worker     }
1304*495ae853SAndroid Build Coastguard Worker }
1305*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1306*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1307*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_corner_samp_dyadic                                  */
1308*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1309*495ae853SAndroid Build Coastguard Worker /*  Description   : This function fills the corner sample in the reference   */
1310*495ae853SAndroid Build Coastguard Worker /*                    array with diagonally constructed samples              */
1311*495ae853SAndroid Build Coastguard Worker /*  Inputs        : i4_x :current position in reference array X to be filled */
1312*495ae853SAndroid Build Coastguard Worker /*                  i4_y :current position in reference array Y to be filled */
1313*495ae853SAndroid Build Coastguard Worker /*                  i4_xd_index : diagonal index in horizontal direction     */
1314*495ae853SAndroid Build Coastguard Worker /*                  i4_yd_index : diagonal index in vertical direction       */
1315*495ae853SAndroid Build Coastguard Worker /*                  pu1_refarray_y : pointer to luma reference array         */
1316*495ae853SAndroid Build Coastguard Worker /*                    pu1_refarray_cb : pointer to Cb reference array        */
1317*495ae853SAndroid Build Coastguard Worker /*                    pu1_refarray_cr : pointer to Cr reference array        */
1318*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1319*495ae853SAndroid Build Coastguard Worker /*  Processing    : Fills the sample which is unavailable with filtered      */
1320*495ae853SAndroid Build Coastguard Worker /*                    diagonal samples                                       */
1321*495ae853SAndroid Build Coastguard Worker /*  Outputs       : pixel filled                                             */
1322*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1323*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1324*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1325*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1326*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1327*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1328*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1329*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay           creation                             */
1330*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1331*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_corner_samp_dyadic(WORD32 i4_x,WORD32 i4_y,WORD32 i4_xD,WORD32 i4_yD,UWORD8 * pu1_refarray_y,UWORD8 * pu1_refarray_cb,UWORD8 * pu1_refarray_cr)1332*495ae853SAndroid Build Coastguard Worker void isvcd_corner_samp_dyadic(WORD32 i4_x, WORD32 i4_y, WORD32 i4_xD, WORD32 i4_yD,
1333*495ae853SAndroid Build Coastguard Worker                               UWORD8 *pu1_refarray_y, UWORD8 *pu1_refarray_cb,
1334*495ae853SAndroid Build Coastguard Worker                               UWORD8 *pu1_refarray_cr)
1335*495ae853SAndroid Build Coastguard Worker {
1336*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_xD, i4_ref_yD;
1337*495ae853SAndroid Build Coastguard Worker     WORD32 i4_c_ref_xD, i4_c_ref_yD;
1338*495ae853SAndroid Build Coastguard Worker     WORD32 i4_xc, i4_yc;
1339*495ae853SAndroid Build Coastguard Worker     WORD32 i4_c_xc, i4_c_yc;
1340*495ae853SAndroid Build Coastguard Worker     WORD32 i4_samp1, i4_samp2;
1341*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_tmp_src, *pu1_tmp_dst;
1342*495ae853SAndroid Build Coastguard Worker 
1343*495ae853SAndroid Build Coastguard Worker     i4_ref_xD = i4_x - i4_xD;
1344*495ae853SAndroid Build Coastguard Worker     i4_ref_yD = i4_y - i4_yD;
1345*495ae853SAndroid Build Coastguard Worker     i4_xc = i4_ref_xD + SIGN(i4_xD);
1346*495ae853SAndroid Build Coastguard Worker     i4_yc = i4_ref_yD + SIGN(i4_yD);
1347*495ae853SAndroid Build Coastguard Worker 
1348*495ae853SAndroid Build Coastguard Worker     /* Luma */
1349*495ae853SAndroid Build Coastguard Worker     pu1_tmp_src = pu1_refarray_y + (i4_yc * DYADIC_REF_W_Y);
1350*495ae853SAndroid Build Coastguard Worker     i4_samp1 = pu1_tmp_src[i4_ref_xD];
1351*495ae853SAndroid Build Coastguard Worker     pu1_tmp_src = pu1_refarray_y + (i4_ref_yD * DYADIC_REF_W_Y);
1352*495ae853SAndroid Build Coastguard Worker     i4_samp2 = pu1_tmp_src[i4_xc];
1353*495ae853SAndroid Build Coastguard Worker     pu1_tmp_dst = pu1_tmp_src;
1354*495ae853SAndroid Build Coastguard Worker     pu1_tmp_dst[i4_ref_xD] = (i4_samp1 + i4_samp2 + 1) >> 1;
1355*495ae853SAndroid Build Coastguard Worker 
1356*495ae853SAndroid Build Coastguard Worker     /* Chroma */
1357*495ae853SAndroid Build Coastguard Worker     i4_c_ref_xD = i4_ref_xD >> 1;
1358*495ae853SAndroid Build Coastguard Worker     i4_c_ref_yD = i4_ref_yD >> 1;
1359*495ae853SAndroid Build Coastguard Worker     i4_c_xc = i4_c_ref_xD + SIGN(i4_xD);
1360*495ae853SAndroid Build Coastguard Worker     i4_c_yc = i4_c_ref_yD + SIGN(i4_yD);
1361*495ae853SAndroid Build Coastguard Worker 
1362*495ae853SAndroid Build Coastguard Worker     /* Cb */
1363*495ae853SAndroid Build Coastguard Worker     pu1_tmp_src = pu1_refarray_cb + (i4_c_yc * DYADIC_REF_W_C);
1364*495ae853SAndroid Build Coastguard Worker     i4_samp1 = pu1_tmp_src[i4_c_ref_xD];
1365*495ae853SAndroid Build Coastguard Worker     pu1_tmp_src = pu1_refarray_cb + (i4_c_ref_yD * DYADIC_REF_W_C);
1366*495ae853SAndroid Build Coastguard Worker     i4_samp2 = pu1_tmp_src[i4_c_xc];
1367*495ae853SAndroid Build Coastguard Worker     pu1_tmp_dst = pu1_tmp_src;
1368*495ae853SAndroid Build Coastguard Worker     pu1_tmp_dst[i4_c_ref_xD] = (i4_samp1 + i4_samp2 + 1) >> 1;
1369*495ae853SAndroid Build Coastguard Worker 
1370*495ae853SAndroid Build Coastguard Worker     /* Cr */
1371*495ae853SAndroid Build Coastguard Worker     pu1_tmp_src = pu1_refarray_cr + (i4_c_yc * DYADIC_REF_W_C);
1372*495ae853SAndroid Build Coastguard Worker     i4_samp1 = pu1_tmp_src[i4_c_ref_xD];
1373*495ae853SAndroid Build Coastguard Worker     pu1_tmp_src = pu1_refarray_cr + (i4_c_ref_yD * DYADIC_REF_W_C);
1374*495ae853SAndroid Build Coastguard Worker     i4_samp2 = pu1_tmp_src[i4_c_xc];
1375*495ae853SAndroid Build Coastguard Worker     pu1_tmp_dst = pu1_tmp_src;
1376*495ae853SAndroid Build Coastguard Worker     pu1_tmp_dst[i4_c_ref_xD] = (i4_samp1 + i4_samp2 + 1) >> 1;
1377*495ae853SAndroid Build Coastguard Worker }
1378*495ae853SAndroid Build Coastguard Worker 
1379*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1380*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1381*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_fill_non_ava_pixel                                  */
1382*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1383*495ae853SAndroid Build Coastguard Worker /*  Description   :  This function does the core pixel level processing      */
1384*495ae853SAndroid Build Coastguard Worker /*                    while filling the non available pixel                  */
1385*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1386*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_intra_samp_ctxt : intra sampling context              */
1387*495ae853SAndroid Build Coastguard Worker /*                  i4_refarray_wd : width of the reference array            */
1388*495ae853SAndroid Build Coastguard Worker /*                  i4_refarray_ht : height of the reference array           */
1389*495ae853SAndroid Build Coastguard Worker /*                  ps_mb_coord  : current mb coord structure                */
1390*495ae853SAndroid Build Coastguard Worker /*                  i4_chroma_flag : chroam processing flag                  */
1391*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1392*495ae853SAndroid Build Coastguard Worker /*  Processing    : based on the map buffer values the non available pixels  */
1393*495ae853SAndroid Build Coastguard Worker /*                   are filled using border extension algorithm             */
1394*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
1395*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1396*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1397*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1398*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1399*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1400*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1401*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1402*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   vijayakumar          creation                        */
1403*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1404*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_fill_non_avail_pixel(void * pv_map_ctxt,UWORD8 * pu1_refarray_1,UWORD8 * pu1_refarray_2,WORD32 i4_refarray_stride,mb_coord_t * ps_mb_coord,WORD32 i4_chroma_flag,UWORD8 u1_avail_map[4][4])1405*495ae853SAndroid Build Coastguard Worker void isvcd_fill_non_avail_pixel(void *pv_map_ctxt, UWORD8 *pu1_refarray_1, UWORD8 *pu1_refarray_2,
1406*495ae853SAndroid Build Coastguard Worker                                 WORD32 i4_refarray_stride, mb_coord_t *ps_mb_coord,
1407*495ae853SAndroid Build Coastguard Worker                                 WORD32 i4_chroma_flag, UWORD8 u1_avail_map[4][4])
1408*495ae853SAndroid Build Coastguard Worker {
1409*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1410*495ae853SAndroid Build Coastguard Worker     /* Index Variables                                                         */
1411*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1412*495ae853SAndroid Build Coastguard Worker     intra_samp_map_ctxt_t *ps_map_ctxt;
1413*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t *ps_x_off_len;
1414*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t *ps_y_off_len;
1415*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
1416*495ae853SAndroid Build Coastguard Worker     WORD32 i4_corner_pixel_available;
1417*495ae853SAndroid Build Coastguard Worker 
1418*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1419*495ae853SAndroid Build Coastguard Worker     /* Local Pointer Declaration for Segment lookup                             */
1420*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1421*495ae853SAndroid Build Coastguard Worker     seg_lookup_desc_t *ps_segments_x;
1422*495ae853SAndroid Build Coastguard Worker     seg_lookup_desc_t *ps_segments_y;
1423*495ae853SAndroid Build Coastguard Worker     seg_description_t *ps_seg_desc_x, *ps_seg_desc_y;
1424*495ae853SAndroid Build Coastguard Worker     seg_description_t *ps_seg_x_tmp, *ps_seg_y_tmp;
1425*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_sgmts_x, u1_num_sgmts_y;
1426*495ae853SAndroid Build Coastguard Worker 
1427*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1428*495ae853SAndroid Build Coastguard Worker     /* Temp Variables for Mapping context                                     */
1429*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1430*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x_offset;
1431*495ae853SAndroid Build Coastguard Worker     WORD32 i4_y_offset;
1432*495ae853SAndroid Build Coastguard Worker     WORD32 i4_refmb_wd;
1433*495ae853SAndroid Build Coastguard Worker     WORD32 i4_refmb_ht;
1434*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mbaddr_x;
1435*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mbaddr_y;
1436*495ae853SAndroid Build Coastguard Worker     WORD32 i4_xr_index, i4_yr_index;
1437*495ae853SAndroid Build Coastguard Worker     WORD32 i4_j, i4_i;
1438*495ae853SAndroid Build Coastguard Worker     WORD32 i4_cur_x;
1439*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_lookup_4bit, u4_lookup_5bit, u4_4thbit;
1440*495ae853SAndroid Build Coastguard Worker     WORD32 i4_pad_size;
1441*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x_min;
1442*495ae853SAndroid Build Coastguard Worker     WORD32 i4_y_min;
1443*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x_start_pos, i4_y_start_pos;
1444*495ae853SAndroid Build Coastguard Worker     ref_min_max_map_t *ps_x_min_max;
1445*495ae853SAndroid Build Coastguard Worker     ref_min_max_map_t *ps_y_min_max;
1446*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_ref_idx_x, *pu1_ref_idx_y;
1447*495ae853SAndroid Build Coastguard Worker     ftype_intra_samp_padding *pf_intra_samp_padding;
1448*495ae853SAndroid Build Coastguard Worker     ftype_intra_samp_padding **pf_intra_samp_lookup;
1449*495ae853SAndroid Build Coastguard Worker 
1450*495ae853SAndroid Build Coastguard Worker     ps_map_ctxt = (intra_samp_map_ctxt_t *) pv_map_ctxt;
1451*495ae853SAndroid Build Coastguard Worker     ps_x_min_max = ps_map_ctxt->ps_x_min_max;
1452*495ae853SAndroid Build Coastguard Worker     ps_y_min_max = ps_map_ctxt->ps_y_min_max;
1453*495ae853SAndroid Build Coastguard Worker     ps_x_off_len = ps_map_ctxt->ps_x_offset_length;
1454*495ae853SAndroid Build Coastguard Worker     ps_y_off_len = ps_map_ctxt->ps_y_offset_length;
1455*495ae853SAndroid Build Coastguard Worker     i4_mbaddr_y = ps_mb_coord->u2_mb_y;
1456*495ae853SAndroid Build Coastguard Worker     i4_mbaddr_x = ps_mb_coord->u2_mb_x;
1457*495ae853SAndroid Build Coastguard Worker     i4_x_offset = ps_x_off_len[i4_mbaddr_x].i2_offset;
1458*495ae853SAndroid Build Coastguard Worker     i4_y_offset = ps_y_off_len[i4_mbaddr_y].i2_offset;
1459*495ae853SAndroid Build Coastguard Worker     i4_refmb_wd = (MB_WIDTH >> i4_chroma_flag) - 1;
1460*495ae853SAndroid Build Coastguard Worker     i4_refmb_ht = (MB_HEIGHT >> i4_chroma_flag) - 1;
1461*495ae853SAndroid Build Coastguard Worker 
1462*495ae853SAndroid Build Coastguard Worker     if(0 == i4_chroma_flag)
1463*495ae853SAndroid Build Coastguard Worker     {
1464*495ae853SAndroid Build Coastguard Worker         pf_intra_samp_lookup = gpf_lookup_fxns_luma;
1465*495ae853SAndroid Build Coastguard Worker     }
1466*495ae853SAndroid Build Coastguard Worker     else
1467*495ae853SAndroid Build Coastguard Worker     {
1468*495ae853SAndroid Build Coastguard Worker         pf_intra_samp_lookup = gpf_lookup_fxns_chroma;
1469*495ae853SAndroid Build Coastguard Worker     }
1470*495ae853SAndroid Build Coastguard Worker 
1471*495ae853SAndroid Build Coastguard Worker     /* get the min and max positions */
1472*495ae853SAndroid Build Coastguard Worker     i4_x_min = ps_x_min_max[i4_mbaddr_x].i2_min_pos;
1473*495ae853SAndroid Build Coastguard Worker     i4_y_min = ps_y_min_max[i4_mbaddr_y].i2_min_pos;
1474*495ae853SAndroid Build Coastguard Worker 
1475*495ae853SAndroid Build Coastguard Worker     /* get the start position of the MB in reference layer */
1476*495ae853SAndroid Build Coastguard Worker     i4_pad_size = 2 >> i4_chroma_flag;
1477*495ae853SAndroid Build Coastguard Worker     i4_x_start_pos = (i4_x_min - i4_pad_size);
1478*495ae853SAndroid Build Coastguard Worker     i4_y_start_pos = (i4_y_min - i4_pad_size);
1479*495ae853SAndroid Build Coastguard Worker     i4_xr_index = (i4_x_start_pos + i4_x_offset) & i4_refmb_wd;
1480*495ae853SAndroid Build Coastguard Worker     i4_yr_index = (i4_y_start_pos + i4_y_offset) & i4_refmb_ht;
1481*495ae853SAndroid Build Coastguard Worker 
1482*495ae853SAndroid Build Coastguard Worker     /* Find the number of segments in x and y direction */
1483*495ae853SAndroid Build Coastguard Worker     ps_segments_x = (ps_map_ctxt->ps_seg_lookup_horz + i4_xr_index);
1484*495ae853SAndroid Build Coastguard Worker     ps_segments_y = (ps_map_ctxt->ps_seg_lookup_vert + i4_yr_index);
1485*495ae853SAndroid Build Coastguard Worker     u1_num_sgmts_x = ps_segments_x->u1_num_segments;
1486*495ae853SAndroid Build Coastguard Worker     u1_num_sgmts_y = ps_segments_y->u1_num_segments;
1487*495ae853SAndroid Build Coastguard Worker     ps_seg_desc_x = ps_segments_x->s_segments;
1488*495ae853SAndroid Build Coastguard Worker     ps_seg_desc_y = ps_segments_y->s_segments;
1489*495ae853SAndroid Build Coastguard Worker     pu1_ref_idx_x = ps_map_ctxt->pu1_refarray_x_idx;
1490*495ae853SAndroid Build Coastguard Worker     pu1_ref_idx_y = ps_map_ctxt->pu1_refarray_y_idx;
1491*495ae853SAndroid Build Coastguard Worker     i4_cur_x = pu1_ref_idx_x[i4_x_start_pos];
1492*495ae853SAndroid Build Coastguard Worker     u4_4thbit = ps_segments_x->u4_start_pos;
1493*495ae853SAndroid Build Coastguard Worker 
1494*495ae853SAndroid Build Coastguard Worker     for(i4_j = 0; i4_j < u1_num_sgmts_y; i4_j++)
1495*495ae853SAndroid Build Coastguard Worker     {
1496*495ae853SAndroid Build Coastguard Worker         UWORD8 i4_idx_a, i4_idx_b;
1497*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_seg_ht, u1_seg_wd;
1498*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_mb_adjoin_x, u1_mb_adjoin_y;
1499*495ae853SAndroid Build Coastguard Worker         WORD8 i1_nearst_mb_bdry_x, i1_nearst_mb_bdry_y;
1500*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_num_valid_segs;
1501*495ae853SAndroid Build Coastguard Worker         WORD32 i4_idx_a_plus_ny, i4_idx_b_plus_nx, i4_index;
1502*495ae853SAndroid Build Coastguard Worker         WORD8 i1_yd_index, i1_xd_index;
1503*495ae853SAndroid Build Coastguard Worker 
1504*495ae853SAndroid Build Coastguard Worker         ps_seg_y_tmp = &ps_seg_desc_y[i4_j];
1505*495ae853SAndroid Build Coastguard Worker         i4_y = i4_y_start_pos + ps_seg_y_tmp->u1_seg_off;
1506*495ae853SAndroid Build Coastguard Worker         u1_seg_ht = ps_seg_y_tmp->u1_seg_dim;
1507*495ae853SAndroid Build Coastguard Worker         i1_yd_index = ps_seg_y_tmp->i1_dist_idx;
1508*495ae853SAndroid Build Coastguard Worker         i1_nearst_mb_bdry_y = ps_seg_y_tmp->i1_nearst_mb_bdry;
1509*495ae853SAndroid Build Coastguard Worker         u1_mb_adjoin_y = ps_seg_y_tmp->u1_mb_adjoin;
1510*495ae853SAndroid Build Coastguard Worker         i4_idx_a = pu1_ref_idx_y[i4_y];
1511*495ae853SAndroid Build Coastguard Worker         i4_idx_a_plus_ny = (i4_idx_a + i1_nearst_mb_bdry_y);
1512*495ae853SAndroid Build Coastguard Worker 
1513*495ae853SAndroid Build Coastguard Worker         /* Pack the availabilities of the next three horizontal MBs in 3bit
1514*495ae853SAndroid Build Coastguard Worker            format and 4th bit indicating if the start position is greater than the mb_width/2 */
1515*495ae853SAndroid Build Coastguard Worker         u4_lookup_4bit = u4_4thbit | u1_avail_map[i4_idx_a][i4_cur_x + 2] << 2 |
1516*495ae853SAndroid Build Coastguard Worker                          u1_avail_map[i4_idx_a][i4_cur_x + 1] << 1 |
1517*495ae853SAndroid Build Coastguard Worker                          u1_avail_map[i4_idx_a][i4_cur_x];
1518*495ae853SAndroid Build Coastguard Worker 
1519*495ae853SAndroid Build Coastguard Worker         u4_num_valid_segs = gu4_valid_segs_lookup[u4_lookup_4bit];
1520*495ae853SAndroid Build Coastguard Worker         i4_i = isvcd_left_most_bit_detect(u4_num_valid_segs);
1521*495ae853SAndroid Build Coastguard Worker         u4_num_valid_segs <<= (i4_i + 1);
1522*495ae853SAndroid Build Coastguard Worker 
1523*495ae853SAndroid Build Coastguard Worker         for(; i4_i < u1_num_sgmts_x; i4_i++)
1524*495ae853SAndroid Build Coastguard Worker         {
1525*495ae853SAndroid Build Coastguard Worker             ps_seg_x_tmp = &ps_seg_desc_x[i4_i];
1526*495ae853SAndroid Build Coastguard Worker             i4_x = i4_x_start_pos + ps_seg_x_tmp->u1_seg_off;
1527*495ae853SAndroid Build Coastguard Worker             i4_idx_b = pu1_ref_idx_x[i4_x];
1528*495ae853SAndroid Build Coastguard Worker             u1_seg_wd = ps_seg_x_tmp->u1_seg_dim;
1529*495ae853SAndroid Build Coastguard Worker             i1_xd_index = ps_seg_x_tmp->i1_dist_idx;
1530*495ae853SAndroid Build Coastguard Worker             i1_nearst_mb_bdry_x = ps_seg_x_tmp->i1_nearst_mb_bdry;
1531*495ae853SAndroid Build Coastguard Worker             u1_mb_adjoin_x = ps_seg_x_tmp->u1_mb_adjoin;
1532*495ae853SAndroid Build Coastguard Worker             i4_idx_b_plus_nx = (i4_idx_b + i1_nearst_mb_bdry_x);
1533*495ae853SAndroid Build Coastguard Worker 
1534*495ae853SAndroid Build Coastguard Worker             /* Find the avalability of (x,y-Yd),(x-Xd,y),(x-Xd,y-Yd) and pack it to 3 bits */
1535*495ae853SAndroid Build Coastguard Worker             u4_lookup_5bit = u1_avail_map[i4_idx_a_plus_ny][i4_idx_b_plus_nx] << 2 |
1536*495ae853SAndroid Build Coastguard Worker                              u1_avail_map[i4_idx_a_plus_ny][i4_idx_b] << 1 |
1537*495ae853SAndroid Build Coastguard Worker                              u1_avail_map[i4_idx_a][i4_idx_b_plus_nx] | u1_mb_adjoin_x |
1538*495ae853SAndroid Build Coastguard Worker                              u1_mb_adjoin_y;
1539*495ae853SAndroid Build Coastguard Worker 
1540*495ae853SAndroid Build Coastguard Worker             i4_corner_pixel_available = u1_avail_map[i4_idx_a_plus_ny][i4_idx_b_plus_nx];
1541*495ae853SAndroid Build Coastguard Worker 
1542*495ae853SAndroid Build Coastguard Worker             /* Function pointer table from lookup to get Left,Top,Bottom,Right,Diagonal padding */
1543*495ae853SAndroid Build Coastguard Worker             if(u4_lookup_5bit > 31)
1544*495ae853SAndroid Build Coastguard Worker             {
1545*495ae853SAndroid Build Coastguard Worker                 u4_lookup_5bit = 0;
1546*495ae853SAndroid Build Coastguard Worker             }
1547*495ae853SAndroid Build Coastguard Worker             pf_intra_samp_padding = pf_intra_samp_lookup[u4_lookup_5bit];
1548*495ae853SAndroid Build Coastguard Worker 
1549*495ae853SAndroid Build Coastguard Worker             if(pf_intra_samp_padding != NULL)
1550*495ae853SAndroid Build Coastguard Worker             {
1551*495ae853SAndroid Build Coastguard Worker                 pf_intra_samp_padding(i4_x, i4_y, i1_xd_index, i1_yd_index, u1_seg_wd, u1_seg_ht,
1552*495ae853SAndroid Build Coastguard Worker                                       pu1_refarray_1, pu1_refarray_2, i4_refarray_stride,
1553*495ae853SAndroid Build Coastguard Worker                                       u1_mb_adjoin_x, u1_mb_adjoin_y, i4_corner_pixel_available);
1554*495ae853SAndroid Build Coastguard Worker             }
1555*495ae853SAndroid Build Coastguard Worker 
1556*495ae853SAndroid Build Coastguard Worker             /* increment to the next unavailable segment */
1557*495ae853SAndroid Build Coastguard Worker             i4_index = isvcd_left_most_bit_detect(u4_num_valid_segs);
1558*495ae853SAndroid Build Coastguard Worker             u4_num_valid_segs <<= (i4_index + 1);
1559*495ae853SAndroid Build Coastguard Worker             i4_i += i4_index;
1560*495ae853SAndroid Build Coastguard Worker 
1561*495ae853SAndroid Build Coastguard Worker         } /* end of loop over ref array width */
1562*495ae853SAndroid Build Coastguard Worker 
1563*495ae853SAndroid Build Coastguard Worker     }     /* end of loop over ref array height */
1564*495ae853SAndroid Build Coastguard Worker     return;
1565*495ae853SAndroid Build Coastguard Worker }
1566*495ae853SAndroid Build Coastguard Worker 
1567*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1568*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1569*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_get_ref_layer_mbtype                                */
1570*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1571*495ae853SAndroid Build Coastguard Worker /*  Description   : This function is used to find the mb type of the         */
1572*495ae853SAndroid Build Coastguard Worker /*                    corresponding MB in the reference layer                */
1573*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1574*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_intra_samp_ctxt : intra samp context                  */
1575*495ae853SAndroid Build Coastguard Worker /*                  pi1_ref_mb_modes : ref mb modes buffer pointer           */
1576*495ae853SAndroid Build Coastguard Worker /*                  i4_ref_mode_stride : mb mode buffer stride               */
1577*495ae853SAndroid Build Coastguard Worker /*                  i4_x_ref : reference location X                          */
1578*495ae853SAndroid Build Coastguard Worker /*                  i4_y_ref : reference location Y                          */
1579*495ae853SAndroid Build Coastguard Worker /*                  pi4_mb_type : pointer to store the mb type               */
1580*495ae853SAndroid Build Coastguard Worker /*                  i4_chroma_flag : chroma flag                             */
1581*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1582*495ae853SAndroid Build Coastguard Worker /*  Processing    : it derives the bit corresponding to reference MB and     */
1583*495ae853SAndroid Build Coastguard Worker /*                  stores the mbtype as INTRA if the bit is set             */
1584*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
1585*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1586*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1587*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1588*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1589*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1590*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1591*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1592*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   vijayakumar          creation                        */
1593*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1594*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_get_ref_layer_mbtype(WORD8 * pi1_ref_mb_modes,WORD32 * pi4_mb_type,WORD8 i1_curr_slice_id,WORD8 i1_cons_intr_samp_flag)1595*495ae853SAndroid Build Coastguard Worker WORD8 isvcd_get_ref_layer_mbtype(WORD8 *pi1_ref_mb_modes, WORD32 *pi4_mb_type,
1596*495ae853SAndroid Build Coastguard Worker                                  WORD8 i1_curr_slice_id, WORD8 i1_cons_intr_samp_flag)
1597*495ae853SAndroid Build Coastguard Worker {
1598*495ae853SAndroid Build Coastguard Worker     WORD8 i1_intra_slice_id;
1599*495ae853SAndroid Build Coastguard Worker     inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms;
1600*495ae853SAndroid Build Coastguard Worker     WORD8 i1_mb_mode;
1601*495ae853SAndroid Build Coastguard Worker 
1602*495ae853SAndroid Build Coastguard Worker     ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes;
1603*495ae853SAndroid Build Coastguard Worker     i1_mb_mode = ps_inter_lyr_mb_prms->i1_mb_mode;
1604*495ae853SAndroid Build Coastguard Worker 
1605*495ae853SAndroid Build Coastguard Worker     if(i1_mb_mode <= SVC_INTER_MB)
1606*495ae853SAndroid Build Coastguard Worker     {
1607*495ae853SAndroid Build Coastguard Worker         /* INTER */
1608*495ae853SAndroid Build Coastguard Worker         *pi4_mb_type = SVC_INTER_MB;
1609*495ae853SAndroid Build Coastguard Worker         i1_intra_slice_id = -1;
1610*495ae853SAndroid Build Coastguard Worker     }
1611*495ae853SAndroid Build Coastguard Worker     else
1612*495ae853SAndroid Build Coastguard Worker     {
1613*495ae853SAndroid Build Coastguard Worker         /* INTRA */
1614*495ae853SAndroid Build Coastguard Worker         *pi4_mb_type = SVC_INTRA_MB;
1615*495ae853SAndroid Build Coastguard Worker         i1_intra_slice_id = ps_inter_lyr_mb_prms->i1_slice_id;
1616*495ae853SAndroid Build Coastguard Worker 
1617*495ae853SAndroid Build Coastguard Worker         if(1 == i1_cons_intr_samp_flag)
1618*495ae853SAndroid Build Coastguard Worker         {
1619*495ae853SAndroid Build Coastguard Worker             /* check for different slice idc */
1620*495ae853SAndroid Build Coastguard Worker             if(ps_inter_lyr_mb_prms->i1_slice_id != i1_curr_slice_id)
1621*495ae853SAndroid Build Coastguard Worker             {
1622*495ae853SAndroid Build Coastguard Worker                 /* store the mode as INTER (not available for upsampling) */
1623*495ae853SAndroid Build Coastguard Worker                 *pi4_mb_type = SVC_INTER_MB;
1624*495ae853SAndroid Build Coastguard Worker             }
1625*495ae853SAndroid Build Coastguard Worker         }
1626*495ae853SAndroid Build Coastguard Worker     }
1627*495ae853SAndroid Build Coastguard Worker 
1628*495ae853SAndroid Build Coastguard Worker     /* if contarained intra flag is 1 then check for same mb mode */
1629*495ae853SAndroid Build Coastguard Worker     return (i1_intra_slice_id);
1630*495ae853SAndroid Build Coastguard Worker }
1631*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1632*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1633*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_reflayer_construction                               */
1634*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1635*495ae853SAndroid Build Coastguard Worker /*  Description   :  This function constructs the reference array buffer     */
1636*495ae853SAndroid Build Coastguard Worker /*                    used for intra resampling of a component in an MB      */
1637*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1638*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_intra_samp_ctxt: intra sampling context               */
1639*495ae853SAndroid Build Coastguard Worker /*                  pu1_inp : input (reference layer data)                   */
1640*495ae853SAndroid Build Coastguard Worker /*                  i4_inp_stride : input buffer stride                      */
1641*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_mb_mode_map : ref layer mb mode buffer desc       */
1642*495ae853SAndroid Build Coastguard Worker /*                  pi4_refarr_wd : pointer to store the reference array WD  */
1643*495ae853SAndroid Build Coastguard Worker /*                  pi4_refarr_ht : pointer to store the reference array HT  */
1644*495ae853SAndroid Build Coastguard Worker /*                  pi4_x_offset : pointer to store the reference X offset   */
1645*495ae853SAndroid Build Coastguard Worker /*                  pi4_y_offset : pointer to store the reference Y offset   */
1646*495ae853SAndroid Build Coastguard Worker /*                  ps_coord     : mb co-ordinate structure                  */
1647*495ae853SAndroid Build Coastguard Worker /*                  i4_chroma_flag : chroma processing flag                  */
1648*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
1649*495ae853SAndroid Build Coastguard Worker /*  Processing    : it fills the reference layer data if they are falling in */
1650*495ae853SAndroid Build Coastguard Worker /*                  INTRA MB region. If all the pixels are not filled  it    */
1651*495ae853SAndroid Build Coastguard Worker /*                  calls the border extension algorithm to fill them        */
1652*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
1653*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
1654*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1655*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1656*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1657*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1658*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1659*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1660*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   vijayakumar          creation                        */
1661*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_reflayer_construction(void * pv_intra_samp_ctxt,UWORD8 * pu1_inp_1,UWORD8 * pu1_inp_2,WORD32 i4_inp_stride,WORD32 i4_refarray_stride,mem_element_t * ps_ref_mb_mode_map,mb_coord_t * ps_coord,WORD32 i4_chroma_flag)1662*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_reflayer_construction(void *pv_intra_samp_ctxt, UWORD8 *pu1_inp_1, UWORD8 *pu1_inp_2,
1663*495ae853SAndroid Build Coastguard Worker                                    WORD32 i4_inp_stride, WORD32 i4_refarray_stride,
1664*495ae853SAndroid Build Coastguard Worker                                    mem_element_t *ps_ref_mb_mode_map, mb_coord_t *ps_coord,
1665*495ae853SAndroid Build Coastguard Worker                                    WORD32 i4_chroma_flag)
1666*495ae853SAndroid Build Coastguard Worker {
1667*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
1668*495ae853SAndroid Build Coastguard Worker 
1669*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1670*495ae853SAndroid Build Coastguard Worker     /* Context and reference layer realted varaibles                         */
1671*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1672*495ae853SAndroid Build Coastguard Worker     intra_sampling_ctxt_t *ps_ctxt;
1673*495ae853SAndroid Build Coastguard Worker     intra_samp_map_ctxt_t *ps_map_ctxt;
1674*495ae853SAndroid Build Coastguard Worker     intra_samp_lyr_ctxt *ps_lyr_ctxt;
1675*495ae853SAndroid Build Coastguard Worker     WORD8 *pi1_ref_mb_modes, *pi1_ref_mb_modes_bkp_1;
1676*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_mode_stride;
1677*495ae853SAndroid Build Coastguard Worker     WORD32 i4_element_size;
1678*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t *ps_x_off_len;
1679*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t *ps_y_off_len;
1680*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mbaddr_y;
1681*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mbaddr_x;
1682*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_ht, i4_mb_wd;
1683*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_map_buf[4][4] = {0}; /*!< 4x4 mb grid buffer to store the mb availablity */
1684*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1685*495ae853SAndroid Build Coastguard Worker     /* Temp Variables for Mapping context                                     */
1686*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1687*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_wd;
1688*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_ht;
1689*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x_offset;
1690*495ae853SAndroid Build Coastguard Worker     WORD32 i4_y_offset;
1691*495ae853SAndroid Build Coastguard Worker     WORD32 i4_refarray_wd;
1692*495ae853SAndroid Build Coastguard Worker     WORD32 i4_refarray_ht;
1693*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_type;
1694*495ae853SAndroid Build Coastguard Worker     WORD8 i1_cons_intr_samp_flag;
1695*495ae853SAndroid Build Coastguard Worker     WORD8 i1_slice_id = 0;
1696*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_wd_sft, i4_mb_ht_sft;
1697*495ae853SAndroid Build Coastguard Worker 
1698*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1699*495ae853SAndroid Build Coastguard Worker     /* Local Pointer Declaration for arrays in Mapping context                 */
1700*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1701*495ae853SAndroid Build Coastguard Worker 
1702*495ae853SAndroid Build Coastguard Worker     WORD32 i4_unfill_check;
1703*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_refarray_1, *pu1_refarray_2;
1704*495ae853SAndroid Build Coastguard Worker 
1705*495ae853SAndroid Build Coastguard Worker     UNUSED(pu1_inp_2);
1706*495ae853SAndroid Build Coastguard Worker 
1707*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (intra_sampling_ctxt_t *) pv_intra_samp_ctxt;
1708*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
1709*495ae853SAndroid Build Coastguard Worker     pi1_ref_mb_modes = (WORD8 *) ps_ref_mb_mode_map->pv_buffer;
1710*495ae853SAndroid Build Coastguard Worker     i4_ref_mode_stride = ps_ref_mb_mode_map->i4_num_element_stride;
1711*495ae853SAndroid Build Coastguard Worker     i4_element_size = ps_ref_mb_mode_map->i4_element_size;
1712*495ae853SAndroid Build Coastguard Worker 
1713*495ae853SAndroid Build Coastguard Worker     /* get the condtrained intra sampling flag */
1714*495ae853SAndroid Build Coastguard Worker     i1_cons_intr_samp_flag = ps_lyr_ctxt->i1_constrained_intra_rsmpl_flag;
1715*495ae853SAndroid Build Coastguard Worker 
1716*495ae853SAndroid Build Coastguard Worker     if(NULL == pi1_ref_mb_modes)
1717*495ae853SAndroid Build Coastguard Worker     {
1718*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
1719*495ae853SAndroid Build Coastguard Worker     }
1720*495ae853SAndroid Build Coastguard Worker 
1721*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1722*495ae853SAndroid Build Coastguard Worker     /* Based on Chroma and Luma, extracting the context information struct     */
1723*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1724*495ae853SAndroid Build Coastguard Worker     if(1 == i4_chroma_flag)
1725*495ae853SAndroid Build Coastguard Worker         ps_map_ctxt = &ps_lyr_ctxt->s_chroma_map_ctxt;
1726*495ae853SAndroid Build Coastguard Worker     else
1727*495ae853SAndroid Build Coastguard Worker         ps_map_ctxt = &ps_lyr_ctxt->s_luma_map_ctxt;
1728*495ae853SAndroid Build Coastguard Worker 
1729*495ae853SAndroid Build Coastguard Worker     ps_x_off_len = ps_map_ctxt->ps_x_offset_length;
1730*495ae853SAndroid Build Coastguard Worker     ps_y_off_len = ps_map_ctxt->ps_y_offset_length;
1731*495ae853SAndroid Build Coastguard Worker 
1732*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1733*495ae853SAndroid Build Coastguard Worker     /* Deriving the parameters required for further processing                 */
1734*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1735*495ae853SAndroid Build Coastguard Worker     {
1736*495ae853SAndroid Build Coastguard Worker         WORD32 i4_base_width = ps_lyr_ctxt->i4_ref_width;
1737*495ae853SAndroid Build Coastguard Worker         WORD32 i4_base_height = ps_lyr_ctxt->i4_ref_height;
1738*495ae853SAndroid Build Coastguard Worker 
1739*495ae853SAndroid Build Coastguard Worker         i4_ref_wd = i4_base_width >> i4_chroma_flag;
1740*495ae853SAndroid Build Coastguard Worker         i4_ref_ht = i4_base_height >> i4_chroma_flag;
1741*495ae853SAndroid Build Coastguard Worker         i4_mb_wd_sft = (MB_WIDTH_SHIFT - i4_chroma_flag);
1742*495ae853SAndroid Build Coastguard Worker         i4_mb_ht_sft = (MB_HEIGHT_SHIFT - i4_chroma_flag);
1743*495ae853SAndroid Build Coastguard Worker     }
1744*495ae853SAndroid Build Coastguard Worker 
1745*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1746*495ae853SAndroid Build Coastguard Worker     /* Local variables based on the MB address                                 */
1747*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1748*495ae853SAndroid Build Coastguard Worker     i4_mbaddr_y = ps_coord->u2_mb_y;
1749*495ae853SAndroid Build Coastguard Worker     i4_mbaddr_x = ps_coord->u2_mb_x;
1750*495ae853SAndroid Build Coastguard Worker     i4_x_offset = ps_x_off_len[i4_mbaddr_x].i2_offset;
1751*495ae853SAndroid Build Coastguard Worker     i4_y_offset = ps_y_off_len[i4_mbaddr_y].i2_offset;
1752*495ae853SAndroid Build Coastguard Worker     i4_refarray_wd = ps_x_off_len[i4_mbaddr_x].i2_length;
1753*495ae853SAndroid Build Coastguard Worker     i4_refarray_ht = ps_y_off_len[i4_mbaddr_y].i2_length;
1754*495ae853SAndroid Build Coastguard Worker     i4_mb_wd = (MB_WIDTH >> i4_chroma_flag);
1755*495ae853SAndroid Build Coastguard Worker     i4_mb_ht = (MB_HEIGHT >> i4_chroma_flag);
1756*495ae853SAndroid Build Coastguard Worker 
1757*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1758*495ae853SAndroid Build Coastguard Worker     /* Derivation of ref slice MB idc                                         */
1759*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1760*495ae853SAndroid Build Coastguard Worker     if(1 == i1_cons_intr_samp_flag)
1761*495ae853SAndroid Build Coastguard Worker     {
1762*495ae853SAndroid Build Coastguard Worker         WORD32 i4_x_min, i4_x_max;
1763*495ae853SAndroid Build Coastguard Worker         WORD32 i4_y_min, i4_y_max;
1764*495ae853SAndroid Build Coastguard Worker         ref_min_max_map_t *ps_x_min_max;
1765*495ae853SAndroid Build Coastguard Worker         ref_min_max_map_t *ps_y_min_max;
1766*495ae853SAndroid Build Coastguard Worker 
1767*495ae853SAndroid Build Coastguard Worker         ps_x_min_max = ps_map_ctxt->ps_x_min_max;
1768*495ae853SAndroid Build Coastguard Worker         ps_y_min_max = ps_map_ctxt->ps_y_min_max;
1769*495ae853SAndroid Build Coastguard Worker 
1770*495ae853SAndroid Build Coastguard Worker         /* get the min and max positions */
1771*495ae853SAndroid Build Coastguard Worker         i4_x_min = ps_x_min_max[i4_mbaddr_x].i2_min_pos;
1772*495ae853SAndroid Build Coastguard Worker         i4_x_max = ps_x_min_max[i4_mbaddr_x].i2_max_pos;
1773*495ae853SAndroid Build Coastguard Worker         i4_y_min = ps_y_min_max[i4_mbaddr_y].i2_min_pos;
1774*495ae853SAndroid Build Coastguard Worker         i4_y_max = ps_y_min_max[i4_mbaddr_y].i2_max_pos;
1775*495ae853SAndroid Build Coastguard Worker 
1776*495ae853SAndroid Build Coastguard Worker         /* default initialization */
1777*495ae853SAndroid Build Coastguard Worker         i4_mb_type = SVC_INTER_MB;
1778*495ae853SAndroid Build Coastguard Worker 
1779*495ae853SAndroid Build Coastguard Worker         {
1780*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_ref;
1781*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_ref;
1782*495ae853SAndroid Build Coastguard Worker             WORD32 i4_mb_x, i4_mb_y;
1783*495ae853SAndroid Build Coastguard Worker 
1784*495ae853SAndroid Build Coastguard Worker             i4_y_ref = (i4_y_min + 1) + i4_y_offset;
1785*495ae853SAndroid Build Coastguard Worker             i4_x_ref = (i4_x_min + 1) + i4_x_offset;
1786*495ae853SAndroid Build Coastguard Worker             i4_mb_x = (i4_x_ref >> i4_mb_wd_sft);
1787*495ae853SAndroid Build Coastguard Worker             i4_mb_y = (i4_y_ref >> i4_mb_ht_sft);
1788*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_modes = (WORD8 *) ps_ref_mb_mode_map->pv_buffer;
1789*495ae853SAndroid Build Coastguard Worker 
1790*495ae853SAndroid Build Coastguard Worker             /* get the location of the byte which has the current mb mode */
1791*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_modes += (i4_mb_y * i4_ref_mode_stride * i4_element_size);
1792*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_modes += (i4_mb_x * i4_element_size);
1793*495ae853SAndroid Build Coastguard Worker         }
1794*495ae853SAndroid Build Coastguard Worker 
1795*495ae853SAndroid Build Coastguard Worker         for(i4_y = (i4_y_min + 1); i4_y <= (i4_y_max - 1);)
1796*495ae853SAndroid Build Coastguard Worker         {
1797*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_ref;
1798*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_ref;
1799*495ae853SAndroid Build Coastguard Worker             WORD32 i4_distleftX, i4_rangeX;
1800*495ae853SAndroid Build Coastguard Worker             WORD32 i4_disttopY, i4_rangeY;
1801*495ae853SAndroid Build Coastguard Worker 
1802*495ae853SAndroid Build Coastguard Worker             i4_y_ref = (i4_y + i4_y_offset);
1803*495ae853SAndroid Build Coastguard Worker             i4_disttopY = (i4_y_ref) & (i4_mb_ht - 1);
1804*495ae853SAndroid Build Coastguard Worker             i4_rangeY = (i4_mb_ht - i4_disttopY);
1805*495ae853SAndroid Build Coastguard Worker 
1806*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_modes_bkp_1 = pi1_ref_mb_modes;
1807*495ae853SAndroid Build Coastguard Worker 
1808*495ae853SAndroid Build Coastguard Worker             for(i4_x = (i4_x_min + 1); i4_x <= (i4_x_max - 1);)
1809*495ae853SAndroid Build Coastguard Worker             {
1810*495ae853SAndroid Build Coastguard Worker                 i4_x_ref = (i4_x + i4_x_offset);
1811*495ae853SAndroid Build Coastguard Worker                 i4_distleftX = (i4_x_ref) & (i4_mb_wd - 1);
1812*495ae853SAndroid Build Coastguard Worker                 i4_rangeX = (i4_mb_wd - i4_distleftX);
1813*495ae853SAndroid Build Coastguard Worker 
1814*495ae853SAndroid Build Coastguard Worker                 /* get the referecne layer mb type */
1815*495ae853SAndroid Build Coastguard Worker                 i1_slice_id =
1816*495ae853SAndroid Build Coastguard Worker                     isvcd_get_ref_layer_mbtype(pi1_ref_mb_modes_bkp_1, &i4_mb_type, i1_slice_id, 0);
1817*495ae853SAndroid Build Coastguard Worker                 if(SVC_INTRA_MB == i4_mb_type)
1818*495ae853SAndroid Build Coastguard Worker                 {
1819*495ae853SAndroid Build Coastguard Worker                     /* if an Intra MB is returned then break the loop */
1820*495ae853SAndroid Build Coastguard Worker                     break;
1821*495ae853SAndroid Build Coastguard Worker                 }
1822*495ae853SAndroid Build Coastguard Worker 
1823*495ae853SAndroid Build Coastguard Worker                 i4_x += i4_rangeX;
1824*495ae853SAndroid Build Coastguard Worker                 pi1_ref_mb_modes_bkp_1 += i4_element_size;
1825*495ae853SAndroid Build Coastguard Worker             } /* end of loop in horizontal direction */
1826*495ae853SAndroid Build Coastguard Worker 
1827*495ae853SAndroid Build Coastguard Worker             if(SVC_INTRA_MB == i4_mb_type)
1828*495ae853SAndroid Build Coastguard Worker             {
1829*495ae853SAndroid Build Coastguard Worker                 /* if an Intra MB is returned then break the loop */
1830*495ae853SAndroid Build Coastguard Worker                 break;
1831*495ae853SAndroid Build Coastguard Worker             }
1832*495ae853SAndroid Build Coastguard Worker 
1833*495ae853SAndroid Build Coastguard Worker             i4_y += i4_rangeY;
1834*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_modes += (i4_ref_mode_stride * i4_element_size);
1835*495ae853SAndroid Build Coastguard Worker 
1836*495ae853SAndroid Build Coastguard Worker         } /* end of loop in vertical direction */
1837*495ae853SAndroid Build Coastguard Worker     }
1838*495ae853SAndroid Build Coastguard Worker     else
1839*495ae853SAndroid Build Coastguard Worker     {
1840*495ae853SAndroid Build Coastguard Worker         /* set to non valid value */
1841*495ae853SAndroid Build Coastguard Worker         i1_slice_id = -1;
1842*495ae853SAndroid Build Coastguard Worker     }
1843*495ae853SAndroid Build Coastguard Worker 
1844*495ae853SAndroid Build Coastguard Worker     i4_unfill_check = 0;
1845*495ae853SAndroid Build Coastguard Worker 
1846*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1847*495ae853SAndroid Build Coastguard Worker     /* Copying the data from recon buffer to refSample Array.                */
1848*495ae853SAndroid Build Coastguard Worker     /* NOTE: The copying of the data from recon buffer to refSample Array    */
1849*495ae853SAndroid Build Coastguard Worker     /*       can be optimized by bring in data at N-MB level,thus taking     */
1850*495ae853SAndroid Build Coastguard Worker     /*       advantage of the overlapping data which now gets copied every MB*/
1851*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1852*495ae853SAndroid Build Coastguard Worker     {
1853*495ae853SAndroid Build Coastguard Worker         WORD32 i4_x_ref_start, i4_x_ref_end;
1854*495ae853SAndroid Build Coastguard Worker         WORD32 i4_y_ref_start, i4_y_ref_end;
1855*495ae853SAndroid Build Coastguard Worker         WORD32 i4_rangeW, i4_rangeH;
1856*495ae853SAndroid Build Coastguard Worker         WORD32 i4_offset;
1857*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_src, *pu1_dst;
1858*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_dst1, *pu1_dst2;
1859*495ae853SAndroid Build Coastguard Worker 
1860*495ae853SAndroid Build Coastguard Worker         /* Copy (refW x refH) dimension into reference sample array */
1861*495ae853SAndroid Build Coastguard Worker         i4_x_ref_start = MAX(0, MIN((i4_ref_wd - 1), i4_x_offset));
1862*495ae853SAndroid Build Coastguard Worker         i4_x_ref_end = MAX(0, MIN((i4_ref_wd - 1), (i4_refarray_wd - 1) + i4_x_offset));
1863*495ae853SAndroid Build Coastguard Worker         i4_y_ref_start = MAX(0, MIN((i4_ref_ht - 1), i4_y_offset));
1864*495ae853SAndroid Build Coastguard Worker         i4_y_ref_end = MAX(0, MIN((i4_ref_ht - 1), (i4_refarray_ht - 1) + i4_y_offset));
1865*495ae853SAndroid Build Coastguard Worker 
1866*495ae853SAndroid Build Coastguard Worker         /* find the actual data to be copied */
1867*495ae853SAndroid Build Coastguard Worker         i4_rangeW = (i4_x_ref_end - i4_x_ref_start + 1);
1868*495ae853SAndroid Build Coastguard Worker         i4_rangeH = (i4_y_ref_end - i4_y_ref_start + 1);
1869*495ae853SAndroid Build Coastguard Worker 
1870*495ae853SAndroid Build Coastguard Worker         /* get the reconbuffer pointer and ref sample array pointer */
1871*495ae853SAndroid Build Coastguard Worker         i4_offset =
1872*495ae853SAndroid Build Coastguard Worker             (i4_x_ref_start - i4_x_offset) + ((i4_y_ref_start - i4_y_offset) * i4_refarray_stride);
1873*495ae853SAndroid Build Coastguard Worker 
1874*495ae853SAndroid Build Coastguard Worker         if(0 == i4_chroma_flag)
1875*495ae853SAndroid Build Coastguard Worker         {
1876*495ae853SAndroid Build Coastguard Worker             pu1_refarray_1 = ps_ctxt->pu1_refarray_buffer;
1877*495ae853SAndroid Build Coastguard Worker             pu1_refarray_2 = NULL;
1878*495ae853SAndroid Build Coastguard Worker             pu1_src = pu1_inp_1;
1879*495ae853SAndroid Build Coastguard Worker             pu1_dst = pu1_refarray_1 + i4_offset;
1880*495ae853SAndroid Build Coastguard Worker 
1881*495ae853SAndroid Build Coastguard Worker             /* Copy luma data into refsample array */
1882*495ae853SAndroid Build Coastguard Worker             isvcd_copy_data(pu1_src, i4_inp_stride, pu1_dst, i4_refarray_stride, i4_rangeW,
1883*495ae853SAndroid Build Coastguard Worker                             i4_rangeH);
1884*495ae853SAndroid Build Coastguard Worker         }
1885*495ae853SAndroid Build Coastguard Worker         else
1886*495ae853SAndroid Build Coastguard Worker         {
1887*495ae853SAndroid Build Coastguard Worker             pu1_refarray_1 = ps_ctxt->pu1_refarray_buffer;
1888*495ae853SAndroid Build Coastguard Worker             pu1_refarray_2 = ps_ctxt->pu1_refarray_cb;
1889*495ae853SAndroid Build Coastguard Worker             pu1_src = pu1_inp_1;
1890*495ae853SAndroid Build Coastguard Worker             pu1_dst1 = pu1_refarray_1 + i4_offset;
1891*495ae853SAndroid Build Coastguard Worker             pu1_dst2 = pu1_refarray_2 + i4_offset;
1892*495ae853SAndroid Build Coastguard Worker             isvcd_copy_data_semiplanr(pu1_src, i4_inp_stride, pu1_dst1, pu1_dst2,
1893*495ae853SAndroid Build Coastguard Worker                                       i4_refarray_stride, i4_rangeW, i4_rangeH);
1894*495ae853SAndroid Build Coastguard Worker         }
1895*495ae853SAndroid Build Coastguard Worker     }
1896*495ae853SAndroid Build Coastguard Worker 
1897*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1898*495ae853SAndroid Build Coastguard Worker     /* Loop to fill ref sample array and corresponding map for interpolation */
1899*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1900*495ae853SAndroid Build Coastguard Worker     {
1901*495ae853SAndroid Build Coastguard Worker         WORD32 i4_i, i4_j;
1902*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_ref_idx_x, *pu1_ref_idx_y;
1903*495ae853SAndroid Build Coastguard Worker         WORD32 i4_x_ref;
1904*495ae853SAndroid Build Coastguard Worker         WORD32 i4_y_ref;
1905*495ae853SAndroid Build Coastguard Worker         WORD32 i4_mb_x, i4_mb_y;
1906*495ae853SAndroid Build Coastguard Worker 
1907*495ae853SAndroid Build Coastguard Worker         i4_y_ref = i4_y_offset;
1908*495ae853SAndroid Build Coastguard Worker         i4_x_ref = i4_x_offset;
1909*495ae853SAndroid Build Coastguard Worker         i4_mb_x = (i4_x_ref >> i4_mb_wd_sft);
1910*495ae853SAndroid Build Coastguard Worker         i4_mb_y = (i4_y_ref >> i4_mb_ht_sft);
1911*495ae853SAndroid Build Coastguard Worker         pi1_ref_mb_modes = (WORD8 *) ps_ref_mb_mode_map->pv_buffer;
1912*495ae853SAndroid Build Coastguard Worker 
1913*495ae853SAndroid Build Coastguard Worker         /* get the location of the byte which has the current mb mode */
1914*495ae853SAndroid Build Coastguard Worker         pi1_ref_mb_modes += (i4_mb_y * i4_ref_mode_stride * i4_element_size);
1915*495ae853SAndroid Build Coastguard Worker         pi1_ref_mb_modes += (i4_mb_x * i4_element_size);
1916*495ae853SAndroid Build Coastguard Worker         pu1_ref_idx_x = ps_map_ctxt->pu1_refarray_x_idx;
1917*495ae853SAndroid Build Coastguard Worker         pu1_ref_idx_y = ps_map_ctxt->pu1_refarray_y_idx;
1918*495ae853SAndroid Build Coastguard Worker 
1919*495ae853SAndroid Build Coastguard Worker         i4_j = 0;
1920*495ae853SAndroid Build Coastguard Worker         for(i4_y = 0; i4_y < i4_refarray_ht;)
1921*495ae853SAndroid Build Coastguard Worker         {
1922*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_ref;
1923*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_ref;
1924*495ae853SAndroid Build Coastguard Worker             WORD32 i4_distleftX, i4_rangeX;
1925*495ae853SAndroid Build Coastguard Worker             WORD32 i4_disttopY, i4_rangeY;
1926*495ae853SAndroid Build Coastguard Worker 
1927*495ae853SAndroid Build Coastguard Worker             i4_y_ref = i4_y + i4_y_offset;
1928*495ae853SAndroid Build Coastguard Worker             i4_disttopY = (i4_y_ref) & (i4_mb_ht - 1);
1929*495ae853SAndroid Build Coastguard Worker             i4_rangeY = (i4_mb_ht - i4_disttopY);
1930*495ae853SAndroid Build Coastguard Worker 
1931*495ae853SAndroid Build Coastguard Worker             /* find the y-index lookup */
1932*495ae853SAndroid Build Coastguard Worker             memset(pu1_ref_idx_y, i4_j, i4_rangeY);
1933*495ae853SAndroid Build Coastguard Worker             pu1_ref_idx_y += i4_rangeY;
1934*495ae853SAndroid Build Coastguard Worker 
1935*495ae853SAndroid Build Coastguard Worker             i4_i = 0;
1936*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_modes_bkp_1 = pi1_ref_mb_modes;
1937*495ae853SAndroid Build Coastguard Worker             for(i4_x = 0; i4_x < i4_refarray_wd;)
1938*495ae853SAndroid Build Coastguard Worker             {
1939*495ae853SAndroid Build Coastguard Worker                 i4_x_ref = i4_x + i4_x_offset;
1940*495ae853SAndroid Build Coastguard Worker                 i4_distleftX = (i4_x_ref) & (i4_mb_wd - 1);
1941*495ae853SAndroid Build Coastguard Worker                 i4_rangeX = (i4_mb_wd - i4_distleftX);
1942*495ae853SAndroid Build Coastguard Worker 
1943*495ae853SAndroid Build Coastguard Worker                 if(0 == i4_j)
1944*495ae853SAndroid Build Coastguard Worker                 {
1945*495ae853SAndroid Build Coastguard Worker                     /* find the x-index lookup */
1946*495ae853SAndroid Build Coastguard Worker                     memset(pu1_ref_idx_x, i4_i, i4_rangeX);
1947*495ae853SAndroid Build Coastguard Worker                     pu1_ref_idx_x += i4_rangeX;
1948*495ae853SAndroid Build Coastguard Worker                 }
1949*495ae853SAndroid Build Coastguard Worker 
1950*495ae853SAndroid Build Coastguard Worker                 /* get the referecne layer mb type */
1951*495ae853SAndroid Build Coastguard Worker                 isvcd_get_ref_layer_mbtype(pi1_ref_mb_modes_bkp_1, &i4_mb_type, i1_slice_id,
1952*495ae853SAndroid Build Coastguard Worker                                            i1_cons_intr_samp_flag);
1953*495ae853SAndroid Build Coastguard Worker 
1954*495ae853SAndroid Build Coastguard Worker                 if(SVC_INTRA_MB == i4_mb_type)
1955*495ae853SAndroid Build Coastguard Worker                 {
1956*495ae853SAndroid Build Coastguard Worker                     u1_map_buf[i4_j][i4_i] = 1;
1957*495ae853SAndroid Build Coastguard Worker                 }
1958*495ae853SAndroid Build Coastguard Worker                 else
1959*495ae853SAndroid Build Coastguard Worker                 {
1960*495ae853SAndroid Build Coastguard Worker                     i4_unfill_check = 1;
1961*495ae853SAndroid Build Coastguard Worker                 }
1962*495ae853SAndroid Build Coastguard Worker 
1963*495ae853SAndroid Build Coastguard Worker                 i4_x = i4_x + i4_rangeX;
1964*495ae853SAndroid Build Coastguard Worker                 i4_i++;
1965*495ae853SAndroid Build Coastguard Worker                 pi1_ref_mb_modes_bkp_1 += i4_element_size;
1966*495ae853SAndroid Build Coastguard Worker 
1967*495ae853SAndroid Build Coastguard Worker             } /* end of loop over ref array width */
1968*495ae853SAndroid Build Coastguard Worker 
1969*495ae853SAndroid Build Coastguard Worker             i4_j++;
1970*495ae853SAndroid Build Coastguard Worker             i4_y = i4_y + i4_rangeY;
1971*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_modes += (i4_ref_mode_stride * i4_element_size);
1972*495ae853SAndroid Build Coastguard Worker         } /* end of loop over ref array height */
1973*495ae853SAndroid Build Coastguard Worker     }
1974*495ae853SAndroid Build Coastguard Worker 
1975*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1976*495ae853SAndroid Build Coastguard Worker     /* Calling boundary extension algorithm to fill unfilled pixels             */
1977*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
1978*495ae853SAndroid Build Coastguard Worker     if(i4_unfill_check == 1)
1979*495ae853SAndroid Build Coastguard Worker     {
1980*495ae853SAndroid Build Coastguard Worker         isvcd_fill_non_avail_pixel(ps_map_ctxt, pu1_refarray_1, pu1_refarray_2, i4_refarray_stride,
1981*495ae853SAndroid Build Coastguard Worker                                    ps_coord, i4_chroma_flag, u1_map_buf);
1982*495ae853SAndroid Build Coastguard Worker     }
1983*495ae853SAndroid Build Coastguard Worker     return OK;
1984*495ae853SAndroid Build Coastguard Worker }
1985*495ae853SAndroid Build Coastguard Worker 
1986*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1987*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1988*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_reflayer_construction_dyadic                        */
1989*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1990*495ae853SAndroid Build Coastguard Worker /*  Description   :  This function constructs the reference array buffer     */
1991*495ae853SAndroid Build Coastguard Worker /*                   for dyadic cases used for intra resampling of a         */
1992*495ae853SAndroid Build Coastguard Worker /*                     component in an MB                                    */
1993*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1994*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_intra_samp_ctxt : intra sampling context              */
1995*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_mb_mode_map : ref layer mb mode buffer desc       */
1996*495ae853SAndroid Build Coastguard Worker /*                  pu1_inp_luma : luma input (reference layer data)         */
1997*495ae853SAndroid Build Coastguard Worker /*                    pu1_inp_chroma : chroma input (reference layer data)   */
1998*495ae853SAndroid Build Coastguard Worker /*                  i4_inp_luma_stride : luma input buffer stride            */
1999*495ae853SAndroid Build Coastguard Worker /*                    i4_inp_chroma_stride : chroma input buffer stride      */
2000*495ae853SAndroid Build Coastguard Worker /*                  i4_top : indicates whether the core 8x8 reference block  */
2001*495ae853SAndroid Build Coastguard Worker /*                             is one of 0 and 1 or one of 2 and 3           */
2002*495ae853SAndroid Build Coastguard Worker /*                    i4_left : indicates whether the core 8x8 ref block     */
2003*495ae853SAndroid Build Coastguard Worker /*                             is one of 0 and 2 or one of 1 and 3           */
2004*495ae853SAndroid Build Coastguard Worker /*                    ps_ref_mb_coord : coordinates of the reference MB      */
2005*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
2006*495ae853SAndroid Build Coastguard Worker /*  Processing    : it fills the reference layer data if they are falling in */
2007*495ae853SAndroid Build Coastguard Worker /*                  INTRA MB region. If all the pixels are not filled  it    */
2008*495ae853SAndroid Build Coastguard Worker /*                  calls the border extension algorithm to fill them        */
2009*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
2010*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
2011*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2012*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
2013*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2014*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
2015*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2016*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
2017*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay           creation                             */
2018*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2019*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_reflayer_construction_dyadic(void * pv_intra_samp_ctxt,mem_element_t * ps_ref_mb_mode_map,UWORD8 * pu1_inp_luma,UWORD8 * pu1_inp_chroma,WORD32 i4_inp_luma_stride,WORD32 i4_inp_chroma_stride,WORD32 i4_top,WORD32 i4_left,UWORD16 u2_mb_x,UWORD16 u2_mb_y)2020*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_reflayer_construction_dyadic(void *pv_intra_samp_ctxt,
2021*495ae853SAndroid Build Coastguard Worker                                           mem_element_t *ps_ref_mb_mode_map, UWORD8 *pu1_inp_luma,
2022*495ae853SAndroid Build Coastguard Worker                                           UWORD8 *pu1_inp_chroma, WORD32 i4_inp_luma_stride,
2023*495ae853SAndroid Build Coastguard Worker                                           WORD32 i4_inp_chroma_stride, WORD32 i4_top,
2024*495ae853SAndroid Build Coastguard Worker                                           WORD32 i4_left, UWORD16 u2_mb_x, UWORD16 u2_mb_y)
2025*495ae853SAndroid Build Coastguard Worker {
2026*495ae853SAndroid Build Coastguard Worker     /* Index variables */
2027*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
2028*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x0, i4_y0;
2029*495ae853SAndroid Build Coastguard Worker     WORD32 i4_xc0, i4_yc0;
2030*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_xD, i4_ref_yD;
2031*495ae853SAndroid Build Coastguard Worker     WORD32 i4_c_ref_xD, i4_c_ref_yD;
2032*495ae853SAndroid Build Coastguard Worker 
2033*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2034*495ae853SAndroid Build Coastguard Worker     /* Context and reference layer related variables                         */
2035*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2036*495ae853SAndroid Build Coastguard Worker     intra_sampling_ctxt_t *ps_ctxt;
2037*495ae853SAndroid Build Coastguard Worker     intra_samp_lyr_ctxt *ps_lyr_ctxt;
2038*495ae853SAndroid Build Coastguard Worker     WORD8 *pi1_ref_mb_modes;
2039*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_mode_stride;
2040*495ae853SAndroid Build Coastguard Worker     WORD32 i4_element_size;
2041*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mbaddr_y;
2042*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mbaddr_x;
2043*495ae853SAndroid Build Coastguard Worker 
2044*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2045*495ae853SAndroid Build Coastguard Worker     /* Temp Variables for Mapping context                                     */
2046*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2047*495ae853SAndroid Build Coastguard Worker     WORD32 i4_refarray_wd_luma, i4_refarray_wd_chroma;
2048*495ae853SAndroid Build Coastguard Worker     WORD32 i4_refarray_ht_luma, i4_refarray_ht_chroma;
2049*495ae853SAndroid Build Coastguard Worker     WORD32 i4_avlblty;
2050*495ae853SAndroid Build Coastguard Worker     WORD8 i1_cons_intr_samp_flag;
2051*495ae853SAndroid Build Coastguard Worker     WORD8 i1_slice_id;
2052*495ae853SAndroid Build Coastguard Worker     WORD8 i1_corner_samp_avlbl_flag;
2053*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_ny_avlblty;
2054*495ae853SAndroid Build Coastguard Worker 
2055*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2056*495ae853SAndroid Build Coastguard Worker     /* Local Pointer Declaration for arrays in Mapping context                 */
2057*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2058*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_refarray_luma;
2059*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_refarray_cb, *pu1_refarray_cr;
2060*495ae853SAndroid Build Coastguard Worker 
2061*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2062*495ae853SAndroid Build Coastguard Worker     /* Derivation of local variables                                         */
2063*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2064*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (intra_sampling_ctxt_t *) pv_intra_samp_ctxt;
2065*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
2066*495ae853SAndroid Build Coastguard Worker     pi1_ref_mb_modes = (WORD8 *) ps_ref_mb_mode_map->pv_buffer;
2067*495ae853SAndroid Build Coastguard Worker     i4_ref_mode_stride = ps_ref_mb_mode_map->i4_num_element_stride;
2068*495ae853SAndroid Build Coastguard Worker     i4_element_size = ps_ref_mb_mode_map->i4_element_size;
2069*495ae853SAndroid Build Coastguard Worker 
2070*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2071*495ae853SAndroid Build Coastguard Worker     /* get the constrained intra resampling flag                             */
2072*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2073*495ae853SAndroid Build Coastguard Worker     i1_cons_intr_samp_flag = ps_lyr_ctxt->i1_constrained_intra_rsmpl_flag;
2074*495ae853SAndroid Build Coastguard Worker     if(NULL == pi1_ref_mb_modes)
2075*495ae853SAndroid Build Coastguard Worker     {
2076*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
2077*495ae853SAndroid Build Coastguard Worker     }
2078*495ae853SAndroid Build Coastguard Worker 
2079*495ae853SAndroid Build Coastguard Worker     pu1_refarray_luma = ps_ctxt->pu1_refarray_buffer;
2080*495ae853SAndroid Build Coastguard Worker     pu1_refarray_cb = ps_ctxt->pu1_refarray_cb;
2081*495ae853SAndroid Build Coastguard Worker     pu1_refarray_cr = ps_ctxt->pu1_refarray_cr;
2082*495ae853SAndroid Build Coastguard Worker 
2083*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2084*495ae853SAndroid Build Coastguard Worker     /* Get the coordinates of the reference layer MB                         */
2085*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2086*495ae853SAndroid Build Coastguard Worker     i4_mbaddr_x = u2_mb_x;
2087*495ae853SAndroid Build Coastguard Worker     i4_mbaddr_y = u2_mb_y;
2088*495ae853SAndroid Build Coastguard Worker 
2089*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2090*495ae853SAndroid Build Coastguard Worker     /* Getting the size of the valid area of ref array to be brought in         */
2091*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2092*495ae853SAndroid Build Coastguard Worker     i4_refarray_wd_luma = 20;
2093*495ae853SAndroid Build Coastguard Worker     i4_refarray_ht_luma = 20;
2094*495ae853SAndroid Build Coastguard Worker     i4_refarray_wd_chroma = i4_refarray_wd_luma >> 1;
2095*495ae853SAndroid Build Coastguard Worker     i4_refarray_ht_chroma = i4_refarray_ht_luma >> 1;
2096*495ae853SAndroid Build Coastguard Worker 
2097*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2098*495ae853SAndroid Build Coastguard Worker     /* Derivation of ref slice MB idc                                         */
2099*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2100*495ae853SAndroid Build Coastguard Worker     if(1 == i1_cons_intr_samp_flag)
2101*495ae853SAndroid Build Coastguard Worker     {
2102*495ae853SAndroid Build Coastguard Worker         inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms;
2103*495ae853SAndroid Build Coastguard Worker         WORD8 *pi1_ref_mb_mode_tmp;
2104*495ae853SAndroid Build Coastguard Worker         WORD8 i1_mb_mode;
2105*495ae853SAndroid Build Coastguard Worker 
2106*495ae853SAndroid Build Coastguard Worker         /* get the location of the byte which has the current mb mode */
2107*495ae853SAndroid Build Coastguard Worker         pi1_ref_mb_mode_tmp = pi1_ref_mb_modes;
2108*495ae853SAndroid Build Coastguard Worker         pi1_ref_mb_mode_tmp += (i4_mbaddr_y * i4_ref_mode_stride * i4_element_size);
2109*495ae853SAndroid Build Coastguard Worker         pi1_ref_mb_mode_tmp += (i4_mbaddr_x * i4_element_size);
2110*495ae853SAndroid Build Coastguard Worker         ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_mode_tmp;
2111*495ae853SAndroid Build Coastguard Worker         i1_mb_mode = ps_inter_lyr_mb_prms->i1_mb_mode;
2112*495ae853SAndroid Build Coastguard Worker 
2113*495ae853SAndroid Build Coastguard Worker         /* The reference layer MB should be intra */
2114*495ae853SAndroid Build Coastguard Worker         UNUSED(i1_mb_mode);
2115*495ae853SAndroid Build Coastguard Worker 
2116*495ae853SAndroid Build Coastguard Worker         i1_slice_id = ps_inter_lyr_mb_prms->i1_slice_id;
2117*495ae853SAndroid Build Coastguard Worker     }
2118*495ae853SAndroid Build Coastguard Worker     else
2119*495ae853SAndroid Build Coastguard Worker     {
2120*495ae853SAndroid Build Coastguard Worker         /* set to non valid value */
2121*495ae853SAndroid Build Coastguard Worker         i1_slice_id = -1;
2122*495ae853SAndroid Build Coastguard Worker     }
2123*495ae853SAndroid Build Coastguard Worker 
2124*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2125*495ae853SAndroid Build Coastguard Worker     /* Bring in the reference array                                          */
2126*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2127*495ae853SAndroid Build Coastguard Worker     {
2128*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_src, *pu1_dst;
2129*495ae853SAndroid Build Coastguard Worker         WORD32 i4_src_stride, i4_dst_stride;
2130*495ae853SAndroid Build Coastguard Worker 
2131*495ae853SAndroid Build Coastguard Worker         /* Copy luma */
2132*495ae853SAndroid Build Coastguard Worker         i4_src_stride = i4_inp_luma_stride;
2133*495ae853SAndroid Build Coastguard Worker         i4_dst_stride = DYADIC_REF_W_Y;
2134*495ae853SAndroid Build Coastguard Worker         pu1_src = pu1_inp_luma;
2135*495ae853SAndroid Build Coastguard Worker         pu1_dst = pu1_refarray_luma;
2136*495ae853SAndroid Build Coastguard Worker         isvcd_copy_data(pu1_src, i4_src_stride, pu1_dst, i4_dst_stride, i4_refarray_wd_luma,
2137*495ae853SAndroid Build Coastguard Worker                         i4_refarray_ht_luma);
2138*495ae853SAndroid Build Coastguard Worker         // Semi planar
2139*495ae853SAndroid Build Coastguard Worker         i4_src_stride = i4_inp_chroma_stride;
2140*495ae853SAndroid Build Coastguard Worker         i4_dst_stride = DYADIC_REF_W_C;
2141*495ae853SAndroid Build Coastguard Worker         pu1_src = pu1_inp_chroma;
2142*495ae853SAndroid Build Coastguard Worker         isvcd_copy_data_semiplanr(pu1_src, i4_src_stride, pu1_refarray_cb, pu1_refarray_cr,
2143*495ae853SAndroid Build Coastguard Worker                                   i4_dst_stride, i4_refarray_wd_chroma, i4_refarray_ht_chroma);
2144*495ae853SAndroid Build Coastguard Worker     }
2145*495ae853SAndroid Build Coastguard Worker 
2146*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2147*495ae853SAndroid Build Coastguard Worker     /* Get the availability of 5 neighboring MBs                             */
2148*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2149*495ae853SAndroid Build Coastguard Worker     {
2150*495ae853SAndroid Build Coastguard Worker         /* mb_x + left, mb_y + top */
2151*495ae853SAndroid Build Coastguard Worker         isvcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size,
2152*495ae853SAndroid Build Coastguard Worker                                            i4_mbaddr_x + i4_left, i4_mbaddr_y + i4_top, &i4_avlblty,
2153*495ae853SAndroid Build Coastguard Worker                                            i1_slice_id, i1_cons_intr_samp_flag);
2154*495ae853SAndroid Build Coastguard Worker         u1_ny_avlblty = i4_avlblty;
2155*495ae853SAndroid Build Coastguard Worker 
2156*495ae853SAndroid Build Coastguard Worker         /* mb_x + left, mb_y */
2157*495ae853SAndroid Build Coastguard Worker         isvcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size,
2158*495ae853SAndroid Build Coastguard Worker                                            i4_mbaddr_x + i4_left, i4_mbaddr_y, &i4_avlblty,
2159*495ae853SAndroid Build Coastguard Worker                                            i1_slice_id, i1_cons_intr_samp_flag);
2160*495ae853SAndroid Build Coastguard Worker         u1_ny_avlblty += (i4_avlblty << 1);
2161*495ae853SAndroid Build Coastguard Worker 
2162*495ae853SAndroid Build Coastguard Worker         /* mb_x, mb_y + top */
2163*495ae853SAndroid Build Coastguard Worker         isvcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size,
2164*495ae853SAndroid Build Coastguard Worker                                            i4_mbaddr_x, i4_mbaddr_y + i4_top, &i4_avlblty,
2165*495ae853SAndroid Build Coastguard Worker                                            i1_slice_id, i1_cons_intr_samp_flag);
2166*495ae853SAndroid Build Coastguard Worker         u1_ny_avlblty += (i4_avlblty << 2);
2167*495ae853SAndroid Build Coastguard Worker 
2168*495ae853SAndroid Build Coastguard Worker         /* mb_x - left, mb_y + top */
2169*495ae853SAndroid Build Coastguard Worker         isvcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size,
2170*495ae853SAndroid Build Coastguard Worker                                            i4_mbaddr_x - i4_left, i4_mbaddr_y + i4_top, &i4_avlblty,
2171*495ae853SAndroid Build Coastguard Worker                                            i1_slice_id, i1_cons_intr_samp_flag);
2172*495ae853SAndroid Build Coastguard Worker         u1_ny_avlblty += (i4_avlblty << 3);
2173*495ae853SAndroid Build Coastguard Worker 
2174*495ae853SAndroid Build Coastguard Worker         /* mb_x + left, mb_y - top */
2175*495ae853SAndroid Build Coastguard Worker         isvcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size,
2176*495ae853SAndroid Build Coastguard Worker                                            i4_mbaddr_x + i4_left, i4_mbaddr_y - i4_top, &i4_avlblty,
2177*495ae853SAndroid Build Coastguard Worker                                            i1_slice_id, i1_cons_intr_samp_flag);
2178*495ae853SAndroid Build Coastguard Worker         u1_ny_avlblty += (i4_avlblty << 4);
2179*495ae853SAndroid Build Coastguard Worker     }
2180*495ae853SAndroid Build Coastguard Worker 
2181*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2182*495ae853SAndroid Build Coastguard Worker     /* Filling the unavailable samples, if any                                 */
2183*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
2184*495ae853SAndroid Build Coastguard Worker     if(0x7 == u1_ny_avlblty)
2185*495ae853SAndroid Build Coastguard Worker     {
2186*495ae853SAndroid Build Coastguard Worker         /* All are available, exit */
2187*495ae853SAndroid Build Coastguard Worker         return OK;
2188*495ae853SAndroid Build Coastguard Worker     }
2189*495ae853SAndroid Build Coastguard Worker 
2190*495ae853SAndroid Build Coastguard Worker     if(!(u1_ny_avlblty & 0x7))
2191*495ae853SAndroid Build Coastguard Worker     {
2192*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_tmp_src, *pu1_tmp_dst1, *pu1_tmp_dst2;
2193*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_tmp_src1, *pu1_tmp_src2;
2194*495ae853SAndroid Build Coastguard Worker 
2195*495ae853SAndroid Build Coastguard Worker         /* Set the 4 corner samples to (x-xD,y-yD) */
2196*495ae853SAndroid Build Coastguard Worker         i4_x0 = 9 + (i4_left << 3) + i4_left;
2197*495ae853SAndroid Build Coastguard Worker         i4_y0 = 9 + (i4_top << 3) + i4_top;
2198*495ae853SAndroid Build Coastguard Worker 
2199*495ae853SAndroid Build Coastguard Worker         i4_ref_xD = i4_x0 - i4_left - (i4_left >> 1);
2200*495ae853SAndroid Build Coastguard Worker         i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
2201*495ae853SAndroid Build Coastguard Worker 
2202*495ae853SAndroid Build Coastguard Worker         pu1_tmp_src = pu1_refarray_luma + (i4_ref_yD * DYADIC_REF_W_Y);
2203*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst1 = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
2204*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst2 = pu1_tmp_dst1 + DYADIC_REF_W_Y;
2205*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst1[i4_x0] = pu1_tmp_src[i4_ref_xD];
2206*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst1[i4_x0 + 1] = pu1_tmp_src[i4_ref_xD];
2207*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst2[i4_x0] = pu1_tmp_src[i4_ref_xD];
2208*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst2[i4_x0 + 1] = pu1_tmp_src[i4_ref_xD];
2209*495ae853SAndroid Build Coastguard Worker 
2210*495ae853SAndroid Build Coastguard Worker         /* Set the corner sample of Cb and Cr to (x-xD,y-yD) */
2211*495ae853SAndroid Build Coastguard Worker         i4_xc0 = i4_x0 >> 1;
2212*495ae853SAndroid Build Coastguard Worker         i4_yc0 = i4_y0 >> 1;
2213*495ae853SAndroid Build Coastguard Worker         i4_c_ref_yD = i4_ref_yD >> 1;
2214*495ae853SAndroid Build Coastguard Worker         i4_c_ref_xD = i4_ref_xD >> 1;
2215*495ae853SAndroid Build Coastguard Worker         pu1_tmp_src1 = pu1_refarray_cb + (i4_c_ref_yD * DYADIC_REF_W_C);
2216*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst1 = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
2217*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst1[i4_xc0] = pu1_tmp_src1[i4_c_ref_xD];
2218*495ae853SAndroid Build Coastguard Worker         pu1_tmp_src2 = pu1_refarray_cr + (i4_c_ref_yD * DYADIC_REF_W_C);
2219*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst2 = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
2220*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst2[i4_xc0] = pu1_tmp_src2[i4_c_ref_xD];
2221*495ae853SAndroid Build Coastguard Worker     }
2222*495ae853SAndroid Build Coastguard Worker 
2223*495ae853SAndroid Build Coastguard Worker     if(!(u1_ny_avlblty & 0x5))
2224*495ae853SAndroid Build Coastguard Worker     {
2225*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_tmp_src, *pu1_tmp_dst1, *pu1_tmp_dst2;
2226*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_tmp_src1, *pu1_tmp_src2;
2227*495ae853SAndroid Build Coastguard Worker 
2228*495ae853SAndroid Build Coastguard Worker         /* Copy (x0,ref_yD), (x0+1,ref_yD), ..., (x0+7,ref_yD) to */
2229*495ae853SAndroid Build Coastguard Worker         /* (x0,y0), (x0+1,y0), ..., (x0+7,y0) and   */
2230*495ae853SAndroid Build Coastguard Worker         /* (x0,y0+1), (x0+1,y0+1), ..., (x0+7,y0+1) */
2231*495ae853SAndroid Build Coastguard Worker         i4_x0 = 2;
2232*495ae853SAndroid Build Coastguard Worker         i4_y0 = 9 + (i4_top << 3) + i4_top;
2233*495ae853SAndroid Build Coastguard Worker         if(i4_left > 0)
2234*495ae853SAndroid Build Coastguard Worker         {
2235*495ae853SAndroid Build Coastguard Worker             i4_x0 += 8;
2236*495ae853SAndroid Build Coastguard Worker         }
2237*495ae853SAndroid Build Coastguard Worker         i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
2238*495ae853SAndroid Build Coastguard Worker 
2239*495ae853SAndroid Build Coastguard Worker         pu1_tmp_src = pu1_refarray_luma + (i4_ref_yD * DYADIC_REF_W_Y);
2240*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst1 = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
2241*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst2 = pu1_tmp_dst1 + DYADIC_REF_W_Y;
2242*495ae853SAndroid Build Coastguard Worker 
2243*495ae853SAndroid Build Coastguard Worker         for(i4_x = i4_x0; i4_x < i4_x0 + 8; i4_x++)
2244*495ae853SAndroid Build Coastguard Worker         {
2245*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1[i4_x] = pu1_tmp_src[i4_x];
2246*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2[i4_x] = pu1_tmp_src[i4_x];
2247*495ae853SAndroid Build Coastguard Worker         }
2248*495ae853SAndroid Build Coastguard Worker 
2249*495ae853SAndroid Build Coastguard Worker         /* Cb and Cr copy */
2250*495ae853SAndroid Build Coastguard Worker         i4_xc0 = i4_x0 >> 1;
2251*495ae853SAndroid Build Coastguard Worker         i4_yc0 = i4_y0 >> 1;
2252*495ae853SAndroid Build Coastguard Worker         i4_c_ref_yD = i4_ref_yD >> 1;
2253*495ae853SAndroid Build Coastguard Worker         pu1_tmp_src1 = pu1_refarray_cb + (i4_c_ref_yD * DYADIC_REF_W_C);
2254*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst1 = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
2255*495ae853SAndroid Build Coastguard Worker         pu1_tmp_src2 = pu1_refarray_cr + (i4_c_ref_yD * DYADIC_REF_W_C);
2256*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst2 = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
2257*495ae853SAndroid Build Coastguard Worker 
2258*495ae853SAndroid Build Coastguard Worker         for(i4_x = i4_xc0; i4_x < i4_xc0 + 4; i4_x++)
2259*495ae853SAndroid Build Coastguard Worker         {
2260*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1[i4_x] = pu1_tmp_src1[i4_x];
2261*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2[i4_x] = pu1_tmp_src2[i4_x];
2262*495ae853SAndroid Build Coastguard Worker         }
2263*495ae853SAndroid Build Coastguard Worker     }
2264*495ae853SAndroid Build Coastguard Worker 
2265*495ae853SAndroid Build Coastguard Worker     if(!(u1_ny_avlblty & 0x3))
2266*495ae853SAndroid Build Coastguard Worker     {
2267*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_tmp_src, *pu1_tmp_dst1, *pu1_tmp_dst2;
2268*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_tmp_src1, *pu1_tmp_src2;
2269*495ae853SAndroid Build Coastguard Worker 
2270*495ae853SAndroid Build Coastguard Worker         /* Copy (ref_xD,y0) to (x0,y0) and (x0+1,y0); */
2271*495ae853SAndroid Build Coastguard Worker         /* copy (ref_xD,y0+1) to (x0,y0+1) and (x0+1,y0+1); ... ;*/
2272*495ae853SAndroid Build Coastguard Worker         /* copy (ref_xD,y0+7) to (x0,y0+7) and (x0+1,y0+7) */
2273*495ae853SAndroid Build Coastguard Worker         i4_x0 = 9 + (i4_left << 3) + i4_left;
2274*495ae853SAndroid Build Coastguard Worker         i4_y0 = 2;
2275*495ae853SAndroid Build Coastguard Worker         if(i4_top > 0)
2276*495ae853SAndroid Build Coastguard Worker         {
2277*495ae853SAndroid Build Coastguard Worker             i4_y0 += 8;
2278*495ae853SAndroid Build Coastguard Worker         }
2279*495ae853SAndroid Build Coastguard Worker         i4_ref_xD = i4_x0 - i4_left - (i4_left >> 1);
2280*495ae853SAndroid Build Coastguard Worker 
2281*495ae853SAndroid Build Coastguard Worker         pu1_tmp_src = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
2282*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst1 = pu1_tmp_src;
2283*495ae853SAndroid Build Coastguard Worker 
2284*495ae853SAndroid Build Coastguard Worker         for(i4_y = i4_y0; i4_y < i4_y0 + 8; i4_y++)
2285*495ae853SAndroid Build Coastguard Worker         {
2286*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1[i4_x0] = pu1_tmp_src[i4_ref_xD];
2287*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1[i4_x0 + 1] = pu1_tmp_src[i4_ref_xD];
2288*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src += DYADIC_REF_W_Y;
2289*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1 += DYADIC_REF_W_Y;
2290*495ae853SAndroid Build Coastguard Worker         }
2291*495ae853SAndroid Build Coastguard Worker 
2292*495ae853SAndroid Build Coastguard Worker         /* Cb and Cr copy */
2293*495ae853SAndroid Build Coastguard Worker         i4_xc0 = i4_x0 >> 1;
2294*495ae853SAndroid Build Coastguard Worker         i4_yc0 = i4_y0 >> 1;
2295*495ae853SAndroid Build Coastguard Worker         i4_c_ref_xD = i4_ref_xD >> 1;
2296*495ae853SAndroid Build Coastguard Worker         pu1_tmp_src1 = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
2297*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst1 = pu1_tmp_src1;
2298*495ae853SAndroid Build Coastguard Worker         pu1_tmp_src2 = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
2299*495ae853SAndroid Build Coastguard Worker         pu1_tmp_dst2 = pu1_tmp_src2;
2300*495ae853SAndroid Build Coastguard Worker 
2301*495ae853SAndroid Build Coastguard Worker         for(i4_y = i4_yc0; i4_y < i4_yc0 + 4; i4_y++)
2302*495ae853SAndroid Build Coastguard Worker         {
2303*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1[i4_xc0] = pu1_tmp_src1[i4_c_ref_xD];
2304*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2[i4_xc0] = pu1_tmp_src2[i4_c_ref_xD];
2305*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src1 += DYADIC_REF_W_C;
2306*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src2 += DYADIC_REF_W_C;
2307*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1 += DYADIC_REF_W_C;
2308*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2 += DYADIC_REF_W_C;
2309*495ae853SAndroid Build Coastguard Worker         }
2310*495ae853SAndroid Build Coastguard Worker     }
2311*495ae853SAndroid Build Coastguard Worker 
2312*495ae853SAndroid Build Coastguard Worker     if(!(u1_ny_avlblty & 0x4))
2313*495ae853SAndroid Build Coastguard Worker     {
2314*495ae853SAndroid Build Coastguard Worker         if(!(u1_ny_avlblty & 0x8))
2315*495ae853SAndroid Build Coastguard Worker         {
2316*495ae853SAndroid Build Coastguard Worker             /* (mb_x-left,mb_y+top) not available */
2317*495ae853SAndroid Build Coastguard Worker             UWORD8 *pu1_tmp_src, *pu1_tmp_dst;
2318*495ae853SAndroid Build Coastguard Worker 
2319*495ae853SAndroid Build Coastguard Worker             i4_x0 = 9 - i4_left;
2320*495ae853SAndroid Build Coastguard Worker             i4_y0 = 9 + (i4_top << 3) + i4_top;
2321*495ae853SAndroid Build Coastguard Worker 
2322*495ae853SAndroid Build Coastguard Worker             i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
2323*495ae853SAndroid Build Coastguard Worker 
2324*495ae853SAndroid Build Coastguard Worker             /* Copy (x0,ref_yD) and (x0+1,ref_yD) to (x0,y0) and (x0+1,y0), and */
2325*495ae853SAndroid Build Coastguard Worker             /* to (x0,y0+1) and (x0+1,y0+1) */
2326*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src = pu1_refarray_luma + (i4_ref_yD * DYADIC_REF_W_Y);
2327*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
2328*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst[i4_x0] = pu1_tmp_src[i4_x0];
2329*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst[i4_x0 + 1] = pu1_tmp_src[i4_x0 + 1];
2330*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst += DYADIC_REF_W_Y;
2331*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst[i4_x0] = pu1_tmp_src[i4_x0];
2332*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst[i4_x0 + 1] = pu1_tmp_src[i4_x0 + 1];
2333*495ae853SAndroid Build Coastguard Worker 
2334*495ae853SAndroid Build Coastguard Worker             /* Cb copy */
2335*495ae853SAndroid Build Coastguard Worker             i4_xc0 = i4_x0 >> 1;
2336*495ae853SAndroid Build Coastguard Worker             i4_yc0 = i4_y0 >> 1;
2337*495ae853SAndroid Build Coastguard Worker             i4_c_ref_yD = i4_ref_yD >> 1;
2338*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src = pu1_refarray_cb + (i4_c_ref_yD * DYADIC_REF_W_C);
2339*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
2340*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst[i4_xc0] = pu1_tmp_src[i4_xc0];
2341*495ae853SAndroid Build Coastguard Worker 
2342*495ae853SAndroid Build Coastguard Worker             /* Cr copy */
2343*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src = pu1_refarray_cr + (i4_c_ref_yD * DYADIC_REF_W_C);
2344*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
2345*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst[i4_xc0] = pu1_tmp_src[i4_xc0];
2346*495ae853SAndroid Build Coastguard Worker 
2347*495ae853SAndroid Build Coastguard Worker         } /* if (mb_x-left,mb_y+top) not available */
2348*495ae853SAndroid Build Coastguard Worker         else
2349*495ae853SAndroid Build Coastguard Worker         {
2350*495ae853SAndroid Build Coastguard Worker             WORD32 i4_xD, i4_yD;
2351*495ae853SAndroid Build Coastguard Worker             WORD32 i4_c_xD, i4_c_yD;
2352*495ae853SAndroid Build Coastguard Worker 
2353*495ae853SAndroid Build Coastguard Worker             isvcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride,
2354*495ae853SAndroid Build Coastguard Worker                                                i4_element_size, i4_mbaddr_x - i4_left, i4_mbaddr_y,
2355*495ae853SAndroid Build Coastguard Worker                                                &i4_avlblty, i1_slice_id, i1_cons_intr_samp_flag);
2356*495ae853SAndroid Build Coastguard Worker             i1_corner_samp_avlbl_flag = i4_avlblty;
2357*495ae853SAndroid Build Coastguard Worker 
2358*495ae853SAndroid Build Coastguard Worker             i4_x0 = 9 - i4_left;
2359*495ae853SAndroid Build Coastguard Worker             i4_y0 = 9 + (i4_top << 3) + i4_top;
2360*495ae853SAndroid Build Coastguard Worker             i4_xc0 = i4_x0 >> 1;
2361*495ae853SAndroid Build Coastguard Worker             i4_yc0 = i4_y0 >> 1;
2362*495ae853SAndroid Build Coastguard Worker             i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
2363*495ae853SAndroid Build Coastguard Worker             i4_ref_xD = i4_x0 - (i4_left * 7) - (i4_left >> 1);
2364*495ae853SAndroid Build Coastguard Worker             i4_c_ref_xD = i4_ref_xD >> 1;
2365*495ae853SAndroid Build Coastguard Worker             i4_c_ref_yD = i4_ref_yD >> 1;
2366*495ae853SAndroid Build Coastguard Worker             i4_xD = i4_x0 - i4_ref_xD;
2367*495ae853SAndroid Build Coastguard Worker             i4_yD = i4_y0 - i4_ref_yD;
2368*495ae853SAndroid Build Coastguard Worker             i4_c_xD = i4_xc0 - i4_c_ref_xD;
2369*495ae853SAndroid Build Coastguard Worker             i4_c_yD = i4_yc0 - i4_c_ref_yD;
2370*495ae853SAndroid Build Coastguard Worker 
2371*495ae853SAndroid Build Coastguard Worker             /* Fill corner sample if not available */
2372*495ae853SAndroid Build Coastguard Worker             if(!i1_corner_samp_avlbl_flag)
2373*495ae853SAndroid Build Coastguard Worker             {
2374*495ae853SAndroid Build Coastguard Worker                 isvcd_corner_samp_dyadic(i4_x0, i4_y0, i4_xD, i4_yD, pu1_refarray_luma,
2375*495ae853SAndroid Build Coastguard Worker                                          pu1_refarray_cb, pu1_refarray_cr);
2376*495ae853SAndroid Build Coastguard Worker             }
2377*495ae853SAndroid Build Coastguard Worker 
2378*495ae853SAndroid Build Coastguard Worker             /* Call diagonal construction for luma */
2379*495ae853SAndroid Build Coastguard Worker             for(i4_y = i4_y0; i4_y < i4_y0 + 2; i4_y++)
2380*495ae853SAndroid Build Coastguard Worker             {
2381*495ae853SAndroid Build Coastguard Worker                 for(i4_x = i4_x0; i4_x < i4_x0 + 2; i4_x++)
2382*495ae853SAndroid Build Coastguard Worker                 {
2383*495ae853SAndroid Build Coastguard Worker                     isvcd_diagonal_construct_dyadic(i4_x, i4_y, i4_xD, i4_yD, pu1_refarray_luma,
2384*495ae853SAndroid Build Coastguard Worker                                                     DYADIC_REF_W_Y);
2385*495ae853SAndroid Build Coastguard Worker                     i4_xD++;
2386*495ae853SAndroid Build Coastguard Worker                 }
2387*495ae853SAndroid Build Coastguard Worker                 i4_yD++;
2388*495ae853SAndroid Build Coastguard Worker                 i4_xD -= 2;
2389*495ae853SAndroid Build Coastguard Worker             }
2390*495ae853SAndroid Build Coastguard Worker 
2391*495ae853SAndroid Build Coastguard Worker             /* Call diagonal construction for chroma */
2392*495ae853SAndroid Build Coastguard Worker             isvcd_diagonal_construct_dyadic(i4_xc0, i4_yc0, i4_c_xD, i4_c_yD, pu1_refarray_cb,
2393*495ae853SAndroid Build Coastguard Worker                                             DYADIC_REF_W_C);
2394*495ae853SAndroid Build Coastguard Worker 
2395*495ae853SAndroid Build Coastguard Worker             isvcd_diagonal_construct_dyadic(i4_xc0, i4_yc0, i4_c_xD, i4_c_yD, pu1_refarray_cr,
2396*495ae853SAndroid Build Coastguard Worker                                             DYADIC_REF_W_C);
2397*495ae853SAndroid Build Coastguard Worker         }
2398*495ae853SAndroid Build Coastguard Worker     }
2399*495ae853SAndroid Build Coastguard Worker 
2400*495ae853SAndroid Build Coastguard Worker     if(!(u1_ny_avlblty & 0x2))
2401*495ae853SAndroid Build Coastguard Worker     {
2402*495ae853SAndroid Build Coastguard Worker         if(!(u1_ny_avlblty & 0x10))
2403*495ae853SAndroid Build Coastguard Worker         {
2404*495ae853SAndroid Build Coastguard Worker             UWORD8 *pu1_tmp_src, *pu1_tmp_dst;
2405*495ae853SAndroid Build Coastguard Worker 
2406*495ae853SAndroid Build Coastguard Worker             i4_x0 = 9 + (i4_left << 3) + i4_left;
2407*495ae853SAndroid Build Coastguard Worker             i4_y0 = 9 - i4_top;
2408*495ae853SAndroid Build Coastguard Worker             i4_ref_xD = i4_x0 - i4_left - (i4_left >> 1);
2409*495ae853SAndroid Build Coastguard Worker 
2410*495ae853SAndroid Build Coastguard Worker             /* Copy (ref_xD,y0) to (x0,y0), (x0+1,y0), and  */
2411*495ae853SAndroid Build Coastguard Worker             /* copy (ref_xD,y0+1) to (x0,y0+1), (x0+1,y0+1) */
2412*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
2413*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst = pu1_tmp_src;
2414*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst[i4_x0] = pu1_tmp_src[i4_ref_xD];
2415*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst[i4_x0 + 1] = pu1_tmp_src[i4_ref_xD];
2416*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src += DYADIC_REF_W_Y;
2417*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst += DYADIC_REF_W_Y;
2418*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst[i4_x0] = pu1_tmp_src[i4_ref_xD];
2419*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst[i4_x0 + 1] = pu1_tmp_src[i4_ref_xD];
2420*495ae853SAndroid Build Coastguard Worker 
2421*495ae853SAndroid Build Coastguard Worker             /* Cb copy */
2422*495ae853SAndroid Build Coastguard Worker             i4_xc0 = i4_x0 >> 1;
2423*495ae853SAndroid Build Coastguard Worker             i4_yc0 = i4_y0 >> 1;
2424*495ae853SAndroid Build Coastguard Worker             i4_c_ref_xD = i4_ref_xD >> 1;
2425*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
2426*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst = pu1_tmp_src;
2427*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst[i4_xc0] = pu1_tmp_src[i4_c_ref_xD];
2428*495ae853SAndroid Build Coastguard Worker 
2429*495ae853SAndroid Build Coastguard Worker             /* Cr copy */
2430*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
2431*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst = pu1_tmp_src;
2432*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst[i4_xc0] = pu1_tmp_src[i4_c_ref_xD];
2433*495ae853SAndroid Build Coastguard Worker 
2434*495ae853SAndroid Build Coastguard Worker         } /* if (mb_x+left,mb_y-top) not available */
2435*495ae853SAndroid Build Coastguard Worker         else
2436*495ae853SAndroid Build Coastguard Worker         {
2437*495ae853SAndroid Build Coastguard Worker             WORD32 i4_xD, i4_yD;
2438*495ae853SAndroid Build Coastguard Worker             WORD32 i4_c_xD, i4_c_yD;
2439*495ae853SAndroid Build Coastguard Worker 
2440*495ae853SAndroid Build Coastguard Worker             isvcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride,
2441*495ae853SAndroid Build Coastguard Worker                                                i4_element_size, i4_mbaddr_x, i4_mbaddr_y - i4_top,
2442*495ae853SAndroid Build Coastguard Worker                                                &i4_avlblty, i1_slice_id, i1_cons_intr_samp_flag);
2443*495ae853SAndroid Build Coastguard Worker             i1_corner_samp_avlbl_flag = i4_avlblty;
2444*495ae853SAndroid Build Coastguard Worker 
2445*495ae853SAndroid Build Coastguard Worker             i4_x0 = 9 + (i4_left << 3) + i4_left;
2446*495ae853SAndroid Build Coastguard Worker             i4_y0 = 9 - i4_top;
2447*495ae853SAndroid Build Coastguard Worker             i4_xc0 = i4_x0 >> 1;
2448*495ae853SAndroid Build Coastguard Worker             i4_yc0 = i4_y0 >> 1;
2449*495ae853SAndroid Build Coastguard Worker             i4_ref_xD = i4_x0 - i4_left - (i4_left >> 1);
2450*495ae853SAndroid Build Coastguard Worker             i4_ref_yD = i4_y0 - (i4_top * 7) - (i4_top >> 1);
2451*495ae853SAndroid Build Coastguard Worker             i4_c_ref_xD = i4_ref_xD >> 1;
2452*495ae853SAndroid Build Coastguard Worker             i4_c_ref_yD = i4_ref_yD >> 1;
2453*495ae853SAndroid Build Coastguard Worker             i4_xD = i4_x0 - i4_ref_xD;
2454*495ae853SAndroid Build Coastguard Worker             i4_yD = i4_y0 - i4_ref_yD;
2455*495ae853SAndroid Build Coastguard Worker             i4_c_xD = i4_xc0 - i4_c_ref_xD;
2456*495ae853SAndroid Build Coastguard Worker             i4_c_yD = i4_yc0 - i4_c_ref_yD;
2457*495ae853SAndroid Build Coastguard Worker 
2458*495ae853SAndroid Build Coastguard Worker             if(!i1_corner_samp_avlbl_flag)
2459*495ae853SAndroid Build Coastguard Worker             {
2460*495ae853SAndroid Build Coastguard Worker                 isvcd_corner_samp_dyadic(i4_x0, i4_y0, i4_xD, i4_yD, pu1_refarray_luma,
2461*495ae853SAndroid Build Coastguard Worker                                          pu1_refarray_cb, pu1_refarray_cr);
2462*495ae853SAndroid Build Coastguard Worker             }
2463*495ae853SAndroid Build Coastguard Worker 
2464*495ae853SAndroid Build Coastguard Worker             /* Call diagonal consrtuction for luma */
2465*495ae853SAndroid Build Coastguard Worker             for(i4_y = i4_y0; i4_y < i4_y0 + 2; i4_y++)
2466*495ae853SAndroid Build Coastguard Worker             {
2467*495ae853SAndroid Build Coastguard Worker                 for(i4_x = i4_x0; i4_x < i4_x0 + 2; i4_x++)
2468*495ae853SAndroid Build Coastguard Worker                 {
2469*495ae853SAndroid Build Coastguard Worker                     isvcd_diagonal_construct_dyadic(i4_x, i4_y, i4_xD, i4_yD, pu1_refarray_luma,
2470*495ae853SAndroid Build Coastguard Worker                                                     DYADIC_REF_W_Y);
2471*495ae853SAndroid Build Coastguard Worker                     i4_xD++;
2472*495ae853SAndroid Build Coastguard Worker                 }
2473*495ae853SAndroid Build Coastguard Worker                 i4_yD++;
2474*495ae853SAndroid Build Coastguard Worker                 i4_xD -= 2;
2475*495ae853SAndroid Build Coastguard Worker             }
2476*495ae853SAndroid Build Coastguard Worker 
2477*495ae853SAndroid Build Coastguard Worker             /* Call diagonal construction for chroma */
2478*495ae853SAndroid Build Coastguard Worker             isvcd_diagonal_construct_dyadic(i4_xc0, i4_yc0, i4_c_xD, i4_c_yD, pu1_refarray_cb,
2479*495ae853SAndroid Build Coastguard Worker                                             DYADIC_REF_W_C);
2480*495ae853SAndroid Build Coastguard Worker 
2481*495ae853SAndroid Build Coastguard Worker             isvcd_diagonal_construct_dyadic(i4_xc0, i4_yc0, i4_c_xD, i4_c_yD, pu1_refarray_cr,
2482*495ae853SAndroid Build Coastguard Worker                                             DYADIC_REF_W_C);
2483*495ae853SAndroid Build Coastguard Worker         }
2484*495ae853SAndroid Build Coastguard Worker     }
2485*495ae853SAndroid Build Coastguard Worker 
2486*495ae853SAndroid Build Coastguard Worker     if(u1_ny_avlblty & 1)
2487*495ae853SAndroid Build Coastguard Worker     {
2488*495ae853SAndroid Build Coastguard Worker         if(!(u1_ny_avlblty & 2))
2489*495ae853SAndroid Build Coastguard Worker         {
2490*495ae853SAndroid Build Coastguard Worker             /* (mb_x+left,mb_y) is unavailable */
2491*495ae853SAndroid Build Coastguard Worker             WORD32 i4_xD, i4_yD;
2492*495ae853SAndroid Build Coastguard Worker             WORD32 i4_c_xD, i4_c_yD;
2493*495ae853SAndroid Build Coastguard Worker             UWORD8 *pu1_tmp_dst;
2494*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_filled_samp;
2495*495ae853SAndroid Build Coastguard Worker 
2496*495ae853SAndroid Build Coastguard Worker             i1_corner_samp_avlbl_flag = (u1_ny_avlblty & 4) >> 2;
2497*495ae853SAndroid Build Coastguard Worker 
2498*495ae853SAndroid Build Coastguard Worker             i4_x0 = 9 + (i4_left << 3) + i4_left;
2499*495ae853SAndroid Build Coastguard Worker             i4_y0 = 2;
2500*495ae853SAndroid Build Coastguard Worker             i4_ref_yD = 1;
2501*495ae853SAndroid Build Coastguard Worker             if(i4_top > 0)
2502*495ae853SAndroid Build Coastguard Worker             {
2503*495ae853SAndroid Build Coastguard Worker                 i4_y0 += 8;
2504*495ae853SAndroid Build Coastguard Worker                 i4_ref_yD = 18;
2505*495ae853SAndroid Build Coastguard Worker             }
2506*495ae853SAndroid Build Coastguard Worker 
2507*495ae853SAndroid Build Coastguard Worker             i4_ref_xD = i4_x0 - (i4_left) - (i4_left >> 1);
2508*495ae853SAndroid Build Coastguard Worker             i4_xD = i4_x0 - i4_ref_xD;
2509*495ae853SAndroid Build Coastguard Worker             i4_yD = i4_y0 - i4_ref_yD;
2510*495ae853SAndroid Build Coastguard Worker             i4_xc0 = i4_x0 >> 1;
2511*495ae853SAndroid Build Coastguard Worker             i4_yc0 = i4_y0 >> 1;
2512*495ae853SAndroid Build Coastguard Worker             i4_c_ref_xD = i4_ref_xD >> 1;
2513*495ae853SAndroid Build Coastguard Worker             i4_c_ref_yD = i4_ref_yD >> 1;
2514*495ae853SAndroid Build Coastguard Worker             i4_c_xD = i4_xc0 - i4_c_ref_xD;
2515*495ae853SAndroid Build Coastguard Worker             i4_c_yD = i4_yc0 - i4_c_ref_yD;
2516*495ae853SAndroid Build Coastguard Worker 
2517*495ae853SAndroid Build Coastguard Worker             /* Fill corner sample if unavailable */
2518*495ae853SAndroid Build Coastguard Worker             if(!i1_corner_samp_avlbl_flag)
2519*495ae853SAndroid Build Coastguard Worker             {
2520*495ae853SAndroid Build Coastguard Worker                 isvcd_corner_samp_dyadic(i4_x0, i4_y0, i4_xD, i4_yD, pu1_refarray_luma,
2521*495ae853SAndroid Build Coastguard Worker                                          pu1_refarray_cb, pu1_refarray_cr);
2522*495ae853SAndroid Build Coastguard Worker             }
2523*495ae853SAndroid Build Coastguard Worker 
2524*495ae853SAndroid Build Coastguard Worker             /* Call the diagonal construction for the 8 rows */
2525*495ae853SAndroid Build Coastguard Worker             if(i4_top == i4_left)
2526*495ae853SAndroid Build Coastguard Worker             {
2527*495ae853SAndroid Build Coastguard Worker                 /* if top * left = 1 (x0,y0) */
2528*495ae853SAndroid Build Coastguard Worker                 u1_filled_samp = isvcd_diagonal_construct_dyadic(i4_x0, i4_y0, i4_xD, i4_yD,
2529*495ae853SAndroid Build Coastguard Worker                                                                  pu1_refarray_luma, DYADIC_REF_W_Y);
2530*495ae853SAndroid Build Coastguard Worker 
2531*495ae853SAndroid Build Coastguard Worker                 pu1_tmp_dst = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
2532*495ae853SAndroid Build Coastguard Worker 
2533*495ae853SAndroid Build Coastguard Worker                 /* (x0,y0+1), ..., (x0,y0+7) and */
2534*495ae853SAndroid Build Coastguard Worker                 /* (x0+1,y0), ..., (x0+1,y0+6)   */
2535*495ae853SAndroid Build Coastguard Worker                 for(i4_y = i4_y0 + 1; i4_y < i4_y0 + 8; i4_y++)
2536*495ae853SAndroid Build Coastguard Worker                 {
2537*495ae853SAndroid Build Coastguard Worker                     i4_yD++;
2538*495ae853SAndroid Build Coastguard Worker                     u1_filled_samp = isvcd_diagonal_construct_dyadic(
2539*495ae853SAndroid Build Coastguard Worker                         i4_x0, i4_y, i4_xD, i4_yD, pu1_refarray_luma, DYADIC_REF_W_Y);
2540*495ae853SAndroid Build Coastguard Worker                     pu1_tmp_dst[i4_x0 + 1] = u1_filled_samp;
2541*495ae853SAndroid Build Coastguard Worker                     pu1_tmp_dst += DYADIC_REF_W_Y;
2542*495ae853SAndroid Build Coastguard Worker                 }
2543*495ae853SAndroid Build Coastguard Worker 
2544*495ae853SAndroid Build Coastguard Worker                 /* (x0+1,y0+7) */
2545*495ae853SAndroid Build Coastguard Worker                 u1_filled_samp = isvcd_diagonal_construct_dyadic(
2546*495ae853SAndroid Build Coastguard Worker                     i4_x0 + 1, i4_y0 + 7, i4_xD + 1, i4_yD, pu1_refarray_luma, DYADIC_REF_W_Y);
2547*495ae853SAndroid Build Coastguard Worker             }
2548*495ae853SAndroid Build Coastguard Worker             else
2549*495ae853SAndroid Build Coastguard Worker             {
2550*495ae853SAndroid Build Coastguard Worker                 /* top * left = -1 (x0+1,y0) */
2551*495ae853SAndroid Build Coastguard Worker                 u1_filled_samp = isvcd_diagonal_construct_dyadic(i4_x0 + 1, i4_y0, i4_xD + 1, i4_yD,
2552*495ae853SAndroid Build Coastguard Worker                                                                  pu1_refarray_luma, DYADIC_REF_W_Y);
2553*495ae853SAndroid Build Coastguard Worker 
2554*495ae853SAndroid Build Coastguard Worker                 pu1_tmp_dst = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
2555*495ae853SAndroid Build Coastguard Worker 
2556*495ae853SAndroid Build Coastguard Worker                 /* (x0,y0), ..., (x0,y0+6) and   */
2557*495ae853SAndroid Build Coastguard Worker                 /* (x0+1,y0+1), ..., (x0+1,y0+7) */
2558*495ae853SAndroid Build Coastguard Worker                 for(i4_y = i4_y0; i4_y < i4_y0 + 7; i4_y++)
2559*495ae853SAndroid Build Coastguard Worker                 {
2560*495ae853SAndroid Build Coastguard Worker                     u1_filled_samp = isvcd_diagonal_construct_dyadic(
2561*495ae853SAndroid Build Coastguard Worker                         i4_x0, i4_y, i4_xD, i4_yD, pu1_refarray_luma, DYADIC_REF_W_Y);
2562*495ae853SAndroid Build Coastguard Worker 
2563*495ae853SAndroid Build Coastguard Worker                     pu1_tmp_dst += DYADIC_REF_W_Y;
2564*495ae853SAndroid Build Coastguard Worker                     pu1_tmp_dst[i4_x0 + 1] = u1_filled_samp;
2565*495ae853SAndroid Build Coastguard Worker                     i4_yD++;
2566*495ae853SAndroid Build Coastguard Worker                 }
2567*495ae853SAndroid Build Coastguard Worker 
2568*495ae853SAndroid Build Coastguard Worker                 /* (x0,y0+7) */
2569*495ae853SAndroid Build Coastguard Worker                 u1_filled_samp = isvcd_diagonal_construct_dyadic(i4_x0, i4_y0 + 7, i4_xD, i4_yD,
2570*495ae853SAndroid Build Coastguard Worker                                                                  pu1_refarray_luma, DYADIC_REF_W_Y);
2571*495ae853SAndroid Build Coastguard Worker             }
2572*495ae853SAndroid Build Coastguard Worker 
2573*495ae853SAndroid Build Coastguard Worker             /* For Cb and Cr */
2574*495ae853SAndroid Build Coastguard Worker             for(i4_y = i4_yc0; i4_y < i4_yc0 + 4; i4_y++)
2575*495ae853SAndroid Build Coastguard Worker             {
2576*495ae853SAndroid Build Coastguard Worker                 u1_filled_samp = isvcd_diagonal_construct_dyadic(i4_xc0, i4_y, i4_c_xD, i4_c_yD,
2577*495ae853SAndroid Build Coastguard Worker                                                                  pu1_refarray_cb, DYADIC_REF_W_C);
2578*495ae853SAndroid Build Coastguard Worker                 u1_filled_samp = isvcd_diagonal_construct_dyadic(i4_xc0, i4_y, i4_c_xD, i4_c_yD,
2579*495ae853SAndroid Build Coastguard Worker                                                                  pu1_refarray_cr, DYADIC_REF_W_C);
2580*495ae853SAndroid Build Coastguard Worker                 i4_c_yD++;
2581*495ae853SAndroid Build Coastguard Worker             }
2582*495ae853SAndroid Build Coastguard Worker 
2583*495ae853SAndroid Build Coastguard Worker         } /* (mb_x+left,mb_y) is unavailable */
2584*495ae853SAndroid Build Coastguard Worker 
2585*495ae853SAndroid Build Coastguard Worker         if(!(u1_ny_avlblty & 4))
2586*495ae853SAndroid Build Coastguard Worker         {
2587*495ae853SAndroid Build Coastguard Worker             /* (mb_x,mb_y+top) is unavailable */
2588*495ae853SAndroid Build Coastguard Worker             WORD32 i4_xD, i4_yD;
2589*495ae853SAndroid Build Coastguard Worker             WORD32 i4_c_xD, i4_c_yD;
2590*495ae853SAndroid Build Coastguard Worker             UWORD8 *pu1_tmp_dst;
2591*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_filled_samp;
2592*495ae853SAndroid Build Coastguard Worker 
2593*495ae853SAndroid Build Coastguard Worker             i1_corner_samp_avlbl_flag = (u1_ny_avlblty & 2) >> 1;
2594*495ae853SAndroid Build Coastguard Worker             i4_y0 = 9 + (i4_top << 3) + (i4_top);
2595*495ae853SAndroid Build Coastguard Worker             i4_x0 = 2;
2596*495ae853SAndroid Build Coastguard Worker             i4_ref_xD = 1;
2597*495ae853SAndroid Build Coastguard Worker             if(i4_left > 0)
2598*495ae853SAndroid Build Coastguard Worker             {
2599*495ae853SAndroid Build Coastguard Worker                 i4_x0 += 8;
2600*495ae853SAndroid Build Coastguard Worker                 i4_ref_xD = 18;
2601*495ae853SAndroid Build Coastguard Worker             }
2602*495ae853SAndroid Build Coastguard Worker 
2603*495ae853SAndroid Build Coastguard Worker             i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
2604*495ae853SAndroid Build Coastguard Worker             i4_xD = i4_x0 - i4_ref_xD;
2605*495ae853SAndroid Build Coastguard Worker             i4_yD = i4_y0 - i4_ref_yD;
2606*495ae853SAndroid Build Coastguard Worker             i4_xc0 = i4_x0 >> 1;
2607*495ae853SAndroid Build Coastguard Worker             i4_yc0 = i4_y0 >> 1;
2608*495ae853SAndroid Build Coastguard Worker             i4_c_ref_xD = i4_ref_xD >> 1;
2609*495ae853SAndroid Build Coastguard Worker             i4_c_ref_yD = i4_ref_yD >> 1;
2610*495ae853SAndroid Build Coastguard Worker             i4_c_xD = i4_xc0 - i4_c_ref_xD;
2611*495ae853SAndroid Build Coastguard Worker             i4_c_yD = i4_yc0 - i4_c_ref_yD;
2612*495ae853SAndroid Build Coastguard Worker 
2613*495ae853SAndroid Build Coastguard Worker             if(!i1_corner_samp_avlbl_flag)
2614*495ae853SAndroid Build Coastguard Worker             {
2615*495ae853SAndroid Build Coastguard Worker                 isvcd_corner_samp_dyadic(i4_x0, i4_y0, i4_xD, i4_yD, pu1_refarray_luma,
2616*495ae853SAndroid Build Coastguard Worker                                          pu1_refarray_cb, pu1_refarray_cr);
2617*495ae853SAndroid Build Coastguard Worker             }
2618*495ae853SAndroid Build Coastguard Worker 
2619*495ae853SAndroid Build Coastguard Worker             /* Call the diagonal construction for the 2 rows */
2620*495ae853SAndroid Build Coastguard Worker             if(i4_top == i4_left)
2621*495ae853SAndroid Build Coastguard Worker             {
2622*495ae853SAndroid Build Coastguard Worker                 /* if top * left = 1 (x0,y0) */
2623*495ae853SAndroid Build Coastguard Worker                 u1_filled_samp = isvcd_diagonal_construct_dyadic(i4_x0, i4_y0, i4_xD, i4_yD,
2624*495ae853SAndroid Build Coastguard Worker                                                                  pu1_refarray_luma, DYADIC_REF_W_Y);
2625*495ae853SAndroid Build Coastguard Worker 
2626*495ae853SAndroid Build Coastguard Worker                 pu1_tmp_dst = pu1_refarray_luma + ((i4_y0 + 1) * DYADIC_REF_W_Y);
2627*495ae853SAndroid Build Coastguard Worker 
2628*495ae853SAndroid Build Coastguard Worker                 /* (x0+1,y0), ..., (x0+7,y0) and */
2629*495ae853SAndroid Build Coastguard Worker                 /* (x0,y0+1), ..., (x0+6,y0+1)   */
2630*495ae853SAndroid Build Coastguard Worker                 for(i4_x = i4_x0 + 1; i4_x < i4_x0 + 8; i4_x++)
2631*495ae853SAndroid Build Coastguard Worker                 {
2632*495ae853SAndroid Build Coastguard Worker                     i4_xD++;
2633*495ae853SAndroid Build Coastguard Worker                     u1_filled_samp = isvcd_diagonal_construct_dyadic(
2634*495ae853SAndroid Build Coastguard Worker                         i4_x, i4_y0, i4_xD, i4_yD, pu1_refarray_luma, DYADIC_REF_W_Y);
2635*495ae853SAndroid Build Coastguard Worker                     pu1_tmp_dst[i4_x - 1] = u1_filled_samp;
2636*495ae853SAndroid Build Coastguard Worker                 }
2637*495ae853SAndroid Build Coastguard Worker 
2638*495ae853SAndroid Build Coastguard Worker                 /* (x0+7,y0+1) */
2639*495ae853SAndroid Build Coastguard Worker                 u1_filled_samp = isvcd_diagonal_construct_dyadic(
2640*495ae853SAndroid Build Coastguard Worker                     i4_x0 + 7, i4_y0 + 1, i4_xD, i4_yD + 1, pu1_refarray_luma, DYADIC_REF_W_Y);
2641*495ae853SAndroid Build Coastguard Worker             }
2642*495ae853SAndroid Build Coastguard Worker             else
2643*495ae853SAndroid Build Coastguard Worker             {
2644*495ae853SAndroid Build Coastguard Worker                 /* top * left = -1 */
2645*495ae853SAndroid Build Coastguard Worker                 /* (x0,y0+1) */
2646*495ae853SAndroid Build Coastguard Worker                 u1_filled_samp = isvcd_diagonal_construct_dyadic(i4_x0, i4_y0 + 1, i4_xD, i4_yD + 1,
2647*495ae853SAndroid Build Coastguard Worker                                                                  pu1_refarray_luma, DYADIC_REF_W_Y);
2648*495ae853SAndroid Build Coastguard Worker 
2649*495ae853SAndroid Build Coastguard Worker                 pu1_tmp_dst = pu1_refarray_luma + ((i4_y0 + 1) * DYADIC_REF_W_Y);
2650*495ae853SAndroid Build Coastguard Worker 
2651*495ae853SAndroid Build Coastguard Worker                 /* (x0,y0), ..., (x0,y0+6) and   */
2652*495ae853SAndroid Build Coastguard Worker                 /* (x0+1,y0+1), ..., (x0+1,y0+7) */
2653*495ae853SAndroid Build Coastguard Worker                 for(i4_x = i4_x0; i4_x < i4_x0 + 7; i4_x++)
2654*495ae853SAndroid Build Coastguard Worker                 {
2655*495ae853SAndroid Build Coastguard Worker                     u1_filled_samp = isvcd_diagonal_construct_dyadic(
2656*495ae853SAndroid Build Coastguard Worker                         i4_x, i4_y0, i4_xD, i4_yD, pu1_refarray_luma, DYADIC_REF_W_Y);
2657*495ae853SAndroid Build Coastguard Worker 
2658*495ae853SAndroid Build Coastguard Worker                     pu1_tmp_dst[i4_x + 1] = u1_filled_samp;
2659*495ae853SAndroid Build Coastguard Worker                     i4_xD++;
2660*495ae853SAndroid Build Coastguard Worker                 }
2661*495ae853SAndroid Build Coastguard Worker 
2662*495ae853SAndroid Build Coastguard Worker                 /* (x0+7,y0) */
2663*495ae853SAndroid Build Coastguard Worker                 u1_filled_samp = isvcd_diagonal_construct_dyadic(i4_x0 + 7, i4_y0, i4_xD, i4_yD,
2664*495ae853SAndroid Build Coastguard Worker                                                                  pu1_refarray_luma, DYADIC_REF_W_Y);
2665*495ae853SAndroid Build Coastguard Worker             }
2666*495ae853SAndroid Build Coastguard Worker 
2667*495ae853SAndroid Build Coastguard Worker             /* For Cb and Cr */
2668*495ae853SAndroid Build Coastguard Worker             for(i4_x = i4_xc0; i4_x < i4_xc0 + 4; i4_x++)
2669*495ae853SAndroid Build Coastguard Worker             {
2670*495ae853SAndroid Build Coastguard Worker                 u1_filled_samp = isvcd_diagonal_construct_dyadic(i4_x, i4_yc0, i4_c_xD, i4_c_yD,
2671*495ae853SAndroid Build Coastguard Worker                                                                  pu1_refarray_cb, DYADIC_REF_W_C);
2672*495ae853SAndroid Build Coastguard Worker                 u1_filled_samp = isvcd_diagonal_construct_dyadic(i4_x, i4_yc0, i4_c_xD, i4_c_yD,
2673*495ae853SAndroid Build Coastguard Worker                                                                  pu1_refarray_cr, DYADIC_REF_W_C);
2674*495ae853SAndroid Build Coastguard Worker                 i4_c_xD++;
2675*495ae853SAndroid Build Coastguard Worker             }
2676*495ae853SAndroid Build Coastguard Worker 
2677*495ae853SAndroid Build Coastguard Worker         } /* (mb_x,mb_y+top) is unavailable */
2678*495ae853SAndroid Build Coastguard Worker     }     /* if (mb_x+left,mb_y+top) not available */
2679*495ae853SAndroid Build Coastguard Worker     else
2680*495ae853SAndroid Build Coastguard Worker     {
2681*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_tmp_dst1, *pu1_tmp_dst2;
2682*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_tmp_src1, *pu1_tmp_src2;
2683*495ae853SAndroid Build Coastguard Worker 
2684*495ae853SAndroid Build Coastguard Worker         if(0x02 == (u1_ny_avlblty & 0x6))
2685*495ae853SAndroid Build Coastguard Worker         {
2686*495ae853SAndroid Build Coastguard Worker             /* (mb_x+left,mb_y) available, (mb_x,mb_y+top) unavailable */
2687*495ae853SAndroid Build Coastguard Worker             i4_x0 = 9 + (i4_left << 3) + i4_left;
2688*495ae853SAndroid Build Coastguard Worker             i4_y0 = 9 + (i4_top << 3) + i4_top;
2689*495ae853SAndroid Build Coastguard Worker             i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
2690*495ae853SAndroid Build Coastguard Worker 
2691*495ae853SAndroid Build Coastguard Worker             /* Copy (x0,ref_yD), (x0+1,ref_yD) to  */
2692*495ae853SAndroid Build Coastguard Worker             /* (x0,y0), (x0+1,y0), and (x0,y0+1), (x0+1,y0+1) */
2693*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src1 = pu1_refarray_luma + (i4_ref_yD * DYADIC_REF_W_Y);
2694*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1 = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
2695*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2 = pu1_tmp_dst1 + DYADIC_REF_W_Y;
2696*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1[i4_x0] = pu1_tmp_src1[i4_x0];
2697*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2[i4_x0] = pu1_tmp_src1[i4_x0];
2698*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1[i4_x0 + 1] = pu1_tmp_src1[i4_x0 + 1];
2699*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2[i4_x0 + 1] = pu1_tmp_src1[i4_x0 + 1];
2700*495ae853SAndroid Build Coastguard Worker 
2701*495ae853SAndroid Build Coastguard Worker             /* Cb and Cr copy */
2702*495ae853SAndroid Build Coastguard Worker             i4_xc0 = i4_x0 >> 1;
2703*495ae853SAndroid Build Coastguard Worker             i4_yc0 = i4_y0 >> 1;
2704*495ae853SAndroid Build Coastguard Worker             i4_c_ref_yD = i4_ref_yD >> 1;
2705*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src1 = pu1_refarray_cb + (i4_c_ref_yD * DYADIC_REF_W_C);
2706*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1 = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
2707*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src2 = pu1_refarray_cr + (i4_c_ref_yD * DYADIC_REF_W_C);
2708*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2 = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
2709*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1[i4_xc0] = pu1_tmp_src1[i4_xc0];
2710*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2[i4_xc0] = pu1_tmp_src2[i4_xc0];
2711*495ae853SAndroid Build Coastguard Worker 
2712*495ae853SAndroid Build Coastguard Worker         } /* if (mb_x+left,mb_y) available, (mb_x,mb_y+top) unavailable */
2713*495ae853SAndroid Build Coastguard Worker         else if(0x04 == (u1_ny_avlblty & 0x6))
2714*495ae853SAndroid Build Coastguard Worker         {
2715*495ae853SAndroid Build Coastguard Worker             /* (mb_x+left,mb_y) unavailable, (mb_x,mb_y+top) available */
2716*495ae853SAndroid Build Coastguard Worker             i4_x0 = 9 + (i4_left << 3) + i4_left;
2717*495ae853SAndroid Build Coastguard Worker             i4_y0 = 9 + (i4_top << 3) + i4_top;
2718*495ae853SAndroid Build Coastguard Worker             i4_ref_xD = i4_x0 - i4_left - (i4_left >> 1);
2719*495ae853SAndroid Build Coastguard Worker 
2720*495ae853SAndroid Build Coastguard Worker             /* Copy (ref_xD,y0) to (x0,y0) and (x0+1,y0) */
2721*495ae853SAndroid Build Coastguard Worker             /* copy (ref_xD,y0+1) to (x0,y0+1) and (x0+1,y0+1) */
2722*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src1 = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
2723*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1 = pu1_tmp_src1;
2724*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src2 = pu1_tmp_src1 + DYADIC_REF_W_Y;
2725*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2 = pu1_tmp_src2;
2726*495ae853SAndroid Build Coastguard Worker 
2727*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1[i4_x0] = pu1_tmp_src1[i4_ref_xD];
2728*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1[i4_x0 + 1] = pu1_tmp_src1[i4_ref_xD];
2729*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2[i4_x0] = pu1_tmp_src2[i4_ref_xD];
2730*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2[i4_x0 + 1] = pu1_tmp_src2[i4_ref_xD];
2731*495ae853SAndroid Build Coastguard Worker 
2732*495ae853SAndroid Build Coastguard Worker             /* Copy Cb and Cr */
2733*495ae853SAndroid Build Coastguard Worker             i4_xc0 = i4_x0 >> 1;
2734*495ae853SAndroid Build Coastguard Worker             i4_yc0 = i4_y0 >> 1;
2735*495ae853SAndroid Build Coastguard Worker             i4_c_ref_xD = i4_ref_xD >> 1;
2736*495ae853SAndroid Build Coastguard Worker 
2737*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src1 = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
2738*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1 = pu1_tmp_src1;
2739*495ae853SAndroid Build Coastguard Worker             pu1_tmp_src2 = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
2740*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2 = pu1_tmp_src2;
2741*495ae853SAndroid Build Coastguard Worker 
2742*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst1[i4_xc0] = pu1_tmp_src1[i4_c_ref_xD];
2743*495ae853SAndroid Build Coastguard Worker             pu1_tmp_dst2[i4_xc0] = pu1_tmp_src2[i4_c_ref_xD];
2744*495ae853SAndroid Build Coastguard Worker 
2745*495ae853SAndroid Build Coastguard Worker         } /* if (mb_x+left,mb_y) unavailable, (mb_x,mb_y+top) available */
2746*495ae853SAndroid Build Coastguard Worker         else if(0x6 == (u1_ny_avlblty & 0x6))
2747*495ae853SAndroid Build Coastguard Worker         {
2748*495ae853SAndroid Build Coastguard Worker             /* (mb_x+left,mb_y) available, (mb_x,mb_y+top) available */
2749*495ae853SAndroid Build Coastguard Worker             WORD32 i4_xD, i4_yD;
2750*495ae853SAndroid Build Coastguard Worker             WORD32 i4_c_xD, i4_c_yD;
2751*495ae853SAndroid Build Coastguard Worker 
2752*495ae853SAndroid Build Coastguard Worker             i4_y0 = 9 + (i4_top << 3) + i4_top;
2753*495ae853SAndroid Build Coastguard Worker             i4_x0 = 9 + (i4_left << 3) + i4_left;
2754*495ae853SAndroid Build Coastguard Worker             i4_ref_xD = i4_x0 - i4_left - (i4_left >> 1);
2755*495ae853SAndroid Build Coastguard Worker             i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
2756*495ae853SAndroid Build Coastguard Worker             i4_xD = i4_x0 - i4_ref_xD;
2757*495ae853SAndroid Build Coastguard Worker             i4_yD = i4_y0 - i4_ref_yD;
2758*495ae853SAndroid Build Coastguard Worker             i4_xc0 = i4_x0 >> 1;
2759*495ae853SAndroid Build Coastguard Worker             i4_yc0 = i4_y0 >> 1;
2760*495ae853SAndroid Build Coastguard Worker             i4_c_ref_xD = i4_ref_xD >> 1;
2761*495ae853SAndroid Build Coastguard Worker             i4_c_ref_yD = i4_ref_yD >> 1;
2762*495ae853SAndroid Build Coastguard Worker             i4_c_xD = i4_xc0 - i4_c_ref_xD;
2763*495ae853SAndroid Build Coastguard Worker             i4_c_yD = i4_yc0 - i4_c_ref_yD;
2764*495ae853SAndroid Build Coastguard Worker 
2765*495ae853SAndroid Build Coastguard Worker             /* Call diagonal construction for luma */
2766*495ae853SAndroid Build Coastguard Worker             for(i4_y = i4_y0; i4_y < i4_y0 + 2; i4_y++)
2767*495ae853SAndroid Build Coastguard Worker             {
2768*495ae853SAndroid Build Coastguard Worker                 for(i4_x = i4_x0; i4_x < i4_x0 + 2; i4_x++)
2769*495ae853SAndroid Build Coastguard Worker                 {
2770*495ae853SAndroid Build Coastguard Worker                     isvcd_diagonal_construct_dyadic(i4_x, i4_y, i4_xD, i4_yD, pu1_refarray_luma,
2771*495ae853SAndroid Build Coastguard Worker                                                     DYADIC_REF_W_Y);
2772*495ae853SAndroid Build Coastguard Worker                     i4_xD++;
2773*495ae853SAndroid Build Coastguard Worker                 }
2774*495ae853SAndroid Build Coastguard Worker                 i4_yD++;
2775*495ae853SAndroid Build Coastguard Worker                 i4_xD -= 2;
2776*495ae853SAndroid Build Coastguard Worker             }
2777*495ae853SAndroid Build Coastguard Worker 
2778*495ae853SAndroid Build Coastguard Worker             /* Call diagonal construction for chroma */
2779*495ae853SAndroid Build Coastguard Worker             isvcd_diagonal_construct_dyadic(i4_xc0, i4_yc0, i4_c_xD, i4_c_yD, pu1_refarray_cb,
2780*495ae853SAndroid Build Coastguard Worker                                             DYADIC_REF_W_C);
2781*495ae853SAndroid Build Coastguard Worker 
2782*495ae853SAndroid Build Coastguard Worker             isvcd_diagonal_construct_dyadic(i4_xc0, i4_yc0, i4_c_xD, i4_c_yD, pu1_refarray_cr,
2783*495ae853SAndroid Build Coastguard Worker                                             DYADIC_REF_W_C);
2784*495ae853SAndroid Build Coastguard Worker 
2785*495ae853SAndroid Build Coastguard Worker         } /* if (mb_x+left,mb_y) available, (mb_x,mb_y+top) available */
2786*495ae853SAndroid Build Coastguard Worker     }     /* (mb_x+left,mb_y+top) available */
2787*495ae853SAndroid Build Coastguard Worker 
2788*495ae853SAndroid Build Coastguard Worker     return OK;
2789*495ae853SAndroid Build Coastguard Worker }
2790*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2791*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2792*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_interpolate_base_luma_dyadic                        */
2793*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2794*495ae853SAndroid Build Coastguard Worker /*  Description   : This function takes the reference array buffer & performs*/
2795*495ae853SAndroid Build Coastguard Worker /*                  intra resampling for dyadic scaling ratios               */
2796*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pu1_inp_buf : ptr to the 12x12 reference sample buffer   */
2797*495ae853SAndroid Build Coastguard Worker /*                    pi2_tmp_filt_buf : ptr to the 12x16 buffer to hold the */
2798*495ae853SAndroid Build Coastguard Worker /*                        vertically interpolated data                       */
2799*495ae853SAndroid Build Coastguard Worker /*                  pu1_out_buf : output buffer pointer                      */
2800*495ae853SAndroid Build Coastguard Worker /*                  i4_out_stride : output buffer stride                     */
2801*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
2802*495ae853SAndroid Build Coastguard Worker /*  Processing    : it does the interpolation in vertical direction followed */
2803*495ae853SAndroid Build Coastguard Worker /*                  by horizontal direction                                  */
2804*495ae853SAndroid Build Coastguard Worker /*  Outputs       : resampled pixels                                         */
2805*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
2806*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2807*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
2808*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2809*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
2810*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2811*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
2812*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay           creation                             */
2813*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2814*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_interpolate_base_luma_dyadic(UWORD8 * pu1_inp_buf,WORD16 * pi2_tmp_filt_buf,UWORD8 * pu1_out_buf,WORD32 i4_out_stride)2815*495ae853SAndroid Build Coastguard Worker void isvcd_interpolate_base_luma_dyadic(UWORD8 *pu1_inp_buf, WORD16 *pi2_tmp_filt_buf,
2816*495ae853SAndroid Build Coastguard Worker                                         UWORD8 *pu1_out_buf, WORD32 i4_out_stride)
2817*495ae853SAndroid Build Coastguard Worker {
2818*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
2819*495ae853SAndroid Build Coastguard Worker     WORD32 i4_coeff_0, i4_coeff_1, i4_coeff_2, i4_coeff_3;
2820*495ae853SAndroid Build Coastguard Worker     WORD32 i4_samp_0, i4_samp_1, i4_samp_2, i4_samp_3;
2821*495ae853SAndroid Build Coastguard Worker     WORD32 i4_rslt_1, i4_rslt_2;
2822*495ae853SAndroid Build Coastguard Worker     WORD32 i4_filt_stride, i4_src_stride;
2823*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_inp, *pu1_out;
2824*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_tmp;
2825*495ae853SAndroid Build Coastguard Worker 
2826*495ae853SAndroid Build Coastguard Worker     /* Filter coefficient values for phase 4 */
2827*495ae853SAndroid Build Coastguard Worker     i4_coeff_0 = -3;
2828*495ae853SAndroid Build Coastguard Worker     i4_coeff_1 = 28;
2829*495ae853SAndroid Build Coastguard Worker     i4_coeff_2 = 8;
2830*495ae853SAndroid Build Coastguard Worker     i4_coeff_3 = -1;
2831*495ae853SAndroid Build Coastguard Worker     i4_filt_stride = 12;
2832*495ae853SAndroid Build Coastguard Worker     i4_src_stride = DYADIC_REF_W_Y;
2833*495ae853SAndroid Build Coastguard Worker     pu1_inp = pu1_inp_buf;
2834*495ae853SAndroid Build Coastguard Worker     pi2_tmp = pi2_tmp_filt_buf;
2835*495ae853SAndroid Build Coastguard Worker     pu1_out = pu1_out_buf;
2836*495ae853SAndroid Build Coastguard Worker 
2837*495ae853SAndroid Build Coastguard Worker     /* Vertical interpolation */
2838*495ae853SAndroid Build Coastguard Worker     for(i4_x = 0; i4_x < 12; i4_x++)
2839*495ae853SAndroid Build Coastguard Worker     {
2840*495ae853SAndroid Build Coastguard Worker         /* y = 0, y_phase = 12 */
2841*495ae853SAndroid Build Coastguard Worker         i4_samp_0 = pu1_inp[i4_x];
2842*495ae853SAndroid Build Coastguard Worker         pu1_inp += i4_src_stride;
2843*495ae853SAndroid Build Coastguard Worker         i4_samp_1 = pu1_inp[i4_x];
2844*495ae853SAndroid Build Coastguard Worker         pu1_inp += i4_src_stride;
2845*495ae853SAndroid Build Coastguard Worker         i4_samp_2 = pu1_inp[i4_x];
2846*495ae853SAndroid Build Coastguard Worker         pu1_inp += i4_src_stride;
2847*495ae853SAndroid Build Coastguard Worker         i4_samp_3 = pu1_inp[i4_x];
2848*495ae853SAndroid Build Coastguard Worker         pu1_inp += i4_src_stride;
2849*495ae853SAndroid Build Coastguard Worker 
2850*495ae853SAndroid Build Coastguard Worker         /* since y_phase 12 for y = 0 */
2851*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 = i4_samp_0 * i4_coeff_3;
2852*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_1 * i4_coeff_2;
2853*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_2 * i4_coeff_1;
2854*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_3 * i4_coeff_0;
2855*495ae853SAndroid Build Coastguard Worker 
2856*495ae853SAndroid Build Coastguard Worker         /* Store the output */
2857*495ae853SAndroid Build Coastguard Worker         pi2_tmp[i4_x] = i4_rslt_1;
2858*495ae853SAndroid Build Coastguard Worker         /* Increment the output ptr */
2859*495ae853SAndroid Build Coastguard Worker         pi2_tmp += i4_filt_stride;
2860*495ae853SAndroid Build Coastguard Worker 
2861*495ae853SAndroid Build Coastguard Worker         for(i4_y = 1; i4_y < 15; i4_y += 2)
2862*495ae853SAndroid Build Coastguard Worker         {
2863*495ae853SAndroid Build Coastguard Worker             i4_samp_0 = i4_samp_1;
2864*495ae853SAndroid Build Coastguard Worker             i4_samp_1 = i4_samp_2;
2865*495ae853SAndroid Build Coastguard Worker             i4_samp_2 = i4_samp_3;
2866*495ae853SAndroid Build Coastguard Worker             i4_samp_3 = pu1_inp[i4_x];
2867*495ae853SAndroid Build Coastguard Worker 
2868*495ae853SAndroid Build Coastguard Worker             /* y_phase is 4 for odd values of y */
2869*495ae853SAndroid Build Coastguard Worker             /* and 12 for even values of y    */
2870*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 = i4_samp_0 * i4_coeff_0;
2871*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += i4_samp_1 * i4_coeff_1;
2872*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += i4_samp_2 * i4_coeff_2;
2873*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += i4_samp_3 * i4_coeff_3;
2874*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 = i4_samp_0 * i4_coeff_3;
2875*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += i4_samp_1 * i4_coeff_2;
2876*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += i4_samp_2 * i4_coeff_1;
2877*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += i4_samp_3 * i4_coeff_0;
2878*495ae853SAndroid Build Coastguard Worker 
2879*495ae853SAndroid Build Coastguard Worker             /* Storing the results */
2880*495ae853SAndroid Build Coastguard Worker             pi2_tmp[i4_x] = i4_rslt_1;
2881*495ae853SAndroid Build Coastguard Worker             pi2_tmp += i4_filt_stride;
2882*495ae853SAndroid Build Coastguard Worker             pi2_tmp[i4_x] = i4_rslt_2;
2883*495ae853SAndroid Build Coastguard Worker 
2884*495ae853SAndroid Build Coastguard Worker             /* Incrementing the pointers */
2885*495ae853SAndroid Build Coastguard Worker             pi2_tmp += i4_filt_stride;
2886*495ae853SAndroid Build Coastguard Worker             pu1_inp += i4_src_stride;
2887*495ae853SAndroid Build Coastguard Worker 
2888*495ae853SAndroid Build Coastguard Worker         } /* End of loop over y */
2889*495ae853SAndroid Build Coastguard Worker 
2890*495ae853SAndroid Build Coastguard Worker         /* y = 15, y_phase = 4 */
2891*495ae853SAndroid Build Coastguard Worker         i4_samp_0 = i4_samp_1;
2892*495ae853SAndroid Build Coastguard Worker         i4_samp_1 = i4_samp_2;
2893*495ae853SAndroid Build Coastguard Worker         i4_samp_2 = i4_samp_3;
2894*495ae853SAndroid Build Coastguard Worker         i4_samp_3 = pu1_inp[i4_x];
2895*495ae853SAndroid Build Coastguard Worker 
2896*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 = i4_samp_0 * i4_coeff_0;
2897*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_1 * i4_coeff_1;
2898*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_2 * i4_coeff_2;
2899*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_3 * i4_coeff_3;
2900*495ae853SAndroid Build Coastguard Worker 
2901*495ae853SAndroid Build Coastguard Worker         /* Store the output */
2902*495ae853SAndroid Build Coastguard Worker         pi2_tmp[i4_x] = i4_rslt_1;
2903*495ae853SAndroid Build Coastguard Worker 
2904*495ae853SAndroid Build Coastguard Worker         /* Reinitializing the ptrs */
2905*495ae853SAndroid Build Coastguard Worker         pu1_inp = pu1_inp_buf;
2906*495ae853SAndroid Build Coastguard Worker         pi2_tmp = pi2_tmp_filt_buf;
2907*495ae853SAndroid Build Coastguard Worker     }
2908*495ae853SAndroid Build Coastguard Worker 
2909*495ae853SAndroid Build Coastguard Worker     /* Horizontal interpolation */
2910*495ae853SAndroid Build Coastguard Worker     for(i4_y = 0; i4_y < 16; i4_y++)
2911*495ae853SAndroid Build Coastguard Worker     {
2912*495ae853SAndroid Build Coastguard Worker         /* x = 0, x_phase = 12 */
2913*495ae853SAndroid Build Coastguard Worker         i4_samp_0 = *pi2_tmp++;
2914*495ae853SAndroid Build Coastguard Worker         i4_samp_1 = *pi2_tmp++;
2915*495ae853SAndroid Build Coastguard Worker         i4_samp_2 = *pi2_tmp++;
2916*495ae853SAndroid Build Coastguard Worker         i4_samp_3 = *pi2_tmp++;
2917*495ae853SAndroid Build Coastguard Worker 
2918*495ae853SAndroid Build Coastguard Worker         /* since x_phase 12 for x = 0 */
2919*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 = i4_samp_0 * i4_coeff_3;
2920*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_1 * i4_coeff_2;
2921*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_2 * i4_coeff_1;
2922*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_3 * i4_coeff_0;
2923*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += 512;
2924*495ae853SAndroid Build Coastguard Worker 
2925*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 >>= 10;
2926*495ae853SAndroid Build Coastguard Worker 
2927*495ae853SAndroid Build Coastguard Worker         /* Store the output */
2928*495ae853SAndroid Build Coastguard Worker         pu1_out[0] = CLIPUCHAR(i4_rslt_1);
2929*495ae853SAndroid Build Coastguard Worker 
2930*495ae853SAndroid Build Coastguard Worker         for(i4_x = 1; i4_x < 15; i4_x += 2)
2931*495ae853SAndroid Build Coastguard Worker         {
2932*495ae853SAndroid Build Coastguard Worker             i4_samp_0 = i4_samp_1;
2933*495ae853SAndroid Build Coastguard Worker             i4_samp_1 = i4_samp_2;
2934*495ae853SAndroid Build Coastguard Worker             i4_samp_2 = i4_samp_3;
2935*495ae853SAndroid Build Coastguard Worker             i4_samp_3 = *pi2_tmp++;
2936*495ae853SAndroid Build Coastguard Worker 
2937*495ae853SAndroid Build Coastguard Worker             /* x_phase is 4 for odd values of x */
2938*495ae853SAndroid Build Coastguard Worker             /* and 12 for even values of x    */
2939*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 = i4_samp_0 * i4_coeff_0;
2940*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += i4_samp_1 * i4_coeff_1;
2941*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += i4_samp_2 * i4_coeff_2;
2942*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += i4_samp_3 * i4_coeff_3;
2943*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += 512;
2944*495ae853SAndroid Build Coastguard Worker 
2945*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 = i4_samp_0 * i4_coeff_3;
2946*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += i4_samp_1 * i4_coeff_2;
2947*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += i4_samp_2 * i4_coeff_1;
2948*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += i4_samp_3 * i4_coeff_0;
2949*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += 512;
2950*495ae853SAndroid Build Coastguard Worker 
2951*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 >>= 10;
2952*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 >>= 10;
2953*495ae853SAndroid Build Coastguard Worker 
2954*495ae853SAndroid Build Coastguard Worker             /* Store the output */
2955*495ae853SAndroid Build Coastguard Worker             pu1_out[i4_x] = CLIPUCHAR(i4_rslt_1);
2956*495ae853SAndroid Build Coastguard Worker             pu1_out[i4_x + 1] = CLIPUCHAR(i4_rslt_2);
2957*495ae853SAndroid Build Coastguard Worker         }
2958*495ae853SAndroid Build Coastguard Worker 
2959*495ae853SAndroid Build Coastguard Worker         /* x = 15 */
2960*495ae853SAndroid Build Coastguard Worker         i4_samp_0 = i4_samp_1;
2961*495ae853SAndroid Build Coastguard Worker         i4_samp_1 = i4_samp_2;
2962*495ae853SAndroid Build Coastguard Worker         i4_samp_2 = i4_samp_3;
2963*495ae853SAndroid Build Coastguard Worker         i4_samp_3 = *pi2_tmp++;
2964*495ae853SAndroid Build Coastguard Worker 
2965*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 = i4_samp_0 * i4_coeff_0;
2966*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_1 * i4_coeff_1;
2967*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_2 * i4_coeff_2;
2968*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_3 * i4_coeff_3;
2969*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += 512;
2970*495ae853SAndroid Build Coastguard Worker 
2971*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 >>= 10;
2972*495ae853SAndroid Build Coastguard Worker 
2973*495ae853SAndroid Build Coastguard Worker         /* Store the output */
2974*495ae853SAndroid Build Coastguard Worker         pu1_out[i4_x] = CLIPUCHAR(i4_rslt_1);
2975*495ae853SAndroid Build Coastguard Worker 
2976*495ae853SAndroid Build Coastguard Worker         /* Increment the output ptr */
2977*495ae853SAndroid Build Coastguard Worker         pu1_out += i4_out_stride;
2978*495ae853SAndroid Build Coastguard Worker 
2979*495ae853SAndroid Build Coastguard Worker     } /* End of loop over y */
2980*495ae853SAndroid Build Coastguard Worker } /* isvcd_interpolate_base_luma_dyadic */
2981*495ae853SAndroid Build Coastguard Worker 
2982*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2983*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2984*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_vert_interpol_chroma_dyadic_1                       */
2985*495ae853SAndroid Build Coastguard Worker /*                                                                           */
2986*495ae853SAndroid Build Coastguard Worker /*  Description   : This function takes the reference array buffer & performs*/
2987*495ae853SAndroid Build Coastguard Worker /*                  vertical intra resampling for dyadic scaling ratios for  */
2988*495ae853SAndroid Build Coastguard Worker /*                    chroma for the following ref_lyr_chroma_phase_y_plus1  */
2989*495ae853SAndroid Build Coastguard Worker /*                    chroma_phase_y_plus1:                                  */
2990*495ae853SAndroid Build Coastguard Worker /*                        ref_lyr        cur_lyr                             */
2991*495ae853SAndroid Build Coastguard Worker /*                            0            0                                 */
2992*495ae853SAndroid Build Coastguard Worker /*                            1            0                                 */
2993*495ae853SAndroid Build Coastguard Worker /*                            1            1                                 */
2994*495ae853SAndroid Build Coastguard Worker /*                            1            2                                 */
2995*495ae853SAndroid Build Coastguard Worker /*                            2            1                                 */
2996*495ae853SAndroid Build Coastguard Worker /*                            2            2                                 */
2997*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pu1_inp_buf : ptr to the 6x6 reference sample buffer     */
2998*495ae853SAndroid Build Coastguard Worker /*                    pi2_tmp_filt_buf : ptr to the 6x8 buffer to hold the   */
2999*495ae853SAndroid Build Coastguard Worker /*                        vertically interpolated data                       */
3000*495ae853SAndroid Build Coastguard Worker /*                    i4_phase_0 : y phase for even values of y              */
3001*495ae853SAndroid Build Coastguard Worker /*                    i4_phase_1 : y phase for odd values of y               */
3002*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
3003*495ae853SAndroid Build Coastguard Worker /*  Processing    : it does the interpolation in vertical direction          */
3004*495ae853SAndroid Build Coastguard Worker /*  Outputs       : vertically resampled samples                             */
3005*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
3006*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3007*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
3008*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3009*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3010*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3011*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3012*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay           creation                             */
3013*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3014*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_vert_interpol_chroma_dyadic_1(UWORD8 * pu1_inp_buf,WORD16 * pi2_tmp_filt_buf,WORD32 i4_phase_0,WORD32 i4_phase_1)3015*495ae853SAndroid Build Coastguard Worker void isvcd_vert_interpol_chroma_dyadic_1(UWORD8 *pu1_inp_buf, WORD16 *pi2_tmp_filt_buf,
3016*495ae853SAndroid Build Coastguard Worker                                          WORD32 i4_phase_0, WORD32 i4_phase_1)
3017*495ae853SAndroid Build Coastguard Worker {
3018*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
3019*495ae853SAndroid Build Coastguard Worker     WORD32 i4_coeff_0, i4_coeff_1, i4_coeff_2, i4_coeff_3;
3020*495ae853SAndroid Build Coastguard Worker     WORD32 i4_samp_0, i4_samp_1;
3021*495ae853SAndroid Build Coastguard Worker     WORD32 i4_rslt_1, i4_rslt_2;
3022*495ae853SAndroid Build Coastguard Worker     WORD32 i4_filt_stride, i4_src_stride;
3023*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_inp;
3024*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_tmp;
3025*495ae853SAndroid Build Coastguard Worker 
3026*495ae853SAndroid Build Coastguard Worker     i4_coeff_0 = 8 - i4_phase_0;
3027*495ae853SAndroid Build Coastguard Worker     i4_coeff_1 = i4_phase_0;
3028*495ae853SAndroid Build Coastguard Worker     i4_coeff_2 = 8 - i4_phase_1;
3029*495ae853SAndroid Build Coastguard Worker     i4_coeff_3 = i4_phase_1;
3030*495ae853SAndroid Build Coastguard Worker 
3031*495ae853SAndroid Build Coastguard Worker     pu1_inp = pu1_inp_buf;
3032*495ae853SAndroid Build Coastguard Worker     pi2_tmp = pi2_tmp_filt_buf;
3033*495ae853SAndroid Build Coastguard Worker     i4_filt_stride = 6;
3034*495ae853SAndroid Build Coastguard Worker     i4_src_stride = DYADIC_REF_W_C;
3035*495ae853SAndroid Build Coastguard Worker 
3036*495ae853SAndroid Build Coastguard Worker     /* Vertical interpolation */
3037*495ae853SAndroid Build Coastguard Worker     for(i4_x = 0; i4_x < 6; i4_x++)
3038*495ae853SAndroid Build Coastguard Worker     {
3039*495ae853SAndroid Build Coastguard Worker         /* y = 0, y_phase = phase_0 */
3040*495ae853SAndroid Build Coastguard Worker         i4_samp_0 = pu1_inp[i4_x];
3041*495ae853SAndroid Build Coastguard Worker         pu1_inp += i4_src_stride;
3042*495ae853SAndroid Build Coastguard Worker         i4_samp_1 = pu1_inp[i4_x];
3043*495ae853SAndroid Build Coastguard Worker         pu1_inp += i4_src_stride;
3044*495ae853SAndroid Build Coastguard Worker 
3045*495ae853SAndroid Build Coastguard Worker         /* since y_phase = phase_0 for y = 0 */
3046*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 = i4_samp_0 * i4_coeff_0;
3047*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_1 * i4_coeff_1;
3048*495ae853SAndroid Build Coastguard Worker 
3049*495ae853SAndroid Build Coastguard Worker         /* Store the output */
3050*495ae853SAndroid Build Coastguard Worker         pi2_tmp[i4_x] = i4_rslt_1;
3051*495ae853SAndroid Build Coastguard Worker 
3052*495ae853SAndroid Build Coastguard Worker         /* Increment the output ptr */
3053*495ae853SAndroid Build Coastguard Worker         pi2_tmp += i4_filt_stride;
3054*495ae853SAndroid Build Coastguard Worker 
3055*495ae853SAndroid Build Coastguard Worker         for(i4_y = 1; i4_y < 7; i4_y += 2)
3056*495ae853SAndroid Build Coastguard Worker         {
3057*495ae853SAndroid Build Coastguard Worker             i4_samp_0 = i4_samp_1;
3058*495ae853SAndroid Build Coastguard Worker             i4_samp_1 = pu1_inp[i4_x];
3059*495ae853SAndroid Build Coastguard Worker 
3060*495ae853SAndroid Build Coastguard Worker             /* y_phase is phase_1 for odd values of y */
3061*495ae853SAndroid Build Coastguard Worker             /* and phase_0 for even values of y          */
3062*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 = i4_samp_0 * i4_coeff_2;
3063*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += i4_samp_1 * i4_coeff_3;
3064*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 = i4_samp_0 * i4_coeff_0;
3065*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += i4_samp_1 * i4_coeff_1;
3066*495ae853SAndroid Build Coastguard Worker 
3067*495ae853SAndroid Build Coastguard Worker             /* Storing the results */
3068*495ae853SAndroid Build Coastguard Worker             pi2_tmp[i4_x] = i4_rslt_1;
3069*495ae853SAndroid Build Coastguard Worker             pi2_tmp += i4_filt_stride;
3070*495ae853SAndroid Build Coastguard Worker             pi2_tmp[i4_x] = i4_rslt_2;
3071*495ae853SAndroid Build Coastguard Worker 
3072*495ae853SAndroid Build Coastguard Worker             /* Incrementing the pointers */
3073*495ae853SAndroid Build Coastguard Worker             pi2_tmp += i4_filt_stride;
3074*495ae853SAndroid Build Coastguard Worker             pu1_inp += i4_src_stride;
3075*495ae853SAndroid Build Coastguard Worker 
3076*495ae853SAndroid Build Coastguard Worker         } /* End of loop over y */
3077*495ae853SAndroid Build Coastguard Worker 
3078*495ae853SAndroid Build Coastguard Worker         /* y = 7, y_phase = phase_1 */
3079*495ae853SAndroid Build Coastguard Worker         i4_samp_0 = i4_samp_1;
3080*495ae853SAndroid Build Coastguard Worker         i4_samp_1 = pu1_inp[i4_x];
3081*495ae853SAndroid Build Coastguard Worker 
3082*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 = i4_samp_0 * i4_coeff_2;
3083*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_1 * i4_coeff_3;
3084*495ae853SAndroid Build Coastguard Worker 
3085*495ae853SAndroid Build Coastguard Worker         /* Store the output */
3086*495ae853SAndroid Build Coastguard Worker         pi2_tmp[i4_x] = i4_rslt_1;
3087*495ae853SAndroid Build Coastguard Worker 
3088*495ae853SAndroid Build Coastguard Worker         /* Reinitializing the ptrs */
3089*495ae853SAndroid Build Coastguard Worker         pu1_inp = pu1_inp_buf;
3090*495ae853SAndroid Build Coastguard Worker         pi2_tmp = pi2_tmp_filt_buf;
3091*495ae853SAndroid Build Coastguard Worker 
3092*495ae853SAndroid Build Coastguard Worker     } /* End of loop over x */
3093*495ae853SAndroid Build Coastguard Worker } /* isvcd_vert_interpol_chroma_dyadic_1 */
3094*495ae853SAndroid Build Coastguard Worker 
3095*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3096*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3097*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_vert_interpol_chroma_dyadic_2                       */
3098*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3099*495ae853SAndroid Build Coastguard Worker /*  Description   : This function takes the reference array buffer & performs*/
3100*495ae853SAndroid Build Coastguard Worker /*                  vertical intra resampling for dyadic scaling ratios for  */
3101*495ae853SAndroid Build Coastguard Worker /*                    chroma for the following ref_lyr_chroma_phase_y_plus1  */
3102*495ae853SAndroid Build Coastguard Worker /*                    chroma_phase_y_plus1:                                  */
3103*495ae853SAndroid Build Coastguard Worker /*                        ref_lyr        cur_lyr                             */
3104*495ae853SAndroid Build Coastguard Worker /*                            0            1                                 */
3105*495ae853SAndroid Build Coastguard Worker /*                            0            2                                 */
3106*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pu1_inp_buf : ptr to the 6x6 reference sample buffer     */
3107*495ae853SAndroid Build Coastguard Worker /*                    pi2_tmp_filt_buf : ptr to the 6x8 buffer to hold the   */
3108*495ae853SAndroid Build Coastguard Worker /*                        vertically interpolated data                       */
3109*495ae853SAndroid Build Coastguard Worker /*                    i4_phase_0 : y phase for even values of y              */
3110*495ae853SAndroid Build Coastguard Worker /*                    i4_phase_1 : y phase for odd values of y               */
3111*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
3112*495ae853SAndroid Build Coastguard Worker /*  Processing    : it does the interpolation in vertical direction          */
3113*495ae853SAndroid Build Coastguard Worker /*  Outputs       : vertically resampled samples                             */
3114*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
3115*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3116*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
3117*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3118*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3119*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3120*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3121*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay           creation                             */
3122*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3123*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_vert_interpol_chroma_dyadic_2(UWORD8 * pu1_inp_buf,WORD16 * pi2_tmp_filt_buf,WORD32 i4_phase_0,WORD32 i4_phase_1)3124*495ae853SAndroid Build Coastguard Worker void isvcd_vert_interpol_chroma_dyadic_2(UWORD8 *pu1_inp_buf, WORD16 *pi2_tmp_filt_buf,
3125*495ae853SAndroid Build Coastguard Worker                                          WORD32 i4_phase_0, WORD32 i4_phase_1)
3126*495ae853SAndroid Build Coastguard Worker {
3127*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
3128*495ae853SAndroid Build Coastguard Worker     WORD32 i4_coeff_0, i4_coeff_1, i4_coeff_2, i4_coeff_3;
3129*495ae853SAndroid Build Coastguard Worker     WORD32 i4_samp_0, i4_samp_1;
3130*495ae853SAndroid Build Coastguard Worker     WORD32 i4_rslt_1, i4_rslt_2;
3131*495ae853SAndroid Build Coastguard Worker     WORD32 i4_filt_stride, i4_src_stride;
3132*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_inp;
3133*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_tmp;
3134*495ae853SAndroid Build Coastguard Worker 
3135*495ae853SAndroid Build Coastguard Worker     i4_coeff_0 = 8 - i4_phase_0;
3136*495ae853SAndroid Build Coastguard Worker     i4_coeff_1 = i4_phase_0;
3137*495ae853SAndroid Build Coastguard Worker     i4_coeff_2 = 8 - i4_phase_1;
3138*495ae853SAndroid Build Coastguard Worker     i4_coeff_3 = i4_phase_1;
3139*495ae853SAndroid Build Coastguard Worker 
3140*495ae853SAndroid Build Coastguard Worker     pi2_tmp = pi2_tmp_filt_buf;
3141*495ae853SAndroid Build Coastguard Worker     i4_filt_stride = 6;
3142*495ae853SAndroid Build Coastguard Worker     i4_src_stride = DYADIC_REF_W_C;
3143*495ae853SAndroid Build Coastguard Worker     pu1_inp = pu1_inp_buf + i4_src_stride;
3144*495ae853SAndroid Build Coastguard Worker 
3145*495ae853SAndroid Build Coastguard Worker     /* Vertical interpolation */
3146*495ae853SAndroid Build Coastguard Worker     for(i4_x = 0; i4_x < 6; i4_x++)
3147*495ae853SAndroid Build Coastguard Worker     {
3148*495ae853SAndroid Build Coastguard Worker         i4_samp_1 = pu1_inp[i4_x];
3149*495ae853SAndroid Build Coastguard Worker         pu1_inp += i4_src_stride;
3150*495ae853SAndroid Build Coastguard Worker 
3151*495ae853SAndroid Build Coastguard Worker         for(i4_y = 0; i4_y < 8; i4_y += 2)
3152*495ae853SAndroid Build Coastguard Worker         {
3153*495ae853SAndroid Build Coastguard Worker             i4_samp_0 = i4_samp_1;
3154*495ae853SAndroid Build Coastguard Worker             i4_samp_1 = pu1_inp[i4_x];
3155*495ae853SAndroid Build Coastguard Worker 
3156*495ae853SAndroid Build Coastguard Worker             /* y_phase is phase_1 for odd values of y and phase_0 for even values of y */
3157*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 = i4_samp_0 * i4_coeff_0;
3158*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += i4_samp_1 * i4_coeff_1;
3159*495ae853SAndroid Build Coastguard Worker 
3160*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 = i4_samp_0 * i4_coeff_2;
3161*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += i4_samp_1 * i4_coeff_3;
3162*495ae853SAndroid Build Coastguard Worker 
3163*495ae853SAndroid Build Coastguard Worker             /* Storing the results */
3164*495ae853SAndroid Build Coastguard Worker             pi2_tmp[i4_x] = i4_rslt_1;
3165*495ae853SAndroid Build Coastguard Worker             pi2_tmp += i4_filt_stride;
3166*495ae853SAndroid Build Coastguard Worker             pi2_tmp[i4_x] = i4_rslt_2;
3167*495ae853SAndroid Build Coastguard Worker 
3168*495ae853SAndroid Build Coastguard Worker             /* Incrementing the pointers */
3169*495ae853SAndroid Build Coastguard Worker             pi2_tmp += i4_filt_stride;
3170*495ae853SAndroid Build Coastguard Worker             pu1_inp += i4_src_stride;
3171*495ae853SAndroid Build Coastguard Worker 
3172*495ae853SAndroid Build Coastguard Worker         } /* End of loop over y */
3173*495ae853SAndroid Build Coastguard Worker 
3174*495ae853SAndroid Build Coastguard Worker         /* Reinitializing the ptrs */
3175*495ae853SAndroid Build Coastguard Worker         pu1_inp = pu1_inp_buf + i4_src_stride;
3176*495ae853SAndroid Build Coastguard Worker         pi2_tmp = pi2_tmp_filt_buf;
3177*495ae853SAndroid Build Coastguard Worker 
3178*495ae853SAndroid Build Coastguard Worker     } /* End of loop over x */
3179*495ae853SAndroid Build Coastguard Worker } /* isvcd_vert_interpol_chroma_dyadic_2 */
3180*495ae853SAndroid Build Coastguard Worker 
3181*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3182*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3183*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_vert_interpol_chroma_dyadic_3                       */
3184*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3185*495ae853SAndroid Build Coastguard Worker /*  Description   : This function takes the reference array buffer & performs*/
3186*495ae853SAndroid Build Coastguard Worker /*                  vertical intra resampling for dyadic scaling ratios for  */
3187*495ae853SAndroid Build Coastguard Worker /*                    chroma for the following ref_lyr_chroma_phase_y_plus1  */
3188*495ae853SAndroid Build Coastguard Worker /*                    chroma_phase_y_plus1:                                  */
3189*495ae853SAndroid Build Coastguard Worker /*                        ref_lyr        cur_lyr                             */
3190*495ae853SAndroid Build Coastguard Worker /*                            2            0                                 */
3191*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pu1_inp_buf : ptr to the 6x6 reference sample buffer     */
3192*495ae853SAndroid Build Coastguard Worker /*                    pi2_tmp_filt_buf : ptr to the 6x8 buffer to hold the   */
3193*495ae853SAndroid Build Coastguard Worker /*                        vertically interpolated data                       */
3194*495ae853SAndroid Build Coastguard Worker /*                    i4_phase_0 : y phase for even values of y              */
3195*495ae853SAndroid Build Coastguard Worker /*                    i4_phase_1 : y phase for odd values of y               */
3196*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
3197*495ae853SAndroid Build Coastguard Worker /*  Processing    : it does the interpolation in vertical direction          */
3198*495ae853SAndroid Build Coastguard Worker /*  Outputs       : vertically resampled samples                             */
3199*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
3200*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3201*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
3202*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3203*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3204*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3205*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3206*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay           creation                             */
3207*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3208*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_vert_interpol_chroma_dyadic_3(UWORD8 * pu1_inp_buf,WORD16 * pi2_tmp_filt_buf,WORD32 i4_phase_0,WORD32 i4_phase_1)3209*495ae853SAndroid Build Coastguard Worker void isvcd_vert_interpol_chroma_dyadic_3(UWORD8 *pu1_inp_buf, WORD16 *pi2_tmp_filt_buf,
3210*495ae853SAndroid Build Coastguard Worker                                          WORD32 i4_phase_0, WORD32 i4_phase_1)
3211*495ae853SAndroid Build Coastguard Worker {
3212*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
3213*495ae853SAndroid Build Coastguard Worker     WORD32 i4_coeff_0, i4_coeff_1, i4_coeff_2, i4_coeff_3;
3214*495ae853SAndroid Build Coastguard Worker     WORD32 i4_samp_0, i4_samp_1;
3215*495ae853SAndroid Build Coastguard Worker     WORD32 i4_rslt_1, i4_rslt_2;
3216*495ae853SAndroid Build Coastguard Worker     WORD32 i4_filt_stride, i4_src_stride;
3217*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_inp;
3218*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_tmp;
3219*495ae853SAndroid Build Coastguard Worker 
3220*495ae853SAndroid Build Coastguard Worker     i4_coeff_0 = 8 - i4_phase_0;
3221*495ae853SAndroid Build Coastguard Worker     i4_coeff_1 = i4_phase_0;
3222*495ae853SAndroid Build Coastguard Worker     i4_coeff_2 = 8 - i4_phase_1;
3223*495ae853SAndroid Build Coastguard Worker     i4_coeff_3 = i4_phase_1;
3224*495ae853SAndroid Build Coastguard Worker 
3225*495ae853SAndroid Build Coastguard Worker     pi2_tmp = pi2_tmp_filt_buf;
3226*495ae853SAndroid Build Coastguard Worker     i4_filt_stride = 6;
3227*495ae853SAndroid Build Coastguard Worker     i4_src_stride = DYADIC_REF_W_C;
3228*495ae853SAndroid Build Coastguard Worker     pu1_inp = pu1_inp_buf;
3229*495ae853SAndroid Build Coastguard Worker 
3230*495ae853SAndroid Build Coastguard Worker     /* Vertical interpolation */
3231*495ae853SAndroid Build Coastguard Worker     for(i4_x = 0; i4_x < 6; i4_x++)
3232*495ae853SAndroid Build Coastguard Worker     {
3233*495ae853SAndroid Build Coastguard Worker         i4_samp_1 = pu1_inp[i4_x];
3234*495ae853SAndroid Build Coastguard Worker         pu1_inp += i4_src_stride;
3235*495ae853SAndroid Build Coastguard Worker 
3236*495ae853SAndroid Build Coastguard Worker         for(i4_y = 0; i4_y < 8; i4_y += 2)
3237*495ae853SAndroid Build Coastguard Worker         {
3238*495ae853SAndroid Build Coastguard Worker             i4_samp_0 = i4_samp_1;
3239*495ae853SAndroid Build Coastguard Worker             i4_samp_1 = pu1_inp[i4_x];
3240*495ae853SAndroid Build Coastguard Worker 
3241*495ae853SAndroid Build Coastguard Worker             /* y_phase is phase_1 for odd values of y */
3242*495ae853SAndroid Build Coastguard Worker             /* and phase_0 for even values of y          */
3243*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 = i4_samp_0 * i4_coeff_0;
3244*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += i4_samp_1 * i4_coeff_1;
3245*495ae853SAndroid Build Coastguard Worker 
3246*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 = i4_samp_0 * i4_coeff_2;
3247*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += i4_samp_1 * i4_coeff_3;
3248*495ae853SAndroid Build Coastguard Worker 
3249*495ae853SAndroid Build Coastguard Worker             /* Storing the results */
3250*495ae853SAndroid Build Coastguard Worker             pi2_tmp[i4_x] = i4_rslt_1;
3251*495ae853SAndroid Build Coastguard Worker             pi2_tmp += i4_filt_stride;
3252*495ae853SAndroid Build Coastguard Worker             pi2_tmp[i4_x] = i4_rslt_2;
3253*495ae853SAndroid Build Coastguard Worker 
3254*495ae853SAndroid Build Coastguard Worker             /* Incrementing the pointers */
3255*495ae853SAndroid Build Coastguard Worker             pi2_tmp += i4_filt_stride;
3256*495ae853SAndroid Build Coastguard Worker             pu1_inp += i4_src_stride;
3257*495ae853SAndroid Build Coastguard Worker 
3258*495ae853SAndroid Build Coastguard Worker         } /* End of loop over y */
3259*495ae853SAndroid Build Coastguard Worker 
3260*495ae853SAndroid Build Coastguard Worker         /* Reinitializing the ptrs */
3261*495ae853SAndroid Build Coastguard Worker         pu1_inp = pu1_inp_buf;
3262*495ae853SAndroid Build Coastguard Worker         pi2_tmp = pi2_tmp_filt_buf;
3263*495ae853SAndroid Build Coastguard Worker 
3264*495ae853SAndroid Build Coastguard Worker     } /* End of loop over x */
3265*495ae853SAndroid Build Coastguard Worker } /* isvcd_vert_interpol_chroma_dyadic_3 */
3266*495ae853SAndroid Build Coastguard Worker 
3267*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3268*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3269*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_horz_interpol_chroma_dyadic_1                       */
3270*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3271*495ae853SAndroid Build Coastguard Worker /*  Description   : This function takes the reference array buffer & performs*/
3272*495ae853SAndroid Build Coastguard Worker /*                  horizontal intra resampling for dyadic scaling ratios for*/
3273*495ae853SAndroid Build Coastguard Worker /*                    chroma with following ref_lyr_chroma_phase_x_plus1_flag*/
3274*495ae853SAndroid Build Coastguard Worker /*                    and chroma_phase_x_plus1_flag:                         */
3275*495ae853SAndroid Build Coastguard Worker /*                        ref_lyr        cur_lyr                             */
3276*495ae853SAndroid Build Coastguard Worker /*                            0            0                                 */
3277*495ae853SAndroid Build Coastguard Worker /*                            1            0                                 */
3278*495ae853SAndroid Build Coastguard Worker /*                            1            1                                 */
3279*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pi2_tmp_filt_buf : ptr to the 6x8 buffer containing the  */
3280*495ae853SAndroid Build Coastguard Worker /*                        vertically interpolated data                       */
3281*495ae853SAndroid Build Coastguard Worker /*                    pu1_out_buf : pointer to the output buffer             */
3282*495ae853SAndroid Build Coastguard Worker /*                    i4_out_stride : output buffer stride                   */
3283*495ae853SAndroid Build Coastguard Worker /*                    i4_phase_0 : x phase for even values of x              */
3284*495ae853SAndroid Build Coastguard Worker /*                    i4_phase_1 : x phase for odd values of x               */
3285*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
3286*495ae853SAndroid Build Coastguard Worker /*  Processing    : it does the interpolation in vertical direction          */
3287*495ae853SAndroid Build Coastguard Worker /*  Outputs       : resampled samples                                        */
3288*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
3289*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3290*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
3291*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3292*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3293*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3294*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3295*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay           creation                             */
3296*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3297*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_horz_interpol_chroma_dyadic_1(WORD16 * pi2_tmp_filt_buf,UWORD8 * pu1_out_buf,WORD32 i4_out_stride,WORD32 i4_phase_0,WORD32 i4_phase_1)3298*495ae853SAndroid Build Coastguard Worker void isvcd_horz_interpol_chroma_dyadic_1(WORD16 *pi2_tmp_filt_buf, UWORD8 *pu1_out_buf,
3299*495ae853SAndroid Build Coastguard Worker                                          WORD32 i4_out_stride, WORD32 i4_phase_0, WORD32 i4_phase_1)
3300*495ae853SAndroid Build Coastguard Worker {
3301*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
3302*495ae853SAndroid Build Coastguard Worker     WORD32 i4_coeff_0, i4_coeff_1, i4_coeff_2, i4_coeff_3;
3303*495ae853SAndroid Build Coastguard Worker     WORD32 i4_samp_0, i4_samp_1;
3304*495ae853SAndroid Build Coastguard Worker     WORD32 i4_rslt_1, i4_rslt_2;
3305*495ae853SAndroid Build Coastguard Worker     WORD32 i4_dst_stride;
3306*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_out;
3307*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_tmp;
3308*495ae853SAndroid Build Coastguard Worker 
3309*495ae853SAndroid Build Coastguard Worker     i4_coeff_0 = 8 - i4_phase_0;
3310*495ae853SAndroid Build Coastguard Worker     i4_coeff_1 = i4_phase_0;
3311*495ae853SAndroid Build Coastguard Worker     i4_coeff_2 = 8 - i4_phase_1;
3312*495ae853SAndroid Build Coastguard Worker     i4_coeff_3 = i4_phase_1;
3313*495ae853SAndroid Build Coastguard Worker 
3314*495ae853SAndroid Build Coastguard Worker     pu1_out = pu1_out_buf;
3315*495ae853SAndroid Build Coastguard Worker     pi2_tmp = pi2_tmp_filt_buf;
3316*495ae853SAndroid Build Coastguard Worker     i4_dst_stride = i4_out_stride;
3317*495ae853SAndroid Build Coastguard Worker 
3318*495ae853SAndroid Build Coastguard Worker     /* Horizontal interpolation */
3319*495ae853SAndroid Build Coastguard Worker     for(i4_y = 0; i4_y < 8; i4_y++)
3320*495ae853SAndroid Build Coastguard Worker     {
3321*495ae853SAndroid Build Coastguard Worker         /* x = 0, x_phase = phase_0 */
3322*495ae853SAndroid Build Coastguard Worker         i4_samp_0 = *pi2_tmp++;
3323*495ae853SAndroid Build Coastguard Worker         i4_samp_1 = *pi2_tmp++;
3324*495ae853SAndroid Build Coastguard Worker 
3325*495ae853SAndroid Build Coastguard Worker         /* since x_phase = phase_0 for x = 0 */
3326*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 = i4_samp_0 * i4_coeff_0;
3327*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_1 * i4_coeff_1;
3328*495ae853SAndroid Build Coastguard Worker 
3329*495ae853SAndroid Build Coastguard Worker         /* Round to 8-bit value */
3330*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += 32;
3331*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 >>= 6;
3332*495ae853SAndroid Build Coastguard Worker 
3333*495ae853SAndroid Build Coastguard Worker         /* Store the output */
3334*495ae853SAndroid Build Coastguard Worker         pu1_out[0] = i4_rslt_1;
3335*495ae853SAndroid Build Coastguard Worker 
3336*495ae853SAndroid Build Coastguard Worker         for(i4_x = 1; i4_x < 7; i4_x += 2)
3337*495ae853SAndroid Build Coastguard Worker         {
3338*495ae853SAndroid Build Coastguard Worker             i4_samp_0 = i4_samp_1;
3339*495ae853SAndroid Build Coastguard Worker             i4_samp_1 = *pi2_tmp++;
3340*495ae853SAndroid Build Coastguard Worker 
3341*495ae853SAndroid Build Coastguard Worker             /* x_phase is phase_1 for odd values of x and phase_0 for even values of x */
3342*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 = i4_samp_0 * i4_coeff_2;
3343*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += i4_samp_1 * i4_coeff_3;
3344*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 = i4_samp_0 * i4_coeff_0;
3345*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += i4_samp_1 * i4_coeff_1;
3346*495ae853SAndroid Build Coastguard Worker 
3347*495ae853SAndroid Build Coastguard Worker             /* Rounding to 8-bit values */
3348*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += 32;
3349*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 >>= 6;
3350*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += 32;
3351*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 >>= 6;
3352*495ae853SAndroid Build Coastguard Worker 
3353*495ae853SAndroid Build Coastguard Worker             /* Storing the results */
3354*495ae853SAndroid Build Coastguard Worker             pu1_out[2 * i4_x] = i4_rslt_1;
3355*495ae853SAndroid Build Coastguard Worker             pu1_out[2 * (i4_x + 1)] = i4_rslt_2;
3356*495ae853SAndroid Build Coastguard Worker 
3357*495ae853SAndroid Build Coastguard Worker         } /* End of loop over y */
3358*495ae853SAndroid Build Coastguard Worker 
3359*495ae853SAndroid Build Coastguard Worker         /* y = 7, y_phase = phase_1 */
3360*495ae853SAndroid Build Coastguard Worker         i4_samp_0 = i4_samp_1;
3361*495ae853SAndroid Build Coastguard Worker         i4_samp_1 = *pi2_tmp++;
3362*495ae853SAndroid Build Coastguard Worker 
3363*495ae853SAndroid Build Coastguard Worker         /* since x_phase = phase_1 for x = 7 */
3364*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 = i4_samp_0 * i4_coeff_2;
3365*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += i4_samp_1 * i4_coeff_3;
3366*495ae853SAndroid Build Coastguard Worker 
3367*495ae853SAndroid Build Coastguard Worker         /* Round to 8-bit value */
3368*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 += 32;
3369*495ae853SAndroid Build Coastguard Worker         i4_rslt_1 >>= 6;
3370*495ae853SAndroid Build Coastguard Worker 
3371*495ae853SAndroid Build Coastguard Worker         /* Store the output */
3372*495ae853SAndroid Build Coastguard Worker         pu1_out[2 * 7] = i4_rslt_1;
3373*495ae853SAndroid Build Coastguard Worker 
3374*495ae853SAndroid Build Coastguard Worker         /* Incrementing the output ptr */
3375*495ae853SAndroid Build Coastguard Worker         pu1_out += i4_dst_stride;
3376*495ae853SAndroid Build Coastguard Worker 
3377*495ae853SAndroid Build Coastguard Worker     } /* End of loop over x */
3378*495ae853SAndroid Build Coastguard Worker } /* isvcd_horz_interpol_chroma_dyadic_1 */
3379*495ae853SAndroid Build Coastguard Worker 
3380*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3381*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3382*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_horz_interpol_chroma_dyadic_2                       */
3383*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3384*495ae853SAndroid Build Coastguard Worker /*  Description   : This function takes the reference array buffer & performs*/
3385*495ae853SAndroid Build Coastguard Worker /*                  horizontal intra resampling for dyadic scaling ratios for*/
3386*495ae853SAndroid Build Coastguard Worker /*                    chroma with following ref_lyr_chroma_phase_x_plus1_flag*/
3387*495ae853SAndroid Build Coastguard Worker /*                    and chroma_phase_x_plus1_flag:                         */
3388*495ae853SAndroid Build Coastguard Worker /*                        ref_lyr        cur_lyr                             */
3389*495ae853SAndroid Build Coastguard Worker /*                            0            1                                 */
3390*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pi2_tmp_filt_buf : ptr to the 6x8 buffer containing the  */
3391*495ae853SAndroid Build Coastguard Worker /*                        vertically interpolated data                       */
3392*495ae853SAndroid Build Coastguard Worker /*                    pu1_out_buf : pointer to the output buffer             */
3393*495ae853SAndroid Build Coastguard Worker /*                    i4_out_stride : output buffer stride                   */
3394*495ae853SAndroid Build Coastguard Worker /*                    i4_phase_0 : x phase for even values of x              */
3395*495ae853SAndroid Build Coastguard Worker /*                    i4_phase_1 : x phase for odd values of x               */
3396*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
3397*495ae853SAndroid Build Coastguard Worker /*  Processing    : it does the interpolation in vertical direction          */
3398*495ae853SAndroid Build Coastguard Worker /*  Outputs       : resampled samples                                        */
3399*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
3400*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3401*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
3402*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3403*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3404*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3405*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3406*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay           creation                             */
3407*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3408*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_horz_interpol_chroma_dyadic_2(WORD16 * pi2_tmp_filt_buf,UWORD8 * pu1_out_buf,WORD32 i4_out_stride,WORD32 i4_phase_0,WORD32 i4_phase_1)3409*495ae853SAndroid Build Coastguard Worker void isvcd_horz_interpol_chroma_dyadic_2(WORD16 *pi2_tmp_filt_buf, UWORD8 *pu1_out_buf,
3410*495ae853SAndroid Build Coastguard Worker                                          WORD32 i4_out_stride, WORD32 i4_phase_0, WORD32 i4_phase_1)
3411*495ae853SAndroid Build Coastguard Worker {
3412*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
3413*495ae853SAndroid Build Coastguard Worker     WORD32 i4_coeff_0, i4_coeff_1, i4_coeff_2, i4_coeff_3;
3414*495ae853SAndroid Build Coastguard Worker     WORD32 i4_samp_0, i4_samp_1;
3415*495ae853SAndroid Build Coastguard Worker     WORD32 i4_rslt_1, i4_rslt_2;
3416*495ae853SAndroid Build Coastguard Worker     WORD32 i4_dst_stride;
3417*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_out;
3418*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_tmp;
3419*495ae853SAndroid Build Coastguard Worker 
3420*495ae853SAndroid Build Coastguard Worker     i4_coeff_0 = 8 - i4_phase_0;
3421*495ae853SAndroid Build Coastguard Worker     i4_coeff_1 = i4_phase_0;
3422*495ae853SAndroid Build Coastguard Worker     i4_coeff_2 = 8 - i4_phase_1;
3423*495ae853SAndroid Build Coastguard Worker     i4_coeff_3 = i4_phase_1;
3424*495ae853SAndroid Build Coastguard Worker 
3425*495ae853SAndroid Build Coastguard Worker     pu1_out = pu1_out_buf;
3426*495ae853SAndroid Build Coastguard Worker     pi2_tmp = pi2_tmp_filt_buf + 1;
3427*495ae853SAndroid Build Coastguard Worker     i4_dst_stride = i4_out_stride;
3428*495ae853SAndroid Build Coastguard Worker 
3429*495ae853SAndroid Build Coastguard Worker     /* Horizontal interpolation */
3430*495ae853SAndroid Build Coastguard Worker     for(i4_y = 0; i4_y < 8; i4_y++)
3431*495ae853SAndroid Build Coastguard Worker     {
3432*495ae853SAndroid Build Coastguard Worker         /* x = 0, x_phase = phase_0 */
3433*495ae853SAndroid Build Coastguard Worker         i4_samp_1 = *pi2_tmp++;
3434*495ae853SAndroid Build Coastguard Worker 
3435*495ae853SAndroid Build Coastguard Worker         for(i4_x = 0; i4_x < 8; i4_x += 2)
3436*495ae853SAndroid Build Coastguard Worker         {
3437*495ae853SAndroid Build Coastguard Worker             i4_samp_0 = i4_samp_1;
3438*495ae853SAndroid Build Coastguard Worker             i4_samp_1 = *pi2_tmp++;
3439*495ae853SAndroid Build Coastguard Worker 
3440*495ae853SAndroid Build Coastguard Worker             /* x_phase is phase_1 for odd values of x */
3441*495ae853SAndroid Build Coastguard Worker             /* and phase_0 for even values of x          */
3442*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 = i4_samp_0 * i4_coeff_0;
3443*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += i4_samp_1 * i4_coeff_1;
3444*495ae853SAndroid Build Coastguard Worker 
3445*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 = i4_samp_0 * i4_coeff_2;
3446*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += i4_samp_1 * i4_coeff_3;
3447*495ae853SAndroid Build Coastguard Worker 
3448*495ae853SAndroid Build Coastguard Worker             /* Rounding to 8-bit values */
3449*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 += 32;
3450*495ae853SAndroid Build Coastguard Worker             i4_rslt_1 >>= 6;
3451*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 += 32;
3452*495ae853SAndroid Build Coastguard Worker             i4_rslt_2 >>= 6;
3453*495ae853SAndroid Build Coastguard Worker 
3454*495ae853SAndroid Build Coastguard Worker             /* Storing the results */
3455*495ae853SAndroid Build Coastguard Worker             pu1_out[2 * i4_x] = i4_rslt_1;
3456*495ae853SAndroid Build Coastguard Worker             pu1_out[2 * (i4_x + 1)] = i4_rslt_2;
3457*495ae853SAndroid Build Coastguard Worker 
3458*495ae853SAndroid Build Coastguard Worker         } /* End of loop over x */
3459*495ae853SAndroid Build Coastguard Worker 
3460*495ae853SAndroid Build Coastguard Worker         /* Incrementing the ptrs */
3461*495ae853SAndroid Build Coastguard Worker         pi2_tmp += 1;
3462*495ae853SAndroid Build Coastguard Worker         pu1_out += i4_dst_stride;
3463*495ae853SAndroid Build Coastguard Worker 
3464*495ae853SAndroid Build Coastguard Worker     } /* End of loop over y */
3465*495ae853SAndroid Build Coastguard Worker } /* isvcd_horz_interpol_chroma_dyadic_2 */
3466*495ae853SAndroid Build Coastguard Worker 
3467*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3468*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3469*495ae853SAndroid Build Coastguard Worker /*  Function Name :  isvcd_intra_resamp_mb_dyadic                               */
3470*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3471*495ae853SAndroid Build Coastguard Worker /*  Description   : MB level function which performs the intra resampling    */
3472*495ae853SAndroid Build Coastguard Worker /*                  of data of an MB (luma and chroma inclusive) for dyadic  */
3473*495ae853SAndroid Build Coastguard Worker /*                    scaling ratios                                         */
3474*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3475*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_intra_samp_ctxt : intra sampling context              */
3476*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_luma : reference layer luma data buffer desc      */
3477*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_chroma : reference layer chroma data buffer desc  */
3478*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_mb_mode_map : ref layer mb mode map buff desc     */
3479*495ae853SAndroid Build Coastguard Worker /*                  ps_curr_luma : current layer out luma buffer desc        */
3480*495ae853SAndroid Build Coastguard Worker /*                  ps_curr_chroma : current layer out chroma buffer desc    */
3481*495ae853SAndroid Build Coastguard Worker /*                  x,y : current mb coorinate                               */
3482*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
3483*495ae853SAndroid Build Coastguard Worker /*  Processing    : it calls the reference layer construction followed by    */
3484*495ae853SAndroid Build Coastguard Worker /*                   interpolation function for luma and cb and cr           */
3485*495ae853SAndroid Build Coastguard Worker /*  Outputs       : inter resampled data of current MB                       */
3486*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
3487*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3488*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
3489*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3490*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3491*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3492*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3493*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay           creation                             */
3494*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3495*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_intra_resamp_mb_dyadic(void * pv_intra_samp_ctxt,mem_element_t * ps_ref_luma,mem_element_t * ps_ref_chroma,mem_element_t * ps_ref_mb_mode_map,mem_element_t * ps_curr_luma,mem_element_t * ps_curr_chroma,mb_coord_t * ps_mb_coord,void * pv_svc_dec)3496*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_intra_resamp_mb_dyadic(void *pv_intra_samp_ctxt, mem_element_t *ps_ref_luma,
3497*495ae853SAndroid Build Coastguard Worker                                     mem_element_t *ps_ref_chroma, mem_element_t *ps_ref_mb_mode_map,
3498*495ae853SAndroid Build Coastguard Worker                                     mem_element_t *ps_curr_luma, mem_element_t *ps_curr_chroma,
3499*495ae853SAndroid Build Coastguard Worker                                     mb_coord_t *ps_mb_coord, void *pv_svc_dec)
3500*495ae853SAndroid Build Coastguard Worker {
3501*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3502*495ae853SAndroid Build Coastguard Worker     /* I/O buffer params                                                     */
3503*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3504*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_inp_luma, *pu1_inp_chroma;
3505*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_out_luma, *pu1_out_chroma;
3506*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_out_cb, *pu1_out_cr;
3507*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_refarray_luma, *pu1_refarray_cb, *pu1_refarray_cr;
3508*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_tmp_filt_buf;
3509*495ae853SAndroid Build Coastguard Worker     WORD32 i4_inp_luma_stride, i4_inp_chroma_stride;
3510*495ae853SAndroid Build Coastguard Worker     WORD32 i4_out_luma_stride, i4_out_chroma_stride;
3511*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_mb_x_ref, u2_mb_y_ref;
3512*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) pv_svc_dec;
3513*495ae853SAndroid Build Coastguard Worker     dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
3514*495ae853SAndroid Build Coastguard Worker 
3515*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3516*495ae853SAndroid Build Coastguard Worker     /* Intra resampling ctxt pointers                                         */
3517*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3518*495ae853SAndroid Build Coastguard Worker     intra_sampling_ctxt_t *ps_ctxt;
3519*495ae853SAndroid Build Coastguard Worker     intra_samp_lyr_ctxt *ps_lyr_ctxt;
3520*495ae853SAndroid Build Coastguard Worker 
3521*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3522*495ae853SAndroid Build Coastguard Worker     /* reference and current layer MB coordinates                             */
3523*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3524*495ae853SAndroid Build Coastguard Worker     WORD32 i4_scaled_mb_x, i4_scaled_mb_y;
3525*495ae853SAndroid Build Coastguard Worker     WORD32 i4_top, i4_left;
3526*495ae853SAndroid Build Coastguard Worker     WORD32 ret;
3527*495ae853SAndroid Build Coastguard Worker 
3528*495ae853SAndroid Build Coastguard Worker     ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
3529*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3530*495ae853SAndroid Build Coastguard Worker     /* Pointer derivation                                                     */
3531*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3532*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (intra_sampling_ctxt_t *) pv_intra_samp_ctxt;
3533*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
3534*495ae853SAndroid Build Coastguard Worker 
3535*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3536*495ae853SAndroid Build Coastguard Worker     /* MB coordinate derivation                                                 */
3537*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3538*495ae853SAndroid Build Coastguard Worker     i4_scaled_mb_x =
3539*495ae853SAndroid Build Coastguard Worker         ps_mb_coord->u2_mb_x - (ps_svc_slice_params->i4_scaled_ref_layer_left_offset >> 4);
3540*495ae853SAndroid Build Coastguard Worker     i4_scaled_mb_y =
3541*495ae853SAndroid Build Coastguard Worker         ps_mb_coord->u2_mb_y - (ps_svc_slice_params->i4_scaled_ref_layer_top_offset >> 4);
3542*495ae853SAndroid Build Coastguard Worker 
3543*495ae853SAndroid Build Coastguard Worker     if(i4_scaled_mb_x & 0x1)
3544*495ae853SAndroid Build Coastguard Worker     {
3545*495ae853SAndroid Build Coastguard Worker         i4_left = 1;
3546*495ae853SAndroid Build Coastguard Worker     }
3547*495ae853SAndroid Build Coastguard Worker     else
3548*495ae853SAndroid Build Coastguard Worker     {
3549*495ae853SAndroid Build Coastguard Worker         i4_left = -1;
3550*495ae853SAndroid Build Coastguard Worker     }
3551*495ae853SAndroid Build Coastguard Worker     if(i4_scaled_mb_y & 0x1)
3552*495ae853SAndroid Build Coastguard Worker     {
3553*495ae853SAndroid Build Coastguard Worker         i4_top = 1;
3554*495ae853SAndroid Build Coastguard Worker     }
3555*495ae853SAndroid Build Coastguard Worker     else
3556*495ae853SAndroid Build Coastguard Worker     {
3557*495ae853SAndroid Build Coastguard Worker         i4_top = -1;
3558*495ae853SAndroid Build Coastguard Worker     }
3559*495ae853SAndroid Build Coastguard Worker 
3560*495ae853SAndroid Build Coastguard Worker     u2_mb_x_ref = (i4_scaled_mb_x >> 1);
3561*495ae853SAndroid Build Coastguard Worker     u2_mb_y_ref = (i4_scaled_mb_y >> 1);
3562*495ae853SAndroid Build Coastguard Worker 
3563*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3564*495ae853SAndroid Build Coastguard Worker     /* Reference Array Consrtuction - luma and chroma                         */
3565*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3566*495ae853SAndroid Build Coastguard Worker     pu1_inp_luma = (UWORD8 *) ps_ref_luma->pv_buffer;
3567*495ae853SAndroid Build Coastguard Worker     pu1_inp_chroma = (UWORD8 *) ps_ref_chroma->pv_buffer;
3568*495ae853SAndroid Build Coastguard Worker     i4_inp_luma_stride = ps_ref_luma->i4_num_element_stride;
3569*495ae853SAndroid Build Coastguard Worker     i4_inp_chroma_stride = ps_ref_chroma->i4_num_element_stride;
3570*495ae853SAndroid Build Coastguard Worker 
3571*495ae853SAndroid Build Coastguard Worker     /* ------- Constructing refSampleArray ----------------------- */
3572*495ae853SAndroid Build Coastguard Worker     ret = isvcd_reflayer_construction_dyadic(
3573*495ae853SAndroid Build Coastguard Worker         pv_intra_samp_ctxt, ps_ref_mb_mode_map, pu1_inp_luma, pu1_inp_chroma, i4_inp_luma_stride,
3574*495ae853SAndroid Build Coastguard Worker         i4_inp_chroma_stride, i4_top, i4_left, u2_mb_x_ref, u2_mb_y_ref);
3575*495ae853SAndroid Build Coastguard Worker 
3576*495ae853SAndroid Build Coastguard Worker     if(ret != OK)
3577*495ae853SAndroid Build Coastguard Worker     {
3578*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
3579*495ae853SAndroid Build Coastguard Worker     }
3580*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3581*495ae853SAndroid Build Coastguard Worker     /* LUMA INTERPOLATION                                                       */
3582*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3583*495ae853SAndroid Build Coastguard Worker     pu1_refarray_luma = ps_ctxt->pu1_refarray_buffer;
3584*495ae853SAndroid Build Coastguard Worker     if(1 == i4_top)
3585*495ae853SAndroid Build Coastguard Worker     {
3586*495ae853SAndroid Build Coastguard Worker         pu1_refarray_luma += (DYADIC_REF_W_Y << 3);
3587*495ae853SAndroid Build Coastguard Worker     }
3588*495ae853SAndroid Build Coastguard Worker     if(1 == i4_left)
3589*495ae853SAndroid Build Coastguard Worker     {
3590*495ae853SAndroid Build Coastguard Worker         pu1_refarray_luma += 8;
3591*495ae853SAndroid Build Coastguard Worker     }
3592*495ae853SAndroid Build Coastguard Worker     pu1_out_luma = (UWORD8 *) ps_curr_luma->pv_buffer;
3593*495ae853SAndroid Build Coastguard Worker     i4_out_luma_stride = ps_curr_luma->i4_num_element_stride;
3594*495ae853SAndroid Build Coastguard Worker     pi2_tmp_filt_buf = (WORD16 *) ps_ctxt->pi4_temp_interpolation_buffer;
3595*495ae853SAndroid Build Coastguard Worker 
3596*495ae853SAndroid Build Coastguard Worker     ps_ctxt->pf_interpolate_base_luma_dyadic(pu1_refarray_luma, pi2_tmp_filt_buf, pu1_out_luma,
3597*495ae853SAndroid Build Coastguard Worker                                              i4_out_luma_stride);
3598*495ae853SAndroid Build Coastguard Worker 
3599*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3600*495ae853SAndroid Build Coastguard Worker     /* CHROMA INTERPOLATION                                                     */
3601*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3602*495ae853SAndroid Build Coastguard Worker     pu1_out_chroma = (UWORD8 *) ps_curr_chroma->pv_buffer;
3603*495ae853SAndroid Build Coastguard Worker     i4_out_chroma_stride = ps_curr_chroma->i4_num_element_stride;
3604*495ae853SAndroid Build Coastguard Worker 
3605*495ae853SAndroid Build Coastguard Worker     /* CB */
3606*495ae853SAndroid Build Coastguard Worker     pu1_out_cb = pu1_out_chroma;
3607*495ae853SAndroid Build Coastguard Worker     pu1_refarray_cb = ps_ctxt->pu1_refarray_cb;
3608*495ae853SAndroid Build Coastguard Worker 
3609*495ae853SAndroid Build Coastguard Worker     if(1 == i4_top)
3610*495ae853SAndroid Build Coastguard Worker     {
3611*495ae853SAndroid Build Coastguard Worker         pu1_refarray_cb += (DYADIC_REF_W_C << 2);
3612*495ae853SAndroid Build Coastguard Worker     }
3613*495ae853SAndroid Build Coastguard Worker     if(1 == i4_left)
3614*495ae853SAndroid Build Coastguard Worker     {
3615*495ae853SAndroid Build Coastguard Worker         pu1_refarray_cb += 4;
3616*495ae853SAndroid Build Coastguard Worker     }
3617*495ae853SAndroid Build Coastguard Worker 
3618*495ae853SAndroid Build Coastguard Worker     /* Vertical interpolation */
3619*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->pf_vert_chroma_interpol(pu1_refarray_cb, pi2_tmp_filt_buf,
3620*495ae853SAndroid Build Coastguard Worker                                          ps_lyr_ctxt->i4_y_phase_0, ps_lyr_ctxt->i4_y_phase_1);
3621*495ae853SAndroid Build Coastguard Worker 
3622*495ae853SAndroid Build Coastguard Worker     /* Horizontal interpolation */
3623*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->pf_horz_chroma_interpol(pi2_tmp_filt_buf, pu1_out_cb, i4_out_chroma_stride,
3624*495ae853SAndroid Build Coastguard Worker                                          ps_lyr_ctxt->i4_x_phase_0, ps_lyr_ctxt->i4_x_phase_1);
3625*495ae853SAndroid Build Coastguard Worker 
3626*495ae853SAndroid Build Coastguard Worker     /* CR */
3627*495ae853SAndroid Build Coastguard Worker     pu1_out_cr = pu1_out_chroma + 1;
3628*495ae853SAndroid Build Coastguard Worker     pu1_refarray_cr = ps_ctxt->pu1_refarray_cr;
3629*495ae853SAndroid Build Coastguard Worker 
3630*495ae853SAndroid Build Coastguard Worker     if(1 == i4_top)
3631*495ae853SAndroid Build Coastguard Worker     {
3632*495ae853SAndroid Build Coastguard Worker         pu1_refarray_cr += (DYADIC_REF_W_C << 2);
3633*495ae853SAndroid Build Coastguard Worker     }
3634*495ae853SAndroid Build Coastguard Worker     if(1 == i4_left)
3635*495ae853SAndroid Build Coastguard Worker     {
3636*495ae853SAndroid Build Coastguard Worker         pu1_refarray_cr += 4;
3637*495ae853SAndroid Build Coastguard Worker     }
3638*495ae853SAndroid Build Coastguard Worker 
3639*495ae853SAndroid Build Coastguard Worker     /* Vertical interpolation */
3640*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->pf_vert_chroma_interpol(pu1_refarray_cr, pi2_tmp_filt_buf,
3641*495ae853SAndroid Build Coastguard Worker                                          ps_lyr_ctxt->i4_y_phase_0, ps_lyr_ctxt->i4_y_phase_1);
3642*495ae853SAndroid Build Coastguard Worker 
3643*495ae853SAndroid Build Coastguard Worker     /* Horizontal interpolation */
3644*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->pf_horz_chroma_interpol(pi2_tmp_filt_buf, pu1_out_cr, i4_out_chroma_stride,
3645*495ae853SAndroid Build Coastguard Worker                                          ps_lyr_ctxt->i4_x_phase_0, ps_lyr_ctxt->i4_x_phase_1);
3646*495ae853SAndroid Build Coastguard Worker     return OK;
3647*495ae853SAndroid Build Coastguard Worker }
3648*495ae853SAndroid Build Coastguard Worker 
3649*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3650*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3651*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_interpolate_intra_base                              */
3652*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3653*495ae853SAndroid Build Coastguard Worker /*  Description   : This function takes the reference array buffer & performs*/
3654*495ae853SAndroid Build Coastguard Worker /*                    interpolation of a component to find the intra         */
3655*495ae853SAndroid Build Coastguard Worker /*                     resampled value                                       */
3656*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_intra_samp_ctxt : intra sampling context              */
3657*495ae853SAndroid Build Coastguard Worker /*                  pu1_out : output buffer pointer                          */
3658*495ae853SAndroid Build Coastguard Worker /*                  i4_out_stride : output buffer stride                     */
3659*495ae853SAndroid Build Coastguard Worker /*                  i4_refarray_wd : reference array width                   */
3660*495ae853SAndroid Build Coastguard Worker /*                  i4_x_offset : offset in reference layer in horz direction*/
3661*495ae853SAndroid Build Coastguard Worker /*                  ps_coord : current mb co-ordinate                        */
3662*495ae853SAndroid Build Coastguard Worker /*                  i4_chroma_flag : chroma processing flag                  */
3663*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
3664*495ae853SAndroid Build Coastguard Worker /*  Processing    : it does the interpolation in vertical direction followed */
3665*495ae853SAndroid Build Coastguard Worker /*                  by horizontal direction                                  */
3666*495ae853SAndroid Build Coastguard Worker /*  Outputs       : resampled pixels                                         */
3667*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
3668*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3669*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
3670*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3671*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3672*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3673*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3674*495ae853SAndroid Build Coastguard Worker /*         26 09 2021   vijayakumar          creation                        */
3675*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3676*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_interpolate_intra_base(void * pv_intra_samp_ctxt,UWORD8 * pu1_out,WORD32 i4_out_stride,WORD32 i4_refarray_wd,WORD32 i4_mb_x,WORD32 i4_mb_y,WORD32 i4_chroma_flag,WORD32 i4_refarray_flag)3677*495ae853SAndroid Build Coastguard Worker void isvcd_interpolate_intra_base(void *pv_intra_samp_ctxt, UWORD8 *pu1_out, WORD32 i4_out_stride,
3678*495ae853SAndroid Build Coastguard Worker                                   WORD32 i4_refarray_wd, WORD32 i4_mb_x, WORD32 i4_mb_y,
3679*495ae853SAndroid Build Coastguard Worker                                   WORD32 i4_chroma_flag, WORD32 i4_refarray_flag)
3680*495ae853SAndroid Build Coastguard Worker {
3681*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3682*495ae853SAndroid Build Coastguard Worker     /* Index Parameters                                                         */
3683*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3684*495ae853SAndroid Build Coastguard Worker     intra_sampling_ctxt_t *ps_ctxt;
3685*495ae853SAndroid Build Coastguard Worker     intra_samp_map_ctxt_t *ps_map_ctxt;
3686*495ae853SAndroid Build Coastguard Worker     intra_samp_lyr_ctxt *ps_lyr_ctxt;
3687*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x, i4_y;
3688*495ae853SAndroid Build Coastguard Worker     WORD32 i4_frm_mb_x, i4_frm_mb_y;
3689*495ae853SAndroid Build Coastguard Worker     ref_pixel_map_t *ps_x_pos_phase;
3690*495ae853SAndroid Build Coastguard Worker     ref_pixel_map_t *ps_y_pos_phase;
3691*495ae853SAndroid Build Coastguard Worker 
3692*495ae853SAndroid Build Coastguard Worker     WORD32 i4_temp_array_ht;
3693*495ae853SAndroid Build Coastguard Worker     WORD32 *pi4_interp_buff;
3694*495ae853SAndroid Build Coastguard Worker     WORD32 *pi4_interp_buff_temp;
3695*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_wd;
3696*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_ht;
3697*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x_min, i4_x_max;
3698*495ae853SAndroid Build Coastguard Worker     ref_min_max_map_t *ps_x_min_max;
3699*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_refarray = NULL;
3700*495ae853SAndroid Build Coastguard Worker 
3701*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3702*495ae853SAndroid Build Coastguard Worker     /* Extracting pointers from the  context                                  */
3703*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3704*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (intra_sampling_ctxt_t *) pv_intra_samp_ctxt;
3705*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
3706*495ae853SAndroid Build Coastguard Worker 
3707*495ae853SAndroid Build Coastguard Worker     if(0 == i4_refarray_flag)
3708*495ae853SAndroid Build Coastguard Worker     {
3709*495ae853SAndroid Build Coastguard Worker         pu1_refarray = ps_ctxt->pu1_refarray_buffer;
3710*495ae853SAndroid Build Coastguard Worker     }
3711*495ae853SAndroid Build Coastguard Worker     else if(1 == i4_refarray_flag)
3712*495ae853SAndroid Build Coastguard Worker     {
3713*495ae853SAndroid Build Coastguard Worker         pu1_refarray = ps_ctxt->pu1_refarray_cb;
3714*495ae853SAndroid Build Coastguard Worker     }
3715*495ae853SAndroid Build Coastguard Worker 
3716*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3717*495ae853SAndroid Build Coastguard Worker     /* LUMA    or CHROMA */
3718*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3719*495ae853SAndroid Build Coastguard Worker     if(1 == i4_chroma_flag)
3720*495ae853SAndroid Build Coastguard Worker         ps_map_ctxt = &(ps_lyr_ctxt->s_chroma_map_ctxt);
3721*495ae853SAndroid Build Coastguard Worker     else
3722*495ae853SAndroid Build Coastguard Worker         ps_map_ctxt = &(ps_lyr_ctxt->s_luma_map_ctxt);
3723*495ae853SAndroid Build Coastguard Worker 
3724*495ae853SAndroid Build Coastguard Worker     i4_mb_wd = MB_WIDTH >> i4_chroma_flag;
3725*495ae853SAndroid Build Coastguard Worker     i4_mb_ht = MB_HEIGHT >> i4_chroma_flag;
3726*495ae853SAndroid Build Coastguard Worker     ps_x_min_max = ps_map_ctxt->ps_x_min_max;
3727*495ae853SAndroid Build Coastguard Worker     i4_frm_mb_y = i4_mb_y * i4_mb_ht;
3728*495ae853SAndroid Build Coastguard Worker     i4_frm_mb_x = i4_mb_x * i4_mb_wd;
3729*495ae853SAndroid Build Coastguard Worker 
3730*495ae853SAndroid Build Coastguard Worker     /* get the min and max positions */
3731*495ae853SAndroid Build Coastguard Worker     i4_x_min = ps_x_min_max[i4_mb_x].i2_min_pos;
3732*495ae853SAndroid Build Coastguard Worker     i4_x_max = ps_x_min_max[i4_mb_x].i2_max_pos;
3733*495ae853SAndroid Build Coastguard Worker 
3734*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3735*495ae853SAndroid Build Coastguard Worker     /* Projected frame level pointers                                        */
3736*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3737*495ae853SAndroid Build Coastguard Worker     ps_x_pos_phase = ps_map_ctxt->ps_x_pos_phase;
3738*495ae853SAndroid Build Coastguard Worker     ps_y_pos_phase = ps_map_ctxt->ps_y_pos_phase;
3739*495ae853SAndroid Build Coastguard Worker 
3740*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3741*495ae853SAndroid Build Coastguard Worker     /* Pointers and Dimenstion of the temporary buffer                         */
3742*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3743*495ae853SAndroid Build Coastguard Worker     i4_temp_array_ht = i4_mb_ht;
3744*495ae853SAndroid Build Coastguard Worker     pi4_interp_buff = ps_ctxt->pi4_temp_interpolation_buffer;
3745*495ae853SAndroid Build Coastguard Worker     pi4_interp_buff_temp = pi4_interp_buff;
3746*495ae853SAndroid Build Coastguard Worker 
3747*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3748*495ae853SAndroid Build Coastguard Worker     /* Loop for interpolation in vertical direction                             */
3749*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3750*495ae853SAndroid Build Coastguard Worker     for(i4_y = 0; i4_y < (i4_temp_array_ht); i4_y++)
3751*495ae853SAndroid Build Coastguard Worker     {
3752*495ae853SAndroid Build Coastguard Worker         for(i4_x = (i4_x_min - 1); i4_x <= (i4_x_max + 2); i4_x++)
3753*495ae853SAndroid Build Coastguard Worker         {
3754*495ae853SAndroid Build Coastguard Worker             UWORD8 *pu1_refarray_temp;
3755*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_ref;
3756*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_phase;
3757*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------ */
3758*495ae853SAndroid Build Coastguard Worker             /* Finding the offset                                            */
3759*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------ */
3760*495ae853SAndroid Build Coastguard Worker             i4_y_ref = ps_y_pos_phase[i4_y + i4_frm_mb_y].i2_ref_pos;
3761*495ae853SAndroid Build Coastguard Worker             i4_y_phase = ps_y_pos_phase[i4_y + i4_frm_mb_y].i2_phase;
3762*495ae853SAndroid Build Coastguard Worker             pu1_refarray_temp = pu1_refarray + i4_x + (i4_y_ref * i4_refarray_wd);
3763*495ae853SAndroid Build Coastguard Worker 
3764*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------ */
3765*495ae853SAndroid Build Coastguard Worker             /* Check for Luma/Chroma Processing                                */
3766*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------ */
3767*495ae853SAndroid Build Coastguard Worker             if(0 == i4_chroma_flag)
3768*495ae853SAndroid Build Coastguard Worker             {
3769*495ae853SAndroid Build Coastguard Worker                 *(pi4_interp_buff + i4_x) =
3770*495ae853SAndroid Build Coastguard Worker                     (g_ai1_interp_filter_luma[i4_y_phase]) *
3771*495ae853SAndroid Build Coastguard Worker                         (*(pu1_refarray_temp - i4_refarray_wd)) +
3772*495ae853SAndroid Build Coastguard Worker 
3773*495ae853SAndroid Build Coastguard Worker                     (g_ai1_interp_filter_luma[16 + i4_y_phase]) * (*(pu1_refarray_temp)) +
3774*495ae853SAndroid Build Coastguard Worker 
3775*495ae853SAndroid Build Coastguard Worker                     (g_ai1_interp_filter_luma[32 + i4_y_phase]) *
3776*495ae853SAndroid Build Coastguard Worker                         (*(pu1_refarray_temp + i4_refarray_wd)) +
3777*495ae853SAndroid Build Coastguard Worker 
3778*495ae853SAndroid Build Coastguard Worker                     (g_ai1_interp_filter_luma[48 + i4_y_phase]) *
3779*495ae853SAndroid Build Coastguard Worker                         (*(pu1_refarray_temp + (2 * i4_refarray_wd)));
3780*495ae853SAndroid Build Coastguard Worker             }
3781*495ae853SAndroid Build Coastguard Worker             else
3782*495ae853SAndroid Build Coastguard Worker             {
3783*495ae853SAndroid Build Coastguard Worker                 *(pi4_interp_buff + i4_x) =
3784*495ae853SAndroid Build Coastguard Worker                     (g_au1_interp_filter_chroma[i4_y_phase]) * (*(pu1_refarray_temp)) +
3785*495ae853SAndroid Build Coastguard Worker 
3786*495ae853SAndroid Build Coastguard Worker                     (g_au1_interp_filter_chroma[16 + i4_y_phase]) *
3787*495ae853SAndroid Build Coastguard Worker                         (*(pu1_refarray_temp + i4_refarray_wd));
3788*495ae853SAndroid Build Coastguard Worker             }
3789*495ae853SAndroid Build Coastguard Worker 
3790*495ae853SAndroid Build Coastguard Worker         } /* end of loop over array  width */
3791*495ae853SAndroid Build Coastguard Worker         pi4_interp_buff = pi4_interp_buff + i4_refarray_wd;
3792*495ae853SAndroid Build Coastguard Worker     }     /* end of loop over temp array height*/
3793*495ae853SAndroid Build Coastguard Worker 
3794*495ae853SAndroid Build Coastguard Worker     pi4_interp_buff = pi4_interp_buff_temp;
3795*495ae853SAndroid Build Coastguard Worker 
3796*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3797*495ae853SAndroid Build Coastguard Worker     /* Loop for interpolation in horizontal direction                         */
3798*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3799*495ae853SAndroid Build Coastguard Worker     for(i4_y = 0; i4_y < i4_temp_array_ht; i4_y++)
3800*495ae853SAndroid Build Coastguard Worker     {
3801*495ae853SAndroid Build Coastguard Worker         for(i4_x = 0; i4_x < i4_mb_wd; i4_x++)
3802*495ae853SAndroid Build Coastguard Worker         {
3803*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_ref;
3804*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_phase;
3805*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
3806*495ae853SAndroid Build Coastguard Worker             /* Finding the offset                                             */
3807*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
3808*495ae853SAndroid Build Coastguard Worker             i4_x_ref = ps_x_pos_phase[i4_x + i4_frm_mb_x].i2_ref_pos;
3809*495ae853SAndroid Build Coastguard Worker             i4_x_phase = ps_x_pos_phase[i4_x + i4_frm_mb_x].i2_phase;
3810*495ae853SAndroid Build Coastguard Worker             pi4_interp_buff_temp = pi4_interp_buff + i4_x_ref;
3811*495ae853SAndroid Build Coastguard Worker 
3812*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
3813*495ae853SAndroid Build Coastguard Worker             /* Check for Luma/Chroma Processing                                 */
3814*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
3815*495ae853SAndroid Build Coastguard Worker             if(0 == i4_chroma_flag)
3816*495ae853SAndroid Build Coastguard Worker             {
3817*495ae853SAndroid Build Coastguard Worker                 *(pu1_out + i4_x + (i4_y * i4_out_stride)) =
3818*495ae853SAndroid Build Coastguard Worker 
3819*495ae853SAndroid Build Coastguard Worker                     CLIPUCHAR(
3820*495ae853SAndroid Build Coastguard Worker                         ((g_ai1_interp_filter_luma[i4_x_phase]) * (*(pi4_interp_buff_temp - 1)) +
3821*495ae853SAndroid Build Coastguard Worker                          (g_ai1_interp_filter_luma[16 + i4_x_phase]) * (*(pi4_interp_buff_temp)) +
3822*495ae853SAndroid Build Coastguard Worker                          (g_ai1_interp_filter_luma[32 + i4_x_phase]) *
3823*495ae853SAndroid Build Coastguard Worker                              (*(pi4_interp_buff_temp + 1)) +
3824*495ae853SAndroid Build Coastguard Worker                          (g_ai1_interp_filter_luma[48 + i4_x_phase]) *
3825*495ae853SAndroid Build Coastguard Worker                              (*(pi4_interp_buff_temp + 2)) +
3826*495ae853SAndroid Build Coastguard Worker                          512) >>
3827*495ae853SAndroid Build Coastguard Worker                         10);
3828*495ae853SAndroid Build Coastguard Worker             }
3829*495ae853SAndroid Build Coastguard Worker             else
3830*495ae853SAndroid Build Coastguard Worker             {
3831*495ae853SAndroid Build Coastguard Worker                 *(pu1_out + (2 * i4_x) + (i4_y * i4_out_stride)) = CLIPUCHAR(
3832*495ae853SAndroid Build Coastguard Worker                     ((g_au1_interp_filter_chroma[i4_x_phase]) * (*(pi4_interp_buff_temp)) +
3833*495ae853SAndroid Build Coastguard Worker                      (g_au1_interp_filter_chroma[16 + i4_x_phase]) * (*(pi4_interp_buff_temp + 1)) +
3834*495ae853SAndroid Build Coastguard Worker                      512) >>
3835*495ae853SAndroid Build Coastguard Worker                     10);
3836*495ae853SAndroid Build Coastguard Worker             }
3837*495ae853SAndroid Build Coastguard Worker 
3838*495ae853SAndroid Build Coastguard Worker         } /* end of loop over array width */
3839*495ae853SAndroid Build Coastguard Worker         pi4_interp_buff = pi4_interp_buff + i4_refarray_wd;
3840*495ae853SAndroid Build Coastguard Worker     }     /* end of loop over MB height */
3841*495ae853SAndroid Build Coastguard Worker 
3842*495ae853SAndroid Build Coastguard Worker     return;
3843*495ae853SAndroid Build Coastguard Worker } /* End of Interpolation Function */
3844*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3845*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3846*495ae853SAndroid Build Coastguard Worker /*  Function Name :  isvcd_intra_resamp_mb                                      */
3847*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3848*495ae853SAndroid Build Coastguard Worker /*  Description   : MB level function whcih perform the intra resampling     */
3849*495ae853SAndroid Build Coastguard Worker /*                  of data of an MB (luma and chroma insclusive)            */
3850*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3851*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_intra_samp_ctxt : intra sampling context              */
3852*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_luma : reference layer luma data buffer desc      */
3853*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_chroma : reference layer chroma data buffer desc  */
3854*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_mb_mode_map : ref layer mb mode map buff desc     */
3855*495ae853SAndroid Build Coastguard Worker /*                  ps_curr_luma : current layer out luma buffer desc        */
3856*495ae853SAndroid Build Coastguard Worker /*                  ps_curr_chroma : current layer out chroma buffer desc    */
3857*495ae853SAndroid Build Coastguard Worker /*                  ps_mb_coord : current mb coorinate                       */
3858*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
3859*495ae853SAndroid Build Coastguard Worker /*  Processing    : it calls the reference layer construction followed by    */
3860*495ae853SAndroid Build Coastguard Worker /*                   interpolation function for luma and cb and cr           */
3861*495ae853SAndroid Build Coastguard Worker /*  Outputs       : inter resampled data of current MB                       */
3862*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
3863*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3864*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
3865*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3866*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3867*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3868*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3869*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay                creation                        */
3870*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3871*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_intra_resamp_mb(void * pv_intra_samp_ctxt,mem_element_t * ps_ref_luma,mem_element_t * ps_ref_chroma,mem_element_t * ps_ref_mb_mode_map,mem_element_t * ps_curr_luma,mem_element_t * ps_curr_chroma,mb_coord_t * ps_mb_coord)3872*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_intra_resamp_mb(void *pv_intra_samp_ctxt, mem_element_t *ps_ref_luma,
3873*495ae853SAndroid Build Coastguard Worker                              mem_element_t *ps_ref_chroma, mem_element_t *ps_ref_mb_mode_map,
3874*495ae853SAndroid Build Coastguard Worker                              mem_element_t *ps_curr_luma, mem_element_t *ps_curr_chroma,
3875*495ae853SAndroid Build Coastguard Worker                              mb_coord_t *ps_mb_coord)
3876*495ae853SAndroid Build Coastguard Worker {
3877*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3878*495ae853SAndroid Build Coastguard Worker     /* I/O buffer params                                                     */
3879*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3880*495ae853SAndroid Build Coastguard Worker     intra_sampling_ctxt_t *ps_ctxt;
3881*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_inp_luma, *pu1_inp_cb, *pu1_inp_cr;
3882*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_out_luma, *pu1_out_cb, *pu1_out_cr;
3883*495ae853SAndroid Build Coastguard Worker     WORD32 i4_inp_stride;
3884*495ae853SAndroid Build Coastguard Worker     WORD32 i4_out_stride;
3885*495ae853SAndroid Build Coastguard Worker     WORD32 i4_refarray_stride;
3886*495ae853SAndroid Build Coastguard Worker 
3887*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3888*495ae853SAndroid Build Coastguard Worker     /* ref sample array and corresponding parametrs                             */
3889*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3890*495ae853SAndroid Build Coastguard Worker     WORD32 i4_chroma_flag, ret;
3891*495ae853SAndroid Build Coastguard Worker 
3892*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (intra_sampling_ctxt_t *) pv_intra_samp_ctxt;
3893*495ae853SAndroid Build Coastguard Worker     /* needs to be populated at proper place */
3894*495ae853SAndroid Build Coastguard Worker     i4_refarray_stride = ps_ctxt->i4_refarray_stride;
3895*495ae853SAndroid Build Coastguard Worker 
3896*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3897*495ae853SAndroid Build Coastguard Worker     /* LUMA PROCESSING                                                        */
3898*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3899*495ae853SAndroid Build Coastguard Worker     pu1_inp_luma = (UWORD8 *) ps_ref_luma->pv_buffer;
3900*495ae853SAndroid Build Coastguard Worker     pu1_out_luma = (UWORD8 *) ps_curr_luma->pv_buffer;
3901*495ae853SAndroid Build Coastguard Worker     i4_inp_stride = ps_ref_luma->i4_num_element_stride;
3902*495ae853SAndroid Build Coastguard Worker     i4_out_stride = ps_curr_luma->i4_num_element_stride;
3903*495ae853SAndroid Build Coastguard Worker     i4_chroma_flag = 0;
3904*495ae853SAndroid Build Coastguard Worker 
3905*495ae853SAndroid Build Coastguard Worker     /* ------- Constructing refSampleArray ----------------------- */
3906*495ae853SAndroid Build Coastguard Worker     ret = isvcd_reflayer_construction(pv_intra_samp_ctxt, pu1_inp_luma, NULL, i4_inp_stride,
3907*495ae853SAndroid Build Coastguard Worker                                       i4_refarray_stride, ps_ref_mb_mode_map, ps_mb_coord,
3908*495ae853SAndroid Build Coastguard Worker                                       i4_chroma_flag);
3909*495ae853SAndroid Build Coastguard Worker 
3910*495ae853SAndroid Build Coastguard Worker     if(ret != OK)
3911*495ae853SAndroid Build Coastguard Worker     {
3912*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
3913*495ae853SAndroid Build Coastguard Worker     }
3914*495ae853SAndroid Build Coastguard Worker     /* ---- Interpolation process for Intra_Base prediction     ------ */
3915*495ae853SAndroid Build Coastguard Worker     ps_ctxt->pf_interpolate_intra_base(pv_intra_samp_ctxt, pu1_out_luma, i4_out_stride,
3916*495ae853SAndroid Build Coastguard Worker                                        i4_refarray_stride, ps_mb_coord->u2_mb_x,
3917*495ae853SAndroid Build Coastguard Worker                                        ps_mb_coord->u2_mb_y, i4_chroma_flag, 0);
3918*495ae853SAndroid Build Coastguard Worker 
3919*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3920*495ae853SAndroid Build Coastguard Worker     /* CHROMA PROCESSING                                                       */
3921*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
3922*495ae853SAndroid Build Coastguard Worker     /* CB */
3923*495ae853SAndroid Build Coastguard Worker     i4_inp_stride = ps_ref_chroma->i4_num_element_stride;
3924*495ae853SAndroid Build Coastguard Worker     pu1_inp_cb = (UWORD8 *) ps_ref_chroma->pv_buffer;
3925*495ae853SAndroid Build Coastguard Worker     pu1_inp_cr = pu1_inp_cb + 1;
3926*495ae853SAndroid Build Coastguard Worker     i4_chroma_flag = 1;
3927*495ae853SAndroid Build Coastguard Worker 
3928*495ae853SAndroid Build Coastguard Worker     /* ------- Constructing refSampleArray ----------------------- */
3929*495ae853SAndroid Build Coastguard Worker     ret = isvcd_reflayer_construction(pv_intra_samp_ctxt, pu1_inp_cb, pu1_inp_cr, i4_inp_stride,
3930*495ae853SAndroid Build Coastguard Worker                                       i4_refarray_stride, ps_ref_mb_mode_map, ps_mb_coord,
3931*495ae853SAndroid Build Coastguard Worker                                       i4_chroma_flag);
3932*495ae853SAndroid Build Coastguard Worker 
3933*495ae853SAndroid Build Coastguard Worker     if(ret != OK)
3934*495ae853SAndroid Build Coastguard Worker     {
3935*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
3936*495ae853SAndroid Build Coastguard Worker     }
3937*495ae853SAndroid Build Coastguard Worker     i4_out_stride = ps_curr_chroma->i4_num_element_stride;
3938*495ae853SAndroid Build Coastguard Worker     pu1_out_cb = (UWORD8 *) ps_curr_chroma->pv_buffer;
3939*495ae853SAndroid Build Coastguard Worker     pu1_out_cr = pu1_out_cb + 1;
3940*495ae853SAndroid Build Coastguard Worker 
3941*495ae853SAndroid Build Coastguard Worker     /* ---- Cb Interpolation process for Intra_Base prediction     ------ */
3942*495ae853SAndroid Build Coastguard Worker     ps_ctxt->pf_interpolate_intra_base(pv_intra_samp_ctxt, pu1_out_cb, i4_out_stride,
3943*495ae853SAndroid Build Coastguard Worker                                        i4_refarray_stride, ps_mb_coord->u2_mb_x,
3944*495ae853SAndroid Build Coastguard Worker                                        ps_mb_coord->u2_mb_y, i4_chroma_flag, 0);
3945*495ae853SAndroid Build Coastguard Worker 
3946*495ae853SAndroid Build Coastguard Worker     /* ---- Cr Interpolation process for Intra_Base prediction     ------ */
3947*495ae853SAndroid Build Coastguard Worker     ps_ctxt->pf_interpolate_intra_base(pv_intra_samp_ctxt, pu1_out_cr, i4_out_stride,
3948*495ae853SAndroid Build Coastguard Worker                                        i4_refarray_stride, ps_mb_coord->u2_mb_x,
3949*495ae853SAndroid Build Coastguard Worker                                        ps_mb_coord->u2_mb_y, i4_chroma_flag, 1);
3950*495ae853SAndroid Build Coastguard Worker     return OK;
3951*495ae853SAndroid Build Coastguard Worker }
3952*495ae853SAndroid Build Coastguard Worker 
3953*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3954*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3955*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_intra_resamp_generate_segment_lookup                */
3956*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3957*495ae853SAndroid Build Coastguard Worker /*  Description   : This function generates segment lookup used to derive    */
3958*495ae853SAndroid Build Coastguard Worker /*                    segments which have to be be intra resampled           */
3959*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3960*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_lookup_table : look up table                          */
3961*495ae853SAndroid Build Coastguard Worker /*                  i4_dimension    : dimension of the block which is used in*/
3962*495ae853SAndroid Build Coastguard Worker /*                                      resampling process.                  */
3963*495ae853SAndroid Build Coastguard Worker /*                  i4_mb_size        : size of the mb                       */
3964*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
3965*495ae853SAndroid Build Coastguard Worker /*  Processing    : This function generates segment lookup used to derive    */
3966*495ae853SAndroid Build Coastguard Worker /*                    segments which have to be be intra resampled           */
3967*495ae853SAndroid Build Coastguard Worker /*  Outputs          : none                                                  */
3968*495ae853SAndroid Build Coastguard Worker /*  Returns          : none                                                  */
3969*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3970*495ae853SAndroid Build Coastguard Worker /*  Issues       : None                                                      */
3971*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3972*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
3973*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3974*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
3975*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay           Creation                             */
3976*495ae853SAndroid Build Coastguard Worker /*                                                                           */
3977*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_intra_resamp_generate_segment_lookup(seg_lookup_desc_t * ps_seg_lookup_table,WORD32 i4_dimension,WORD32 i4_mb_size,WORD32 i4_shift_val)3978*495ae853SAndroid Build Coastguard Worker void isvcd_intra_resamp_generate_segment_lookup(seg_lookup_desc_t *ps_seg_lookup_table,
3979*495ae853SAndroid Build Coastguard Worker                                                 WORD32 i4_dimension, WORD32 i4_mb_size,
3980*495ae853SAndroid Build Coastguard Worker                                                 WORD32 i4_shift_val)
3981*495ae853SAndroid Build Coastguard Worker {
3982*495ae853SAndroid Build Coastguard Worker     WORD32 i4_x;
3983*495ae853SAndroid Build Coastguard Worker     WORD32 i4_position, i4_dist_prev_mb, i4_dist_next_mb;
3984*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_seg_dim;
3985*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_sgmts;
3986*495ae853SAndroid Build Coastguard Worker     WORD32 i4_block_size = i4_mb_size >> 1;
3987*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_offset = 0;
3988*495ae853SAndroid Build Coastguard Worker     seg_lookup_desc_t *ps_segments;
3989*495ae853SAndroid Build Coastguard Worker     seg_description_t *ps_seg_desc;
3990*495ae853SAndroid Build Coastguard Worker 
3991*495ae853SAndroid Build Coastguard Worker     memset(ps_seg_lookup_table, 0, i4_mb_size * sizeof(seg_lookup_desc_t));
3992*495ae853SAndroid Build Coastguard Worker 
3993*495ae853SAndroid Build Coastguard Worker     for(i4_x = 0; i4_x < i4_mb_size; i4_x++)
3994*495ae853SAndroid Build Coastguard Worker     {
3995*495ae853SAndroid Build Coastguard Worker         ps_segments = &ps_seg_lookup_table[i4_x];
3996*495ae853SAndroid Build Coastguard Worker         ps_seg_desc = ps_segments->s_segments;
3997*495ae853SAndroid Build Coastguard Worker         i4_position = i4_x;
3998*495ae853SAndroid Build Coastguard Worker 
3999*495ae853SAndroid Build Coastguard Worker         if(i4_x >= i4_block_size)
4000*495ae853SAndroid Build Coastguard Worker         {
4001*495ae853SAndroid Build Coastguard Worker             /* set the fourth bit so that later it can be directly OR ed */
4002*495ae853SAndroid Build Coastguard Worker             ps_segments->u4_start_pos = 8;
4003*495ae853SAndroid Build Coastguard Worker         }
4004*495ae853SAndroid Build Coastguard Worker         else
4005*495ae853SAndroid Build Coastguard Worker         {
4006*495ae853SAndroid Build Coastguard Worker             ps_segments->u4_start_pos = 0;
4007*495ae853SAndroid Build Coastguard Worker         }
4008*495ae853SAndroid Build Coastguard Worker 
4009*495ae853SAndroid Build Coastguard Worker         u1_num_sgmts = 0;
4010*495ae853SAndroid Build Coastguard Worker         u1_offset = 0;
4011*495ae853SAndroid Build Coastguard Worker 
4012*495ae853SAndroid Build Coastguard Worker         while(i4_position < (i4_x + i4_dimension))
4013*495ae853SAndroid Build Coastguard Worker         {
4014*495ae853SAndroid Build Coastguard Worker             /* check and fill the nearest mb boundry flag */
4015*495ae853SAndroid Build Coastguard Worker             if((i4_position & (i4_mb_size - 1)) < i4_block_size)
4016*495ae853SAndroid Build Coastguard Worker             {
4017*495ae853SAndroid Build Coastguard Worker                 ps_seg_desc->i1_nearst_mb_bdry = -1;
4018*495ae853SAndroid Build Coastguard Worker             }
4019*495ae853SAndroid Build Coastguard Worker             else
4020*495ae853SAndroid Build Coastguard Worker             {
4021*495ae853SAndroid Build Coastguard Worker                 ps_seg_desc->i1_nearst_mb_bdry = 1;
4022*495ae853SAndroid Build Coastguard Worker             }
4023*495ae853SAndroid Build Coastguard Worker 
4024*495ae853SAndroid Build Coastguard Worker             /* find the distance from the previous MB for start of segment*/
4025*495ae853SAndroid Build Coastguard Worker             i4_dist_prev_mb = (i4_position & (i4_mb_size - 1));
4026*495ae853SAndroid Build Coastguard Worker 
4027*495ae853SAndroid Build Coastguard Worker             ps_seg_desc->i1_dist_idx =
4028*495ae853SAndroid Build Coastguard Worker                 ((i4_dist_prev_mb >= i4_mb_size >> 1) ? (i4_mb_size - i4_dist_prev_mb)
4029*495ae853SAndroid Build Coastguard Worker                                                       : -(i4_dist_prev_mb + 1));
4030*495ae853SAndroid Build Coastguard Worker 
4031*495ae853SAndroid Build Coastguard Worker             /* find the size of the segment */
4032*495ae853SAndroid Build Coastguard Worker             u1_seg_dim = (i4_block_size - (i4_position & (i4_block_size - 1)));
4033*495ae853SAndroid Build Coastguard Worker             i4_position += u1_seg_dim;
4034*495ae853SAndroid Build Coastguard Worker             if(i4_position > (i4_x + i4_dimension))
4035*495ae853SAndroid Build Coastguard Worker             {
4036*495ae853SAndroid Build Coastguard Worker                 i4_position = (i4_x + i4_dimension);
4037*495ae853SAndroid Build Coastguard Worker                 u1_seg_dim = (i4_position & (i4_block_size - 1));
4038*495ae853SAndroid Build Coastguard Worker             }
4039*495ae853SAndroid Build Coastguard Worker 
4040*495ae853SAndroid Build Coastguard Worker             /* find the distance from the next MB for end of segment */
4041*495ae853SAndroid Build Coastguard Worker             i4_dist_next_mb = (i4_position & (i4_mb_size - 1));
4042*495ae853SAndroid Build Coastguard Worker             ps_seg_desc->u1_seg_dim = u1_seg_dim;
4043*495ae853SAndroid Build Coastguard Worker             ps_seg_desc->u1_seg_off = u1_offset;
4044*495ae853SAndroid Build Coastguard Worker 
4045*495ae853SAndroid Build Coastguard Worker             /* check if the segment has a adjoining MB edge */
4046*495ae853SAndroid Build Coastguard Worker             if(i4_dist_prev_mb == 0)
4047*495ae853SAndroid Build Coastguard Worker             {
4048*495ae853SAndroid Build Coastguard Worker                 if(0 == u1_num_sgmts)
4049*495ae853SAndroid Build Coastguard Worker                 {
4050*495ae853SAndroid Build Coastguard Worker                     ps_seg_desc->u1_mb_adjoin = 0;
4051*495ae853SAndroid Build Coastguard Worker                 }
4052*495ae853SAndroid Build Coastguard Worker                 else
4053*495ae853SAndroid Build Coastguard Worker                 {
4054*495ae853SAndroid Build Coastguard Worker                     ps_seg_desc->u1_mb_adjoin = 1 << i4_shift_val;
4055*495ae853SAndroid Build Coastguard Worker                 }
4056*495ae853SAndroid Build Coastguard Worker             }
4057*495ae853SAndroid Build Coastguard Worker             else if(i4_dist_next_mb == 0)
4058*495ae853SAndroid Build Coastguard Worker             {
4059*495ae853SAndroid Build Coastguard Worker                 if(i4_position == (i4_x + i4_dimension))
4060*495ae853SAndroid Build Coastguard Worker                 {
4061*495ae853SAndroid Build Coastguard Worker                     ps_seg_desc->u1_mb_adjoin = 0;
4062*495ae853SAndroid Build Coastguard Worker                 }
4063*495ae853SAndroid Build Coastguard Worker                 else
4064*495ae853SAndroid Build Coastguard Worker                 {
4065*495ae853SAndroid Build Coastguard Worker                     ps_seg_desc->u1_mb_adjoin = 1 << i4_shift_val;
4066*495ae853SAndroid Build Coastguard Worker                 }
4067*495ae853SAndroid Build Coastguard Worker             }
4068*495ae853SAndroid Build Coastguard Worker             else
4069*495ae853SAndroid Build Coastguard Worker             {
4070*495ae853SAndroid Build Coastguard Worker                 ps_seg_desc->u1_mb_adjoin = 0;
4071*495ae853SAndroid Build Coastguard Worker             }
4072*495ae853SAndroid Build Coastguard Worker 
4073*495ae853SAndroid Build Coastguard Worker             /* Updations */
4074*495ae853SAndroid Build Coastguard Worker             u1_offset += u1_seg_dim;
4075*495ae853SAndroid Build Coastguard Worker             u1_num_sgmts++;
4076*495ae853SAndroid Build Coastguard Worker             ps_seg_desc++;
4077*495ae853SAndroid Build Coastguard Worker         }
4078*495ae853SAndroid Build Coastguard Worker 
4079*495ae853SAndroid Build Coastguard Worker         /* fill the number of segments for this position */
4080*495ae853SAndroid Build Coastguard Worker         ps_segments->u1_num_segments = u1_num_sgmts;
4081*495ae853SAndroid Build Coastguard Worker     }
4082*495ae853SAndroid Build Coastguard Worker }
4083*495ae853SAndroid Build Coastguard Worker 
4084*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4085*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4086*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_intra_resamp_populate_list                            */
4087*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4088*495ae853SAndroid Build Coastguard Worker /*  Description   : This is a seq or frame level init function which fills   */
4089*495ae853SAndroid Build Coastguard Worker /*                  all offsets, projected locations arrays based on         */
4090*495ae853SAndroid Build Coastguard Worker /*                  the two resolutions  and cropping parameters             */
4091*495ae853SAndroid Build Coastguard Worker /*  Inputs        : refer ot doxygen comments below                          */
4092*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
4093*495ae853SAndroid Build Coastguard Worker /*  Processing    : it projects the locations and computes the values        */
4094*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4095*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
4096*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
4097*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4098*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
4099*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4100*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
4101*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4102*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
4103*495ae853SAndroid Build Coastguard Worker /*         26 06 2009   vijayakumar          creation                        */
4104*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4105*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_intra_resamp_populate_list(intra_samp_map_ctxt_t * ps_map_ctxt,res_prms_t * ps_curr_res_prms,res_prms_t * ps_ref_res_prms,WORD32 i4_chroma_flag,svc_dec_lyr_struct_t * ps_svc_lyr_dec)4106*495ae853SAndroid Build Coastguard Worker void isvcd_intra_resamp_populate_list(intra_samp_map_ctxt_t *ps_map_ctxt,
4107*495ae853SAndroid Build Coastguard Worker                                       res_prms_t *ps_curr_res_prms, res_prms_t *ps_ref_res_prms,
4108*495ae853SAndroid Build Coastguard Worker                                       WORD32 i4_chroma_flag, svc_dec_lyr_struct_t *ps_svc_lyr_dec)
4109*495ae853SAndroid Build Coastguard Worker {
4110*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4111*495ae853SAndroid Build Coastguard Worker     /* Local variables required for finding the mapping between the layers     */
4112*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4113*495ae853SAndroid Build Coastguard Worker     UWORD32 i4_shift_x, i4_shift_y, i4_scale_x, i4_scale_y;
4114*495ae853SAndroid Build Coastguard Worker     WORD32 i4_offset_x, i4_offset_y;
4115*495ae853SAndroid Build Coastguard Worker     WORD32 i4_add_x, i4_add_y, i4_delta_x, i4_delta_y, i4_refphase_x, i4_refphase_y;
4116*495ae853SAndroid Build Coastguard Worker     WORD32 i4_phase_x, i4_phase_y, i4_sub_wd, i4_sub_ht, i4_mb_wd, i4_mb_ht;
4117*495ae853SAndroid Build Coastguard Worker     WORD32 i4_horz_dim, i4_vert_dim, i4_tmp;
4118*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
4119*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4120*495ae853SAndroid Build Coastguard Worker     /* Local Pointer Declaration for arrays in Mapping context                 */
4121*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4122*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t *ps_x_off_len, *ps_y_off_len;
4123*495ae853SAndroid Build Coastguard Worker     UWORD32 i4_ref_wd, i4_ref_ht, i4_scaled_wd, i4_scaled_ht, i4_curr_lyr_width, i4_curr_lyr_height;
4124*495ae853SAndroid Build Coastguard Worker 
4125*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4126*495ae853SAndroid Build Coastguard Worker     /* Local Flag Declaration                                                 */
4127*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4128*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_layer_field_pic_flag, i4_field_pic_flag, i4_frame_mbs_only_flag;
4129*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_layer_frame_Mbs_only_flag, i4_field_Mb_flag, i4_bot_field_flag;
4130*495ae853SAndroid Build Coastguard Worker 
4131*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4132*495ae853SAndroid Build Coastguard Worker     /* Cropping Parameters Declaration                                         */
4133*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4134*495ae853SAndroid Build Coastguard Worker     WORD32 i4_scaled_ref_layer_left_offset, i4_scaled_ref_layer_top_offset;
4135*495ae853SAndroid Build Coastguard Worker     WORD32 i4_scaled_ref_layer_right_offset, i4_scaled_ref_layer_bottom_offset;
4136*495ae853SAndroid Build Coastguard Worker     dec_seq_params_t *ps_sps;
4137*495ae853SAndroid Build Coastguard Worker     dec_svc_seq_params_t *ps_subset_sps;
4138*495ae853SAndroid Build Coastguard Worker     ps_sps = ps_dec->ps_cur_sps;
4139*495ae853SAndroid Build Coastguard Worker     ps_subset_sps = ps_svc_lyr_dec->ps_cur_subset_sps;
4140*495ae853SAndroid Build Coastguard Worker 
4141*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4142*495ae853SAndroid Build Coastguard Worker     /* Hardcoding flag information    (assuming no field support) */
4143*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4144*495ae853SAndroid Build Coastguard Worker     i4_ref_layer_field_pic_flag = SVCD_FALSE;
4145*495ae853SAndroid Build Coastguard Worker     i4_field_pic_flag = SVCD_FALSE;
4146*495ae853SAndroid Build Coastguard Worker     i4_frame_mbs_only_flag = SVCD_TRUE;
4147*495ae853SAndroid Build Coastguard Worker     i4_field_Mb_flag = SVCD_FALSE;
4148*495ae853SAndroid Build Coastguard Worker     i4_bot_field_flag = SVCD_FALSE;
4149*495ae853SAndroid Build Coastguard Worker     i4_ref_layer_frame_Mbs_only_flag = SVCD_TRUE;
4150*495ae853SAndroid Build Coastguard Worker     i4_horz_dim = 0;
4151*495ae853SAndroid Build Coastguard Worker     i4_vert_dim = 0;
4152*495ae853SAndroid Build Coastguard Worker 
4153*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4154*495ae853SAndroid Build Coastguard Worker     /* Pointer and Paramater are intialized    - Chroma and Luma */
4155*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4156*495ae853SAndroid Build Coastguard Worker     {
4157*495ae853SAndroid Build Coastguard Worker         WORD32 i4_base_width;
4158*495ae853SAndroid Build Coastguard Worker         WORD32 i4_base_height;
4159*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ref_layer_chroma_phase_x_plus1_flag;
4160*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ref_layer_chroma_phase_y_plus1;
4161*495ae853SAndroid Build Coastguard Worker         WORD32 i4_chroma_phase_x_plus1_flag;
4162*495ae853SAndroid Build Coastguard Worker         WORD32 i4_chroma_phase_y_plus1;
4163*495ae853SAndroid Build Coastguard Worker 
4164*495ae853SAndroid Build Coastguard Worker         /* ------------------------------------------------------------- */
4165*495ae853SAndroid Build Coastguard Worker         /* HARD CODED FOR 420                                             */
4166*495ae853SAndroid Build Coastguard Worker         /* ------------------------------------------------------------- */
4167*495ae853SAndroid Build Coastguard Worker         WORD32 i4_sub_wd_chroma = 2;
4168*495ae853SAndroid Build Coastguard Worker         WORD32 i4_sub_ht_chroma = 2;
4169*495ae853SAndroid Build Coastguard Worker 
4170*495ae853SAndroid Build Coastguard Worker         i4_base_width = ps_ref_res_prms->i4_res_width;
4171*495ae853SAndroid Build Coastguard Worker         i4_base_height = ps_ref_res_prms->i4_res_height;
4172*495ae853SAndroid Build Coastguard Worker 
4173*495ae853SAndroid Build Coastguard Worker         i4_ref_layer_chroma_phase_x_plus1_flag =
4174*495ae853SAndroid Build Coastguard Worker             ps_curr_res_prms->i1_ref_lyr_chroma_phase_x_plus1_flag;
4175*495ae853SAndroid Build Coastguard Worker 
4176*495ae853SAndroid Build Coastguard Worker         i4_ref_layer_chroma_phase_y_plus1 = ps_curr_res_prms->i1_ref_lyr_chroma_phase_y_plus1;
4177*495ae853SAndroid Build Coastguard Worker         i4_chroma_phase_x_plus1_flag = ps_subset_sps->s_sps_svc_ext.u1_chroma_phase_x_plus1_flag;
4178*495ae853SAndroid Build Coastguard Worker         i4_chroma_phase_y_plus1 = ps_subset_sps->s_sps_svc_ext.u1_chroma_phase_y_plus1;
4179*495ae853SAndroid Build Coastguard Worker         i4_scaled_ref_layer_bottom_offset = ps_curr_res_prms->s_ref_lyr_scaled_offset.i2_bot;
4180*495ae853SAndroid Build Coastguard Worker         i4_scaled_ref_layer_left_offset = ps_curr_res_prms->s_ref_lyr_scaled_offset.i2_left;
4181*495ae853SAndroid Build Coastguard Worker         i4_scaled_ref_layer_top_offset = ps_curr_res_prms->s_ref_lyr_scaled_offset.i2_top;
4182*495ae853SAndroid Build Coastguard Worker         i4_scaled_ref_layer_right_offset = ps_curr_res_prms->s_ref_lyr_scaled_offset.i2_rt;
4183*495ae853SAndroid Build Coastguard Worker 
4184*495ae853SAndroid Build Coastguard Worker         /* ----------------------------------------------------------------- */
4185*495ae853SAndroid Build Coastguard Worker         /* Computing Effective Frame Dimensions                                 */
4186*495ae853SAndroid Build Coastguard Worker         /* ------------------------------------------------------------------*/
4187*495ae853SAndroid Build Coastguard Worker         i4_ref_wd = (i4_base_width >> i4_chroma_flag);
4188*495ae853SAndroid Build Coastguard Worker         i4_ref_ht = (i4_base_height >> i4_chroma_flag) * (1 + i4_ref_layer_field_pic_flag);
4189*495ae853SAndroid Build Coastguard Worker 
4190*495ae853SAndroid Build Coastguard Worker         i4_scaled_wd = ps_curr_res_prms->u2_scaled_ref_width;
4191*495ae853SAndroid Build Coastguard Worker         i4_scaled_ht = ps_curr_res_prms->u2_scaled_ref_height;
4192*495ae853SAndroid Build Coastguard Worker         i4_scaled_wd = (i4_scaled_wd >> i4_chroma_flag);
4193*495ae853SAndroid Build Coastguard Worker         i4_scaled_ht = (i4_scaled_ht >> i4_chroma_flag) * (1 + i4_field_pic_flag);
4194*495ae853SAndroid Build Coastguard Worker 
4195*495ae853SAndroid Build Coastguard Worker         if(1 == i4_chroma_flag)
4196*495ae853SAndroid Build Coastguard Worker         {
4197*495ae853SAndroid Build Coastguard Worker             i4_refphase_x = i4_ref_layer_chroma_phase_x_plus1_flag - 1;
4198*495ae853SAndroid Build Coastguard Worker             i4_refphase_y = i4_ref_layer_chroma_phase_y_plus1 - 1;
4199*495ae853SAndroid Build Coastguard Worker             i4_phase_x = i4_chroma_phase_x_plus1_flag - 1;
4200*495ae853SAndroid Build Coastguard Worker             i4_phase_y = i4_chroma_phase_y_plus1 - 1;
4201*495ae853SAndroid Build Coastguard Worker             i4_sub_wd = i4_sub_wd_chroma;
4202*495ae853SAndroid Build Coastguard Worker             i4_sub_ht = i4_sub_ht_chroma;
4203*495ae853SAndroid Build Coastguard Worker             i4_mb_wd = MB_WIDTH >> 1;
4204*495ae853SAndroid Build Coastguard Worker             i4_mb_ht = MB_HEIGHT >> 1;
4205*495ae853SAndroid Build Coastguard Worker         }
4206*495ae853SAndroid Build Coastguard Worker         else
4207*495ae853SAndroid Build Coastguard Worker         {
4208*495ae853SAndroid Build Coastguard Worker             i4_refphase_x = 0;
4209*495ae853SAndroid Build Coastguard Worker             i4_refphase_y = 0;
4210*495ae853SAndroid Build Coastguard Worker             i4_phase_x = 0;
4211*495ae853SAndroid Build Coastguard Worker             i4_phase_y = 0;
4212*495ae853SAndroid Build Coastguard Worker             i4_sub_wd = 1;
4213*495ae853SAndroid Build Coastguard Worker             i4_sub_ht = 1;
4214*495ae853SAndroid Build Coastguard Worker             i4_mb_wd = MB_WIDTH;
4215*495ae853SAndroid Build Coastguard Worker             i4_mb_ht = MB_HEIGHT;
4216*495ae853SAndroid Build Coastguard Worker         }
4217*495ae853SAndroid Build Coastguard Worker     }
4218*495ae853SAndroid Build Coastguard Worker 
4219*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4220*495ae853SAndroid Build Coastguard Worker     /* Derive shift x and y based on level idd                               */
4221*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4222*495ae853SAndroid Build Coastguard Worker     if(ps_sps->u1_level_idc <= 30)
4223*495ae853SAndroid Build Coastguard Worker     {
4224*495ae853SAndroid Build Coastguard Worker         i4_shift_x = 16;
4225*495ae853SAndroid Build Coastguard Worker         i4_shift_y = 16;
4226*495ae853SAndroid Build Coastguard Worker     }
4227*495ae853SAndroid Build Coastguard Worker     else
4228*495ae853SAndroid Build Coastguard Worker     {
4229*495ae853SAndroid Build Coastguard Worker         i4_shift_x = 31 - isvcd_get_ceil_log2(i4_ref_wd);
4230*495ae853SAndroid Build Coastguard Worker         i4_shift_y = 31 - isvcd_get_ceil_log2(i4_ref_ht);
4231*495ae853SAndroid Build Coastguard Worker     }
4232*495ae853SAndroid Build Coastguard Worker 
4233*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4234*495ae853SAndroid Build Coastguard Worker     /* The following condition is not true in our case for time being         */
4235*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4236*495ae853SAndroid Build Coastguard Worker     if((SVCD_FALSE == i4_frame_mbs_only_flag) || (SVCD_FALSE == i4_ref_layer_frame_Mbs_only_flag))
4237*495ae853SAndroid Build Coastguard Worker     {
4238*495ae853SAndroid Build Coastguard Worker         i4_phase_y = i4_phase_y + 4 * i4_bot_field_flag;
4239*495ae853SAndroid Build Coastguard Worker 
4240*495ae853SAndroid Build Coastguard Worker         if(1 == i4_ref_layer_frame_Mbs_only_flag)
4241*495ae853SAndroid Build Coastguard Worker             i4_refphase_y = (2 * i4_refphase_y) + 2;
4242*495ae853SAndroid Build Coastguard Worker         else
4243*495ae853SAndroid Build Coastguard Worker             i4_refphase_y = i4_refphase_y + (4 * i4_bot_field_flag);
4244*495ae853SAndroid Build Coastguard Worker     }
4245*495ae853SAndroid Build Coastguard Worker 
4246*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4247*495ae853SAndroid Build Coastguard Worker     /* Dx and Dy Computation - Ratio of the base and enhance layer width     */
4248*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4249*495ae853SAndroid Build Coastguard Worker     i4_scale_x = ((i4_ref_wd << i4_shift_x) + (i4_scaled_wd >> 1)) / (i4_scaled_wd);
4250*495ae853SAndroid Build Coastguard Worker     i4_scale_y = ((i4_ref_ht << i4_shift_y) + (i4_scaled_ht >> 1)) / (i4_scaled_ht);
4251*495ae853SAndroid Build Coastguard Worker 
4252*495ae853SAndroid Build Coastguard Worker     i4_offset_x = i4_scaled_ref_layer_left_offset / i4_sub_wd;
4253*495ae853SAndroid Build Coastguard Worker     i4_add_x = (((i4_ref_wd * (2 + i4_phase_x)) << (i4_shift_x - 2)) + (i4_scaled_wd >> 1)) /
4254*495ae853SAndroid Build Coastguard Worker                    i4_scaled_wd +
4255*495ae853SAndroid Build Coastguard Worker                (1 << (i4_shift_x - 5));
4256*495ae853SAndroid Build Coastguard Worker     i4_delta_x = 4 * (2 + i4_refphase_x);
4257*495ae853SAndroid Build Coastguard Worker 
4258*495ae853SAndroid Build Coastguard Worker     if((SVCD_TRUE == i4_frame_mbs_only_flag) && (SVCD_TRUE == i4_ref_layer_frame_Mbs_only_flag))
4259*495ae853SAndroid Build Coastguard Worker     {
4260*495ae853SAndroid Build Coastguard Worker         i4_offset_y = i4_scaled_ref_layer_top_offset / i4_sub_ht;
4261*495ae853SAndroid Build Coastguard Worker         i4_add_y = (((i4_ref_ht * (2 + i4_phase_y)) << (i4_shift_y - 2)) + (i4_scaled_ht >> 1)) /
4262*495ae853SAndroid Build Coastguard Worker                        i4_scaled_ht +
4263*495ae853SAndroid Build Coastguard Worker                    (1 << (i4_shift_y - 5));
4264*495ae853SAndroid Build Coastguard Worker         i4_delta_y = 4 * (2 + i4_refphase_y);
4265*495ae853SAndroid Build Coastguard Worker     }
4266*495ae853SAndroid Build Coastguard Worker     else
4267*495ae853SAndroid Build Coastguard Worker     {
4268*495ae853SAndroid Build Coastguard Worker         i4_offset_y = i4_scaled_ref_layer_top_offset / (2 * i4_sub_ht);
4269*495ae853SAndroid Build Coastguard Worker         i4_add_y = (((i4_ref_ht * (2 + i4_phase_y)) << (i4_shift_y - 3)) + (i4_scaled_ht >> 1)) /
4270*495ae853SAndroid Build Coastguard Worker                        i4_scaled_ht +
4271*495ae853SAndroid Build Coastguard Worker                    (1 << (i4_shift_y - 5));
4272*495ae853SAndroid Build Coastguard Worker         i4_delta_y = 2 * (2 + i4_refphase_y);
4273*495ae853SAndroid Build Coastguard Worker     }
4274*495ae853SAndroid Build Coastguard Worker 
4275*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4276*495ae853SAndroid Build Coastguard Worker     /* Intializing Local Pointers    - Chroma and Luma                         */
4277*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4278*495ae853SAndroid Build Coastguard Worker     ps_x_off_len = ps_map_ctxt->ps_x_offset_length;
4279*495ae853SAndroid Build Coastguard Worker     ps_y_off_len = ps_map_ctxt->ps_y_offset_length;
4280*495ae853SAndroid Build Coastguard Worker     i4_curr_lyr_width = ps_curr_res_prms->i4_res_width >> i4_chroma_flag;
4281*495ae853SAndroid Build Coastguard Worker     i4_curr_lyr_height = ps_curr_res_prms->i4_res_height >> i4_chroma_flag;
4282*495ae853SAndroid Build Coastguard Worker 
4283*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4284*495ae853SAndroid Build Coastguard Worker     /* Dyadic Scaling Ratios Handling                                         */
4285*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4286*495ae853SAndroid Build Coastguard Worker     if(1 == ps_curr_res_prms->u1_dyadic_flag)
4287*495ae853SAndroid Build Coastguard Worker     {
4288*495ae853SAndroid Build Coastguard Worker         WORD32 i4_refarray_wd, i4_x_offset;
4289*495ae853SAndroid Build Coastguard Worker         WORD32 i4_refarray_ht, i4_y_offset;
4290*495ae853SAndroid Build Coastguard Worker         WORD32 i4_crp_wd_lt, i4_crp_ht_top;
4291*495ae853SAndroid Build Coastguard Worker         WORD32 i4_crp_wd_rt, i4_crp_ht_bot;
4292*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ref_lyr_wd, i4_ref_lyr_ht;
4293*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ref_x, i4_ref_y;
4294*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ofst;
4295*495ae853SAndroid Build Coastguard Worker         WORD32 i4_i, i4_j;
4296*495ae853SAndroid Build Coastguard Worker 
4297*495ae853SAndroid Build Coastguard Worker         /* Hard coded for dyadic case */
4298*495ae853SAndroid Build Coastguard Worker         i4_refarray_wd = 20 >> i4_chroma_flag;
4299*495ae853SAndroid Build Coastguard Worker         i4_ofst = -2 >> i4_chroma_flag;
4300*495ae853SAndroid Build Coastguard Worker         i4_crp_wd_lt = i4_scaled_ref_layer_left_offset >> i4_chroma_flag;
4301*495ae853SAndroid Build Coastguard Worker         i4_crp_wd_rt = i4_scaled_ref_layer_right_offset >> i4_chroma_flag;
4302*495ae853SAndroid Build Coastguard Worker         i4_ref_lyr_wd = (i4_curr_lyr_width >> 1);
4303*495ae853SAndroid Build Coastguard Worker 
4304*495ae853SAndroid Build Coastguard Worker         i4_ref_x = 0;
4305*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (WORD32) i4_curr_lyr_width; i4_i += (i4_mb_wd << 1))
4306*495ae853SAndroid Build Coastguard Worker         {
4307*495ae853SAndroid Build Coastguard Worker             i4_x_offset = MAX(i4_ofst, (i4_ref_x + i4_ofst));
4308*495ae853SAndroid Build Coastguard Worker             i4_x_offset = MIN(i4_x_offset, (i4_ref_lyr_wd - i4_ofst));
4309*495ae853SAndroid Build Coastguard Worker             ps_x_off_len->i2_offset = i4_x_offset;
4310*495ae853SAndroid Build Coastguard Worker             ps_x_off_len->i2_length = i4_refarray_wd;
4311*495ae853SAndroid Build Coastguard Worker             ps_x_off_len++;
4312*495ae853SAndroid Build Coastguard Worker             ps_x_off_len->i2_offset = i4_x_offset;
4313*495ae853SAndroid Build Coastguard Worker             ps_x_off_len->i2_length = i4_refarray_wd;
4314*495ae853SAndroid Build Coastguard Worker             ps_x_off_len++;
4315*495ae853SAndroid Build Coastguard Worker             if(i4_i >= i4_crp_wd_lt)
4316*495ae853SAndroid Build Coastguard Worker             {
4317*495ae853SAndroid Build Coastguard Worker                 if(i4_i <= (WORD32) (i4_curr_lyr_width - i4_crp_wd_rt))
4318*495ae853SAndroid Build Coastguard Worker                 {
4319*495ae853SAndroid Build Coastguard Worker                     i4_ref_x += i4_mb_wd;
4320*495ae853SAndroid Build Coastguard Worker                 }
4321*495ae853SAndroid Build Coastguard Worker             }
4322*495ae853SAndroid Build Coastguard Worker         }
4323*495ae853SAndroid Build Coastguard Worker 
4324*495ae853SAndroid Build Coastguard Worker         i4_refarray_ht = 20 >> i4_chroma_flag;
4325*495ae853SAndroid Build Coastguard Worker         i4_crp_ht_top = i4_scaled_ref_layer_top_offset >> i4_chroma_flag;
4326*495ae853SAndroid Build Coastguard Worker         i4_crp_ht_bot = i4_scaled_ref_layer_bottom_offset >> i4_chroma_flag;
4327*495ae853SAndroid Build Coastguard Worker         i4_ref_lyr_ht = (i4_curr_lyr_height >> 1);
4328*495ae853SAndroid Build Coastguard Worker 
4329*495ae853SAndroid Build Coastguard Worker         i4_ref_y = 0;
4330*495ae853SAndroid Build Coastguard Worker         for(i4_j = 0; i4_j < (WORD32) i4_curr_lyr_height; i4_j += (i4_mb_ht << 1))
4331*495ae853SAndroid Build Coastguard Worker         {
4332*495ae853SAndroid Build Coastguard Worker             i4_y_offset = MAX(i4_ofst, (i4_ref_y + i4_ofst));
4333*495ae853SAndroid Build Coastguard Worker             i4_y_offset = MIN(i4_y_offset, (i4_ref_lyr_ht - i4_ofst));
4334*495ae853SAndroid Build Coastguard Worker             ps_y_off_len->i2_offset = i4_y_offset;
4335*495ae853SAndroid Build Coastguard Worker             ps_y_off_len->i2_length = i4_refarray_ht;
4336*495ae853SAndroid Build Coastguard Worker             ps_y_off_len++;
4337*495ae853SAndroid Build Coastguard Worker             ps_y_off_len->i2_offset = i4_y_offset;
4338*495ae853SAndroid Build Coastguard Worker             ps_y_off_len->i2_length = i4_refarray_ht;
4339*495ae853SAndroid Build Coastguard Worker             ps_y_off_len++;
4340*495ae853SAndroid Build Coastguard Worker             if(i4_j >= i4_crp_ht_top)
4341*495ae853SAndroid Build Coastguard Worker             {
4342*495ae853SAndroid Build Coastguard Worker                 if(i4_j <= (WORD32) (i4_curr_lyr_height - i4_crp_ht_bot))
4343*495ae853SAndroid Build Coastguard Worker                 {
4344*495ae853SAndroid Build Coastguard Worker                     i4_ref_y += i4_mb_ht;
4345*495ae853SAndroid Build Coastguard Worker                 }
4346*495ae853SAndroid Build Coastguard Worker             }
4347*495ae853SAndroid Build Coastguard Worker         }
4348*495ae853SAndroid Build Coastguard Worker         /* No need to process further, return */
4349*495ae853SAndroid Build Coastguard Worker         return;
4350*495ae853SAndroid Build Coastguard Worker     } /* If dyadic path */
4351*495ae853SAndroid Build Coastguard Worker 
4352*495ae853SAndroid Build Coastguard Worker     /* Proposed Algo for Optimization */
4353*495ae853SAndroid Build Coastguard Worker     {
4354*495ae853SAndroid Build Coastguard Worker         WORD32 i4_max, i4_min;
4355*495ae853SAndroid Build Coastguard Worker         ref_min_max_map_t *ps_x_min_max;
4356*495ae853SAndroid Build Coastguard Worker         ref_min_max_map_t *ps_y_min_max;
4357*495ae853SAndroid Build Coastguard Worker         WORD32 i4_i, i4_j;
4358*495ae853SAndroid Build Coastguard Worker 
4359*495ae853SAndroid Build Coastguard Worker         ps_x_min_max = ps_map_ctxt->ps_x_min_max;
4360*495ae853SAndroid Build Coastguard Worker         ps_y_min_max = ps_map_ctxt->ps_y_min_max;
4361*495ae853SAndroid Build Coastguard Worker         /* ----------------------------------------------------------------- */
4362*495ae853SAndroid Build Coastguard Worker         /* Computation of offsetX refArrayW Xmin and Xmax Lists                 */
4363*495ae853SAndroid Build Coastguard Worker         /* ----------------------------------------------------------------- */
4364*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (WORD32) i4_curr_lyr_width; i4_i = i4_i + i4_mb_wd)
4365*495ae853SAndroid Build Coastguard Worker         {
4366*495ae853SAndroid Build Coastguard Worker             WORD32 i4_refarray_wd, i4_xr_index;
4367*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_refmin16;
4368*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_refmax16;
4369*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_offset;
4370*495ae853SAndroid Build Coastguard Worker 
4371*495ae853SAndroid Build Coastguard Worker             i4_x_refmin16 = (WORD64) (((WORD64) (i4_i - i4_offset_x) * i4_scale_x + i4_add_x) >>
4372*495ae853SAndroid Build Coastguard Worker                                       ((WORD32) (i4_shift_x - 4))) -
4373*495ae853SAndroid Build Coastguard Worker                             i4_delta_x;
4374*495ae853SAndroid Build Coastguard Worker 
4375*495ae853SAndroid Build Coastguard Worker             i4_x_refmax16 =
4376*495ae853SAndroid Build Coastguard Worker                 (WORD64) (((WORD64) (i4_i + i4_mb_wd - 1 - i4_offset_x) * i4_scale_x + i4_add_x) >>
4377*495ae853SAndroid Build Coastguard Worker                           ((WORD32) (i4_shift_x - 4))) -
4378*495ae853SAndroid Build Coastguard Worker                 i4_delta_x;
4379*495ae853SAndroid Build Coastguard Worker 
4380*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4381*495ae853SAndroid Build Coastguard Worker             /* Modified AC205                                                 */
4382*495ae853SAndroid Build Coastguard Worker             /* Minimum width required - So adding 2 pixels on each side         */
4383*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4384*495ae853SAndroid Build Coastguard Worker             i4_refarray_wd = ((i4_x_refmax16 + 15) >> 4) - (i4_x_refmin16 >> 4) + 1 + 4;
4385*495ae853SAndroid Build Coastguard Worker 
4386*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4387*495ae853SAndroid Build Coastguard Worker             /* Setting the offset 2 pixels before                             */
4388*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4389*495ae853SAndroid Build Coastguard Worker             i4_x_offset = (i4_x_refmin16 >> 4) - 2;
4390*495ae853SAndroid Build Coastguard Worker 
4391*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4392*495ae853SAndroid Build Coastguard Worker             /* Modifying the values based on the location                     */
4393*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4394*495ae853SAndroid Build Coastguard Worker             i4_min = i4_x_offset;
4395*495ae853SAndroid Build Coastguard Worker             i4_xr_index = i4_min - ((i4_min / i4_mb_wd) * i4_mb_wd);
4396*495ae853SAndroid Build Coastguard Worker 
4397*495ae853SAndroid Build Coastguard Worker             if(i4_xr_index < (i4_mb_wd >> 1))
4398*495ae853SAndroid Build Coastguard Worker             {
4399*495ae853SAndroid Build Coastguard Worker                 i4_refarray_wd = i4_refarray_wd + (i4_mb_wd >> 1);
4400*495ae853SAndroid Build Coastguard Worker                 i4_x_offset = i4_x_offset - (i4_mb_wd >> 1);
4401*495ae853SAndroid Build Coastguard Worker             }
4402*495ae853SAndroid Build Coastguard Worker 
4403*495ae853SAndroid Build Coastguard Worker             i4_max = ((i4_x_refmax16 + 15) >> 4) + 2;
4404*495ae853SAndroid Build Coastguard Worker             i4_xr_index = i4_max - ((i4_max / i4_mb_wd) * i4_mb_wd);
4405*495ae853SAndroid Build Coastguard Worker 
4406*495ae853SAndroid Build Coastguard Worker             if(i4_xr_index >= (i4_mb_wd >> 1)) i4_refarray_wd = i4_refarray_wd + (i4_mb_wd >> 1);
4407*495ae853SAndroid Build Coastguard Worker 
4408*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4409*495ae853SAndroid Build Coastguard Worker             /* Filling the arrays with offset, min, max and refArray dim     */
4410*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4411*495ae853SAndroid Build Coastguard Worker             ps_x_off_len->i2_offset = i4_x_offset;
4412*495ae853SAndroid Build Coastguard Worker             ps_x_off_len->i2_length = i4_refarray_wd;
4413*495ae853SAndroid Build Coastguard Worker 
4414*495ae853SAndroid Build Coastguard Worker             ps_x_min_max->i2_min_pos = (i4_x_refmin16 >> 4) - i4_x_offset;
4415*495ae853SAndroid Build Coastguard Worker             ps_x_min_max->i2_max_pos = ((i4_x_refmax16 + 15) >> 4) - i4_x_offset;
4416*495ae853SAndroid Build Coastguard Worker 
4417*495ae853SAndroid Build Coastguard Worker             i4_tmp = (WORD32) (ps_x_min_max->i2_max_pos - ps_x_min_max->i2_min_pos) +
4418*495ae853SAndroid Build Coastguard Worker                      (4 >> i4_chroma_flag);
4419*495ae853SAndroid Build Coastguard Worker             if(i4_tmp > i4_horz_dim)
4420*495ae853SAndroid Build Coastguard Worker             {
4421*495ae853SAndroid Build Coastguard Worker                 i4_horz_dim = i4_tmp;
4422*495ae853SAndroid Build Coastguard Worker             }
4423*495ae853SAndroid Build Coastguard Worker 
4424*495ae853SAndroid Build Coastguard Worker             /* increment the pointer */
4425*495ae853SAndroid Build Coastguard Worker             ps_x_off_len++;
4426*495ae853SAndroid Build Coastguard Worker             ps_x_min_max++;
4427*495ae853SAndroid Build Coastguard Worker         } /* end of loop over scaled width */
4428*495ae853SAndroid Build Coastguard Worker 
4429*495ae853SAndroid Build Coastguard Worker         /* ----------------------------------------------------------------- */
4430*495ae853SAndroid Build Coastguard Worker         /* Computation of offsetY refArrayH Ymin and Ymax Lists                 */
4431*495ae853SAndroid Build Coastguard Worker         /* ----------------------------------------------------------------- */
4432*495ae853SAndroid Build Coastguard Worker         for(i4_j = 0; i4_j < (WORD32) i4_curr_lyr_height; i4_j = i4_j + i4_mb_ht)
4433*495ae853SAndroid Build Coastguard Worker         {
4434*495ae853SAndroid Build Coastguard Worker             WORD32 i4_refarray_ht, i4_yr_index;
4435*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_refmin16;
4436*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_refmax16;
4437*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_offset;
4438*495ae853SAndroid Build Coastguard Worker 
4439*495ae853SAndroid Build Coastguard Worker             i4_y_refmin16 = (WORD64) (((WORD64) (i4_j - i4_offset_y) * i4_scale_y + i4_add_y) >>
4440*495ae853SAndroid Build Coastguard Worker                                       ((WORD32) (i4_shift_y - 4))) -
4441*495ae853SAndroid Build Coastguard Worker                             i4_delta_y;
4442*495ae853SAndroid Build Coastguard Worker 
4443*495ae853SAndroid Build Coastguard Worker             i4_y_refmax16 =
4444*495ae853SAndroid Build Coastguard Worker                 (WORD64) (((WORD64) (i4_j + i4_mb_ht - 1 - i4_offset_y) * i4_scale_y + i4_add_y) >>
4445*495ae853SAndroid Build Coastguard Worker                           ((WORD32) (i4_shift_y - 4))) -
4446*495ae853SAndroid Build Coastguard Worker                 i4_delta_y;
4447*495ae853SAndroid Build Coastguard Worker 
4448*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4449*495ae853SAndroid Build Coastguard Worker             /* Modified AC205                                                 */
4450*495ae853SAndroid Build Coastguard Worker             /* Minimum width required - So adding 2 pixels on each side            */
4451*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4452*495ae853SAndroid Build Coastguard Worker             i4_refarray_ht = ((i4_y_refmax16 + 15) >> 4) - (i4_y_refmin16 >> 4) + 1 + 4;
4453*495ae853SAndroid Build Coastguard Worker 
4454*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4455*495ae853SAndroid Build Coastguard Worker             /* Setting the offset 2 pixels before                             */
4456*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4457*495ae853SAndroid Build Coastguard Worker             i4_y_offset = (i4_y_refmin16 >> 4) - 2;
4458*495ae853SAndroid Build Coastguard Worker 
4459*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4460*495ae853SAndroid Build Coastguard Worker             /* Modifying the values based on the location                     */
4461*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4462*495ae853SAndroid Build Coastguard Worker             i4_min = i4_y_offset;
4463*495ae853SAndroid Build Coastguard Worker             i4_yr_index = i4_min - ((i4_min / i4_mb_ht) * i4_mb_ht);
4464*495ae853SAndroid Build Coastguard Worker             if(i4_yr_index < (i4_mb_ht >> 1))
4465*495ae853SAndroid Build Coastguard Worker             {
4466*495ae853SAndroid Build Coastguard Worker                 i4_refarray_ht = i4_refarray_ht + (i4_mb_ht >> 1);
4467*495ae853SAndroid Build Coastguard Worker                 i4_y_offset = i4_y_offset - (i4_mb_ht >> 1);
4468*495ae853SAndroid Build Coastguard Worker             }
4469*495ae853SAndroid Build Coastguard Worker 
4470*495ae853SAndroid Build Coastguard Worker             i4_max = ((i4_y_refmax16 + 15) >> 4) + 2;
4471*495ae853SAndroid Build Coastguard Worker             i4_yr_index = i4_max - ((i4_max / i4_mb_ht) * i4_mb_ht);
4472*495ae853SAndroid Build Coastguard Worker             if(i4_yr_index >= (i4_mb_ht >> 1)) i4_refarray_ht = i4_refarray_ht + (i4_mb_ht >> 1);
4473*495ae853SAndroid Build Coastguard Worker 
4474*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4475*495ae853SAndroid Build Coastguard Worker             /* Filling the arrays with offset, min, max and refArray dim     */
4476*495ae853SAndroid Build Coastguard Worker             /* ------------------------------------------------------------- */
4477*495ae853SAndroid Build Coastguard Worker             ps_y_off_len->i2_offset = i4_y_offset;
4478*495ae853SAndroid Build Coastguard Worker             ps_y_off_len->i2_length = i4_refarray_ht;
4479*495ae853SAndroid Build Coastguard Worker             ps_y_min_max->i2_min_pos = (i4_y_refmin16 >> 4) - i4_y_offset;
4480*495ae853SAndroid Build Coastguard Worker             ps_y_min_max->i2_max_pos = ((i4_y_refmax16 + 15) >> 4) - i4_y_offset;
4481*495ae853SAndroid Build Coastguard Worker 
4482*495ae853SAndroid Build Coastguard Worker             i4_tmp = (WORD32) (ps_y_min_max->i2_max_pos - ps_y_min_max->i2_min_pos) +
4483*495ae853SAndroid Build Coastguard Worker                      (4 >> i4_chroma_flag);
4484*495ae853SAndroid Build Coastguard Worker             if(i4_tmp > i4_vert_dim)
4485*495ae853SAndroid Build Coastguard Worker             {
4486*495ae853SAndroid Build Coastguard Worker                 i4_vert_dim = i4_tmp;
4487*495ae853SAndroid Build Coastguard Worker             }
4488*495ae853SAndroid Build Coastguard Worker 
4489*495ae853SAndroid Build Coastguard Worker             /* increment the pointer */
4490*495ae853SAndroid Build Coastguard Worker             ps_y_off_len++;
4491*495ae853SAndroid Build Coastguard Worker             ps_y_min_max++;
4492*495ae853SAndroid Build Coastguard Worker         } /* end of loop over scaled height */
4493*495ae853SAndroid Build Coastguard Worker     }
4494*495ae853SAndroid Build Coastguard Worker 
4495*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4496*495ae853SAndroid Build Coastguard Worker     /* Computation of Xref and Xphase List as per standard                     */
4497*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4498*495ae853SAndroid Build Coastguard Worker     ps_x_off_len = ps_map_ctxt->ps_x_offset_length;
4499*495ae853SAndroid Build Coastguard Worker     ps_y_off_len = ps_map_ctxt->ps_y_offset_length;
4500*495ae853SAndroid Build Coastguard Worker 
4501*495ae853SAndroid Build Coastguard Worker     {
4502*495ae853SAndroid Build Coastguard Worker         ref_pixel_map_t *ps_x_pos_phase;
4503*495ae853SAndroid Build Coastguard Worker         WORD32 i4_xc;
4504*495ae853SAndroid Build Coastguard Worker         WORD32 i4_offset_x_index;
4505*495ae853SAndroid Build Coastguard Worker 
4506*495ae853SAndroid Build Coastguard Worker         ps_x_pos_phase = ps_map_ctxt->ps_x_pos_phase;
4507*495ae853SAndroid Build Coastguard Worker 
4508*495ae853SAndroid Build Coastguard Worker         for(i4_xc = 0; i4_xc < (WORD32) i4_curr_lyr_width; i4_xc++)
4509*495ae853SAndroid Build Coastguard Worker         {
4510*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_offset;
4511*495ae853SAndroid Build Coastguard Worker             WORD32 i4_x_ref16;
4512*495ae853SAndroid Build Coastguard Worker 
4513*495ae853SAndroid Build Coastguard Worker             i4_offset_x_index = i4_xc / i4_mb_wd;
4514*495ae853SAndroid Build Coastguard Worker 
4515*495ae853SAndroid Build Coastguard Worker             i4_x_offset = ps_x_off_len[i4_offset_x_index].i2_offset;
4516*495ae853SAndroid Build Coastguard Worker 
4517*495ae853SAndroid Build Coastguard Worker             i4_x_ref16 = (WORD64) (((WORD64) (i4_xc - i4_offset_x) * i4_scale_x + i4_add_x) >>
4518*495ae853SAndroid Build Coastguard Worker                                    ((WORD32) (i4_shift_x - 4))) -
4519*495ae853SAndroid Build Coastguard Worker                          i4_delta_x;
4520*495ae853SAndroid Build Coastguard Worker 
4521*495ae853SAndroid Build Coastguard Worker             /* store the values */
4522*495ae853SAndroid Build Coastguard Worker             ps_x_pos_phase->i2_ref_pos = (i4_x_ref16 >> 4) - i4_x_offset;
4523*495ae853SAndroid Build Coastguard Worker             ps_x_pos_phase->i2_phase = i4_x_ref16 & 15;
4524*495ae853SAndroid Build Coastguard Worker 
4525*495ae853SAndroid Build Coastguard Worker             /* increment the pointer */
4526*495ae853SAndroid Build Coastguard Worker             ps_x_pos_phase++;
4527*495ae853SAndroid Build Coastguard Worker 
4528*495ae853SAndroid Build Coastguard Worker         } /* end of loop over scaled width */
4529*495ae853SAndroid Build Coastguard Worker     }
4530*495ae853SAndroid Build Coastguard Worker 
4531*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4532*495ae853SAndroid Build Coastguard Worker     /* Computation of Yref and Yphase List as per standard                     */
4533*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4534*495ae853SAndroid Build Coastguard Worker     {
4535*495ae853SAndroid Build Coastguard Worker         WORD32 i4_yc;
4536*495ae853SAndroid Build Coastguard Worker         ref_pixel_map_t *ps_y_pos_phase;
4537*495ae853SAndroid Build Coastguard Worker 
4538*495ae853SAndroid Build Coastguard Worker         ps_y_pos_phase = ps_map_ctxt->ps_y_pos_phase;
4539*495ae853SAndroid Build Coastguard Worker 
4540*495ae853SAndroid Build Coastguard Worker         for(i4_yc = 0; i4_yc < (WORD32) i4_curr_lyr_height; i4_yc++)
4541*495ae853SAndroid Build Coastguard Worker         {
4542*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_offset;
4543*495ae853SAndroid Build Coastguard Worker             WORD32 i4_y_ref16;
4544*495ae853SAndroid Build Coastguard Worker             WORD32 i4_offset_y_index;
4545*495ae853SAndroid Build Coastguard Worker 
4546*495ae853SAndroid Build Coastguard Worker             i4_offset_y_index = i4_yc / i4_mb_ht;
4547*495ae853SAndroid Build Coastguard Worker 
4548*495ae853SAndroid Build Coastguard Worker             i4_y_offset = ps_y_off_len[i4_offset_y_index].i2_offset;
4549*495ae853SAndroid Build Coastguard Worker 
4550*495ae853SAndroid Build Coastguard Worker             if((SVCD_FALSE == i4_frame_mbs_only_flag) ||
4551*495ae853SAndroid Build Coastguard Worker                (SVCD_FALSE == i4_ref_layer_frame_Mbs_only_flag))
4552*495ae853SAndroid Build Coastguard Worker             {
4553*495ae853SAndroid Build Coastguard Worker                 i4_yc = i4_yc >> (1 - i4_field_Mb_flag);
4554*495ae853SAndroid Build Coastguard Worker             }
4555*495ae853SAndroid Build Coastguard Worker 
4556*495ae853SAndroid Build Coastguard Worker             i4_y_ref16 = (WORD64) (((WORD64) (i4_yc - i4_offset_y) * i4_scale_y + i4_add_y) >>
4557*495ae853SAndroid Build Coastguard Worker                                    ((WORD32) (i4_shift_y - 4))) -
4558*495ae853SAndroid Build Coastguard Worker                          i4_delta_y;
4559*495ae853SAndroid Build Coastguard Worker             ps_y_pos_phase->i2_ref_pos = (i4_y_ref16 >> 4) - i4_y_offset;
4560*495ae853SAndroid Build Coastguard Worker             ps_y_pos_phase->i2_phase = i4_y_ref16 & 15;
4561*495ae853SAndroid Build Coastguard Worker 
4562*495ae853SAndroid Build Coastguard Worker             /* increment the pointer */
4563*495ae853SAndroid Build Coastguard Worker             ps_y_pos_phase++;
4564*495ae853SAndroid Build Coastguard Worker 
4565*495ae853SAndroid Build Coastguard Worker         } /* end of loop over scaled height */
4566*495ae853SAndroid Build Coastguard Worker     }
4567*495ae853SAndroid Build Coastguard Worker 
4568*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4569*495ae853SAndroid Build Coastguard Worker     /* Computation of Corresponding Diagonal Location                         */
4570*495ae853SAndroid Build Coastguard Worker     /* --------------------------------------------------------------------- */
4571*495ae853SAndroid Build Coastguard Worker     {
4572*495ae853SAndroid Build Coastguard Worker         WORD16 *pi2_xd_index;
4573*495ae853SAndroid Build Coastguard Worker         WORD16 *pi2_yd_index;
4574*495ae853SAndroid Build Coastguard Worker         WORD16 *pi2_ya_index;
4575*495ae853SAndroid Build Coastguard Worker         WORD32 i4_i, i4_j;
4576*495ae853SAndroid Build Coastguard Worker 
4577*495ae853SAndroid Build Coastguard Worker         pi2_xd_index = ps_map_ctxt->pi2_xd_index;
4578*495ae853SAndroid Build Coastguard Worker         pi2_yd_index = ps_map_ctxt->pi2_yd_index;
4579*495ae853SAndroid Build Coastguard Worker         pi2_ya_index = ps_map_ctxt->pi2_ya_index;
4580*495ae853SAndroid Build Coastguard Worker 
4581*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < i4_mb_wd; i4_i++)
4582*495ae853SAndroid Build Coastguard Worker         {
4583*495ae853SAndroid Build Coastguard Worker             *(pi2_xd_index + i4_i) = ((i4_i >= i4_mb_wd >> 1) ? (i4_i - i4_mb_wd) : (i4_i + 1));
4584*495ae853SAndroid Build Coastguard Worker 
4585*495ae853SAndroid Build Coastguard Worker         } /* end of loop over MB width */
4586*495ae853SAndroid Build Coastguard Worker 
4587*495ae853SAndroid Build Coastguard Worker         for(i4_j = 0; i4_j < i4_mb_ht; i4_j++)
4588*495ae853SAndroid Build Coastguard Worker         {
4589*495ae853SAndroid Build Coastguard Worker             *(pi2_yd_index + i4_j) = ((i4_j >= i4_mb_ht >> 1) ? (i4_j - i4_mb_ht) : (i4_j + 1));
4590*495ae853SAndroid Build Coastguard Worker 
4591*495ae853SAndroid Build Coastguard Worker             *(pi2_ya_index + i4_j) =
4592*495ae853SAndroid Build Coastguard Worker                 *(pi2_yd_index + i4_j) - (((i4_mb_ht >> 1) + 1) * (SIGN(*(pi2_yd_index + i4_j))));
4593*495ae853SAndroid Build Coastguard Worker 
4594*495ae853SAndroid Build Coastguard Worker         } /* end of loop over MB height */
4595*495ae853SAndroid Build Coastguard Worker     }
4596*495ae853SAndroid Build Coastguard Worker 
4597*495ae853SAndroid Build Coastguard Worker     /* generate the lookup to generate horizontal segments */
4598*495ae853SAndroid Build Coastguard Worker     isvcd_intra_resamp_generate_segment_lookup(ps_map_ctxt->ps_seg_lookup_horz, i4_horz_dim,
4599*495ae853SAndroid Build Coastguard Worker                                                i4_mb_wd, 3);
4600*495ae853SAndroid Build Coastguard Worker 
4601*495ae853SAndroid Build Coastguard Worker     /* generate the lookup to generate vertical segments */
4602*495ae853SAndroid Build Coastguard Worker     isvcd_intra_resamp_generate_segment_lookup(ps_map_ctxt->ps_seg_lookup_vert, i4_vert_dim,
4603*495ae853SAndroid Build Coastguard Worker                                                i4_mb_ht, 4);
4604*495ae853SAndroid Build Coastguard Worker 
4605*495ae853SAndroid Build Coastguard Worker     return;
4606*495ae853SAndroid Build Coastguard Worker } /* end of function "isvcd_intra_resamp_populate_list"*/
4607*495ae853SAndroid Build Coastguard Worker 
4608*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4609*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4610*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_populate_res_prms                                   */
4611*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4612*495ae853SAndroid Build Coastguard Worker /*  Description   :this function populates the current layer params          */
4613*495ae853SAndroid Build Coastguard Worker /*                 from the base layer and decoder context                   */
4614*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
4615*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
4616*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
4617*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4618*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
4619*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
4620*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4621*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
4622*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4623*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
4624*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4625*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
4626*495ae853SAndroid Build Coastguard Worker /*         25 11 2021   Kishore               creation                       */
4627*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4628*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4629*495ae853SAndroid Build Coastguard Worker 
isvcd_populate_res_prms(void * pv_svc_dec)4630*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_populate_res_prms(void *pv_svc_dec)
4631*495ae853SAndroid Build Coastguard Worker {
4632*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) pv_svc_dec;
4633*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
4634*495ae853SAndroid Build Coastguard Worker     res_prms_t *ps_curr_lyr_res_prms;
4635*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_ref_lyr_dec;
4636*495ae853SAndroid Build Coastguard Worker     ps_svc_ref_lyr_dec = ps_svc_lyr_dec->ps_dec_svc_ref_layer;
4637*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms = &ps_svc_lyr_dec->s_res_prms;
4638*495ae853SAndroid Build Coastguard Worker 
4639*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->i4_res_width = ps_dec->u2_pic_wd;
4640*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->i4_res_height = ps_dec->u2_pic_ht;
4641*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_left =
4642*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->ps_cur_subset_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_left_offset << 1;
4643*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_top =
4644*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->ps_cur_subset_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_top_offset << 1;
4645*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_rt =
4646*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->ps_cur_subset_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_right_offset << 1;
4647*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_bot =
4648*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->ps_cur_subset_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_bottom_offset << 1;
4649*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->u2_scaled_ref_width =
4650*495ae853SAndroid Build Coastguard Worker         (ps_dec->u2_frm_wd_in_mbs << 4) - (ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_left +
4651*495ae853SAndroid Build Coastguard Worker                                            ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_rt);
4652*495ae853SAndroid Build Coastguard Worker 
4653*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->u2_scaled_ref_height =
4654*495ae853SAndroid Build Coastguard Worker         (ps_dec->u2_frm_ht_in_mbs << 4) - (ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_top +
4655*495ae853SAndroid Build Coastguard Worker                                            ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_bot);
4656*495ae853SAndroid Build Coastguard Worker 
4657*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->u1_cropping_change_flag = 0;
4658*495ae853SAndroid Build Coastguard Worker     if(2 == ps_svc_lyr_dec->ps_cur_subset_sps->s_sps_svc_ext.u1_extended_spatial_scalability_idc)
4659*495ae853SAndroid Build Coastguard Worker     {
4660*495ae853SAndroid Build Coastguard Worker         ps_curr_lyr_res_prms->u1_cropping_change_flag = 1;
4661*495ae853SAndroid Build Coastguard Worker 
4662*495ae853SAndroid Build Coastguard Worker         ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_left =
4663*495ae853SAndroid Build Coastguard Worker             ps_svc_lyr_dec->s_svc_slice_params.i4_scaled_ref_layer_left_offset << 1;
4664*495ae853SAndroid Build Coastguard Worker 
4665*495ae853SAndroid Build Coastguard Worker         ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_top =
4666*495ae853SAndroid Build Coastguard Worker             ps_svc_lyr_dec->s_svc_slice_params.i4_scaled_ref_layer_top_offset << 1;
4667*495ae853SAndroid Build Coastguard Worker         ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_rt =
4668*495ae853SAndroid Build Coastguard Worker             ps_svc_lyr_dec->s_svc_slice_params.i4_scaled_ref_layer_right_offset << 1;
4669*495ae853SAndroid Build Coastguard Worker         ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_bot =
4670*495ae853SAndroid Build Coastguard Worker             ps_svc_lyr_dec->s_svc_slice_params.i4_scaled_ref_layer_bottom_offset << 1;
4671*495ae853SAndroid Build Coastguard Worker         ps_curr_lyr_res_prms->u2_scaled_ref_width =
4672*495ae853SAndroid Build Coastguard Worker             (ps_dec->u2_frm_wd_in_mbs << 4) -
4673*495ae853SAndroid Build Coastguard Worker             (ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_left +
4674*495ae853SAndroid Build Coastguard Worker              ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_rt);
4675*495ae853SAndroid Build Coastguard Worker 
4676*495ae853SAndroid Build Coastguard Worker         ps_curr_lyr_res_prms->u2_scaled_ref_height =
4677*495ae853SAndroid Build Coastguard Worker             (ps_dec->u2_frm_ht_in_mbs << 4) -
4678*495ae853SAndroid Build Coastguard Worker             (ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_top +
4679*495ae853SAndroid Build Coastguard Worker              ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_bot);
4680*495ae853SAndroid Build Coastguard Worker 
4681*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
4682*495ae853SAndroid Build Coastguard Worker     }
4683*495ae853SAndroid Build Coastguard Worker 
4684*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->u1_rstrct_res_change_flag = SVCD_TRUE;
4685*495ae853SAndroid Build Coastguard Worker 
4686*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->u1_disable_inter_lyr_dblk_filter_idc =
4687*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->s_svc_slice_params.u4_disable_inter_layer_deblk_filter_idc;
4688*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->i1_inter_lyr_alpha_c0_offset =
4689*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->s_svc_slice_params.i4_inter_layer_slice_alpha_c0_offset_div2;
4690*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->i1_inter_lyr_beta_offset =
4691*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->s_svc_slice_params.i4_inter_layer_slice_beta_offset_div2;
4692*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->i1_constrained_intra_rsmpl_flag =
4693*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->s_svc_slice_params.u1_constrained_intra_resampling_flag;
4694*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->i1_ref_lyr_chroma_phase_x_plus1_flag =
4695*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->ps_cur_subset_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_x_plus1_flag;
4696*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->i1_ref_lyr_chroma_phase_y_plus1 =
4697*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->ps_cur_subset_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_y_plus1;
4698*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->u1_direct_8x8_inference_flag =
4699*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_cur_sps->u1_direct_8x8_inference_flag;
4700*495ae853SAndroid Build Coastguard Worker 
4701*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->u1_remap_req_flag = 1;
4702*495ae853SAndroid Build Coastguard Worker     ps_curr_lyr_res_prms->u1_dyadic_flag = ps_svc_lyr_dec->u1_dyadic_flag;
4703*495ae853SAndroid Build Coastguard Worker 
4704*495ae853SAndroid Build Coastguard Worker     /* Derive the reference layer width and height */
4705*495ae853SAndroid Build Coastguard Worker 
4706*495ae853SAndroid Build Coastguard Worker     if(SVCD_TRUE != ps_svc_lyr_dec->u1_base_res_flag)
4707*495ae853SAndroid Build Coastguard Worker     {
4708*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ref_lyr_width;
4709*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ref_lyr_ht;
4710*495ae853SAndroid Build Coastguard Worker         WORD32 i4_dyadic_flag = SVCD_FALSE;
4711*495ae853SAndroid Build Coastguard Worker         i4_ref_lyr_width = ps_svc_ref_lyr_dec->s_res_prms.i4_res_width;
4712*495ae853SAndroid Build Coastguard Worker         i4_ref_lyr_ht = ps_svc_ref_lyr_dec->s_res_prms.i4_res_height;
4713*495ae853SAndroid Build Coastguard Worker 
4714*495ae853SAndroid Build Coastguard Worker         /* set the Restricted Spatial Resolution change flag */
4715*495ae853SAndroid Build Coastguard Worker         ps_curr_lyr_res_prms->u1_rstrct_res_change_flag = SVCD_TRUE;
4716*495ae853SAndroid Build Coastguard Worker 
4717*495ae853SAndroid Build Coastguard Worker         if(0 == ((ps_curr_lyr_res_prms->u2_scaled_ref_width == i4_ref_lyr_width) ||
4718*495ae853SAndroid Build Coastguard Worker                  (ps_curr_lyr_res_prms->u2_scaled_ref_width == (i4_ref_lyr_width << 1))))
4719*495ae853SAndroid Build Coastguard Worker         {
4720*495ae853SAndroid Build Coastguard Worker             ps_curr_lyr_res_prms->u1_rstrct_res_change_flag = SVCD_FALSE;
4721*495ae853SAndroid Build Coastguard Worker         }
4722*495ae853SAndroid Build Coastguard Worker 
4723*495ae853SAndroid Build Coastguard Worker         if(0 == ((ps_curr_lyr_res_prms->u2_scaled_ref_height == i4_ref_lyr_ht) ||
4724*495ae853SAndroid Build Coastguard Worker                  (ps_curr_lyr_res_prms->u2_scaled_ref_height == (i4_ref_lyr_ht << 1))))
4725*495ae853SAndroid Build Coastguard Worker         {
4726*495ae853SAndroid Build Coastguard Worker             ps_curr_lyr_res_prms->u1_rstrct_res_change_flag = SVCD_FALSE;
4727*495ae853SAndroid Build Coastguard Worker         }
4728*495ae853SAndroid Build Coastguard Worker 
4729*495ae853SAndroid Build Coastguard Worker         if(0 != (ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_left & 15))
4730*495ae853SAndroid Build Coastguard Worker         {
4731*495ae853SAndroid Build Coastguard Worker             ps_curr_lyr_res_prms->u1_rstrct_res_change_flag = SVCD_FALSE;
4732*495ae853SAndroid Build Coastguard Worker         }
4733*495ae853SAndroid Build Coastguard Worker 
4734*495ae853SAndroid Build Coastguard Worker         if(0 != (ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_top & 15))
4735*495ae853SAndroid Build Coastguard Worker         {
4736*495ae853SAndroid Build Coastguard Worker             ps_curr_lyr_res_prms->u1_rstrct_res_change_flag = SVCD_FALSE;
4737*495ae853SAndroid Build Coastguard Worker         }
4738*495ae853SAndroid Build Coastguard Worker 
4739*495ae853SAndroid Build Coastguard Worker         /* populate the dyadic status */
4740*495ae853SAndroid Build Coastguard Worker 
4741*495ae853SAndroid Build Coastguard Worker         if((ps_curr_lyr_res_prms->u2_scaled_ref_width == (i4_ref_lyr_width << 1)) &&
4742*495ae853SAndroid Build Coastguard Worker            (ps_curr_lyr_res_prms->u2_scaled_ref_height == (i4_ref_lyr_ht << 1)))
4743*495ae853SAndroid Build Coastguard Worker         {
4744*495ae853SAndroid Build Coastguard Worker             i4_dyadic_flag = SVCD_TRUE;
4745*495ae853SAndroid Build Coastguard Worker         }
4746*495ae853SAndroid Build Coastguard Worker         else if((ps_curr_lyr_res_prms->u2_scaled_ref_width != ((i4_ref_lyr_width * 3) >> 1)) ||
4747*495ae853SAndroid Build Coastguard Worker                 (ps_curr_lyr_res_prms->u2_scaled_ref_height != ((i4_ref_lyr_ht * 3) >> 1)))
4748*495ae853SAndroid Build Coastguard Worker         {
4749*495ae853SAndroid Build Coastguard Worker             ps_curr_lyr_res_prms->u1_dyadic_flag = i4_dyadic_flag;
4750*495ae853SAndroid Build Coastguard Worker             ps_svc_lyr_dec->u1_dyadic_flag = ps_curr_lyr_res_prms->u1_dyadic_flag;
4751*495ae853SAndroid Build Coastguard Worker             return NOT_OK;
4752*495ae853SAndroid Build Coastguard Worker         }
4753*495ae853SAndroid Build Coastguard Worker 
4754*495ae853SAndroid Build Coastguard Worker         /* check if cropping is MB aligned */
4755*495ae853SAndroid Build Coastguard Worker         if(SVCD_TRUE == i4_dyadic_flag)
4756*495ae853SAndroid Build Coastguard Worker         {
4757*495ae853SAndroid Build Coastguard Worker             if((0 != (ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_left & 15)) ||
4758*495ae853SAndroid Build Coastguard Worker                (0 != (ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_top & 15)))
4759*495ae853SAndroid Build Coastguard Worker             {
4760*495ae853SAndroid Build Coastguard Worker                 i4_dyadic_flag = SVCD_FALSE;
4761*495ae853SAndroid Build Coastguard Worker             }
4762*495ae853SAndroid Build Coastguard Worker         }
4763*495ae853SAndroid Build Coastguard Worker 
4764*495ae853SAndroid Build Coastguard Worker         ps_curr_lyr_res_prms->u1_dyadic_flag = i4_dyadic_flag;
4765*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->u1_dyadic_flag = ps_curr_lyr_res_prms->u1_dyadic_flag;
4766*495ae853SAndroid Build Coastguard Worker     }
4767*495ae853SAndroid Build Coastguard Worker 
4768*495ae853SAndroid Build Coastguard Worker     {
4769*495ae853SAndroid Build Coastguard Worker         inter_lyr_mb_prms_t *ps_tmp_prms, *ps_tmp_prms_2;
4770*495ae853SAndroid Build Coastguard Worker         inter_lyr_mb_prms_t *ps_ref_mb_prms;
4771*495ae853SAndroid Build Coastguard Worker         WORD32 i4_stride;
4772*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ht_in_mbs, i4_wd_in_mbs;
4773*495ae853SAndroid Build Coastguard Worker         WORD32 i4_i;
4774*495ae853SAndroid Build Coastguard Worker 
4775*495ae853SAndroid Build Coastguard Worker         /* Derive the reference mb mode map */
4776*495ae853SAndroid Build Coastguard Worker 
4777*495ae853SAndroid Build Coastguard Worker         ps_ref_mb_prms = ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start;
4778*495ae853SAndroid Build Coastguard Worker         i4_stride = ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride;
4779*495ae853SAndroid Build Coastguard Worker 
4780*495ae853SAndroid Build Coastguard Worker         i4_ht_in_mbs = ps_dec->u2_frm_ht_in_mbs;
4781*495ae853SAndroid Build Coastguard Worker         i4_wd_in_mbs = ps_dec->u2_frm_wd_in_mbs;
4782*495ae853SAndroid Build Coastguard Worker 
4783*495ae853SAndroid Build Coastguard Worker         /* Set the first border row to 0xFF */
4784*495ae853SAndroid Build Coastguard Worker         ps_tmp_prms = (ps_ref_mb_prms - 1 - i4_stride);
4785*495ae853SAndroid Build Coastguard Worker 
4786*495ae853SAndroid Build Coastguard Worker         memset(ps_svc_lyr_dec->ps_inter_lyr_mb_prms_base, -1,
4787*495ae853SAndroid Build Coastguard Worker                ps_svc_lyr_dec->u4_inter_lyr_mb_prms_size);
4788*495ae853SAndroid Build Coastguard Worker         memset(ps_svc_lyr_dec->pu1_svc_base_mode_flag, 0,
4789*495ae853SAndroid Build Coastguard Worker                ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_size);
4790*495ae853SAndroid Build Coastguard Worker 
4791*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (i4_wd_in_mbs + 2); i4_i++)
4792*495ae853SAndroid Build Coastguard Worker         {
4793*495ae853SAndroid Build Coastguard Worker             ps_tmp_prms->i1_mb_mode = (WORD8) 0xFF;
4794*495ae853SAndroid Build Coastguard Worker             ps_tmp_prms += 1;
4795*495ae853SAndroid Build Coastguard Worker         }
4796*495ae853SAndroid Build Coastguard Worker 
4797*495ae853SAndroid Build Coastguard Worker         /* Set the left and right border pixels of each row to 0 */
4798*495ae853SAndroid Build Coastguard Worker         ps_tmp_prms = ps_ref_mb_prms - 1;
4799*495ae853SAndroid Build Coastguard Worker 
4800*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < i4_ht_in_mbs; i4_i++)
4801*495ae853SAndroid Build Coastguard Worker         {
4802*495ae853SAndroid Build Coastguard Worker             ps_tmp_prms->i1_mb_mode = (WORD8) 0xFF;
4803*495ae853SAndroid Build Coastguard Worker             ps_tmp_prms_2 = ps_tmp_prms + (i4_wd_in_mbs + 1);
4804*495ae853SAndroid Build Coastguard Worker             ps_tmp_prms_2->i1_mb_mode = (WORD8) 0xFF;
4805*495ae853SAndroid Build Coastguard Worker             ps_tmp_prms += i4_stride;
4806*495ae853SAndroid Build Coastguard Worker         }
4807*495ae853SAndroid Build Coastguard Worker 
4808*495ae853SAndroid Build Coastguard Worker         /* Set the last border row to 0xFF */
4809*495ae853SAndroid Build Coastguard Worker         for(i4_i = 0; i4_i < (i4_wd_in_mbs + 2); i4_i++)
4810*495ae853SAndroid Build Coastguard Worker         {
4811*495ae853SAndroid Build Coastguard Worker             ps_tmp_prms->i1_mb_mode = (WORD8) 0xFF;
4812*495ae853SAndroid Build Coastguard Worker             ps_tmp_prms += 1;
4813*495ae853SAndroid Build Coastguard Worker         }
4814*495ae853SAndroid Build Coastguard Worker     }
4815*495ae853SAndroid Build Coastguard Worker 
4816*495ae853SAndroid Build Coastguard Worker     /* reset residual luma, chroma buffer*/
4817*495ae853SAndroid Build Coastguard Worker     memset(ps_svc_lyr_dec->pi2_il_residual_resample_luma_base, 0,
4818*495ae853SAndroid Build Coastguard Worker            ps_svc_lyr_dec->u4_residual_resample_luma_size);
4819*495ae853SAndroid Build Coastguard Worker     memset(ps_svc_lyr_dec->pi2_il_residual_resample_chroma_base, 0,
4820*495ae853SAndroid Build Coastguard Worker            ps_svc_lyr_dec->u4_residual_resample_chroma_size);
4821*495ae853SAndroid Build Coastguard Worker 
4822*495ae853SAndroid Build Coastguard Worker     return OK;
4823*495ae853SAndroid Build Coastguard Worker }
4824*495ae853SAndroid Build Coastguard Worker 
4825*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4826*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4827*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_crop_wnd_flag_res_int                               */
4828*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4829*495ae853SAndroid Build Coastguard Worker /*  Description   : This routine computes the crop window flag for entire    */
4830*495ae853SAndroid Build Coastguard Worker /*                  dependency layer and places it in the crop window flag   */
4831*495ae853SAndroid Build Coastguard Worker /*                  buffer                                                   */
4832*495ae853SAndroid Build Coastguard Worker /*  Inputs        : 1. ECD context structure                                 */
4833*495ae853SAndroid Build Coastguard Worker /*                  2. Crop offset structure                                 */
4834*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
4835*495ae853SAndroid Build Coastguard Worker /*  Processing    : For Mbs within the crop window, flag set to 1 and for    */
4836*495ae853SAndroid Build Coastguard Worker /*                  others it is set to 0                                    */
4837*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4838*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Updates crop window flag buffer                          */
4839*495ae853SAndroid Build Coastguard Worker /*  Returns       : status                                                   */
4840*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4841*495ae853SAndroid Build Coastguard Worker /*  Issues        : None                                                     */
4842*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4843*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
4844*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4845*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
4846*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay      Draft                                     */
4847*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4848*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_crop_wnd_flag_res_int(void * pv_svc_dec)4849*495ae853SAndroid Build Coastguard Worker void isvcd_crop_wnd_flag_res_int(void *pv_svc_dec)
4850*495ae853SAndroid Build Coastguard Worker {
4851*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_crop_wnd_flag;
4852*495ae853SAndroid Build Coastguard Worker     WORD32 i4_num_mbs;
4853*495ae853SAndroid Build Coastguard Worker     WORD32 i4_crop_mbs_x;
4854*495ae853SAndroid Build Coastguard Worker     WORD32 i4_crop_mbs_y;
4855*495ae853SAndroid Build Coastguard Worker     WORD32 i4_cnt;
4856*495ae853SAndroid Build Coastguard Worker     WORD32 i4_left_offset, i4_rt_offset;
4857*495ae853SAndroid Build Coastguard Worker     WORD32 i4_top_offset, i4_bot_offset;
4858*495ae853SAndroid Build Coastguard Worker     WORD32 i4_frm_wd_in_mbs;
4859*495ae853SAndroid Build Coastguard Worker     WORD32 i4_frm_ht_in_mbs;
4860*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec;
4861*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec;
4862*495ae853SAndroid Build Coastguard Worker     res_prms_t *ps_res_prms;
4863*495ae853SAndroid Build Coastguard Worker 
4864*495ae853SAndroid Build Coastguard Worker     ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) pv_svc_dec;
4865*495ae853SAndroid Build Coastguard Worker     ps_dec = &ps_svc_lyr_dec->s_dec;
4866*495ae853SAndroid Build Coastguard Worker     ps_res_prms = &ps_svc_lyr_dec->s_res_prms;
4867*495ae853SAndroid Build Coastguard Worker     i4_frm_wd_in_mbs = ps_dec->u2_frm_wd_in_mbs;
4868*495ae853SAndroid Build Coastguard Worker     i4_frm_ht_in_mbs = ps_dec->u2_frm_ht_in_mbs;
4869*495ae853SAndroid Build Coastguard Worker 
4870*495ae853SAndroid Build Coastguard Worker     /* Initializations */
4871*495ae853SAndroid Build Coastguard Worker     pu1_crop_wnd_flag = ps_svc_lyr_dec->pu1_crop_wnd_flag;
4872*495ae853SAndroid Build Coastguard Worker     i4_num_mbs = i4_frm_wd_in_mbs * i4_frm_ht_in_mbs;
4873*495ae853SAndroid Build Coastguard Worker 
4874*495ae853SAndroid Build Coastguard Worker     /* bottom most layer in a resolution */
4875*495ae853SAndroid Build Coastguard Worker     if(ps_res_prms->s_ref_lyr_scaled_offset.i2_left >= 0)
4876*495ae853SAndroid Build Coastguard Worker     {
4877*495ae853SAndroid Build Coastguard Worker         /* check for offset greater than 0 */
4878*495ae853SAndroid Build Coastguard Worker         i4_left_offset = (ps_res_prms->s_ref_lyr_scaled_offset.i2_left + 15) >> 4;
4879*495ae853SAndroid Build Coastguard Worker     }
4880*495ae853SAndroid Build Coastguard Worker     else
4881*495ae853SAndroid Build Coastguard Worker     {
4882*495ae853SAndroid Build Coastguard Worker         /* if negative set it to 0*/
4883*495ae853SAndroid Build Coastguard Worker         i4_left_offset = 0;
4884*495ae853SAndroid Build Coastguard Worker     }
4885*495ae853SAndroid Build Coastguard Worker 
4886*495ae853SAndroid Build Coastguard Worker     if(ps_res_prms->s_ref_lyr_scaled_offset.i2_rt >= 0)
4887*495ae853SAndroid Build Coastguard Worker     {
4888*495ae853SAndroid Build Coastguard Worker         /* check for offset greater than 0 */
4889*495ae853SAndroid Build Coastguard Worker         i4_rt_offset =
4890*495ae853SAndroid Build Coastguard Worker             (ps_res_prms->i4_res_width - ps_res_prms->s_ref_lyr_scaled_offset.i2_rt) >> 4;
4891*495ae853SAndroid Build Coastguard Worker     }
4892*495ae853SAndroid Build Coastguard Worker     else
4893*495ae853SAndroid Build Coastguard Worker     {
4894*495ae853SAndroid Build Coastguard Worker         /* if negative set it to framewidth in MBs */
4895*495ae853SAndroid Build Coastguard Worker         i4_rt_offset = (ps_res_prms->i4_res_width >> 4);
4896*495ae853SAndroid Build Coastguard Worker     }
4897*495ae853SAndroid Build Coastguard Worker 
4898*495ae853SAndroid Build Coastguard Worker     if(ps_res_prms->s_ref_lyr_scaled_offset.i2_top >= 0)
4899*495ae853SAndroid Build Coastguard Worker     {
4900*495ae853SAndroid Build Coastguard Worker         /* check for offset greater than 0 */
4901*495ae853SAndroid Build Coastguard Worker         i4_top_offset = (ps_res_prms->s_ref_lyr_scaled_offset.i2_top + 15) >> 4;
4902*495ae853SAndroid Build Coastguard Worker     }
4903*495ae853SAndroid Build Coastguard Worker     else
4904*495ae853SAndroid Build Coastguard Worker     {
4905*495ae853SAndroid Build Coastguard Worker         /* if negative set it to 0 */
4906*495ae853SAndroid Build Coastguard Worker         i4_top_offset = 0;
4907*495ae853SAndroid Build Coastguard Worker     }
4908*495ae853SAndroid Build Coastguard Worker 
4909*495ae853SAndroid Build Coastguard Worker     if(ps_res_prms->s_ref_lyr_scaled_offset.i2_bot >= 0)
4910*495ae853SAndroid Build Coastguard Worker     {
4911*495ae853SAndroid Build Coastguard Worker         /* check for offset greater than 0 */
4912*495ae853SAndroid Build Coastguard Worker         i4_bot_offset =
4913*495ae853SAndroid Build Coastguard Worker             (ps_res_prms->i4_res_height - ps_res_prms->s_ref_lyr_scaled_offset.i2_bot) >> 4;
4914*495ae853SAndroid Build Coastguard Worker     }
4915*495ae853SAndroid Build Coastguard Worker     else
4916*495ae853SAndroid Build Coastguard Worker     {
4917*495ae853SAndroid Build Coastguard Worker         /* if negative set it to frameheight in MBs */
4918*495ae853SAndroid Build Coastguard Worker         i4_bot_offset = (ps_res_prms->i4_res_height >> 4);
4919*495ae853SAndroid Build Coastguard Worker     }
4920*495ae853SAndroid Build Coastguard Worker 
4921*495ae853SAndroid Build Coastguard Worker     i4_crop_mbs_x = i4_rt_offset - i4_left_offset;
4922*495ae853SAndroid Build Coastguard Worker     i4_crop_mbs_y = i4_bot_offset - i4_top_offset;
4923*495ae853SAndroid Build Coastguard Worker 
4924*495ae853SAndroid Build Coastguard Worker     /* Set crop window flag to 0 for all mbs */
4925*495ae853SAndroid Build Coastguard Worker     memset(pu1_crop_wnd_flag, 0, i4_num_mbs);
4926*495ae853SAndroid Build Coastguard Worker 
4927*495ae853SAndroid Build Coastguard Worker     pu1_crop_wnd_flag += (i4_frm_wd_in_mbs * i4_top_offset);
4928*495ae853SAndroid Build Coastguard Worker     pu1_crop_wnd_flag += i4_left_offset;
4929*495ae853SAndroid Build Coastguard Worker     /* Loop over MBs in crop window */
4930*495ae853SAndroid Build Coastguard Worker     for(i4_cnt = 0; i4_cnt < i4_crop_mbs_y; i4_cnt++)
4931*495ae853SAndroid Build Coastguard Worker     {
4932*495ae853SAndroid Build Coastguard Worker         memset(pu1_crop_wnd_flag, 1, i4_crop_mbs_x);
4933*495ae853SAndroid Build Coastguard Worker         pu1_crop_wnd_flag += i4_frm_wd_in_mbs;
4934*495ae853SAndroid Build Coastguard Worker     }
4935*495ae853SAndroid Build Coastguard Worker }
4936*495ae853SAndroid Build Coastguard Worker 
4937*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4938*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4939*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_intra_resamp_res_init                                 */
4940*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4941*495ae853SAndroid Build Coastguard Worker /*  Description   : this function calculates the scale factors and initialise*/
4942*495ae853SAndroid Build Coastguard Worker /*                  the context structure                                    */
4943*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4944*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_intra_samp_ctxt: handle to private structure          */
4945*495ae853SAndroid Build Coastguard Worker /*                  ps_curr_lyr_res_prms: pointer to current resolution      */
4946*495ae853SAndroid Build Coastguard Worker /*                                               params                      */
4947*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_lyr_res_prms : pointer to ref resolution params   */
4948*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
4949*495ae853SAndroid Build Coastguard Worker /*  Processing    : it stores the layer dimensions                           */
4950*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4951*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
4952*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
4953*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4954*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
4955*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4956*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
4957*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4958*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
4959*495ae853SAndroid Build Coastguard Worker /*         26 08 2021   vijayakumar          creation                        */
4960*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4961*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_intra_resamp_res_init_update_flags(void * pv_svc_dec)4962*495ae853SAndroid Build Coastguard Worker void isvcd_intra_resamp_res_init_update_flags(void *pv_svc_dec)
4963*495ae853SAndroid Build Coastguard Worker {
4964*495ae853SAndroid Build Coastguard Worker     intra_sampling_ctxt_t *ps_ctxt;
4965*495ae853SAndroid Build Coastguard Worker     intra_samp_lyr_ctxt *ps_lyr_ctxt;
4966*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) pv_svc_dec;
4967*495ae853SAndroid Build Coastguard Worker 
4968*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (intra_sampling_ctxt_t *) ps_svc_lyr_dec->pv_intra_sample_ctxt;;
4969*495ae853SAndroid Build Coastguard Worker     /* get the current layer ctxt */
4970*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_svc_lyr_dec->u1_layer_id - 1];
4971*495ae853SAndroid Build Coastguard Worker 
4972*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->i1_constrained_intra_rsmpl_flag =
4973*495ae853SAndroid Build Coastguard Worker         ps_svc_lyr_dec->s_svc_slice_params.u1_constrained_intra_resampling_flag;
4974*495ae853SAndroid Build Coastguard Worker }
4975*495ae853SAndroid Build Coastguard Worker 
4976*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4977*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4978*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_intra_resamp_res_init                                 */
4979*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4980*495ae853SAndroid Build Coastguard Worker /*  Description   : this function calculates the scale factors and initialise*/
4981*495ae853SAndroid Build Coastguard Worker /*                  the context structure                                    */
4982*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4983*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_intra_samp_ctxt: handle to private structure          */
4984*495ae853SAndroid Build Coastguard Worker /*                  ps_curr_lyr_res_prms: pointer to current resolution      */
4985*495ae853SAndroid Build Coastguard Worker /*                                               params                      */
4986*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_lyr_res_prms : pointer to ref resolution params   */
4987*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
4988*495ae853SAndroid Build Coastguard Worker /*  Processing    : it stores the layer dimensions                           */
4989*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4990*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
4991*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
4992*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4993*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
4994*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4995*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
4996*495ae853SAndroid Build Coastguard Worker /*                                                                           */
4997*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
4998*495ae853SAndroid Build Coastguard Worker /*         26 08 2021   vijayakumar          creation                        */
4999*495ae853SAndroid Build Coastguard Worker /*                                                                           */
5000*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_intra_resamp_res_init(void * pv_svc_dec)5001*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_intra_resamp_res_init(void *pv_svc_dec)
5002*495ae853SAndroid Build Coastguard Worker {
5003*495ae853SAndroid Build Coastguard Worker     intra_sampling_ctxt_t *ps_ctxt;
5004*495ae853SAndroid Build Coastguard Worker     intra_samp_lyr_ctxt *ps_lyr_ctxt;
5005*495ae853SAndroid Build Coastguard Worker     dec_svc_seq_params_t *ps_cur_subset_sps;
5006*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) pv_svc_dec;
5007*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
5008*495ae853SAndroid Build Coastguard Worker     dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
5009*495ae853SAndroid Build Coastguard Worker 
5010*495ae853SAndroid Build Coastguard Worker     void *pv_intra_samp_ctxt = ps_svc_lyr_dec->pv_intra_sample_ctxt;
5011*495ae853SAndroid Build Coastguard Worker     res_prms_t *ps_curr_lyr_res_prms = &ps_svc_lyr_dec->s_res_prms;
5012*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t **pps_luma_map_horz = &ps_svc_lyr_dec->ps_intsam_luma_map_horz;
5013*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t **pps_chroma_map_horz = &ps_svc_lyr_dec->ps_intsam_chroma_map_horz;
5014*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t **pps_luma_map_vert = &ps_svc_lyr_dec->ps_intsam_luma_map_vert;
5015*495ae853SAndroid Build Coastguard Worker     ref_mb_map_t **pps_chroma_map_vert = &ps_svc_lyr_dec->ps_intsam_chroma_map_vert;
5016*495ae853SAndroid Build Coastguard Worker 
5017*495ae853SAndroid Build Coastguard Worker     ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
5018*495ae853SAndroid Build Coastguard Worker     ps_cur_subset_sps = ps_svc_lyr_dec->ps_cur_subset_sps;
5019*495ae853SAndroid Build Coastguard Worker 
5020*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (intra_sampling_ctxt_t *) pv_intra_samp_ctxt;
5021*495ae853SAndroid Build Coastguard Worker 
5022*495ae853SAndroid Build Coastguard Worker     /* if called for base resolution store default values */
5023*495ae853SAndroid Build Coastguard Worker     if(SVCD_TRUE == ps_svc_lyr_dec->u1_base_res_flag)
5024*495ae853SAndroid Build Coastguard Worker     {
5025*495ae853SAndroid Build Coastguard Worker         *pps_luma_map_horz = NULL;
5026*495ae853SAndroid Build Coastguard Worker         *pps_chroma_map_horz = NULL;
5027*495ae853SAndroid Build Coastguard Worker         *pps_luma_map_vert = NULL;
5028*495ae853SAndroid Build Coastguard Worker         *pps_chroma_map_vert = NULL;
5029*495ae853SAndroid Build Coastguard Worker         ps_ctxt->i4_res_lyr_id = -1;
5030*495ae853SAndroid Build Coastguard Worker         ps_ctxt->i4_ref_width = ps_dec->u2_pic_wd;
5031*495ae853SAndroid Build Coastguard Worker         ps_ctxt->i4_ref_height = ps_dec->u2_pic_ht;
5032*495ae853SAndroid Build Coastguard Worker 
5033*495ae853SAndroid Build Coastguard Worker         /* Note: The stride option is provided for bringing in data at NMB */
5034*495ae853SAndroid Build Coastguard Worker         /* level. Hence to set a NMB level stride refSample array buffer   */
5035*495ae853SAndroid Build Coastguard Worker         /* have to be increased                                            */
5036*495ae853SAndroid Build Coastguard Worker         ps_ctxt->i4_refarray_stride = REF_ARRAY_WIDTH;
5037*495ae853SAndroid Build Coastguard Worker         return OK;
5038*495ae853SAndroid Build Coastguard Worker     }
5039*495ae853SAndroid Build Coastguard Worker 
5040*495ae853SAndroid Build Coastguard Worker     /* derive the current sps */
5041*495ae853SAndroid Build Coastguard Worker     /* store the res id appropriately */
5042*495ae853SAndroid Build Coastguard Worker     ps_ctxt->i4_res_lyr_id = ps_svc_lyr_dec->u1_layer_id - 1;
5043*495ae853SAndroid Build Coastguard Worker 
5044*495ae853SAndroid Build Coastguard Worker     /* store the resolution params */
5045*495ae853SAndroid Build Coastguard Worker     ps_ctxt->ps_res_prms = ps_curr_lyr_res_prms;
5046*495ae853SAndroid Build Coastguard Worker 
5047*495ae853SAndroid Build Coastguard Worker     /* get the current layer ctxt */
5048*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_svc_lyr_dec->u1_layer_id - 1];
5049*495ae853SAndroid Build Coastguard Worker 
5050*495ae853SAndroid Build Coastguard Worker     ps_ctxt->i4_res_lyr_id = ps_svc_lyr_dec->u1_layer_id - 1;
5051*495ae853SAndroid Build Coastguard Worker     /* get the width and heights */
5052*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->i4_curr_width = ps_dec->u2_pic_wd;
5053*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->i4_curr_height = ps_dec->u2_pic_ht;
5054*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->i4_ref_width = ps_ctxt->i4_ref_width;
5055*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->i4_ref_height = ps_ctxt->i4_ref_height;
5056*495ae853SAndroid Build Coastguard Worker     ps_lyr_ctxt->i1_constrained_intra_rsmpl_flag =
5057*495ae853SAndroid Build Coastguard Worker         ps_svc_slice_params->u1_constrained_intra_resampling_flag;
5058*495ae853SAndroid Build Coastguard Worker 
5059*495ae853SAndroid Build Coastguard Worker     /* store the structure pointer containing projected locations */
5060*495ae853SAndroid Build Coastguard Worker     *pps_luma_map_horz = ps_lyr_ctxt->s_luma_map_ctxt.ps_x_offset_length;
5061*495ae853SAndroid Build Coastguard Worker     *pps_chroma_map_horz = ps_lyr_ctxt->s_chroma_map_ctxt.ps_x_offset_length;
5062*495ae853SAndroid Build Coastguard Worker     *pps_luma_map_vert = ps_lyr_ctxt->s_luma_map_ctxt.ps_y_offset_length;
5063*495ae853SAndroid Build Coastguard Worker     *pps_chroma_map_vert = ps_lyr_ctxt->s_chroma_map_ctxt.ps_y_offset_length;
5064*495ae853SAndroid Build Coastguard Worker 
5065*495ae853SAndroid Build Coastguard Worker     /* check for recomputation of mapping required */
5066*495ae853SAndroid Build Coastguard Worker     if(SVCD_TRUE == ps_curr_lyr_res_prms->u1_remap_req_flag)
5067*495ae853SAndroid Build Coastguard Worker     {
5068*495ae853SAndroid Build Coastguard Worker         res_prms_t s_ref_res_prms = {0};
5069*495ae853SAndroid Build Coastguard Worker         WORD32 i4_chroma_x_phase, i4_chroma_y_phase;
5070*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ref_chroma_x_phase, i4_ref_chroma_y_phase;
5071*495ae853SAndroid Build Coastguard Worker         WORD32 i4_x_phase_0, i4_x_phase_1;
5072*495ae853SAndroid Build Coastguard Worker         WORD32 i4_y_phase_0, i4_y_phase_1;
5073*495ae853SAndroid Build Coastguard Worker         WORD32 i4_vert_flag;
5074*495ae853SAndroid Build Coastguard Worker 
5075*495ae853SAndroid Build Coastguard Worker         /* store the reference layer resolution width and height */
5076*495ae853SAndroid Build Coastguard Worker         s_ref_res_prms.i4_res_width = ps_ctxt->i4_ref_width;
5077*495ae853SAndroid Build Coastguard Worker         s_ref_res_prms.i4_res_height = ps_ctxt->i4_ref_height;
5078*495ae853SAndroid Build Coastguard Worker 
5079*495ae853SAndroid Build Coastguard Worker         /* call the frame level projections calculation function */
5080*495ae853SAndroid Build Coastguard Worker         isvcd_intra_resamp_populate_list(&ps_lyr_ctxt->s_luma_map_ctxt, ps_curr_lyr_res_prms,
5081*495ae853SAndroid Build Coastguard Worker                                          &s_ref_res_prms, 0, ps_svc_lyr_dec);
5082*495ae853SAndroid Build Coastguard Worker 
5083*495ae853SAndroid Build Coastguard Worker         isvcd_intra_resamp_populate_list(&ps_lyr_ctxt->s_chroma_map_ctxt, ps_curr_lyr_res_prms,
5084*495ae853SAndroid Build Coastguard Worker                                          &s_ref_res_prms, 1, ps_svc_lyr_dec);
5085*495ae853SAndroid Build Coastguard Worker 
5086*495ae853SAndroid Build Coastguard Worker         /* Compute the chroma xPhase and yPhase values */
5087*495ae853SAndroid Build Coastguard Worker         if(1 == ps_curr_lyr_res_prms->u1_dyadic_flag)
5088*495ae853SAndroid Build Coastguard Worker         {
5089*495ae853SAndroid Build Coastguard Worker             i4_ref_chroma_x_phase = ps_curr_lyr_res_prms->i1_ref_lyr_chroma_phase_x_plus1_flag;
5090*495ae853SAndroid Build Coastguard Worker             i4_ref_chroma_y_phase = ps_curr_lyr_res_prms->i1_ref_lyr_chroma_phase_y_plus1;
5091*495ae853SAndroid Build Coastguard Worker             i4_chroma_x_phase = ps_cur_subset_sps->s_sps_svc_ext.u1_chroma_phase_x_plus1_flag;
5092*495ae853SAndroid Build Coastguard Worker             i4_chroma_y_phase = ps_cur_subset_sps->s_sps_svc_ext.u1_chroma_phase_y_plus1;
5093*495ae853SAndroid Build Coastguard Worker 
5094*495ae853SAndroid Build Coastguard Worker             i4_x_phase_0 = i4_chroma_x_phase - (i4_ref_chroma_x_phase << 1);
5095*495ae853SAndroid Build Coastguard Worker             i4_x_phase_1 = (3 + i4_x_phase_0) & 0x7;
5096*495ae853SAndroid Build Coastguard Worker             i4_x_phase_0 += 7;
5097*495ae853SAndroid Build Coastguard Worker             i4_x_phase_0 &= 0x7;
5098*495ae853SAndroid Build Coastguard Worker             i4_y_phase_0 = i4_chroma_y_phase - (i4_ref_chroma_y_phase << 1);
5099*495ae853SAndroid Build Coastguard Worker             i4_y_phase_1 = (3 + i4_y_phase_0) & 0x7;
5100*495ae853SAndroid Build Coastguard Worker             i4_y_phase_0 += 7;
5101*495ae853SAndroid Build Coastguard Worker             i4_y_phase_0 &= 0x7;
5102*495ae853SAndroid Build Coastguard Worker 
5103*495ae853SAndroid Build Coastguard Worker             ps_lyr_ctxt->i4_x_phase_0 = i4_x_phase_0;
5104*495ae853SAndroid Build Coastguard Worker             ps_lyr_ctxt->i4_x_phase_1 = i4_x_phase_1;
5105*495ae853SAndroid Build Coastguard Worker             ps_lyr_ctxt->i4_y_phase_0 = i4_y_phase_0;
5106*495ae853SAndroid Build Coastguard Worker             ps_lyr_ctxt->i4_y_phase_1 = i4_y_phase_1;
5107*495ae853SAndroid Build Coastguard Worker 
5108*495ae853SAndroid Build Coastguard Worker             /* Choose the appropriate chroma interpolation functions */
5109*495ae853SAndroid Build Coastguard Worker             if((0 == i4_ref_chroma_x_phase) && (1 == i4_chroma_x_phase))
5110*495ae853SAndroid Build Coastguard Worker             {
5111*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt->pf_horz_chroma_interpol = ps_ctxt->pf_horz_chroma_interpol[1];
5112*495ae853SAndroid Build Coastguard Worker             }
5113*495ae853SAndroid Build Coastguard Worker             else
5114*495ae853SAndroid Build Coastguard Worker             {
5115*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt->pf_horz_chroma_interpol = ps_ctxt->pf_horz_chroma_interpol[0];
5116*495ae853SAndroid Build Coastguard Worker             }
5117*495ae853SAndroid Build Coastguard Worker 
5118*495ae853SAndroid Build Coastguard Worker             i4_vert_flag = 0;
5119*495ae853SAndroid Build Coastguard Worker             if(0 == i4_ref_chroma_y_phase)
5120*495ae853SAndroid Build Coastguard Worker             {
5121*495ae853SAndroid Build Coastguard Worker                 if((1 == i4_chroma_y_phase) || (2 == i4_chroma_y_phase))
5122*495ae853SAndroid Build Coastguard Worker                 {
5123*495ae853SAndroid Build Coastguard Worker                     i4_vert_flag = 1;
5124*495ae853SAndroid Build Coastguard Worker                 }
5125*495ae853SAndroid Build Coastguard Worker             }
5126*495ae853SAndroid Build Coastguard Worker             else if((2 == i4_ref_chroma_y_phase) && (0 == i4_chroma_y_phase))
5127*495ae853SAndroid Build Coastguard Worker             {
5128*495ae853SAndroid Build Coastguard Worker                 i4_vert_flag = 2;
5129*495ae853SAndroid Build Coastguard Worker             }
5130*495ae853SAndroid Build Coastguard Worker 
5131*495ae853SAndroid Build Coastguard Worker             if(1 == i4_vert_flag)
5132*495ae853SAndroid Build Coastguard Worker             {
5133*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt->pf_vert_chroma_interpol = ps_ctxt->pf_vert_chroma_interpol[1];
5134*495ae853SAndroid Build Coastguard Worker             }
5135*495ae853SAndroid Build Coastguard Worker             else if(2 == i4_vert_flag)
5136*495ae853SAndroid Build Coastguard Worker             {
5137*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt->pf_vert_chroma_interpol = ps_ctxt->pf_vert_chroma_interpol[2];
5138*495ae853SAndroid Build Coastguard Worker             }
5139*495ae853SAndroid Build Coastguard Worker             else
5140*495ae853SAndroid Build Coastguard Worker             {
5141*495ae853SAndroid Build Coastguard Worker                 ps_lyr_ctxt->pf_vert_chroma_interpol = ps_ctxt->pf_vert_chroma_interpol[0];
5142*495ae853SAndroid Build Coastguard Worker             }
5143*495ae853SAndroid Build Coastguard Worker         }
5144*495ae853SAndroid Build Coastguard Worker     }
5145*495ae853SAndroid Build Coastguard Worker     else
5146*495ae853SAndroid Build Coastguard Worker     {
5147*495ae853SAndroid Build Coastguard Worker         /* should take false value */
5148*495ae853SAndroid Build Coastguard Worker         if(SVCD_FALSE != ps_curr_lyr_res_prms->u1_remap_req_flag)
5149*495ae853SAndroid Build Coastguard Worker         {
5150*495ae853SAndroid Build Coastguard Worker             return NOT_OK;
5151*495ae853SAndroid Build Coastguard Worker         }
5152*495ae853SAndroid Build Coastguard Worker     }
5153*495ae853SAndroid Build Coastguard Worker 
5154*495ae853SAndroid Build Coastguard Worker     /* store the current layer width and height to context */
5155*495ae853SAndroid Build Coastguard Worker     ps_ctxt->i4_ref_width = ps_curr_lyr_res_prms->i4_res_width;
5156*495ae853SAndroid Build Coastguard Worker     ps_ctxt->i4_ref_height = ps_curr_lyr_res_prms->i4_res_height;
5157*495ae853SAndroid Build Coastguard Worker 
5158*495ae853SAndroid Build Coastguard Worker     return OK;
5159*495ae853SAndroid Build Coastguard Worker }