Coverage Report

Created: 2026-10-17 07:17

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
1.73M
{
81
1.73M
    WORD8 c_temp;
82
1.73M
    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
1.73M
    c_temp =
87
1.73M
                    (ps_mv_pred[LEFT]->i1_ref_frame[u1_B] == u1_ref_idx)
88
1.73M
                                    | ((ps_mv_pred[TOP]->i1_ref_frame[u1_B]
89
1.73M
                                                    == u1_ref_idx) << 1)
90
1.73M
                                    | ((ps_mv_pred[TOP_R]->i1_ref_frame[u1_B]
91
1.73M
                                                    == u1_ref_idx) << 2);
92
1.73M
    c_temp = pu1_mv_pred_condition[c_temp];
93
94
1.73M
    if(c_temp != -1)
95
59.5k
    {
96
        /* Case when only when one of the cadidate block has the same
97
         reference frame as the current block */
98
59.5k
        ps_result->i2_mv[uc_B2 + 0] = ps_mv_pred[c_temp]->i2_mv[uc_B2 + 0];
99
59.5k
        ps_result->i2_mv[uc_B2 + 1] = ps_mv_pred[c_temp]->i2_mv[uc_B2 + 1];
100
59.5k
    }
101
1.67M
    else
102
1.67M
    {
103
1.67M
        WORD32 D0, D1;
104
1.67M
        D0 = MIN(ps_mv_pred[0]->i2_mv[uc_B2 + 0],
105
1.67M
                 ps_mv_pred[1]->i2_mv[uc_B2 + 0]);
106
1.67M
        D1 = MAX(ps_mv_pred[0]->i2_mv[uc_B2 + 0],
107
1.67M
                 ps_mv_pred[1]->i2_mv[uc_B2 + 0]);
108
1.67M
        D1 = MIN(D1, ps_mv_pred[2]->i2_mv[uc_B2 + 0]);
109
1.67M
        ps_result->i2_mv[uc_B2 + 0] = (WORD16)(MAX(D0, D1));
110
111
1.67M
        D0 = MIN(ps_mv_pred[0]->i2_mv[uc_B2 + 1],
112
1.67M
                 ps_mv_pred[1]->i2_mv[uc_B2 + 1]);
113
1.67M
        D1 = MAX(ps_mv_pred[0]->i2_mv[uc_B2 + 1],
114
1.67M
                 ps_mv_pred[1]->i2_mv[uc_B2 + 1]);
115
1.67M
        D1 = MIN(D1, ps_mv_pred[2]->i2_mv[uc_B2 + 1]);
116
1.67M
        ps_result->i2_mv[uc_B2 + 1] = (WORD16)(MAX(D0, D1));
117
118
1.67M
    }
119
1.73M
}
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
576k
{
153
576k
    UWORD16 u2_a_in = 0, u2_b_in = 0, u2_c_in = 0, u2_d_in = 0;
154
576k
    mv_pred_t *ps_mvpred_l, *ps_mvpred_tmp;
155
576k
    UWORD32 u4_sub_mb_x = (u4_sub_mb_num & 3), uc_sub_mb_y = (u4_sub_mb_num >> 2);
156
576k
    UWORD8 u1_is_cur_mb_fld, u1_is_left_mb_fld, u1_is_top_mb_fld;
157
576k
    UWORD8 u1_is_cur_mb_top;
158
159
576k
    u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
160
576k
    u1_is_cur_mb_top = ps_cur_mb_info->u1_topmb;
161
162
576k
    u1_is_left_mb_fld = ps_cur_mb_info->ps_left_mb->u1_mb_fld;
163
576k
    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
576k
    ps_mv_pred[LEFT] = &ps_dec->s_default_mv_pred;
168
576k
    ps_mv_pred[TOP] = &(ps_dec->s_default_mv_pred);
169
576k
    ps_mv_pred[TOP_R] = &(ps_dec->s_default_mv_pred);
170
171
    /* Check if the left subMb is available */
172
576k
    if(u4_sub_mb_x)
173
4.67k
    {
174
4.67k
        u2_a_in = 1;
175
4.67k
        ps_mv_pred[LEFT] = (ps_mv_nmb - 1);
176
4.67k
    }
177
571k
    else
178
571k
    {
179
571k
        UWORD8 uc_temp;
180
571k
        u2_a_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK);
181
571k
        if(u2_a_in)
182
523k
        {
183
523k
            ps_mvpred_l = (ps_dec->u4_num_pmbair) ?
184
523k
                            ps_mv_nmb :
185
523k
                            (ps_dec->ps_mv_left + (uc_sub_mb_y << 2) + 48
186
8
                                            - (u1_is_cur_mb_top << 4));
187
523k
            uc_temp = 29;
188
523k
            if(u1_is_cur_mb_fld ^ u1_is_left_mb_fld)
189
13.1k
            {
190
13.1k
                if(u1_is_left_mb_fld)
191
6.04k
                {
192
6.04k
                    uc_temp +=
193
6.04k
                                    (((uc_sub_mb_y & 1) << 2)
194
6.04k
                                                    + ((uc_sub_mb_y & 2) << 1));
195
6.04k
                    uc_temp += ((u1_is_cur_mb_top) ? 0 : 8);
196
6.04k
                }
197
7.08k
                else
198
7.08k
                {
199
7.08k
                    uc_temp = uc_temp - (uc_sub_mb_y << 2);
200
7.08k
                    uc_temp += ((u1_is_cur_mb_top) ? 0 : 16);
201
7.08k
                }
202
13.1k
            }
203
523k
            ps_mv_pred[LEFT] = (ps_mvpred_l - uc_temp);
204
523k
            pu0_scale[LEFT] = u1_is_cur_mb_fld - u1_is_left_mb_fld;
205
523k
        }
206
571k
    }
