xref: /aosp_15_r20/external/libavc/encoder/svc/isvce_ilp_mv.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker  */
20*495ae853SAndroid Build Coastguard Worker 
21*495ae853SAndroid Build Coastguard Worker /**
22*495ae853SAndroid Build Coastguard Worker *******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker *  isvce_ilp_mv.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker *  Contains functions used for deriving inter_layer MV's
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker *******************************************************************************
30*495ae853SAndroid Build Coastguard Worker */
31*495ae853SAndroid Build Coastguard Worker #include <stdint.h>
32*495ae853SAndroid Build Coastguard Worker #include <math.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 "ih264_debug.h"
37*495ae853SAndroid Build Coastguard Worker #include "isvc_macros.h"
38*495ae853SAndroid Build Coastguard Worker #include "isvc_defs.h"
39*495ae853SAndroid Build Coastguard Worker #include "isvce_defs.h"
40*495ae853SAndroid Build Coastguard Worker #include "isvce_structs.h"
41*495ae853SAndroid Build Coastguard Worker #include "isvce_ilp_mv_private_defs.h"
42*495ae853SAndroid Build Coastguard Worker #include "isvce_ilp_mv.h"
43*495ae853SAndroid Build Coastguard Worker #include "isvce_ilp_mv_utils.h"
44*495ae853SAndroid Build Coastguard Worker 
45*495ae853SAndroid Build Coastguard Worker /**
46*495ae853SAndroid Build Coastguard Worker *******************************************************************************
47*495ae853SAndroid Build Coastguard Worker *
48*495ae853SAndroid Build Coastguard Worker * @brief
49*495ae853SAndroid Build Coastguard Worker *  Returns size of buffers for storing ILP MV ctxt
50*495ae853SAndroid Build Coastguard Worker *
51*495ae853SAndroid Build Coastguard Worker * @param[in] u1_num_spatial_layers
52*495ae853SAndroid Build Coastguard Worker *  Num Spatial Layers
53*495ae853SAndroid Build Coastguard Worker *
54*495ae853SAndroid Build Coastguard Worker * @param[in] d_spatial_res_ratio
55*495ae853SAndroid Build Coastguard Worker *  Resolution Ratio b/w spatial layers
56*495ae853SAndroid Build Coastguard Worker *
57*495ae853SAndroid Build Coastguard Worker * @param[in] u4_wd
58*495ae853SAndroid Build Coastguard Worker *  Input Width
59*495ae853SAndroid Build Coastguard Worker *
60*495ae853SAndroid Build Coastguard Worker * @param[in] u4_ht
61*495ae853SAndroid Build Coastguard Worker *  Input Height
62*495ae853SAndroid Build Coastguard Worker *
63*495ae853SAndroid Build Coastguard Worker * @returns  Size of buffers
64*495ae853SAndroid Build Coastguard Worker *
65*495ae853SAndroid Build Coastguard Worker *******************************************************************************
66*495ae853SAndroid Build Coastguard Worker */
isvce_get_ilp_mv_ctxt_size(UWORD8 u1_num_spatial_layers,DOUBLE d_spatial_res_ratio,UWORD32 u4_wd,UWORD32 u4_ht)67*495ae853SAndroid Build Coastguard Worker UWORD32 isvce_get_ilp_mv_ctxt_size(UWORD8 u1_num_spatial_layers, DOUBLE d_spatial_res_ratio,
68*495ae853SAndroid Build Coastguard Worker                                    UWORD32 u4_wd, UWORD32 u4_ht)
69*495ae853SAndroid Build Coastguard Worker {
70*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_size = 0;
71*495ae853SAndroid Build Coastguard Worker 
72*495ae853SAndroid Build Coastguard Worker     if(u1_num_spatial_layers > 1)
73*495ae853SAndroid Build Coastguard Worker     {
74*495ae853SAndroid Build Coastguard Worker         WORD32 i;
75*495ae853SAndroid Build Coastguard Worker 
76*495ae853SAndroid Build Coastguard Worker         u4_size += MAX_PROCESS_CTXT * sizeof(svc_ilp_mv_ctxt_t);
77*495ae853SAndroid Build Coastguard Worker         u4_size += MAX_PROCESS_CTXT * sizeof(ilp_mv_state_t);
78*495ae853SAndroid Build Coastguard Worker 
79*495ae853SAndroid Build Coastguard Worker         u4_size += u1_num_spatial_layers * sizeof(ilp_mv_layer_state_t);
80*495ae853SAndroid Build Coastguard Worker 
81*495ae853SAndroid Build Coastguard Worker         for(i = u1_num_spatial_layers - 1; i >= 1; i--)
82*495ae853SAndroid Build Coastguard Worker         {
83*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_wd =
84*495ae853SAndroid Build Coastguard Worker                 (WORD32) ((DOUBLE) u4_wd /
85*495ae853SAndroid Build Coastguard Worker                           pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) +
86*495ae853SAndroid Build Coastguard Worker                 0.99;
87*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_ht =
88*495ae853SAndroid Build Coastguard Worker                 ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) + 0.99;
89*495ae853SAndroid Build Coastguard Worker             WORD32 i4_layer_luma_mbs = (i4_layer_luma_wd / MB_SIZE) * (i4_layer_luma_ht / MB_SIZE);
90*495ae853SAndroid Build Coastguard Worker 
91*495ae853SAndroid Build Coastguard Worker             u4_size += i4_layer_luma_mbs * sizeof(ilp_mv_mb_state_t);
92*495ae853SAndroid Build Coastguard Worker         }
93*495ae853SAndroid Build Coastguard Worker     }
94*495ae853SAndroid Build Coastguard Worker 
95*495ae853SAndroid Build Coastguard Worker     return u4_size;
96*495ae853SAndroid Build Coastguard Worker }
97*495ae853SAndroid Build Coastguard Worker 
isvce_ref_layer_pu_and_mb_pos_init(layer_resampler_props_t * ps_layer_props,ilp_mv_mb_state_t * ps_mb_state,coordinates_t * ps_mb_pos,UWORD32 u4_ref_wd,UWORD32 u4_ref_ht,UWORD8 u1_field_pic_flag,UWORD8 u1_field_mb_flag)98*495ae853SAndroid Build Coastguard Worker static FORCEINLINE void isvce_ref_layer_pu_and_mb_pos_init(layer_resampler_props_t *ps_layer_props,
99*495ae853SAndroid Build Coastguard Worker                                                            ilp_mv_mb_state_t *ps_mb_state,
100*495ae853SAndroid Build Coastguard Worker                                                            coordinates_t *ps_mb_pos,
101*495ae853SAndroid Build Coastguard Worker                                                            UWORD32 u4_ref_wd, UWORD32 u4_ref_ht,
102*495ae853SAndroid Build Coastguard Worker                                                            UWORD8 u1_field_pic_flag,
103*495ae853SAndroid Build Coastguard Worker                                                            UWORD8 u1_field_mb_flag)
104*495ae853SAndroid Build Coastguard Worker {
105*495ae853SAndroid Build Coastguard Worker     UWORD32 i, j;
106*495ae853SAndroid Build Coastguard Worker 
107*495ae853SAndroid Build Coastguard Worker     coordinates_t(*aps_pu_positions)[MAX_PU_IN_MB_ROW] = ps_mb_state->as_pu_positions;
108*495ae853SAndroid Build Coastguard Worker     coordinates_t(*aps_mb_positions)[MAX_PU_IN_MB_ROW] = ps_mb_state->as_mb_positions;
109*495ae853SAndroid Build Coastguard Worker 
110*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MAX_PU_IN_MB_COL; i++)
111*495ae853SAndroid Build Coastguard Worker     {
112*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_y_ref16;
113*495ae853SAndroid Build Coastguard Worker 
114*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_yc = ps_mb_pos->i4_ordinate * ps_layer_props->u4_mb_ht +
115*495ae853SAndroid Build Coastguard Worker                         (4 * i + 1) * (1 + u1_field_mb_flag - u1_field_pic_flag);
116*495ae853SAndroid Build Coastguard Worker 
117*495ae853SAndroid Build Coastguard Worker         u4_y_ref16 =
118*495ae853SAndroid Build Coastguard Worker             (u4_yc * ps_layer_props->u4_scale_y + (1 << (ps_layer_props->u4_shift_y - 1))) >>
119*495ae853SAndroid Build Coastguard Worker             ps_layer_props->u4_shift_y;
120*495ae853SAndroid Build Coastguard Worker         u4_y_ref16 = MIN(u4_y_ref16, u4_ref_ht - 1);
121*495ae853SAndroid Build Coastguard Worker 
122*495ae853SAndroid Build Coastguard Worker         for(j = 0; j < MAX_PU_IN_MB_ROW; j++)
123*495ae853SAndroid Build Coastguard Worker         {
124*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_x_ref16;
125*495ae853SAndroid Build Coastguard Worker 
126*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_xc = ps_mb_pos->i4_abscissa * ps_layer_props->u4_mb_wd + 4 * j + 1;
127*495ae853SAndroid Build Coastguard Worker 
128*495ae853SAndroid Build Coastguard Worker             u4_x_ref16 =
129*495ae853SAndroid Build Coastguard Worker                 (u4_xc * ps_layer_props->u4_scale_x + (1 << (ps_layer_props->u4_shift_x - 1))) >>
130*495ae853SAndroid Build Coastguard Worker                 ps_layer_props->u4_shift_x;
131*495ae853SAndroid Build Coastguard Worker             u4_x_ref16 = MIN(u4_x_ref16, u4_ref_wd - 1);
132*495ae853SAndroid Build Coastguard Worker 
133*495ae853SAndroid Build Coastguard Worker             aps_pu_positions[i][j].i4_abscissa = u4_x_ref16;
134*495ae853SAndroid Build Coastguard Worker             aps_pu_positions[i][j].i4_ordinate = u4_y_ref16;
135*495ae853SAndroid Build Coastguard Worker 
136*495ae853SAndroid Build Coastguard Worker             aps_mb_positions[i][j].i4_abscissa = (u4_x_ref16 / MB_SIZE);
137*495ae853SAndroid Build Coastguard Worker             aps_mb_positions[i][j].i4_ordinate = (u4_y_ref16 / MB_SIZE);
138*495ae853SAndroid Build Coastguard Worker         }
139*495ae853SAndroid Build Coastguard Worker     }
140*495ae853SAndroid Build Coastguard Worker }
141*495ae853SAndroid Build Coastguard Worker 
isvce_ilp_mv_layer_state_init(ilp_mv_layer_state_t * ps_layer_state,DOUBLE d_spatial_res_ratio,UWORD32 u4_wd,UWORD32 u4_ht)142*495ae853SAndroid Build Coastguard Worker static void isvce_ilp_mv_layer_state_init(ilp_mv_layer_state_t *ps_layer_state,
143*495ae853SAndroid Build Coastguard Worker                                           DOUBLE d_spatial_res_ratio, UWORD32 u4_wd, UWORD32 u4_ht)
144*495ae853SAndroid Build Coastguard Worker {
145*495ae853SAndroid Build Coastguard Worker     UWORD32 i, j;
146*495ae853SAndroid Build Coastguard Worker 
147*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_ref_layer_field_pic_flag = 0;
148*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_field_pic_flag = 0;
149*495ae853SAndroid Build Coastguard Worker     const UWORD8 u1_field_mb_flag = 0;
150*495ae853SAndroid Build Coastguard Worker 
151*495ae853SAndroid Build Coastguard Worker     ilp_mv_mb_state_t *ps_mb_states;
152*495ae853SAndroid Build Coastguard Worker     layer_resampler_props_t *ps_layer_props;
153*495ae853SAndroid Build Coastguard Worker 
154*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_wd_in_mbs;
155*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ht_in_mbs;
156*495ae853SAndroid Build Coastguard Worker 
157*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ref_wd = (u4_wd / d_spatial_res_ratio);
158*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ref_ht = (u4_ht / d_spatial_res_ratio) * (1 + u1_ref_layer_field_pic_flag);
159*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_scaled_wd = u4_wd;
160*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_scaled_ht = u4_ht * (1 + u1_field_pic_flag);
161*495ae853SAndroid Build Coastguard Worker 
162*495ae853SAndroid Build Coastguard Worker     ps_mb_states = ps_layer_state->ps_mb_states;
163*495ae853SAndroid Build Coastguard Worker     ps_layer_props = ps_layer_state->ps_props;
164*495ae853SAndroid Build Coastguard Worker 
165*495ae853SAndroid Build Coastguard Worker     u4_wd_in_mbs = u4_scaled_wd / ps_layer_props->u4_mb_wd;
166*495ae853SAndroid Build Coastguard Worker     u4_ht_in_mbs = u4_scaled_ht / ps_layer_props->u4_mb_ht;
167*495ae853SAndroid Build Coastguard Worker 
168*495ae853SAndroid Build Coastguard Worker     ps_layer_state->s_mv_scale.i4_abscissa = ((u4_scaled_wd << 16) + (u4_ref_wd >> 1)) / u4_ref_wd;
169*495ae853SAndroid Build Coastguard Worker     ps_layer_state->s_mv_scale.i4_ordinate = ((u4_scaled_ht << 16) + (u4_ref_ht >> 1)) / u4_ref_ht;
170*495ae853SAndroid Build Coastguard Worker 
171*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < u4_ht_in_mbs; i++)
172*495ae853SAndroid Build Coastguard Worker     {
173*495ae853SAndroid Build Coastguard Worker         for(j = 0; j < u4_wd_in_mbs; j++)
174*495ae853SAndroid Build Coastguard Worker         {
175*495ae853SAndroid Build Coastguard Worker             coordinates_t s_mb_pos = {j, i};
176*495ae853SAndroid Build Coastguard Worker 
177*495ae853SAndroid Build Coastguard Worker             isvce_ref_layer_pu_and_mb_pos_init(ps_layer_props, &ps_mb_states[j + i * u4_wd_in_mbs],
178*495ae853SAndroid Build Coastguard Worker                                                &s_mb_pos, u4_ref_wd, u4_ref_ht, u1_field_pic_flag,
179*495ae853SAndroid Build Coastguard Worker                                                u1_field_mb_flag);
180*495ae853SAndroid Build Coastguard Worker         }
181*495ae853SAndroid Build Coastguard Worker     }
182*495ae853SAndroid Build Coastguard Worker }
183*495ae853SAndroid Build Coastguard Worker 
184*495ae853SAndroid Build Coastguard Worker /**
185*495ae853SAndroid Build Coastguard Worker *******************************************************************************
186*495ae853SAndroid Build Coastguard Worker *
187*495ae853SAndroid Build Coastguard Worker * @brief
188*495ae853SAndroid Build Coastguard Worker *  Function to initialize svc ilp buffers
189*495ae853SAndroid Build Coastguard Worker *
190*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
191*495ae853SAndroid Build Coastguard Worker *  Pointer to codec context
192*495ae853SAndroid Build Coastguard Worker *
193*495ae853SAndroid Build Coastguard Worker * @param[in] ps_mem_rec
194*495ae853SAndroid Build Coastguard Worker *  Pointer to memory allocated for input buffers
195*495ae853SAndroid Build Coastguard Worker *
196*495ae853SAndroid Build Coastguard Worker *******************************************************************************
197*495ae853SAndroid Build Coastguard Worker */
isvce_ilp_mv_ctxt_init(isvce_codec_t * ps_codec,iv_mem_rec_t * ps_mem_rec)198*495ae853SAndroid Build Coastguard Worker void isvce_ilp_mv_ctxt_init(isvce_codec_t *ps_codec, iv_mem_rec_t *ps_mem_rec)
199*495ae853SAndroid Build Coastguard Worker {
200*495ae853SAndroid Build Coastguard Worker     WORD32 i, j;
201*495ae853SAndroid Build Coastguard Worker 
202*495ae853SAndroid Build Coastguard Worker     const WORD32 i4_num_proc_ctxts = sizeof(ps_codec->as_process) / sizeof(ps_codec->as_process[0]);
203*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_num_spatial_layers = ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers;
204*495ae853SAndroid Build Coastguard Worker 
205*495ae853SAndroid Build Coastguard Worker     if(u1_num_spatial_layers > 1)
206*495ae853SAndroid Build Coastguard Worker     {
207*495ae853SAndroid Build Coastguard Worker         ilp_mv_layer_state_t *ps_layer_states = NULL;
208*495ae853SAndroid Build Coastguard Worker         ilp_mv_mb_state_t *aps_luma_mb_states[MAX_NUM_SPATIAL_LAYERS];
209*495ae853SAndroid Build Coastguard Worker 
210*495ae853SAndroid Build Coastguard Worker         DOUBLE d_spatial_res_ratio = ps_codec->s_cfg.s_svc_params.d_spatial_res_ratio;
211*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_wd = ps_codec->s_cfg.u4_wd;
212*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_ht = ps_codec->s_cfg.u4_ht;
213*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_buf = ps_mem_rec->pv_base;
214*495ae853SAndroid Build Coastguard Worker         WORD64 i8_alloc_mem_size =
215*495ae853SAndroid Build Coastguard Worker             isvce_get_ilp_mv_ctxt_size(u1_num_spatial_layers, d_spatial_res_ratio, u4_wd, u4_ht);
216*495ae853SAndroid Build Coastguard Worker 
217*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < i4_num_proc_ctxts; i++)
218*495ae853SAndroid Build Coastguard Worker         {
219*495ae853SAndroid Build Coastguard Worker             ilp_mv_state_t *ps_ilp_mv_state;
220*495ae853SAndroid Build Coastguard Worker             svc_ilp_mv_ctxt_t *ps_ilp_mv_ctxt;
221*495ae853SAndroid Build Coastguard Worker 
222*495ae853SAndroid Build Coastguard Worker             isvce_process_ctxt_t *ps_proc = ps_codec->as_process + i;
223*495ae853SAndroid Build Coastguard Worker 
224*495ae853SAndroid Build Coastguard Worker             ps_ilp_mv_ctxt = ps_proc->ps_svc_ilp_mv_ctxt = (svc_ilp_mv_ctxt_t *) pu1_buf;
225*495ae853SAndroid Build Coastguard Worker             pu1_buf += sizeof(svc_ilp_mv_ctxt_t);
226*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -= sizeof(svc_ilp_mv_ctxt_t);
227*495ae853SAndroid Build Coastguard Worker 
228*495ae853SAndroid Build Coastguard Worker             ps_ilp_mv_ctxt->s_ilp_mv_constants.pv_state = pu1_buf;
229*495ae853SAndroid Build Coastguard Worker             ps_ilp_mv_state = (ilp_mv_state_t *) pu1_buf;
230*495ae853SAndroid Build Coastguard Worker             pu1_buf += sizeof(ilp_mv_state_t);
231*495ae853SAndroid Build Coastguard Worker             i8_alloc_mem_size -= sizeof(ilp_mv_state_t);
232*495ae853SAndroid Build Coastguard Worker 
233*495ae853SAndroid Build Coastguard Worker             if(0 == i)
234*495ae853SAndroid Build Coastguard Worker             {
235*495ae853SAndroid Build Coastguard Worker                 ps_ilp_mv_state->ps_layer_state = (ilp_mv_layer_state_t *) pu1_buf;
236*495ae853SAndroid Build Coastguard Worker                 ps_layer_states = ps_ilp_mv_state->ps_layer_state;
237*495ae853SAndroid Build Coastguard Worker                 pu1_buf += u1_num_spatial_layers * sizeof(ps_ilp_mv_state->ps_layer_state[0]);
238*495ae853SAndroid Build Coastguard Worker                 i8_alloc_mem_size -=
239*495ae853SAndroid Build Coastguard Worker                     u1_num_spatial_layers * sizeof(ps_ilp_mv_state->ps_layer_state[0]);
240*495ae853SAndroid Build Coastguard Worker             }
241*495ae853SAndroid Build Coastguard Worker             else
242*495ae853SAndroid Build Coastguard Worker             {
243*495ae853SAndroid Build Coastguard Worker                 ps_ilp_mv_state->ps_layer_state = ps_layer_states;
244*495ae853SAndroid Build Coastguard Worker             }
245*495ae853SAndroid Build Coastguard Worker 
246*495ae853SAndroid Build Coastguard Worker             ASSERT(i8_alloc_mem_size >= 0);
247*495ae853SAndroid Build Coastguard Worker 
248*495ae853SAndroid Build Coastguard Worker             if(0 == i)
249*495ae853SAndroid Build Coastguard Worker             {
250*495ae853SAndroid Build Coastguard Worker                 for(j = u1_num_spatial_layers - 1; j >= 1; j--)
251*495ae853SAndroid Build Coastguard Worker                 {
252*495ae853SAndroid Build Coastguard Worker                     ilp_mv_layer_state_t *ps_layer = &ps_ilp_mv_state->ps_layer_state[j];
253*495ae853SAndroid Build Coastguard Worker 
254*495ae853SAndroid Build Coastguard Worker                     WORD32 i4_layer_luma_wd =
255*495ae853SAndroid Build Coastguard Worker                         ((DOUBLE) u4_wd / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - j)) +
256*495ae853SAndroid Build Coastguard Worker                         0.99;
257*495ae853SAndroid Build Coastguard Worker                     WORD32 i4_layer_luma_ht =
258*495ae853SAndroid Build Coastguard Worker                         ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - j)) +
259*495ae853SAndroid Build Coastguard Worker                         0.99;
260*495ae853SAndroid Build Coastguard Worker                     WORD32 i4_layer_luma_mbs =
261*495ae853SAndroid Build Coastguard Worker                         (i4_layer_luma_wd / MB_SIZE) * (i4_layer_luma_ht / MB_SIZE);
262*495ae853SAndroid Build Coastguard Worker 
263*495ae853SAndroid Build Coastguard Worker                     ps_layer->ps_mb_states = (ilp_mv_mb_state_t *) pu1_buf;
264*495ae853SAndroid Build Coastguard Worker                     aps_luma_mb_states[j] = ps_layer->ps_mb_states;
265*495ae853SAndroid Build Coastguard Worker                     pu1_buf += i4_layer_luma_mbs * sizeof(ps_layer->ps_mb_states[0]);
266*495ae853SAndroid Build Coastguard Worker                     i8_alloc_mem_size -= u1_num_spatial_layers * sizeof(ps_layer->ps_mb_states[0]);
267*495ae853SAndroid Build Coastguard Worker 
268*495ae853SAndroid Build Coastguard Worker                     ASSERT(i8_alloc_mem_size >= 0);
269*495ae853SAndroid Build Coastguard Worker                     /* Asserts below verify that
270*495ae853SAndroid Build Coastguard Worker                      * 'ps_codec->s_svc_ilp_data.aps_layer_resampler_props' is initialised
271*495ae853SAndroid Build Coastguard Worker                      */
272*495ae853SAndroid Build Coastguard Worker                     ASSERT(ps_codec->s_svc_ilp_data.aps_layer_resampler_props[Y][j].u4_mb_wd ==
273*495ae853SAndroid Build Coastguard Worker                            MB_SIZE);
274*495ae853SAndroid Build Coastguard Worker 
275*495ae853SAndroid Build Coastguard Worker                     ps_layer->ps_props = &ps_codec->s_svc_ilp_data.aps_layer_resampler_props[Y][j];
276*495ae853SAndroid Build Coastguard Worker 
277*495ae853SAndroid Build Coastguard Worker                     isvce_ilp_mv_layer_state_init(ps_layer, d_spatial_res_ratio, i4_layer_luma_wd,
278*495ae853SAndroid Build Coastguard Worker                                                   i4_layer_luma_ht);
279*495ae853SAndroid Build Coastguard Worker                 }
280*495ae853SAndroid Build Coastguard Worker             }
281*495ae853SAndroid Build Coastguard Worker             else
282*495ae853SAndroid Build Coastguard Worker             {
283*495ae853SAndroid Build Coastguard Worker                 for(j = u1_num_spatial_layers - 1; j >= 1; j--)
284*495ae853SAndroid Build Coastguard Worker                 {
285*495ae853SAndroid Build Coastguard Worker                     ilp_mv_layer_state_t *ps_layer = &ps_ilp_mv_state->ps_layer_state[j];
286*495ae853SAndroid Build Coastguard Worker 
287*495ae853SAndroid Build Coastguard Worker                     ps_layer->ps_mb_states = aps_luma_mb_states[j];
288*495ae853SAndroid Build Coastguard Worker 
289*495ae853SAndroid Build Coastguard Worker                     ps_layer->ps_props = &ps_codec->s_svc_ilp_data.aps_layer_resampler_props[Y][j];
290*495ae853SAndroid Build Coastguard Worker                 }
291*495ae853SAndroid Build Coastguard Worker             }
292*495ae853SAndroid Build Coastguard Worker         }
293*495ae853SAndroid Build Coastguard Worker     }
294*495ae853SAndroid Build Coastguard Worker     else
295*495ae853SAndroid Build Coastguard Worker     {
296*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < i4_num_proc_ctxts; i++)
297*495ae853SAndroid Build Coastguard Worker         {
298*495ae853SAndroid Build Coastguard Worker             ps_codec->as_process[i].ps_svc_ilp_mv_ctxt = NULL;
299*495ae853SAndroid Build Coastguard Worker         }
300*495ae853SAndroid Build Coastguard Worker     }
301*495ae853SAndroid Build Coastguard Worker }
302*495ae853SAndroid Build Coastguard Worker 
isvce_get_ilp_mvs_for_me(svc_ilp_mv_ctxt_t * ps_ilp_mv_ctxt)303*495ae853SAndroid Build Coastguard Worker static void isvce_get_ilp_mvs_for_me(svc_ilp_mv_ctxt_t *ps_ilp_mv_ctxt)
304*495ae853SAndroid Build Coastguard Worker {
305*495ae853SAndroid Build Coastguard Worker     svc_layer_data_t *ps_ref_layer_data;
306*495ae853SAndroid Build Coastguard Worker     ilp_mv_layer_state_t *ps_layer_state;
307*495ae853SAndroid Build Coastguard Worker     ilp_mv_mb_state_t *ps_mb_state;
308*495ae853SAndroid Build Coastguard Worker     isvce_mb_info_t *ps_ref_mb_info;
309*495ae853SAndroid Build Coastguard Worker     coordinates_t s_frame_dims;
310*495ae853SAndroid Build Coastguard Worker     coordinates_t s_frame_dims_in_mbs;
311*495ae853SAndroid Build Coastguard Worker     coordinates_t s_ref_frame_dims;
312*495ae853SAndroid Build Coastguard Worker     coordinates_t s_ref_frame_dims_in_mbs;
313*495ae853SAndroid Build Coastguard Worker 
314*495ae853SAndroid Build Coastguard Worker     bool b_is_mv_non_identical;
315*495ae853SAndroid Build Coastguard Worker     WORD32 i, j, k;
316*495ae853SAndroid Build Coastguard Worker 
317*495ae853SAndroid Build Coastguard Worker     ilp_mv_constants_t *ps_ilp_mv_constants = &ps_ilp_mv_ctxt->s_ilp_mv_constants;
318*495ae853SAndroid Build Coastguard Worker     ilp_mv_variables_t *ps_ilp_mv_variables = &ps_ilp_mv_ctxt->s_ilp_mv_variables;
319*495ae853SAndroid Build Coastguard Worker     ilp_mv_outputs_t *ps_ilp_mv_outputs = &ps_ilp_mv_ctxt->s_ilp_mv_outputs;
320*495ae853SAndroid Build Coastguard Worker     ilp_mv_state_t *ps_ilp_mv_state = (ilp_mv_state_t *) ps_ilp_mv_constants->pv_state;
321*495ae853SAndroid Build Coastguard Worker     svc_ilp_data_t *ps_svc_ilp_data = ps_ilp_mv_variables->ps_svc_ilp_data;
322*495ae853SAndroid Build Coastguard Worker     svc_au_data_t *ps_svc_au_data = ps_svc_ilp_data->ps_svc_au_data;
323*495ae853SAndroid Build Coastguard Worker     coordinates_t *ps_mb_pos = &ps_ilp_mv_variables->s_mb_pos;
324*495ae853SAndroid Build Coastguard Worker     const isvce_enc_pu_mv_t s_default_mv = {{0, 0}, -1};
325*495ae853SAndroid Build Coastguard Worker 
326*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_spatial_layer_id = ps_ilp_mv_variables->u1_spatial_layer_id;
327*495ae853SAndroid Build Coastguard Worker     WORD32 i4_num_ilp_mvs = 0;
328*495ae853SAndroid Build Coastguard Worker 
329*495ae853SAndroid Build Coastguard Worker     s_frame_dims.i4_abscissa = ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id].u4_width;
330*495ae853SAndroid Build Coastguard Worker     s_frame_dims.i4_ordinate = ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id].u4_height;
331*495ae853SAndroid Build Coastguard Worker     s_frame_dims_in_mbs.i4_abscissa = s_frame_dims.i4_abscissa / MB_SIZE;
332*495ae853SAndroid Build Coastguard Worker     s_frame_dims_in_mbs.i4_ordinate = s_frame_dims.i4_ordinate / MB_SIZE;
333*495ae853SAndroid Build Coastguard Worker     s_ref_frame_dims.i4_abscissa =
334*495ae853SAndroid Build Coastguard Worker         ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id - 1].u4_width;
335*495ae853SAndroid Build Coastguard Worker     s_ref_frame_dims.i4_ordinate =
336*495ae853SAndroid Build Coastguard Worker         ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id - 1].u4_height;
337*495ae853SAndroid Build Coastguard Worker     s_ref_frame_dims_in_mbs.i4_abscissa = s_ref_frame_dims.i4_abscissa / MB_SIZE;
338*495ae853SAndroid Build Coastguard Worker     s_ref_frame_dims_in_mbs.i4_ordinate = s_ref_frame_dims.i4_ordinate / MB_SIZE;
339*495ae853SAndroid Build Coastguard Worker 
340*495ae853SAndroid Build Coastguard Worker     ps_ref_layer_data = &ps_svc_au_data->ps_svc_layer_data[u1_spatial_layer_id - 1];
341*495ae853SAndroid Build Coastguard Worker     ps_layer_state = &ps_ilp_mv_state->ps_layer_state[u1_spatial_layer_id];
342*495ae853SAndroid Build Coastguard Worker     ps_mb_state =
343*495ae853SAndroid Build Coastguard Worker         &ps_layer_state->ps_mb_states[ps_mb_pos->i4_abscissa +
344*495ae853SAndroid Build Coastguard Worker                                       ps_mb_pos->i4_ordinate * s_frame_dims_in_mbs.i4_abscissa];
345*495ae853SAndroid Build Coastguard Worker 
346*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MAX_PU_IN_MB_COL; i++)
347*495ae853SAndroid Build Coastguard Worker     {
348*495ae853SAndroid Build Coastguard Worker         for(j = 0; j < MAX_PU_IN_MB_ROW; j++)
349*495ae853SAndroid Build Coastguard Worker         {
350*495ae853SAndroid Build Coastguard Worker             b_is_mv_non_identical = true;
351*495ae853SAndroid Build Coastguard Worker 
352*495ae853SAndroid Build Coastguard Worker             ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0] = s_default_mv;
353*495ae853SAndroid Build Coastguard Worker             ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1] = s_default_mv;
354*495ae853SAndroid Build Coastguard Worker 
355*495ae853SAndroid Build Coastguard Worker             ps_ref_mb_info =
356*495ae853SAndroid Build Coastguard Worker                 &ps_ref_layer_data->ps_mb_info[ps_mb_state->as_mb_positions[i][j].i4_abscissa +
357*495ae853SAndroid Build Coastguard Worker                                                ps_mb_state->as_mb_positions[i][j].i4_ordinate *
358*495ae853SAndroid Build Coastguard Worker                                                    s_ref_frame_dims_in_mbs.i4_abscissa];
359*495ae853SAndroid Build Coastguard Worker 
360*495ae853SAndroid Build Coastguard Worker             if((ps_ref_mb_info->u2_mb_type == P16x16) || (ps_ref_mb_info->u2_mb_type == B16x16))
361*495ae853SAndroid Build Coastguard Worker             {
362*495ae853SAndroid Build Coastguard Worker                 ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs] =
363*495ae853SAndroid Build Coastguard Worker                     ps_ref_mb_info->u2_mb_type;
364*495ae853SAndroid Build Coastguard Worker 
365*495ae853SAndroid Build Coastguard Worker                 ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs] =
366*495ae853SAndroid Build Coastguard Worker                     ps_ref_mb_info->as_pu->u1_pred_mode;
367*495ae853SAndroid Build Coastguard Worker 
368*495ae853SAndroid Build Coastguard Worker                 if(ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs] != L0)
369*495ae853SAndroid Build Coastguard Worker                 {
370*495ae853SAndroid Build Coastguard Worker                     ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1] =
371*495ae853SAndroid Build Coastguard Worker                         ps_ref_mb_info->as_pu->as_me_info[L1];
372*495ae853SAndroid Build Coastguard Worker 
373*495ae853SAndroid Build Coastguard Worker                     ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1].s_mv.i2_mvx =
374*495ae853SAndroid Build Coastguard Worker                         (ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1].s_mv.i2_mvx *
375*495ae853SAndroid Build Coastguard Worker                              ps_layer_state->s_mv_scale.i4_abscissa +
376*495ae853SAndroid Build Coastguard Worker                          32768) >>
377*495ae853SAndroid Build Coastguard Worker                         16;
378*495ae853SAndroid Build Coastguard Worker                     ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1].s_mv.i2_mvy =
379*495ae853SAndroid Build Coastguard Worker                         (ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1].s_mv.i2_mvy *
380*495ae853SAndroid Build Coastguard Worker                              ps_layer_state->s_mv_scale.i4_ordinate +
381*495ae853SAndroid Build Coastguard Worker                          32768) >>
382*495ae853SAndroid Build Coastguard Worker                         16;
383*495ae853SAndroid Build Coastguard Worker                 }
384*495ae853SAndroid Build Coastguard Worker 
385*495ae853SAndroid Build Coastguard Worker                 if(ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs] != L1)
386*495ae853SAndroid Build Coastguard Worker                 {
387*495ae853SAndroid Build Coastguard Worker                     ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0] =
388*495ae853SAndroid Build Coastguard Worker                         ps_ref_mb_info->as_pu->as_me_info[L0];
389*495ae853SAndroid Build Coastguard Worker 
390*495ae853SAndroid Build Coastguard Worker                     ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvx =
391*495ae853SAndroid Build Coastguard Worker                         (ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvx *
392*495ae853SAndroid Build Coastguard Worker                              ps_layer_state->s_mv_scale.i4_abscissa +
393*495ae853SAndroid Build Coastguard Worker                          32768) >>
394*495ae853SAndroid Build Coastguard Worker                         16;
395*495ae853SAndroid Build Coastguard Worker                     ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvy =
396*495ae853SAndroid Build Coastguard Worker                         (ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvy *
397*495ae853SAndroid Build Coastguard Worker                              ps_layer_state->s_mv_scale.i4_ordinate +
398*495ae853SAndroid Build Coastguard Worker                          32768) >>
399*495ae853SAndroid Build Coastguard Worker                         16;
400*495ae853SAndroid Build Coastguard Worker                 }
401*495ae853SAndroid Build Coastguard Worker 
402*495ae853SAndroid Build Coastguard Worker                 if(i4_num_ilp_mvs == 0)
403*495ae853SAndroid Build Coastguard Worker                 {
404*495ae853SAndroid Build Coastguard Worker                     i4_num_ilp_mvs++;
405*495ae853SAndroid Build Coastguard Worker                 }
406*495ae853SAndroid Build Coastguard Worker                 else
407*495ae853SAndroid Build Coastguard Worker                 {
408*495ae853SAndroid Build Coastguard Worker                     for(k = i4_num_ilp_mvs - 1; k >= 0; k--)
409*495ae853SAndroid Build Coastguard Worker                     {
410*495ae853SAndroid Build Coastguard Worker                         if((ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[k] ==
411*495ae853SAndroid Build Coastguard Worker                             ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs]) &&
412*495ae853SAndroid Build Coastguard Worker                            (ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[k] ==
413*495ae853SAndroid Build Coastguard Worker                             ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs]) &&
414*495ae853SAndroid Build Coastguard Worker                            isvce_check_identical_mv(
415*495ae853SAndroid Build Coastguard Worker                                ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[k],
416*495ae853SAndroid Build Coastguard Worker                                ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs],
417*495ae853SAndroid Build Coastguard Worker                                ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[k]))
418*495ae853SAndroid Build Coastguard Worker                         {
419*495ae853SAndroid Build Coastguard Worker                             b_is_mv_non_identical = false;
420*495ae853SAndroid Build Coastguard Worker                         }
421*495ae853SAndroid Build Coastguard Worker                     }
422*495ae853SAndroid Build Coastguard Worker 
423*495ae853SAndroid Build Coastguard Worker                     if(b_is_mv_non_identical)
424*495ae853SAndroid Build Coastguard Worker                     {
425*495ae853SAndroid Build Coastguard Worker                         i4_num_ilp_mvs++;
426*495ae853SAndroid Build Coastguard Worker                     }
427*495ae853SAndroid Build Coastguard Worker                 }
428*495ae853SAndroid Build Coastguard Worker             }
429*495ae853SAndroid Build Coastguard Worker             else
430*495ae853SAndroid Build Coastguard Worker             {
431*495ae853SAndroid Build Coastguard Worker                 ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs] = INVALID_MB_TYPE;
432*495ae853SAndroid Build Coastguard Worker             }
433*495ae853SAndroid Build Coastguard Worker         }
434*495ae853SAndroid Build Coastguard Worker     }
435*495ae853SAndroid Build Coastguard Worker 
436*495ae853SAndroid Build Coastguard Worker     ps_ilp_mv_outputs->s_ilp_me_cands.u4_num_ilp_mvs = i4_num_ilp_mvs;
437*495ae853SAndroid Build Coastguard Worker 
438*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MAX_ILP_MV_IN_NBR_RGN; i++)
439*495ae853SAndroid Build Coastguard Worker     {
440*495ae853SAndroid Build Coastguard Worker         b_is_mv_non_identical = true;
441*495ae853SAndroid Build Coastguard Worker 
442*495ae853SAndroid Build Coastguard Worker         ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0] = s_default_mv;
443*495ae853SAndroid Build Coastguard Worker         ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1] = s_default_mv;
444*495ae853SAndroid Build Coastguard Worker 
445*495ae853SAndroid Build Coastguard Worker         if(ps_mb_pos->i4_abscissa + gai1_nbr_ilp_mv_map[i][0] >= 0 &&
446*495ae853SAndroid Build Coastguard Worker            ps_mb_pos->i4_abscissa + gai1_nbr_ilp_mv_map[i][0] < s_frame_dims_in_mbs.i4_abscissa &&
447*495ae853SAndroid Build Coastguard Worker            ps_mb_pos->i4_ordinate + gai1_nbr_ilp_mv_map[i][1] >= 0 &&
448*495ae853SAndroid Build Coastguard Worker            ps_mb_pos->i4_ordinate + gai1_nbr_ilp_mv_map[i][1] < s_frame_dims_in_mbs.i4_ordinate)
449*495ae853SAndroid Build Coastguard Worker         {
450*495ae853SAndroid Build Coastguard Worker             ps_mb_state =
451*495ae853SAndroid Build Coastguard Worker                 &ps_layer_state->ps_mb_states[(ps_mb_pos->i4_abscissa + gai1_nbr_ilp_mv_map[i][0]) +
452*495ae853SAndroid Build Coastguard Worker                                               (ps_mb_pos->i4_ordinate + gai1_nbr_ilp_mv_map[i][1]) *
453*495ae853SAndroid Build Coastguard Worker                                                   s_frame_dims_in_mbs.i4_abscissa];
454*495ae853SAndroid Build Coastguard Worker 
455*495ae853SAndroid Build Coastguard Worker             ps_ref_mb_info =
456*495ae853SAndroid Build Coastguard Worker                 &ps_ref_layer_data->ps_mb_info[(ps_mb_state
457*495ae853SAndroid Build Coastguard Worker                                                     ->as_mb_positions[gai1_nbr_ilp_mv_map[i][2]]
458*495ae853SAndroid Build Coastguard Worker                                                                      [gai1_nbr_ilp_mv_map[i][3]]
459*495ae853SAndroid Build Coastguard Worker                                                     .i4_abscissa) +
460*495ae853SAndroid Build Coastguard Worker                                                ps_mb_state
461*495ae853SAndroid Build Coastguard Worker                                                        ->as_mb_positions[gai1_nbr_ilp_mv_map[i][2]]
462*495ae853SAndroid Build Coastguard Worker                                                                         [gai1_nbr_ilp_mv_map[i][3]]
463*495ae853SAndroid Build Coastguard Worker                                                        .i4_ordinate *
464*495ae853SAndroid Build Coastguard Worker                                                    s_ref_frame_dims_in_mbs.i4_abscissa];
465*495ae853SAndroid Build Coastguard Worker 
466*495ae853SAndroid Build Coastguard Worker             if((ps_ref_mb_info->u2_mb_type == P16x16) || (ps_ref_mb_info->u2_mb_type == B16x16))
467*495ae853SAndroid Build Coastguard Worker             {
468*495ae853SAndroid Build Coastguard Worker                 ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs] =
469*495ae853SAndroid Build Coastguard Worker                     ps_ref_mb_info->u2_mb_type;
470*495ae853SAndroid Build Coastguard Worker 
471*495ae853SAndroid Build Coastguard Worker                 ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs] =
472*495ae853SAndroid Build Coastguard Worker                     ps_ref_mb_info->as_pu->u1_pred_mode;
473*495ae853SAndroid Build Coastguard Worker 
474*495ae853SAndroid Build Coastguard Worker                 if(ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs] != L0)
475*495ae853SAndroid Build Coastguard Worker                 {
476*495ae853SAndroid Build Coastguard Worker                     ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1] =
477*495ae853SAndroid Build Coastguard Worker                         ps_ref_mb_info->as_pu->as_me_info[L1];
478*495ae853SAndroid Build Coastguard Worker 
479*495ae853SAndroid Build Coastguard Worker                     ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1].s_mv.i2_mvx =
480*495ae853SAndroid Build Coastguard Worker                         (ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1].s_mv.i2_mvx *
481*495ae853SAndroid Build Coastguard Worker                              ps_layer_state->s_mv_scale.i4_abscissa +
482*495ae853SAndroid Build Coastguard Worker                          32768) >>
483*495ae853SAndroid Build Coastguard Worker                         16;
484*495ae853SAndroid Build Coastguard Worker                     ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1].s_mv.i2_mvy =
485*495ae853SAndroid Build Coastguard Worker                         (ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1].s_mv.i2_mvy *
486*495ae853SAndroid Build Coastguard Worker                              ps_layer_state->s_mv_scale.i4_ordinate +
487*495ae853SAndroid Build Coastguard Worker                          32768) >>
488*495ae853SAndroid Build Coastguard Worker                         16;
489*495ae853SAndroid Build Coastguard Worker                 }
490*495ae853SAndroid Build Coastguard Worker 
491*495ae853SAndroid Build Coastguard Worker                 if(ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs] != L1)
492*495ae853SAndroid Build Coastguard Worker                 {
493*495ae853SAndroid Build Coastguard Worker                     ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0] =
494*495ae853SAndroid Build Coastguard Worker                         ps_ref_mb_info->as_pu->as_me_info[L0];
495*495ae853SAndroid Build Coastguard Worker 
496*495ae853SAndroid Build Coastguard Worker                     ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvx =
497*495ae853SAndroid Build Coastguard Worker                         (ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvx *
498*495ae853SAndroid Build Coastguard Worker                              ps_layer_state->s_mv_scale.i4_abscissa +
499*495ae853SAndroid Build Coastguard Worker                          32768) >>
500*495ae853SAndroid Build Coastguard Worker                         16;
501*495ae853SAndroid Build Coastguard Worker                     ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvy =
502*495ae853SAndroid Build Coastguard Worker                         (ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvy *
503*495ae853SAndroid Build Coastguard Worker                              ps_layer_state->s_mv_scale.i4_ordinate +
504*495ae853SAndroid Build Coastguard Worker                          32768) >>
505*495ae853SAndroid Build Coastguard Worker                         16;
506*495ae853SAndroid Build Coastguard Worker                 }
507*495ae853SAndroid Build Coastguard Worker 
508*495ae853SAndroid Build Coastguard Worker                 if(i4_num_ilp_mvs == 0)
509*495ae853SAndroid Build Coastguard Worker                 {
510*495ae853SAndroid Build Coastguard Worker                     i4_num_ilp_mvs++;
511*495ae853SAndroid Build Coastguard Worker                 }
512*495ae853SAndroid Build Coastguard Worker                 else
513*495ae853SAndroid Build Coastguard Worker                 {
514*495ae853SAndroid Build Coastguard Worker                     for(k = i4_num_ilp_mvs - 1; k >= 0; k--)
515*495ae853SAndroid Build Coastguard Worker                     {
516*495ae853SAndroid Build Coastguard Worker                         if((ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[k] ==
517*495ae853SAndroid Build Coastguard Worker                             ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs]) &&
518*495ae853SAndroid Build Coastguard Worker                            (ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[k] ==
519*495ae853SAndroid Build Coastguard Worker                             ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs]) &&
520*495ae853SAndroid Build Coastguard Worker                            isvce_check_identical_mv(
521*495ae853SAndroid Build Coastguard Worker                                ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[k],
522*495ae853SAndroid Build Coastguard Worker                                ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs],
523*495ae853SAndroid Build Coastguard Worker                                ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[k]))
524*495ae853SAndroid Build Coastguard Worker                             b_is_mv_non_identical = false;
525*495ae853SAndroid Build Coastguard Worker                     }
526*495ae853SAndroid Build Coastguard Worker 
527*495ae853SAndroid Build Coastguard Worker                     if(b_is_mv_non_identical)
528*495ae853SAndroid Build Coastguard Worker                     {
529*495ae853SAndroid Build Coastguard Worker                         i4_num_ilp_mvs++;
530*495ae853SAndroid Build Coastguard Worker                     }
531*495ae853SAndroid Build Coastguard Worker                 }
532*495ae853SAndroid Build Coastguard Worker             }
533*495ae853SAndroid Build Coastguard Worker             else
534*495ae853SAndroid Build Coastguard Worker             {
535*495ae853SAndroid Build Coastguard Worker                 ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs] = INVALID_MB_TYPE;
536*495ae853SAndroid Build Coastguard Worker             }
537*495ae853SAndroid Build Coastguard Worker         }
538*495ae853SAndroid Build Coastguard Worker     }
539*495ae853SAndroid Build Coastguard Worker 
540*495ae853SAndroid Build Coastguard Worker     ps_ilp_mv_outputs->s_ilp_me_cands.u4_num_ilp_mvs_incl_nbrs = i4_num_ilp_mvs;
541*495ae853SAndroid Build Coastguard Worker }
542*495ae853SAndroid Build Coastguard Worker 
isvce_get_mb_ilp_mv(svc_ilp_mv_ctxt_t * ps_ilp_mv_ctxt)543*495ae853SAndroid Build Coastguard Worker void isvce_get_mb_ilp_mv(svc_ilp_mv_ctxt_t *ps_ilp_mv_ctxt)
544*495ae853SAndroid Build Coastguard Worker {
545*495ae853SAndroid Build Coastguard Worker     svc_layer_data_t *ps_ref_layer_data;
546*495ae853SAndroid Build Coastguard Worker     ilp_mv_layer_state_t *ps_layer_state;
547*495ae853SAndroid Build Coastguard Worker     ilp_mv_mb_state_t *ps_mb_state;
548*495ae853SAndroid Build Coastguard Worker     isvce_mb_info_t *ps_ref_mb_info;
549*495ae853SAndroid Build Coastguard Worker     coordinates_t s_frame_dims;
550*495ae853SAndroid Build Coastguard Worker     coordinates_t s_frame_dims_in_mbs;
551*495ae853SAndroid Build Coastguard Worker     coordinates_t s_ref_frame_dims;
552*495ae853SAndroid Build Coastguard Worker     coordinates_t s_ref_frame_dims_in_mbs;
553*495ae853SAndroid Build Coastguard Worker 
554*495ae853SAndroid Build Coastguard Worker     WORD32 i, j;
555*495ae853SAndroid Build Coastguard Worker 
556*495ae853SAndroid Build Coastguard Worker     ilp_mv_constants_t *ps_ilp_mv_constants = &ps_ilp_mv_ctxt->s_ilp_mv_constants;
557*495ae853SAndroid Build Coastguard Worker     ilp_mv_variables_t *ps_ilp_mv_variables = &ps_ilp_mv_ctxt->s_ilp_mv_variables;
558*495ae853SAndroid Build Coastguard Worker     ilp_mv_outputs_t *ps_ilp_mv_outputs = &ps_ilp_mv_ctxt->s_ilp_mv_outputs;
559*495ae853SAndroid Build Coastguard Worker     ilp_mv_state_t *ps_ilp_mv_state = (ilp_mv_state_t *) ps_ilp_mv_constants->pv_state;
560*495ae853SAndroid Build Coastguard Worker     svc_ilp_data_t *ps_svc_ilp_data = ps_ilp_mv_variables->ps_svc_ilp_data;
561*495ae853SAndroid Build Coastguard Worker     svc_au_data_t *ps_svc_au_data = ps_svc_ilp_data->ps_svc_au_data;
562*495ae853SAndroid Build Coastguard Worker     coordinates_t *ps_mb_pos = &ps_ilp_mv_variables->s_mb_pos;
563*495ae853SAndroid Build Coastguard Worker     const isvce_enc_pu_mv_t s_default_mv = {{0, 0}, -1};
564*495ae853SAndroid Build Coastguard Worker 
565*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_spatial_layer_id = ps_ilp_mv_variables->u1_spatial_layer_id;
566*495ae853SAndroid Build Coastguard Worker 
567*495ae853SAndroid Build Coastguard Worker     s_frame_dims.i4_abscissa = ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id].u4_width;
568*495ae853SAndroid Build Coastguard Worker     s_frame_dims.i4_ordinate = ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id].u4_height;
569*495ae853SAndroid Build Coastguard Worker     s_frame_dims_in_mbs.i4_abscissa = s_frame_dims.i4_abscissa / MB_SIZE;
570*495ae853SAndroid Build Coastguard Worker     s_frame_dims_in_mbs.i4_ordinate = s_frame_dims.i4_ordinate / MB_SIZE;
571*495ae853SAndroid Build Coastguard Worker     s_ref_frame_dims.i4_abscissa =
572*495ae853SAndroid Build Coastguard Worker         ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id - 1].u4_width;
573*495ae853SAndroid Build Coastguard Worker     s_ref_frame_dims.i4_ordinate =
574*495ae853SAndroid Build Coastguard Worker         ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id - 1].u4_height;
575*495ae853SAndroid Build Coastguard Worker     s_ref_frame_dims_in_mbs.i4_abscissa = s_ref_frame_dims.i4_abscissa / MB_SIZE;
576*495ae853SAndroid Build Coastguard Worker     s_ref_frame_dims_in_mbs.i4_ordinate = s_ref_frame_dims.i4_ordinate / MB_SIZE;
577*495ae853SAndroid Build Coastguard Worker 
578*495ae853SAndroid Build Coastguard Worker     ps_ref_layer_data = &ps_svc_au_data->ps_svc_layer_data[u1_spatial_layer_id - 1];
579*495ae853SAndroid Build Coastguard Worker     ps_layer_state = &ps_ilp_mv_state->ps_layer_state[u1_spatial_layer_id];
580*495ae853SAndroid Build Coastguard Worker     ps_mb_state =
581*495ae853SAndroid Build Coastguard Worker         &ps_layer_state->ps_mb_states[ps_mb_pos->i4_abscissa +
582*495ae853SAndroid Build Coastguard Worker                                       ps_mb_pos->i4_ordinate * s_frame_dims_in_mbs.i4_abscissa];
583*495ae853SAndroid Build Coastguard Worker 
584*495ae853SAndroid Build Coastguard Worker     ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0] = s_default_mv;
585*495ae853SAndroid Build Coastguard Worker     ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L1] = s_default_mv;
586*495ae853SAndroid Build Coastguard Worker 
587*495ae853SAndroid Build Coastguard Worker     ps_ref_mb_info = &ps_ref_layer_data->ps_mb_info[ps_mb_state->as_mb_positions[0][0].i4_abscissa +
588*495ae853SAndroid Build Coastguard Worker                                                     ps_mb_state->as_mb_positions[0][0].i4_ordinate *
589*495ae853SAndroid Build Coastguard Worker                                                         s_ref_frame_dims_in_mbs.i4_abscissa];
590*495ae853SAndroid Build Coastguard Worker 
591*495ae853SAndroid Build Coastguard Worker     if((ps_ref_mb_info->u2_mb_type == P16x16) || (ps_ref_mb_info->u2_mb_type == B16x16))
592*495ae853SAndroid Build Coastguard Worker     {
593*495ae853SAndroid Build Coastguard Worker         ps_ilp_mv_outputs->s_ilp_mv.e_mb_type = ps_ref_mb_info->u2_mb_type;
594*495ae853SAndroid Build Coastguard Worker 
595*495ae853SAndroid Build Coastguard Worker         ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0] = ps_ref_mb_info->as_pu->u1_pred_mode;
596*495ae853SAndroid Build Coastguard Worker 
597*495ae853SAndroid Build Coastguard Worker         if(ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0] != L0)
598*495ae853SAndroid Build Coastguard Worker         {
599*495ae853SAndroid Build Coastguard Worker             ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L1] = ps_ref_mb_info->as_pu->as_me_info[L1];
600*495ae853SAndroid Build Coastguard Worker         }
601*495ae853SAndroid Build Coastguard Worker 
602*495ae853SAndroid Build Coastguard Worker         if(ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0] != L1)
603*495ae853SAndroid Build Coastguard Worker         {
604*495ae853SAndroid Build Coastguard Worker             ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0] = ps_ref_mb_info->as_pu->as_me_info[L0];
605*495ae853SAndroid Build Coastguard Worker         }
606*495ae853SAndroid Build Coastguard Worker     }
607*495ae853SAndroid Build Coastguard Worker     else
608*495ae853SAndroid Build Coastguard Worker     {
609*495ae853SAndroid Build Coastguard Worker         ps_ilp_mv_outputs->s_ilp_mv.e_mb_type = INVALID_MB_TYPE;
610*495ae853SAndroid Build Coastguard Worker     }
611*495ae853SAndroid Build Coastguard Worker 
612*495ae853SAndroid Build Coastguard Worker     /* Function call to get non 16x16 ilp mvs for me candidates */
613*495ae853SAndroid Build Coastguard Worker     isvce_get_ilp_mvs_for_me(ps_ilp_mv_ctxt);
614*495ae853SAndroid Build Coastguard Worker 
615*495ae853SAndroid Build Coastguard Worker     /* Encoder supports only 16x16 partition. */
616*495ae853SAndroid Build Coastguard Worker     /* The code below ensures only 16x16 ILP MV's are used */
617*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < MAX_PU_IN_MB_COL; i++)
618*495ae853SAndroid Build Coastguard Worker     {
619*495ae853SAndroid Build Coastguard Worker         for(j = 0; j < MAX_PU_IN_MB_ROW; j++)
620*495ae853SAndroid Build Coastguard Worker         {
621*495ae853SAndroid Build Coastguard Worker             bool b_unsupported_mv;
622*495ae853SAndroid Build Coastguard Worker 
623*495ae853SAndroid Build Coastguard Worker             ps_ref_mb_info =
624*495ae853SAndroid Build Coastguard Worker                 &ps_ref_layer_data->ps_mb_info[ps_mb_state->as_mb_positions[i][j].i4_abscissa +
625*495ae853SAndroid Build Coastguard Worker                                                ps_mb_state->as_mb_positions[i][j].i4_ordinate *
626*495ae853SAndroid Build Coastguard Worker                                                    s_ref_frame_dims_in_mbs.i4_abscissa];
627*495ae853SAndroid Build Coastguard Worker 
628*495ae853SAndroid Build Coastguard Worker             b_unsupported_mv =
629*495ae853SAndroid Build Coastguard Worker                 (ps_ref_mb_info->u2_mb_type != ps_ilp_mv_outputs->s_ilp_mv.e_mb_type) ||
630*495ae853SAndroid Build Coastguard Worker                 (ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0] !=
631*495ae853SAndroid Build Coastguard Worker                  ps_ref_mb_info->as_pu->u1_pred_mode) ||
632*495ae853SAndroid Build Coastguard Worker                 !isvce_check_identical_mv(ps_ilp_mv_outputs->s_ilp_mv.as_mv[0],
633*495ae853SAndroid Build Coastguard Worker                                           ps_ref_mb_info->as_pu->as_me_info,
634*495ae853SAndroid Build Coastguard Worker                                           ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0]);
635*495ae853SAndroid Build Coastguard Worker 
636*495ae853SAndroid Build Coastguard Worker             if(b_unsupported_mv)
637*495ae853SAndroid Build Coastguard Worker             {
638*495ae853SAndroid Build Coastguard Worker                 ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0] = s_default_mv;
639*495ae853SAndroid Build Coastguard Worker                 ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L1] = s_default_mv;
640*495ae853SAndroid Build Coastguard Worker                 ps_ilp_mv_outputs->s_ilp_mv.e_mb_type = INVALID_MB_TYPE;
641*495ae853SAndroid Build Coastguard Worker 
642*495ae853SAndroid Build Coastguard Worker                 return;
643*495ae853SAndroid Build Coastguard Worker             }
644*495ae853SAndroid Build Coastguard Worker         }
645*495ae853SAndroid Build Coastguard Worker     }
646*495ae853SAndroid Build Coastguard Worker 
647*495ae853SAndroid Build Coastguard Worker     if(ps_ilp_mv_outputs->s_ilp_mv.e_mb_type != INVALID_MB_TYPE)
648*495ae853SAndroid Build Coastguard Worker     {
649*495ae853SAndroid Build Coastguard Worker         if(ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0] != L0)
650*495ae853SAndroid Build Coastguard Worker         {
651*495ae853SAndroid Build Coastguard Worker             ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L1].s_mv.i2_mvx =
652*495ae853SAndroid Build Coastguard Worker                 (ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L1].s_mv.i2_mvx *
653*495ae853SAndroid Build Coastguard Worker                      ps_layer_state->s_mv_scale.i4_abscissa +
654*495ae853SAndroid Build Coastguard Worker                  32768) >>
655*495ae853SAndroid Build Coastguard Worker                 16;
656*495ae853SAndroid Build Coastguard Worker             ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L1].s_mv.i2_mvy =
657*495ae853SAndroid Build Coastguard Worker                 (ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L1].s_mv.i2_mvy *
658*495ae853SAndroid Build Coastguard Worker                      ps_layer_state->s_mv_scale.i4_ordinate +
659*495ae853SAndroid Build Coastguard Worker                  32768) >>
660*495ae853SAndroid Build Coastguard Worker                 16;
661*495ae853SAndroid Build Coastguard Worker         }
662*495ae853SAndroid Build Coastguard Worker 
663*495ae853SAndroid Build Coastguard Worker         if(ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0] != L1)
664*495ae853SAndroid Build Coastguard Worker         {
665*495ae853SAndroid Build Coastguard Worker             ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0].s_mv.i2_mvx =
666*495ae853SAndroid Build Coastguard Worker                 (ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0].s_mv.i2_mvx *
667*495ae853SAndroid Build Coastguard Worker                      ps_layer_state->s_mv_scale.i4_abscissa +
668*495ae853SAndroid Build Coastguard Worker                  32768) >>
669*495ae853SAndroid Build Coastguard Worker                 16;
670*495ae853SAndroid Build Coastguard Worker             ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0].s_mv.i2_mvy =
671*495ae853SAndroid Build Coastguard Worker                 (ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0].s_mv.i2_mvy *
672*495ae853SAndroid Build Coastguard Worker                      ps_layer_state->s_mv_scale.i4_ordinate +
673*495ae853SAndroid Build Coastguard Worker                  32768) >>
674*495ae853SAndroid Build Coastguard Worker                 16;
675*495ae853SAndroid Build Coastguard Worker         }
676*495ae853SAndroid Build Coastguard Worker     }
677*495ae853SAndroid Build Coastguard Worker     else
678*495ae853SAndroid Build Coastguard Worker     {
679*495ae853SAndroid Build Coastguard Worker         ps_ilp_mv_outputs->s_ilp_mv.e_mb_type = INVALID_MB_TYPE;
680*495ae853SAndroid Build Coastguard Worker         ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0] = INVALID_PRED_MODE;
681*495ae853SAndroid Build Coastguard Worker     }
682*495ae853SAndroid Build Coastguard Worker }
683*495ae853SAndroid Build Coastguard Worker 
isvce_mvp_idx_eval(isvce_mb_info_t * ps_mb_info,isvce_enc_pu_mv_t * ps_spatial_mvp,isvce_enc_pu_mv_t * ps_ilp_mvp,UWORD8 * pu1_mvd_costs)684*495ae853SAndroid Build Coastguard Worker void isvce_mvp_idx_eval(isvce_mb_info_t *ps_mb_info, isvce_enc_pu_mv_t *ps_spatial_mvp,
685*495ae853SAndroid Build Coastguard Worker                         isvce_enc_pu_mv_t *ps_ilp_mvp, UWORD8 *pu1_mvd_costs)
686*495ae853SAndroid Build Coastguard Worker {
687*495ae853SAndroid Build Coastguard Worker     if(USE_ILP_MV_AS_MVP && ps_ilp_mvp && !ps_mb_info->u1_is_intra &&
688*495ae853SAndroid Build Coastguard Worker        (ps_mb_info->u2_mb_type != PSKIP) && (ps_mb_info->u2_mb_type != BSKIP) &&
689*495ae853SAndroid Build Coastguard Worker        (ps_mb_info->u2_mb_type != BASE_MODE))
690*495ae853SAndroid Build Coastguard Worker     {
691*495ae853SAndroid Build Coastguard Worker         isvce_enc_pu_mv_t *ps_mv;
692*495ae853SAndroid Build Coastguard Worker         isvce_enc_pu_mv_t *aps_mvps[2];
693*495ae853SAndroid Build Coastguard Worker 
694*495ae853SAndroid Build Coastguard Worker         WORD32 ai4_mvd_costs[2];
695*495ae853SAndroid Build Coastguard Worker         WORD32 i, j;
696*495ae853SAndroid Build Coastguard Worker 
697*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < NUM_PRED_DIRS; i++)
698*495ae853SAndroid Build Coastguard Worker         {
699*495ae853SAndroid Build Coastguard Worker             PRED_MODE_T e_pred_mode = (PRED_MODE_T) i;
700*495ae853SAndroid Build Coastguard Worker             PRED_MODE_T e_cmpl_pred_mode = (e_pred_mode == L0) ? L1 : L0;
701*495ae853SAndroid Build Coastguard Worker 
702*495ae853SAndroid Build Coastguard Worker             if(ps_mb_info->as_pu->u1_pred_mode != e_pred_mode)
703*495ae853SAndroid Build Coastguard Worker             {
704*495ae853SAndroid Build Coastguard Worker                 ps_mv = &ps_mb_info->as_pu->as_me_info[e_cmpl_pred_mode];
705*495ae853SAndroid Build Coastguard Worker                 aps_mvps[0] = &ps_spatial_mvp[e_cmpl_pred_mode];
706*495ae853SAndroid Build Coastguard Worker                 aps_mvps[1] = &ps_ilp_mvp[e_cmpl_pred_mode];
707*495ae853SAndroid Build Coastguard Worker 
708*495ae853SAndroid Build Coastguard Worker                 for(j = 0; j < 2; j++)
709*495ae853SAndroid Build Coastguard Worker                 {
710*495ae853SAndroid Build Coastguard Worker                     if((aps_mvps[j]->i1_ref_idx != -1) &&
711*495ae853SAndroid Build Coastguard Worker                        (!j || ((j == 1) && (ps_mv->i1_ref_idx == aps_mvps[j]->i1_ref_idx))))
712*495ae853SAndroid Build Coastguard Worker                     {
713*495ae853SAndroid Build Coastguard Worker                         ai4_mvd_costs[j] =
714*495ae853SAndroid Build Coastguard Worker                             pu1_mvd_costs[ps_mv->s_mv.i2_mvx - aps_mvps[j]->s_mv.i2_mvx] +
715*495ae853SAndroid Build Coastguard Worker                             pu1_mvd_costs[ps_mv->s_mv.i2_mvy - aps_mvps[j]->s_mv.i2_mvy];
716*495ae853SAndroid Build Coastguard Worker                     }
717*495ae853SAndroid Build Coastguard Worker                     else
718*495ae853SAndroid Build Coastguard Worker                     {
719*495ae853SAndroid Build Coastguard Worker                         ai4_mvd_costs[j] = INT32_MAX;
720*495ae853SAndroid Build Coastguard Worker                     }
721*495ae853SAndroid Build Coastguard Worker                 }
722*495ae853SAndroid Build Coastguard Worker 
723*495ae853SAndroid Build Coastguard Worker                 ps_mb_info->as_pu->au1_mvp_idx[e_cmpl_pred_mode] =
724*495ae853SAndroid Build Coastguard Worker                     ai4_mvd_costs[0] > ai4_mvd_costs[1];
725*495ae853SAndroid Build Coastguard Worker             }
726*495ae853SAndroid Build Coastguard Worker             else
727*495ae853SAndroid Build Coastguard Worker             {
728*495ae853SAndroid Build Coastguard Worker                 ps_mb_info->as_pu->au1_mvp_idx[e_cmpl_pred_mode] = 0;
729*495ae853SAndroid Build Coastguard Worker             }
730*495ae853SAndroid Build Coastguard Worker         }
731*495ae853SAndroid Build Coastguard Worker     }
732*495ae853SAndroid Build Coastguard Worker     else
733*495ae853SAndroid Build Coastguard Worker     {
734*495ae853SAndroid Build Coastguard Worker         ps_mb_info->as_pu->au1_mvp_idx[L0] = 0;
735*495ae853SAndroid Build Coastguard Worker         ps_mb_info->as_pu->au1_mvp_idx[L1] = 0;
736*495ae853SAndroid Build Coastguard Worker     }
737*495ae853SAndroid Build Coastguard Worker }
738