Coverage Report

Created: 2026-06-08 07:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/ih264d_inter_pred.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_inter_pred.c
23
 *
24
 * \brief
25
 *    This file contains routines to perform MotionCompensation tasks
26
 *
27
 * Detailed_description
28
 *
29
 * \date
30
 *    20/11/2002
31
 *
32
 * \author  Arvind Raman
33
 **************************************************************************
34
 */
35
36
#include <string.h>
37
#include "ih264d_defs.h"
38
#include "ih264d_mvpred.h"
39
#include "ih264d_error_handler.h"
40
#include "ih264d_structs.h"
41
#include "ih264d_defs.h"
42
#include "ih264d_inter_pred.h"
43
#include "ih264_typedefs.h"
44
#include "ih264_macros.h"
45
#include "ih264_platform_macros.h"
46
#include "ih264d_debug.h"
47
#include "ih264d_tables.h"
48
#include "ih264d_mb_utils.h"
49
50
51
void ih264d_pad_on_demand(pred_info_t *ps_pred, UWORD8 lum_chrom_blk);
52
53
54
55
void ih264d_copy_multiplex_data(UWORD8 *puc_Source,
56
                                UWORD8 *puc_To,
57
                                UWORD32 uc_w,
58
                                UWORD32 uc_h,
59
                                UWORD32 ui16_sourceWidth,
60
                                UWORD32 ui16_toWidth)
61
0
{
62
0
    UWORD8 uc_i, uc_j;
63
64
0
    for(uc_i = 0; uc_i < uc_h; uc_i++)
65
0
    {
66
0
        memcpy(puc_To, puc_Source, uc_w);
67
0
        puc_To += ui16_toWidth;
68
0
        puc_Source += ui16_sourceWidth;
69
0
    }
70
0
}
71
72
73
/*!
74
 **************************************************************************
75
 * \if Function name : dma_2d1d \endif
76
 *
77
 * \brief
78
 *    2D -> 1D linear DMA into the reference buffers
79
 *
80
 * \return
81
 *    None
82
 **************************************************************************
83
 */
84
void ih264d_copy_2d1d(UWORD8 *puc_src,
85
                      UWORD8 *puc_dest,
86
                      UWORD16 ui16_srcWidth,
87
                      UWORD16 ui16_widthToFill,
88
                      UWORD16 ui16_heightToFill)
89
17.0k
{
90
17.0k
    UWORD32 uc_w, uc_h;
91
146k
    for(uc_h = ui16_heightToFill; uc_h != 0; uc_h--)
92
129k
    {
93
129k
        memcpy(puc_dest, puc_src, ui16_widthToFill);
94
129k
        puc_dest += ui16_widthToFill;
95
129k
        puc_src += ui16_srcWidth;
96
129k
    }
97
17.0k
}
98
99
/*!
100
 **************************************************************************
101
 * \if Function name : ih264d_fill_pred_info \endif
102
 *
103
 * \brief
104
 *    Fills inter prediction related info
105
 *
106
 * \return
107
 *    None
108
 **************************************************************************
109
 */
110
void ih264d_fill_pred_info(WORD16 *pi2_mv,WORD32 part_width,WORD32 part_height, WORD32 sub_mb_num,
111
                           WORD32 pred_dir,pred_info_pkd_t *ps_pred_pkd,WORD8 i1_buf_id,
112
                           WORD8 i1_ref_idx,UWORD32 *pu4_wt_offset,UWORD8 u1_pic_type)
113
39.4M
{
114
39.4M
    WORD32 insert_bits;
115
116
39.4M
    ps_pred_pkd->i2_mv[0] = pi2_mv[0];
117
39.4M
    ps_pred_pkd->i2_mv[1] = pi2_mv[1];
118
119
39.4M
    insert_bits = sub_mb_num & 3; /*sub mb x*/
120
39.4M
    ps_pred_pkd->i1_size_pos_info = insert_bits;
121
39.4M
    insert_bits = sub_mb_num >> 2;/*sub mb y*/
122
39.4M
    ps_pred_pkd->i1_size_pos_info |= insert_bits << 2;
123
39.4M
    insert_bits = part_width >> 1;
124
39.4M
    ps_pred_pkd->i1_size_pos_info |= insert_bits << 4;
125
39.4M
    insert_bits = part_height >> 1;
126
39.4M
    ps_pred_pkd->i1_size_pos_info |= insert_bits << 6;
127
128
39.4M
    ps_pred_pkd->i1_ref_idx_info = i1_ref_idx;
129
39.4M
    ps_pred_pkd->i1_ref_idx_info |= (pred_dir << 6);
130
39.4M
    ps_pred_pkd->i1_buf_id = i1_buf_id;
131
39.4M
    ps_pred_pkd->pu4_wt_offst = pu4_wt_offset;
132
39.4M
    ps_pred_pkd->u1_pic_type = u1_pic_type;
133
134
135
39.4M
}
136
137
138
139
140
141
142
143
/*****************************************************************************/
144
/* \if Function name : formMbPartInfo \endif                                 */
145
/*                                                                           */
146
/* \brief                                                                    */
147
/*    Form the Mb partition information structure, to be used by the MC      */
148
/*    routine                                                                */
149
/*                                                                           */
150
/* \return                                                                   */
151
/*    None                                                                   */
152
/* \note                                                                     */
153
/*    c_bufx is used to select PredBuffer,                                   */
154
/*    if it's only Forward/Backward prediction always buffer used is         */
155
/*    puc_MbLumaPredBuffer[0 to X1],pu1_mb_cb_pred_buffer[0 to X1] and          */
156
/*    pu1_mb_cr_pred_buffer[0 to X1]                                            */
157
/*                                                                           */
158
/*    if it's bidirect for forward ..PredBuffer[0 to X1] buffer is used and  */
159
/*    ..PredBuffer[X2 to X3] for backward prediction. and                    */
160
/*                                                                           */
161
/*    Final predicted samples values are the average of ..PredBuffer[0 to X1]*/
162
/*    and ..PredBuffer[X2 to X3]                                             */
163
/*                                                                           */
164
/*    X1 is 255 for Luma and 63 for Chroma                                   */
165
/*    X2 is 256 for Luma and 64 for Chroma                                   */
166
/*    X3 is 511 for Luma and 127 for Chroma                                  */
167
/*                                                                           */
168
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
169
/*         11 05 2005   SWRN            Modified to handle pod               */
170
/*****************************************************************************/
171
172
WORD32 ih264d_form_mb_part_info_bp(pred_info_pkd_t *ps_pred_pkd,
173
                                 dec_struct_t * ps_dec,
174
                                 UWORD16 u2_mb_x,
175
                                 UWORD16 u2_mb_y,
176
                                 WORD32 mb_index,
177
                                 dec_mb_info_t *ps_cur_mb_info)
