Coverage Report

Created: 2026-06-08 07:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/ih264d_mvpred.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2015 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
 * \file ih264d_mvpred.c
23
 *
24
 * \brief
25
 *    This file contains function specific to decoding Motion vector.
26
 *
27
 * Detailed_description
28
 *
29
 * \date
30
 *    10-12-2002
31
 *
32
 * \author  Arvind Raman
33
 **************************************************************************
34
 */
35
#include <string.h>
36
#include "ih264d_parse_cavlc.h"
37
#include "ih264d_error_handler.h"
38
#include "ih264d_structs.h"
39
#include "ih264d_defs.h"
40
#include "ih264_typedefs.h"
41
#include "ih264_macros.h"
42
#include "ih264_platform_macros.h"
43
#include "ih264d_mb_utils.h"
44
#include "ih264d_defs.h"
45
#include "ih264d_debug.h"
46
#include "ih264d_tables.h"
47
#include "ih264d_process_bslice.h"
48
#include "ih264d_mvpred.h"
49
#include "ih264d_inter_pred.h"
50
#include "ih264d_tables.h"
51
52
/*!
53
 **************************************************************************
54
 * \if ih264d_get_motion_vector_predictor name : Name \endif
55
 *
56
 * \brief
57
 *    The routine calculates the motion vector predictor for a given block,
58
 *    given the candidate MV predictors.
59
 *
60
 * \param ps_mv_pred: Candidate predictors for the current block
61
 * \param ps_currMv: Pointer to the left top edge of the current block in
62
 *     the MV bank
63
 *
64
 * \return
65
 *    _mvPred: The x & y components of the MV predictor.
66
 *
67
 * \note
68
 *    The code implements the logic as described in sec 8.4.1.2.1. Given
69
 *    the candidate predictors and the pointer to the top left edge of the
70
 *    block in the MV bank.
71
 *
72
 **************************************************************************
73
 */
74
75
void ih264d_get_motion_vector_predictor(mv_pred_t * ps_result,
76
                                        mv_pred_t **ps_mv_pred,
77
                                        UWORD8 u1_ref_idx,
78
                                        UWORD8 u1_B,
79
                                        const UWORD8 *pu1_mv_pred_condition)
80
4.37M
{
81
4.37M
    WORD8 c_temp;
82
4.37M
    UWORD8 uc_B2 = (u1_B << 1);
83
84
    /* If only one of the candidate blocks has a reference frame equal to
85
     the current block then use the same block as the final predictor */
86
4.37M
    c_temp =
87
4.37M
                    (ps_mv_pred[LEFT]->i1_ref_frame[u1_B] == u1_ref_idx)
88
4.37M
                                    | ((ps_mv_pred[TOP]->i1_ref_frame[u1_B]
89
4.37M
                                                    == u1_ref_idx) << 1)
90
4.37M
                                    | ((ps_mv_pred[TOP_R]->i1_ref_frame[u1_B]
91
4.37M
                                                    == u1_ref_idx) << 2);
92
4.37M
    c_temp = pu1_mv_pred_condition[c_temp];
93
94
4.37M
    if(c_temp != -1)
95
260k
    {
96
        /* Case when only when one of the cadidate block has the same
97
         reference frame as the current block */
98
260k
        ps_result->i2_mv[uc_B2 + 0] = ps_mv_pred[c_temp]->i2_mv[uc_B2 + 0];
99
260k
        ps_result->i2_mv[uc_B2 + 1] = ps_mv_pred[c_temp]->i2_mv[uc_B2 + 1];
100
260k
    }
101
4.11M
    else
102
4.11M
    {
103
4.11M
        WORD32 D0, D1;
104
4.11M
        D0 = MIN(ps_mv_pred[0]->i2_mv[uc_B2 + 0],
105
4.11M
                 ps_mv_pred[1]->i2_mv[uc_B2 + 0]);
106
4.11M
        D1 = MAX(ps_mv_pred[0]->i2_mv[uc_B2 + 0],
107
4.11M
                 ps_mv_pred[1]->i2_mv[uc_B2 + 0]);
108
4.11M
        D1 = MIN(D1, ps_mv_pred[2]->i2_mv[uc_B2 + 0]);
109
4.11M
        ps_result->i2_mv[uc_B2 + 0] = (WORD16)(MAX(D0, D1));
110
111
4.11M
        D0 = MIN(ps_mv_pred[0]->i2_mv[uc_B2 + 1],
112
4.11M
                 ps_mv_pred[1]->i2_mv[uc_B2 + 1]);
113
4.11M
        D1 = MAX(ps_mv_pred[0]->i2_mv[uc_B2 + 1],
114
4.11M
                 ps_mv_pred[1]->i2_mv[uc_B2 + 1]);
115
4.11M
        D1 = MIN(D1, ps_mv_pred[2]->i2_mv[uc_B2 + 1]);
116
4.11M
        ps_result->i2_mv[uc_B2 + 1] = (WORD16)(MAX(D0, D1));
117
118
4.11M
    }
119
4.37M
}
120
121
/*!
122
 **************************************************************************
123
 * \if ih264d_mbaff_mv_pred name : Name \endif
124
 *
125
 * \brief
126
 *    The routine calculates the motion vector predictor for a given block,
127
 *    given the candidate MV predictors.
128
 *
129
 * \param ps_mv_pred: Candidate predictors for the current block
130
 * \param ps_currMv: Pointer to the left top edge of the current block in
131
 *     the MV bank
132
 *
133
 * \return
134
 *    _mvPred: The x & y components of the MV predictor.
135
 *
136
 * \note
137
 *    The code implements the logic as described in sec 8.4.1.2.1. Given
138
 *    the candidate predictors and the pointer to the top left edge of the
139
 *    block in the MV bank.
140
 *
141
 **************************************************************************
142
 */
143
144
void ih264d_mbaff_mv_pred(mv_pred_t **ps_mv_pred,
145
                          UWORD32 u4_sub_mb_num,
146
                          mv_pred_t *ps_mv_nmb,
147
                          mv_pred_t *ps_mv_ntop,
148
                          dec_struct_t *ps_dec,
149
                          UWORD8 uc_mb_part_width,
150
                          dec_mb_info_t *ps_cur_mb_info,
151
                          UWORD8* pu0_scale)
