Coverage Report

Created: 2026-06-08 07:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/encoder/svc/isvce_ilp_mv.c
Line
Count
Source
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.7k
{
70
14.7k
    UWORD32 u4_size = 0;
71
72
14.7k
    if(u1_num_spatial_layers > 1)
73
12.9k
    {
74
12.9k
        WORD32 i;
75
76
12.9k
        u4_size += MAX_PROCESS_CTXT * sizeof(svc_ilp_mv_ctxt_t);
77
12.9k
        u4_size += MAX_PROCESS_CTXT * sizeof(ilp_mv_state_t);
78
79
12.9k
        u4_size += u1_num_spatial_layers * sizeof(ilp_mv_layer_state_t);
80
81
33.6k
        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.9k
    }
94
95
14.7k
    return u4_size;
96
14.7k
}
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
6.91M
{
105
6.91M
    UWORD32 i, j;
106
107
6.91M
    coordinates_t(*aps_pu_positions)[MAX_PU_IN_MB_ROW] = ps_mb_state->as_pu_positions;
108
6.91M
    coordinates_t(*aps_mb_positions)[MAX_PU_IN_MB_ROW] = ps_mb_state->as_mb_positions;
109
110
34.5M
    for(i = 0; i < MAX_PU_IN_MB_COL; i++)
111
27.6M
    {
112
27.6M
        UWORD32 u4_y_ref16;
113
114
27.6M
        UWORD32 u4_yc = ps_mb_pos->i4_ordinate * ps_layer_props->u4_mb_ht +
115
27.6M
                        (4 * i + 1) * (1 + u1_field_mb_flag - u1_field_pic_flag);
116
117
27.6M
        u4_y_ref16 =
118
27.6M
            (u4_yc * ps_layer_props->u4_scale_y + (1 << (ps_layer_props->u4_shift_y - 1))) >>
119
27.6M
            ps_layer_props->u4_shift_y;
120
27.6M
        u4_y_ref16 = MIN(u4_y_ref16, u4_ref_ht - 1);
121
122
138M
        for(j = 0; j < MAX_PU_IN_MB_ROW; j++)
123
110M
        {
124
110M
            UWORD32 u4_x_ref16;
125
126
110M
            UWORD32 u4_xc = ps_mb_pos->i4_abscissa * ps_layer_props->u4_mb_wd + 4 * j + 1;
127
128
110M
            u4_x_ref16 =
129
110M
                (u4_xc * ps_layer_props->u4_scale_x + (1 << (ps_layer_props->u4_shift_x - 1))) >>
130
110M
                ps_layer_props->u4_shift_x;
131
110M
            u4_x_ref16 = MIN(u4_x_ref16, u4_ref_wd - 1);
132
133
110M
            aps_pu_positions[i][j].i4_abscissa = u4_x_ref16;
134
110M
            aps_pu_positions[i][j].i4_ordinate = u4_y_ref16;
135
136
110M
            aps_mb_positions[i][j].i4_abscissa = (u4_x_ref16 / MB_SIZE);
137
110M
            aps_mb_positions[i][j].i4_ordinate = (u4_y_ref16 / MB_SIZE);
138
110M
        }
139
27.6M
    }
140
6.91M
}
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.87k
{
145
6.87k
    UWORD32 i, j;
146
147
6.87k
    const UWORD8 u1_ref_layer_field_pic_flag = 0;
148
6.87k
    const UWORD8 u1_field_pic_flag = 0;
149
6.87k
    const UWORD8 u1_field_mb_flag = 0;
150
151
6.87k
    ilp_mv_mb_state_t *ps_mb_states;
152
6.87k
    layer_resampler_props_t *ps_layer_props;
153
154
6.87k
    UWORD32 u4_wd_in_mbs;
155
6.87k
    UWORD32 u4_ht_in_mbs;
156
157
6.87k
    UWORD32 u4_ref_wd = (u4_wd / d_spatial_res_ratio);
158
6.87k
    UWORD32 u4_ref_ht = (u4_ht / d_spatial_res_ratio) * (1 + u1_ref_layer_field_pic_flag);
159
6.87k
    UWORD32 u4_scaled_wd = u4_wd;
160
6.87k
    UWORD32 u4_scaled_ht = u4_ht * (1 + u1_field_pic_flag);
161
162
6.87k
    ps_mb_states = ps_layer_state->ps_mb_states;
163
6.87k
    ps_layer_props = ps_layer_state->ps_props;
164
165
6.87k
    u4_wd_in_mbs = u4_scaled_wd / ps_layer_props->u4_mb_wd;
166
6.87k
    u4_ht_in_mbs = u4_scaled_ht / ps_layer_props->u4_mb_ht;
167
168
6.87k
    ps_layer_state->s_mv_scale.i4_abscissa = ((u4_scaled_wd << 16) + (u4_ref_wd >> 1)) / u4_ref_wd;
169
6.87k
    ps_layer_state->s_mv_scale.i4_ordinate = ((u4_scaled_ht << 16) + (u4_ref_ht >> 1)) / u4_ref_ht;
170
171
136k
    for(i = 0; i < u4_ht_in_mbs; i++)
172
129k
    {
173
7.04M
        for(j = 0; j < u4_wd_in_mbs; j++)
174
6.91M
        {
175
6.91M
            coordinates_t s_mb_pos = {j, i};
176
177
6.91M
            isvce_ref_layer_pu_and_mb_pos_init(ps_layer_props, &ps_mb_states[j + i * u4_wd_in_mbs],
178
6.91M
                                               &s_mb_pos, u4_ref_wd, u4_ref_ht, u1_field_pic_flag,
179
6.91M
                                               u1_field_mb_flag);
180
6.91M
        }
181
129k
    }
182
6.87k
}
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.21k
{
200
5.21k
    WORD32 i, j;
201
202
5.21k
    const WORD32 i4_num_proc_ctxts = sizeof(ps_codec->as_process) / sizeof(ps_codec->as_process[0]);
203
5.21k
    UWORD8 u1_num_spatial_layers = ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers;
204
205
5.21k
    if(u1_num_spatial_layers > 1)
206
4.32k
    {
207
4.32k
        ilp_mv_layer_state_t *ps_layer_states = NULL;
208
4.32k
        ilp_mv_mb_state_t *aps_luma_mb_states[MAX_NUM_SPATIAL_LAYERS];
209
210
4.32k
        DOUBLE d_spatial_res_ratio = ps_codec->s_cfg.s_svc_params.d_spatial_res_ratio;
211
4.32k
        UWORD32 u4_wd = ps_codec->s_cfg.u4_wd;
212
4.32k
        UWORD32 u4_ht = ps_codec->s_cfg.u4_ht;
213
4.32k
        UWORD8 *pu1_buf = ps_mem_rec->pv_base;
214
4.32k
        WORD64 i8_alloc_mem_size =
215
4.32k
            isvce_get_ilp_mv_ctxt_size(u1_num_spatial_layers, d_spatial_res_ratio, u4_wd, u4_ht);
216
217
38.9k
        for(i = 0; i < i4_num_proc_ctxts; i++)
218
34.5k
        {
219
34.5k
            ilp_mv_state_t *ps_ilp_mv_state;
220
34.5k
            svc_ilp_mv_ctxt_t *ps_ilp_mv_ctxt;
221
222
34.5k
            isvce_process_ctxt_t *ps_proc = ps_codec->as_process + i;
223
224
34.5k
            ps_ilp_mv_ctxt = ps_proc->ps_svc_ilp_mv_ctxt = (svc_ilp_mv_ctxt_t *) pu1_buf;
225
34.5k
            pu1_buf += sizeof(svc_ilp_mv_ctxt_t);
226
34.5k
            i8_alloc_mem_size -= sizeof(svc_ilp_mv_ctxt_t);
227
228
34.5k
            ps_ilp_mv_ctxt->s_ilp_mv_constants.pv_state = pu1_buf;
229
34.5k
            ps_ilp_mv_state = (ilp_mv_state_t *) pu1_buf;
230
34.5k
            pu1_buf += sizeof(ilp_mv_state_t);
231
34.5k
            i8_alloc_mem_size -= sizeof(ilp_mv_state_t);
232
233
34.5k
            if(0 == i)
234
4.32k
            {
235
4.32k
                ps_ilp_mv_state->ps_layer_state = (ilp_mv_layer_state_t *) pu1_buf;
236
4.32k
                ps_layer_states = ps_ilp_mv_state->ps_layer_state;
237
4.32k
                pu1_buf += u1_num_spatial_layers * sizeof(ps_ilp_mv_state->ps_layer_state[0]);
238
4.32k
                i8_alloc_mem_size -=
239
4.32k
                    u1_num_spatial_layers * sizeof(ps_ilp_mv_state->ps_layer_state[0]);
240
4.32k
            }
241
30.2k
            else
242
30.2k
            {
243
30.2k
                ps_ilp_mv_state->ps_layer_state = ps_layer_states;
244
30.2k
            }
245
246
34.5k
            ASSERT(i8_alloc_mem_size >= 0);
247
248
34.5k
            if(0 == i)
249
4.32k
            {
250
11.1k
                for(j = u1_num_spatial_layers - 1; j >= 1; j--)
251
6.87k
                {
252
6.87k
                    ilp_mv_layer_state_t *ps_layer = &ps_ilp_mv_state->ps_layer_state[j];
253
254
6.87k
                    WORD32 i4_layer_luma_wd =
255
6.87k
                        ((DOUBLE) u4_wd / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - j)) +
256
6.87k
                        0.99;
257
6.87k
                    WORD32 i4_layer_luma_ht =
258
6.87k
                        ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - j)) +
259
6.87k
                        0.99;
260
6.87k
                    WORD32 i4_layer_luma_mbs =
261
6.87k
                        (i4_layer_luma_wd / MB_SIZE) * (i4_layer_luma_ht / MB_SIZE);
262
263
6.87k
                    ps_layer->ps_mb_states = (ilp_mv_mb_state_t *) pu1_buf;
264
6.87k
                    aps_luma_mb_states[j] = ps_layer->ps_mb_states;
265
6.87k
                    pu1_buf += i4_layer_luma_mbs * sizeof(ps_layer->ps_mb_states[0]);
266
6.87k
                    i8_alloc_mem_size -= u1_num_spatial_layers * sizeof(ps_layer->ps_mb_states[0]);
267
268
6.87k
                    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.87k
                    ASSERT(ps_codec->s_svc_ilp_data.aps_layer_resampler_props[Y][j].u4_mb_wd ==
273
6.87k
                           MB_SIZE);
274
275
6.87k
                    ps_layer->ps_props = &ps_codec->s_svc_ilp_data.aps_layer_resampler_props[Y][j];
276
277
6.87k
                    isvce_ilp_mv_layer_state_init(ps_layer, d_spatial_res_ratio, i4_layer_luma_wd,
278
6.87k
                                                  i4_layer_luma_ht);
279
6.87k
                }
280
4.32k
            }