178
8.56M
{
179
    /* The reference buffer pointer */
180
8.56M
    WORD32 i2_frm_x, i2_frm_y;
181
8.56M
    WORD32 i2_tmp_mv_x, i2_tmp_mv_y;
182
8.56M
    WORD32 i2_rec_x, i2_rec_y;
183
184
8.56M
    WORD32 u2_pic_ht;
185
8.56M
    WORD32 u2_frm_wd;
186
8.56M
    WORD32 u2_rec_wd;
187
8.56M
    UWORD8 u1_sub_x = 0,u1_sub_y=0 ;
188
8.56M
    UWORD8  u1_part_wd = 0,u1_part_ht = 0;
189
8.56M
    WORD16 i2_mv_x,i2_mv_y;
190
191
    /********************************************/
192
    /* i1_mc_wd       width reqd for mcomp      */
193
    /* u1_dma_ht      height reqd for mcomp     */
194
    /* u1_dma_wd      width aligned to 4 bytes  */
195
    /* u1_dx          fractional part of width  */
196
    /* u1_dx          fractional part of height */
197
    /********************************************/
198
8.56M
    UWORD32 i1_mc_wd;
199
200
8.56M
    WORD32 u1_dma_ht;
201
202
8.56M
    UWORD32 u1_dma_wd;
203
8.56M
    UWORD32 u1_dx;
204
8.56M
    UWORD32 u1_dy;
205
8.56M
    pred_info_t * ps_pred = ps_dec->ps_pred + ps_dec->u4_pred_info_idx;
206
8.56M
    dec_slice_params_t * const ps_cur_slice = ps_dec->ps_cur_slice;
207
8.56M
    tfr_ctxt_t *ps_frame_buf;
208
8.56M
    struct pic_buffer_t *ps_ref_frm;
209
8.56M
    UWORD8 u1_scale_ref,u1_mbaff,u1_field;
210
8.56M
    pic_buffer_t  **pps_ref_frame;
211
8.56M
    WORD8 i1_size_pos_info,i1_buf_id;
212
213
8.56M
    PROFILE_DISABLE_MB_PART_INFO()
214
215
8.56M
     UNUSED(ps_cur_mb_info);
216
8.56M
     i1_size_pos_info = ps_pred_pkd->i1_size_pos_info;
217
8.56M
     GET_XPOS_PRED(u1_sub_x,i1_size_pos_info);
218
8.56M
     GET_YPOS_PRED(u1_sub_y,i1_size_pos_info);
219
8.56M
     GET_WIDTH_PRED(u1_part_wd,i1_size_pos_info);
220
8.56M
     GET_HEIGHT_PRED(u1_part_ht,i1_size_pos_info);
221
8.56M
     i2_mv_x = ps_pred_pkd->i2_mv[0];
222
8.56M
     i2_mv_y = ps_pred_pkd->i2_mv[1];
223
8.56M
     i1_buf_id = ps_pred_pkd->i1_buf_id;
224
225
226
8.56M
     ps_ref_frm = ps_dec->apv_buf_id_pic_buf_map[i1_buf_id];
227
228
229
8.56M
    {
230
8.56M
        ps_frame_buf = &ps_dec->s_tran_addrecon;
231
8.56M
    }
232
233
234
    /* Transfer Setup Y */
235
8.56M
    {
236
8.56M
        UWORD8 *pu1_pred, *pu1_rec;
237
238
        /* calculating rounded motion vectors and fractional components */
239
8.56M
        i2_tmp_mv_x = i2_mv_x;
240
8.56M
        i2_tmp_mv_y = i2_mv_y;
241
8.56M
        u1_dx = i2_tmp_mv_x & 0x3;
242
8.56M
        u1_dy = i2_tmp_mv_y & 0x3;
243
8.56M
        i2_tmp_mv_x >>= 2;
244
8.56M
        i2_tmp_mv_y >>= 2;
245
8.56M
        i1_mc_wd = u1_part_wd << 2;
246
8.56M
        u1_dma_ht = u1_part_ht << 2;
247
8.56M
        if(u1_dx)
248
216k
        {
249
216k
            i2_tmp_mv_x -= 2;
250
216k
            i1_mc_wd += 5;
251
216k
        }
252
8.56M
        if(u1_dy)
253
197k
        {
254
197k
            i2_tmp_mv_y -= 2;
255
197k
            u1_dma_ht += 5;
256
197k
        }
257
258
        /********************************************************************/
259
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
260
        /* edge of the reference frame, and subsequent clipping             */
261
        /********************************************************************/
262
8.56M
        u2_pic_ht = ps_dec->u2_pic_ht;
263
8.56M
        u2_frm_wd = ps_dec->u2_frm_wd_y;
264
8.56M
        i2_rec_x = u1_sub_x << 2;
265
8.56M
        i2_rec_y = u1_sub_y << 2;
266
267
8.56M
        i2_frm_x = (u2_mb_x << 4) + i2_rec_x + i2_tmp_mv_x;
268
8.56M
        i2_frm_y = (u2_mb_y << 4) + i2_rec_y + i2_tmp_mv_y;
269
270
8.56M
        i2_frm_x = CLIP3(MAX_OFFSET_OUTSIDE_X_FRM, (ps_dec->u2_pic_wd - 1),
271
8.56M
                         i2_frm_x);
272
8.56M
        i2_frm_y = CLIP3(((1 - u1_dma_ht)), (u2_pic_ht - (1)), i2_frm_y);
273
274
8.56M
        pu1_pred = ps_ref_frm->pu1_buf1 + i2_frm_y * u2_frm_wd + i2_frm_x;
275
276
8.56M
        u1_dma_wd = (i1_mc_wd + 3) & 0xFC;
277
278
        /********************************************************************/
279
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
280
        /* edge of the recon buffer                                         */
281
        /********************************************************************/
282
8.56M
        u2_rec_wd = MB_SIZE;
283
8.56M
        {
284
8.56M
            u2_rec_wd = ps_dec->u2_frm_wd_y;
285
8.56M
            i2_rec_x += (mb_index << 4);
286
8.56M
            pu1_rec = ps_frame_buf->pu1_dest_y + i2_rec_y * u2_rec_wd
287
8.56M
                            + i2_rec_x;
288
8.56M
        }
289
290
        /* filling the pred and dma structures for Y */
291
8.56M
        u2_frm_wd = ps_dec->u2_frm_wd_y;
292
293
8.56M
        ps_pred->u2_u1_ref_buf_wd = u1_dma_wd;
294
8.56M
        ps_pred->i1_dma_ht = u1_dma_ht;
295
8.56M
        ps_pred->i1_mc_wd = i1_mc_wd;
296
8.56M
        ps_pred->u2_frm_wd = u2_frm_wd;
297
8.56M
        ps_pred->pu1_rec_y_u = pu1_rec;
298
8.56M
        ps_pred->u2_dst_stride = u2_rec_wd;
299
300
8.56M
        ps_pred->i1_mb_partwidth = u1_part_wd << 2;
301
8.56M
        ps_pred->i1_mb_partheight = u1_part_ht << 2;
302
8.56M
        ps_pred->u1_dydx = (u1_dy << 2) + u1_dx;
303
304
8.56M
        ps_pred->pu1_y_ref = pu1_pred;
305
306
8.56M
    }
307
308
    /* Increment ps_pred index */
309
8.56M
    ps_pred++;
310
311
    /* Transfer Setup U & V */
312
8.56M
    {
313
8.56M
        WORD32 i4_ref_offset, i4_rec_offset;
314
8.56M
        UWORD8 *pu1_pred_u, *pu1_pred_v;
315
316
317
        /* calculating rounded motion vectors and fractional components */
318
8.56M
        i2_tmp_mv_x = i2_mv_x;
319
8.56M
        i2_tmp_mv_y = i2_mv_y;
320
321
        /************************************************************************/
322
        /* Table 8-9: Derivation of the vertical component of the chroma vector */
323
        /* in field coding mode                                                 */
324
        /************************************************************************/
325
326
        /* Eighth sample of the chroma MV */
327
8.56M
        u1_dx = i2_tmp_mv_x & 0x7;
328
8.56M
        u1_dy = i2_tmp_mv_y & 0x7;
329
330
        /********************************************************************/
331
        /* Calculating the full pel MV for chroma which is 1/2 of the Luma  */
332
        /* MV in full pel units                                             */
333
        /********************************************************************/
334
8.56M
        i2_mv_x = i2_tmp_mv_x;
335
8.56M
        i2_mv_y = i2_tmp_mv_y;
336
8.56M
        i2_tmp_mv_x = SIGN_POW2_DIV(i2_tmp_mv_x, 3);
337
8.56M
        i2_tmp_mv_y = SIGN_POW2_DIV(i2_tmp_mv_y, 3);
338
8.56M
        i1_mc_wd = u1_part_wd << 1;
339
8.56M
        u1_dma_ht = u1_part_ht << 1;
340
8.56M
        if(u1_dx)
341
234k
        {
342
234k
            i2_tmp_mv_x -= (i2_mv_x < 0);
343
234k
            i1_mc_wd++;
344
234k
        }
345
8.56M
        if(u1_dy != 0)
346
221k
        {
347
221k
            i2_tmp_mv_y -= (i2_mv_y < 0);
348
221k
            u1_dma_ht++;
349
221k
        }
350
351
        /********************************************************************/
352
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
353
        /* edge of the reference frame, and subsequent clipping             */
354
        /********************************************************************/
355
8.56M
        u2_pic_ht >>= 1;
356
8.56M
        u2_frm_wd = ps_dec->u2_frm_wd_uv;
357
8.56M
        i2_rec_x = u1_sub_x << 1;
358
8.56M
        i2_rec_y = u1_sub_y << 1;
359
360
8.56M
        i2_frm_x = (u2_mb_x << 3) + i2_rec_x + i2_tmp_mv_x;
361
8.56M
        i2_frm_y = (u2_mb_y << 3) + i2_rec_y + i2_tmp_mv_y;
362
363
8.56M
        i2_frm_x = CLIP3(MAX_OFFSET_OUTSIDE_UV_FRM,
364
8.56M
                         ((ps_dec->u2_pic_wd >> 1) - 1), i2_frm_x);
365
8.56M
        i2_frm_y = CLIP3(((1 - u1_dma_ht)), (u2_pic_ht - (1)), i2_frm_y);
366
367
8.56M
        i4_ref_offset = i2_frm_y * u2_frm_wd + i2_frm_x * YUV420SP_FACTOR;
368
8.56M
        u1_dma_wd = (i1_mc_wd + 3) & 0xFC;
369
370
        /********************************************************************/
371
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
372
        /* edge of the recon buffer                                         */
373
        /********************************************************************/
374
        /* CHANGED CODE */
375
8.56M
        u2_rec_wd = BLK8x8SIZE * YUV420SP_FACTOR;
376
8.56M
        i4_rec_offset = i2_rec_y * u2_rec_wd + i2_rec_x * YUV420SP_FACTOR;
377
378
8.56M
        {
379
8.56M
            u2_rec_wd = ps_dec->u2_frm_wd_uv;
380
8.56M
            i2_rec_x += (mb_index << 3);
381
8.56M
            i4_rec_offset = i2_rec_y * u2_rec_wd + i2_rec_x * YUV420SP_FACTOR;
382
8.56M
            ps_pred->pu1_rec_y_u = ps_frame_buf->pu1_dest_u + i4_rec_offset;
383
8.56M
            ps_pred->u1_pi1_wt_ofst_rec_v = ps_frame_buf->pu1_dest_v
384
8.56M
                            + i4_rec_offset;
385
8.56M
        }
386
387
        /* CHANGED CODE */
388
389
        /* filling the common pred structures for U */
390
8.56M
        u2_frm_wd = ps_dec->u2_frm_wd_uv;
391
392
8.56M
        ps_pred->u2_u1_ref_buf_wd = u1_dma_wd;
393
8.56M
        ps_pred->i1_dma_ht = u1_dma_ht;
394
8.56M
        ps_pred->i1_mc_wd = i1_mc_wd;
395
396
8.56M
        ps_pred->u2_frm_wd = u2_frm_wd;
397
8.56M
        ps_pred->u2_dst_stride = u2_rec_wd;
398
399
8.56M
        ps_pred->i1_mb_partwidth = u1_part_wd << 1;
400
8.56M
        ps_pred->i1_mb_partheight = u1_part_ht << 1;
401
8.56M
        ps_pred->u1_dydx = (u1_dy << 3) + u1_dx;
402
403
8.56M
        pu1_pred_u = ps_ref_frm->pu1_buf2 + i4_ref_offset;
404
8.56M
        pu1_pred_v = ps_ref_frm->pu1_buf3 + i4_ref_offset;
405
406
        /* Copy U & V partitions */
407
8.56M
        ps_pred->pu1_u_ref = pu1_pred_u;
408
409
        /* Increment the reference buffer Index */
410
8.56M
        ps_pred->pu1_v_ref = pu1_pred_v;
411
8.56M
    }
412
413
    /* Increment ps_pred index */
414
8.56M
    ps_dec->u4_pred_info_idx += 2;
415
416
8.56M
    return OK;
417
418
8.56M
}
419
420
421
/*****************************************************************************/
422
/* \if Function name : formMbPartInfo \endif                                 */
423
/*                                                                           */
424
/* \brief                                                                    */
425
/*    Form the Mb partition information structure, to be used by the MC      */
426
/*    routine                                                                */
427
/*                                                                           */
428
/* \return                                                                   */
429
/*    None                                                                   */
430
/* \note                                                                     */
431
/*    c_bufx is used to select PredBuffer,                                   */
432
/*    if it's only Forward/Backward prediction always buffer used is         */
433
/*    puc_MbLumaPredBuffer[0 to X1],pu1_mb_cb_pred_buffer[0 to X1] and          */
434
/*    pu1_mb_cr_pred_buffer[0 to X1]                                            */
435
/*                                                                           */
436
/*    if it's bidirect for forward ..PredBuffer[0 to X1] buffer is used and  */
437
/*    ..PredBuffer[X2 to X3] for backward prediction. and                    */
438
/*                                                                           */
439
/*    Final predicted samples values are the average of ..PredBuffer[0 to X1]*/
440
/*    and ..PredBuffer[X2 to X3]                                             */
441
/*                                                                           */
442
/*    X1 is 255 for Luma and 63 for Chroma                                   */
443
/*    X2 is 256 for Luma and 64 for Chroma                                   */
444
/*    X3 is 511 for Luma and 127 for Chroma                                  */
445
/*                                                                           */
446
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
447
/*         11 05 2005   SWRN            Modified to handle pod               */
448
/*****************************************************************************/
449
WORD32 ih264d_form_mb_part_info_mp(pred_info_pkd_t *ps_pred_pkd,
450
                                 dec_struct_t * ps_dec,
451
                                 UWORD16 u2_mb_x,
452
                                 UWORD16 u2_mb_y,
453
                                 WORD32 mb_index,
454
                                 dec_mb_info_t *ps_cur_mb_info)
