Coverage Report

Created: 2025-08-29 06:39

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