281
30.2k
            else
282
30.2k
            {
283
78.3k
                for(j = u1_num_spatial_layers - 1; j >= 1; j--)
284
48.1k
                {
285
48.1k
                    ilp_mv_layer_state_t *ps_layer = &ps_ilp_mv_state->ps_layer_state[j];
286
287
48.1k
                    ps_layer->ps_mb_states = aps_luma_mb_states[j];
288
289
48.1k
                    ps_layer->ps_props = &ps_codec->s_svc_ilp_data.aps_layer_resampler_props[Y][j];
290
48.1k
                }
291
30.2k
            }
292
34.5k
        }
293
4.32k
    }
294
889
    else
295
889
    {
296
8.00k
        for(i = 0; i < i4_num_proc_ctxts; i++)
297
7.11k
        {
298
7.11k
            ps_codec->as_process[i].ps_svc_ilp_mv_ctxt = NULL;
299
7.11k
        }
300
889
    }
301
5.21k
}
302
303
static void isvce_get_ilp_mvs_for_me(svc_ilp_mv_ctxt_t *ps_ilp_mv_ctxt)
304
949k
{
305
949k
    svc_layer_data_t *ps_ref_layer_data;
306
949k
    ilp_mv_layer_state_t *ps_layer_state;
307
949k
    ilp_mv_mb_state_t *ps_mb_state;
308
949k
    isvce_mb_info_t *ps_ref_mb_info;
309
949k
    coordinates_t s_frame_dims;
310
949k
    coordinates_t s_frame_dims_in_mbs;
311
949k
    coordinates_t s_ref_frame_dims;
312
949k
    coordinates_t s_ref_frame_dims_in_mbs;
313
314
949k
    bool b_is_mv_non_identical;
315
949k
    WORD32 i, j, k;
316
317
949k
    ilp_mv_constants_t *ps_ilp_mv_constants = &ps_ilp_mv_ctxt->s_ilp_mv_constants;
318
949k
    ilp_mv_variables_t *ps_ilp_mv_variables = &ps_ilp_mv_ctxt->s_ilp_mv_variables;
319
949k
    ilp_mv_outputs_t *ps_ilp_mv_outputs = &ps_ilp_mv_ctxt->s_ilp_mv_outputs;
320
949k
    ilp_mv_state_t *ps_ilp_mv_state = (ilp_mv_state_t *) ps_ilp_mv_constants->pv_state;
321
949k
    svc_ilp_data_t *ps_svc_ilp_data = ps_ilp_mv_variables->ps_svc_ilp_data;
322
949k
    svc_au_data_t *ps_svc_au_data = ps_svc_ilp_data->ps_svc_au_data;
323
949k
    coordinates_t *ps_mb_pos = &ps_ilp_mv_variables->s_mb_pos;
324
949k
    const isvce_enc_pu_mv_t s_default_mv = {{0, 0}, -1};
325
326
949k
    UWORD8 u1_spatial_layer_id = ps_ilp_mv_variables->u1_spatial_layer_id;
327
949k
    WORD32 i4_num_ilp_mvs = 0;
328
329
949k
    s_frame_dims.i4_abscissa = ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id].u4_width;