455
29.5M
{
456
    /* The reference buffer pointer */
457
29.5M
    UWORD8 *pu1_ref_buf;
458
29.5M
    WORD16 i2_frm_x, i2_frm_y, i2_tmp_mv_x, i2_tmp_mv_y, i2_pod_ht;
459
29.5M
    WORD16 i2_rec_x, i2_rec_y;
460
29.5M
    UWORD16 u2_pic_ht, u2_frm_wd, u2_rec_wd;
461
29.5M
    UWORD8 u1_wght_pred_type, u1_wted_bipred_idc;
462
29.5M
    UWORD16 u2_tot_ref_scratch_size;
463
29.5M
    UWORD8 u1_sub_x = 0;
464
29.5M
    UWORD8 u1_sub_y = 0;
465
29.5M
    UWORD8 u1_is_bi_dir = 0;
466
467
    /********************************************/
468
    /* i1_mc_wd       width reqd for mcomp      */
469
    /* u1_dma_ht      height reqd for mcomp     */
470
    /* u1_dma_wd      width aligned to 4 bytes  */
471
    /* u1_dx          fractional part of width  */
472
    /* u1_dx          fractional part of height */
473
    /********************************************/
474
29.5M
    UWORD8 i1_mc_wd, u1_dma_ht, u1_dma_wd, u1_dx, u1_dy;
475
29.5M
    pred_info_t * ps_pred ;
476
29.5M
    dec_slice_params_t * const ps_cur_slice = ps_dec->ps_cur_slice;
477
29.5M
    const UWORD8 u1_slice_type = ps_dec->ps_decode_cur_slice->slice_type;
478
29.5M
    UWORD8 u1_pod_bot, u1_pod_top;
479
480
    /* load the pictype for pod u4_flag & chroma motion vector derivation */
481
29.5M
    UWORD8 u1_ref_pic_type ;
482
483
    /* set default value to flags specifying field nature of picture & mb */
484
29.5M
    UWORD32 u1_mb_fld = 0, u1_mb_or_pic_fld;
485
29.5M
    UWORD32 u1_mb_bot = 0, u1_pic_bot = 0, u1_mb_or_pic_bot;
486
29.5M
    tfr_ctxt_t *ps_frame_buf;
487
    /* calculate flags specifying field nature of picture & mb */
488
29.5M
    const UWORD32 u1_pic_fld = ps_cur_slice->u1_field_pic_flag;
489
29.5M
    WORD8 i1_pred;
490
29.5M
    WORD8 i1_size_pos_info,i1_buf_id,i1_ref_idx;
491
29.5M
    UWORD8 u1_part_wd,u1_part_ht;
492
29.5M
    WORD16 i2_mv_x,i2_mv_y;
493
29.5M
    struct pic_buffer_t *ps_ref_frm;
494
29.5M
    UWORD32 *pu4_wt_offset;
495
29.5M
    UWORD8 *pu1_buf1,*pu1_buf2,*pu1_buf3;
496
497
498
29.5M
    PROFILE_DISABLE_MB_PART_INFO()
499
500
29.5M
    ps_pred = ps_dec->ps_pred + ps_dec->u4_pred_info_idx;
501
502
503
29.5M
     i1_size_pos_info = ps_pred_pkd->i1_size_pos_info;
504
29.5M
     GET_XPOS_PRED(u1_sub_x,i1_size_pos_info);
505
29.5M
     GET_YPOS_PRED(u1_sub_y,i1_size_pos_info);
506
29.5M
     GET_WIDTH_PRED(u1_part_wd,i1_size_pos_info);
507
29.5M
     GET_HEIGHT_PRED(u1_part_ht,i1_size_pos_info);
508
29.5M
     i2_mv_x = ps_pred_pkd->i2_mv[0];
509
29.5M
     i2_mv_y = ps_pred_pkd->i2_mv[1];
510
29.5M
     i1_ref_idx = ps_pred_pkd->i1_ref_idx_info & 0x3f;
511
29.5M
     i1_buf_id = ps_pred_pkd->i1_buf_id;
512
29.5M
     ps_ref_frm = ps_dec->apv_buf_id_pic_buf_map[i1_buf_id];
513
514
29.5M
     i1_pred = (ps_pred_pkd->i1_ref_idx_info & 0xC0) >> 6;
515
29.5M
     u1_is_bi_dir = (i1_pred == BI_PRED);
516
517
518
29.5M
    u1_ref_pic_type = ps_pred_pkd->u1_pic_type & PIC_MASK;
519
520
29.5M
    pu1_buf1  = ps_ref_frm->pu1_buf1;
521
29.5M
    pu1_buf2  = ps_ref_frm->pu1_buf2;
522
29.5M
    pu1_buf3  = ps_ref_frm->pu1_buf3;
523
524
29.5M
    if(u1_ref_pic_type == BOT_FLD)
525
197k
    {
526
197k
        pu1_buf1 += ps_ref_frm->u2_frm_wd_y;
527
197k
        pu1_buf2 += ps_ref_frm->u2_frm_wd_uv;
528
197k
        pu1_buf3 += ps_ref_frm->u2_frm_wd_uv;
529
530
197k
    }
531
532
533
534
29.5M
    if(ps_dec->ps_cur_pps->u1_wted_pred_flag)
535
17.8M
    {
536
17.8M
            pu4_wt_offset = (UWORD32*)&ps_dec->pu4_wt_ofsts[2
537
17.8M
                            * X3(i1_ref_idx)];
538
17.8M
    }
539
540
541
29.5M
    pu4_wt_offset = ps_pred_pkd->pu4_wt_offst;
542
543
544
    /* Pointer to the frame buffer */
545
29.5M
    {
546
29.5M
        ps_frame_buf = &ps_dec->s_tran_addrecon;
547
        /* CHANGED CODE */
548
29.5M
    }
549
550
29.5M
    if(!u1_pic_fld)
551
27.8M
    {
552
27.8M
        u1_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
553
27.8M
        u1_mb_bot = 1 - ps_cur_mb_info->u1_topmb;
554
27.8M
    }
555
1.67M
    else
556
1.67M
        u1_pic_bot = ps_cur_slice->u1_bottom_field_flag;
557
558
    /****************************************************************/
559
    /* calculating the flags the tell whether to use frame-padding  */
560
    /* or use software pad-on-demand                                */
561
    /****************************************************************/
562
29.5M
    u1_mb_or_pic_bot = u1_mb_bot | u1_pic_bot;
563
29.5M
    u1_mb_or_pic_fld = u1_mb_fld | u1_pic_fld;
564
29.5M
    u1_pod_bot = u1_mb_or_pic_fld && (u1_ref_pic_type == TOP_FLD);
565
29.5M
    u1_pod_top = u1_mb_or_pic_fld && (u1_ref_pic_type == BOT_FLD);
566
567
    /* Weighted Pred additions */
568
29.5M
    u1_wted_bipred_idc = ps_dec->ps_cur_pps->u1_wted_bipred_idc;
569
570
29.5M
    if((u1_slice_type == P_SLICE) || (u1_slice_type == SP_SLICE))
571
15.3M
    {
572
        /* P Slice only */
573
15.3M
        u1_wght_pred_type = ps_dec->ps_cur_pps->u1_wted_pred_flag;
574
575
15.3M
    }
576
14.1M
    else
577
14.1M
    {
578
        /* B Slice only */
579
14.1M
        u1_wght_pred_type = 1 + u1_is_bi_dir;
580
14.1M
        if(u1_wted_bipred_idc == 0)
581
2.96M
            u1_wght_pred_type = 0;
582
14.1M
        if((u1_wted_bipred_idc == 2) && (!u1_is_bi_dir))
583
1.41M
            u1_wght_pred_type = 0;
584
14.1M
    }
585
    /* load the scratch reference buffer index */
586
29.5M
    pu1_ref_buf = ps_dec->pu1_ref_buff + ps_dec->u4_dma_buf_idx;
587
29.5M
    u2_tot_ref_scratch_size = 0;
588
589
590
    /* Transfer Setup Y */
591
29.5M
    {
592
29.5M
        UWORD8 *pu1_pred, *pu1_rec;
593
        /* calculating rounded motion vectors and fractional components */
594
29.5M
        i2_tmp_mv_x = i2_mv_x;
595
29.5M
        i2_tmp_mv_y = i2_mv_y;
596
597
29.5M
        u1_dx = i2_tmp_mv_x & 0x3;
598
29.5M
        u1_dy = i2_tmp_mv_y & 0x3;
599
29.5M
        i2_tmp_mv_x >>= 2;
600
29.5M
        i2_tmp_mv_y >>= 2;
601
29.5M
        i1_mc_wd = u1_part_wd << 2;
602
29.5M
        u1_dma_ht = u1_part_ht << 2;
603
29.5M
        if(u1_dx)
604
1.21M
        {
605
1.21M
            i2_tmp_mv_x -= 2;
606
1.21M
            i1_mc_wd += 5;
607
1.21M
        }
608
29.5M
        if(u1_dy)
609
991k
        {
610
991k
            i2_tmp_mv_y -= 2;
611
991k
            u1_dma_ht += 5;
612
991k
        }
613
614
        /********************************************************************/
615
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
616
        /* edge of the reference frame, and subsequent clipping             */
617
        /********************************************************************/
618
29.5M
        u2_pic_ht = ps_dec->u2_pic_ht >> u1_pic_fld;
619
29.5M
        u2_frm_wd = ps_dec->u2_frm_wd_y << u1_pic_fld;
620
29.5M
        i2_frm_x = (u2_mb_x << 4) + (u1_sub_x << 2) + i2_tmp_mv_x;
621
29.5M
        i2_frm_y = ((u2_mb_y + (u1_mb_bot && !u1_mb_fld)) << 4)
622
29.5M
                        + (((u1_sub_y << 2) + i2_tmp_mv_y) << u1_mb_fld);
623
624
29.5M
        i2_frm_x = CLIP3(MAX_OFFSET_OUTSIDE_X_FRM, (ps_dec->u2_pic_wd - 1),
625
29.5M
                         i2_frm_x);
626
29.5M
        i2_frm_y = CLIP3(((1 - u1_dma_ht) << u1_mb_fld),
627
29.5M
                         (u2_pic_ht - (1 << u1_mb_fld)), i2_frm_y);
628
629
29.5M
        pu1_pred = pu1_buf1 + i2_frm_y * u2_frm_wd + i2_frm_x;
630
29.5M
        u1_dma_wd = (i1_mc_wd + 3) & 0xFC;
631
        /********************************************************************/
632
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
633
        /* edge of the recon buffer                                         */
634
        /********************************************************************/
635
        /* CHANGED CODE */
636
29.5M
        u2_rec_wd = MB_SIZE;
637
29.5M
        i2_rec_x = u1_sub_x << 2;
638
29.5M
        i2_rec_y = u1_sub_y << 2;
639
29.5M
        {
640
29.5M
            u2_rec_wd = ps_dec->u2_frm_wd_y << u1_mb_or_pic_fld;
641
29.5M
            i2_rec_x += (mb_index << 4);
642
29.5M
            pu1_rec = ps_frame_buf->pu1_dest_y + i2_rec_y * u2_rec_wd
643
29.5M
                            + i2_rec_x;
644
29.5M
            if(u1_mb_bot)
645
788k
                pu1_rec += ps_dec->u2_frm_wd_y << ((u1_mb_fld) ? 0 : 4);
646
29.5M
        }
647
648
        /* CHANGED CODE */
649
650
        /* filling the pred and dma structures for Y */
651
29.5M
        u2_frm_wd = ps_dec->u2_frm_wd_y << u1_mb_or_pic_fld;
652
653
29.5M
        ps_pred->pu1_dma_dest_addr = pu1_ref_buf;
654
29.5M
        ps_pred->u2_u1_ref_buf_wd = u1_dma_wd;
655
29.5M
        ps_pred->u2_frm_wd = u2_frm_wd;
656
29.5M
        ps_pred->i1_dma_ht = u1_dma_ht;
657
29.5M
        ps_pred->i1_mc_wd = i1_mc_wd;
658
29.5M
        ps_pred->pu1_rec_y_u = pu1_rec;
659
29.5M
        ps_pred->u2_dst_stride = u2_rec_wd;
660
661
29.5M
        ps_pred->i1_mb_partwidth = u1_part_wd << 2;
662
29.5M
        ps_pred->i1_mb_partheight = u1_part_ht << 2;
663
29.5M
        ps_pred->u1_dydx = (u1_dy << 2) + u1_dx;
664
29.5M
        ps_pred->u1_is_bi_direct = u1_is_bi_dir;
665
29.5M
        ps_pred->u1_pi1_wt_ofst_rec_v = (UWORD8 *)pu4_wt_offset;
666
29.5M
        ps_pred->u1_wght_pred_type = u1_wght_pred_type;
667
29.5M
        ps_pred->i1_pod_ht = 0;
668
669
        /* Increment the Reference buffer Indices */
670
29.5M
        pu1_ref_buf += u1_dma_wd * u1_dma_ht;
671
29.5M
        u2_tot_ref_scratch_size += u1_dma_wd * u1_dma_ht;
672
673
        /* unrestricted field motion comp for top region outside frame */
674
29.5M
        i2_pod_ht = (-i2_frm_y) >> u1_mb_fld;
675
29.5M
        if((i2_pod_ht > 0) && u1_pod_top)
676
823
        {
677
823
            ps_pred->i1_pod_ht = (WORD8)(-i2_pod_ht);
678
823
            u1_dma_ht -= i2_pod_ht;
679
823
            pu1_pred += i2_pod_ht * u2_frm_wd;
680
823
        }
681
        /* unrestricted field motion comp for bottom region outside frame */
682
29.5M
        else if(u1_pod_bot)
683
906k
        {
684
906k
            i2_pod_ht = u1_dma_ht + ((i2_frm_y - u2_pic_ht) >> u1_mb_fld);
685
906k
            if(i2_pod_ht > 0)
686
137
            {
687
137
                u1_dma_ht -= i2_pod_ht;
688
137
                ps_pred->i1_pod_ht = (WORD8)i2_pod_ht;
689
137
            }
690
906k
        }
691
692
        /* Copy Y partition */
693
694
        /*
695
         * ps_pred->i1_pod_ht is non zero when MBAFF is present. In case of MBAFF the reference data
696
         * is copied in the Scrath buffer so that the padding_on_demand doesnot corrupt the frame data
697
         */
698
29.5M
        if(ps_pred->i1_pod_ht)
699
960
        {
700
960
            ps_pred->pu1_pred = pu1_pred;
701
960
            ps_pred->u1_dma_ht_y = u1_dma_ht;
702
960
            ps_pred->u1_dma_wd_y = u1_dma_wd;
703
960
        }
704
29.5M
        ps_pred->pu1_y_ref = pu1_pred;
705
29.5M
    }
706
707
708
709
    /* Increment ps_pred index */
710
29.5M
    ps_pred++;
711
712
    /* Transfer Setup U & V */
713
29.5M
    {
714
29.5M
        WORD32 i4_ref_offset, i4_rec_offset;
715
29.5M
        UWORD8 *pu1_pred_u, *pu1_pred_v, u1_tmp_dma_ht;
716
        /* CHANGED CODE */
717
29.5M
        UWORD8 u1_chroma_cbp = (UWORD8)(ps_cur_mb_info->u1_cbp >> 4);
718
        /* CHANGED CODE */
719
720
        /* calculating rounded motion vectors and fractional components */
721
29.5M
        i2_tmp_mv_x = i2_mv_x;
722
29.5M
        i2_tmp_mv_y = i2_mv_y;
723
724
        /************************************************************************/
725
        /* Table 8-9: Derivation of the vertical component of the chroma vector */
726
        /* in field coding mode                                                 */
727
        /************************************************************************/
728
29.5M
        if(u1_pod_bot && u1_mb_or_pic_bot)
729
96.0k
            i2_tmp_mv_y += 2;
730
29.5M
        if(u1_pod_top && !u1_mb_or_pic_bot)
731
90.2k
            i2_tmp_mv_y -= 2;
732
733
        /* Eighth sample of the chroma MV */
734
29.5M
        u1_dx = i2_tmp_mv_x & 0x7;
735
29.5M
        u1_dy = i2_tmp_mv_y & 0x7;
736
737
        /********************************************************************/
738
        /* Calculating the full pel MV for chroma which is 1/2 of the Luma  */
739
        /* MV in full pel units                                             */
740
        /********************************************************************/
741
29.5M
        i2_mv_x = i2_tmp_mv_x;
742
29.5M
        i2_mv_y = i2_tmp_mv_y;
743
29.5M
        i2_tmp_mv_x = SIGN_POW2_DIV(i2_tmp_mv_x, 3);
744
29.5M
        i2_tmp_mv_y = SIGN_POW2_DIV(i2_tmp_mv_y, 3);
745
29.5M
        i1_mc_wd = u1_part_wd << 1;
746
29.5M
        u1_dma_ht = u1_part_ht << 1;
747
29.5M
        if(u1_dx)
748
1.36M
        {
749
1.36M
            if(i2_mv_x < 0)
750
531k
                i2_tmp_mv_x -= 1;
751
1.36M
            i1_mc_wd++;
752
1.36M
        }
753
29.5M
        if(u1_dy != 0)
754
1.30M
        {
755
1.30M
            if(i2_mv_y < 0)
756
560k
                i2_tmp_mv_y -= 1;
757
1.30M
            u1_dma_ht++;
758
1.30M
        }
759
760
        /********************************************************************/
761
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
762
        /* edge of the reference frame, and subsequent clipping             */
763
        /********************************************************************/
764
29.5M
        u2_pic_ht >>= 1;
765
29.5M
        u2_frm_wd = ps_dec->u2_frm_wd_uv << u1_pic_fld;
766
29.5M
        i2_frm_x = (u2_mb_x << 3) + (u1_sub_x << 1) + i2_tmp_mv_x;
767
29.5M
        i2_frm_y = ((u2_mb_y + (u1_mb_bot && !u1_mb_fld)) << 3)
768
29.5M
                        + (((u1_sub_y << 1) + i2_tmp_mv_y) << u1_mb_fld);
769
770
29.5M
        i2_frm_x = CLIP3(MAX_OFFSET_OUTSIDE_UV_FRM,
771
29.5M
                         ((ps_dec->u2_pic_wd >> 1) - 1), i2_frm_x);
772
29.5M
        i2_frm_y = CLIP3(((1 - u1_dma_ht) << u1_mb_fld),
773
29.5M
                         (u2_pic_ht - (1 << u1_mb_fld)), i2_frm_y);
774
775
29.5M
        i4_ref_offset = i2_frm_y * u2_frm_wd + i2_frm_x * YUV420SP_FACTOR;
776
29.5M
        u1_dma_wd = (i1_mc_wd + 3) & 0xFC;
777
778
        /********************************************************************/
779
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
780
        /* edge of the recon buffer                                         */
781
        /********************************************************************/
782
        /* CHANGED CODE */
783
29.5M
        u2_rec_wd = BLK8x8SIZE * YUV420SP_FACTOR;
784
29.5M
        i2_rec_x = u1_sub_x << 1;
785
29.5M
        i2_rec_y = u1_sub_y << 1;
786
29.5M
        i4_rec_offset = i2_rec_y * u2_rec_wd + i2_rec_x * YUV420SP_FACTOR;
787
29.5M
        {
788
29.5M
            u2_rec_wd = ps_dec->u2_frm_wd_uv << u1_mb_or_pic_fld;
789
790
29.5M
            i2_rec_x += (mb_index << 3);
791
29.5M
            i4_rec_offset = i2_rec_y * u2_rec_wd + i2_rec_x * YUV420SP_FACTOR;
792
29.5M
            if(u1_mb_bot)
793
788k
                i4_rec_offset += ps_dec->u2_frm_wd_uv << ((u1_mb_fld) ? 0 : 3);
794
29.5M
            ps_pred->pu1_rec_y_u = ps_frame_buf->pu1_dest_u + i4_rec_offset;
795
29.5M
            ps_pred->u1_pi1_wt_ofst_rec_v = ps_frame_buf->pu1_dest_v
796
29.5M
                            + i4_rec_offset;
797
798
29.5M
        }
799
800
        /* CHANGED CODE */
801
802
        /* filling the common pred structures for U */
803
29.5M
        u2_frm_wd = ps_dec->u2_frm_wd_uv << u1_mb_or_pic_fld;
804
29.5M
        u1_tmp_dma_ht = u1_dma_ht;
805
29.5M
        ps_pred->u2_u1_ref_buf_wd = u1_dma_wd;
806
29.5M
        ps_pred->u2_frm_wd = u2_frm_wd;
807
29.5M
        ps_pred->i1_dma_ht = u1_dma_ht;
808
29.5M
        ps_pred->i1_mc_wd = i1_mc_wd;
809
29.5M
        ps_pred->u2_dst_stride = u2_rec_wd;
810
811
29.5M
        ps_pred->i1_mb_partwidth = u1_part_wd << 1;
812
29.5M
        ps_pred->i1_mb_partheight = u1_part_ht << 1;
813
29.5M
        ps_pred->u1_dydx = (u1_dy << 3) + u1_dx;
814
29.5M
        ps_pred->u1_is_bi_direct = u1_is_bi_dir;
815
29.5M
        ps_pred->u1_wght_pred_type = u1_wght_pred_type;
816
29.5M
        ps_pred->i1_pod_ht = 0;
817
818
29.5M
        ps_pred->pu1_dma_dest_addr = pu1_ref_buf;
819
820
        /* unrestricted field motion comp for top region outside frame */
821
29.5M
        i2_pod_ht = (-i2_frm_y) >> u1_mb_fld;
822
29.5M
        if((i2_pod_ht > 0) && u1_pod_top)
823
8.45k
        {
824
8.45k
            i4_ref_offset += i2_pod_ht * u2_frm_wd;
825
8.45k
            u1_dma_ht -= i2_pod_ht;
826
8.45k
            ps_pred->i1_pod_ht = (WORD8)(-i2_pod_ht);
827
8.45k
        }
828
        /* unrestricted field motion comp for bottom region outside frame */
829
29.5M
        else if(u1_pod_bot)
830
906k
        {
831
906k
            i2_pod_ht = u1_dma_ht + ((i2_frm_y - u2_pic_ht) >> u1_mb_fld);
832
906k
            if(i2_pod_ht > 0)
833
7.64k
            {
834
7.64k
                u1_dma_ht -= i2_pod_ht;
835
7.64k
                ps_pred->i1_pod_ht = (WORD8)i2_pod_ht;
836
7.64k
            }
837
906k
        }
838
839
29.5M
        pu1_pred_u = pu1_buf2 + i4_ref_offset;
840
29.5M
        pu1_pred_v = pu1_buf3 + i4_ref_offset;
841
842
        /* Copy U & V partitions */
843
29.5M
        if(ps_pred->i1_pod_ht)
844
16.1k
        {
845
16.1k
            ps_pred->pu1_pred_u = pu1_pred_u;
846
16.1k
            ps_pred->u1_dma_ht_uv = u1_dma_ht;
847
16.1k
            ps_pred->u1_dma_wd_uv = u1_dma_wd;
848
849
16.1k
        }
850
29.5M
        ps_pred->pu1_u_ref = pu1_pred_u;
851
852
        /* Increment the reference buffer Index */
853
29.5M
        u2_tot_ref_scratch_size += (u1_dma_wd * u1_tmp_dma_ht) << 1;
854
855
29.5M
        if(ps_pred->i1_pod_ht)
856
16.1k
        {
857
16.1k
            ps_pred->pu1_pred_v = pu1_pred_v;
858
16.1k
            ps_pred->u1_dma_ht_uv = u1_dma_ht;
859
16.1k
            ps_pred->u1_dma_wd_uv = u1_dma_wd;
860
16.1k
        }
861
862
29.5M
        ps_pred->pu1_v_ref = pu1_pred_v;
863
29.5M
    }
864
865
    /* Increment ps_pred index */
866
29.5M
    ps_dec->u4_pred_info_idx += 2;
867
868
869
    /* Increment the reference buffer Index */
870
29.5M
    ps_dec->u4_dma_buf_idx += u2_tot_ref_scratch_size;
871
872
29.5M
    if(ps_dec->u4_dma_buf_idx > MAX_REF_BUF_SIZE)
873
0
        return ERROR_NUM_MV;
874
875
29.5M
    return OK;
876
877
878
879
29.5M
}
880
881
882
/*!
883
 **************************************************************************
884
 * \if Function name : MotionCompensate \endif
885
 *
886
 * \brief
887
 *    The routine forms predictor blocks for the entire MB and stores it in
888
 *    predictor buffers.This function works only for BASELINE profile
889
 *
890
 * \param ps_dec: Pointer to the structure decStruct. This is used to get
891
 *     pointers to the current and the reference frame and to the MbParams
892
 *     structure.
893
 *
894
 * \return
895
 *    None
896
 *
897
 * \note
898
 *    The routine forms predictors for all the luma and the chroma MB
899
 *    partitions.
900
 **************************************************************************
901
 */
