Coverage Report

Created: 2026-03-07 07:01

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.3k
{
70
14.3k
    UWORD32 u4_size = 0;
71
72
14.3k
    if(u1_num_spatial_layers > 1)
73
12.6k
    {
74
12.6k
        WORD32 i;
75
76
12.6k
        u4_size += MAX_PROCESS_CTXT * sizeof(svc_ilp_mv_ctxt_t);
77
12.6k
        u4_size += MAX_PROCESS_CTXT * sizeof(ilp_mv_state_t);
78
79
12.6k
        u4_size += u1_num_spatial_layers * sizeof(ilp_mv_layer_state_t);
80
81
32.7k
        for(i = u1_num_spatial_layers - 1; i >= 1; i--)
82
20.1k
        {
83
20.1k
            WORD32 i4_layer_luma_wd =
84
20.1k
                (WORD32) ((DOUBLE) u4_wd /
85
20.1k
                          pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) +
86
20.1k
                0.99;
87
20.1k
            WORD32 i4_layer_luma_ht =
88
20.1k
                ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - i)) + 0.99;
89
20.1k
            WORD32 i4_layer_luma_mbs = (i4_layer_luma_wd / MB_SIZE) * (i4_layer_luma_ht / MB_SIZE);
90
91
20.1k
            u4_size += i4_layer_luma_mbs * sizeof(ilp_mv_mb_state_t);
92
20.1k
        }
93
12.6k
    }
94
95
14.3k
    return u4_size;