330
949k
    s_frame_dims.i4_ordinate = ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id].u4_height;
331
949k
    s_frame_dims_in_mbs.i4_abscissa = s_frame_dims.i4_abscissa / MB_SIZE;
332
949k
    s_frame_dims_in_mbs.i4_ordinate = s_frame_dims.i4_ordinate / MB_SIZE;
333
949k
    s_ref_frame_dims.i4_abscissa =
334
949k
        ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id - 1].u4_width;
335
949k
    s_ref_frame_dims.i4_ordinate =
336
949k
        ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id - 1].u4_height;
337
949k
    s_ref_frame_dims_in_mbs.i4_abscissa = s_ref_frame_dims.i4_abscissa / MB_SIZE;
338
949k
    s_ref_frame_dims_in_mbs.i4_ordinate = s_ref_frame_dims.i4_ordinate / MB_SIZE;
339
340
949k
    ps_ref_layer_data = &ps_svc_au_data->ps_svc_layer_data[u1_spatial_layer_id - 1];
341
949k
    ps_layer_state = &ps_ilp_mv_state->ps_layer_state[u1_spatial_layer_id];
342
949k
    ps_mb_state =
343
949k
        &ps_layer_state->ps_mb_states[ps_mb_pos->i4_abscissa +
344
949k
                                      ps_mb_pos->i4_ordinate * s_frame_dims_in_mbs.i4_abscissa];