902
903
void ih264d_motion_compensate_bp(dec_struct_t * ps_dec, dec_mb_info_t *ps_cur_mb_info)
904
8.34M
{
905
8.34M
    pred_info_t *ps_pred ;
906
8.34M
    UWORD8 *puc_ref, *pu1_dest_y;
907
8.34M
    UWORD8 *pu1_dest_u;
908
8.34M
    UWORD32 u2_num_pels, u2_ref_wd_y, u2_ref_wd_uv, u2_dst_wd;
909
910
8.34M
    UWORD32 u4_wd_y, u4_ht_y, u4_wd_uv;
911
8.34M
    UWORD32 u4_ht_uv;
912
8.34M
    UWORD8 *puc_pred0 = (UWORD8 *)(ps_dec->pi2_pred1);
913
914
915
8.34M
    PROFILE_DISABLE_INTER_PRED()
916
8.34M
    UNUSED(ps_cur_mb_info);
917
8.34M
    ps_pred = ps_dec->ps_pred ;
918
919
16.9M
    for(u2_num_pels = 0; u2_num_pels < 256;)
920
8.56M
    {
921
8.56M
        UWORD32 uc_dx, uc_dy;
922
        /* Pointer to the destination buffer. If the CBPs of all 8x8 blocks in
923
         the MB partition are zero then it would be better to copy the
924
         predictor valus directly to the current frame buffer */
925
        /*
926
         * ps_pred->i1_pod_ht is non zero when MBAFF is present. In case of MBAFF the reference data
927
         * is copied in the Scrath buffer so that the padding_on_demand doesnot corrupt the frame data
928
         */
929
930
8.56M
        u2_ref_wd_y = ps_pred->u2_frm_wd;
931
8.56M
        puc_ref = ps_pred->pu1_y_ref;
932
8.56M
        if(ps_pred->u1_dydx & 0x3)
933
216k
            puc_ref += 2;
934
8.56M
        if(ps_pred->u1_dydx >> 2)
935
197k
            puc_ref += 2 * u2_ref_wd_y;
936
937
8.56M
        u4_wd_y = ps_pred->i1_mb_partwidth;
938
8.56M
        u4_ht_y = ps_pred->i1_mb_partheight;
939
8.56M
        uc_dx = ps_pred->u1_dydx;
940
8.56M
        uc_dy = uc_dx >> 2;
941
8.56M
        uc_dx &= 0x3;
942
943
8.56M
        pu1_dest_y = ps_pred->pu1_rec_y_u;
944
8.56M
        u2_dst_wd = ps_pred->u2_dst_stride;
945
946
8.56M
        ps_dec->apf_inter_pred_luma[ps_pred->u1_dydx](puc_ref, pu1_dest_y,
947
8.56M
                                                      u2_ref_wd_y,
948
8.56M
                                                      u2_dst_wd,
949
8.56M
                                                      u4_ht_y,
950
8.56M
                                                      u4_wd_y, puc_pred0,
951
8.56M
                                                      ps_pred->u1_dydx);
952
953
8.56M
        ps_pred++;
954
955
        /* Interpolate samples for the chroma components */
956
8.56M
        {
957
8.56M
            UWORD8 *pu1_ref_u;
958
959
8.56M
            u2_ref_wd_uv = ps_pred->u2_frm_wd;
960
8.56M
            pu1_ref_u = ps_pred->pu1_u_ref;
961
962
8.56M
            u4_wd_uv = ps_pred->i1_mb_partwidth;
963
8.56M
            u4_ht_uv = ps_pred->i1_mb_partheight;
964
8.56M
            uc_dx = ps_pred->u1_dydx; /* 8*dy + dx */
965
8.56M
            uc_dy = uc_dx >> 3;
966
8.56M
            uc_dx &= 0x7;
967
968
8.56M
            pu1_dest_u = ps_pred->pu1_rec_y_u;
969
8.56M
            u2_dst_wd = ps_pred->u2_dst_stride;
970
971
8.56M
            ps_pred++;
972
8.56M
            ps_dec->pf_inter_pred_chroma(pu1_ref_u, pu1_dest_u, u2_ref_wd_uv,
973
8.56M
                                         u2_dst_wd, uc_dx, uc_dy,
974
8.56M
                                         u4_ht_uv, u4_wd_uv);
975
976
8.56M
        }
977
978
8.56M
        u2_num_pels += (UWORD8)u4_wd_y * (UWORD8)u4_ht_y;
979
980
8.56M
    }
981
8.34M
}
982
983
984
/*
985
 **************************************************************************
986
 * \if Function name : MotionCompensateB \endif
987
 *
988
 * \brief
989
 *    The routine forms predictor blocks for the entire MB and stores it in
990
 *    predictor buffers.
991
 *
992
 * \param ps_dec: Pointer to the structure decStruct. This is used to get
993
 *     pointers to the current and the reference frame and to the MbParams
994
 *     structure.
995
 *
996
 * \return
997
 *    None
998
 *
999
 * \note
1000
 *    The routine forms predictors for all the luma and the chroma MB
1001
 *    partitions.
1002
 **************************************************************************
1003
 */