96
14.3k
}
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.99M
{
105
6.99M
    UWORD32 i, j;
106
107
6.99M
    coordinates_t(*aps_pu_positions)[MAX_PU_IN_MB_ROW] = ps_mb_state->as_pu_positions;
108
6.99M
    coordinates_t(*aps_mb_positions)[MAX_PU_IN_MB_ROW] = ps_mb_state->as_mb_positions;
109
110
34.9M
    for(i = 0; i < MAX_PU_IN_MB_COL; i++)
111
27.9M
    {
112
27.9M
        UWORD32 u4_y_ref16;
113
114
27.9M
        UWORD32 u4_yc = ps_mb_pos->i4_ordinate * ps_layer_props->u4_mb_ht +
115
27.9M
                        (4 * i + 1) * (1 + u1_field_mb_flag - u1_field_pic_flag);
116
117
27.9M
        u4_y_ref16 =
118
27.9M
            (u4_yc * ps_layer_props->u4_scale_y + (1 << (ps_layer_props->u4_shift_y - 1))) >>
119
27.9M
            ps_layer_props->u4_shift_y;
120
27.9M
        u4_y_ref16 = MIN(u4_y_ref16, u4_ref_ht - 1);
121
122
139M
        for(j = 0; j < MAX_PU_IN_MB_ROW; j++)
123
111M
        {
124
111M
            UWORD32 u4_x_ref16;
125
126
111M
            UWORD32 u4_xc = ps_mb_pos->i4_abscissa * ps_layer_props->u4_mb_wd + 4 * j + 1;
127
128
111M
            u4_x_ref16 =
129
111M
                (u4_xc * ps_layer_props->u4_scale_x + (1 << (ps_layer_props->u4_shift_x - 1))) >>
130
111M
                ps_layer_props->u4_shift_x;
131
111M
            u4_x_ref16 = MIN(u4_x_ref16, u4_ref_wd - 1);
132
133
111M
            aps_pu_positions[i][j].i4_abscissa = u4_x_ref16;
134
111M
            aps_pu_positions[i][j].i4_ordinate = u4_y_ref16;
135
136
111M
            aps_mb_positions[i][j].i4_abscissa = (u4_x_ref16 / MB_SIZE);
137
111M
            aps_mb_positions[i][j].i4_ordinate = (u4_y_ref16 / MB_SIZE);
138
111M
        }
139
27.9M
    }
140
6.99M
}
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.71k
{
145
6.71k
    UWORD32 i, j;
146
147
6.71k
    const UWORD8 u1_ref_layer_field_pic_flag = 0;
148
6.71k
    const UWORD8 u1_field_pic_flag = 0;
149
6.71k
    const UWORD8 u1_field_mb_flag = 0;
150
151
6.71k
    ilp_mv_mb_state_t *ps_mb_states;
152
6.71k
    layer_resampler_props_t *ps_layer_props;
153
154
6.71k
    UWORD32 u4_wd_in_mbs;
155
6.71k
    UWORD32 u4_ht_in_mbs;
156
157
6.71k
    UWORD32 u4_ref_wd = (u4_wd / d_spatial_res_ratio);
158
6.71k
    UWORD32 u4_ref_ht = (u4_ht / d_spatial_res_ratio) * (1 + u1_ref_layer_field_pic_flag);
159
6.71k
    UWORD32 u4_scaled_wd = u4_wd;
160
6.71k
    UWORD32 u4_scaled_ht = u4_ht * (1 + u1_field_pic_flag);
161
162
6.71k
    ps_mb_states = ps_layer_state->ps_mb_states;
163
6.71k
    ps_layer_props = ps_layer_state->ps_props;
164
165
6.71k
    u4_wd_in_mbs = u4_scaled_wd / ps_layer_props->u4_mb_wd;
166
6.71k
    u4_ht_in_mbs = u4_scaled_ht / ps_layer_props->u4_mb_ht;
167
168
6.71k
    ps_layer_state->s_mv_scale.i4_abscissa = ((u4_scaled_wd << 16) + (u4_ref_wd >> 1)) / u4_ref_wd;
169
6.71k
    ps_layer_state->s_mv_scale.i4_ordinate = ((u4_scaled_ht << 16) + (u4_ref_ht >> 1)) / u4_ref_ht;
170
171
132k
    for(i = 0; i < u4_ht_in_mbs; i++)
172
125k
    {
173
7.12M
        for(j = 0; j < u4_wd_in_mbs; j++)
174
6.99M
        {
175
6.99M
            coordinates_t s_mb_pos = {j, i};
176
177
6.99M
            isvce_ref_layer_pu_and_mb_pos_init(ps_layer_props, &ps_mb_states[j + i * u4_wd_in_mbs],
178
6.99M
                                               &s_mb_pos, u4_ref_wd, u4_ref_ht, u1_field_pic_flag,
179
6.99M
                                               u1_field_mb_flag);
180
6.99M
        }
181
125k
    }
182
6.71k
}
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.08k
{
200
5.08k
    WORD32 i, j;
201
202
5.08k
    const WORD32 i4_num_proc_ctxts = sizeof(ps_codec->as_process) / sizeof(ps_codec->as_process[0]);
203
5.08k
    UWORD8 u1_num_spatial_layers = ps_codec->s_cfg.s_svc_params.u1_num_spatial_layers;
204
205
5.08k
    if(u1_num_spatial_layers > 1)
206
4.20k
    {
207
4.20k
        ilp_mv_layer_state_t *ps_layer_states = NULL;
208
4.20k
        ilp_mv_mb_state_t *aps_luma_mb_states[MAX_NUM_SPATIAL_LAYERS];
209
210
4.20k
        DOUBLE d_spatial_res_ratio = ps_codec->s_cfg.s_svc_params.d_spatial_res_ratio;
211
4.20k
        UWORD32 u4_wd = ps_codec->s_cfg.u4_wd;
212
4.20k
        UWORD32 u4_ht = ps_codec->s_cfg.u4_ht;
213
4.20k
        UWORD8 *pu1_buf = ps_mem_rec->pv_base;
214
4.20k
        WORD64 i8_alloc_mem_size =
215
4.20k
            isvce_get_ilp_mv_ctxt_size(u1_num_spatial_layers, d_spatial_res_ratio, u4_wd, u4_ht);
216
217
37.8k
        for(i = 0; i < i4_num_proc_ctxts; i++)
218
33.6k
        {
219
33.6k
            ilp_mv_state_t *ps_ilp_mv_state;
220
33.6k
            svc_ilp_mv_ctxt_t *ps_ilp_mv_ctxt;
221
222
33.6k
            isvce_process_ctxt_t *ps_proc = ps_codec->as_process + i;
223
224
33.6k
            ps_ilp_mv_ctxt = ps_proc->ps_svc_ilp_mv_ctxt = (svc_ilp_mv_ctxt_t *) pu1_buf;
225
33.6k
            pu1_buf += sizeof(svc_ilp_mv_ctxt_t);
226
33.6k
            i8_alloc_mem_size -= sizeof(svc_ilp_mv_ctxt_t);
227
228
33.6k
            ps_ilp_mv_ctxt->s_ilp_mv_constants.pv_state = pu1_buf;
229
33.6k
            ps_ilp_mv_state = (ilp_mv_state_t *) pu1_buf;
230
33.6k
            pu1_buf += sizeof(ilp_mv_state_t);
231
33.6k
            i8_alloc_mem_size -= sizeof(ilp_mv_state_t);
232
233
33.6k
            if(0 == i)
234
4.20k
            {
235
4.20k
                ps_ilp_mv_state->ps_layer_state = (ilp_mv_layer_state_t *) pu1_buf;
236
4.20k
                ps_layer_states = ps_ilp_mv_state->ps_layer_state;
237
4.20k
                pu1_buf += u1_num_spatial_layers * sizeof(ps_ilp_mv_state->ps_layer_state[0]);
238
4.20k
                i8_alloc_mem_size -=
239
4.20k
                    u1_num_spatial_layers * sizeof(ps_ilp_mv_state->ps_layer_state[0]);
240
4.20k
            }
241
29.4k
            else
242
29.4k
            {
243
29.4k
                ps_ilp_mv_state->ps_layer_state = ps_layer_states;
244
29.4k
            }
245
246
33.6k
            ASSERT(i8_alloc_mem_size >= 0);
247
248
33.6k
            if(0 == i)
249
4.20k
            {
250
10.9k
                for(j = u1_num_spatial_layers - 1; j >= 1; j--)
251
6.71k
                {
252
6.71k
                    ilp_mv_layer_state_t *ps_layer = &ps_ilp_mv_state->ps_layer_state[j];
253
254
6.71k
                    WORD32 i4_layer_luma_wd =
255
6.71k
                        ((DOUBLE) u4_wd / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - j)) +
256
6.71k
                        0.99;
257
6.71k
                    WORD32 i4_layer_luma_ht =
258
6.71k
                        ((DOUBLE) u4_ht / pow(d_spatial_res_ratio, u1_num_spatial_layers - 1 - j)) +
259
6.71k
                        0.99;
260
6.71k
                    WORD32 i4_layer_luma_mbs =
261
6.71k
                        (i4_layer_luma_wd / MB_SIZE) * (i4_layer_luma_ht / MB_SIZE);
262
263
6.71k
                    ps_layer->ps_mb_states = (ilp_mv_mb_state_t *) pu1_buf;
264
6.71k
                    aps_luma_mb_states[j] = ps_layer->ps_mb_states;
265
6.71k
                    pu1_buf += i4_layer_luma_mbs * sizeof(ps_layer->ps_mb_states[0]);
266
6.71k
                    i8_alloc_mem_size -= u1_num_spatial_layers * sizeof(ps_layer->ps_mb_states[0]);
267
268
6.71k
                    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.71k
                    ASSERT(ps_codec->s_svc_ilp_data.aps_layer_resampler_props[Y][j].u4_mb_wd ==
273
6.71k
                           MB_SIZE);
274
275
6.71k
                    ps_layer->ps_props = &ps_codec->s_svc_ilp_data.aps_layer_resampler_props[Y][j];
276
277
6.71k
                    isvce_ilp_mv_layer_state_init(ps_layer, d_spatial_res_ratio, i4_layer_luma_wd,
278
6.71k
                                                  i4_layer_luma_ht);
279
6.71k
                }
280
4.20k
            }
281
29.4k
            else
282
29.4k
            {
283
76.4k
                for(j = u1_num_spatial_layers - 1; j >= 1; j--)
284
47.0k
                {
285
47.0k
                    ilp_mv_layer_state_t *ps_layer = &ps_ilp_mv_state->ps_layer_state[j];
286
287
47.0k
                    ps_layer->ps_mb_states = aps_luma_mb_states[j];
288
289
47.0k
                    ps_layer->ps_props = &ps_codec->s_svc_ilp_data.aps_layer_resampler_props[Y][j];
290
47.0k
                }
291
29.4k
            }
292
33.6k
        }
293
4.20k
    }