152
1.55M
{
153
1.55M
    UWORD16 u2_a_in = 0, u2_b_in = 0, u2_c_in = 0, u2_d_in = 0;
154
1.55M
    mv_pred_t *ps_mvpred_l, *ps_mvpred_tmp;
155
1.55M
    UWORD32 u4_sub_mb_x = (u4_sub_mb_num & 3), uc_sub_mb_y = (u4_sub_mb_num >> 2);
156
1.55M
    UWORD8 u1_is_cur_mb_fld, u1_is_left_mb_fld, u1_is_top_mb_fld;
157
1.55M
    UWORD8 u1_is_cur_mb_top;
158
159
1.55M
    u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
160
1.55M
    u1_is_cur_mb_top = ps_cur_mb_info->u1_topmb;
161
162
1.55M
    u1_is_left_mb_fld = ps_cur_mb_info->ps_left_mb->u1_mb_fld;
163
1.55M
    u1_is_top_mb_fld = ps_cur_mb_info->ps_top_mb->u1_mb_fld;
164
165
    /* Checking in the subMB exists, calculating their motion vectors to be
166
     used as predictors and the reference frames of those subMBs */
167
1.55M
    ps_mv_pred[LEFT] = &ps_dec->s_default_mv_pred;
168
1.55M
    ps_mv_pred[TOP] = &(ps_dec->s_default_mv_pred);
169
1.55M
    ps_mv_pred[TOP_R] = &(ps_dec->s_default_mv_pred);
170
171
    /* Check if the left subMb is available */
172
1.55M
    if(u4_sub_mb_x)
173
23.2k
    {
174
23.2k
        u2_a_in = 1;
175
23.2k
        ps_mv_pred[LEFT] = (ps_mv_nmb - 1);
176
23.2k
    }
177
1.53M
    else
178
1.53M
    {
179
1.53M
        UWORD8 uc_temp;
180
1.53M
        u2_a_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK);
181
1.53M
        if(u2_a_in)
182
1.43M
        {
183
1.43M
            ps_mvpred_l = (ps_dec->u4_num_pmbair) ?
184
1.43M
                            ps_mv_nmb :
185
1.43M
                            (ps_dec->ps_mv_left + (uc_sub_mb_y << 2) + 48
186
8
                                            - (u1_is_cur_mb_top << 4));
187
1.43M
            uc_temp = 29;
188
1.43M
            if(u1_is_cur_mb_fld ^ u1_is_left_mb_fld)
189
18.8k
            {
190
18.8k
                if(u1_is_left_mb_fld)
191
8.37k
                {
192
8.37k
                    uc_temp +=
193
8.37k
                                    (((uc_sub_mb_y & 1) << 2)
194
8.37k
                                                    + ((uc_sub_mb_y & 2) << 1));
195
8.37k
                    uc_temp += ((u1_is_cur_mb_top) ? 0 : 8);
196
8.37k
                }
197
10.4k
                else
198
10.4k
                {
199
10.4k
                    uc_temp = uc_temp - (uc_sub_mb_y << 2);
200
10.4k
                    uc_temp += ((u1_is_cur_mb_top) ? 0 : 16);
201
10.4k
                }
202
18.8k
            }
203
1.43M
            ps_mv_pred[LEFT] = (ps_mvpred_l - uc_temp);
204
1.43M
            pu0_scale[LEFT] = u1_is_cur_mb_fld - u1_is_left_mb_fld;
205
1.43M
        }
206
1.53M
    }
207
208
    /* Check if the top subMB is available */
209
1.55M
    if((uc_sub_mb_y > 0) || ((u1_is_cur_mb_top | u1_is_cur_mb_fld) == 0))
210
777k
    {
211
777k
        u2_b_in = 1;
212
777k
        ps_mv_pred[TOP] = ps_mv_nmb - 4;
213
777k
    }
214
777k
    else
215
777k
    {
216
777k
        u2_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK);
217
777k
        if(u2_b_in)
218
714k
        {
219
            /* CHANGED CODE */
220
221
714k
            if(u1_is_top_mb_fld && u1_is_cur_mb_fld)
222
25.9k
                ps_mvpred_tmp = ps_mv_ntop;
223
688k
            else
224
688k
            {
225
688k
                ps_mvpred_tmp = ps_mv_ntop;
226
688k
                if(u1_is_cur_mb_top)
227
682k
                    ps_mvpred_tmp += 16;
228
688k
            }
229
230
714k
            ps_mv_pred[TOP] = ps_mvpred_tmp;
231
714k
            pu0_scale[TOP] = u1_is_cur_mb_fld - u1_is_top_mb_fld;
232
714k
        }
233
777k
    }
234
235
    /* Check if the top right subMb is available. The top right subMb is
236
     defined as the top right subMb at the top right corner of the MB
237
     partition. The top right subMb index starting from the top left
238
     corner of the MB partition is given by
239
     TopRightSubMbIndx = TopLeftSubMbIndx + (WidthOfMbPartition - 6) / 2
240
     */
241
1.55M
    u2_c_in = CHECKBIT(ps_cur_mb_info->u2_top_right_avail_mask,
242
1.55M
                        (u4_sub_mb_num + uc_mb_part_width - 1));
243
1.55M
    if(u2_c_in)
244
680k
    {
245
680k
        ps_mv_pred[TOP_R] = ps_mv_pred[TOP] + uc_mb_part_width;
246
680k
        pu0_scale[TOP_R] = pu0_scale[TOP];
247
680k
        if((uc_sub_mb_y == 0) && ((u4_sub_mb_x + uc_mb_part_width) > 3))
248
661k
        {
249
661k
            UWORD8 uc_isTopRtMbFld;
250
661k
            uc_isTopRtMbFld = ps_cur_mb_info->ps_top_right_mb->u1_mb_fld;
251
            /* CHANGED CODE */
252
661k
            ps_mvpred_tmp = ps_mv_ntop + uc_mb_part_width + 12;
253
661k
            ps_mvpred_tmp += (u1_is_cur_mb_top) ? 16 : 0;
254
661k
            ps_mvpred_tmp += (u1_is_cur_mb_fld && u1_is_cur_mb_top && uc_isTopRtMbFld) ?
255
651k
                            0 : 16;
256
661k
            ps_mv_pred[TOP_R] = ps_mvpred_tmp;
257
661k
            pu0_scale[TOP_R] = u1_is_cur_mb_fld - uc_isTopRtMbFld;
258
661k
        }
259
680k
    }
260
874k
    else
261
874k
    {
262
874k
        u2_d_in = CHECKBIT(ps_cur_mb_info->u2_top_left_avail_mask, u4_sub_mb_num);
263
264
        /* Check if the the top left subMB is available */
265
874k
        if(u2_d_in)
266
762k
        {
267
762k
            UWORD8 uc_isTopLtMbFld;
268
269
762k
            ps_mv_pred[TOP_R] = ps_mv_pred[TOP] - 1;
270
762k
            pu0_scale[TOP_R] = pu0_scale[TOP];
271
272
762k
            if(u4_sub_mb_x == 0)
273
749k
            {
274
749k
                if((uc_sub_mb_y > 0) || ((u1_is_cur_mb_top | u1_is_cur_mb_fld) == 0))
275
703k
                {
276
703k
                    uc_isTopLtMbFld = u1_is_left_mb_fld;
277
703k
                    ps_mvpred_tmp = ps_mv_pred[LEFT] - 4;
278
279
703k
                    if((u1_is_cur_mb_fld == 0) && uc_isTopLtMbFld)
280
4.43k
                    {
281
4.43k
                        ps_mvpred_tmp = ps_mv_pred[LEFT] + 16;
282
4.43k
                        ps_mvpred_tmp -= (uc_sub_mb_y & 1) ? 0 : 4;
283
4.43k
                    }
284
703k
                }
285
46.4k
                else
286
46.4k
                {
287
46.4k
                    UWORD32 u4_cond = ps_dec->u4_num_pmbair;
288
46.4k
                    uc_isTopLtMbFld = ps_cur_mb_info->u1_topleft_mb_fld;
289
290
                    /* CHANGED CODE */
291
46.4k
                    ps_mvpred_tmp = ps_mv_ntop - 29;
292
46.4k
                    ps_mvpred_tmp += (u1_is_cur_mb_top) ? 16 : 0;
293
46.4k
                    if(u1_is_cur_mb_fld && u1_is_cur_mb_top)
294
1.37k
                        ps_mvpred_tmp -= (uc_isTopLtMbFld) ? 16 : 0;
295
46.4k
                }
296
749k
                ps_mv_pred[TOP_R] = ps_mvpred_tmp;
297
749k
                pu0_scale[TOP_R] = u1_is_cur_mb_fld - uc_isTopLtMbFld;
298
749k
            }
299
762k
        }
300
112k
        else if(u2_b_in == 0)
301
62.4k
        {
302
            /* If all the subMBs B, C, D are all out of the frame then their MV
303
             and their reference picture is equal to that of A */
304
62.4k
            ps_mv_pred[TOP] = ps_mv_pred[LEFT];
305
62.4k
            ps_mv_pred[TOP_R] = ps_mv_pred[LEFT];
306
62.4k
            pu0_scale[TOP] = pu0_scale[LEFT];
307
62.4k
            pu0_scale[TOP_R] = pu0_scale[LEFT];
308
62.4k
        }
309
874k
    }