1004
1005
void ih264d_motion_compensate_mp(dec_struct_t * ps_dec, dec_mb_info_t *ps_cur_mb_info)
1006
23.2M
{
1007
23.2M
    pred_info_t *ps_pred ;
1008
23.2M
    pred_info_t *ps_pred_y_forw, *ps_pred_y_back, *ps_pred_cr_forw;
1009
23.2M
    UWORD8 *puc_ref, *pu1_dest_y, *puc_pred0, *puc_pred1;
1010
23.2M
    UWORD8 *pu1_dest_u, *pu1_dest_v;
1011
23.2M
    WORD16 *pi16_intm;
1012
23.2M
    UWORD32 u2_num_pels, u2_ref_wd_y, u2_ref_wd_uv, u2_dst_wd;
1013
23.2M
    UWORD32 u2_dest_wd_y, u2_dest_wd_uv;
1014
23.2M
    UWORD32 u2_row_buf_wd_y = 0;
1015
23.2M
    UWORD32 u2_row_buf_wd_uv = 0;
1016
23.2M
    UWORD32 u2_log2Y_crwd;
1017
23.2M
    UWORD32 u4_wd_y, u4_ht_y, u1_dir, u4_wd_uv;
1018
23.2M
    UWORD32 u4_ht_uv;
1019
23.2M
    UWORD8 *pu1_temp_mc_buffer = ps_dec->pu1_temp_mc_buffer;
1020
23.2M
    WORD32 i2_pod_ht;
1021
23.2M
    UWORD32 u2_pic_ht, u2_frm_wd, u2_rec_wd;
1022
23.2M
    UWORD32 u1_pod_bot, u1_pod_top;
1023
23.2M
    UWORD8 *pu1_pred, *pu1_dma_dst;
1024
23.2M
    UWORD32 u1_dma_wd, u1_dma_ht;
1025
1026
23.2M
    dec_slice_params_t * const ps_cur_slice = ps_dec->ps_cur_slice;
1027
1028
    /* set default value to flags specifying field nature of picture & mb */
1029
23.2M
    UWORD32 u1_mb_fld = 0, u1_mb_or_pic_fld;
1030
23.2M
    UWORD32 u1_mb_or_pic_bot;
1031
    /* calculate flags specifying field nature of picture & mb */
1032
23.2M
    const UWORD8 u1_pic_fld = ps_cur_slice->u1_field_pic_flag;
1033
1034
23.2M
    PROFILE_DISABLE_INTER_PRED()
1035
23.2M
    ps_pred = ps_dec->ps_pred ;
1036
    /* Initialize both ps_pred_y_forw, ps_pred_cr_forw and ps_pred_y_back
1037
     * to avoid static analysis warnings */
1038
23.2M
    ps_pred_y_forw = ps_pred;
1039
23.2M
    ps_pred_y_back = ps_pred;
1040
23.2M
    ps_pred_cr_forw = ps_pred;
1041
1042
23.2M
    u2_log2Y_crwd = ps_dec->ps_decode_cur_slice->u2_log2Y_crwd;
1043
1044
23.2M
    if(!u1_pic_fld)
1045
21.7M
    {
1046
21.7M
        u1_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
1047
21.7M
    }
1048
1049
23.2M
    u1_mb_or_pic_fld = u1_mb_fld | u1_pic_fld;
1050
1051
23.2M
    pi16_intm = ps_dec->pi2_pred1;
1052
23.2M
    puc_pred0 = (UWORD8 *)pi16_intm;
1053
23.2M
    puc_pred1 = puc_pred0 + PRED_BUFFER_WIDTH * PRED_BUFFER_HEIGHT * sizeof(WORD16);
1054
1055
47.1M
    for(u2_num_pels = 0; u2_num_pels < 256;)
1056
23.9M
    {
1057
23.9M
        UWORD8 uc_dx, uc_dy;
1058
23.9M
        const UWORD8 u1_is_bi_direct = ps_pred->u1_is_bi_direct;
1059
53.4M
        for(u1_dir = 0; u1_dir <= u1_is_bi_direct; u1_dir++)
1060
29.5M
        {
1061
            /* Pointer to the destination buffer. If the CBPs of all 8x8 blocks in
1062
             the MB partition are zero then it would be better to copy the
1063
             predictor valus directly to the current frame buffer */
1064
            /*
1065
             * ps_pred->i1_pod_ht is non zero when MBAFF is present. In case of MBAFF the reference data
1066
             * is copied in the Scrath buffer so that the padding_on_demand doesnot corrupt the frame data
1067
             */
1068
1069
29.5M
            if(ps_pred->i1_pod_ht)
1070
960
            {
1071
960
                u2_ref_wd_y = ps_pred->u2_u1_ref_buf_wd;
1072
960
                puc_ref = ps_pred->pu1_dma_dest_addr;
1073
960
            }
1074
29.5M
            else
1075
29.5M
            {
1076
29.5M
                u2_ref_wd_y = ps_pred->u2_frm_wd;
1077
29.5M
                puc_ref = ps_pred->pu1_y_ref;
1078
1079
29.5M
            }
1080
1081
29.5M
            if(ps_pred->u1_dydx & 0x3)
1082
1.21M
                puc_ref += 2;
1083
29.5M
            if(ps_pred->u1_dydx >> 2)
1084
991k
                puc_ref += 2 * u2_ref_wd_y;
1085
29.5M
            u4_wd_y = ps_pred->i1_mb_partwidth;
1086
29.5M
            u4_ht_y = ps_pred->i1_mb_partheight;
1087
1088
29.5M
            uc_dx = ps_pred->u1_dydx;
1089
29.5M
            uc_dy = uc_dx >> 2;
1090
29.5M
            uc_dx &= 0x3;
1091
29.5M
            if(u1_dir == 0)
1092
23.9M
            {
1093
23.9M
                pu1_dest_y = ps_pred->pu1_rec_y_u;
1094
23.9M
                u2_row_buf_wd_y = ps_pred->u2_dst_stride;
1095
23.9M
                u2_dst_wd = ps_pred->u2_dst_stride;
1096
23.9M
                u2_dest_wd_y = u2_dst_wd;
1097
23.9M
                ps_pred_y_forw = ps_pred;
1098
23.9M
            }
1099
5.61M
            else
1100
5.61M
            {
1101
5.61M
                pu1_dest_y = pu1_temp_mc_buffer;
1102
5.61M
                u2_dst_wd = MB_SIZE;
1103
5.61M
                u2_dest_wd_y = u2_dst_wd;
1104
5.61M
                ps_pred_y_back = ps_pred;
1105
5.61M
                ps_pred_y_back->pu1_rec_y_u = pu1_dest_y;
1106
5.61M
            }
1107
1108
            /* padding on demand (POD) for y done here */
1109
1110
29.5M
            if(ps_pred->i1_pod_ht)
1111
960
            {
1112
960
                pu1_pred = ps_pred->pu1_pred;
1113
960
                pu1_dma_dst = ps_pred->pu1_dma_dest_addr;
1114
960
                u1_dma_wd = ps_pred->u1_dma_wd_y;
1115
960
                u1_dma_ht = ps_pred->u1_dma_ht_y;
1116
960
                u2_frm_wd = ps_dec->u2_frm_wd_y << u1_mb_or_pic_fld;
1117
960
                if(ps_pred->i1_pod_ht < 0)
1118
823
                {
1119
823
                    pu1_dma_dst = pu1_dma_dst - (ps_pred->i1_pod_ht * ps_pred->u2_u1_ref_buf_wd);
1120
823
                }
1121
960
                ih264d_copy_2d1d(pu1_pred, pu1_dma_dst, u2_frm_wd, u1_dma_wd,
1122
960
                                 u1_dma_ht);
1123
960
                ih264d_pad_on_demand(ps_pred, LUM_BLK);
1124
960
            }
1125
29.5M
            ps_dec->apf_inter_pred_luma[ps_pred->u1_dydx](puc_ref, pu1_dest_y,
1126
29.5M
                                                          u2_ref_wd_y,
1127
29.5M
                                                          u2_dst_wd,
1128
29.5M
                                                          u4_ht_y,
1129
29.5M
                                                          u4_wd_y,
1130
29.5M
                                                          puc_pred0,
1131
29.5M
                                                          ps_pred->u1_dydx);
1132
29.5M
            ps_pred++;
1133
1134
            /* Interpolate samples for the chroma components */
1135
29.5M
            {
1136
29.5M
                UWORD8 *pu1_ref_u;
1137
29.5M
                UWORD32 u1_dma_ht;
1138
1139
                /* padding on demand (POD) for U and V done here */
1140
29.5M
                u1_dma_ht = ps_pred->i1_dma_ht;
1141
1142
29.5M
                if(ps_pred->i1_pod_ht)
1143
16.1k
                {
1144
16.1k
                    pu1_pred = ps_pred->pu1_pred_u;
1145
16.1k
                    pu1_dma_dst = ps_pred->pu1_dma_dest_addr;
1146
16.1k
                    u1_dma_ht = ps_pred->u1_dma_ht_uv;
1147
16.1k
                    u1_dma_wd = ps_pred->u1_dma_wd_uv * YUV420SP_FACTOR;
1148
16.1k
                    u2_frm_wd = ps_dec->u2_frm_wd_uv << u1_mb_or_pic_fld;
1149
16.1k
                    if(ps_pred->i1_pod_ht < 0)
1150
8.45k
                    {
1151
                        /*Top POD*/
1152
8.45k
                        pu1_dma_dst -= (ps_pred->i1_pod_ht
1153
8.45k
                                        * ps_pred->u2_u1_ref_buf_wd
1154
8.45k
                                        * YUV420SP_FACTOR);
1155
8.45k
                    }
1156
1157
16.1k
                    ih264d_copy_2d1d(pu1_pred, pu1_dma_dst, u2_frm_wd,
1158
16.1k
                                     u1_dma_wd, u1_dma_ht);
1159
1160
16.1k
                    pu1_dma_dst += (ps_pred->i1_dma_ht
1161
16.1k
                                    * ps_pred->u2_u1_ref_buf_wd);
1162
16.1k
                    pu1_pred = ps_pred->pu1_pred_v;
1163
1164
16.1k
                    ih264d_pad_on_demand(ps_pred, CHROM_BLK);
1165
16.1k
                }
1166
1167
29.5M
                if(ps_pred->i1_pod_ht)
1168
16.1k
                {
1169
16.1k
                    pu1_ref_u = ps_pred->pu1_dma_dest_addr;
1170
1171
16.1k
                    u2_ref_wd_uv = ps_pred->u2_u1_ref_buf_wd
1172
16.1k
                                    * YUV420SP_FACTOR;
1173
16.1k
                }
1174
29.5M
                else
1175
29.5M
                {
1176
29.5M
                    u2_ref_wd_uv = ps_pred->u2_frm_wd;
1177
29.5M
                    pu1_ref_u = ps_pred->pu1_u_ref;
1178
1179
29.5M
                }
1180
1181
29.5M
                u4_wd_uv = ps_pred->i1_mb_partwidth;
1182
29.5M
                u4_ht_uv = ps_pred->i1_mb_partheight;
1183
29.5M
                uc_dx = ps_pred->u1_dydx; /* 8*dy + dx */
1184
29.5M
                uc_dy = uc_dx >> 3;
1185
29.5M
                uc_dx &= 0x7;
1186
29.5M
                if(u1_dir == 0)
1187
23.9M
                {
1188
23.9M
                    pu1_dest_u = ps_pred->pu1_rec_y_u;
1189
1190
23.9M
                    pu1_dest_v = ps_pred->u1_pi1_wt_ofst_rec_v;
1191
23.9M
                    u2_row_buf_wd_uv = ps_pred->u2_dst_stride;
1192
23.9M
                    u2_dst_wd = ps_pred->u2_dst_stride;
1193
23.9M
                    u2_dest_wd_uv = u2_dst_wd;
1194
23.9M
                    ps_pred_cr_forw = ps_pred;
1195
23.9M
                }
1196
5.61M
                else
1197
5.61M
                {
1198
5.61M
                    pu1_dest_u = puc_pred0;
1199
1200
5.61M
                    pu1_dest_v = puc_pred1;
1201
5.61M
                    u2_dest_wd_uv = BUFFER_WIDTH;
1202
5.61M
                    u2_dst_wd = BUFFER_WIDTH;
1203
5.61M
                    ps_pred->pu1_rec_y_u = pu1_dest_u;
1204
5.61M
                    ps_pred->u1_pi1_wt_ofst_rec_v = pu1_dest_v;
1205
5.61M
                }
1206
1207
29.5M
                ps_pred++;
1208
29.5M
                ps_dec->pf_inter_pred_chroma(pu1_ref_u, pu1_dest_u,
1209
29.5M
                                             u2_ref_wd_uv, u2_dst_wd,
1210
29.5M
                                             uc_dx, uc_dy, u4_ht_uv,
1211
29.5M
                                             u4_wd_uv);
1212
1213
29.5M
                if(ps_cur_mb_info->u1_Mux == 1)
1214
8.89k
                {
1215
                    /******************************************************************/
1216
                    /* padding on demand (POD) for U and V done here                  */
1217
                    /* ps_pred now points to the Y entry of the 0,0 component         */
1218
                    /* Y need not be checked for POD because Y lies within            */
1219
                    /* the picture((0,0) mv for Y doesnot get changed. But (0,0) for  */
1220
                    /* U and V can need POD beacause of cross-field mv adjustments    */
1221
                    /* (Table 8-9 of standard)                                        */
1222
                    /******************************************************************/
1223
8.89k
                    if((ps_pred + 1)->i1_pod_ht)
1224
5
                    {
1225
5
                        pu1_pred = (ps_pred + 1)->pu1_pred_u;
1226
5
                        pu1_dma_dst = (ps_pred + 1)->pu1_dma_dest_addr;
1227
5
                        u1_dma_ht = (ps_pred + 1)->u1_dma_ht_uv;
1228
5
                        u1_dma_wd = (ps_pred + 1)->u1_dma_wd_uv
1229
5
                                        * YUV420SP_FACTOR;
1230
5
                        u2_frm_wd = ps_dec->u2_frm_wd_uv << u1_mb_or_pic_fld;
1231
5
                        if((ps_pred + 1)->i1_pod_ht < 0)
1232
5
                        {
1233
                            /*Top POD*/
1234
5
                            pu1_dma_dst -= ((ps_pred + 1)->i1_pod_ht
1235
5
                                            * (ps_pred + 1)->u2_u1_ref_buf_wd
1236
5
                                            * YUV420SP_FACTOR);
1237
5
                        }
1238
5
                        ih264d_copy_2d1d(pu1_pred, pu1_dma_dst, u2_frm_wd,
1239
5
                                         u1_dma_wd, u1_dma_ht);
1240
5
                        pu1_dma_dst += ((ps_pred + 1)->i1_dma_ht
1241
5
                                        * (ps_pred + 1)->u2_u1_ref_buf_wd); //(u1_dma_ht * u1_dma_wd);//
1242
5
                        pu1_pred = (ps_pred + 1)->pu1_pred_v;
1243
5
                        ih264d_pad_on_demand(ps_pred + 1, CHROM_BLK);
1244
1245
5
                    }
1246
1247
8.89k
                    ih264d_multiplex_ref_data(ps_dec, ps_pred, pu1_dest_y,
1248
8.89k
                                              pu1_dest_u, ps_cur_mb_info,
1249
8.89k
                                              u2_dest_wd_y, u2_dest_wd_uv,
1250
8.89k
                                              u1_dir);
1251
8.89k
                    ps_pred += 2;
1252
8.89k
                }
1253
29.5M
            }
1254
29.5M
        }
1255
23.9M
        if(u1_dir != 0)
1256
23.9M
            u2_ref_wd_y = MB_SIZE;
1257
1258
23.9M
        u2_num_pels += u4_wd_y * u4_ht_y;
1259
        /* if BI_DIRECT, average the two pred's, and put in ..PredBuffer[0] */
1260
23.9M
        if((u1_is_bi_direct != 0) || (ps_pred_y_forw->u1_wght_pred_type != 0))
1261
20.2M
        {
1262
1263
20.2M
            switch(ps_pred_y_forw->u1_wght_pred_type)
1264
20.2M
            {
1265
1.08M
                case 0:
1266
1.08M
                    ps_dec->pf_default_weighted_pred_luma(
1267
1.08M
                                    ps_pred_y_forw->pu1_rec_y_u, pu1_dest_y,
1268
1.08M
                                    ps_pred_y_forw->pu1_rec_y_u,
1269
1.08M
                                    u2_row_buf_wd_y, u2_ref_wd_y,
1270
1.08M
                                    u2_row_buf_wd_y, u4_ht_uv * 2,
1271
1.08M
                                    u4_wd_uv * 2);
1272
1273
1.08M
                    ps_dec->pf_default_weighted_pred_chroma(
1274
1.08M
                                    ps_pred_cr_forw->pu1_rec_y_u, pu1_dest_u,
1275
1.08M
                                    ps_pred_cr_forw->pu1_rec_y_u,
1276
1.08M
                                    u2_row_buf_wd_uv, u2_dst_wd,
1277
1.08M
                                    u2_row_buf_wd_uv, u4_ht_uv,
1278
1.08M
                                    u4_wd_uv);
1279
1280
1.08M
                    break;
1281
14.6M
                case 1:
1282
14.6M
                {
1283
14.6M
                    UWORD32 *pu4_weight_ofst =
1284
14.6M
                                    (UWORD32*)ps_pred_y_forw->u1_pi1_wt_ofst_rec_v;
1285
14.6M
                    UWORD32 u4_wt_ofst_u, u4_wt_ofst_v;
1286
14.6M
                    UWORD32 u4_wt_ofst_y =
1287
14.6M
                                    (UWORD32)(pu4_weight_ofst[0]);
1288
14.6M
                    WORD32 weight = (WORD16)(u4_wt_ofst_y & 0xffff);
1289
14.6M
                    WORD32 ofst = (WORD8)(u4_wt_ofst_y >> 16);
1290
1291
14.6M
                    ps_dec->pf_weighted_pred_luma(ps_pred_y_forw->pu1_rec_y_u,
1292
14.6M
                                                  ps_pred_y_forw->pu1_rec_y_u,
1293
14.6M
                                                  u2_row_buf_wd_y,
1294
14.6M
                                                  u2_row_buf_wd_y,
1295
14.6M
                                                  (u2_log2Y_crwd & 0x0ff),
1296
14.6M
                                                  weight, ofst, u4_ht_y,
1297
14.6M
                                                  u4_wd_y);
1298
1299
14.6M
                    u4_wt_ofst_u = (UWORD32)(pu4_weight_ofst[2]);
1300
14.6M
                    u4_wt_ofst_v = (UWORD32)(pu4_weight_ofst[4]);
1301
14.6M
                    weight = ((u4_wt_ofst_v & 0xffff) << 16)
1302
14.6M
                                    | (u4_wt_ofst_u & 0xffff);
1303
14.6M
                    ofst = ((u4_wt_ofst_v >> 16) << 8)
1304
14.6M
                                    | ((u4_wt_ofst_u >> 16) & 0xFF);
1305
1306
14.6M
                    ps_dec->pf_weighted_pred_chroma(
1307
14.6M
                                    ps_pred_cr_forw->pu1_rec_y_u,
1308
14.6M
                                    ps_pred_cr_forw->pu1_rec_y_u,
1309
14.6M
                                    u2_row_buf_wd_uv, u2_row_buf_wd_uv,
1310
14.6M
                                    (u2_log2Y_crwd >> 8), weight, ofst,
1311
14.6M
                                    u4_ht_y >> 1, u4_wd_y >> 1);
1312
14.6M
                }
1313
1314
14.6M
                    break;
1315
4.52M
                case 2:
1316
4.52M
                {
1317
4.52M
                    UWORD32 *pu4_weight_ofst =
1318
4.52M
                                    (UWORD32*)ps_pred_y_forw->u1_pi1_wt_ofst_rec_v;
1319
4.52M
                    UWORD32 u4_wt_ofst_u, u4_wt_ofst_v;
1320
4.52M
                    UWORD32 u4_wt_ofst_y;
1321
4.52M
                    WORD32 weight1, weight2;
1322
4.52M
                    WORD32 ofst1, ofst2;
1323
1324
4.52M
                    u4_wt_ofst_y = (UWORD32)(pu4_weight_ofst[0]);
1325
1326
4.52M
                    weight1 = (WORD16)(u4_wt_ofst_y & 0xffff);
1327
4.52M
                    ofst1 = (WORD8)(u4_wt_ofst_y >> 16);
1328
1329
4.52M
                    u4_wt_ofst_y = (UWORD32)(pu4_weight_ofst[1]);
1330
4.52M
                    weight2 = (WORD16)(u4_wt_ofst_y & 0xffff);
1331
4.52M
                    ofst2 = (WORD8)(u4_wt_ofst_y >> 16);
1332
1333
4.52M
                    ps_dec->pf_weighted_bi_pred_luma(ps_pred_y_forw->pu1_rec_y_u,
1334
4.52M
                                                     ps_pred_y_back->pu1_rec_y_u,
1335
4.52M
                                                     ps_pred_y_forw->pu1_rec_y_u,
1336
4.52M
                                                     u2_row_buf_wd_y,
1337
4.52M
                                                     u2_ref_wd_y,
1338
4.52M
                                                     u2_row_buf_wd_y,
1339
4.52M
                                                     (u2_log2Y_crwd & 0x0ff),
1340
4.52M
                                                     weight1, weight2, ofst1,
1341
4.52M
                                                     ofst2, u4_ht_y,
1342
4.52M
                                                     u4_wd_y);
1343
1344
4.52M
                    u4_wt_ofst_u = (UWORD32)(pu4_weight_ofst[2]);
1345
4.52M
                    u4_wt_ofst_v = (UWORD32)(pu4_weight_ofst[4]);
1346
4.52M
                    weight1 = ((u4_wt_ofst_v & 0xffff) << 16)
1347
4.52M
                                    | (u4_wt_ofst_u & 0xffff);
1348
4.52M
                    ofst1 = ((u4_wt_ofst_v >> 16) << 8)
1349
4.52M
                                    | ((u4_wt_ofst_u >> 16) & 0xFF);
1350
1351
4.52M
                    u4_wt_ofst_u = (UWORD32)(pu4_weight_ofst[3]);
1352
4.52M
                    u4_wt_ofst_v = (UWORD32)(pu4_weight_ofst[5]);
1353
4.52M
                    weight2 = ((u4_wt_ofst_v & 0xffff) << 16)
1354
4.52M
                                    | (u4_wt_ofst_u & 0xffff);
1355
4.52M
                    ofst2 = ((u4_wt_ofst_v >> 16) << 8)
1356
4.52M
                                    | ((u4_wt_ofst_u >> 16) & 0xFF);
1357
1358
4.52M
                    ps_dec->pf_weighted_bi_pred_chroma(
1359
4.52M
                                    (ps_pred_y_forw + 1)->pu1_rec_y_u,
1360
4.52M
                                    (ps_pred_y_back + 1)->pu1_rec_y_u,
1361
4.52M
                                    (ps_pred_y_forw + 1)->pu1_rec_y_u,
1362
4.52M
                                    u2_row_buf_wd_uv, u2_dst_wd,
1363
4.52M
                                    u2_row_buf_wd_uv, (u2_log2Y_crwd >> 8),
1364
4.52M
                                    weight1, weight2, ofst1, ofst2,
1365
4.52M
                                    u4_ht_y >> 1, u4_wd_y >> 1);
1366
4.52M
                }
1367
1368
4.52M
                    break;
1369
20.2M
            }
1370
1371
20.2M
        }
1372
23.9M
    }
1373
23.2M
}
1374
1375
1376
/*!
1377
 **************************************************************************
1378
 * \if Function name : ih264d_multiplex_ref_data \endif
1379
 *
1380
 * \brief
1381
 *    Initializes forward and backward refernce lists for B slice decoding.
1382
 *
1383
 *
1384
 * \return
1385
 *    0 on Success and Error code otherwise
1386
 **************************************************************************
1387
 */