294
882
    else
295
882
    {
296
7.93k
        for(i = 0; i < i4_num_proc_ctxts; i++)
297
7.05k
        {
298
7.05k
            ps_codec->as_process[i].ps_svc_ilp_mv_ctxt = NULL;
299
7.05k
        }
300
882
    }
301
5.08k
}
302
303
static void isvce_get_ilp_mvs_for_me(svc_ilp_mv_ctxt_t *ps_ilp_mv_ctxt)
304
969k
{
305
969k
    svc_layer_data_t *ps_ref_layer_data;
306
969k
    ilp_mv_layer_state_t *ps_layer_state;
307
969k
    ilp_mv_mb_state_t *ps_mb_state;
308
969k
    isvce_mb_info_t *ps_ref_mb_info;
309
969k
    coordinates_t s_frame_dims;
310
969k
    coordinates_t s_frame_dims_in_mbs;
311
969k
    coordinates_t s_ref_frame_dims;
312
969k
    coordinates_t s_ref_frame_dims_in_mbs;
313
314
969k
    bool b_is_mv_non_identical;
315
969k
    WORD32 i, j, k;
316
317
969k
    ilp_mv_constants_t *ps_ilp_mv_constants = &ps_ilp_mv_ctxt->s_ilp_mv_constants;
318
969k
    ilp_mv_variables_t *ps_ilp_mv_variables = &ps_ilp_mv_ctxt->s_ilp_mv_variables;
319
969k
    ilp_mv_outputs_t *ps_ilp_mv_outputs = &ps_ilp_mv_ctxt->s_ilp_mv_outputs;
320
969k
    ilp_mv_state_t *ps_ilp_mv_state = (ilp_mv_state_t *) ps_ilp_mv_constants->pv_state;
321
969k
    svc_ilp_data_t *ps_svc_ilp_data = ps_ilp_mv_variables->ps_svc_ilp_data;
322
969k
    svc_au_data_t *ps_svc_au_data = ps_svc_ilp_data->ps_svc_au_data;
323
969k
    coordinates_t *ps_mb_pos = &ps_ilp_mv_variables->s_mb_pos;
324
969k
    const isvce_enc_pu_mv_t s_default_mv = {{0, 0}, -1};
325
326
969k
    UWORD8 u1_spatial_layer_id = ps_ilp_mv_variables->u1_spatial_layer_id;
327
969k
    WORD32 i4_num_ilp_mvs = 0;
328
329
969k
    s_frame_dims.i4_abscissa = ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id].u4_width;