310
1.55M
}
311
312
/*!
313
 **************************************************************************
314
 * \if ih264d_non_mbaff_mv_pred name : Name \endif
315
 *
316
 * \brief
317
 *    The routine calculates the motion vector predictor for a given block,
318
 *    given the candidate MV predictors.
319
 *
320
 * \param ps_mv_pred: Candidate predictors for the current block
321
 * \param ps_currMv: Pointer to the left top edge of the current block in
322
 *     the MV bank
323
 *
324
 * \return
325
 *    _mvPred: The x & y components of the MV predictor.
326
 *
327
 * \note
328
 *    The code implements the logic as described in sec 8.4.1.2.1. Given
329
 *    the candidate predictors and the pointer to the top left edge of the
330
 *    block in the MV bank.
331
 *
332
 **************************************************************************
333
 */
334
#if(!MVPRED_NONMBAFF)
335
void ih264d_non_mbaff_mv_pred(mv_pred_t **ps_mv_pred,
336
                              UWORD32 u4_sub_mb_num,
337
                              mv_pred_t *ps_mv_nmb,
338
                              mv_pred_t *ps_mv_ntop,
339
                              dec_struct_t *ps_dec,
340
                              UWORD8 uc_mb_part_width,
341
                              dec_mb_info_t *ps_cur_mb_info)
342
27.6M
{
343
27.6M
    UWORD16 u2_b_in = 0, u2_c_in = 0, u2_d_in = 0;
344
27.6M
    UWORD32 u4_sub_mb_x = (u4_sub_mb_num & 3), uc_sub_mb_y = (u4_sub_mb_num >> 2);
345
346
    /* Checking in the subMB exists, calculating their motion vectors to be
347
     used as predictors and the reference frames of those subMBs */
348
349
27.6M
    ps_mv_pred[LEFT] = &ps_dec->s_default_mv_pred;
350
27.6M
    ps_mv_pred[TOP] = &(ps_dec->s_default_mv_pred);
351
27.6M
    ps_mv_pred[TOP_R] = &(ps_dec->s_default_mv_pred);
352
    /* Check if the left subMb is available */
353
354
27.6M
    if(u4_sub_mb_x)
355
450k
    {
356
450k
        ps_mv_pred[LEFT] = (ps_mv_nmb - 1);
357
450k
    }
358
27.2M
    else
359
27.2M
    {
360
27.2M
        if(ps_cur_mb_info->u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK)
361
24.7M
        {
362
24.7M
            ps_mv_pred[LEFT] = (ps_mv_nmb - 13);
363
24.7M
        }
364
27.2M
    }
365
366
    /* Check if the top subMB is available */
367
27.6M
    if(uc_sub_mb_y)
368
504k
    {
369
504k
        u2_b_in = 1;
370
504k
        ps_mv_ntop = ps_mv_nmb - 4;
371
504k
        ps_mv_pred[TOP] = ps_mv_ntop;
372
373
504k
    }
374
27.1M
    else
375
27.1M
    {
376
27.1M
        u2_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK);
377
27.1M
        if(u2_b_in)
378
25.6M
        {
379
25.6M
            ps_mv_pred[TOP] = ps_mv_ntop;
380
25.6M
        }
381
27.1M
    }
382
383
    /* Check if the top right subMb is available. The top right subMb is
384
     defined as the top right subMb at the top right corner of the MB
385
     partition. The top right subMb index starting from the top left
386
     corner of the MB partition is given by
387
     TopRightSubMbIndx = TopLeftSubMbIndx + (WidthOfMbPartition - 6) / 2
388
     */
389
27.6M
    u2_c_in = CHECKBIT(ps_cur_mb_info->u2_top_right_avail_mask,
390
27.6M
                        (u4_sub_mb_num + uc_mb_part_width - 1));
391
27.6M
    if(u2_c_in)
392
23.6M
    {
393
23.6M
        ps_mv_pred[TOP_R] = (ps_mv_ntop + uc_mb_part_width);
394
395
23.6M
        if(uc_sub_mb_y == 0)
396
23.4M
        {
397
            /* CHANGED CODE */
398
23.4M
            if((u4_sub_mb_x + uc_mb_part_width) > 3)
399
23.2M
                ps_mv_pred[TOP_R] += 12;
400
23.4M
        }
401
23.6M
    }
402
4.03M
    else
403
4.03M
    {
404
4.03M
        u2_d_in = CHECKBIT(ps_cur_mb_info->u2_top_left_avail_mask, u4_sub_mb_num);
405
        /* Check if the the top left subMB is available */
406
4.03M
        if(u2_d_in)
407
2.40M
        {
408
            /* CHANGED CODE */
409
2.40M
            ps_mv_pred[TOP_R] = (ps_mv_ntop - 1);
410
2.40M
            if(u4_sub_mb_x == 0)
411
2.23M
            {
412
2.23M
                if(uc_sub_mb_y)
413
148k
                {
414
148k
                    ps_mv_pred[TOP_R] = (ps_mv_nmb - 17);
415
148k
                }
416
2.08M
                else
417
2.08M
                {
418
                    /* CHANGED CODE */
419
2.08M
                    ps_mv_pred[TOP_R] -= 12;
420
2.08M
                }
421
2.23M
            }
422
2.40M
        }
423
1.62M
        else if(u2_b_in == 0)
424
1.49M
        {
425
            /* If all the subMBs B, C, D are all out of the frame then their MV
426
             and their reference picture is equal to that of A */
427
1.49M
            ps_mv_pred[TOP] = ps_mv_pred[LEFT];
428
1.49M
            ps_mv_pred[TOP_R] = ps_mv_pred[LEFT];
429
1.49M
        }
430
4.03M
    }
431
27.6M
}
432
#endif
433
434
/*****************************************************************************/
435
/*                                                                           */
436
/*  Function Name : ih264d_mvpred_nonmbaffB                                         */
437
/*                                                                           */
438
/*  Description   : This function calculates the motion vector predictor,    */
439
/*                  for B-Slices                                             */
440
/*  Inputs        : <What inputs does the function take?>                    */
441
/*  Globals       : None                                                     */
442
/*  Processing    : The neighbours A(Left),B(Top),C(TopRight) are calculated */
443
/*                  and based on the type of Mb the prediction is            */
444
/*                  appropriately done                                       */
445
/*  Outputs       : populates ps_mv_final_pred structure                       */
446
/*  Returns       : u1_direct_zero_pred_flag which is used only in              */
447
/*                    decodeSpatialdirect()                                  */
448
/*                                                                           */
449
/*  Issues        : <List any issues or problems with this function>         */
450
/*                                                                           */
451
/*  Revision History:                                                        */
452
/*                                                                           */
453
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
454
/*         03 05 2005   TA              First Draft                          */
455
/*                                                                           */
456
/*****************************************************************************/
457
#if(!MVPRED_NONMBAFF)
458
UWORD8 ih264d_mvpred_nonmbaffB(dec_struct_t *ps_dec,
459
                               dec_mb_info_t *ps_cur_mb_info,
460
                               mv_pred_t *ps_mv_nmb,
461
                               mv_pred_t *ps_mv_ntop,
462
                               mv_pred_t *ps_mv_final_pred,
463
                               UWORD32 u4_sub_mb_num,
464
                               UWORD8 uc_mb_part_width,
465
                               UWORD8 u1_lx_start,
466
                               UWORD8 u1_lxend,
467
                               UWORD8 u1_mb_mc_mode)