207
208
    /* Check if the top subMB is available */
209
576k
    if((uc_sub_mb_y > 0) || ((u1_is_cur_mb_top | u1_is_cur_mb_fld) == 0))
210
275k
    {
211
275k
        u2_b_in = 1;
212
275k
        ps_mv_pred[TOP] = ps_mv_nmb - 4;
213
275k
    }
214
300k
    else
215
300k
    {
216
300k
        u2_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK);
217
300k
        if(u2_b_in)
218
251k
        {
219
            /* CHANGED CODE */
220
221
251k
            if(u1_is_top_mb_fld && u1_is_cur_mb_fld)
222
30.7k
                ps_mvpred_tmp = ps_mv_ntop;
223
220k
            else
224
220k
            {
225
220k
                ps_mvpred_tmp = ps_mv_ntop;
226
220k
                if(u1_is_cur_mb_top)
227
216k
                    ps_mvpred_tmp += 16;
228
220k
            }
229
230
251k
            ps_mv_pred[TOP] = ps_mvpred_tmp;
231
251k
            pu0_scale[TOP] = u1_is_cur_mb_fld - u1_is_top_mb_fld;
232
251k
        }
233
300k
    }
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
576k
    u2_c_in = CHECKBIT(ps_cur_mb_info->u2_top_right_avail_mask,
242
576k
                        (u4_sub_mb_num + uc_mb_part_width - 1));
243
576k
    if(u2_c_in)
244
230k
    {
245
230k
        ps_mv_pred[TOP_R] = ps_mv_pred[TOP] + uc_mb_part_width;
246
230k
        pu0_scale[TOP_R] = pu0_scale[TOP];
247
230k
        if((uc_sub_mb_y == 0) && ((u4_sub_mb_x + uc_mb_part_width) > 3))
248
226k
        {
249
226k
            UWORD8 uc_isTopRtMbFld;
250
226k
            uc_isTopRtMbFld = ps_cur_mb_info->ps_top_right_mb->u1_mb_fld;
251
            /* CHANGED CODE */
252
226k
            ps_mvpred_tmp = ps_mv_ntop + uc_mb_part_width + 12;
253
226k
            ps_mvpred_tmp += (u1_is_cur_mb_top) ? 16 : 0;
254
226k
            ps_mvpred_tmp += (u1_is_cur_mb_fld && u1_is_cur_mb_top && uc_isTopRtMbFld) ?
255
213k
                            0 : 16;
256
226k
            ps_mv_pred[TOP_R] = ps_mvpred_tmp;
257
226k
            pu0_scale[TOP_R] = u1_is_cur_mb_fld - uc_isTopRtMbFld;
258
226k
        }
259
230k
    }
260
345k
    else
261
345k
    {
262
345k
        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
345k
        if(u2_d_in)
266
272k
        {
267
272k
            UWORD8 uc_isTopLtMbFld;
268
269
272k
            ps_mv_pred[TOP_R] = ps_mv_pred[TOP] - 1;
270
272k
            pu0_scale[TOP_R] = pu0_scale[TOP];
271
272
272k
            if(u4_sub_mb_x == 0)
273
270k
            {
274
270k
                if((uc_sub_mb_y > 0) || ((u1_is_cur_mb_top | u1_is_cur_mb_fld) == 0))
275
247k
                {
276
247k
                    uc_isTopLtMbFld = u1_is_left_mb_fld;
277
247k
                    ps_mvpred_tmp = ps_mv_pred[LEFT] - 4;
278
279
247k
                    if((u1_is_cur_mb_fld == 0) && uc_isTopLtMbFld)
280
3.24k
                    {
281
3.24k
                        ps_mvpred_tmp = ps_mv_pred[LEFT] + 16;
282
3.24k
                        ps_mvpred_tmp -= (uc_sub_mb_y & 1) ? 0 : 4;
283
3.24k
                    }
284
247k
                }
285
22.9k
                else
286
22.9k
                {
287
22.9k
                    UWORD32 u4_cond = ps_dec->u4_num_pmbair;
288
22.9k
                    uc_isTopLtMbFld = ps_cur_mb_info->u1_topleft_mb_fld;
289
290
                    /* CHANGED CODE */
291
22.9k
                    ps_mvpred_tmp = ps_mv_ntop - 29;
292
22.9k
                    ps_mvpred_tmp += (u1_is_cur_mb_top) ? 16 : 0;
293
22.9k
                    if(u1_is_cur_mb_fld && u1_is_cur_mb_top)
294
1.36k
                        ps_mvpred_tmp -= (uc_isTopLtMbFld) ? 16 : 0;
295
22.9k
                }
296
270k
                ps_mv_pred[TOP_R] = ps_mvpred_tmp;
297
270k
                pu0_scale[TOP_R] = u1_is_cur_mb_fld - uc_isTopLtMbFld;
298
270k
            }
299
272k
        }
300
72.7k
        else if(u2_b_in == 0)
301
49.2k
        {
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
49.2k
            ps_mv_pred[TOP] = ps_mv_pred[LEFT];
305
49.2k
            ps_mv_pred[TOP_R] = ps_mv_pred[LEFT];
306
49.2k
            pu0_scale[TOP] = pu0_scale[LEFT];
307
49.2k
            pu0_scale[TOP_R] = pu0_scale[LEFT];
308
49.2k
        }
309
345k
    }