330
969k
    s_frame_dims.i4_ordinate = ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id].u4_height;
331
969k
    s_frame_dims_in_mbs.i4_abscissa = s_frame_dims.i4_abscissa / MB_SIZE;
332
969k
    s_frame_dims_in_mbs.i4_ordinate = s_frame_dims.i4_ordinate / MB_SIZE;
333
969k
    s_ref_frame_dims.i4_abscissa =
334
969k
        ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id - 1].u4_width;
335
969k
    s_ref_frame_dims.i4_ordinate =
336
969k
        ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id - 1].u4_height;
337
969k
    s_ref_frame_dims_in_mbs.i4_abscissa = s_ref_frame_dims.i4_abscissa / MB_SIZE;
338
969k
    s_ref_frame_dims_in_mbs.i4_ordinate = s_ref_frame_dims.i4_ordinate / MB_SIZE;
339
340
969k
    ps_ref_layer_data = &ps_svc_au_data->ps_svc_layer_data[u1_spatial_layer_id - 1];
341
969k
    ps_layer_state = &ps_ilp_mv_state->ps_layer_state[u1_spatial_layer_id];
342
969k
    ps_mb_state =
343
969k
        &ps_layer_state->ps_mb_states[ps_mb_pos->i4_abscissa +
344
969k
                                      ps_mb_pos->i4_ordinate * s_frame_dims_in_mbs.i4_abscissa];