468
13.3M
{
469
13.3M
    UWORD8 u1_a_in, u1_b_in, uc_temp1, uc_temp2, uc_temp3;
470
13.3M
    mv_pred_t *ps_mv_pred[3];
471
13.3M
    UWORD8 uc_B2, uc_lx, u1_ref_idx;
472
13.3M
    UWORD8 u1_direct_zero_pred_flag = 0;
473
474
13.3M
    ih264d_non_mbaff_mv_pred(ps_mv_pred, u4_sub_mb_num, ps_mv_nmb, ps_mv_ntop,
475
13.3M
                             ps_dec, uc_mb_part_width, ps_cur_mb_info);
476
477
26.7M
    for(uc_lx = u1_lx_start; uc_lx < u1_lxend; uc_lx++)
478
13.4M
    {
479
13.4M
        u1_ref_idx = ps_mv_final_pred->i1_ref_frame[uc_lx];
480
13.4M
        uc_B2 = (uc_lx << 1);
481
13.4M
        switch(u1_mb_mc_mode)
482
13.4M
        {
483
202k
            case PRED_16x8:
484
                /* Directional prediction for a 16x8 MB partition */
485
202k
                if(u4_sub_mb_num == 0)
486
88.8k
                {
487
                    /* Calculating the MV pred for the top 16x8 block */
488
88.8k
                    if(ps_mv_pred[TOP]->i1_ref_frame[uc_lx] == u1_ref_idx)
489
50.7k
                    {
490
                        /* If the reference frame used by the top subMB is same as the
491
                         reference frame used by the current block then MV predictor to
492
                         be used for the current block is same as the MV of the top
493
                         subMB */
494
50.7k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
495
50.7k
                                        ps_mv_pred[TOP]->i2_mv[uc_B2 + 0];
496
50.7k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
497
50.7k
                                        ps_mv_pred[TOP]->i2_mv[uc_B2 + 1];
498
50.7k
                    }
499
38.0k
                    else
500
38.0k
                    {
501
                        /* The MV predictor is calculated according to the process
502
                         defined in 8.4.1.2.1 */
503
38.0k
                        ih264d_get_motion_vector_predictor(
504
38.0k
                                        ps_mv_final_pred,
505
38.0k
                                        ps_mv_pred,
506
38.0k
                                        u1_ref_idx,
507
38.0k
                                        uc_lx,
508
38.0k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
509
38.0k
                    }
510
88.8k
                }
511
113k
                else
512
113k
                {
513
113k
                    if(ps_mv_pred[LEFT]->i1_ref_frame[uc_lx] == u1_ref_idx)
514
64.2k
                    {
515
                        /* If the reference frame used by the left subMB is same as the
516
                         reference frame used by the current block then MV predictor to
517
                         be used for the current block is same as the MV of the left
518
                         subMB */
519
64.2k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
520
64.2k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 0];
521
64.2k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
522
64.2k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 1];
523
64.2k
                    }
524
48.9k
                    else
525
48.9k
                    {
526
                        /* The MV predictor is calculated according to the process
527
                         defined in 8.4.1.2.1 */
528
48.9k
                        ih264d_get_motion_vector_predictor(
529
48.9k
                                        ps_mv_final_pred,
530
48.9k
                                        ps_mv_pred,
531
48.9k
                                        u1_ref_idx,
532
48.9k
                                        uc_lx,
533
48.9k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
534
48.9k
                    }
535
113k
                }
536
202k
                break;
537
82.3k
            case PRED_8x16:
538
                /* Directional prediction for a 8x16 MB partition */
539
82.3k
                if(u4_sub_mb_num == 0)
540
39.9k
                {
541
39.9k
                    if(ps_mv_pred[LEFT]->i1_ref_frame[uc_lx] == u1_ref_idx)
542
16.4k
                    {
543
                        /* If the reference frame used by the left subMB is same as the
544
                         reference frame used by the current block then MV predictor to
545
                         be used for the current block is same as the MV of the left
546
                         subMB */
547
16.4k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
548
16.4k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 0];
549
16.4k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
550
16.4k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 1];
551
16.4k
                    }
552
23.5k
                    else
553
23.5k
                    {
554
                        /* The MV predictor is calculated according to the process
555
                         defined in 8.4.1.2.1 */
556
23.5k
                        ih264d_get_motion_vector_predictor(
557
23.5k
                                        ps_mv_final_pred,
558
23.5k
                                        ps_mv_pred,
559
23.5k
                                        u1_ref_idx,
560
23.5k
                                        uc_lx,
561
23.5k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
562
23.5k
                    }
563
39.9k
                }
564
42.3k
                else
565
42.3k
                {
566
42.3k
                    if(ps_mv_pred[TOP_R]->i1_ref_frame[uc_lx] == u1_ref_idx)
567
24.5k
                    {
568
                        /* If the reference frame used by the top right subMB is same as
569
                         the reference frame used by the current block then MV
570
                         predictor to be used for the current block is same as the MV
571
                         of the left subMB */
572
24.5k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
573
24.5k
                                        ps_mv_pred[TOP_R]->i2_mv[uc_B2 + 0];
574
24.5k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
575
24.5k
                                        ps_mv_pred[TOP_R]->i2_mv[uc_B2 + 1];
576
24.5k
                    }
577
17.8k
                    else
578
17.8k
                    {
579
                        /* The MV predictor is calculated according to the process
580
                         defined in 8.4.1.2.1 */
581
17.8k
                        ih264d_get_motion_vector_predictor(
582
17.8k
                                        ps_mv_final_pred,
583
17.8k
                                        ps_mv_pred,
584
17.8k
                                        u1_ref_idx,
585
17.8k
                                        uc_lx,
586
17.8k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
587
17.8k
                    }
588
42.3k
                }
589
82.3k
                break;
590
1.52M
            case B_DIRECT_SPATIAL:
591
                /* Case when the MB has been skipped */
592
                /* If either of left or the top subMB is not present
593
                 OR
594
                 If both the MV components of either the left or the top subMB are
595
                 zero and their reference frame pointer pointing to 0
596
                 then MV for the skipped MB is zero
597
                 else the Median of the mv_pred_t is used */
598
1.52M
                uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[0];
599
1.52M
                uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[0];
600
1.52M
                uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[0];
601
602
1.52M
                ps_mv_final_pred->i1_ref_frame[0] = MIN(uc_temp1,
603
1.52M
                                                      MIN(uc_temp2, uc_temp3));
604
605
1.52M
                uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[1];
606
1.52M
                uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[1];
607
1.52M
                uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[1];
608
609
1.52M
                ps_mv_final_pred->i1_ref_frame[1] = MIN(uc_temp1,
610
1.52M
                                                      MIN(uc_temp2, uc_temp3));
611
612
1.52M
                if((ps_mv_final_pred->i1_ref_frame[0] < 0)
613
99.3k
                                && (ps_mv_final_pred->i1_ref_frame[1] < 0))
614
25.6k
                {
615
25.6k
                    u1_direct_zero_pred_flag = 1;
616
25.6k
                    ps_mv_final_pred->i1_ref_frame[0] = 0;
617
25.6k
                    ps_mv_final_pred->i1_ref_frame[1] = 0;
618
25.6k
                }
619
1.52M
                ih264d_get_motion_vector_predictor(
620
1.52M
                                ps_mv_final_pred, ps_mv_pred,
621
1.52M
                                ps_mv_final_pred->i1_ref_frame[0], 0,
622
1.52M
                                (const UWORD8 *)gau1_ih264d_mv_pred_condition);
623
624
1.52M
                ih264d_get_motion_vector_predictor(
625
1.52M
                                ps_mv_final_pred, ps_mv_pred,
626
1.52M
                                ps_mv_final_pred->i1_ref_frame[1], 1,
627
1.52M
                                (const UWORD8 *)gau1_ih264d_mv_pred_condition);
628
629
1.52M
                break;
630
11.1M
            case MB_SKIP:
631
                /* Case when the MB has been skipped */
632
                /* If either of left or the top subMB is not present
633
                 OR
634
                 If both the MV components of either the left or the top subMB are
635
                 zero and their reference frame pointer pointing to 0
636
                 then MV for the skipped MB is zero
637
                 else the Median of the mv_pred_t is used */
638
11.1M
                u1_a_in = (ps_cur_mb_info->u1_mb_ngbr_availablity &
639
11.1M
                LEFT_MB_AVAILABLE_MASK);
640
11.1M
                u1_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity &
641
11.1M
                TOP_MB_AVAILABLE_MASK);
642
11.1M
                if(((u1_a_in * u1_b_in) == 0)
643
10.5M
                                || ((ps_mv_pred[LEFT]->i2_mv[0]
644
10.5M
                                                | ps_mv_pred[LEFT]->i2_mv[1]
645
10.5M
                                                | ps_mv_pred[LEFT]->i1_ref_frame[0])
646
10.5M
                                                == 0)
647
670
                                || ((ps_mv_pred[TOP]->i2_mv[0]
648
670
                                                | ps_mv_pred[TOP]->i2_mv[1]
649
670
                                                | ps_mv_pred[TOP]->i1_ref_frame[0])
650
670
                                                == 0))
651
11.1M
                {
652
11.1M
                    ps_mv_final_pred->i2_mv[0] = 0;
653
11.1M
                    ps_mv_final_pred->i2_mv[1] = 0;
654
11.1M
                    break;
655
11.1M
                }
656
                /* If the condition above is not true calculate the MV predictor
657
                 according to the process defined in sec 8.4.1.2.1 */
658
481k
            default:
659
481k
                ih264d_get_motion_vector_predictor(
660
481k
                                ps_mv_final_pred, ps_mv_pred, u1_ref_idx, uc_lx,
661
481k
                                (const UWORD8 *)gau1_ih264d_mv_pred_condition);
662
481k
                break;
663
13.4M
        }
664
13.4M
    }