345
346
4.73M
    for(i = 0; i < MAX_PU_IN_MB_COL; i++)
347
3.78M
    {
348
18.8M
        for(j = 0; j < MAX_PU_IN_MB_ROW; j++)
349
15.0M
        {
350
15.0M
            b_is_mv_non_identical = true;
351
352
15.0M
            ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0] = s_default_mv;
353
15.0M
            ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1] = s_default_mv;
354
355
15.0M
            ps_ref_mb_info =
356
15.0M
                &ps_ref_layer_data->ps_mb_info[ps_mb_state->as_mb_positions[i][j].i4_abscissa +
357
15.0M
                                               ps_mb_state->as_mb_positions[i][j].i4_ordinate *
358
15.0M
                                                   s_ref_frame_dims_in_mbs.i4_abscissa];
359
360
15.0M
            if((ps_ref_mb_info->u2_mb_type == P16x16) || (ps_ref_mb_info->u2_mb_type == B16x16))
361
7.82M
            {
362
7.82M
                ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs] =
363
7.82M
                    ps_ref_mb_info->u2_mb_type;
364
365
7.82M
                ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs] =
366
7.82M
                    ps_ref_mb_info->as_pu->u1_pred_mode;
367
368
7.82M
                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
7.82M
                if(ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs] != L1)
386
7.82M
                {
387
7.82M
                    ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0] =
