Coverage Report

Created: 2025-11-12 06:11

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