1388
1389
void ih264d_multiplex_ref_data(dec_struct_t * ps_dec,
1390
                               pred_info_t *ps_pred,
1391
                               UWORD8* pu1_dest_y,
1392
                               UWORD8* pu1_dest_u,
1393
                               dec_mb_info_t *ps_cur_mb_info,
1394
                               UWORD16 u2_dest_wd_y,
1395
                               UWORD16 u2_dest_wd_uv,
1396
                               UWORD8 u1_dir)
1397
8.89k
{
1398
8.89k
    UWORD16 u2_mask = ps_cur_mb_info->u2_mask[u1_dir];
1399
8.89k
    UWORD8 *pu1_ref_y, *pu1_ref_u;
1400
8.89k
    UWORD8 uc_cond, i, j, u1_dydx;
1401
8.89k
    UWORD16 u2_ref_wd_y, u2_ref_wd_uv;
1402
1403
8.89k
    PROFILE_DISABLE_INTER_PRED()
1404
1405
8.89k
    if(ps_pred->i1_pod_ht)
1406
0
    {
1407
0
        pu1_ref_y = ps_pred->pu1_dma_dest_addr;
1408
1409
0
        u2_ref_wd_y = ps_pred->u2_u1_ref_buf_wd;
1410
0
    }
1411
8.89k
    else
1412
8.89k
    {
1413
8.89k
        pu1_ref_y = ps_pred->pu1_y_ref;
1414
8.89k
        u2_ref_wd_y = ps_pred->u2_frm_wd;
1415
8.89k
    }
1416
1417
8.89k
    ps_pred++;
1418
8.89k
    if(ps_pred->i1_pod_ht)
1419
5
    {
1420
5
        pu1_ref_u = ps_pred->pu1_dma_dest_addr;
1421
5
        u2_ref_wd_uv = ps_pred->u2_u1_ref_buf_wd * YUV420SP_FACTOR;
1422
1423
5
    }
1424
8.88k
    else
1425
8.88k
    {
1426
8.88k
        pu1_ref_u = ps_pred->pu1_u_ref;
1427
8.88k
        u2_ref_wd_uv = ps_pred->u2_frm_wd;
1428
1429
8.88k
    }
1430
1431
8.89k
    u1_dydx = ps_pred->u1_dydx;
1432
1433
8.89k
    {
1434
8.89k
        UWORD8 uc_dx, uc_dy;
1435
8.89k
        UWORD8 *pu1_scratch_u;
1436
1437
8.89k
        uc_dx = u1_dydx & 0x3;
1438
8.89k
        uc_dy = u1_dydx >> 3;
1439
8.89k
        if(u1_dydx != 0)
1440
6
        {
1441
6
            pred_info_t * ps_prv_pred = ps_pred - 2;
1442
6
            pu1_scratch_u = ps_prv_pred->pu1_dma_dest_addr;
1443
6
            ps_dec->pf_inter_pred_chroma(pu1_ref_u, pu1_scratch_u,
1444
6
                                         u2_ref_wd_uv, 16, uc_dx, uc_dy, 8,
1445
6
                                         8);
1446
1447
            /* Modify ref pointer and refWidth to point to scratch    */
1448
            /* buffer to be used below in ih264d_copy_multiplex_data functions */
1449
            /* CHANGED CODE */
1450
6
            pu1_ref_u = pu1_scratch_u;
1451
6
            u2_ref_wd_uv = 8 * YUV420SP_FACTOR;
1452
6
        }
1453
8.89k
    }
1454
8.89k
    {
1455
44.4k
        for(i = 0; i < 4; i++)
1456
35.5k
        {
1457
177k
            for(j = 0; j < 4; j++)
1458
142k
            {
1459
142k
                uc_cond = u2_mask & 1;
1460
142k
                u2_mask >>= 1;
1461
142k
                if(uc_cond)
1462
35.3k
                {
1463
35.3k
                    *(UWORD32 *)(pu1_dest_y + u2_dest_wd_y) =
1464
35.3k
                                    *(UWORD32 *)(pu1_ref_y + u2_ref_wd_y);
1465
35.3k
                    *(UWORD32 *)(pu1_dest_y + 2 * u2_dest_wd_y) =
1466
35.3k
                                    *(UWORD32 *)(pu1_ref_y + 2 * u2_ref_wd_y);
1467
35.3k
                    *(UWORD32 *)(pu1_dest_y + 3 * u2_dest_wd_y) =
1468
35.3k
                                    *(UWORD32 *)(pu1_ref_y + 3 * u2_ref_wd_y);
1469
35.3k
                    {
1470
35.3k
                        UWORD32 *dst, *src;
1471
35.3k
                        dst = (UWORD32 *)pu1_dest_y;
1472
35.3k
                        src = (UWORD32 *)pu1_ref_y;
1473
35.3k
                        *dst = *src;
1474
35.3k
                        dst++;
1475
35.3k
                        src++;
1476
35.3k
                        pu1_dest_y = (UWORD8 *)dst;
1477
35.3k
                        pu1_ref_y = (UWORD8 *)src;
1478
35.3k
                    }
1479
35.3k
                    *(UWORD32 *)(pu1_dest_u + u2_dest_wd_uv) =
1480
35.3k
                                    *(UWORD32 *)(pu1_ref_u + u2_ref_wd_uv);
1481
35.3k
                    {
1482
35.3k
                        UWORD32 *dst, *src;
1483
35.3k
                        dst = (UWORD32 *)pu1_dest_u;
1484
35.3k
                        src = (UWORD32 *)pu1_ref_u;
1485
35.3k
                        *dst = *src;
1486
35.3k
                        dst++;
1487
35.3k
                        src++;
1488
35.3k
                        pu1_dest_u = (UWORD8 *)dst;
1489
35.3k
                        pu1_ref_u = (UWORD8 *)src;
1490
35.3k
                    }
1491
1492
35.3k
                }
1493
106k
                else
1494
106k
                {
1495
106k
                    pu1_dest_y += 4;
1496
106k
                    pu1_ref_y += 4;
1497
106k
                    pu1_dest_u += 2 * YUV420SP_FACTOR;
1498
106k
                    pu1_ref_u += 2 * YUV420SP_FACTOR;
1499
106k
                }
1500
142k
            }
1501
35.5k
            pu1_ref_y += 4 * (u2_ref_wd_y - 4);
1502
35.5k
            pu1_ref_u += 2 * (u2_ref_wd_uv - 4 * YUV420SP_FACTOR);
1503
35.5k
            pu1_dest_y += 4 * (u2_dest_wd_y - 4);
1504
35.5k
            pu1_dest_u += 2 * (u2_dest_wd_uv - 4 * YUV420SP_FACTOR);
1505
35.5k
        }
1506
8.89k
    }
1507
8.89k
}
1508
1509
void ih264d_pad_on_demand(pred_info_t *ps_pred, UWORD8 lum_chrom_blk)
1510
17.0k
{
1511
17.0k
    if(CHROM_BLK == lum_chrom_blk)
1512
16.1k
    {
1513
16.1k
        UWORD32 *pu4_pod_src_u, *pu4_pod_dst_u;
1514
16.1k
        UWORD32 *pu4_pod_src_v, *pu4_pod_dst_v;
1515
16.1k
        WORD32 j, u1_wd_stride;
1516
16.1k
        WORD32 i, u1_dma_ht, i1_ht;
1517
16.1k
        UWORD32 u2_dma_size;
1518
16.1k
        u1_wd_stride = (ps_pred->u2_u1_ref_buf_wd >> 2) * YUV420SP_FACTOR;
1519
16.1k
        u1_dma_ht = ps_pred->i1_dma_ht;
1520
16.1k
        u2_dma_size = u1_wd_stride * u1_dma_ht;
1521
16.1k
        pu4_pod_src_u = (UWORD32 *)ps_pred->pu1_dma_dest_addr;
1522
16.1k
        pu4_pod_dst_u = pu4_pod_src_u;
1523
1524
16.1k
        pu4_pod_src_v = pu4_pod_src_u + u2_dma_size;
1525
16.1k
        pu4_pod_dst_v = pu4_pod_src_v;
1526
1527
16.1k
        i1_ht = ps_pred->i1_pod_ht;
1528
16.1k
        pu4_pod_src_u -= u1_wd_stride * i1_ht;
1529
16.1k
        pu4_pod_src_v -= u1_wd_stride * i1_ht;
1530
16.1k
        if(i1_ht < 0)
1531
            /* Top POD */
1532
8.45k
            i1_ht = -i1_ht;
1533
7.64k
        else
1534
7.64k
        {
1535
            /* Bottom POD */
1536
7.64k
            pu4_pod_src_u += (u1_dma_ht - 1) * u1_wd_stride;
1537
7.64k
            pu4_pod_dst_u += (u1_dma_ht - i1_ht) * u1_wd_stride;
1538
7.64k
            pu4_pod_src_v += (u1_dma_ht - 1) * u1_wd_stride;
1539
7.64k
            pu4_pod_dst_v += (u1_dma_ht - i1_ht) * u1_wd_stride;
1540
7.64k
        }
1541
1542
33.8k
        for(i = 0; i < i1_ht; i++)
1543
88.5k
            for(j = 0; j < u1_wd_stride; j++)
1544
70.8k
            {
1545
70.8k
                *pu4_pod_dst_u++ = *(pu4_pod_src_u + j);
1546
1547
70.8k
            }
1548
16.1k
    }
1549
960
    else
1550
960
    {
1551
960
        UWORD32 *pu4_pod_src, *pu4_pod_dst;
1552
960
        WORD32 j, u1_wd_stride;
1553
960
        WORD32 i, i1_ht;
1554
960
        pu4_pod_src = (UWORD32 *)ps_pred->pu1_dma_dest_addr;
1555
960
        pu4_pod_dst = pu4_pod_src;
1556
960
        u1_wd_stride = ps_pred->u2_u1_ref_buf_wd >> 2;
1557
960
        i1_ht = ps_pred->i1_pod_ht;
1558
960
        pu4_pod_src -= u1_wd_stride * i1_ht;
1559
960
        if(i1_ht < 0)
1560
            /* Top POD */
1561
823
            i1_ht = -i1_ht;
1562
137
        else
1563
137
        {
1564
            /* Bottom POD */
1565
137
            pu4_pod_src += (ps_pred->i1_dma_ht - 1) * u1_wd_stride;
1566
137
            pu4_pod_dst += (ps_pred->i1_dma_ht - i1_ht) * u1_wd_stride;
1567
137
        }
1568
1569
7.18k
        for(i = 0; i < i1_ht; i++)
1570
30.0k
            for(j = 0; j < u1_wd_stride; j++)
1571
23.8k
                *pu4_pod_dst++ = *(pu4_pod_src + j);
1572
960
    }
1573
17.0k
}
1574