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 *******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker * isvce_ibl_eval.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker * Contains functions used for SVC intra prediction
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker *******************************************************************************
30*495ae853SAndroid Build Coastguard Worker */
31*495ae853SAndroid Build Coastguard Worker #include <math.h>
32*495ae853SAndroid Build Coastguard Worker #include <limits.h>
33*495ae853SAndroid Build Coastguard Worker #include <stdbool.h>
34*495ae853SAndroid Build Coastguard Worker
35*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
36*495ae853SAndroid Build Coastguard Worker #include "iv2.h"
37*495ae853SAndroid Build Coastguard Worker #include "isvc_macros.h"
38*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
39*495ae853SAndroid Build Coastguard Worker #include "ih264_padding.h"
40*495ae853SAndroid Build Coastguard Worker #include "isvce_defs.h"
41*495ae853SAndroid Build Coastguard Worker #include "isvce_ibl_private_defs.h"
42*495ae853SAndroid Build Coastguard Worker #include "isvce_ibl_eval.h"
43*495ae853SAndroid Build Coastguard Worker #include "isvce_utils.h"
44*495ae853SAndroid Build Coastguard Worker #include "isvc_intra_resample.h"
45*495ae853SAndroid Build Coastguard Worker #include "isvc_defs.h"
46*495ae853SAndroid Build Coastguard Worker
isvce_get_num_mb_states(UWORD32 u4_wd,UWORD32 u4_ht)47*495ae853SAndroid Build Coastguard Worker static FORCEINLINE WORD32 isvce_get_num_mb_states(UWORD32 u4_wd, UWORD32 u4_ht)
48*495ae853SAndroid Build Coastguard Worker {
49*495ae853SAndroid Build Coastguard Worker return (u4_wd / MB_SIZE) * (u4_ht / MB_SIZE);
50*495ae853SAndroid Build Coastguard Worker }
51*495ae853SAndroid Build Coastguard Worker
isvce_get_phase_array_size(DOUBLE d_spatial_res_ratio,bool b_is_chroma)52*495ae853SAndroid Build Coastguard Worker static FORCEINLINE WORD32 isvce_get_phase_array_size(DOUBLE d_spatial_res_ratio, bool b_is_chroma)
53*495ae853SAndroid Build Coastguard Worker {
54*495ae853SAndroid Build Coastguard Worker return (2 == d_spatial_res_ratio) ? (b_is_chroma ? 3 : 0) : 5;
55*495ae853SAndroid Build Coastguard Worker }
56*495ae853SAndroid Build Coastguard Worker
57*495ae853SAndroid Build Coastguard Worker /**
58*495ae853SAndroid Build Coastguard Worker *******************************************************************************
59*495ae853SAndroid Build Coastguard Worker *
60*495ae853SAndroid Build Coastguard Worker * @brief
61*495ae853SAndroid Build Coastguard Worker * Returns size of buffers for storing residual pred ctxt
62*495ae853SAndroid Build Coastguard Worker *
63*495ae853SAndroid Build Coastguard Worker * @param[in] u1_num_spatial_layers
64*495ae853SAndroid Build Coastguard Worker * Num Spatial Layers
65*495ae853SAndroid Build Coastguard Worker *
66*495ae853SAndroid Build Coastguard Worker * @param[in] d_spatial_res_ratio
67*495ae853SAndroid Build Coastguard Worker * Resolution Ratio b/w spatial layers
68*495ae853SAndroid Build Coastguard Worker *
69*495ae853SAndroid Build Coastguard Worker * @param[in] u4_wd
70*495ae853SAndroid Build Coastguard Worker * Input Width
71*495ae853SAndroid Build Coastguard Worker *
72*495ae853SAndroid Build Coastguard Worker * @param[in] u4_ht
73*495ae853SAndroid Build Coastguard Worker * Input Height
74*495ae853SAndroid Build Coastguard Worker *
75*495ae853SAndroid Build Coastguard Worker * @returns Size of buffers
76*495ae853SAndroid Build Coastguard Worker *
77*495ae853SAndroid Build Coastguard Worker *******************************************************************************
78*495ae853SAndroid Build Coastguard Worker */
isvce_get_svc_intra_pred_ctxt_size(UWORD8 u1_num_spatial_layers,DOUBLE d_spatial_res_ratio,UWORD32 u4_wd,UWORD32 u4_ht)79*495ae853SAndroid Build Coastguard Worker UWORD32 isvce_get_svc_intra_pred_ctxt_size(UWORD8 u1_num_spatial_layers, DOUBLE d_spatial_res_ratio,
80*495ae853SAndroid Build Coastguard Worker UWORD32 u4_wd, UWORD32 u4_ht)
81*495ae853SAndroid Build Coastguard Worker {
82*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
83*495ae853SAndroid Build Coastguard Worker
84*495ae853SAndroid Build Coastguard Worker UWORD32 u4_size = 0;
85*495ae853SAndroid Build Coastguard Worker
86*495ae853SAndroid Build Coastguard Worker if(u1_num_spatial_layers > 1)
87*495ae853SAndroid Build Coastguard Worker {
88*495ae853SAndroid Build Coastguard Worker u4_size += MAX_PROCESS_CTXT * sizeof(svc_intra_pred_ctxt_t);
89*495ae853SAndroid Build Coastguard Worker u4_size += MAX_PROCESS_CTXT * sizeof(intra_pred_state_t);
90*495ae853SAndroid Build Coastguard Worker u4_size += MAX_PROCESS_CTXT * u1_num_spatial_layers * sizeof(intra_pred_layer_state_t);
91*495ae853SAndroid Build Coastguard Worker
92*495ae853SAndroid Build Coastguard Worker for(i = u1_num_spatial_layers - 1; i >= 0; i--)
93*495ae853SAndroid Build Coastguard Worker {
94*495ae853SAndroid Build Coastguard Worker WORD32 i4_layer_luma_wd =
95*495ae853SAndroid Build Coastguard Worker (WORD32) ((DOUBLE) u4_wd /
96*495ae853SAndroid Build Coastguard Worker pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) +
97*495ae853SAndroid Build Coastguard Worker 0.99;
98*495ae853SAndroid Build Coastguard Worker WORD32 i4_layer_luma_ht =
99*495ae853SAndroid Build Coastguard Worker ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) + 0.99;
100*495ae853SAndroid Build Coastguard Worker WORD32 i4_layer_wd_mbs = i4_layer_luma_wd / MB_SIZE;
101*495ae853SAndroid Build Coastguard Worker WORD32 i4_layer_ht_mbs = i4_layer_luma_ht / MB_SIZE;
102*495ae853SAndroid Build Coastguard Worker /*Add PAD Mbs */
103*495ae853SAndroid Build Coastguard Worker WORD32 i4_layer_luma_mbs =
104*495ae853SAndroid Build Coastguard Worker ((i4_layer_luma_wd / MB_SIZE) + 2) * ((i4_layer_luma_ht / MB_SIZE) + 2);
105*495ae853SAndroid Build Coastguard Worker WORD32 i4_num_mb_states = isvce_get_num_mb_states(i4_layer_luma_wd, i4_layer_luma_ht);
106*495ae853SAndroid Build Coastguard Worker
107*495ae853SAndroid Build Coastguard Worker for(j = 0; j < NUM_SP_COMPONENTS; j++)
108*495ae853SAndroid Build Coastguard Worker {
109*495ae853SAndroid Build Coastguard Worker bool b_is_chroma = ((COMPONENT_TYPE) j) != Y;
110*495ae853SAndroid Build Coastguard Worker
111*495ae853SAndroid Build Coastguard Worker u4_size += i4_num_mb_states * sizeof(intra_pred_mb_state_t);
112*495ae853SAndroid Build Coastguard Worker
113*495ae853SAndroid Build Coastguard Worker /* pi4_ref_array_positions_x */
114*495ae853SAndroid Build Coastguard Worker u4_size += MAX_REF_ARR_WD_HT * i4_layer_wd_mbs * sizeof(WORD32);
115*495ae853SAndroid Build Coastguard Worker
116*495ae853SAndroid Build Coastguard Worker /* pi4_ref_array_positions_y */
117*495ae853SAndroid Build Coastguard Worker u4_size += (i4_layer_ht_mbs >> b_is_chroma) * i4_layer_ht_mbs * sizeof(WORD32);
118*495ae853SAndroid Build Coastguard Worker
119*495ae853SAndroid Build Coastguard Worker /* ps_ref_array_phases */
120*495ae853SAndroid Build Coastguard Worker u4_size += isvce_get_phase_array_size(d_spatial_res_ratio, b_is_chroma) *
121*495ae853SAndroid Build Coastguard Worker sizeof(coordinates_t);
122*495ae853SAndroid Build Coastguard Worker }
123*495ae853SAndroid Build Coastguard Worker
124*495ae853SAndroid Build Coastguard Worker /* pi1_mb_mode */
125*495ae853SAndroid Build Coastguard Worker u4_size += i4_layer_luma_mbs * sizeof(WORD8);
126*495ae853SAndroid Build Coastguard Worker
127*495ae853SAndroid Build Coastguard Worker /* pu1_refarray_buffer */
128*495ae853SAndroid Build Coastguard Worker u4_size += MAX_PROCESS_CTXT * TEMP_BUF_SIZE_LUMA * sizeof(UWORD8);
129*495ae853SAndroid Build Coastguard Worker
130*495ae853SAndroid Build Coastguard Worker /* pu1_refarray_cb, pu1_refarray_cr */
131*495ae853SAndroid Build Coastguard Worker u4_size += MAX_PROCESS_CTXT * (TEMP_BUF_SIZE_CB + TEMP_BUF_SIZE_CR) * sizeof(UWORD8);
132*495ae853SAndroid Build Coastguard Worker
133*495ae853SAndroid Build Coastguard Worker /* pi4_temp_interpolation_buffer */
134*495ae853SAndroid Build Coastguard Worker u4_size += MAX_PROCESS_CTXT * TEMP_INTERPOLATION_BUF_SIZE * sizeof(WORD32);
135*495ae853SAndroid Build Coastguard Worker }
136*495ae853SAndroid Build Coastguard Worker
137*495ae853SAndroid Build Coastguard Worker /* intra_pred_outputs_t.s_pred_buf */
138*495ae853SAndroid Build Coastguard Worker u4_size += MAX_PROCESS_CTXT * MB_SIZE * MB_SIZE * sizeof(UWORD8);
139*495ae853SAndroid Build Coastguard Worker
140*495ae853SAndroid Build Coastguard Worker u4_size += MAX_PROCESS_CTXT * MB_SIZE * MB_SIZE * sizeof(UWORD8);
141*495ae853SAndroid Build Coastguard Worker }
142*495ae853SAndroid Build Coastguard Worker
143*495ae853SAndroid Build Coastguard Worker return u4_size;
144*495ae853SAndroid Build Coastguard Worker }
145*495ae853SAndroid Build Coastguard Worker
isvce_get_scaled_pixel_pos(layer_resampler_props_t * ps_layer_props,WORD32 i4_pixel_pos,UWORD8 u1_dim_id)146*495ae853SAndroid Build Coastguard Worker static FORCEINLINE WORD32 isvce_get_scaled_pixel_pos(layer_resampler_props_t *ps_layer_props,
147*495ae853SAndroid Build Coastguard Worker WORD32 i4_pixel_pos, UWORD8 u1_dim_id)
148*495ae853SAndroid Build Coastguard Worker {
149*495ae853SAndroid Build Coastguard Worker if(1 == u1_dim_id)
150*495ae853SAndroid Build Coastguard Worker {
151*495ae853SAndroid Build Coastguard Worker return (((i4_pixel_pos - ps_layer_props->i4_offset_y) *
152*495ae853SAndroid Build Coastguard Worker ((WORD64) ps_layer_props->u4_scale_y) +
153*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_add_y) >>
154*495ae853SAndroid Build Coastguard Worker (ps_layer_props->u4_shift_y - 4)) -
155*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_delta_y;
156*495ae853SAndroid Build Coastguard Worker }
157*495ae853SAndroid Build Coastguard Worker else
158*495ae853SAndroid Build Coastguard Worker {
159*495ae853SAndroid Build Coastguard Worker return (((i4_pixel_pos - ps_layer_props->i4_offset_x) *
160*495ae853SAndroid Build Coastguard Worker ((WORD64) ps_layer_props->u4_scale_x) +
161*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_add_x) >>
162*495ae853SAndroid Build Coastguard Worker (ps_layer_props->u4_shift_x - 4)) -
163*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_delta_x;
164*495ae853SAndroid Build Coastguard Worker }
165*495ae853SAndroid Build Coastguard Worker }
166*495ae853SAndroid Build Coastguard Worker
isvce_ref_array_pos_init(layer_resampler_props_t * ps_layer_props,intra_pred_mb_state_t * ps_mb_state,coordinates_t * ps_mb_pos,DOUBLE d_spatial_res_ratio,UWORD8 u1_frame_mbs_only_flag,UWORD8 u1_field_mb_flag,UWORD8 u1_ref_layer_frame_mbs_only_flag)167*495ae853SAndroid Build Coastguard Worker static FORCEINLINE void isvce_ref_array_pos_init(
168*495ae853SAndroid Build Coastguard Worker layer_resampler_props_t *ps_layer_props, intra_pred_mb_state_t *ps_mb_state,
169*495ae853SAndroid Build Coastguard Worker coordinates_t *ps_mb_pos, DOUBLE d_spatial_res_ratio, UWORD8 u1_frame_mbs_only_flag,
170*495ae853SAndroid Build Coastguard Worker UWORD8 u1_field_mb_flag, UWORD8 u1_ref_layer_frame_mbs_only_flag)
171*495ae853SAndroid Build Coastguard Worker {
172*495ae853SAndroid Build Coastguard Worker if(1.5 == d_spatial_res_ratio)
173*495ae853SAndroid Build Coastguard Worker {
174*495ae853SAndroid Build Coastguard Worker UWORD32 i;
175*495ae853SAndroid Build Coastguard Worker
176*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_ref_array_positions_x = ps_mb_state->pi4_ref_array_positions_x;
177*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_ref_array_positions_y = ps_mb_state->pi4_ref_array_positions_y;
178*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_offset = ps_mb_state->s_offsets.i4_abscissa;
179*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_offset = ps_mb_state->s_offsets.i4_ordinate;
180*495ae853SAndroid Build Coastguard Worker
181*495ae853SAndroid Build Coastguard Worker if(0 == ps_mb_pos->i4_abscissa)
182*495ae853SAndroid Build Coastguard Worker {
183*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_layer_props->u4_mb_ht; i++)
184*495ae853SAndroid Build Coastguard Worker {
185*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_ref16;
186*495ae853SAndroid Build Coastguard Worker
187*495ae853SAndroid Build Coastguard Worker WORD32 i4_yc = ps_mb_pos->i4_ordinate * ps_layer_props->u4_mb_ht + i;
188*495ae853SAndroid Build Coastguard Worker
189*495ae853SAndroid Build Coastguard Worker if((0 == u1_frame_mbs_only_flag) || (0 == u1_ref_layer_frame_mbs_only_flag))
190*495ae853SAndroid Build Coastguard Worker {
191*495ae853SAndroid Build Coastguard Worker i4_yc = i4_yc >> (1 - u1_field_mb_flag);
192*495ae853SAndroid Build Coastguard Worker }
193*495ae853SAndroid Build Coastguard Worker
194*495ae853SAndroid Build Coastguard Worker i4_y_ref16 = isvce_get_scaled_pixel_pos(ps_layer_props, i4_yc, 1);
195*495ae853SAndroid Build Coastguard Worker
196*495ae853SAndroid Build Coastguard Worker pi4_ref_array_positions_y[i] = (i4_y_ref16 >> 4) - i4_y_offset;
197*495ae853SAndroid Build Coastguard Worker }
198*495ae853SAndroid Build Coastguard Worker }
199*495ae853SAndroid Build Coastguard Worker
200*495ae853SAndroid Build Coastguard Worker if(0 == ps_mb_pos->i4_ordinate)
201*495ae853SAndroid Build Coastguard Worker {
202*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_REF_ARR_WD_HT; i++)
203*495ae853SAndroid Build Coastguard Worker {
204*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_ref16;
205*495ae853SAndroid Build Coastguard Worker
206*495ae853SAndroid Build Coastguard Worker WORD32 i4_xc = ps_mb_pos->i4_abscissa * ps_layer_props->u4_mb_wd + i;
207*495ae853SAndroid Build Coastguard Worker
208*495ae853SAndroid Build Coastguard Worker i4_x_ref16 = isvce_get_scaled_pixel_pos(ps_layer_props, i4_xc, 0);
209*495ae853SAndroid Build Coastguard Worker
210*495ae853SAndroid Build Coastguard Worker pi4_ref_array_positions_x[i] = (i4_x_ref16 >> 4) - i4_x_offset;
211*495ae853SAndroid Build Coastguard Worker }
212*495ae853SAndroid Build Coastguard Worker }
213*495ae853SAndroid Build Coastguard Worker }
214*495ae853SAndroid Build Coastguard Worker }
215*495ae853SAndroid Build Coastguard Worker
isvce_ref_array_phase_init(layer_resampler_props_t * ps_layer_props,intra_pred_mb_state_t * ps_mb_state,coordinates_t * ps_mb_pos,DOUBLE d_spatial_res_ratio,UWORD8 u1_frame_mbs_only_flag,UWORD8 u1_field_mb_flag,UWORD8 u1_ref_layer_frame_mbs_only_flag)216*495ae853SAndroid Build Coastguard Worker static FORCEINLINE void isvce_ref_array_phase_init(
217*495ae853SAndroid Build Coastguard Worker layer_resampler_props_t *ps_layer_props, intra_pred_mb_state_t *ps_mb_state,
218*495ae853SAndroid Build Coastguard Worker coordinates_t *ps_mb_pos, DOUBLE d_spatial_res_ratio, UWORD8 u1_frame_mbs_only_flag,
219*495ae853SAndroid Build Coastguard Worker UWORD8 u1_field_mb_flag, UWORD8 u1_ref_layer_frame_mbs_only_flag)
220*495ae853SAndroid Build Coastguard Worker {
221*495ae853SAndroid Build Coastguard Worker UWORD32 i, j;
222*495ae853SAndroid Build Coastguard Worker
223*495ae853SAndroid Build Coastguard Worker coordinates_t *ps_ref_array_phases = ps_mb_state->ps_ref_array_phases;
224*495ae853SAndroid Build Coastguard Worker
225*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_offset = ps_mb_state->s_offsets.i4_abscissa;
226*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_offset = ps_mb_state->s_offsets.i4_ordinate;
227*495ae853SAndroid Build Coastguard Worker UWORD32 u4_phase_array_idx = 0;
228*495ae853SAndroid Build Coastguard Worker
229*495ae853SAndroid Build Coastguard Worker if(1.5 == d_spatial_res_ratio)
230*495ae853SAndroid Build Coastguard Worker {
231*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 3; i++)
232*495ae853SAndroid Build Coastguard Worker {
233*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_ref16;
234*495ae853SAndroid Build Coastguard Worker
235*495ae853SAndroid Build Coastguard Worker WORD32 i4_yc = ps_mb_pos->i4_ordinate * ps_layer_props->u4_mb_ht + i;
236*495ae853SAndroid Build Coastguard Worker
237*495ae853SAndroid Build Coastguard Worker if((0 == u1_frame_mbs_only_flag) || (0 == u1_ref_layer_frame_mbs_only_flag))
238*495ae853SAndroid Build Coastguard Worker {
239*495ae853SAndroid Build Coastguard Worker i4_yc = i4_yc >> (1 - u1_field_mb_flag);
240*495ae853SAndroid Build Coastguard Worker }
241*495ae853SAndroid Build Coastguard Worker
242*495ae853SAndroid Build Coastguard Worker i4_y_ref16 = isvce_get_scaled_pixel_pos(ps_layer_props, i4_yc, 1);
243*495ae853SAndroid Build Coastguard Worker
244*495ae853SAndroid Build Coastguard Worker for(j = 0; j < ((0 == i) ? 3 : 1); j++)
245*495ae853SAndroid Build Coastguard Worker {
246*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_ref16;
247*495ae853SAndroid Build Coastguard Worker
248*495ae853SAndroid Build Coastguard Worker WORD32 i4_xc = ps_mb_pos->i4_abscissa * ps_layer_props->u4_mb_wd + j;
249*495ae853SAndroid Build Coastguard Worker
250*495ae853SAndroid Build Coastguard Worker i4_x_ref16 = isvce_get_scaled_pixel_pos(ps_layer_props, i4_xc, 0);
251*495ae853SAndroid Build Coastguard Worker
252*495ae853SAndroid Build Coastguard Worker ps_ref_array_phases[u4_phase_array_idx].i4_abscissa = i4_x_ref16 & 15;
253*495ae853SAndroid Build Coastguard Worker ps_ref_array_phases[u4_phase_array_idx].i4_ordinate = i4_y_ref16 & 15;
254*495ae853SAndroid Build Coastguard Worker
255*495ae853SAndroid Build Coastguard Worker u4_phase_array_idx++;
256*495ae853SAndroid Build Coastguard Worker }
257*495ae853SAndroid Build Coastguard Worker }
258*495ae853SAndroid Build Coastguard Worker }
259*495ae853SAndroid Build Coastguard Worker else
260*495ae853SAndroid Build Coastguard Worker {
261*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 2; i++)
262*495ae853SAndroid Build Coastguard Worker {
263*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_ref16;
264*495ae853SAndroid Build Coastguard Worker
265*495ae853SAndroid Build Coastguard Worker WORD32 i4_yc = ps_mb_pos->i4_ordinate * ps_layer_props->u4_mb_ht + i;
266*495ae853SAndroid Build Coastguard Worker
267*495ae853SAndroid Build Coastguard Worker if((0 == u1_frame_mbs_only_flag) || (0 == u1_ref_layer_frame_mbs_only_flag))
268*495ae853SAndroid Build Coastguard Worker {
269*495ae853SAndroid Build Coastguard Worker i4_yc = i4_yc >> (1 - u1_field_mb_flag);
270*495ae853SAndroid Build Coastguard Worker }
271*495ae853SAndroid Build Coastguard Worker
272*495ae853SAndroid Build Coastguard Worker i4_y_ref16 = isvce_get_scaled_pixel_pos(ps_layer_props, i4_yc, 1);
273*495ae853SAndroid Build Coastguard Worker
274*495ae853SAndroid Build Coastguard Worker for(j = 0; j < ((0 == i) ? 2 : 1); j++)
275*495ae853SAndroid Build Coastguard Worker {
276*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_ref16;
277*495ae853SAndroid Build Coastguard Worker
278*495ae853SAndroid Build Coastguard Worker WORD32 i4_xc = ps_mb_pos->i4_abscissa * ps_layer_props->u4_mb_wd + j;
279*495ae853SAndroid Build Coastguard Worker
280*495ae853SAndroid Build Coastguard Worker i4_x_ref16 = isvce_get_scaled_pixel_pos(ps_layer_props, i4_xc, 0);
281*495ae853SAndroid Build Coastguard Worker
282*495ae853SAndroid Build Coastguard Worker ps_ref_array_phases[u4_phase_array_idx].i4_abscissa =
283*495ae853SAndroid Build Coastguard Worker (i4_x_ref16 - (16 * i4_x_offset)) & 15;
284*495ae853SAndroid Build Coastguard Worker ps_ref_array_phases[u4_phase_array_idx].i4_ordinate =
285*495ae853SAndroid Build Coastguard Worker (i4_y_ref16 - (16 * i4_y_offset)) & 15;
286*495ae853SAndroid Build Coastguard Worker
287*495ae853SAndroid Build Coastguard Worker u4_phase_array_idx++;
288*495ae853SAndroid Build Coastguard Worker }
289*495ae853SAndroid Build Coastguard Worker }
290*495ae853SAndroid Build Coastguard Worker }
291*495ae853SAndroid Build Coastguard Worker }
292*495ae853SAndroid Build Coastguard Worker
isvce_set_mb_states(layer_resampler_props_t * ps_layer_props,intra_pred_mb_state_t * ps_mb_states,coordinates_t * ps_mb_pos,DOUBLE d_spatial_res_ratio,UWORD32 u4_wd_in_mbs,bool b_is_chroma)293*495ae853SAndroid Build Coastguard Worker static FORCEINLINE void isvce_set_mb_states(layer_resampler_props_t *ps_layer_props,
294*495ae853SAndroid Build Coastguard Worker intra_pred_mb_state_t *ps_mb_states,
295*495ae853SAndroid Build Coastguard Worker coordinates_t *ps_mb_pos, DOUBLE d_spatial_res_ratio,
296*495ae853SAndroid Build Coastguard Worker UWORD32 u4_wd_in_mbs, bool b_is_chroma)
297*495ae853SAndroid Build Coastguard Worker {
298*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_refmin16;
299*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_refmax16;
300*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_refmin16;
301*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_refmax16;
302*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_offset, i4_y_offset;
303*495ae853SAndroid Build Coastguard Worker
304*495ae853SAndroid Build Coastguard Worker const UWORD8 u1_frame_mbs_only_flag = 1;
305*495ae853SAndroid Build Coastguard Worker const UWORD8 u1_ref_layer_frame_mbs_only_flag = 1;
306*495ae853SAndroid Build Coastguard Worker const UWORD8 u1_field_mb_flag = 0;
307*495ae853SAndroid Build Coastguard Worker
308*495ae853SAndroid Build Coastguard Worker i4_x_refmin16 = isvce_get_scaled_pixel_pos(
309*495ae853SAndroid Build Coastguard Worker ps_layer_props, ps_mb_pos->i4_abscissa * ps_layer_props->u4_mb_wd, 0);
310*495ae853SAndroid Build Coastguard Worker i4_x_refmax16 = isvce_get_scaled_pixel_pos(
311*495ae853SAndroid Build Coastguard Worker ps_layer_props,
312*495ae853SAndroid Build Coastguard Worker ps_mb_pos->i4_abscissa * ps_layer_props->u4_mb_wd + ps_layer_props->u4_mb_wd - 1, 0);
313*495ae853SAndroid Build Coastguard Worker
314*495ae853SAndroid Build Coastguard Worker i4_y_refmin16 = isvce_get_scaled_pixel_pos(
315*495ae853SAndroid Build Coastguard Worker ps_layer_props, ps_mb_pos->i4_ordinate * ps_layer_props->u4_mb_ht, 1);
316*495ae853SAndroid Build Coastguard Worker i4_y_refmax16 = isvce_get_scaled_pixel_pos(
317*495ae853SAndroid Build Coastguard Worker ps_layer_props,
318*495ae853SAndroid Build Coastguard Worker ps_mb_pos->i4_ordinate * ps_layer_props->u4_mb_ht + ps_layer_props->u4_mb_ht - 1, 1);
319*495ae853SAndroid Build Coastguard Worker
320*495ae853SAndroid Build Coastguard Worker i4_x_offset = (i4_x_refmin16 >> 4);
321*495ae853SAndroid Build Coastguard Worker i4_y_offset = (i4_y_refmin16 >> 4);
322*495ae853SAndroid Build Coastguard Worker
323*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
324*495ae853SAndroid Build Coastguard Worker .s_offsets.i4_abscissa = i4_x_offset;
325*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
326*495ae853SAndroid Build Coastguard Worker .s_offsets.i4_ordinate = i4_y_offset;
327*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
328*495ae853SAndroid Build Coastguard Worker .s_ref_array_dims.i4_abscissa = (((i4_x_refmax16 + 15) >> 8) << 4) +
329*495ae853SAndroid Build Coastguard Worker ((WORD32) (ps_layer_props->u4_mb_wd >> 1)) - i4_x_offset +
330*495ae853SAndroid Build Coastguard Worker 16;
331*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
332*495ae853SAndroid Build Coastguard Worker .s_ref_array_dims.i4_ordinate = (((i4_y_refmax16 + 15) >> 8) << 4) +
333*495ae853SAndroid Build Coastguard Worker ((WORD32) (ps_layer_props->u4_mb_ht >> 1)) - i4_y_offset +
334*495ae853SAndroid Build Coastguard Worker 16;
335*495ae853SAndroid Build Coastguard Worker
336*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
337*495ae853SAndroid Build Coastguard Worker .s_max_pos.i4_abscissa = ((i4_x_refmax16 + 15) >> 4) - i4_x_offset;
338*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
339*495ae853SAndroid Build Coastguard Worker .s_max_pos.i4_ordinate = ((i4_y_refmax16 + 15) >> 4) - i4_y_offset;
340*495ae853SAndroid Build Coastguard Worker
341*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
342*495ae853SAndroid Build Coastguard Worker .s_min_pos.i4_abscissa = (i4_x_refmin16 >> 4) - i4_x_offset;
343*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
344*495ae853SAndroid Build Coastguard Worker .s_min_pos.i4_ordinate = (i4_y_refmin16 >> 4) - i4_y_offset;
345*495ae853SAndroid Build Coastguard Worker
346*495ae853SAndroid Build Coastguard Worker if((1.5 == d_spatial_res_ratio) &&
347*495ae853SAndroid Build Coastguard Worker ((0 == ps_mb_pos->i4_abscissa) || (0 == ps_mb_pos->i4_ordinate)))
348*495ae853SAndroid Build Coastguard Worker {
349*495ae853SAndroid Build Coastguard Worker WORD32 i4_min, i4_max, i4_xr_index, i4_yr_index, i4_ref_array_wd, i4_ref_array_ht;
350*495ae853SAndroid Build Coastguard Worker
351*495ae853SAndroid Build Coastguard Worker i4_x_offset = i4_x_offset - 2;
352*495ae853SAndroid Build Coastguard Worker i4_ref_array_wd = ((i4_x_refmax16 + 15) >> 4) - (i4_x_refmin16 >> 4) + 1 + 4;
353*495ae853SAndroid Build Coastguard Worker
354*495ae853SAndroid Build Coastguard Worker i4_min = i4_x_offset;
355*495ae853SAndroid Build Coastguard Worker i4_xr_index = i4_min - ((i4_min / (WORD32) ps_layer_props->u4_mb_wd) *
356*495ae853SAndroid Build Coastguard Worker (WORD32) ps_layer_props->u4_mb_wd);
357*495ae853SAndroid Build Coastguard Worker
358*495ae853SAndroid Build Coastguard Worker if(i4_xr_index < (WORD32) (ps_layer_props->u4_mb_wd >> 1))
359*495ae853SAndroid Build Coastguard Worker {
360*495ae853SAndroid Build Coastguard Worker i4_ref_array_wd = i4_ref_array_wd + (ps_layer_props->u4_mb_wd >> 1);
361*495ae853SAndroid Build Coastguard Worker i4_x_offset = i4_x_offset - ((WORD32) (ps_layer_props->u4_mb_wd >> 1));
362*495ae853SAndroid Build Coastguard Worker }
363*495ae853SAndroid Build Coastguard Worker
364*495ae853SAndroid Build Coastguard Worker i4_max = ((i4_x_refmax16 + 15) >> 4) + 2;
365*495ae853SAndroid Build Coastguard Worker i4_xr_index = i4_max - ((i4_max / (WORD32) ps_layer_props->u4_mb_wd) *
366*495ae853SAndroid Build Coastguard Worker (WORD32) ps_layer_props->u4_mb_wd);
367*495ae853SAndroid Build Coastguard Worker
368*495ae853SAndroid Build Coastguard Worker if(i4_xr_index >= (WORD32) (ps_layer_props->u4_mb_wd >> 1))
369*495ae853SAndroid Build Coastguard Worker {
370*495ae853SAndroid Build Coastguard Worker i4_ref_array_wd = i4_ref_array_wd + (ps_layer_props->u4_mb_wd >> 1);
371*495ae853SAndroid Build Coastguard Worker }
372*495ae853SAndroid Build Coastguard Worker
373*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
374*495ae853SAndroid Build Coastguard Worker .s_ref_array_dims.i4_abscissa = i4_ref_array_wd;
375*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
376*495ae853SAndroid Build Coastguard Worker .s_offsets.i4_abscissa = i4_x_offset;
377*495ae853SAndroid Build Coastguard Worker
378*495ae853SAndroid Build Coastguard Worker i4_ref_array_ht = ((i4_y_refmax16 + 15) >> 4) - (i4_y_refmin16 >> 4) + 1 + 4;
379*495ae853SAndroid Build Coastguard Worker
380*495ae853SAndroid Build Coastguard Worker i4_y_offset = (i4_y_refmin16 >> 4) - 2;
381*495ae853SAndroid Build Coastguard Worker
382*495ae853SAndroid Build Coastguard Worker i4_min = i4_y_offset;
383*495ae853SAndroid Build Coastguard Worker
384*495ae853SAndroid Build Coastguard Worker i4_yr_index = i4_min - ((i4_min / (WORD32) ps_layer_props->u4_mb_ht) *
385*495ae853SAndroid Build Coastguard Worker (WORD32) ps_layer_props->u4_mb_ht);
386*495ae853SAndroid Build Coastguard Worker
387*495ae853SAndroid Build Coastguard Worker if(i4_yr_index < (WORD32) (ps_layer_props->u4_mb_ht >> 1))
388*495ae853SAndroid Build Coastguard Worker {
389*495ae853SAndroid Build Coastguard Worker i4_ref_array_ht = i4_ref_array_ht + (ps_layer_props->u4_mb_ht >> 1);
390*495ae853SAndroid Build Coastguard Worker i4_y_offset = i4_y_offset - ((WORD32) (ps_layer_props->u4_mb_ht >> 1));
391*495ae853SAndroid Build Coastguard Worker }
392*495ae853SAndroid Build Coastguard Worker
393*495ae853SAndroid Build Coastguard Worker i4_max = ((i4_y_refmax16 + 15) >> 4) + 2;
394*495ae853SAndroid Build Coastguard Worker i4_yr_index = i4_max - ((i4_max / (WORD32) ps_layer_props->u4_mb_ht) *
395*495ae853SAndroid Build Coastguard Worker (WORD32) ps_layer_props->u4_mb_ht);
396*495ae853SAndroid Build Coastguard Worker
397*495ae853SAndroid Build Coastguard Worker if(i4_yr_index >= (WORD32) (ps_layer_props->u4_mb_ht >> 1))
398*495ae853SAndroid Build Coastguard Worker {
399*495ae853SAndroid Build Coastguard Worker i4_ref_array_ht = i4_ref_array_ht + (ps_layer_props->u4_mb_ht >> 1);
400*495ae853SAndroid Build Coastguard Worker }
401*495ae853SAndroid Build Coastguard Worker
402*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
403*495ae853SAndroid Build Coastguard Worker .s_ref_array_dims.i4_ordinate = i4_ref_array_ht;
404*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
405*495ae853SAndroid Build Coastguard Worker .s_offsets.i4_ordinate = i4_y_offset;
406*495ae853SAndroid Build Coastguard Worker
407*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
408*495ae853SAndroid Build Coastguard Worker .s_max_pos.i4_abscissa = ((i4_x_refmax16 + 15) >> 4) - i4_x_offset;
409*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
410*495ae853SAndroid Build Coastguard Worker .s_max_pos.i4_ordinate = ((i4_y_refmax16 + 15) >> 4) - i4_y_offset;
411*495ae853SAndroid Build Coastguard Worker
412*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
413*495ae853SAndroid Build Coastguard Worker .s_min_pos.i4_abscissa = (i4_x_refmin16 >> 4) - i4_x_offset;
414*495ae853SAndroid Build Coastguard Worker ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs]
415*495ae853SAndroid Build Coastguard Worker .s_min_pos.i4_ordinate = (i4_y_refmin16 >> 4) - i4_y_offset;
416*495ae853SAndroid Build Coastguard Worker
417*495ae853SAndroid Build Coastguard Worker isvce_ref_array_pos_init(
418*495ae853SAndroid Build Coastguard Worker ps_layer_props,
419*495ae853SAndroid Build Coastguard Worker &ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs],
420*495ae853SAndroid Build Coastguard Worker ps_mb_pos, d_spatial_res_ratio, u1_frame_mbs_only_flag, u1_field_mb_flag,
421*495ae853SAndroid Build Coastguard Worker u1_ref_layer_frame_mbs_only_flag);
422*495ae853SAndroid Build Coastguard Worker
423*495ae853SAndroid Build Coastguard Worker isvce_ref_array_phase_init(
424*495ae853SAndroid Build Coastguard Worker ps_layer_props,
425*495ae853SAndroid Build Coastguard Worker &ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs],
426*495ae853SAndroid Build Coastguard Worker ps_mb_pos, d_spatial_res_ratio, u1_frame_mbs_only_flag, u1_field_mb_flag,
427*495ae853SAndroid Build Coastguard Worker u1_ref_layer_frame_mbs_only_flag);
428*495ae853SAndroid Build Coastguard Worker }
429*495ae853SAndroid Build Coastguard Worker else if((2. == d_spatial_res_ratio) &&
430*495ae853SAndroid Build Coastguard Worker ((0 == ps_mb_pos->i4_abscissa) && (0 == ps_mb_pos->i4_ordinate) && b_is_chroma))
431*495ae853SAndroid Build Coastguard Worker {
432*495ae853SAndroid Build Coastguard Worker isvce_ref_array_pos_init(
433*495ae853SAndroid Build Coastguard Worker ps_layer_props,
434*495ae853SAndroid Build Coastguard Worker &ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs],
435*495ae853SAndroid Build Coastguard Worker ps_mb_pos, d_spatial_res_ratio, u1_frame_mbs_only_flag, u1_field_mb_flag,
436*495ae853SAndroid Build Coastguard Worker u1_ref_layer_frame_mbs_only_flag);
437*495ae853SAndroid Build Coastguard Worker
438*495ae853SAndroid Build Coastguard Worker isvce_ref_array_phase_init(
439*495ae853SAndroid Build Coastguard Worker ps_layer_props,
440*495ae853SAndroid Build Coastguard Worker &ps_mb_states[ps_mb_pos->i4_abscissa + ps_mb_pos->i4_ordinate * u4_wd_in_mbs],
441*495ae853SAndroid Build Coastguard Worker ps_mb_pos, d_spatial_res_ratio, u1_frame_mbs_only_flag, u1_field_mb_flag,
442*495ae853SAndroid Build Coastguard Worker u1_ref_layer_frame_mbs_only_flag);
443*495ae853SAndroid Build Coastguard Worker }
444*495ae853SAndroid Build Coastguard Worker }
445*495ae853SAndroid Build Coastguard Worker
isvce_ibl_layer_state_init(intra_pred_layer_state_t * ps_layer_state,DOUBLE d_spatial_res_ratio,UWORD32 u4_wd,UWORD32 u4_ht,UWORD8 u1_level_idc,IV_COLOR_FORMAT_T e_color_format)446*495ae853SAndroid Build Coastguard Worker static void isvce_ibl_layer_state_init(intra_pred_layer_state_t *ps_layer_state,
447*495ae853SAndroid Build Coastguard Worker DOUBLE d_spatial_res_ratio, UWORD32 u4_wd, UWORD32 u4_ht,
448*495ae853SAndroid Build Coastguard Worker UWORD8 u1_level_idc, IV_COLOR_FORMAT_T e_color_format)
449*495ae853SAndroid Build Coastguard Worker {
450*495ae853SAndroid Build Coastguard Worker UWORD32 i, j, k;
451*495ae853SAndroid Build Coastguard Worker
452*495ae853SAndroid Build Coastguard Worker const UWORD8 u1_ref_layer_field_pic_flag = 0;
453*495ae853SAndroid Build Coastguard Worker const UWORD8 u1_field_pic_flag = 0;
454*495ae853SAndroid Build Coastguard Worker const UWORD8 u1_frame_mbs_only_flag = 1;
455*495ae853SAndroid Build Coastguard Worker const UWORD8 u1_ref_layer_frame_mbs_only_flag = 1;
456*495ae853SAndroid Build Coastguard Worker const UWORD8 u1_bot_field_flag = 0;
457*495ae853SAndroid Build Coastguard Worker const WORD32 i4_scaled_ref_layer_left_offset = 0;
458*495ae853SAndroid Build Coastguard Worker const WORD32 i4_scaled_ref_layer_top_offset = 0;
459*495ae853SAndroid Build Coastguard Worker const WORD32 i4_ref_layer_chroma_phase_x_plus1 = 1;
460*495ae853SAndroid Build Coastguard Worker const WORD32 i4_ref_layer_chroma_phase_y_plus1 = 1;
461*495ae853SAndroid Build Coastguard Worker const WORD32 i4_chroma_phase_x_plus1 = 1;
462*495ae853SAndroid Build Coastguard Worker const WORD32 i4_chroma_phase_y_plus1 = 1;
463*495ae853SAndroid Build Coastguard Worker const WORD32 i4_sub_wd_chroma = 2;
464*495ae853SAndroid Build Coastguard Worker const WORD32 i4_sub_ht_chroma = 2;
465*495ae853SAndroid Build Coastguard Worker
466*495ae853SAndroid Build Coastguard Worker ASSERT((IV_YUV_420P == e_color_format) || (IV_YUV_420SP_UV == e_color_format));
467*495ae853SAndroid Build Coastguard Worker
468*495ae853SAndroid Build Coastguard Worker UNUSED(e_color_format);
469*495ae853SAndroid Build Coastguard Worker
470*495ae853SAndroid Build Coastguard Worker for(i = 0; i < NUM_SP_COMPONENTS; i++)
471*495ae853SAndroid Build Coastguard Worker {
472*495ae853SAndroid Build Coastguard Worker intra_pred_mb_state_t *ps_mb_states;
473*495ae853SAndroid Build Coastguard Worker layer_resampler_props_t *ps_layer_props;
474*495ae853SAndroid Build Coastguard Worker
475*495ae853SAndroid Build Coastguard Worker UWORD32 u4_wd_in_mbs;
476*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ht_in_mbs;
477*495ae853SAndroid Build Coastguard Worker
478*495ae853SAndroid Build Coastguard Worker UWORD8 u1_is_chroma = (Y != ((COMPONENT_TYPE) i));
479*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ref_wd = (u4_wd / d_spatial_res_ratio);
480*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ref_ht = (u4_ht / d_spatial_res_ratio) * (1 + u1_ref_layer_field_pic_flag);
481*495ae853SAndroid Build Coastguard Worker UWORD32 u4_scaled_wd = u4_wd;
482*495ae853SAndroid Build Coastguard Worker UWORD32 u4_scaled_ht = u4_ht * (1 + u1_field_pic_flag);
483*495ae853SAndroid Build Coastguard Worker
484*495ae853SAndroid Build Coastguard Worker ps_mb_states =
485*495ae853SAndroid Build Coastguard Worker u1_is_chroma ? ps_layer_state->ps_chroma_mb_states : ps_layer_state->ps_luma_mb_states;
486*495ae853SAndroid Build Coastguard Worker ps_layer_props =
487*495ae853SAndroid Build Coastguard Worker u1_is_chroma ? ps_layer_state->ps_chroma_props : ps_layer_state->ps_luma_props;
488*495ae853SAndroid Build Coastguard Worker
489*495ae853SAndroid Build Coastguard Worker u4_ref_wd = u4_ref_wd >> u1_is_chroma;
490*495ae853SAndroid Build Coastguard Worker u4_ref_ht = u4_ref_ht >> u1_is_chroma;
491*495ae853SAndroid Build Coastguard Worker u4_scaled_wd = u4_scaled_wd >> u1_is_chroma;
492*495ae853SAndroid Build Coastguard Worker u4_scaled_ht = u4_scaled_ht >> u1_is_chroma;
493*495ae853SAndroid Build Coastguard Worker
494*495ae853SAndroid Build Coastguard Worker if(u1_is_chroma)
495*495ae853SAndroid Build Coastguard Worker {
496*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_refphase_x = i4_ref_layer_chroma_phase_x_plus1 - 1;
497*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_refphase_y = i4_ref_layer_chroma_phase_y_plus1 - 1;
498*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_phase_x = i4_chroma_phase_x_plus1 - 1;
499*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_phase_y = i4_chroma_phase_y_plus1 - 1;
500*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_sub_wd = i4_sub_wd_chroma;
501*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_sub_ht = i4_sub_ht_chroma;
502*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_mb_wd = MB_SIZE >> 1;
503*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_mb_ht = MB_SIZE >> 1;
504*495ae853SAndroid Build Coastguard Worker }
505*495ae853SAndroid Build Coastguard Worker else
506*495ae853SAndroid Build Coastguard Worker {
507*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_refphase_x = 0;
508*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_refphase_y = 0;
509*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_phase_x = 0;
510*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_phase_y = 0;
511*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_sub_wd = 1;
512*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_sub_ht = 1;
513*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_mb_wd = MB_SIZE;
514*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_mb_ht = MB_SIZE;
515*495ae853SAndroid Build Coastguard Worker }
516*495ae853SAndroid Build Coastguard Worker
517*495ae853SAndroid Build Coastguard Worker u4_wd_in_mbs = u4_scaled_wd / ps_layer_props->u4_mb_wd;
518*495ae853SAndroid Build Coastguard Worker u4_ht_in_mbs = u4_scaled_ht / ps_layer_props->u4_mb_ht;
519*495ae853SAndroid Build Coastguard Worker
520*495ae853SAndroid Build Coastguard Worker if(u1_level_idc <= 30)
521*495ae853SAndroid Build Coastguard Worker {
522*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_shift_x = 16;
523*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_shift_y = 16;
524*495ae853SAndroid Build Coastguard Worker }
525*495ae853SAndroid Build Coastguard Worker else
526*495ae853SAndroid Build Coastguard Worker {
527*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_shift_x = 31 - isvcd_get_ceil_log2(u4_ref_wd);
528*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_shift_y = 31 - isvcd_get_ceil_log2(u4_ref_ht);
529*495ae853SAndroid Build Coastguard Worker }
530*495ae853SAndroid Build Coastguard Worker
531*495ae853SAndroid Build Coastguard Worker if((0 == u1_frame_mbs_only_flag) || (0 == u1_ref_layer_frame_mbs_only_flag))
532*495ae853SAndroid Build Coastguard Worker {
533*495ae853SAndroid Build Coastguard Worker if(1 == u1_ref_layer_frame_mbs_only_flag)
534*495ae853SAndroid Build Coastguard Worker {
535*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_phase_y = ps_layer_props->i4_phase_y + (4 * u1_bot_field_flag) +
536*495ae853SAndroid Build Coastguard Worker 3 - ps_layer_props->u4_sub_ht;
537*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_refphase_y = (2 * ps_layer_props->i4_refphase_y) + 2;
538*495ae853SAndroid Build Coastguard Worker }
539*495ae853SAndroid Build Coastguard Worker else
540*495ae853SAndroid Build Coastguard Worker {
541*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_phase_y = ps_layer_props->i4_phase_y + 4 * u1_bot_field_flag;
542*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_refphase_y =
543*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_refphase_y + (4 * u1_bot_field_flag);
544*495ae853SAndroid Build Coastguard Worker }
545*495ae853SAndroid Build Coastguard Worker }
546*495ae853SAndroid Build Coastguard Worker
547*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_scale_x =
548*495ae853SAndroid Build Coastguard Worker ((u4_ref_wd << ps_layer_props->u4_shift_x) + (u4_scaled_wd >> 1)) / (u4_scaled_wd);
549*495ae853SAndroid Build Coastguard Worker ps_layer_props->u4_scale_y =
550*495ae853SAndroid Build Coastguard Worker ((u4_ref_ht << ps_layer_props->u4_shift_y) + (u4_scaled_ht >> 1)) / (u4_scaled_ht);
551*495ae853SAndroid Build Coastguard Worker
552*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_offset_x = i4_scaled_ref_layer_left_offset / ps_layer_props->u4_sub_wd;
553*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_add_x =
554*495ae853SAndroid Build Coastguard Worker (((u4_ref_wd * (2 + ps_layer_props->i4_phase_x)) << (ps_layer_props->u4_shift_x - 2)) +
555*495ae853SAndroid Build Coastguard Worker (u4_scaled_wd >> 1)) /
556*495ae853SAndroid Build Coastguard Worker u4_scaled_wd +
557*495ae853SAndroid Build Coastguard Worker (1 << (ps_layer_props->u4_shift_x - 5));
558*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_delta_x = 4 * (2 + ps_layer_props->i4_refphase_x);
559*495ae853SAndroid Build Coastguard Worker
560*495ae853SAndroid Build Coastguard Worker if((1 == u1_frame_mbs_only_flag) && (1 == u1_ref_layer_frame_mbs_only_flag))
561*495ae853SAndroid Build Coastguard Worker {
562*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_offset_y =
563*495ae853SAndroid Build Coastguard Worker i4_scaled_ref_layer_top_offset / ps_layer_props->u4_sub_ht;
564*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_add_y = (((u4_ref_ht * (2 + ps_layer_props->i4_phase_y))
565*495ae853SAndroid Build Coastguard Worker << (ps_layer_props->u4_shift_y - 2)) +
566*495ae853SAndroid Build Coastguard Worker (u4_scaled_ht >> 1)) /
567*495ae853SAndroid Build Coastguard Worker u4_scaled_ht +
568*495ae853SAndroid Build Coastguard Worker (1 << (ps_layer_props->u4_shift_y - 5));
569*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_delta_y = 4 * (2 + ps_layer_props->i4_refphase_y);
570*495ae853SAndroid Build Coastguard Worker }
571*495ae853SAndroid Build Coastguard Worker else
572*495ae853SAndroid Build Coastguard Worker {
573*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_offset_y =
574*495ae853SAndroid Build Coastguard Worker i4_scaled_ref_layer_top_offset / (2 * ps_layer_props->u4_sub_ht);
575*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_add_y = (((u4_ref_ht * (2 + ps_layer_props->i4_phase_y))
576*495ae853SAndroid Build Coastguard Worker << (ps_layer_props->u4_shift_y - 3)) +
577*495ae853SAndroid Build Coastguard Worker (u4_scaled_ht >> 1)) /
578*495ae853SAndroid Build Coastguard Worker u4_scaled_ht +
579*495ae853SAndroid Build Coastguard Worker (1 << (ps_layer_props->u4_shift_y - 5));
580*495ae853SAndroid Build Coastguard Worker ps_layer_props->i4_delta_y = 2 * (2 + ps_layer_props->i4_refphase_y);
581*495ae853SAndroid Build Coastguard Worker }
582*495ae853SAndroid Build Coastguard Worker
583*495ae853SAndroid Build Coastguard Worker for(j = 0; j < u4_ht_in_mbs; j++)
584*495ae853SAndroid Build Coastguard Worker {
585*495ae853SAndroid Build Coastguard Worker for(k = 0; k < u4_wd_in_mbs; k++)
586*495ae853SAndroid Build Coastguard Worker {
587*495ae853SAndroid Build Coastguard Worker coordinates_t s_mb_pos = {k, j};
588*495ae853SAndroid Build Coastguard Worker
589*495ae853SAndroid Build Coastguard Worker isvce_set_mb_states(ps_layer_props, ps_mb_states, &s_mb_pos, d_spatial_res_ratio,
590*495ae853SAndroid Build Coastguard Worker u4_wd_in_mbs, u1_is_chroma);
591*495ae853SAndroid Build Coastguard Worker }
592*495ae853SAndroid Build Coastguard Worker }
593*495ae853SAndroid Build Coastguard Worker }
594*495ae853SAndroid Build Coastguard Worker }
595*495ae853SAndroid Build Coastguard Worker
596*495ae853SAndroid Build Coastguard Worker /**
597*495ae853SAndroid Build Coastguard Worker *******************************************************************************
598*495ae853SAndroid Build Coastguard Worker *
599*495ae853SAndroid Build Coastguard Worker * @brief
600*495ae853SAndroid Build Coastguard Worker * Function to initialize svc ilp buffers
601*495ae853SAndroid Build Coastguard Worker *
602*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
603*495ae853SAndroid Build Coastguard Worker * Pointer to codec context
604*495ae853SAndroid Build Coastguard Worker *
605*495ae853SAndroid Build Coastguard Worker * @param[in] ps_mem_rec
606*495ae853SAndroid Build Coastguard Worker * Pointer to memory allocated for input buffers
607*495ae853SAndroid Build Coastguard Worker *
608*495ae853SAndroid Build Coastguard Worker *******************************************************************************
609*495ae853SAndroid Build Coastguard Worker */
isvce_intra_pred_ctxt_init(isvce_codec_t * ps_codec,iv_mem_rec_t * ps_mem_rec)610*495ae853SAndroid Build Coastguard Worker void isvce_intra_pred_ctxt_init(isvce_codec_t *ps_codec, iv_mem_rec_t *ps_mem_rec)
611*495ae853SAndroid Build Coastguard Worker {
612*495ae853SAndroid Build Coastguard Worker intra_pred_state_t *ps_intra_pred_state;
613*495ae853SAndroid Build Coastguard Worker svc_intra_pred_ctxt_t *ps_intra_pred_ctxt;
614*495ae853SAndroid Build Coastguard Worker intra_pred_mb_state_t *aps_luma_mb_states[MAX_NUM_SPATIAL_LAYERS];
615*495ae853SAndroid Build Coastguard Worker intra_pred_mb_state_t *aps_chroma_mb_states[MAX_NUM_SPATIAL_LAYERS];
616*495ae853SAndroid Build Coastguard Worker
617*495ae853SAndroid Build Coastguard Worker WORD32 i, j, k, l, m;
618*495ae853SAndroid Build Coastguard Worker WORD8 *api4_mb_modes[MAX_NUM_SPATIAL_LAYERS];
619*495ae853SAndroid Build Coastguard Worker
620*495ae853SAndroid Build Coastguard Worker isvce_process_ctxt_t *ps_proc = ps_codec->as_process;
621*495ae853SAndroid Build Coastguard Worker
622*495ae853SAndroid Build Coastguard Worker const WORD32 i4_num_proc_ctxts = sizeof(ps_codec->as_process) / sizeof(ps_codec->as_process[0]);
623*495ae853SAndroid Build Coastguard Worker DOUBLE d_spatial_res_ratio = ps_codec->s_cfg.s_svc_params.d_spatial_res_ratio;
624*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_spatial_layers = ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers;
625*495ae853SAndroid Build Coastguard Worker UWORD32 u4_wd = ps_codec->s_cfg.u4_wd;
626*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ht = ps_codec->s_cfg.u4_ht;
627*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_buf = ps_mem_rec->pv_base;
628*495ae853SAndroid Build Coastguard Worker WORD64 i8_alloc_mem_size = isvce_get_svc_intra_pred_ctxt_size(
629*495ae853SAndroid Build Coastguard Worker u1_num_spatial_layers, d_spatial_res_ratio, u4_wd, u4_ht);
630*495ae853SAndroid Build Coastguard Worker
631*495ae853SAndroid Build Coastguard Worker if(u1_num_spatial_layers > 1)
632*495ae853SAndroid Build Coastguard Worker {
633*495ae853SAndroid Build Coastguard Worker for(j = 0; j < i4_num_proc_ctxts; j++)
634*495ae853SAndroid Build Coastguard Worker {
635*495ae853SAndroid Build Coastguard Worker ps_proc = &ps_codec->as_process[j];
636*495ae853SAndroid Build Coastguard Worker ps_intra_pred_ctxt = ps_proc->ps_intra_pred_ctxt = (svc_intra_pred_ctxt_t *) pu1_buf;
637*495ae853SAndroid Build Coastguard Worker pu1_buf += sizeof(svc_intra_pred_ctxt_t);
638*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -= sizeof(svc_intra_pred_ctxt_t);
639*495ae853SAndroid Build Coastguard Worker
640*495ae853SAndroid Build Coastguard Worker ps_intra_pred_ctxt->s_intra_pred_constants.pv_state = pu1_buf;
641*495ae853SAndroid Build Coastguard Worker ps_intra_pred_state = (intra_pred_state_t *) pu1_buf;
642*495ae853SAndroid Build Coastguard Worker pu1_buf += sizeof(intra_pred_state_t);
643*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -= sizeof(intra_pred_state_t);
644*495ae853SAndroid Build Coastguard Worker
645*495ae853SAndroid Build Coastguard Worker ps_intra_pred_state->ps_layer_state = (intra_pred_layer_state_t *) pu1_buf;
646*495ae853SAndroid Build Coastguard Worker pu1_buf += u1_num_spatial_layers * sizeof(ps_intra_pred_state->ps_layer_state[0]);
647*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -=
648*495ae853SAndroid Build Coastguard Worker u1_num_spatial_layers * sizeof(ps_intra_pred_state->ps_layer_state[0]);
649*495ae853SAndroid Build Coastguard Worker
650*495ae853SAndroid Build Coastguard Worker ASSERT(i8_alloc_mem_size >= 0);
651*495ae853SAndroid Build Coastguard Worker
652*495ae853SAndroid Build Coastguard Worker for(i = u1_num_spatial_layers - 1; i >= 0; i--)
653*495ae853SAndroid Build Coastguard Worker {
654*495ae853SAndroid Build Coastguard Worker intra_pred_layer_state_t *ps_layer_state = &ps_intra_pred_state->ps_layer_state[i];
655*495ae853SAndroid Build Coastguard Worker
656*495ae853SAndroid Build Coastguard Worker WORD32 i4_layer_luma_wd =
657*495ae853SAndroid Build Coastguard Worker ((DOUBLE) u4_wd / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) +
658*495ae853SAndroid Build Coastguard Worker 0.99;
659*495ae853SAndroid Build Coastguard Worker WORD32 i4_layer_luma_ht =
660*495ae853SAndroid Build Coastguard Worker ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) +
661*495ae853SAndroid Build Coastguard Worker 0.99;
662*495ae853SAndroid Build Coastguard Worker WORD32 i4_layer_wd_mbs = i4_layer_luma_wd / MB_SIZE;
663*495ae853SAndroid Build Coastguard Worker WORD32 i4_layer_ht_mbs = i4_layer_luma_ht / MB_SIZE;
664*495ae853SAndroid Build Coastguard Worker /* Add PAD MBs on all directions */
665*495ae853SAndroid Build Coastguard Worker WORD32 i4_layer_luma_mbs =
666*495ae853SAndroid Build Coastguard Worker ((i4_layer_luma_wd / MB_SIZE) + 2) * ((i4_layer_luma_ht / MB_SIZE) + 2);
667*495ae853SAndroid Build Coastguard Worker WORD32 i4_num_mb_states =
668*495ae853SAndroid Build Coastguard Worker isvce_get_num_mb_states(i4_layer_luma_wd, i4_layer_luma_ht);
669*495ae853SAndroid Build Coastguard Worker
670*495ae853SAndroid Build Coastguard Worker if(0 == j)
671*495ae853SAndroid Build Coastguard Worker {
672*495ae853SAndroid Build Coastguard Worker UWORD32 au4_ref_xpos_array_size[NUM_SP_COMPONENTS];
673*495ae853SAndroid Build Coastguard Worker UWORD32 au4_ref_ypos_array_size[NUM_SP_COMPONENTS];
674*495ae853SAndroid Build Coastguard Worker UWORD32 au4_ref_phase_array_size[NUM_SP_COMPONENTS];
675*495ae853SAndroid Build Coastguard Worker
676*495ae853SAndroid Build Coastguard Worker for(k = 0; k < NUM_SP_COMPONENTS; k++)
677*495ae853SAndroid Build Coastguard Worker {
678*495ae853SAndroid Build Coastguard Worker bool b_is_chroma = ((COMPONENT_TYPE) k) != Y;
679*495ae853SAndroid Build Coastguard Worker
680*495ae853SAndroid Build Coastguard Worker au4_ref_xpos_array_size[k] = MAX_REF_ARR_WD_HT;
681*495ae853SAndroid Build Coastguard Worker au4_ref_ypos_array_size[k] = (i4_layer_ht_mbs >> b_is_chroma);
682*495ae853SAndroid Build Coastguard Worker au4_ref_phase_array_size[k] =
683*495ae853SAndroid Build Coastguard Worker isvce_get_phase_array_size(d_spatial_res_ratio, b_is_chroma);
684*495ae853SAndroid Build Coastguard Worker }
685*495ae853SAndroid Build Coastguard Worker
686*495ae853SAndroid Build Coastguard Worker ps_layer_state->ps_luma_mb_states = (intra_pred_mb_state_t *) pu1_buf;
687*495ae853SAndroid Build Coastguard Worker aps_luma_mb_states[i] = ps_layer_state->ps_luma_mb_states;
688*495ae853SAndroid Build Coastguard Worker pu1_buf += i4_num_mb_states * sizeof(ps_layer_state->ps_luma_mb_states[0]);
689*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -=
690*495ae853SAndroid Build Coastguard Worker i4_num_mb_states * sizeof(ps_layer_state->ps_luma_mb_states[0]);
691*495ae853SAndroid Build Coastguard Worker
692*495ae853SAndroid Build Coastguard Worker ps_layer_state->ps_chroma_mb_states = (intra_pred_mb_state_t *) pu1_buf;
693*495ae853SAndroid Build Coastguard Worker aps_chroma_mb_states[i] = ps_layer_state->ps_chroma_mb_states;
694*495ae853SAndroid Build Coastguard Worker pu1_buf += i4_num_mb_states * sizeof(ps_layer_state->ps_chroma_mb_states[0]);
695*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -=
696*495ae853SAndroid Build Coastguard Worker i4_num_mb_states * sizeof(ps_layer_state->ps_chroma_mb_states[0]);
697*495ae853SAndroid Build Coastguard Worker
698*495ae853SAndroid Build Coastguard Worker if(1.5 == d_spatial_res_ratio)
699*495ae853SAndroid Build Coastguard Worker {
700*495ae853SAndroid Build Coastguard Worker for(k = 0; k < NUM_SP_COMPONENTS; k++)
701*495ae853SAndroid Build Coastguard Worker {
702*495ae853SAndroid Build Coastguard Worker bool b_is_chroma = ((COMPONENT_TYPE) k) != Y;
703*495ae853SAndroid Build Coastguard Worker
704*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_ref_array_positions_x = (WORD32 *) pu1_buf;
705*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_ref_array_positions_y =
706*495ae853SAndroid Build Coastguard Worker pi4_ref_array_positions_x + MAX_REF_ARR_WD_HT * i4_layer_wd_mbs;
707*495ae853SAndroid Build Coastguard Worker coordinates_t *ps_ref_array_phases =
708*495ae853SAndroid Build Coastguard Worker (coordinates_t *) (pi4_ref_array_positions_y +
709*495ae853SAndroid Build Coastguard Worker (i4_layer_ht_mbs >> b_is_chroma) *
710*495ae853SAndroid Build Coastguard Worker i4_layer_ht_mbs);
711*495ae853SAndroid Build Coastguard Worker intra_pred_mb_state_t *ps_mb_state =
712*495ae853SAndroid Build Coastguard Worker b_is_chroma ? ps_layer_state->ps_chroma_mb_states
713*495ae853SAndroid Build Coastguard Worker : ps_layer_state->ps_luma_mb_states;
714*495ae853SAndroid Build Coastguard Worker
715*495ae853SAndroid Build Coastguard Worker for(l = 0; l < i4_layer_ht_mbs; l++)
716*495ae853SAndroid Build Coastguard Worker {
717*495ae853SAndroid Build Coastguard Worker for(m = 0; m < i4_layer_wd_mbs; m++)
718*495ae853SAndroid Build Coastguard Worker {
719*495ae853SAndroid Build Coastguard Worker ps_mb_state[l * i4_layer_wd_mbs + m].pi4_ref_array_positions_x =
720*495ae853SAndroid Build Coastguard Worker pi4_ref_array_positions_x + m * au4_ref_xpos_array_size[k];
721*495ae853SAndroid Build Coastguard Worker ps_mb_state[l * i4_layer_wd_mbs + m].pi4_ref_array_positions_y =
722*495ae853SAndroid Build Coastguard Worker pi4_ref_array_positions_y + l * au4_ref_ypos_array_size[k];
723*495ae853SAndroid Build Coastguard Worker
724*495ae853SAndroid Build Coastguard Worker ps_mb_state[l * i4_layer_wd_mbs + m].ps_ref_array_phases =
725*495ae853SAndroid Build Coastguard Worker ps_ref_array_phases;
726*495ae853SAndroid Build Coastguard Worker }
727*495ae853SAndroid Build Coastguard Worker }
728*495ae853SAndroid Build Coastguard Worker
729*495ae853SAndroid Build Coastguard Worker pu1_buf += i4_layer_wd_mbs * au4_ref_xpos_array_size[k] *
730*495ae853SAndroid Build Coastguard Worker sizeof(pi4_ref_array_positions_x[0]);
731*495ae853SAndroid Build Coastguard Worker pu1_buf += i4_layer_ht_mbs * au4_ref_ypos_array_size[k] *
732*495ae853SAndroid Build Coastguard Worker sizeof(pi4_ref_array_positions_y[0]);
733*495ae853SAndroid Build Coastguard Worker pu1_buf += au4_ref_phase_array_size[k] * sizeof(ps_ref_array_phases[0]);
734*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -= i4_layer_wd_mbs * au4_ref_xpos_array_size[k] *
735*495ae853SAndroid Build Coastguard Worker sizeof(pi4_ref_array_positions_x[0]);
736*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -= i4_layer_ht_mbs * au4_ref_ypos_array_size[k] *
737*495ae853SAndroid Build Coastguard Worker sizeof(pi4_ref_array_positions_y[0]);
738*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -=
739*495ae853SAndroid Build Coastguard Worker au4_ref_phase_array_size[k] * sizeof(ps_ref_array_phases[0]);
740*495ae853SAndroid Build Coastguard Worker }
741*495ae853SAndroid Build Coastguard Worker }
742*495ae853SAndroid Build Coastguard Worker else
743*495ae853SAndroid Build Coastguard Worker {
744*495ae853SAndroid Build Coastguard Worker intra_pred_mb_state_t *ps_mb_state;
745*495ae853SAndroid Build Coastguard Worker coordinates_t *ps_ref_array_phases;
746*495ae853SAndroid Build Coastguard Worker
747*495ae853SAndroid Build Coastguard Worker for(k = 0; k < NUM_SP_COMPONENTS; k++)
748*495ae853SAndroid Build Coastguard Worker {
749*495ae853SAndroid Build Coastguard Worker bool b_is_chroma = ((COMPONENT_TYPE) k) != Y;
750*495ae853SAndroid Build Coastguard Worker
751*495ae853SAndroid Build Coastguard Worker ps_mb_state = b_is_chroma ? ps_layer_state->ps_chroma_mb_states
752*495ae853SAndroid Build Coastguard Worker : ps_layer_state->ps_luma_mb_states;
753*495ae853SAndroid Build Coastguard Worker ps_ref_array_phases = b_is_chroma ? ((coordinates_t *) pu1_buf) : NULL;
754*495ae853SAndroid Build Coastguard Worker
755*495ae853SAndroid Build Coastguard Worker for(l = 0; l < i4_num_mb_states; l++)
756*495ae853SAndroid Build Coastguard Worker {
757*495ae853SAndroid Build Coastguard Worker ps_mb_state[l].pi4_ref_array_positions_x = NULL;
758*495ae853SAndroid Build Coastguard Worker ps_mb_state[l].pi4_ref_array_positions_y = NULL;
759*495ae853SAndroid Build Coastguard Worker ps_mb_state[l].ps_ref_array_phases = ps_ref_array_phases;
760*495ae853SAndroid Build Coastguard Worker }
761*495ae853SAndroid Build Coastguard Worker }
762*495ae853SAndroid Build Coastguard Worker
763*495ae853SAndroid Build Coastguard Worker pu1_buf += au4_ref_phase_array_size[U] * sizeof(ps_ref_array_phases[0]);
764*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -=
765*495ae853SAndroid Build Coastguard Worker au4_ref_phase_array_size[U] * sizeof(ps_ref_array_phases[0]);
766*495ae853SAndroid Build Coastguard Worker }
767*495ae853SAndroid Build Coastguard Worker
768*495ae853SAndroid Build Coastguard Worker ps_layer_state->i4_mb_mode_stride = (i4_layer_luma_wd / MB_SIZE) + 2;
769*495ae853SAndroid Build Coastguard Worker ps_layer_state->pi1_mb_mode = (WORD8 *) pu1_buf;
770*495ae853SAndroid Build Coastguard Worker ps_layer_state->pi1_mb_mode += ps_layer_state->i4_mb_mode_stride + 1;
771*495ae853SAndroid Build Coastguard Worker api4_mb_modes[i] = ps_layer_state->pi1_mb_mode;
772*495ae853SAndroid Build Coastguard Worker pu1_buf += i4_layer_luma_mbs * sizeof(ps_layer_state->pi1_mb_mode[0]);
773*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -=
774*495ae853SAndroid Build Coastguard Worker u1_num_spatial_layers * sizeof(ps_layer_state->pi1_mb_mode[0]);
775*495ae853SAndroid Build Coastguard Worker memset(ps_layer_state->pi1_mb_mode, -1, i4_layer_luma_mbs);
776*495ae853SAndroid Build Coastguard Worker
777*495ae853SAndroid Build Coastguard Worker if(i > 0)
778*495ae853SAndroid Build Coastguard Worker {
779*495ae853SAndroid Build Coastguard Worker /* Asserts below verify that
780*495ae853SAndroid Build Coastguard Worker * 'ps_codec->s_svc_ilp_data.aps_layer_resampler_props' is initialised
781*495ae853SAndroid Build Coastguard Worker */
782*495ae853SAndroid Build Coastguard Worker ASSERT(ps_codec->s_svc_ilp_data.aps_layer_resampler_props[Y][i].u4_mb_wd ==
783*495ae853SAndroid Build Coastguard Worker MB_SIZE);
784*495ae853SAndroid Build Coastguard Worker ASSERT(ps_codec->s_svc_ilp_data.aps_layer_resampler_props[UV][i].u4_mb_wd ==
785*495ae853SAndroid Build Coastguard Worker (MB_SIZE / 2));
786*495ae853SAndroid Build Coastguard Worker
787*495ae853SAndroid Build Coastguard Worker ps_layer_state->ps_luma_props =
788*495ae853SAndroid Build Coastguard Worker &ps_codec->s_svc_ilp_data.aps_layer_resampler_props[Y][i];
789*495ae853SAndroid Build Coastguard Worker ps_layer_state->ps_chroma_props =
790*495ae853SAndroid Build Coastguard Worker &ps_codec->s_svc_ilp_data.aps_layer_resampler_props[UV][i];
791*495ae853SAndroid Build Coastguard Worker
792*495ae853SAndroid Build Coastguard Worker isvce_ibl_layer_state_init(
793*495ae853SAndroid Build Coastguard Worker ps_layer_state, d_spatial_res_ratio, i4_layer_luma_wd, i4_layer_luma_ht,
794*495ae853SAndroid Build Coastguard Worker ps_codec->s_cfg.u4_max_level, ps_codec->s_cfg.e_inp_color_fmt);
795*495ae853SAndroid Build Coastguard Worker }
796*495ae853SAndroid Build Coastguard Worker else
797*495ae853SAndroid Build Coastguard Worker {
798*495ae853SAndroid Build Coastguard Worker ps_layer_state->ps_luma_props = NULL;
799*495ae853SAndroid Build Coastguard Worker ps_layer_state->ps_chroma_props = NULL;
800*495ae853SAndroid Build Coastguard Worker }
801*495ae853SAndroid Build Coastguard Worker }
802*495ae853SAndroid Build Coastguard Worker else
803*495ae853SAndroid Build Coastguard Worker {
804*495ae853SAndroid Build Coastguard Worker ps_layer_state->ps_luma_mb_states = aps_luma_mb_states[i];
805*495ae853SAndroid Build Coastguard Worker ps_layer_state->ps_chroma_mb_states = aps_chroma_mb_states[i];
806*495ae853SAndroid Build Coastguard Worker
807*495ae853SAndroid Build Coastguard Worker ps_layer_state->i4_mb_mode_stride = (i4_layer_luma_wd / MB_SIZE) + 2;
808*495ae853SAndroid Build Coastguard Worker ps_layer_state->pi1_mb_mode = api4_mb_modes[i];
809*495ae853SAndroid Build Coastguard Worker
810*495ae853SAndroid Build Coastguard Worker if(i > 0)
811*495ae853SAndroid Build Coastguard Worker {
812*495ae853SAndroid Build Coastguard Worker ps_layer_state->ps_luma_props =
813*495ae853SAndroid Build Coastguard Worker &ps_codec->s_svc_ilp_data.aps_layer_resampler_props[Y][i];
814*495ae853SAndroid Build Coastguard Worker ps_layer_state->ps_chroma_props =
815*495ae853SAndroid Build Coastguard Worker &ps_codec->s_svc_ilp_data.aps_layer_resampler_props[UV][i];
816*495ae853SAndroid Build Coastguard Worker }
817*495ae853SAndroid Build Coastguard Worker else
818*495ae853SAndroid Build Coastguard Worker {
819*495ae853SAndroid Build Coastguard Worker ps_layer_state->ps_luma_props = NULL;
820*495ae853SAndroid Build Coastguard Worker ps_layer_state->ps_chroma_props = NULL;
821*495ae853SAndroid Build Coastguard Worker }
822*495ae853SAndroid Build Coastguard Worker }
823*495ae853SAndroid Build Coastguard Worker
824*495ae853SAndroid Build Coastguard Worker ps_layer_state->pu1_refarray_buffer = (UWORD8 *) pu1_buf;
825*495ae853SAndroid Build Coastguard Worker memset(ps_layer_state->pu1_refarray_buffer, 0, TEMP_BUF_SIZE_LUMA * sizeof(UWORD8));
826*495ae853SAndroid Build Coastguard Worker pu1_buf += TEMP_BUF_SIZE_LUMA * sizeof(UWORD8);
827*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -= TEMP_BUF_SIZE_LUMA * sizeof(UWORD8);
828*495ae853SAndroid Build Coastguard Worker
829*495ae853SAndroid Build Coastguard Worker ps_layer_state->pu1_refarray_cb = (UWORD8 *) pu1_buf;
830*495ae853SAndroid Build Coastguard Worker memset(ps_layer_state->pu1_refarray_cb, 0, TEMP_BUF_SIZE_CB * sizeof(UWORD8));
831*495ae853SAndroid Build Coastguard Worker pu1_buf += TEMP_BUF_SIZE_CB * sizeof(UWORD8);
832*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -= TEMP_BUF_SIZE_CB * sizeof(UWORD8);
833*495ae853SAndroid Build Coastguard Worker
834*495ae853SAndroid Build Coastguard Worker ps_layer_state->pu1_refarray_cr = (UWORD8 *) pu1_buf;
835*495ae853SAndroid Build Coastguard Worker memset(ps_layer_state->pu1_refarray_cr, 0, TEMP_BUF_SIZE_CR * sizeof(UWORD8));
836*495ae853SAndroid Build Coastguard Worker pu1_buf += TEMP_BUF_SIZE_CR * sizeof(UWORD8);
837*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -= TEMP_BUF_SIZE_CR * sizeof(UWORD8);
838*495ae853SAndroid Build Coastguard Worker
839*495ae853SAndroid Build Coastguard Worker ps_layer_state->pi4_temp_interpolation_buffer = (WORD32 *) pu1_buf;
840*495ae853SAndroid Build Coastguard Worker pu1_buf += (TEMP_INTERPOLATION_BUF_SIZE * sizeof(WORD32));
841*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -= (TEMP_INTERPOLATION_BUF_SIZE * sizeof(WORD32));
842*495ae853SAndroid Build Coastguard Worker
843*495ae853SAndroid Build Coastguard Worker ASSERT(i8_alloc_mem_size >= 0);
844*495ae853SAndroid Build Coastguard Worker }
845*495ae853SAndroid Build Coastguard Worker }
846*495ae853SAndroid Build Coastguard Worker
847*495ae853SAndroid Build Coastguard Worker for(i = 0; i < i4_num_proc_ctxts; i++)
848*495ae853SAndroid Build Coastguard Worker {
849*495ae853SAndroid Build Coastguard Worker isvce_process_ctxt_t *ps_proc = &ps_codec->as_process[i];
850*495ae853SAndroid Build Coastguard Worker svc_intra_pred_ctxt_t *ps_intra_pred_ctxt = ps_proc->ps_intra_pred_ctxt;
851*495ae853SAndroid Build Coastguard Worker yuv_buf_props_t *ps_mb_intra_pred_buf =
852*495ae853SAndroid Build Coastguard Worker &ps_intra_pred_ctxt->s_intra_pred_outputs.s_pred_buf;
853*495ae853SAndroid Build Coastguard Worker
854*495ae853SAndroid Build Coastguard Worker ps_proc->ps_mb_pred_buf = ps_mb_intra_pred_buf;
855*495ae853SAndroid Build Coastguard Worker
856*495ae853SAndroid Build Coastguard Worker for(j = 0; j < NUM_SP_COMPONENTS; j++)
857*495ae853SAndroid Build Coastguard Worker {
858*495ae853SAndroid Build Coastguard Worker buffer_container_t *ps_comp_buf = &ps_mb_intra_pred_buf->as_component_bufs[j];
859*495ae853SAndroid Build Coastguard Worker
860*495ae853SAndroid Build Coastguard Worker ps_comp_buf->pv_data = pu1_buf;
861*495ae853SAndroid Build Coastguard Worker ps_comp_buf->i4_data_stride = MB_SIZE;
862*495ae853SAndroid Build Coastguard Worker pu1_buf += MB_SIZE * MB_SIZE * sizeof(UWORD8);
863*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -= MB_SIZE * MB_SIZE * sizeof(WORD8);
864*495ae853SAndroid Build Coastguard Worker
865*495ae853SAndroid Build Coastguard Worker ASSERT(i8_alloc_mem_size >= 0);
866*495ae853SAndroid Build Coastguard Worker }
867*495ae853SAndroid Build Coastguard Worker
868*495ae853SAndroid Build Coastguard Worker ps_mb_intra_pred_buf->as_component_bufs[V].pv_data = NULL;
869*495ae853SAndroid Build Coastguard Worker ps_mb_intra_pred_buf->e_color_format = IV_YUV_420SP_UV;
870*495ae853SAndroid Build Coastguard Worker ps_mb_intra_pred_buf->u1_bit_depth = 16;
871*495ae853SAndroid Build Coastguard Worker ps_mb_intra_pred_buf->u4_width = MB_SIZE;
872*495ae853SAndroid Build Coastguard Worker ps_mb_intra_pred_buf->u4_height = MB_SIZE;
873*495ae853SAndroid Build Coastguard Worker }
874*495ae853SAndroid Build Coastguard Worker }
875*495ae853SAndroid Build Coastguard Worker else
876*495ae853SAndroid Build Coastguard Worker {
877*495ae853SAndroid Build Coastguard Worker for(i = 0; i < i4_num_proc_ctxts; i++)
878*495ae853SAndroid Build Coastguard Worker {
879*495ae853SAndroid Build Coastguard Worker isvce_process_ctxt_t *ps_proc = &ps_codec->as_process[i];
880*495ae853SAndroid Build Coastguard Worker
881*495ae853SAndroid Build Coastguard Worker ps_proc->ps_intra_pred_ctxt = NULL;
882*495ae853SAndroid Build Coastguard Worker }
883*495ae853SAndroid Build Coastguard Worker }
884*495ae853SAndroid Build Coastguard Worker }
885*495ae853SAndroid Build Coastguard Worker
isvce_intra_sampling_function_selector(intra_sampling_ctxt_t * ps_ctxt,DOUBLE d_spatial_res_ratio,IV_ARCH_T e_arch)886*495ae853SAndroid Build Coastguard Worker void isvce_intra_sampling_function_selector(intra_sampling_ctxt_t *ps_ctxt,
887*495ae853SAndroid Build Coastguard Worker DOUBLE d_spatial_res_ratio, IV_ARCH_T e_arch)
888*495ae853SAndroid Build Coastguard Worker {
889*495ae853SAndroid Build Coastguard Worker if(2. == d_spatial_res_ratio)
890*495ae853SAndroid Build Coastguard Worker {
891*495ae853SAndroid Build Coastguard Worker switch(e_arch)
892*495ae853SAndroid Build Coastguard Worker {
893*495ae853SAndroid Build Coastguard Worker #if defined(X86)
894*495ae853SAndroid Build Coastguard Worker case ARCH_X86_SSE42:
895*495ae853SAndroid Build Coastguard Worker {
896*495ae853SAndroid Build Coastguard Worker ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id].pf_horz_interpol_chroma =
897*495ae853SAndroid Build Coastguard Worker isvc_horz_interpol_chroma_dyadic_sse42;
898*495ae853SAndroid Build Coastguard Worker ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id].pf_vert_interpol_chroma =
899*495ae853SAndroid Build Coastguard Worker isvc_vert_interpol_chroma_dyadic_sse42;
900*495ae853SAndroid Build Coastguard Worker ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id].pf_interpolate_luma =
901*495ae853SAndroid Build Coastguard Worker isvc_interpolate_base_luma_dyadic_sse42;
902*495ae853SAndroid Build Coastguard Worker
903*495ae853SAndroid Build Coastguard Worker break;
904*495ae853SAndroid Build Coastguard Worker }
905*495ae853SAndroid Build Coastguard Worker #elif defined(ARMV8)
906*495ae853SAndroid Build Coastguard Worker case ARCH_ARM_A53:
907*495ae853SAndroid Build Coastguard Worker case ARCH_ARM_A57:
908*495ae853SAndroid Build Coastguard Worker case ARCH_ARM_V8_NEON:
909*495ae853SAndroid Build Coastguard Worker {
910*495ae853SAndroid Build Coastguard Worker ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id].pf_horz_interpol_chroma =
911*495ae853SAndroid Build Coastguard Worker isvc_horz_interpol_chroma_dyadic_neon;
912*495ae853SAndroid Build Coastguard Worker ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id].pf_vert_interpol_chroma =
913*495ae853SAndroid Build Coastguard Worker isvc_vert_interpol_chroma_dyadic_neon;
914*495ae853SAndroid Build Coastguard Worker ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id].pf_interpolate_luma =
915*495ae853SAndroid Build Coastguard Worker isvc_interpolate_base_luma_dyadic_neon;
916*495ae853SAndroid Build Coastguard Worker
917*495ae853SAndroid Build Coastguard Worker break;
918*495ae853SAndroid Build Coastguard Worker }
919*495ae853SAndroid Build Coastguard Worker #elif defined(ARM) && !defined(DISABLE_NEON)
920*495ae853SAndroid Build Coastguard Worker case ARCH_ARM_A9Q:
921*495ae853SAndroid Build Coastguard Worker case ARCH_ARM_A9A:
922*495ae853SAndroid Build Coastguard Worker case ARCH_ARM_A9:
923*495ae853SAndroid Build Coastguard Worker case ARCH_ARM_A7:
924*495ae853SAndroid Build Coastguard Worker case ARCH_ARM_A5:
925*495ae853SAndroid Build Coastguard Worker case ARCH_ARM_A15:
926*495ae853SAndroid Build Coastguard Worker {
927*495ae853SAndroid Build Coastguard Worker ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id].pf_horz_interpol_chroma =
928*495ae853SAndroid Build Coastguard Worker isvc_horz_interpol_chroma_dyadic_neon;
929*495ae853SAndroid Build Coastguard Worker ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id].pf_vert_interpol_chroma =
930*495ae853SAndroid Build Coastguard Worker isvc_vert_interpol_chroma_dyadic_neon;
931*495ae853SAndroid Build Coastguard Worker ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id].pf_interpolate_luma =
932*495ae853SAndroid Build Coastguard Worker isvc_interpolate_base_luma_dyadic_neon;
933*495ae853SAndroid Build Coastguard Worker
934*495ae853SAndroid Build Coastguard Worker break;
935*495ae853SAndroid Build Coastguard Worker }
936*495ae853SAndroid Build Coastguard Worker #endif
937*495ae853SAndroid Build Coastguard Worker default:
938*495ae853SAndroid Build Coastguard Worker {
939*495ae853SAndroid Build Coastguard Worker ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id].pf_horz_interpol_chroma =
940*495ae853SAndroid Build Coastguard Worker isvc_horz_interpol_chroma_dyadic;
941*495ae853SAndroid Build Coastguard Worker ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id].pf_vert_interpol_chroma =
942*495ae853SAndroid Build Coastguard Worker isvc_vert_interpol_chroma_dyadic;
943*495ae853SAndroid Build Coastguard Worker ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id].pf_interpolate_luma =
944*495ae853SAndroid Build Coastguard Worker isvc_interpolate_base_luma_dyadic;
945*495ae853SAndroid Build Coastguard Worker
946*495ae853SAndroid Build Coastguard Worker break;
947*495ae853SAndroid Build Coastguard Worker }
948*495ae853SAndroid Build Coastguard Worker }
949*495ae853SAndroid Build Coastguard Worker }
950*495ae853SAndroid Build Coastguard Worker }
951*495ae853SAndroid Build Coastguard Worker
isvce_get_mb_intra_pred(isvce_process_ctxt_t * ps_proc)952*495ae853SAndroid Build Coastguard Worker static void isvce_get_mb_intra_pred(isvce_process_ctxt_t *ps_proc)
953*495ae853SAndroid Build Coastguard Worker {
954*495ae853SAndroid Build Coastguard Worker mem_element_t s_ref_mb_mode;
955*495ae853SAndroid Build Coastguard Worker mem_element_t s_inp_luma;
956*495ae853SAndroid Build Coastguard Worker mem_element_t s_inp_chroma;
957*495ae853SAndroid Build Coastguard Worker mem_element_t s_out_luma;
958*495ae853SAndroid Build Coastguard Worker mem_element_t s_out_chroma;
959*495ae853SAndroid Build Coastguard Worker
960*495ae853SAndroid Build Coastguard Worker coordinates_t s_frame_dims;
961*495ae853SAndroid Build Coastguard Worker coordinates_t s_frame_dims_in_mbs;
962*495ae853SAndroid Build Coastguard Worker
963*495ae853SAndroid Build Coastguard Worker WORD32 i4_cur_stride;
964*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_stride;
965*495ae853SAndroid Build Coastguard Worker WORD32 i;
966*495ae853SAndroid Build Coastguard Worker
967*495ae853SAndroid Build Coastguard Worker intra_sampling_ctxt_t s_intra_samp_ctxt[NUM_SP_COMPONENTS];
968*495ae853SAndroid Build Coastguard Worker isvce_codec_t *ps_codec = ps_proc->ps_codec;
969*495ae853SAndroid Build Coastguard Worker svc_intra_pred_ctxt_t *ps_intra_pred_ctxt = ps_proc->ps_intra_pred_ctxt;
970*495ae853SAndroid Build Coastguard Worker intra_pred_state_t *ps_intra_pred_state =
971*495ae853SAndroid Build Coastguard Worker (intra_pred_state_t *) (ps_intra_pred_ctxt->s_intra_pred_constants.pv_state);
972*495ae853SAndroid Build Coastguard Worker intra_pred_layer_state_t *ps_layer_state =
973*495ae853SAndroid Build Coastguard Worker &ps_intra_pred_state->ps_layer_state[ps_proc->u1_spatial_layer_id];
974*495ae853SAndroid Build Coastguard Worker intra_pred_layer_state_t *ps_ref_layer_state =
975*495ae853SAndroid Build Coastguard Worker &ps_intra_pred_state->ps_layer_state[ps_proc->u1_spatial_layer_id - 1];
976*495ae853SAndroid Build Coastguard Worker
977*495ae853SAndroid Build Coastguard Worker intra_pred_mb_state_t *ps_luma_mb_state;
978*495ae853SAndroid Build Coastguard Worker intra_pred_mb_state_t *ps_chroma_mb_state;
979*495ae853SAndroid Build Coastguard Worker
980*495ae853SAndroid Build Coastguard Worker coordinates_t *ps_mb_pos = &ps_intra_pred_ctxt->s_intra_pred_variables.s_mb_pos;
981*495ae853SAndroid Build Coastguard Worker svc_ilp_data_t *ps_svc_ilp_data = ps_intra_pred_ctxt->s_intra_pred_variables.ps_svc_ilp_data;
982*495ae853SAndroid Build Coastguard Worker
983*495ae853SAndroid Build Coastguard Worker s_frame_dims.i4_abscissa =
984*495ae853SAndroid Build Coastguard Worker ps_svc_ilp_data->ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id].u4_width;
985*495ae853SAndroid Build Coastguard Worker s_frame_dims.i4_ordinate =
986*495ae853SAndroid Build Coastguard Worker ps_svc_ilp_data->ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id].u4_height;
987*495ae853SAndroid Build Coastguard Worker s_frame_dims_in_mbs.i4_abscissa = s_frame_dims.i4_abscissa / MB_SIZE;
988*495ae853SAndroid Build Coastguard Worker s_frame_dims_in_mbs.i4_ordinate = s_frame_dims.i4_ordinate / MB_SIZE;
989*495ae853SAndroid Build Coastguard Worker
990*495ae853SAndroid Build Coastguard Worker ps_luma_mb_state = ps_layer_state->ps_luma_mb_states + ps_mb_pos->i4_abscissa +
991*495ae853SAndroid Build Coastguard Worker ps_mb_pos->i4_ordinate * s_frame_dims_in_mbs.i4_abscissa;
992*495ae853SAndroid Build Coastguard Worker ps_chroma_mb_state = ps_layer_state->ps_chroma_mb_states + ps_mb_pos->i4_abscissa +
993*495ae853SAndroid Build Coastguard Worker ps_mb_pos->i4_ordinate * s_frame_dims_in_mbs.i4_abscissa;
994*495ae853SAndroid Build Coastguard Worker
995*495ae853SAndroid Build Coastguard Worker for(i = 0; i < NUM_SP_COMPONENTS; i++)
996*495ae853SAndroid Build Coastguard Worker {
997*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ref_wd, u4_ref_ht;
998*495ae853SAndroid Build Coastguard Worker
999*495ae853SAndroid Build Coastguard Worker bool b_is_chroma = (Y != ((COMPONENT_TYPE) i));
1000*495ae853SAndroid Build Coastguard Worker mem_element_t *ps_buf = b_is_chroma ? &s_out_chroma : &s_out_luma;
1001*495ae853SAndroid Build Coastguard Worker intra_pred_mb_state_t *ps_mb_state = b_is_chroma ? ps_chroma_mb_state : ps_luma_mb_state;
1002*495ae853SAndroid Build Coastguard Worker layer_resampler_props_t *ps_layer_props =
1003*495ae853SAndroid Build Coastguard Worker b_is_chroma ? ps_layer_state->ps_chroma_props : ps_layer_state->ps_luma_props;
1004*495ae853SAndroid Build Coastguard Worker
1005*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].i4_res_lyr_id = ps_proc->u1_spatial_layer_id;
1006*495ae853SAndroid Build Coastguard Worker
1007*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].i4_refarray_stride = REF_ARRAY_WIDTH;
1008*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].i4_ref_width =
1009*495ae853SAndroid Build Coastguard Worker ps_svc_ilp_data->ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id - 1].u4_width;
1010*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].i4_ref_height =
1011*495ae853SAndroid Build Coastguard Worker ps_svc_ilp_data->ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id - 1].u4_height;
1012*495ae853SAndroid Build Coastguard Worker
1013*495ae853SAndroid Build Coastguard Worker isvce_intra_sampling_function_selector(&s_intra_samp_ctxt[i],
1014*495ae853SAndroid Build Coastguard Worker ps_codec->s_cfg.s_svc_params.d_spatial_res_ratio,
1015*495ae853SAndroid Build Coastguard Worker ps_codec->s_cfg.e_arch);
1016*495ae853SAndroid Build Coastguard Worker
1017*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].pu1_refarray_buffer = ps_layer_state->pu1_refarray_buffer;
1018*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].pu1_refarray_cb = ps_layer_state->pu1_refarray_cb;
1019*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].pu1_refarray_cr = ps_layer_state->pu1_refarray_cr;
1020*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].pi4_temp_interpolation_buffer =
1021*495ae853SAndroid Build Coastguard Worker ps_layer_state->pi4_temp_interpolation_buffer;
1022*495ae853SAndroid Build Coastguard Worker
1023*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].ps_mb_pos = ps_mb_pos;
1024*495ae853SAndroid Build Coastguard Worker
1025*495ae853SAndroid Build Coastguard Worker /* Phase is used only by chroma functions */
1026*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].i4_x_phase_0 =
1027*495ae853SAndroid Build Coastguard Worker ps_chroma_mb_state->ps_ref_array_phases[0].i4_abscissa;
1028*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].i4_x_phase_1 =
1029*495ae853SAndroid Build Coastguard Worker ps_chroma_mb_state->ps_ref_array_phases[1].i4_abscissa;
1030*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].i4_y_phase_0 =
1031*495ae853SAndroid Build Coastguard Worker ps_chroma_mb_state->ps_ref_array_phases[0].i4_ordinate;
1032*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].i4_y_phase_1 =
1033*495ae853SAndroid Build Coastguard Worker ps_chroma_mb_state->ps_ref_array_phases[2].i4_ordinate;
1034*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i]
1035*495ae853SAndroid Build Coastguard Worker .as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id]
1036*495ae853SAndroid Build Coastguard Worker .i1_constrained_intra_rsmpl_flag = 0;
1037*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].i4_ref_width =
1038*495ae853SAndroid Build Coastguard Worker ps_svc_ilp_data->ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id - 1].u4_width;
1039*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].i4_ref_height =
1040*495ae853SAndroid Build Coastguard Worker ps_svc_ilp_data->ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id - 1].u4_height;
1041*495ae853SAndroid Build Coastguard Worker
1042*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].i2_x_min_pos =
1043*495ae853SAndroid Build Coastguard Worker ps_mb_state->s_min_pos.i4_abscissa;
1044*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].i2_x_max_pos =
1045*495ae853SAndroid Build Coastguard Worker ps_mb_state->s_max_pos.i4_abscissa;
1046*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].i2_y_min_pos =
1047*495ae853SAndroid Build Coastguard Worker ps_mb_state->s_min_pos.i4_ordinate;
1048*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].i2_y_max_pos =
1049*495ae853SAndroid Build Coastguard Worker ps_mb_state->s_max_pos.i4_ordinate;
1050*495ae853SAndroid Build Coastguard Worker
1051*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].ps_phase =
1052*495ae853SAndroid Build Coastguard Worker ps_mb_state->ps_ref_array_phases;
1053*495ae853SAndroid Build Coastguard Worker
1054*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i]
1055*495ae853SAndroid Build Coastguard Worker .as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id]
1056*495ae853SAndroid Build Coastguard Worker .pi4_ref_array_positions_x = ps_mb_state->pi4_ref_array_positions_x;
1057*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i]
1058*495ae853SAndroid Build Coastguard Worker .as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id]
1059*495ae853SAndroid Build Coastguard Worker .pi4_ref_array_positions_y = ps_mb_state->pi4_ref_array_positions_y;
1060*495ae853SAndroid Build Coastguard Worker
1061*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].ps_offsets =
1062*495ae853SAndroid Build Coastguard Worker &ps_mb_state->s_offsets;
1063*495ae853SAndroid Build Coastguard Worker
1064*495ae853SAndroid Build Coastguard Worker s_intra_samp_ctxt[i].as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id].ps_ref_array_dims =
1065*495ae853SAndroid Build Coastguard Worker &ps_mb_state->s_ref_array_dims;
1066*495ae853SAndroid Build Coastguard Worker
1067*495ae853SAndroid Build Coastguard Worker i4_cur_stride =
1068*495ae853SAndroid Build Coastguard Worker ps_intra_pred_ctxt->s_intra_pred_outputs.s_pred_buf.as_component_bufs[i].i4_data_stride;
1069*495ae853SAndroid Build Coastguard Worker ps_buf->pv_buffer =
1070*495ae853SAndroid Build Coastguard Worker (UWORD8 *) (ps_intra_pred_ctxt->s_intra_pred_outputs.s_pred_buf.as_component_bufs[i]
1071*495ae853SAndroid Build Coastguard Worker .pv_data);
1072*495ae853SAndroid Build Coastguard Worker
1073*495ae853SAndroid Build Coastguard Worker ps_buf->i4_element_size = 1;
1074*495ae853SAndroid Build Coastguard Worker ps_buf->i4_num_element_stride = i4_cur_stride;
1075*495ae853SAndroid Build Coastguard Worker
1076*495ae853SAndroid Build Coastguard Worker ps_buf = b_is_chroma ? &s_inp_chroma : &s_inp_luma;
1077*495ae853SAndroid Build Coastguard Worker
1078*495ae853SAndroid Build Coastguard Worker i4_ref_stride = ps_svc_ilp_data->ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id - 1]
1079*495ae853SAndroid Build Coastguard Worker .as_component_bufs[i]
1080*495ae853SAndroid Build Coastguard Worker .i4_data_stride;
1081*495ae853SAndroid Build Coastguard Worker
1082*495ae853SAndroid Build Coastguard Worker u4_ref_wd = ps_svc_ilp_data->ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id - 1].u4_width;
1083*495ae853SAndroid Build Coastguard Worker u4_ref_ht =
1084*495ae853SAndroid Build Coastguard Worker ps_svc_ilp_data->ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id - 1].u4_height;
1085*495ae853SAndroid Build Coastguard Worker
1086*495ae853SAndroid Build Coastguard Worker /* For chroma, filteringModeFlag=1 */
1087*495ae853SAndroid Build Coastguard Worker /* If filteringModeFlag=1, interpolation requires samples at an offset of -1
1088*495ae853SAndroid Build Coastguard Worker * along both directions */
1089*495ae853SAndroid Build Coastguard Worker if(ps_proc->s_svc_params.d_spatial_res_ratio == 2.0)
1090*495ae853SAndroid Build Coastguard Worker {
1091*495ae853SAndroid Build Coastguard Worker WORD8 i1_x_odd, i1_y_odd;
1092*495ae853SAndroid Build Coastguard Worker
1093*495ae853SAndroid Build Coastguard Worker ps_buf->pv_buffer =
1094*495ae853SAndroid Build Coastguard Worker (UWORD8 *) ps_svc_ilp_data->ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id - 1]
1095*495ae853SAndroid Build Coastguard Worker .as_component_bufs[i]
1096*495ae853SAndroid Build Coastguard Worker .pv_data +
1097*495ae853SAndroid Build Coastguard Worker (ps_mb_state->s_offsets.i4_abscissa << b_is_chroma) +
1098*495ae853SAndroid Build Coastguard Worker ps_mb_state->s_offsets.i4_ordinate * i4_ref_stride;
1099*495ae853SAndroid Build Coastguard Worker
1100*495ae853SAndroid Build Coastguard Worker if(!b_is_chroma)
1101*495ae853SAndroid Build Coastguard Worker {
1102*495ae853SAndroid Build Coastguard Worker ps_buf->pv_buffer = ((UWORD8 *) ps_buf->pv_buffer) + -1 + -1 * i4_ref_stride;
1103*495ae853SAndroid Build Coastguard Worker }
1104*495ae853SAndroid Build Coastguard Worker
1105*495ae853SAndroid Build Coastguard Worker i1_x_odd = (ps_proc->i4_mb_x & 1);
1106*495ae853SAndroid Build Coastguard Worker i1_y_odd = (ps_proc->i4_mb_y & 1);
1107*495ae853SAndroid Build Coastguard Worker
1108*495ae853SAndroid Build Coastguard Worker if(i1_x_odd)
1109*495ae853SAndroid Build Coastguard Worker {
1110*495ae853SAndroid Build Coastguard Worker ps_buf->pv_buffer = (UWORD8 *) ps_buf->pv_buffer - 8;
1111*495ae853SAndroid Build Coastguard Worker }
1112*495ae853SAndroid Build Coastguard Worker if(i1_y_odd)
1113*495ae853SAndroid Build Coastguard Worker {
1114*495ae853SAndroid Build Coastguard Worker ps_buf->pv_buffer =
1115*495ae853SAndroid Build Coastguard Worker (UWORD8 *) ps_buf->pv_buffer - ((8 >> b_is_chroma) * i4_ref_stride);
1116*495ae853SAndroid Build Coastguard Worker }
1117*495ae853SAndroid Build Coastguard Worker }
1118*495ae853SAndroid Build Coastguard Worker else
1119*495ae853SAndroid Build Coastguard Worker {
1120*495ae853SAndroid Build Coastguard Worker WORD32 i4_horz_dim = 0;
1121*495ae853SAndroid Build Coastguard Worker WORD32 i4_vert_dim = 0;
1122*495ae853SAndroid Build Coastguard Worker WORD32 i4_dim =
1123*495ae853SAndroid Build Coastguard Worker (WORD32) (ps_mb_state->s_max_pos.i4_abscissa - ps_mb_state->s_min_pos.i4_abscissa) +
1124*495ae853SAndroid Build Coastguard Worker (4 >> b_is_chroma);
1125*495ae853SAndroid Build Coastguard Worker
1126*495ae853SAndroid Build Coastguard Worker if(i4_dim > i4_horz_dim)
1127*495ae853SAndroid Build Coastguard Worker {
1128*495ae853SAndroid Build Coastguard Worker i4_horz_dim = i4_dim;
1129*495ae853SAndroid Build Coastguard Worker }
1130*495ae853SAndroid Build Coastguard Worker
1131*495ae853SAndroid Build Coastguard Worker i4_dim =
1132*495ae853SAndroid Build Coastguard Worker (WORD32) (ps_mb_state->s_max_pos.i4_ordinate - ps_mb_state->s_min_pos.i4_ordinate) +
1133*495ae853SAndroid Build Coastguard Worker (4 >> b_is_chroma);
1134*495ae853SAndroid Build Coastguard Worker
1135*495ae853SAndroid Build Coastguard Worker if(i4_dim > i4_vert_dim)
1136*495ae853SAndroid Build Coastguard Worker {
1137*495ae853SAndroid Build Coastguard Worker i4_vert_dim = i4_dim;
1138*495ae853SAndroid Build Coastguard Worker }
1139*495ae853SAndroid Build Coastguard Worker
1140*495ae853SAndroid Build Coastguard Worker isvc_intra_resamp_generate_segment_lookup(
1141*495ae853SAndroid Build Coastguard Worker &(s_intra_samp_ctxt[i]
1142*495ae853SAndroid Build Coastguard Worker .as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id]
1143*495ae853SAndroid Build Coastguard Worker .as_seg_lookup_horz[0]),
1144*495ae853SAndroid Build Coastguard Worker i4_horz_dim, ps_layer_props->u4_mb_wd, 3);
1145*495ae853SAndroid Build Coastguard Worker
1146*495ae853SAndroid Build Coastguard Worker isvc_intra_resamp_generate_segment_lookup(
1147*495ae853SAndroid Build Coastguard Worker &(s_intra_samp_ctxt[i]
1148*495ae853SAndroid Build Coastguard Worker .as_res_lyrs[s_intra_samp_ctxt[i].i4_res_lyr_id]
1149*495ae853SAndroid Build Coastguard Worker .as_seg_lookup_vert[0]),
1150*495ae853SAndroid Build Coastguard Worker i4_vert_dim, ps_layer_props->u4_mb_ht, 4);
1151*495ae853SAndroid Build Coastguard Worker
1152*495ae853SAndroid Build Coastguard Worker ps_buf->pv_buffer =
1153*495ae853SAndroid Build Coastguard Worker (UWORD8 *) ps_svc_ilp_data->ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id - 1]
1154*495ae853SAndroid Build Coastguard Worker .as_component_bufs[i]
1155*495ae853SAndroid Build Coastguard Worker .pv_data +
1156*495ae853SAndroid Build Coastguard Worker (CLIP3(0, (WORD32) u4_ref_wd - 1, ps_mb_state->s_offsets.i4_abscissa)
1157*495ae853SAndroid Build Coastguard Worker << b_is_chroma) +
1158*495ae853SAndroid Build Coastguard Worker CLIP3(0, (WORD32) u4_ref_ht - 1, ps_mb_state->s_offsets.i4_ordinate) *
1159*495ae853SAndroid Build Coastguard Worker i4_ref_stride;
1160*495ae853SAndroid Build Coastguard Worker }
1161*495ae853SAndroid Build Coastguard Worker
1162*495ae853SAndroid Build Coastguard Worker ps_buf->i4_element_size = 1;
1163*495ae853SAndroid Build Coastguard Worker ps_buf->i4_num_element_stride = i4_ref_stride;
1164*495ae853SAndroid Build Coastguard Worker }
1165*495ae853SAndroid Build Coastguard Worker
1166*495ae853SAndroid Build Coastguard Worker s_ref_mb_mode.i4_element_size = 1;
1167*495ae853SAndroid Build Coastguard Worker s_ref_mb_mode.i4_num_element_stride =
1168*495ae853SAndroid Build Coastguard Worker (ps_svc_ilp_data->ps_intra_recon_bufs[ps_proc->u1_spatial_layer_id - 1].u4_width >> 4) + 2;
1169*495ae853SAndroid Build Coastguard Worker s_ref_mb_mode.pv_buffer = ps_ref_layer_state->pi1_mb_mode;
1170*495ae853SAndroid Build Coastguard Worker
1171*495ae853SAndroid Build Coastguard Worker if(ps_proc->s_svc_params.d_spatial_res_ratio == 2.0)
1172*495ae853SAndroid Build Coastguard Worker {
1173*495ae853SAndroid Build Coastguard Worker isvc_intra_samp_mb_dyadic(&s_intra_samp_ctxt[Y], &s_inp_luma, &s_inp_chroma, &s_ref_mb_mode,
1174*495ae853SAndroid Build Coastguard Worker &s_out_luma, &s_out_chroma, ps_proc->i4_mb_x, ps_proc->i4_mb_y, 0,
1175*495ae853SAndroid Build Coastguard Worker 0);
1176*495ae853SAndroid Build Coastguard Worker }
1177*495ae853SAndroid Build Coastguard Worker else
1178*495ae853SAndroid Build Coastguard Worker {
1179*495ae853SAndroid Build Coastguard Worker isvc_intra_samp_mb(&s_intra_samp_ctxt[Y], &s_intra_samp_ctxt[UV], &s_inp_luma,
1180*495ae853SAndroid Build Coastguard Worker &s_inp_chroma, &s_ref_mb_mode, &s_out_luma, &s_out_chroma);
1181*495ae853SAndroid Build Coastguard Worker }
1182*495ae853SAndroid Build Coastguard Worker }
1183*495ae853SAndroid Build Coastguard Worker
isvce_get_sad(UWORD8 * pu1_src,UWORD8 * pu1_pred,UWORD32 src_strd,UWORD32 pred_strd,WORD32 * pi4_distortion,UWORD32 u4_width,UWORD32 u4_height)1184*495ae853SAndroid Build Coastguard Worker static FORCEINLINE void isvce_get_sad(UWORD8 *pu1_src, UWORD8 *pu1_pred, UWORD32 src_strd,
1185*495ae853SAndroid Build Coastguard Worker UWORD32 pred_strd, WORD32 *pi4_distortion, UWORD32 u4_width,
1186*495ae853SAndroid Build Coastguard Worker UWORD32 u4_height)
1187*495ae853SAndroid Build Coastguard Worker {
1188*495ae853SAndroid Build Coastguard Worker UWORD32 i, j;
1189*495ae853SAndroid Build Coastguard Worker *pi4_distortion = 0;
1190*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u4_width; i++)
1191*495ae853SAndroid Build Coastguard Worker {
1192*495ae853SAndroid Build Coastguard Worker for(j = 0; j < u4_height; j++)
1193*495ae853SAndroid Build Coastguard Worker {
1194*495ae853SAndroid Build Coastguard Worker *pi4_distortion += ABS(pu1_src[j] - pu1_pred[j]);
1195*495ae853SAndroid Build Coastguard Worker }
1196*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
1197*495ae853SAndroid Build Coastguard Worker pu1_pred += pred_strd;
1198*495ae853SAndroid Build Coastguard Worker }
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 * @brief
1205*495ae853SAndroid Build Coastguard Worker * evaluate IBL mode
1206*495ae853SAndroid Build Coastguard Worker *
1207*495ae853SAndroid Build Coastguard Worker * @par Description
1208*495ae853SAndroid Build Coastguard Worker * This function evaluates IBL mode for the macro-block
1209*495ae853SAndroid Build Coastguard Worker *
1210*495ae853SAndroid Build Coastguard Worker * @param[in] ps_proc_ctxt
1211*495ae853SAndroid Build Coastguard Worker * pointer to proc ctxt
1212*495ae853SAndroid Build Coastguard Worker *
1213*495ae853SAndroid Build Coastguard Worker * @return none
1214*495ae853SAndroid Build Coastguard Worker *
1215*495ae853SAndroid Build Coastguard Worker ******************************************************************************
1216*495ae853SAndroid Build Coastguard Worker */
isvce_evaluate_IBL_mode(isvce_process_ctxt_t * ps_proc)1217*495ae853SAndroid Build Coastguard Worker void isvce_evaluate_IBL_mode(isvce_process_ctxt_t *ps_proc)
1218*495ae853SAndroid Build Coastguard Worker {
1219*495ae853SAndroid Build Coastguard Worker isvce_codec_t *ps_codec = ps_proc->ps_codec;
1220*495ae853SAndroid Build Coastguard Worker svc_intra_pred_ctxt_t *ps_intra_pred_ctxt = ps_proc->ps_intra_pred_ctxt;
1221*495ae853SAndroid Build Coastguard Worker
1222*495ae853SAndroid Build Coastguard Worker /* SAD(distortion metric) of a block */
1223*495ae853SAndroid Build Coastguard Worker WORD32 i4_mb_distortion_least = INT_MAX;
1224*495ae853SAndroid Build Coastguard Worker
1225*495ae853SAndroid Build Coastguard Worker /* cost = distortion + lambda*rate */
1226*495ae853SAndroid Build Coastguard Worker WORD32 i4_mb_cost_least = INT_MAX;
1227*495ae853SAndroid Build Coastguard Worker
1228*495ae853SAndroid Build Coastguard Worker WORD32 i4_src_strd = ps_proc->s_src_buf_props.as_component_bufs[Y].i4_data_stride;
1229*495ae853SAndroid Build Coastguard Worker
1230*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_mb_src = (UWORD8 *) (ps_proc->s_src_buf_props.as_component_bufs[Y].pv_data);
1231*495ae853SAndroid Build Coastguard Worker
1232*495ae853SAndroid Build Coastguard Worker WORD32 u4_cur_stride =
1233*495ae853SAndroid Build Coastguard Worker ps_intra_pred_ctxt->s_intra_pred_outputs.s_pred_buf.as_component_bufs[Y].i4_data_stride;
1234*495ae853SAndroid Build Coastguard Worker
1235*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_mb_pred =
1236*495ae853SAndroid Build Coastguard Worker (UWORD8 *) (ps_intra_pred_ctxt->s_intra_pred_outputs.s_pred_buf.as_component_bufs[Y]
1237*495ae853SAndroid Build Coastguard Worker .pv_data);
1238*495ae853SAndroid Build Coastguard Worker
1239*495ae853SAndroid Build Coastguard Worker ps_intra_pred_ctxt->s_intra_pred_variables.ps_svc_ilp_data = &ps_codec->s_svc_ilp_data;
1240*495ae853SAndroid Build Coastguard Worker ps_intra_pred_ctxt->s_intra_pred_variables.s_mb_pos.i4_abscissa = ps_proc->i4_mb_x;
1241*495ae853SAndroid Build Coastguard Worker ps_intra_pred_ctxt->s_intra_pred_variables.s_mb_pos.i4_ordinate = ps_proc->i4_mb_y;
1242*495ae853SAndroid Build Coastguard Worker ps_intra_pred_ctxt->s_intra_pred_variables.u1_spatial_layer_id = ps_proc->u1_spatial_layer_id;
1243*495ae853SAndroid Build Coastguard Worker
1244*495ae853SAndroid Build Coastguard Worker isvce_get_mb_intra_pred(ps_proc);
1245*495ae853SAndroid Build Coastguard Worker
1246*495ae853SAndroid Build Coastguard Worker /* Luma cost */
1247*495ae853SAndroid Build Coastguard Worker isvce_get_sad(pu1_mb_src, pu1_mb_pred, i4_src_strd, u4_cur_stride, &i4_mb_distortion_least,
1248*495ae853SAndroid Build Coastguard Worker ps_intra_pred_ctxt->s_intra_pred_outputs.s_pred_buf.u4_width,
1249*495ae853SAndroid Build Coastguard Worker ps_intra_pred_ctxt->s_intra_pred_outputs.s_pred_buf.u4_height);
1250*495ae853SAndroid Build Coastguard Worker
1251*495ae853SAndroid Build Coastguard Worker /* cost = distortion + lambda*rate */
1252*495ae853SAndroid Build Coastguard Worker i4_mb_cost_least = i4_mb_distortion_least;
1253*495ae853SAndroid Build Coastguard Worker
1254*495ae853SAndroid Build Coastguard Worker /* update the type of the mb if necessary */
1255*495ae853SAndroid Build Coastguard Worker if(i4_mb_cost_least < ps_proc->i4_mb_cost)
1256*495ae853SAndroid Build Coastguard Worker {
1257*495ae853SAndroid Build Coastguard Worker ps_proc->i4_mb_cost = i4_mb_cost_least;
1258*495ae853SAndroid Build Coastguard Worker ps_proc->i4_mb_distortion = i4_mb_distortion_least;
1259*495ae853SAndroid Build Coastguard Worker ps_proc->ps_mb_info->i4_mb_distortion = i4_mb_distortion_least;
1260*495ae853SAndroid Build Coastguard Worker ps_proc->ps_mb_info->u2_mb_type = BASE_MODE;
1261*495ae853SAndroid Build Coastguard Worker ps_proc->ps_mb_info->u1_base_mode_flag = 1;
1262*495ae853SAndroid Build Coastguard Worker ps_proc->ps_mb_info->u1_is_intra = 1;
1263*495ae853SAndroid Build Coastguard Worker }
1264*495ae853SAndroid Build Coastguard Worker else if(ps_proc->ps_mb_info->u2_mb_type != BASE_MODE)
1265*495ae853SAndroid Build Coastguard Worker {
1266*495ae853SAndroid Build Coastguard Worker ps_proc->ps_mb_info->u1_base_mode_flag = 0;
1267*495ae853SAndroid Build Coastguard Worker }
1268*495ae853SAndroid Build Coastguard Worker }
1269*495ae853SAndroid Build Coastguard Worker
isvce_update_ibl_info(svc_intra_pred_ctxt_t * ps_intra_pred_ctxt,UWORD8 u1_num_spatial_layers,UWORD8 u1_spatial_layer_id,UWORD16 u2_mb_type,WORD32 i4_mb_x,WORD32 i4_mb_y,WORD8 u1_base_mode_flag)1270*495ae853SAndroid Build Coastguard Worker void isvce_update_ibl_info(svc_intra_pred_ctxt_t *ps_intra_pred_ctxt, UWORD8 u1_num_spatial_layers,
1271*495ae853SAndroid Build Coastguard Worker UWORD8 u1_spatial_layer_id, UWORD16 u2_mb_type, WORD32 i4_mb_x,
1272*495ae853SAndroid Build Coastguard Worker WORD32 i4_mb_y, WORD8 u1_base_mode_flag)
1273*495ae853SAndroid Build Coastguard Worker {
1274*495ae853SAndroid Build Coastguard Worker if(u1_num_spatial_layers > 1)
1275*495ae853SAndroid Build Coastguard Worker {
1276*495ae853SAndroid Build Coastguard Worker intra_pred_state_t *ps_intra_pred_state =
1277*495ae853SAndroid Build Coastguard Worker (intra_pred_state_t *) (ps_intra_pred_ctxt->s_intra_pred_constants.pv_state);
1278*495ae853SAndroid Build Coastguard Worker intra_pred_layer_state_t *ps_layer_state =
1279*495ae853SAndroid Build Coastguard Worker &ps_intra_pred_state->ps_layer_state[u1_spatial_layer_id];
1280*495ae853SAndroid Build Coastguard Worker WORD8 i1_is_intra = (u2_mb_type == I4x4 || u2_mb_type == I16x16 || u2_mb_type == I8x8);
1281*495ae853SAndroid Build Coastguard Worker
1282*495ae853SAndroid Build Coastguard Worker WORD8 *pi1_mb_mode =
1283*495ae853SAndroid Build Coastguard Worker &ps_layer_state->pi1_mb_mode[i4_mb_x + (i4_mb_y * (ps_layer_state->i4_mb_mode_stride))];
1284*495ae853SAndroid Build Coastguard Worker
1285*495ae853SAndroid Build Coastguard Worker if(u1_base_mode_flag == 1)
1286*495ae853SAndroid Build Coastguard Worker {
1287*495ae853SAndroid Build Coastguard Worker *pi1_mb_mode = SVC_IBL_MB;
1288*495ae853SAndroid Build Coastguard Worker }
1289*495ae853SAndroid Build Coastguard Worker else
1290*495ae853SAndroid Build Coastguard Worker {
1291*495ae853SAndroid Build Coastguard Worker if(i1_is_intra)
1292*495ae853SAndroid Build Coastguard Worker {
1293*495ae853SAndroid Build Coastguard Worker *pi1_mb_mode = SVC_INTRA_MB;
1294*495ae853SAndroid Build Coastguard Worker }
1295*495ae853SAndroid Build Coastguard Worker else
1296*495ae853SAndroid Build Coastguard Worker {
1297*495ae853SAndroid Build Coastguard Worker *pi1_mb_mode = SVC_INTER_MB;
1298*495ae853SAndroid Build Coastguard Worker }
1299*495ae853SAndroid Build Coastguard Worker }
1300*495ae853SAndroid Build Coastguard Worker }
1301*495ae853SAndroid Build Coastguard Worker }
1302*495ae853SAndroid Build Coastguard Worker
isvce_pad_mb_mode_buf(svc_intra_pred_ctxt_t * ps_intra_pred_ctxt,UWORD8 u1_spatial_layer_id,UWORD8 u1_num_spatial_layers,DOUBLE d_spatial_res_ratio,UWORD32 u4_wd,UWORD32 u4_ht)1303*495ae853SAndroid Build Coastguard Worker void isvce_pad_mb_mode_buf(svc_intra_pred_ctxt_t *ps_intra_pred_ctxt, UWORD8 u1_spatial_layer_id,
1304*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_spatial_layers, DOUBLE d_spatial_res_ratio, UWORD32 u4_wd,
1305*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ht)
1306*495ae853SAndroid Build Coastguard Worker {
1307*495ae853SAndroid Build Coastguard Worker if(u1_num_spatial_layers > 1)
1308*495ae853SAndroid Build Coastguard Worker {
1309*495ae853SAndroid Build Coastguard Worker intra_pred_state_t *ps_intra_pred_state =
1310*495ae853SAndroid Build Coastguard Worker (intra_pred_state_t *) (ps_intra_pred_ctxt->s_intra_pred_constants.pv_state);
1311*495ae853SAndroid Build Coastguard Worker intra_pred_layer_state_t *ps_layer_state =
1312*495ae853SAndroid Build Coastguard Worker &ps_intra_pred_state->ps_layer_state[u1_spatial_layer_id];
1313*495ae853SAndroid Build Coastguard Worker
1314*495ae853SAndroid Build Coastguard Worker WORD32 i4_layer_luma_wd =
1315*495ae853SAndroid Build Coastguard Worker ((DOUBLE) u4_wd /
1316*495ae853SAndroid Build Coastguard Worker pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - u1_spatial_layer_id)) +
1317*495ae853SAndroid Build Coastguard Worker 0.99;
1318*495ae853SAndroid Build Coastguard Worker WORD32 i4_layer_luma_ht =
1319*495ae853SAndroid Build Coastguard Worker ((DOUBLE) u4_ht /
1320*495ae853SAndroid Build Coastguard Worker pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - u1_spatial_layer_id)) +
1321*495ae853SAndroid Build Coastguard Worker 0.99;
1322*495ae853SAndroid Build Coastguard Worker
1323*495ae853SAndroid Build Coastguard Worker WORD32 row, src_strd;
1324*495ae853SAndroid Build Coastguard Worker WORD8 *pu1_src;
1325*495ae853SAndroid Build Coastguard Worker
1326*495ae853SAndroid Build Coastguard Worker WORD8 *pi1_mb_mode = ps_layer_state->pi1_mb_mode;
1327*495ae853SAndroid Build Coastguard Worker WORD32 i4_mb_mode_stride = ps_layer_state->i4_mb_mode_stride;
1328*495ae853SAndroid Build Coastguard Worker
1329*495ae853SAndroid Build Coastguard Worker /* Add PAD MBs on all directions */
1330*495ae853SAndroid Build Coastguard Worker i4_layer_luma_wd /= MB_SIZE;
1331*495ae853SAndroid Build Coastguard Worker i4_layer_luma_ht /= MB_SIZE;
1332*495ae853SAndroid Build Coastguard Worker
1333*495ae853SAndroid Build Coastguard Worker if(d_spatial_res_ratio == 2.0)
1334*495ae853SAndroid Build Coastguard Worker {
1335*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_mb_mode = (UWORD8 *) pi1_mb_mode;
1336*495ae853SAndroid Build Coastguard Worker /* Pad left */
1337*495ae853SAndroid Build Coastguard Worker ih264_pad_left_luma(pu1_mb_mode, i4_mb_mode_stride, i4_layer_luma_ht, 1);
1338*495ae853SAndroid Build Coastguard Worker
1339*495ae853SAndroid Build Coastguard Worker /* Pad right */
1340*495ae853SAndroid Build Coastguard Worker ih264_pad_right_luma(pu1_mb_mode + i4_layer_luma_wd, i4_mb_mode_stride,
1341*495ae853SAndroid Build Coastguard Worker i4_layer_luma_ht, 1);
1342*495ae853SAndroid Build Coastguard Worker
1343*495ae853SAndroid Build Coastguard Worker /* Pad top */
1344*495ae853SAndroid Build Coastguard Worker ih264_pad_top(pu1_mb_mode - 1, i4_mb_mode_stride, i4_layer_luma_wd + 2, 1);
1345*495ae853SAndroid Build Coastguard Worker
1346*495ae853SAndroid Build Coastguard Worker /* Pad bottom */
1347*495ae853SAndroid Build Coastguard Worker ih264_pad_bottom(pu1_mb_mode + (i4_layer_luma_ht * i4_mb_mode_stride) - 1,
1348*495ae853SAndroid Build Coastguard Worker i4_mb_mode_stride, i4_layer_luma_wd + 2, 1);
1349*495ae853SAndroid Build Coastguard Worker }
1350*495ae853SAndroid Build Coastguard Worker else
1351*495ae853SAndroid Build Coastguard Worker {
1352*495ae853SAndroid Build Coastguard Worker /* Pad left */
1353*495ae853SAndroid Build Coastguard Worker pu1_src = pi1_mb_mode;
1354*495ae853SAndroid Build Coastguard Worker src_strd = i4_mb_mode_stride;
1355*495ae853SAndroid Build Coastguard Worker for(row = 0; row < i4_layer_luma_ht; row++)
1356*495ae853SAndroid Build Coastguard Worker {
1357*495ae853SAndroid Build Coastguard Worker memset(pu1_src - 1, -1, 1);
1358*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
1359*495ae853SAndroid Build Coastguard Worker }
1360*495ae853SAndroid Build Coastguard Worker
1361*495ae853SAndroid Build Coastguard Worker /* Pad right */
1362*495ae853SAndroid Build Coastguard Worker pu1_src = pi1_mb_mode + i4_layer_luma_wd;
1363*495ae853SAndroid Build Coastguard Worker for(row = 0; row < i4_layer_luma_ht; row++)
1364*495ae853SAndroid Build Coastguard Worker {
1365*495ae853SAndroid Build Coastguard Worker memset(pu1_src, -1, 1);
1366*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
1367*495ae853SAndroid Build Coastguard Worker }
1368*495ae853SAndroid Build Coastguard Worker
1369*495ae853SAndroid Build Coastguard Worker /* Pad top */
1370*495ae853SAndroid Build Coastguard Worker pu1_src = pi1_mb_mode - 1;
1371*495ae853SAndroid Build Coastguard Worker memset(pu1_src - src_strd, -1, i4_layer_luma_wd + 2);
1372*495ae853SAndroid Build Coastguard Worker
1373*495ae853SAndroid Build Coastguard Worker /* Pad bottom */
1374*495ae853SAndroid Build Coastguard Worker pu1_src = pi1_mb_mode + (i4_layer_luma_ht * i4_mb_mode_stride) - 1;
1375*495ae853SAndroid Build Coastguard Worker memset(pu1_src, -1, i4_layer_luma_wd + 2);
1376*495ae853SAndroid Build Coastguard Worker }
1377*495ae853SAndroid Build Coastguard Worker }
1378*495ae853SAndroid Build Coastguard Worker }
1379