665
13.3M
    return (u1_direct_zero_pred_flag);
666
13.3M
}
667
#endif
668
669
/*****************************************************************************/
670
/*                                                                           */
671
/*  Function Name : ih264d_mvpred_nonmbaff                                          */
672
/*                                                                           */
673
/*  Description   : This function calculates the motion vector predictor,    */
674
/*                  for all the slice types other than B_SLICE               */
675
/*  Inputs        : <What inputs does the function take?>                    */
676
/*  Globals       : None                                                     */
677
/*  Processing    : The neighbours A(Left),B(Top),C(TopRight) are calculated */
678
/*                  and based on the type of Mb the prediction is            */
679
/*                  appropriately done                                       */
680
/*  Outputs       : populates ps_mv_final_pred structure                       */
681
/*  Returns       : u1_direct_zero_pred_flag which is used only in              */
682
/*                    decodeSpatialdirect()                                  */
683
/*                                                                           */
684
/*  Issues        : <List any issues or problems with this function>         */
685
/*                                                                           */
686
/*  Revision History:                                                        */
687
/*                                                                           */
688
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
689
/*         03 05 2005   TA              First Draft                          */
690
/*                                                                           */
691
/*****************************************************************************/
692
#if(!MVPRED_NONMBAFF)
693
UWORD8 ih264d_mvpred_nonmbaff(dec_struct_t *ps_dec,
694
                              dec_mb_info_t *ps_cur_mb_info,
695
                              mv_pred_t *ps_mv_nmb,
696
                              mv_pred_t *ps_mv_ntop,
697
                              mv_pred_t *ps_mv_final_pred,
698
                              UWORD32 u4_sub_mb_num,
699
                              UWORD8 uc_mb_part_width,
700
                              UWORD8 u1_lx_start,
701
                              UWORD8 u1_lxend,
702
                              UWORD8 u1_mb_mc_mode)