345
346
4.83M
    for(i = 0; i < MAX_PU_IN_MB_COL; i++)
347
3.86M
    {
348
19.2M
        for(j = 0; j < MAX_PU_IN_MB_ROW; j++)
349
15.3M
        {
350
15.3M
            b_is_mv_non_identical = true;
351
352
15.3M
            ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0] = s_default_mv;
353
15.3M
            ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1] = s_default_mv;
354
355
15.3M
            ps_ref_mb_info =
356
15.3M
                &ps_ref_layer_data->ps_mb_info[ps_mb_state->as_mb_positions[i][j].i4_abscissa +
357
15.3M
                                               ps_mb_state->as_mb_positions[i][j].i4_ordinate *
358
15.3M
                                                   s_ref_frame_dims_in_mbs.i4_abscissa];
359
360
15.3M
            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
514k
                {
404
514k
                    i4_num_ilp_mvs++;
405
514k
                }
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
193k
                    {
425
193k
                        i4_num_ilp_mvs++;
426
193k
                    }
427
7.31M
                }
428
7.82M
            }
429
7.52M
            else
430
7.52M
            {
431
7.52M
                ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs] = INVALID_MB_TYPE;
432
7.52M
            }
433
15.3M
        }
434
3.86M
    }
435
436
969k
    ps_ilp_mv_outputs->s_ilp_me_cands.u4_num_ilp_mvs = i4_num_ilp_mvs;
437
438
4.83M
    for(i = 0; i < MAX_ILP_MV_IN_NBR_RGN; i++)
439
3.86M
    {
440
3.86M
        b_is_mv_non_identical = true;
441
442
3.86M
        ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L0] = s_default_mv;
443
3.86M
        ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs][L1] = s_default_mv;
444
445
3.86M
        if(ps_mb_pos->i4_abscissa + gai1_nbr_ilp_mv_map[i][0] >= 0 &&
446
3.78M
           ps_mb_pos->i4_abscissa + gai1_nbr_ilp_mv_map[i][0] < s_frame_dims_in_mbs.i4_abscissa &&
447
3.69M
           ps_mb_pos->i4_ordinate + gai1_nbr_ilp_mv_map[i][1] >= 0 &&
448
3.40M
           ps_mb_pos->i4_ordinate + gai1_nbr_ilp_mv_map[i][1] < s_frame_dims_in_mbs.i4_ordinate)