388
7.82M
                        ps_ref_mb_info->as_pu->as_me_info[L0];
389
390
7.82M
                    ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvx =
391
7.82M
                        (ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvx *
392
7.82M
                             ps_layer_state->s_mv_scale.i4_abscissa +
393
7.82M
                         32768) >>
394
7.82M
                        16;
395
7.82M
                    ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvy =
396
7.82M
                        (ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvy *
397
7.82M
                             ps_layer_state->s_mv_scale.i4_ordinate +
398
7.82M
                         32768) >>
399
7.82M
                        16;
400
7.82M
                }
401
402
7.82M
                if(i4_num_ilp_mvs == 0)
403
511k
                {
404
511k
                    i4_num_ilp_mvs++;
405
511k
                }
406
7.31M
                else
407
7.31M
                {
408
16.3M
                    for(k = i4_num_ilp_mvs - 1; k >= 0; k--)
409
9.03M
                    {
410
9.03M
                        if((ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[k] ==
411
9.03M
                            ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs]) &&
412
9.03M
                           (ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[k] ==
413
9.03M
                            ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs]) &&
414
9.03M
                           isvce_check_identical_mv(
415
9.03M
                               ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[k],
416
9.03M
                               ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs],
417
9.03M
                               ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[k]))
418
7.15M
                        {
419
7.15M
                            b_is_mv_non_identical = false;
420
7.15M
                        }
421
9.03M
                    }
422
423
7.31M
                    if(b_is_mv_non_identical)
424
191k
                    {
425
191k
                        i4_num_ilp_mvs++;
426
191k
                    }
427
7.31M
                }
428
7.82M
            }
429
7.21M
            else
430
7.21M
            {
431
7.21M
                ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs] = INVALID_MB_TYPE;
432
7.21M
            }
433
15.0M
        }
434
3.78M
    }
435
436
949k
    ps_ilp_mv_outputs->s_ilp_me_cands.u4_num_ilp_mvs = i4_num_ilp_mvs;
437
438
4.74M
    for(i = 0; i < MAX_ILP_MV_IN_NBR_RGN; i++)
439
3.79M
    {
440
3.79M
        b_is_mv_non_identical = true;
441
442
3.79M
        ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0] = s_default_mv;
443
3.79M
        ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1] = s_default_mv;
444
445
3.79M
        if(ps_mb_pos->i4_abscissa + gai1_nbr_ilp_mv_map[i][0] >= 0 &&
446
3.70M
           ps_mb_pos->i4_abscissa + gai1_nbr_ilp_mv_map[i][0] < s_frame_dims_in_mbs.i4_abscissa &&
447
3.61M
           ps_mb_pos->i4_ordinate + gai1_nbr_ilp_mv_map[i][1] >= 0 &&
448
3.32M
           ps_mb_pos->i4_ordinate + gai1_nbr_ilp_mv_map[i][1] < s_frame_dims_in_mbs.i4_ordinate)
449
3.04M
        {
450
3.04M
            ps_mb_state =
451
3.04M
                &ps_layer_state->ps_mb_states[(ps_mb_pos->i4_abscissa + gai1_nbr_ilp_mv_map[i][0]) +
452
3.04M
                                              (ps_mb_pos->i4_ordinate + gai1_nbr_ilp_mv_map[i][1]) *
453
3.04M
                                                  s_frame_dims_in_mbs.i4_abscissa];
454
455
3.04M
            ps_ref_mb_info =
456
3.04M
                &ps_ref_layer_data->ps_mb_info[(ps_mb_state
457
3.04M
                                                    ->as_mb_positions[gai1_nbr_ilp_mv_map[i][2]]
458
3.04M
                                                                     [gai1_nbr_ilp_mv_map[i][3]]
459
3.04M
                                                    .i4_abscissa) +
460
3.04M
                                               ps_mb_state
461
3.04M
                                                       ->as_mb_positions[gai1_nbr_ilp_mv_map[i][2]]
462
3.04M
                                                                        [gai1_nbr_ilp_mv_map[i][3]]
463
3.04M
                                                       .i4_ordinate *
464
3.04M
                                                   s_ref_frame_dims_in_mbs.i4_abscissa];
465
466
3.04M
            if((ps_ref_mb_info->u2_mb_type == P16x16) || (ps_ref_mb_info->u2_mb_type == B16x16))
467
1.61M
            {
468
1.61M
                ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs] =
469
1.61M
                    ps_ref_mb_info->u2_mb_type;
470
471
1.61M
                ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs] =