310
576k
}
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
14.9M
{
343
14.9M
    UWORD16 u2_b_in = 0, u2_c_in = 0, u2_d_in = 0;
344
14.9M
    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
14.9M
    ps_mv_pred[LEFT] = &ps_dec->s_default_mv_pred;
350
14.9M
    ps_mv_pred[TOP] = &(ps_dec->s_default_mv_pred);
351
14.9M
    ps_mv_pred[TOP_R] = &(ps_dec->s_default_mv_pred);
352
    /* Check if the left subMb is available */
353
354
14.9M
    if(u4_sub_mb_x)
355
86.6k
    {
356
86.6k
        ps_mv_pred[LEFT] = (ps_mv_nmb - 1);
357
86.6k
    }
358
14.8M
    else
359
14.8M
    {
360
14.8M
        if(ps_cur_mb_info->u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK)
361
14.6M
        {
362
14.6M
            ps_mv_pred[LEFT] = (ps_mv_nmb - 13);
363
14.6M
        }
364
14.8M
    }
365
366
    /* Check if the top subMB is available */
367
14.9M
    if(uc_sub_mb_y)
368
94.1k
    {
369
94.1k
        u2_b_in = 1;
370
94.1k
        ps_mv_ntop = ps_mv_nmb - 4;
371
94.1k
        ps_mv_pred[TOP] = ps_mv_ntop;
372
373
94.1k
    }
374
14.8M
    else
375
14.8M
    {
376
14.8M
        u2_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK);
377
14.8M
        if(u2_b_in)
378
14.2M
        {
379
14.2M
            ps_mv_pred[TOP] = ps_mv_ntop;
380
14.2M
        }
381
14.8M
    }
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
14.9M
    u2_c_in = CHECKBIT(ps_cur_mb_info->u2_top_right_avail_mask,
390
14.9M
                        (u4_sub_mb_num + uc_mb_part_width - 1));
391
14.9M
    if(u2_c_in)
392
14.1M
    {
393
14.1M
        ps_mv_pred[TOP_R] = (ps_mv_ntop + uc_mb_part_width);
394
395
14.1M
        if(uc_sub_mb_y == 0)
396
14.1M
        {
397
            /* CHANGED CODE */
398
14.1M
            if((u4_sub_mb_x + uc_mb_part_width) > 3)
399
14.0M
                ps_mv_pred[TOP_R] += 12;
400
14.1M
        }
401
14.1M
    }
402
764k
    else
403
764k
    {
404
764k
        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
764k
        if(u2_d_in)
407
170k
        {
408
            /* CHANGED CODE */
409
170k
            ps_mv_pred[TOP_R] = (ps_mv_ntop - 1);
410
170k
            if(u4_sub_mb_x == 0)
411
133k
            {
412
133k
                if(uc_sub_mb_y)
413
17.8k
                {
414
17.8k
                    ps_mv_pred[TOP_R] = (ps_mv_nmb - 17);
415
17.8k
                }
416
116k
                else
417
116k
                {
418
                    /* CHANGED CODE */
419
116k
                    ps_mv_pred[TOP_R] -= 12;
420
116k
                }
421
133k
            }
422
170k
        }
423
594k
        else if(u2_b_in == 0)
424
553k
        {
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
553k
            ps_mv_pred[TOP] = ps_mv_pred[LEFT];
428
553k
            ps_mv_pred[TOP_R] = ps_mv_pred[LEFT];
429
553k
        }
430
764k
    }