703
14.3M
{
704
14.3M
    UWORD8 u1_a_in, u1_b_in, uc_temp1, uc_temp2, uc_temp3;
705
14.3M
    mv_pred_t *ps_mv_pred[3];
706
14.3M
    UWORD8 u1_ref_idx;
707
14.3M
    UWORD8 u1_direct_zero_pred_flag = 0;
708
14.3M
    UNUSED(u1_lx_start);
709
14.3M
    UNUSED(u1_lxend);
710
14.3M
    ih264d_non_mbaff_mv_pred(ps_mv_pred, u4_sub_mb_num, ps_mv_nmb, ps_mv_ntop,
711
14.3M
                             ps_dec, uc_mb_part_width, ps_cur_mb_info);
712
713
14.3M
    u1_ref_idx = ps_mv_final_pred->i1_ref_frame[0];
714
715
14.3M
    switch(u1_mb_mc_mode)
716
14.3M
    {
717
137k
        case PRED_16x8:
718
            /* Directional prediction for a 16x8 MB partition */
719
137k
            if(u4_sub_mb_num == 0)
720
68.5k
            {
721
                /* Calculating the MV pred for the top 16x8 block */
722
68.5k
                if(ps_mv_pred[TOP]->i1_ref_frame[0] == u1_ref_idx)
723
26.8k
                {
724
                    /* If the reference frame used by the top subMB is same as the
725
                     reference frame used by the current block then MV predictor to
726
                     be used for the current block is same as the MV of the top
727
                     subMB */
728
729
26.8k
                    ps_mv_final_pred->i2_mv[0] = ps_mv_pred[TOP]->i2_mv[0];
730
26.8k
                    ps_mv_final_pred->i2_mv[1] = ps_mv_pred[TOP]->i2_mv[1];
731
26.8k
                }
732
41.7k
                else
733
41.7k
                {
734
                    /* The MV predictor is calculated according to the process
735
                     defined in 8.4.1.2.1 */
736
41.7k
                    ih264d_get_motion_vector_predictor(
737
41.7k
                                    ps_mv_final_pred,
738
41.7k
                                    ps_mv_pred,
739
41.7k
                                    u1_ref_idx,
740
41.7k
                                    0,
741
41.7k
                                    (const UWORD8 *)gau1_ih264d_mv_pred_condition);
742
41.7k
                }
743
68.5k
            }
744
68.5k
            else
745
68.5k
            {
746
68.5k
                if(ps_mv_pred[LEFT]->i1_ref_frame[0] == u1_ref_idx)
747
21.4k
                {
748
                    /* If the reference frame used by the left subMB is same as the
749
                     reference frame used by the current block then MV predictor to
750
                     be used for the current block is same as the MV of the left
751
                     subMB */
752
753
21.4k
                    ps_mv_final_pred->i2_mv[0] = ps_mv_pred[LEFT]->i2_mv[0];
754
21.4k
                    ps_mv_final_pred->i2_mv[1] = ps_mv_pred[LEFT]->i2_mv[1];
755
21.4k
                }
756
47.1k
                else
757
47.1k
                {
758
                    /* The MV predictor is calculated according to the process
759
                     defined in 8.4.1.2.1 */
760
47.1k
                    ih264d_get_motion_vector_predictor(
761
47.1k
                                    ps_mv_final_pred,
762
47.1k
                                    ps_mv_pred,
763
47.1k
                                    u1_ref_idx,
764
47.1k
                                    0,
765
47.1k
                                    (const UWORD8 *)gau1_ih264d_mv_pred_condition);
766
47.1k
                }
767
68.5k
            }
768
137k
            break;
769
95.9k
        case PRED_8x16:
770
            /* Directional prediction for a 8x16 MB partition */
771
95.9k
            if(u4_sub_mb_num == 0)
772
49.0k
            {
773
49.0k
                if(ps_mv_pred[LEFT]->i1_ref_frame[0] == u1_ref_idx)
774
17.9k
                {
775
                    /* If the reference frame used by the left subMB is same as the
776
                     reference frame used by the current block then MV predictor to
777
                     be used for the current block is same as the MV of the left
778
                     subMB */
779
780
17.9k
                    ps_mv_final_pred->i2_mv[0] = ps_mv_pred[LEFT]->i2_mv[0];
781
17.9k
                    ps_mv_final_pred->i2_mv[1] = ps_mv_pred[LEFT]->i2_mv[1];
782
17.9k
                }
783
31.1k
                else
784
31.1k
                {
785
                    /* The MV predictor is calculated according to the process
786
                     defined in 8.4.1.2.1 */
787
31.1k
                    ih264d_get_motion_vector_predictor(
788
31.1k
                                    ps_mv_final_pred,
789
31.1k
                                    ps_mv_pred,
790
31.1k
                                    u1_ref_idx,
791
31.1k
                                    0,
792
31.1k
                                    (const UWORD8 *)gau1_ih264d_mv_pred_condition);
793
31.1k
                }
794
49.0k
            }
795
46.8k
            else
796
46.8k
            {
797
46.8k
                if(ps_mv_pred[TOP_R]->i1_ref_frame[0] == u1_ref_idx)
798
28.9k
                {
799
                    /* If the reference frame used by the top right subMB is same as
800
                     the reference frame used by the current block then MV
801
                     predictor to be used for the current block is same as the MV
802
                     of the left subMB */
803
804
28.9k
                    ps_mv_final_pred->i2_mv[0] = ps_mv_pred[TOP_R]->i2_mv[0];
805
28.9k
                    ps_mv_final_pred->i2_mv[1] = ps_mv_pred[TOP_R]->i2_mv[1];
806
28.9k
                }
807
17.8k
                else
808
17.8k
                {
809
                    /* The MV predictor is calculated according to the process
810
                     defined in 8.4.1.2.1 */
811
17.8k
                    ih264d_get_motion_vector_predictor(
812
17.8k
                                    ps_mv_final_pred,
813
17.8k
                                    ps_mv_pred,
814
17.8k
                                    u1_ref_idx,
815
17.8k
                                    0,
816
17.8k
                                    (const UWORD8 *)gau1_ih264d_mv_pred_condition);
817
17.8k
                }
818
46.8k
            }
819
95.9k
            break;
820
0
        case B_DIRECT_SPATIAL:
821
            /* Case when the MB has been skipped */
822
            /* If either of left or the top subMB is not present
823
             OR
824
             If both the MV components of either the left or the top subMB are
825
             zero and their reference frame pointer pointing to 0
826
             then MV for the skipped MB is zero
827
             else the Median of the mv_pred_t is used */
828
0
            uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[0];
829
0
            uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[0];
830
0
            uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[0];
831
832
0
            ps_mv_final_pred->i1_ref_frame[0] = MIN(uc_temp1,
833
0
                                                  MIN(uc_temp2, uc_temp3));
834
835
0
            uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[1];
836
0
            uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[1];
837
0
            uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[1];
838
839
0
            ps_mv_final_pred->i1_ref_frame[1] = MIN(uc_temp1,
840
0
                                                  MIN(uc_temp2, uc_temp3));
841
842
0
            if((ps_mv_final_pred->i1_ref_frame[0] < 0)
843
0
                            && (ps_mv_final_pred->i1_ref_frame[1] < 0))
844
0
            {
845
0
                u1_direct_zero_pred_flag = 1;
846
0
                ps_mv_final_pred->i1_ref_frame[0] = 0;
847
0
                ps_mv_final_pred->i1_ref_frame[1] = 0;
848
0
            }
849
0
            ih264d_get_motion_vector_predictor(
850
0
                            ps_mv_final_pred, ps_mv_pred,
851
0
                            ps_mv_final_pred->i1_ref_frame[0], 0,
852
0
                            (const UWORD8 *)gau1_ih264d_mv_pred_condition);
853
854
0
            ih264d_get_motion_vector_predictor(
855
0
                            ps_mv_final_pred, ps_mv_pred,
856
0
                            ps_mv_final_pred->i1_ref_frame[1], 1,
857
0
                            (const UWORD8 *)gau1_ih264d_mv_pred_condition);
858
859
0
            break;
860
13.6M
        case MB_SKIP:
861
            /* Case when the MB has been skipped */
862
            /* If either of left or the top subMB is not present
863
             OR
864
             If both the MV components of either the left or the top subMB are
865
             zero and their reference frame pointer pointing to 0
866
             then MV for the skipped MB is zero
867
             else the Median of the mv_pred_t is used */
868
13.6M
            u1_a_in = (ps_cur_mb_info->u1_mb_ngbr_availablity &
869
13.6M
            LEFT_MB_AVAILABLE_MASK);
870
13.6M
            u1_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity &
871
13.6M
            TOP_MB_AVAILABLE_MASK);
872
13.6M
            if(((u1_a_in * u1_b_in) == 0)
873
11.0M
                            || ((ps_mv_pred[LEFT]->i2_mv[0]
874
11.0M
                                            | ps_mv_pred[LEFT]->i2_mv[1]
875
11.0M
                                            | ps_mv_pred[LEFT]->i1_ref_frame[0])
876
11.0M
                                            == 0)
877
50.8k
                            || ((ps_mv_pred[TOP]->i2_mv[0]
878
50.8k
                                            | ps_mv_pred[TOP]->i2_mv[1]
879
50.8k
                                            | ps_mv_pred[TOP]->i1_ref_frame[0])
880
50.8k
                                            == 0))
881
13.5M
            {
882
883
13.5M
                ps_mv_final_pred->i2_mv[0] = 0;
884
13.5M
                ps_mv_final_pred->i2_mv[1] = 0;
885
13.5M
                break;
886
13.5M
            }
887
            /* If the condition above is not true calculate the MV predictor
888
             according to the process defined in sec 8.4.1.2.1 */
889
489k
        default:
890
489k
            ih264d_get_motion_vector_predictor(
891
489k
                            ps_mv_final_pred, ps_mv_pred, u1_ref_idx, 0,
892
489k
                            (const UWORD8 *)gau1_ih264d_mv_pred_condition);
893
489k
            break;
894
14.3M
    }
895
896
14.3M
    return (u1_direct_zero_pred_flag);