472
1.61M
                    ps_ref_mb_info->as_pu->u1_pred_mode;
473
474
1.61M
                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
1.61M
                if(ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs] != L1)
492
1.61M
                {
493
1.61M
                    ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0] =
494
1.61M
                        ps_ref_mb_info->as_pu->as_me_info[L0];
495
496
1.61M
                    ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvx =
497
1.61M
                        (ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvx *
498
1.61M
                             ps_layer_state->s_mv_scale.i4_abscissa +
499
1.61M
                         32768) >>
500
1.61M
                        16;
501
1.61M
                    ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvy =
502
1.61M
                        (ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0].s_mv.i2_mvy *
503
1.61M
                             ps_layer_state->s_mv_scale.i4_ordinate +
504
1.61M
                         32768) >>
505
1.61M
                        16;
506
1.61M
                }
507
508
1.61M
                if(i4_num_ilp_mvs == 0)
509
47.6k
                {
510
47.6k
                    i4_num_ilp_mvs++;
511
47.6k
                }
512
1.56M
                else
513
1.56M
                {
514
4.33M
                    for(k = i4_num_ilp_mvs - 1; k >= 0; k--)
515
2.77M
                    {
516
2.77M
                        if((ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[k] ==
517
2.77M
                            ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs]) &&
518
2.77M
                           (ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[k] ==
519
2.77M
                            ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs]) &&
520
2.77M
                           isvce_check_identical_mv(
521
2.77M
                               ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[k],
522
2.77M
                               ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs],
523
2.77M
                               ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[k]))
524
1.19M
                            b_is_mv_non_identical = false;
525
2.77M
                    }
526
527
1.56M
                    if(b_is_mv_non_identical)
528
371k
                    {
529
371k
                        i4_num_ilp_mvs++;
530
371k
                    }
531
1.56M
                }
532
1.61M
            }
533
1.43M
            else
534
1.43M
            {
535
1.43M
                ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs] = INVALID_MB_TYPE;
536
1.43M
            }
537
3.04M
        }
538
3.79M
    }
539
540
949k
    ps_ilp_mv_outputs->s_ilp_me_cands.u4_num_ilp_mvs_incl_nbrs = i4_num_ilp_mvs;
541
949k
}
542
543
void isvce_get_mb_ilp_mv(svc_ilp_mv_ctxt_t *ps_ilp_mv_ctxt)
544
948k
{
545
948k
    svc_layer_data_t *ps_ref_layer_data;
546
948k
    ilp_mv_layer_state_t *ps_layer_state;
547
948k
    ilp_mv_mb_state_t *ps_mb_state;
548
948k
    isvce_mb_info_t *ps_ref_mb_info;
549
948k
    coordinates_t s_frame_dims;
550
948k
    coordinates_t s_frame_dims_in_mbs;
551
948k
    coordinates_t s_ref_frame_dims;
552
948k
    coordinates_t s_ref_frame_dims_in_mbs;
553
554
948k
    WORD32 i, j;
555
556
948k
    ilp_mv_constants_t *ps_ilp_mv_constants = &ps_ilp_mv_ctxt->s_ilp_mv_constants;
557
948k
    ilp_mv_variables_t *ps_ilp_mv_variables = &ps_ilp_mv_ctxt->s_ilp_mv_variables;
558
948k
    ilp_mv_outputs_t *ps_ilp_mv_outputs = &ps_ilp_mv_ctxt->s_ilp_mv_outputs;
559
948k
    ilp_mv_state_t *ps_ilp_mv_state = (ilp_mv_state_t *) ps_ilp_mv_constants->pv_state;
560
948k
    svc_ilp_data_t *ps_svc_ilp_data = ps_ilp_mv_variables->ps_svc_ilp_data;
561
948k
    svc_au_data_t *ps_svc_au_data = ps_svc_ilp_data->ps_svc_au_data;
562
948k
    coordinates_t *ps_mb_pos = &ps_ilp_mv_variables->s_mb_pos;
563
948k
    const isvce_enc_pu_mv_t s_default_mv = {{0, 0}, -1};
564
565
948k
    UWORD8 u1_spatial_layer_id = ps_ilp_mv_variables->u1_spatial_layer_id;
566
567
948k
    s_frame_dims.i4_abscissa = ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id].u4_width;