449
3.11M
        {
450
3.11M
            ps_mb_state =
451
3.11M
                &ps_layer_state->ps_mb_states[(ps_mb_pos->i4_abscissa + gai1_nbr_ilp_mv_map[i][0]) +
452
3.11M
                                              (ps_mb_pos->i4_ordinate + gai1_nbr_ilp_mv_map[i][1]) *
453
3.11M
                                                  s_frame_dims_in_mbs.i4_abscissa];
454
455
3.11M
            ps_ref_mb_info =
456
3.11M
                &ps_ref_layer_data->ps_mb_info[(ps_mb_state
457
3.11M
                                                    ->as_mb_positions[gai1_nbr_ilp_mv_map[i][2]]
458
3.11M
                                                                     [gai1_nbr_ilp_mv_map[i][3]]
459
3.11M
                                                    .i4_abscissa) +
460
3.11M
                                               ps_mb_state
461
3.11M
                                                       ->as_mb_positions[gai1_nbr_ilp_mv_map[i][2]]
462
3.11M
                                                                        [gai1_nbr_ilp_mv_map[i][3]]
463
3.11M
                                                       .i4_ordinate *
464
3.11M
                                                   s_ref_frame_dims_in_mbs.i4_abscissa];
465
466
3.11M
            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.4k
                {
510
47.4k
                    i4_num_ilp_mvs++;
511
47.4k
                }
512
1.56M
                else
513
1.56M
                {
514
4.35M
                    for(k = i4_num_ilp_mvs - 1; k >= 0; k--)
515
2.78M
                    {
516
2.78M
                        if((ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[k] ==
517
2.78M
                            ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs]) &&
518
2.78M
                           (ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[k] ==
519
2.78M
                            ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[i4_num_ilp_mvs]) &&
520
2.78M
                           isvce_check_identical_mv(
521
2.78M
                               ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[k],
522
2.78M
                               ps_ilp_mv_outputs->s_ilp_me_cands.as_mv[i4_num_ilp_mvs],
523
2.78M
                               ps_ilp_mv_outputs->s_ilp_me_cands.ae_pred_mode[k]))
524
1.19M
                            b_is_mv_non_identical = false;
525
2.78M
                    }
526
527
1.56M
                    if(b_is_mv_non_identical)
528
376k
                    {
529
376k
                        i4_num_ilp_mvs++;
530
376k
                    }
531
1.56M
                }
532
1.61M
            }
533
1.49M
            else
534
1.49M
            {
535
1.49M
                ps_ilp_mv_outputs->s_ilp_me_cands.e_mb_type[i4_num_ilp_mvs] = INVALID_MB_TYPE;
536
1.49M
            }
537
3.11M
        }
538
3.86M
    }
539
540
969k
    ps_ilp_mv_outputs->s_ilp_me_cands.u4_num_ilp_mvs_incl_nbrs = i4_num_ilp_mvs;
541
969k
}
542
543
void isvce_get_mb_ilp_mv(svc_ilp_mv_ctxt_t *ps_ilp_mv_ctxt)
544
968k
{
545
968k
    svc_layer_data_t *ps_ref_layer_data;
546
968k
    ilp_mv_layer_state_t *ps_layer_state;
547
968k
    ilp_mv_mb_state_t *ps_mb_state;
548
968k
    isvce_mb_info_t *ps_ref_mb_info;
549
968k
    coordinates_t s_frame_dims;
550
968k
    coordinates_t s_frame_dims_in_mbs;
551
968k
    coordinates_t s_ref_frame_dims;
552
968k
    coordinates_t s_ref_frame_dims_in_mbs;
553
554
968k
    WORD32 i, j;
555
556
968k
    ilp_mv_constants_t *ps_ilp_mv_constants = &ps_ilp_mv_ctxt->s_ilp_mv_constants;
557
968k
    ilp_mv_variables_t *ps_ilp_mv_variables = &ps_ilp_mv_ctxt->s_ilp_mv_variables;
558
968k
    ilp_mv_outputs_t *ps_ilp_mv_outputs = &ps_ilp_mv_ctxt->s_ilp_mv_outputs;
559
968k
    ilp_mv_state_t *ps_ilp_mv_state = (ilp_mv_state_t *) ps_ilp_mv_constants->pv_state;
560
968k
    svc_ilp_data_t *ps_svc_ilp_data = ps_ilp_mv_variables->ps_svc_ilp_data;
561
968k
    svc_au_data_t *ps_svc_au_data = ps_svc_ilp_data->ps_svc_au_data;
562
968k
    coordinates_t *ps_mb_pos = &ps_ilp_mv_variables->s_mb_pos;
563
968k
    const isvce_enc_pu_mv_t s_default_mv = {{0, 0}, -1};
564
565
968k
    UWORD8 u1_spatial_layer_id = ps_ilp_mv_variables->u1_spatial_layer_id;
566
567
968k
    s_frame_dims.i4_abscissa = ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id].u4_width;