897
14.3M
}
898
#endif
899
900
/*****************************************************************************/
901
/*                                                                           */
902
/*  Function Name : ih264d_mvpred_mbaff                                             */
903
/*                                                                           */
904
/*  Description   : This function calculates the motion vector predictor,    */
905
/*  Inputs        : <What inputs does the function take?>                    */
906
/*  Globals       : None                                                     */
907
/*  Processing    : The neighbours A(Left),B(Top),C(TopRight) are calculated */
908
/*                  and based on the type of Mb the prediction is            */
909
/*                  appropriately done                                       */
910
/*  Outputs       : populates ps_mv_final_pred structure                       */
911
/*  Returns       : u1_direct_zero_pred_flag which is used only in              */
912
/*                    decodeSpatialdirect()                                  */
913
/*                                                                           */
914
/*  Issues        : <List any issues or problems with this function>         */
915
/*                                                                           */
916
/*  Revision History:                                                        */
917
/*                                                                           */
918
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
919
/*         03 05 2005   TA              First Draft                          */
920
/*                                                                           */
921
/*****************************************************************************/
922
923
UWORD8 ih264d_mvpred_mbaff(dec_struct_t *ps_dec,
924
                           dec_mb_info_t *ps_cur_mb_info,
925
                           mv_pred_t *ps_mv_nmb,
926
                           mv_pred_t *ps_mv_ntop,
927
                           mv_pred_t *ps_mv_final_pred,
928
                           UWORD32 u4_sub_mb_num,
929
                           UWORD8 uc_mb_part_width,
930
                           UWORD8 u1_lx_start,
931
                           UWORD8 u1_lxend,
932
                           UWORD8 u1_mb_mc_mode)
933
1.55M
{
934
1.55M
    UWORD8 u1_a_in, u1_b_in, uc_temp1, uc_temp2, uc_temp3;
935
1.55M
    mv_pred_t *ps_mv_pred[3], s_mvPred[3];
936
1.55M
    UWORD8 uc_B2, pu0_scale[3], i, uc_lx, u1_ref_idx;
937
1.55M
    UWORD8 u1_direct_zero_pred_flag = 0;
938
939
1.55M
    pu0_scale[0] = pu0_scale[1] = pu0_scale[2] = 0;
940
1.55M
    ih264d_mbaff_mv_pred(ps_mv_pred, u4_sub_mb_num, ps_mv_nmb, ps_mv_ntop, ps_dec,
941
1.55M
                         uc_mb_part_width, ps_cur_mb_info, pu0_scale);
942
6.22M
    for(i = 0; i < 3; i++)
943
4.66M
    {
944
4.66M
        if(pu0_scale[i] != 0)
945
65.3k
        {
946
65.3k
            memcpy(&s_mvPred[i], ps_mv_pred[i], sizeof(mv_pred_t));
947
65.3k
            if(pu0_scale[i] == 1)
948
41.4k
            {
949
41.4k
                s_mvPred[i].i1_ref_frame[0] = s_mvPred[i].i1_ref_frame[0] << 1;
950
41.4k
                s_mvPred[i].i1_ref_frame[1] = s_mvPred[i].i1_ref_frame[1] << 1;
951
41.4k
                s_mvPred[i].i2_mv[1] = SIGN_POW2_DIV(s_mvPred[i].i2_mv[1], 1);
952
41.4k
                s_mvPred[i].i2_mv[3] = SIGN_POW2_DIV(s_mvPred[i].i2_mv[3], 1);
953
41.4k
            }
954
23.8k
            else
955
23.8k
            {
956
23.8k
                s_mvPred[i].i1_ref_frame[0] = s_mvPred[i].i1_ref_frame[0] >> 1;
957
23.8k
                s_mvPred[i].i1_ref_frame[1] = s_mvPred[i].i1_ref_frame[1] >> 1;
958
23.8k
                s_mvPred[i].i2_mv[1] = s_mvPred[i].i2_mv[1] << 1;
959
23.8k
                s_mvPred[i].i2_mv[3] = s_mvPred[i].i2_mv[3] << 1;
960
23.8k
            }
961
65.3k
            ps_mv_pred[i] = &s_mvPred[i];
962
65.3k
        }
963
4.66M
    }
964
965
3.11M
    for(uc_lx = u1_lx_start; uc_lx < u1_lxend; uc_lx++)
966
1.55M
    {
967
1.55M
        u1_ref_idx = ps_mv_final_pred->i1_ref_frame[uc_lx];
968
1.55M
        uc_B2 = (uc_lx << 1);
969
1.55M
        switch(u1_mb_mc_mode)
970
1.55M
        {
971
41.1k
            case PRED_16x8:
972
                /* Directional prediction for a 16x8 MB partition */
973
41.1k
                if(u4_sub_mb_num == 0)
974
20.5k
                {
975
                    /* Calculating the MV pred for the top 16x8 block */
976
20.5k
                    if(ps_mv_pred[TOP]->i1_ref_frame[uc_lx] == u1_ref_idx)
977
9.51k
                    {
978
                        /* If the reference frame used by the top subMB is same as the
979
                         reference frame used by the current block then MV predictor to
980
                         be used for the current block is same as the MV of the top
981
                         subMB */
982
9.51k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
983
9.51k
                                        ps_mv_pred[TOP]->i2_mv[uc_B2 + 0];
984
9.51k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
985
9.51k
                                        ps_mv_pred[TOP]->i2_mv[uc_B2 + 1];
986
9.51k
                    }
987
11.0k
                    else
988
11.0k
                    {
989
                        /* The MV predictor is calculated according to the process
990
                         defined in 8.4.1.2.1 */
991
11.0k
                        ih264d_get_motion_vector_predictor(
992
11.0k
                                        ps_mv_final_pred,
993
11.0k
                                        ps_mv_pred,
994
11.0k
                                        u1_ref_idx,
995
11.0k
                                        uc_lx,
996
11.0k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
997
11.0k
                    }
998
20.5k
                }
999
20.6k
                else
1000
20.6k
                {
1001
20.6k
                    if(ps_mv_pred[LEFT]->i1_ref_frame[uc_lx] == u1_ref_idx)
1002
8.34k
                    {
1003
                        /* If the reference frame used by the left subMB is same as the
1004
                         reference frame used by the current block then MV predictor to
1005
                         be used for the current block is same as the MV of the left
1006
                         subMB */
1007
8.34k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
1008
8.34k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 0];
1009
8.34k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
1010
8.34k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 1];
1011
8.34k
                    }
1012
12.2k
                    else
1013
12.2k
                    {
1014
                        /* The MV predictor is calculated according to the process
1015
                         defined in 8.4.1.2.1 */
1016
12.2k
                        ih264d_get_motion_vector_predictor(
1017
12.2k
                                        ps_mv_final_pred,
1018
12.2k
                                        ps_mv_pred,
1019
12.2k
                                        u1_ref_idx,
1020
12.2k
                                        uc_lx,
1021
12.2k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
1022
12.2k
                    }
1023
20.6k
                }
1024
41.1k
                break;
1025
11.0k
            case PRED_8x16:
1026
                /* Directional prediction for a 8x16 MB partition */
1027
11.0k
                if(u4_sub_mb_num == 0)
1028
5.54k
                {
1029
5.54k
                    if(ps_mv_pred[LEFT]->i1_ref_frame[uc_lx] == u1_ref_idx)
1030
2.17k
                    {
1031
                        /* If the reference frame used by the left subMB is same as the
1032
                         reference frame used by the current block then MV predictor to
1033
                         be used for the current block is same as the MV of the left
1034
                         subMB */
1035
2.17k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
1036
2.17k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 0];
1037
2.17k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
1038
2.17k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 1];
1039
2.17k
                    }
1040
3.37k
                    else
1041
3.37k
                    {
1042
                        /* The MV predictor is calculated according to the process
1043
                         defined in 8.4.1.2.1 */
1044
3.37k
                        ih264d_get_motion_vector_predictor(
1045
3.37k
                                        ps_mv_final_pred,
1046
3.37k
                                        ps_mv_pred,
1047
3.37k
                                        u1_ref_idx,
1048
3.37k
                                        uc_lx,
1049
3.37k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
1050
3.37k
                    }
1051
5.54k
                }
1052
5.54k
                else
1053
5.54k
                {
1054
5.54k
                    if(ps_mv_pred[TOP_R]->i1_ref_frame[uc_lx] == u1_ref_idx)
1055
2.67k
                    {
1056
                        /* If the reference frame used by the top right subMB is same as
1057
                         the reference frame used by the current block then MV
1058
                         predictor to be used for the current block is same as the MV
1059
                         of the left subMB */
1060
2.67k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
1061
2.67k
                                        ps_mv_pred[TOP_R]->i2_mv[uc_B2 + 0];
1062
2.67k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
1063
2.67k
                                        ps_mv_pred[TOP_R]->i2_mv[uc_B2 + 1];
1064
2.67k
                    }
1065
2.87k
                    else
1066
2.87k
                    {
1067
                        /* The MV predictor is calculated according to the process
1068
                         defined in 8.4.1.2.1 */
1069
2.87k
                        ih264d_get_motion_vector_predictor(
1070
2.87k
                                        ps_mv_final_pred,
1071
2.87k
                                        ps_mv_pred,
1072
2.87k
                                        u1_ref_idx,
1073
2.87k
                                        uc_lx,
1074
2.87k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
1075
2.87k
                    }
1076
5.54k
                }
1077
11.0k
                break;
1078
1.70k
            case B_DIRECT_SPATIAL:
1079
                /* Case when the MB has been skipped */
1080
                /* If either of left or the top subMB is not present
1081
                 OR
1082
                 If both the MV components of either the left or the top subMB are
1083
                 zero and their reference frame pointer pointing to 0
1084
                 then MV for the skipped MB is zero
1085
                 else the Median of the mv_pred_t is used */
1086
1.70k
                uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[0];
1087
1.70k
                uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[0];
1088
1.70k
                uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[0];
1089
1090
1.70k
                ps_mv_final_pred->i1_ref_frame[0] = MIN(uc_temp1,
1091
1.70k
                                                      MIN(uc_temp2, uc_temp3));
1092
1093
1.70k
                uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[1];
1094
1.70k
                uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[1];
1095
1.70k
                uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[1];
1096
1097
1.70k
                ps_mv_final_pred->i1_ref_frame[1] = MIN(uc_temp1,
1098
1.70k
                                                      MIN(uc_temp2, uc_temp3));
1099
1100
                /* If the reference indices are negative clip the scaled reference indices to -1 */
1101
                /* i.e invalid reference index */
1102
1103
                /*if(ps_mv_final_pred->i1_ref_frame[0] < 0)
1104
                 ps_mv_final_pred->i1_ref_frame[0] = -1;
1105
1106
                 if(ps_mv_final_pred->i1_ref_frame[1] < 0)
1107
                 ps_mv_final_pred->i1_ref_frame[1] = -1; */
1108
1109
1.70k
                if((ps_mv_final_pred->i1_ref_frame[0] < 0)
1110
644
                                && (ps_mv_final_pred->i1_ref_frame[1] < 0))
1111
106
                {
1112
106
                    u1_direct_zero_pred_flag = 1;
1113
106
                    ps_mv_final_pred->i1_ref_frame[0] = 0;
1114
106
                    ps_mv_final_pred->i1_ref_frame[1] = 0;
1115
106
                }
1116
1.70k
                ih264d_get_motion_vector_predictor(
1117
1.70k
                                ps_mv_final_pred, ps_mv_pred,
1118
1.70k
                                ps_mv_final_pred->i1_ref_frame[0], 0,
1119
1.70k
                                (const UWORD8 *)gau1_ih264d_mv_pred_condition);
1120
1121
1.70k
                ih264d_get_motion_vector_predictor(
1122
1.70k
                                ps_mv_final_pred, ps_mv_pred,
1123
1.70k
                                ps_mv_final_pred->i1_ref_frame[1], 1,
1124
1.70k
                                (const UWORD8 *)gau1_ih264d_mv_pred_condition);
1125
1126
1.70k
                break;
1127
1.45M
            case MB_SKIP:
1128
                /* Case when the MB has been skipped */
1129
                /* If either of left or the top subMB is not present
1130
                 OR
1131
                 If both the MV components of either the left or the top subMB are
1132
                 zero and their reference frame pointer pointing to 0
1133
                 then MV for the skipped MB is zero
1134
                 else the Median of the mv_pred_t is used */
1135
1.45M
                u1_a_in = (ps_cur_mb_info->u1_mb_ngbr_availablity &
1136
1.45M
                LEFT_MB_AVAILABLE_MASK);
1137
1.45M
                u1_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity &
1138
1.45M
                TOP_MB_AVAILABLE_MASK);
1139
1.45M
                if(((u1_a_in * u1_b_in) == 0)
1140
1.30M
                                || ((ps_mv_pred[LEFT]->i2_mv[0]
1141
1.30M
                                                | ps_mv_pred[LEFT]->i2_mv[1]
1142
1.30M
                                                | ps_mv_pred[LEFT]->i1_ref_frame[0])
1143
1.30M
                                                == 0)
1144
14.4k
                                || ((ps_mv_pred[TOP]->i2_mv[0]
1145
14.4k
                                                | ps_mv_pred[TOP]->i2_mv[1]
1146
14.4k
                                                | ps_mv_pred[TOP]->i1_ref_frame[0])
1147
14.4k
                                                == 0))
1148
1.43M
                {
1149
1.43M
                    ps_mv_final_pred->i2_mv[0] = 0;
1150
1.43M
                    ps_mv_final_pred->i2_mv[1] = 0;
1151
1.43M
                    break;
1152
1.43M
                }
1153
                /* If the condition above is not true calculate the MV predictor
1154
                 according to the process defined in sec 8.4.1.2.1 */
1155
63.3k
            default:
1156
63.3k
                ih264d_get_motion_vector_predictor(
1157
63.3k
                                ps_mv_final_pred, ps_mv_pred, u1_ref_idx, uc_lx,
1158
63.3k
                                (const UWORD8 *)gau1_ih264d_mv_pred_condition);
1159
63.3k
                break;
1160
1.55M
        }
1161
1.55M
    }