568
948k
    s_frame_dims.i4_ordinate = ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id].u4_height;
569
948k
    s_frame_dims_in_mbs.i4_abscissa = s_frame_dims.i4_abscissa / MB_SIZE;
570
948k
    s_frame_dims_in_mbs.i4_ordinate = s_frame_dims.i4_ordinate / MB_SIZE;
571
948k
    s_ref_frame_dims.i4_abscissa =
572
948k
        ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id - 1].u4_width;
573
948k
    s_ref_frame_dims.i4_ordinate =
574
948k
        ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id - 1].u4_height;
575
948k
    s_ref_frame_dims_in_mbs.i4_abscissa = s_ref_frame_dims.i4_abscissa / MB_SIZE;
576
948k
    s_ref_frame_dims_in_mbs.i4_ordinate = s_ref_frame_dims.i4_ordinate / MB_SIZE;
577
578
948k
    ps_ref_layer_data = &ps_svc_au_data->ps_svc_layer_data[u1_spatial_layer_id - 1];
579
948k
    ps_layer_state = &ps_ilp_mv_state->ps_layer_state[u1_spatial_layer_id];
580
948k
    ps_mb_state =
581
948k
        &ps_layer_state->ps_mb_states[ps_mb_pos->i4_abscissa +
582
948k
                                      ps_mb_pos->i4_ordinate * s_frame_dims_in_mbs.i4_abscissa];
583
584
948k
    ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0] = s_default_mv;
585
948k
    ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L1] = s_default_mv;
586
587
948k
    ps_ref_mb_info = &ps_ref_layer_data->ps_mb_info[ps_mb_state->as_mb_positions[0][0].i4_abscissa +
588
948k
                                                    ps_mb_state->as_mb_positions[0][0].i4_ordinate *
589
948k
                                                        s_ref_frame_dims_in_mbs.i4_abscissa];
590
591
948k
    if((ps_ref_mb_info->u2_mb_type == P16x16) || (ps_ref_mb_info->u2_mb_type == B16x16))
592
496k
    {
593
496k
        ps_ilp_mv_outputs->s_ilp_mv.e_mb_type = ps_ref_mb_info->u2_mb_type;
594
595
496k
        ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0] = ps_ref_mb_info->as_pu->u1_pred_mode;
596
597
496k
        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
496k
        if(ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0] != L1)
603
496k
        {
604
496k
            ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0] = ps_ref_mb_info->as_pu->as_me_info[L0];
605
496k
        }
606
496k
    }
607
452k
    else
608
452k
    {
609
452k
        ps_ilp_mv_outputs->s_ilp_mv.e_mb_type = INVALID_MB_TYPE;
610
452k
    }
611
612
    /* Function call to get non 16x16 ilp mvs for me candidates */
613
948k
    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
2.43M
    for(i = 0; i < MAX_PU_IN_MB_COL; i++)
618
2.10M
    {
619
8.15M
        for(j = 0; j < MAX_PU_IN_MB_ROW; j++)
620
6.67M
        {
621
6.67M
            bool b_unsupported_mv;
622
623
6.67M
            ps_ref_mb_info =
624
6.67M
                &ps_ref_layer_data->ps_mb_info[ps_mb_state->as_mb_positions[i][j].i4_abscissa +
625
6.67M
                                               ps_mb_state->as_mb_positions[i][j].i4_ordinate *
626
6.67M
                                                   s_ref_frame_dims_in_mbs.i4_abscissa];
627
628
6.67M
            b_unsupported_mv =
629
6.67M
                (ps_ref_mb_info->u2_mb_type != ps_ilp_mv_outputs->s_ilp_mv.e_mb_type) ||
630
6.20M
                (ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0] !=
631
6.20M
                 ps_ref_mb_info->as_pu->u1_pred_mode) ||
632
6.20M
                !isvce_check_identical_mv(ps_ilp_mv_outputs->s_ilp_mv.as_mv[0],
633
6.20M
                                          ps_ref_mb_info->as_pu->as_me_info,
634
6.20M
                                          ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0]);