568
968k
    s_frame_dims.i4_ordinate = ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id].u4_height;
569
968k
    s_frame_dims_in_mbs.i4_abscissa = s_frame_dims.i4_abscissa / MB_SIZE;
570
968k
    s_frame_dims_in_mbs.i4_ordinate = s_frame_dims.i4_ordinate / MB_SIZE;
571
968k
    s_ref_frame_dims.i4_abscissa =
572
968k
        ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id - 1].u4_width;
573
968k
    s_ref_frame_dims.i4_ordinate =
574
968k
        ps_svc_ilp_data->ps_residual_bufs[u1_spatial_layer_id - 1].u4_height;
575
968k
    s_ref_frame_dims_in_mbs.i4_abscissa = s_ref_frame_dims.i4_abscissa / MB_SIZE;
576
968k
    s_ref_frame_dims_in_mbs.i4_ordinate = s_ref_frame_dims.i4_ordinate / MB_SIZE;
577
578
968k
    ps_ref_layer_data = &ps_svc_au_data->ps_svc_layer_data[u1_spatial_layer_id - 1];
579
968k
    ps_layer_state = &ps_ilp_mv_state->ps_layer_state[u1_spatial_layer_id];
580
968k
    ps_mb_state =
581
968k
        &ps_layer_state->ps_mb_states[ps_mb_pos->i4_abscissa +
582
968k
                                      ps_mb_pos->i4_ordinate * s_frame_dims_in_mbs.i4_abscissa];
583
584
968k
    ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0] = s_default_mv;
585
968k
    ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L1] = s_default_mv;
586
587
968k
    ps_ref_mb_info = &ps_ref_layer_data->ps_mb_info[ps_mb_state->as_mb_positions[0][0].i4_abscissa +
588
968k
                                                    ps_mb_state->as_mb_positions[0][0].i4_ordinate *
589
968k
                                                        s_ref_frame_dims_in_mbs.i4_abscissa];
590
591
968k
    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
471k
    else
608
471k
    {
609
471k
        ps_ilp_mv_outputs->s_ilp_mv.e_mb_type = INVALID_MB_TYPE;
610
471k
    }
611
612
    /* Function call to get non 16x16 ilp mvs for me candidates */
613
968k
    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.44M
    for(i = 0; i < MAX_PU_IN_MB_COL; i++)
618
2.11M
    {
619
8.14M
        for(j = 0; j < MAX_PU_IN_MB_ROW; j++)
620
6.66M
        {
621
6.66M
            bool b_unsupported_mv;
622
623
6.66M
            ps_ref_mb_info =
624
6.66M
                &ps_ref_layer_data->ps_mb_info[ps_mb_state->as_mb_positions[i][j].i4_abscissa +
625
6.66M
                                               ps_mb_state->as_mb_positions[i][j].i4_ordinate *
626
6.66M
                                                   s_ref_frame_dims_in_mbs.i4_abscissa];
627
628
6.66M
            b_unsupported_mv =
629
6.66M
                (ps_ref_mb_info->u2_mb_type != ps_ilp_mv_outputs->s_ilp_mv.e_mb_type) ||
630
6.18M
                (ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0] !=
631
6.18M
                 ps_ref_mb_info->as_pu->u1_pred_mode) ||
632
6.18M
                !isvce_check_identical_mv(ps_ilp_mv_outputs->s_ilp_mv.as_mv[0],
633
6.18M
                                          ps_ref_mb_info->as_pu->as_me_info,
634
6.18M
                                          ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0]);
635
636
6.66M
            if(b_unsupported_mv)
637
643k
            {
638
643k
                ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0] = s_default_mv;
639
643k
                ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L1] = s_default_mv;
640
643k
                ps_ilp_mv_outputs->s_ilp_mv.e_mb_type = INVALID_MB_TYPE;
641
642
643k
                return;
643
643k
            }
644
6.66M
        }
645
2.11M
    }