1162
1.55M
    return (u1_direct_zero_pred_flag);
1163
1.55M
}
1164
1165
1166
1167
1168
void ih264d_rep_mv_colz(dec_struct_t *ps_dec,
1169
                        mv_pred_t *ps_mv_pred_src,
1170
                        mv_pred_t *ps_mv_pred_dst,
1171
                        UWORD32 u4_sub_mb_num,
1172
                        UWORD8 u1_colz,
1173
                        UWORD8 u1_ht,
1174
                        UWORD8 u1_wd)
1175
35.1M
{
1176
1177
35.1M
    UWORD8 k, m;
1178
35.1M
    UWORD8 *pu1_colz = ps_dec->pu1_col_zero_flag + ps_dec->i4_submb_ofst
1179
35.1M
                    + u4_sub_mb_num;
1180
1181
173M
    for(k = 0; k < u1_ht; k++)
1182
137M
    {
1183
684M
        for(m = 0; m < u1_wd; m++)
1184
546M
        {
1185
546M
            *(ps_mv_pred_dst + m) = *(ps_mv_pred_src);
1186
546M
            *(pu1_colz + m) = u1_colz;
1187
1188
546M
        }
1189
137M
        pu1_colz += SUB_BLK_WIDTH;
1190
137M
        ps_mv_pred_dst += SUB_BLK_WIDTH;
1191
137M
    }
1192
35.1M
}
1193