431
14.9M
}
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
11.0M
{
469
11.0M
    UWORD8 u1_a_in, u1_b_in, uc_temp1, uc_temp2, uc_temp3;
470
11.0M
    mv_pred_t *ps_mv_pred[3];
471
11.0M
    UWORD8 uc_B2, uc_lx, u1_ref_idx;
472
11.0M
    UWORD8 u1_direct_zero_pred_flag = 0;
473
474
11.0M
    ih264d_non_mbaff_mv_pred(ps_mv_pred, u4_sub_mb_num, ps_mv_nmb, ps_mv_ntop,
475
11.0M
                             ps_dec, uc_mb_part_width, ps_cur_mb_info);
476
477
22.0M
    for(uc_lx = u1_lx_start; uc_lx < u1_lxend; uc_lx++)
478
11.0M
    {
479
11.0M
        u1_ref_idx = ps_mv_final_pred->i1_ref_frame[uc_lx];
480
11.0M
        uc_B2 = (uc_lx << 1);
481
11.0M
        switch(u1_mb_mc_mode)
482
11.0M
        {
483
29.3k
            case PRED_16x8:
484
                /* Directional prediction for a 16x8 MB partition */
485
29.3k
                if(u4_sub_mb_num == 0)
486
14.4k
                {
487
                    /* Calculating the MV pred for the top 16x8 block */
488
14.4k
                    if(ps_mv_pred[TOP]->i1_ref_frame[uc_lx] == u1_ref_idx)
489
12.6k
                    {
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
12.6k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
495
12.6k
                                        ps_mv_pred[TOP]->i2_mv[uc_B2 + 0];
496
12.6k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
497
12.6k
                                        ps_mv_pred[TOP]->i2_mv[uc_B2 + 1];
498
12.6k
                    }
499
1.75k
                    else
500
1.75k
                    {
501
                        /* The MV predictor is calculated according to the process
502
                         defined in 8.4.1.2.1 */
503
1.75k
                        ih264d_get_motion_vector_predictor(
504
1.75k
                                        ps_mv_final_pred,
505
1.75k
                                        ps_mv_pred,
506
1.75k
                                        u1_ref_idx,
507
1.75k
                                        uc_lx,
508
1.75k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
509
1.75k
                    }
510
14.4k
                }
511
14.8k
                else
512
14.8k
                {
513
14.8k
                    if(ps_mv_pred[LEFT]->i1_ref_frame[uc_lx] == u1_ref_idx)
514
12.9k
                    {
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
12.9k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
520
12.9k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 0];
521
12.9k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
522
12.9k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 1];
523
12.9k
                    }
524
1.95k
                    else
525
1.95k
                    {
526
                        /* The MV predictor is calculated according to the process
527
                         defined in 8.4.1.2.1 */
528
1.95k
                        ih264d_get_motion_vector_predictor(
529
1.95k
                                        ps_mv_final_pred,
530
1.95k
                                        ps_mv_pred,
531
1.95k
                                        u1_ref_idx,
532
1.95k
                                        uc_lx,
533
1.95k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
534
1.95k
                    }
535
14.8k
                }
536
29.3k
                break;
537
11.5k
            case PRED_8x16:
538
                /* Directional prediction for a 8x16 MB partition */
539
11.5k
                if(u4_sub_mb_num == 0)
540
5.76k
                {
541
5.76k
                    if(ps_mv_pred[LEFT]->i1_ref_frame[uc_lx] == u1_ref_idx)
542
2.43k
                    {
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
2.43k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
548
2.43k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 0];
549
2.43k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
550
2.43k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 1];
551
2.43k
                    }
552
3.32k
                    else
553
3.32k
                    {
554
                        /* The MV predictor is calculated according to the process
555
                         defined in 8.4.1.2.1 */
556
3.32k
                        ih264d_get_motion_vector_predictor(
557
3.32k
                                        ps_mv_final_pred,
558
3.32k
                                        ps_mv_pred,
559
3.32k
                                        u1_ref_idx,
560
3.32k
                                        uc_lx,
561
3.32k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
562
3.32k
                    }
563
5.76k
                }
564
5.73k
                else
565
5.73k
                {
566
5.73k
                    if(ps_mv_pred[TOP_R]->i1_ref_frame[uc_lx] == u1_ref_idx)
567
2.30k
                    {
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
2.30k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
573
2.30k
                                        ps_mv_pred[TOP_R]->i2_mv[uc_B2 + 0];
574
2.30k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
575
2.30k
                                        ps_mv_pred[TOP_R]->i2_mv[uc_B2 + 1];
576
2.30k
                    }
577
3.43k
                    else
578
3.43k
                    {
579
                        /* The MV predictor is calculated according to the process
580
                         defined in 8.4.1.2.1 */
581
3.43k
                        ih264d_get_motion_vector_predictor(
582
3.43k
                                        ps_mv_final_pred,
583
3.43k
                                        ps_mv_pred,
584
3.43k
                                        u1_ref_idx,
585
3.43k
                                        uc_lx,
586
3.43k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
587
3.43k
                    }
588
5.73k
                }
589
11.5k
                break;
590
709k
            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
709k
                uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[0];
599
709k
                uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[0];
600
709k
                uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[0];
601
602
709k
                ps_mv_final_pred->i1_ref_frame[0] = MIN(uc_temp1,
603
709k
                                                      MIN(uc_temp2, uc_temp3));
604
605
709k
                uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[1];
606
709k
                uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[1];
607
709k
                uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[1];
608
609
709k
                ps_mv_final_pred->i1_ref_frame[1] = MIN(uc_temp1,
610
709k
                                                      MIN(uc_temp2, uc_temp3));
611
612
709k
                if((ps_mv_final_pred->i1_ref_frame[0] < 0)
613
17.3k
                                && (ps_mv_final_pred->i1_ref_frame[1] < 0))
614
3.72k
                {
615
3.72k
                    u1_direct_zero_pred_flag = 1;
616
3.72k
                    ps_mv_final_pred->i1_ref_frame[0] = 0;
617
3.72k
                    ps_mv_final_pred->i1_ref_frame[1] = 0;
618
3.72k
                }
619
709k
                ih264d_get_motion_vector_predictor(
620
709k
                                ps_mv_final_pred, ps_mv_pred,
621
709k
                                ps_mv_final_pred->i1_ref_frame[0], 0,
622
709k
                                (const UWORD8 *)gau1_ih264d_mv_pred_condition);
623
624
709k
                ih264d_get_motion_vector_predictor(
625
709k
                                ps_mv_final_pred, ps_mv_pred,
626
709k
                                ps_mv_final_pred->i1_ref_frame[1], 1,
627
709k
                                (const UWORD8 *)gau1_ih264d_mv_pred_condition);
628
629
709k
                break;
630
10.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
10.1M
                u1_a_in = (ps_cur_mb_info->u1_mb_ngbr_availablity &
639
10.1M
                LEFT_MB_AVAILABLE_MASK);
640
10.1M
                u1_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity &
641
10.1M
                TOP_MB_AVAILABLE_MASK);
642
10.1M
                if(((u1_a_in * u1_b_in) == 0)
643
9.91M
                                || ((ps_mv_pred[LEFT]->i2_mv[0]
644
9.91M
                                                | ps_mv_pred[LEFT]->i2_mv[1]
645
9.91M
                                                | ps_mv_pred[LEFT]->i1_ref_frame[0])
646
9.91M
                                                == 0)
647
0
                                || ((ps_mv_pred[TOP]->i2_mv[0]
648
0
                                                | ps_mv_pred[TOP]->i2_mv[1]
649
0
                                                | ps_mv_pred[TOP]->i1_ref_frame[0])
650
0
                                                == 0))
651
10.1M
                {
652
10.1M
                    ps_mv_final_pred->i2_mv[0] = 0;
653
10.1M
                    ps_mv_final_pred->i2_mv[1] = 0;
654
10.1M
                    break;
655
10.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
145k
            default:
659
145k
                ih264d_get_motion_vector_predictor(
660
145k
                                ps_mv_final_pred, ps_mv_pred, u1_ref_idx, uc_lx,
661
145k
                                (const UWORD8 *)gau1_ih264d_mv_pred_condition);
662
145k
                break;
663
11.0M
        }
664
11.0M
    }
665
11.0M
    return (u1_direct_zero_pred_flag);
666
11.0M
}
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
3.90M
{
704
3.90M
    UWORD8 u1_a_in, u1_b_in, uc_temp1, uc_temp2, uc_temp3;
705
3.90M
    mv_pred_t *ps_mv_pred[3];
706
3.90M
    UWORD8 u1_ref_idx;
707
3.90M
    UWORD8 u1_direct_zero_pred_flag = 0;
708
3.90M
    UNUSED(u1_lx_start);
709
3.90M
    UNUSED(u1_lxend);
710
3.90M
    ih264d_non_mbaff_mv_pred(ps_mv_pred, u4_sub_mb_num, ps_mv_nmb, ps_mv_ntop,
711
3.90M
                             ps_dec, uc_mb_part_width, ps_cur_mb_info);
712
713
3.90M
    u1_ref_idx = ps_mv_final_pred->i1_ref_frame[0];
714
715
3.90M
    switch(u1_mb_mc_mode)
716
3.90M
    {
717
8.25k
        case PRED_16x8:
718
            /* Directional prediction for a 16x8 MB partition */
719
8.25k
            if(u4_sub_mb_num == 0)
720
4.12k
            {
721
                /* Calculating the MV pred for the top 16x8 block */
722
4.12k
                if(ps_mv_pred[TOP]->i1_ref_frame[0] == u1_ref_idx)
723
1.60k
                {
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
1.60k
                    ps_mv_final_pred->i2_mv[0] = ps_mv_pred[TOP]->i2_mv[0];
730
1.60k
                    ps_mv_final_pred->i2_mv[1] = ps_mv_pred[TOP]->i2_mv[1];
731
1.60k
                }
732
2.52k
                else
733
2.52k
                {
734
                    /* The MV predictor is calculated according to the process
735
                     defined in 8.4.1.2.1 */
736
2.52k
                    ih264d_get_motion_vector_predictor(
737
2.52k
                                    ps_mv_final_pred,
738
2.52k
                                    ps_mv_pred,
739
2.52k
                                    u1_ref_idx,
740
2.52k
                                    0,
741
2.52k
                                    (const UWORD8 *)gau1_ih264d_mv_pred_condition);
742
2.52k
                }
743
4.12k
            }
744
4.12k
            else
745
4.12k
            {
746
4.12k
                if(ps_mv_pred[LEFT]->i1_ref_frame[0] == u1_ref_idx)
747
1.47k
                {
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
1.47k
                    ps_mv_final_pred->i2_mv[0] = ps_mv_pred[LEFT]->i2_mv[0];
754
1.47k
                    ps_mv_final_pred->i2_mv[1] = ps_mv_pred[LEFT]->i2_mv[1];
755
1.47k
                }
756
2.64k
                else
757
2.64k
                {
758
                    /* The MV predictor is calculated according to the process
759
                     defined in 8.4.1.2.1 */
760
2.64k
                    ih264d_get_motion_vector_predictor(
761
2.64k
                                    ps_mv_final_pred,
762
2.64k
                                    ps_mv_pred,
763
2.64k
                                    u1_ref_idx,
764
2.64k
                                    0,
765
2.64k
                                    (const UWORD8 *)gau1_ih264d_mv_pred_condition);
766
2.64k
                }
767
4.12k
            }
768
8.25k
            break;
769
2.06k
        case PRED_8x16:
770
            /* Directional prediction for a 8x16 MB partition */
771
2.06k
            if(u4_sub_mb_num == 0)
772
1.03k
            {
773
1.03k
                if(ps_mv_pred[LEFT]->i1_ref_frame[0] == u1_ref_idx)
774
465
                {
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
465
                    ps_mv_final_pred->i2_mv[0] = ps_mv_pred[LEFT]->i2_mv[0];
781
465
                    ps_mv_final_pred->i2_mv[1] = ps_mv_pred[LEFT]->i2_mv[1];
782
465
                }
783
566
                else
784
566
                {
785
                    /* The MV predictor is calculated according to the process
786
                     defined in 8.4.1.2.1 */
787
566
                    ih264d_get_motion_vector_predictor(
788
566
                                    ps_mv_final_pred,
789
566
                                    ps_mv_pred,
790
566
                                    u1_ref_idx,
791
566
                                    0,
792
566
                                    (const UWORD8 *)gau1_ih264d_mv_pred_condition);
793
566
                }
794
1.03k
            }
795
1.03k
            else
796
1.03k
            {
797
1.03k
                if(ps_mv_pred[TOP_R]->i1_ref_frame[0] == u1_ref_idx)
798
688
                {
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
688
                    ps_mv_final_pred->i2_mv[0] = ps_mv_pred[TOP_R]->i2_mv[0];
805
688
                    ps_mv_final_pred->i2_mv[1] = ps_mv_pred[TOP_R]->i2_mv[1];
806
688
                }
807
343
                else
808
343
                {
809
                    /* The MV predictor is calculated according to the process
810
                     defined in 8.4.1.2.1 */
811
343
                    ih264d_get_motion_vector_predictor(
812
343
                                    ps_mv_final_pred,
813
343
                                    ps_mv_pred,
814
343
                                    u1_ref_idx,
815
343
                                    0,
816
343
                                    (const UWORD8 *)gau1_ih264d_mv_pred_condition);
817
343
                }
818
1.03k
            }
819
2.06k
            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
3.84M
        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
3.84M
            u1_a_in = (ps_cur_mb_info->u1_mb_ngbr_availablity &
869
3.84M
            LEFT_MB_AVAILABLE_MASK);
870
3.84M
            u1_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity &
871
3.84M
            TOP_MB_AVAILABLE_MASK);
872
3.84M
            if(((u1_a_in * u1_b_in) == 0)
873
3.44M
                            || ((ps_mv_pred[LEFT]->i2_mv[0]
874
3.44M
                                            | ps_mv_pred[LEFT]->i2_mv[1]
875
3.44M
                                            | ps_mv_pred[LEFT]->i1_ref_frame[0])
876
3.44M
                                            == 0)
877
1.73k
                            || ((ps_mv_pred[TOP]->i2_mv[0]
878
1.73k
                                            | ps_mv_pred[TOP]->i2_mv[1]
879
1.73k
                                            | ps_mv_pred[TOP]->i1_ref_frame[0])
880
1.73k
                                            == 0))
881
3.84M
            {
882
883
3.84M
                ps_mv_final_pred->i2_mv[0] = 0;
884
3.84M
                ps_mv_final_pred->i2_mv[1] = 0;
885
3.84M
                break;
886
3.84M
            }
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
44.4k
        default:
890
44.4k
            ih264d_get_motion_vector_predictor(
891
44.4k
                            ps_mv_final_pred, ps_mv_pred, u1_ref_idx, 0,
892
44.4k
                            (const UWORD8 *)gau1_ih264d_mv_pred_condition);
893
44.4k
            break;
894
3.90M
    }