646
647
324k
    if(ps_ilp_mv_outputs->s_ilp_mv.e_mb_type != INVALID_MB_TYPE)
648
327k
    {
649
327k
        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
327k
        if(ps_ilp_mv_outputs->s_ilp_mv.ae_pred_mode[0] != L1)
664
327k
        {
665
327k
            ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0].s_mv.i2_mvx =
666
327k
                (ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0].s_mv.i2_mvx *
667
327k
                     ps_layer_state->s_mv_scale.i4_abscissa +
668
327k
                 32768) >>
669
327k
                16;
670
327k
            ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0].s_mv.i2_mvy =
671
327k
                (ps_ilp_mv_outputs->s_ilp_mv.as_mv[0][L0].s_mv.i2_mvy *
672
327k
                     ps_layer_state->s_mv_scale.i4_ordinate +
673
327k
                 32768) >>
674
327k
                16;
675
327k
        }
676
327k
    }
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
324k
}
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.3M
{
687
10.3M
    if(USE_ILP_MV_AS_MVP && ps_ilp_mvp && !ps_mb_info->u1_is_intra &&
688
611k
       (ps_mb_info->u2_mb_type != PSKIP) && (ps_mb_info->u2_mb_type != BSKIP) &&
689
611k
       (ps_mb_info->u2_mb_type != BASE_MODE))
690
539k
    {
691
539k
        isvce_enc_pu_mv_t *ps_mv;
692
539k
        isvce_enc_pu_mv_t *aps_mvps[2];
693
694
539k
        WORD32 ai4_mvd_costs[2];
695
539k
        WORD32 i, j;
696
697
1.61M
        for(i = 0; i < NUM_PRED_DIRS; i++)
698
1.07M
        {
699
1.07M
            PRED_MODE_T e_pred_mode = (PRED_MODE_T) i;
700
1.07M
            PRED_MODE_T e_cmpl_pred_mode = (e_pred_mode == L0) ? L1 : L0;
701
702
1.07M
            if(ps_mb_info->as_pu->u1_pred_mode != e_pred_mode)
703
539k
            {
704
539k
                ps_mv = &ps_mb_info->as_pu->as_me_info[e_cmpl_pred_mode];
705
539k
                aps_mvps[0] = &ps_spatial_mvp[e_cmpl_pred_mode];
706
539k
                aps_mvps[1] = &ps_ilp_mvp[e_cmpl_pred_mode];
707
708
1.61M
                for(j = 0; j < 2; j++)
709
1.07M
                {
710
1.07M
                    if((aps_mvps[j]->i1_ref_idx != -1) &&
711
680k
                       (!j || ((j == 1) && (ps_mv->i1_ref_idx == aps_mvps[j]->i1_ref_idx))))
712
680k
                    {
713
680k
                        ai4_mvd_costs[j] =
714
680k
                            pu1_mvd_costs[ps_mv->s_mv.i2_mvx - aps_mvps[j]->s_mv.i2_mvx] +
715
680k
                            pu1_mvd_costs[ps_mv->s_mv.i2_mvy - aps_mvps[j]->s_mv.i2_mvy];
716
680k
                    }
717
399k
                    else
718
399k
                    {
719
399k
                        ai4_mvd_costs[j] = INT32_MAX;
720
399k
                    }
721
1.07M
                }
722
723
539k
                ps_mb_info->as_pu->au1_mvp_idx[e_cmpl_pred_mode] =
724
539k
                    ai4_mvd_costs[0] > ai4_mvd_costs[1];
725
539k
            }
726
539k
            else
727
539k
            {
728
539k
                ps_mb_info->as_pu->au1_mvp_idx[e_cmpl_pred_mode] = 0;
729
539k
            }
730
1.07M
        }
731
539k
    }
732
9.76M
    else
733
9.76M
    {
734
9.76M
        ps_mb_info->as_pu->au1_mvp_idx[L0] = 0;
735
9.76M
        ps_mb_info->as_pu->au1_mvp_idx[L1] = 0;
736
9.76M
    }
737
10.3M
}