635
636
6.67M
            if(b_unsupported_mv)
637
620k
            {
638
620k
                ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0] = s_default_mv;
639
620k
                ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L1] = s_default_mv;
640
620k
                ps_ilp_mv_outputs->s_ilp_mv.e_mb_type = INVALID_MB_TYPE;
641
642
620k
                return;
643
620k
            }
644
6.67M
        }
645
2.10M
    }
646
647
328k
    if(ps_ilp_mv_outputs->s_ilp_mv.e_mb_type != INVALID_MB_TYPE)
648
330k
    {
649
330k
        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
330k
        if(ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0] != L1)
664
330k
        {
665
330k
            ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0].s_mv.i2_mvx =
666
330k
                (ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0].s_mv.i2_mvx *
667
330k
                     ps_layer_state->s_mv_scale.i4_abscissa +
668
330k
                 32768) >>
669
330k
                16;
670
330k
            ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0].s_mv.i2_mvy =
671
330k
                (ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0].s_mv.i2_mvy *
672
330k
                     ps_layer_state->s_mv_scale.i4_ordinate +
673
330k
                 32768) >>
674
330k
                16;
675
330k
        }
676
330k
    }
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
328k
}
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
10.2M
{
687
10.2M
    if(USE_ILP_MV_AS_MVP && ps_ilp_mvp && !ps_mb_info->u1_is_intra &&
688
598k
       (ps_mb_info->u2_mb_type != PSKIP) && (ps_mb_info->u2_mb_type != BSKIP) &&
689
598k
       (ps_mb_info->u2_mb_type != BASE_MODE))
690
533k
    {
691
533k
        isvce_enc_pu_mv_t *ps_mv;
692
533k
        isvce_enc_pu_mv_t *aps_mvps[2];
693
694
533k
        WORD32 ai4_mvd_costs[2];
695
533k
        WORD32 i, j;
696
697
1.60M
        for(i = 0; i < NUM_PRED_DIRS; i++)
698
1.06M
        {
699
1.06M
            PRED_MODE_T e_pred_mode = (PRED_MODE_T) i;
700
1.06M
            PRED_MODE_T e_cmpl_pred_mode = (e_pred_mode == L0) ? L1 : L0;
701
702
1.06M
            if(ps_mb_info->as_pu->u1_pred_mode != e_pred_mode)
703
533k
            {
704
533k
                ps_mv = &ps_mb_info->as_pu->as_me_info[e_cmpl_pred_mode];
705
533k
                aps_mvps[0] = &ps_spatial_mvp[e_cmpl_pred_mode];
706
533k
                aps_mvps[1] = &ps_ilp_mvp[e_cmpl_pred_mode];
707
708
1.60M
                for(j = 0; j < 2; j++)
709
1.06M
                {
710
1.06M
                    if((aps_mvps[j]->i1_ref_idx != -1) &&
711
686k
                       (!j || ((j == 1) && (ps_mv->i1_ref_idx == aps_mvps[j]->i1_ref_idx))))
712
686k
                    {
713
686k
                        ai4_mvd_costs[j] =
714
686k
                            pu1_mvd_costs[ps_mv->s_mv.i2_mvx - aps_mvps[j]->s_mv.i2_mvx] +
715
686k
                            pu1_mvd_costs[ps_mv->s_mv.i2_mvy - aps_mvps[j]->s_mv.i2_mvy];
716
686k
                    }
717
380k
                    else
718
380k
                    {
719
380k
                        ai4_mvd_costs[j] = INT32_MAX;
720
380k
                    }
721
1.06M
                }
722
723
533k
                ps_mb_info->as_pu->au1_mvp_idx[e_cmpl_pred_mode] =
724
533k
                    ai4_mvd_costs[0] > ai4_mvd_costs[1];
725
533k
            }
726
533k
            else
727
533k
            {
728
533k
                ps_mb_info->as_pu->au1_mvp_idx[e_cmpl_pred_mode] = 0;
729
533k
            }
730
1.06M
        }
731
533k
    }
732
9.68M
    else
733
9.68M
    {
734
9.68M
        ps_mb_info->as_pu->au1_mvp_idx[L0] = 0;
735
9.68M
        ps_mb_info->as_pu->au1_mvp_idx[L1] = 0;
736
9.68M
    }
737
10.2M
}