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 }