895
896
3.90M
    return (u1_direct_zero_pred_flag);
897
3.90M
}
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
576k
{
934
576k
    UWORD8 u1_a_in, u1_b_in, uc_temp1, uc_temp2, uc_temp3;
935
576k
    mv_pred_t *ps_mv_pred[3], s_mvPred[3];
936
576k
    UWORD8 uc_B2, pu0_scale[3], i, uc_lx, u1_ref_idx;
937
576k
    UWORD8 u1_direct_zero_pred_flag = 0;
938
939
576k
    pu0_scale[0] = pu0_scale[1] = pu0_scale[2] = 0;
940
576k
    ih264d_mbaff_mv_pred(ps_mv_pred, u4_sub_mb_num, ps_mv_nmb, ps_mv_ntop, ps_dec,
941
576k
                         uc_mb_part_width, ps_cur_mb_info, pu0_scale);
942
2.30M
    for(i = 0; i < 3; i++)
943
1.72M
    {
944
1.72M
        if(pu0_scale[i] != 0)
945
42.0k
        {
946
42.0k
            memcpy(&s_mvPred[i], ps_mv_pred[i], sizeof(mv_pred_t));
947
42.0k
            if(pu0_scale[i] == 1)
948
23.7k
            {
949
23.7k
                s_mvPred[i].i1_ref_frame[0] = s_mvPred[i].i1_ref_frame[0] << 1;
950
23.7k
                s_mvPred[i].i1_ref_frame[1] = s_mvPred[i].i1_ref_frame[1] << 1;
951
23.7k
                s_mvPred[i].i2_mv[1] = SIGN_POW2_DIV(s_mvPred[i].i2_mv[1], 1);
952
23.7k
                s_mvPred[i].i2_mv[3] = SIGN_POW2_DIV(s_mvPred[i].i2_mv[3], 1);
953
23.7k
            }
954
18.3k
            else
955
18.3k
            {
956
18.3k
                s_mvPred[i].i1_ref_frame[0] = s_mvPred[i].i1_ref_frame[0] >> 1;
957
18.3k
                s_mvPred[i].i1_ref_frame[1] = s_mvPred[i].i1_ref_frame[1] >> 1;
958
18.3k
                s_mvPred[i].i2_mv[1] = s_mvPred[i].i2_mv[1] << 1;
959
18.3k
                s_mvPred[i].i2_mv[3] = s_mvPred[i].i2_mv[3] << 1;
960
18.3k
            }
961
42.0k
            ps_mv_pred[i] = &s_mvPred[i];
962
42.0k
        }
963
1.72M
    }
964
965
1.15M
    for(uc_lx = u1_lx_start; uc_lx < u1_lxend; uc_lx++)
966
577k
    {
967
577k
        u1_ref_idx = ps_mv_final_pred->i1_ref_frame[uc_lx];
968
577k
        uc_B2 = (uc_lx << 1);
969
577k
        switch(u1_mb_mc_mode)
970
577k
        {
971
31.6k
            case PRED_16x8:
972
                /* Directional prediction for a 16x8 MB partition */
973
31.6k
                if(u4_sub_mb_num == 0)
974
15.7k
                {
975
                    /* Calculating the MV pred for the top 16x8 block */
976
15.7k
                    if(ps_mv_pred[TOP]->i1_ref_frame[uc_lx] == u1_ref_idx)
977
6.78k
                    {
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
6.78k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
983
6.78k
                                        ps_mv_pred[TOP]->i2_mv[uc_B2 + 0];
984
6.78k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
985
6.78k
                                        ps_mv_pred[TOP]->i2_mv[uc_B2 + 1];
986
6.78k
                    }
987
9.01k
                    else
988
9.01k
                    {
989
                        /* The MV predictor is calculated according to the process
990
                         defined in 8.4.1.2.1 */
991
9.01k
                        ih264d_get_motion_vector_predictor(
992
9.01k
                                        ps_mv_final_pred,
993
9.01k
                                        ps_mv_pred,
994
9.01k
                                        u1_ref_idx,
995
9.01k
                                        uc_lx,
996
9.01k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
997
9.01k
                    }
998
15.7k
                }
999
15.8k
                else
1000
15.8k
                {
1001
15.8k
                    if(ps_mv_pred[LEFT]->i1_ref_frame[uc_lx] == u1_ref_idx)
1002
7.21k
                    {
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
7.21k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
1008
7.21k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 0];
1009
7.21k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
1010
7.21k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 1];
1011
7.21k
                    }
1012
8.60k
                    else
1013
8.60k
                    {
1014
                        /* The MV predictor is calculated according to the process
1015
                         defined in 8.4.1.2.1 */
1016
8.60k
                        ih264d_get_motion_vector_predictor(
1017
8.60k
                                        ps_mv_final_pred,
1018
8.60k
                                        ps_mv_pred,
1019
8.60k
                                        u1_ref_idx,
1020
8.60k
                                        uc_lx,
1021
8.60k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
1022
8.60k
                    }
1023
15.8k
                }
1024
31.6k
                break;
1025
4.67k
            case PRED_8x16:
1026
                /* Directional prediction for a 8x16 MB partition */
1027
4.67k
                if(u4_sub_mb_num == 0)
1028
2.31k
                {
1029
2.31k
                    if(ps_mv_pred[LEFT]->i1_ref_frame[uc_lx] == u1_ref_idx)
1030
1.11k
                    {
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
1.11k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
1036
1.11k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 0];
1037
1.11k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
1038
1.11k
                                        ps_mv_pred[LEFT]->i2_mv[uc_B2 + 1];
1039
1.11k
                    }
1040
1.19k
                    else
1041
1.19k
                    {
1042
                        /* The MV predictor is calculated according to the process
1043
                         defined in 8.4.1.2.1 */
1044
1.19k
                        ih264d_get_motion_vector_predictor(
1045
1.19k
                                        ps_mv_final_pred,
1046
1.19k
                                        ps_mv_pred,
1047
1.19k
                                        u1_ref_idx,
1048
1.19k
                                        uc_lx,
1049
1.19k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
1050
1.19k
                    }
1051
2.31k
                }
1052
2.36k
                else
1053
2.36k
                {
1054
2.36k
                    if(ps_mv_pred[TOP_R]->i1_ref_frame[uc_lx] == u1_ref_idx)
1055
1.11k
                    {
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
1.11k
                        ps_mv_final_pred->i2_mv[uc_B2 + 0] =
1061
1.11k
                                        ps_mv_pred[TOP_R]->i2_mv[uc_B2 + 0];
1062
1.11k
                        ps_mv_final_pred->i2_mv[uc_B2 + 1] =
1063
1.11k
                                        ps_mv_pred[TOP_R]->i2_mv[uc_B2 + 1];
1064
1.11k
                    }
1065
1.24k
                    else
1066
1.24k
                    {
1067
                        /* The MV predictor is calculated according to the process
1068
                         defined in 8.4.1.2.1 */
1069
1.24k
                        ih264d_get_motion_vector_predictor(
1070
1.24k
                                        ps_mv_final_pred,
1071
1.24k
                                        ps_mv_pred,
1072
1.24k
                                        u1_ref_idx,
1073
1.24k
                                        uc_lx,
1074
1.24k
                                        (const UWORD8 *)gau1_ih264d_mv_pred_condition);
1075
1.24k
                    }
1076
2.36k
                }
1077
4.67k
                break;
1078
36.0k
            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
36.0k
                uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[0];
1087
36.0k
                uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[0];
1088
36.0k
                uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[0];
1089
1090
36.0k
                ps_mv_final_pred->i1_ref_frame[0] = MIN(uc_temp1,
1091
36.0k
                                                      MIN(uc_temp2, uc_temp3));
1092
1093
36.0k
                uc_temp1 = (UWORD8)ps_mv_pred[LEFT]->i1_ref_frame[1];
1094
36.0k
                uc_temp2 = (UWORD8)ps_mv_pred[TOP]->i1_ref_frame[1];
1095
36.0k
                uc_temp3 = (UWORD8)ps_mv_pred[TOP_R]->i1_ref_frame[1];
1096
1097
36.0k
                ps_mv_final_pred->i1_ref_frame[1] = MIN(uc_temp1,
1098
36.0k
                                                      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
36.0k
                if((ps_mv_final_pred->i1_ref_frame[0] < 0)
1110
2.82k
                                && (ps_mv_final_pred->i1_ref_frame[1] < 0))
1111
490
                {
1112
490
                    u1_direct_zero_pred_flag = 1;
1113
490
                    ps_mv_final_pred->i1_ref_frame[0] = 0;
1114
490
                    ps_mv_final_pred->i1_ref_frame[1] = 0;
1115
490
                }
1116
36.0k
                ih264d_get_motion_vector_predictor(
1117
36.0k
                                ps_mv_final_pred, ps_mv_pred,
1118
36.0k
                                ps_mv_final_pred->i1_ref_frame[0], 0,
1119
36.0k
                                (const UWORD8 *)gau1_ih264d_mv_pred_condition);
1120
1121
36.0k
                ih264d_get_motion_vector_predictor(
1122
36.0k
                                ps_mv_final_pred, ps_mv_pred,
1123
36.0k
                                ps_mv_final_pred->i1_ref_frame[1], 1,
1124
36.0k
                                (const UWORD8 *)gau1_ih264d_mv_pred_condition);
1125
1126
36.0k
                break;
1127
488k
            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
488k
                u1_a_in = (ps_cur_mb_info->u1_mb_ngbr_availablity &
1136
488k
                LEFT_MB_AVAILABLE_MASK);
1137
488k
                u1_b_in = (ps_cur_mb_info->u1_mb_ngbr_availablity &
1138
488k
                TOP_MB_AVAILABLE_MASK);
1139
488k
                if(((u1_a_in * u1_b_in) == 0)
1140
404k
                                || ((ps_mv_pred[LEFT]->i2_mv[0]
1141
404k
                                                | ps_mv_pred[LEFT]->i2_mv[1]
1142
404k
                                                | ps_mv_pred[LEFT]->i1_ref_frame[0])
1143
404k
                                                == 0)
1144
2.89k
                                || ((ps_mv_pred[TOP]->i2_mv[0]
1145
2.89k
                                                | ps_mv_pred[TOP]->i2_mv[1]
1146
2.89k
                                                | ps_mv_pred[TOP]->i1_ref_frame[0])
1147
2.89k
                                                == 0))
1148
485k
                {
1149
485k
                    ps_mv_final_pred->i2_mv[0] = 0;
1150
485k
                    ps_mv_final_pred->i2_mv[1] = 0;
1151
485k
                    break;
1152
485k
                }
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
20.0k
            default:
1156
20.0k
                ih264d_get_motion_vector_predictor(
1157
20.0k
                                ps_mv_final_pred, ps_mv_pred, u1_ref_idx, uc_lx,
1158
20.0k
                                (const UWORD8 *)gau1_ih264d_mv_pred_condition);
1159
20.0k
                break;
1160
577k
        }
1161
577k
    }
1162
576k
    return (u1_direct_zero_pred_flag);
1163
576k
}
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
21.3M
{
1176
1177
21.3M
    UWORD8 k, m;
1178
21.3M
    UWORD8 *pu1_colz = ps_dec->pu1_col_zero_flag + ps_dec->i4_submb_ofst
1179
21.3M
                    + u4_sub_mb_num;
1180
1181
106M
    for(k = 0; k < u1_ht; k++)
1182
84.8M
    {
1183
423M
        for(m = 0; m < u1_wd; m++)
1184
338M
        {
1185
338M
            *(ps_mv_pred_dst + m) = *(ps_mv_pred_src);
1186
338M
            *(pu1_colz + m) = u1_colz;
1187
1188
338M
        }
1189
84.8M
        pu1_colz += SUB_BLK_WIDTH;
1190
84.8M
        ps_mv_pred_dst += SUB_BLK_WIDTH;
1191
84.8M
    }
1192
21.3M
}
1193