Coverage Report

Created: 2025-10-10 06:56

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libmpeg2/decoder/impeg2d_mc.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
23
*  impeg2d_mc.c
24
*
25
* @brief
26
*  Contains MC function definitions for MPEG2 decoder
27
*
28
* @author
29
*  Harish
30
*
31
* @par List of Functions:
32
* - impeg2d_motion_comp()
33
* - impeg2d_motion_comp_recon_buf()
34
* - impeg2d_mc_1mv()
35
* - impeg2d_mc_fw_or_bk_mb()
36
* - impeg2d_mc_frm_dual_prime()
37
* - impeg2d_mc_fld_dual_prime()
38
* - impeg2d_mc_4mv()
39
* - impeg2d_mc_2mv()
40
* - impeg2d_dec_intra_mb()
41
* - impeg2d_dec_skip_p_mb()
42
* - impeg2d_dec_skip_b_mb()
43
* - impeg2d_dec_skip_mbs()
44
* - impeg2d_dec_0mv_coded_mb()
45
* - impeg2d_mc_halfx_halfy()
46
* - impeg2d_mc_halfx_fully()
47
* - impeg2d_mc_fullx_halfy()
48
* - impeg2d_mc_fullx_fully()
49
* - impeg2d_set_mc_params()
50
*
51
* @remarks
52
*  None
53
*
54
*******************************************************************************
55
*/
56
#include <string.h>
57
58
#include "iv_datatypedef.h"
59
#include "iv.h"
60
61
#include "impeg2_buf_mgr.h"
62
#include "impeg2_disp_mgr.h"
63
#include "impeg2_defs.h"
64
#include "impeg2_platform_macros.h"
65
#include "impeg2_inter_pred.h"
66
#include "impeg2_idct.h"
67
#include "impeg2_globals.h"
68
#include "impeg2_mem_func.h"
69
#include "impeg2_format_conv.h"
70
#include "impeg2_macros.h"
71
72
#include "ivd.h"
73
#include "impeg2d.h"
74
#include "impeg2d_bitstream.h"
75
#include "impeg2d_structs.h"
76
#include "impeg2d_globals.h"
77
#include "impeg2d_pic_proc.h"
78
#include "impeg2d_debug.h"
79
#include "impeg2d_mv_dec.h"
80
#include "impeg2d_mc.h"
81
82
/*****************************************************************************/
83
/*                                                                           */
84
/*  Function Name : impeg2d_motion_comp                                      */
85
/*                                                                           */
86
/*  Description   : Perform motion compensation and store the resulting block*/
87
/*                  in the buf                                               */
88
/*                                                                           */
89
/*  Inputs        : params - Parameters required to do motion compensation   */
90
/*                                                                           */
91
/*  Globals       :                                                          */
92
/*                                                                           */
93
/*  Processing    : Calls appropriate functions depending on the mode of     */
94
/*                  compensation                                             */
95
/*                                                                           */
96
/*  Outputs       : buf       - Buffer for the motion compensation result    */
97
/*                                                                           */
98
/*  Returns       : None                                                     */
99
/*                                                                           */
100
/*  Issues        : None                                                     */
101
/*                                                                           */
102
/*  Revision History:                                                        */
103
/*                                                                           */
104
/*         DD MM YYYY   Author(s)       Changes                              */
105
/*         14 09 2005   Hairsh M        First Version                        */
106
/*                                                                           */
107
/*****************************************************************************/
108
void impeg2d_motion_comp(dec_state_t *ps_dec, mb_mc_params_t *ps_params,yuv_buf_t *ps_buf)
109
1.00M
{
110
111
1.00M
    PROFILE_DISABLE_MC_RETURN;
112
113
    /* Perform motion compensation for Y */
114
1.00M
    ps_dec->pf_mc[ps_params->s_luma.u4_mode]((void *)ps_dec, ps_params->s_ref.pu1_y + ps_params->s_luma.u4_src_offset,
115
1.00M
                ps_params->s_luma.u4_src_wd,
116
1.00M
                ps_buf->pu1_y + ps_params->s_luma.u4_dst_offset_res_buf,
117
1.00M
                ps_params->s_luma.u4_dst_wd_res_buf,
118
1.00M
                ps_params->s_luma.u4_cols,
119
1.00M
                ps_params->s_luma.u4_rows);
120
    /* Perform motion compensation for U */
121
1.00M
    ps_dec->pf_mc[ps_params->s_chroma.u4_mode]((void *)ps_dec, ps_params->s_ref.pu1_u + ps_params->s_chroma.u4_src_offset,
122
1.00M
                ps_params->s_chroma.u4_src_wd,
123
1.00M
                ps_buf->pu1_u + ps_params->s_chroma.u4_dst_offset_res_buf,
124
1.00M
                ps_params->s_chroma.u4_dst_wd_res_buf,
125
1.00M
                ps_params->s_chroma.u4_cols,
126
1.00M
                ps_params->s_chroma.u4_rows);
127
128
    /* Perform motion compensation for V */
129
1.00M
    ps_dec->pf_mc[ps_params->s_chroma.u4_mode]((void *)ps_dec, ps_params->s_ref.pu1_v + ps_params->s_chroma.u4_src_offset,
130
1.00M
                ps_params->s_chroma.u4_src_wd,
131
1.00M
                ps_buf->pu1_v + ps_params->s_chroma.u4_dst_offset_res_buf,
132
1.00M
                ps_params->s_chroma.u4_dst_wd_res_buf,
133
1.00M
                ps_params->s_chroma.u4_cols,
134
1.00M
                ps_params->s_chroma.u4_rows);
135
1.00M
}
136
137
138
139
/*****************************************************************************/
140
/*                                                                           */
141
/*  Function Name : impeg2d_motion_comp_recon_buf                          */
142
/*                                                                           */
143
/*  Description   : Perform motion compensation and store the resulting block*/
144
/*                  in the buf                                               */
145
/*                                                                           */
146
/*  Inputs        : params - Parameters required to do motion compensation   */
147
/*                                                                           */
148
/*  Globals       :                                                          */
149
/*                                                                           */
150
/*  Processing    : Calls appropriate functions depending on the mode of     */
151
/*                  compensation                                             */
152
/*                                                                           */
153
/*  Outputs       : buf       - Buffer for the motion compensation result    */
154
/*                                                                           */
155
/*  Returns       : None                                                     */
156
/*                                                                           */
157
/*  Issues        : None                                                     */
158
/*                                                                           */
159
/*  Revision History:                                                        */
160
/*                                                                           */
161
/*         DD MM YYYY   Author(s)       Changes                              */
162
/*         14 09 2005   Harish M        First Version                        */
163
/*                                                                           */
164
/*****************************************************************************/
165
void impeg2d_motion_comp_recon_buf(dec_state_t *ps_dec,
166
                                     mb_mc_params_t *ps_params,
167
                                     yuv_buf_t *ps_dest_buf)
168
6.91M
{
169
170
6.91M
    PROFILE_DISABLE_MC_RETURN;
171
172
    /* Perform motion compensation for Y */
173
6.91M
    ps_dec->pf_mc[ps_params->s_luma.u4_mode](ps_dec, ps_params->s_ref.pu1_y + ps_params->s_luma.u4_src_offset,
174
6.91M
                                        ps_params->s_luma.u4_src_wd,
175
6.91M
                                        ps_dest_buf->pu1_y + ps_params->s_luma.u4_dst_offset_cur_frm,
176
6.91M
                                        ps_params->s_luma.u4_dst_wd_cur_frm,
177
6.91M
                                        ps_params->s_luma.u4_cols,
178
6.91M
                                        ps_params->s_luma.u4_rows);
179
180
    /* Perform motion compensation for U */
181
182
6.91M
    ps_dec->pf_mc[ps_params->s_chroma.u4_mode](ps_dec, ps_params->s_ref.pu1_u + ps_params->s_chroma.u4_src_offset,
183
6.91M
                                        ps_params->s_chroma.u4_src_wd,
184
6.91M
                                        ps_dest_buf->pu1_u + ps_params->s_chroma.u4_dst_offset_cur_frm,
185
6.91M
                                        ps_params->s_chroma.u4_dst_wd_cur_frm,
186
6.91M
                                        ps_params->s_chroma.u4_cols,
187
6.91M
                                        ps_params->s_chroma.u4_rows);
188
189
    /* Perform motion compensation for V */
190
6.91M
    ps_dec->pf_mc[ps_params->s_chroma.u4_mode](ps_dec, ps_params->s_ref.pu1_v + ps_params->s_chroma.u4_src_offset,
191
6.91M
                                        ps_params->s_chroma.u4_src_wd,
192
6.91M
                                        ps_dest_buf->pu1_v + ps_params->s_chroma.u4_dst_offset_cur_frm,
193
6.91M
                                        ps_params->s_chroma.u4_dst_wd_cur_frm,
194
6.91M
                                        ps_params->s_chroma.u4_cols,
195
6.91M
                                        ps_params->s_chroma.u4_rows);
196
6.91M
}
197
198
199
200
/*****************************************************************************/
201
/*                                                                           */
202
/*  Function Name : impeg2d_mc_1mv                                           */
203
/*                                                                           */
204
/*  Description   : Perform motion compensation and store the resulting block*/
205
/*                  in the buf                                               */
206
/*                                                                           */
207
/*  Inputs        : params - Parameters required to do motion compensation   */
208
/*                                                                           */
209
/*  Globals       :                                                          */
210
/*                                                                           */
211
/*  Processing    : Calls appropriate functions depending on the mode of     */
212
/*                  compensation                                             */
213
/*                                                                           */
214
/*  Outputs       : buf       - Buffer for the motion compensation result    */
215
/*                                                                           */
216
/*  Returns       : None                                                     */
217
/*                                                                           */
218
/*  Issues        : None                                                     */
219
/*                                                                           */
220
/*  Revision History:                                                        */
221
/*                                                                           */
222
/*         DD MM YYYY   Author(s)       Changes                              */
223
/*         14 09 2005   Hairsh M        First Version                        */
224
/*                                                                           */
225
/*****************************************************************************/
226
void impeg2d_mc_1mv(dec_state_t *ps_dec)
227
6.85M
{
228
229
6.85M
    impeg2d_motion_comp_recon_buf(ps_dec, &ps_dec->as_mb_mc_params[ps_dec->e_mb_pred][FIRST], &ps_dec->s_dest_buf);
230
6.85M
}
231
232
233
234
/*****************************************************************************/
235
/*                                                                           */
236
/*  Function Name : impeg2d_mc_fw_or_bk_mb                                   */
237
/*                                                                           */
238
/*  Description   : Perform motion compensation and store the resulting block*/
239
/*                  in the buf                                               */
240
/*                                                                           */
241
/*  Inputs        : params - Parameters required to do motion compensation   */
242
/*                                                                           */
243
/*  Globals       :                                                          */
244
/*                                                                           */
245
/*  Processing    : Calls appropriate functions depending on the mode of     */
246
/*                  compensation                                             */
247
/*                                                                           */
248
/*  Outputs       : buf       - Buffer for the motion compensation result    */
249
/*                                                                           */
250
/*  Returns       : None                                                     */
251
/*                                                                           */
252
/*  Issues        : None                                                     */
253
/*                                                                           */
254
/*  Revision History:                                                        */
255
/*                                                                           */
256
/*         DD MM YYYY   Author(s)       Changes                              */
257
/*         14 09 2005   Hairsh M        First Version                        */
258
/*                                                                           */
259
/*****************************************************************************/
260
void impeg2d_mc_fw_or_bk_mb(dec_state_t *ps_dec)
261
26.5k
{
262
26.5k
    impeg2d_motion_comp_recon_buf(ps_dec, &ps_dec->as_mb_mc_params[FORW][FIRST], &ps_dec->s_dest_buf);
263
26.5k
    impeg2d_motion_comp_recon_buf(ps_dec, &ps_dec->as_mb_mc_params[FORW][SECOND], &ps_dec->s_dest_buf);
264
26.5k
}
265
266
267
268
/*****************************************************************************/
269
/*                                                                           */
270
/*  Function Name : impeg2d_mc_frm_dual_prime                                */
271
/*                                                                           */
272
/*  Description   : Perform motion compensation and store the resulting block*/
273
/*                  in the buf                                               */
274
/*                                                                           */
275
/*  Inputs        : params - Parameters required to do motion compensation   */
276
/*                                                                           */
277
/*  Globals       :                                                          */
278
/*                                                                           */
279
/*  Processing    : Calls appropriate functions depending on the mode of     */
280
/*                  compensation                                             */
281
/*                                                                           */
282
/*  Outputs       : buf       - Buffer for the motion compensation result    */
283
/*                                                                           */
284
/*  Returns       : None                                                     */
285
/*                                                                           */
286
/*  Issues        : None                                                     */
287
/*                                                                           */
288
/*  Revision History:                                                        */
289
/*                                                                           */
290
/*         DD MM YYYY   Author(s)       Changes                              */
291
/*         14 09 2005   Hairsh M        First Version                        */
292
/*                                                                           */
293
/*****************************************************************************/
294
void impeg2d_mc_frm_dual_prime(dec_state_t *ps_dec)
295
16.0k
{
296
    /************************************************************************/
297
    /* Perform Motion Compensation                                          */
298
    /************************************************************************/
299
16.0k
    impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[FORW][FIRST], &ps_dec->s_mc_fw_buf);
300
16.0k
    impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[BACK][FIRST], &ps_dec->s_mc_bk_buf);
301
302
16.0k
    impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[FORW][SECOND], &ps_dec->s_mc_fw_buf);
303
16.0k
    impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[BACK][SECOND], &ps_dec->s_mc_bk_buf);
304
305
306
307
16.0k
    ps_dec->pf_interpolate(&ps_dec->s_mc_fw_buf,&ps_dec->s_mc_bk_buf,&ps_dec->s_dest_buf,ps_dec->u2_picture_width);
308
16.0k
}
309
310
311
312
/*****************************************************************************/
313
/*                                                                           */
314
/*  Function Name : impeg2d_mc_fld_dual_prime                                */
315
/*                                                                           */
316
/*  Description   : Perform motion compensation and store the resulting block*/
317
/*                  in the buf                                               */
318
/*                                                                           */
319
/*  Inputs        : params - Parameters required to do motion compensation   */
320
/*                                                                           */
321
/*  Globals       :                                                          */
322
/*                                                                           */
323
/*  Processing    : Calls appropriate functions depending on the mode of     */
324
/*                  compensation                                             */
325
/*                                                                           */
326
/*  Outputs       : buf       - Buffer for the motion compensation result    */
327
/*                                                                           */
328
/*  Returns       : None                                                     */
329
/*                                                                           */
330
/*  Issues        : None                                                     */
331
/*                                                                           */
332
/*  Revision History:                                                        */
333
/*                                                                           */
334
/*         DD MM YYYY   Author(s)       Changes                              */
335
/*         14 09 2005   Hairsh M        First Version                        */
336
/*                                                                           */
337
/*****************************************************************************/
338
void impeg2d_mc_fld_dual_prime(dec_state_t *ps_dec)
339
1.07k
{
340
    /************************************************************************/
341
    /* Perform Motion Compensation                                          */
342
    /************************************************************************/
343
1.07k
    impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[FORW][FIRST], &ps_dec->s_mc_fw_buf);
344
1.07k
    impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[FORW][SECOND], &ps_dec->s_mc_bk_buf);
345
346
347
1.07k
    ps_dec->pf_interpolate(&ps_dec->s_mc_fw_buf,&ps_dec->s_mc_bk_buf,&ps_dec->s_dest_buf,ps_dec->u2_picture_width);
348
1.07k
}
349
350
351
352
353
354
/*****************************************************************************/
355
/*                                                                           */
356
/*  Function Name : impeg2d_mc_4mv                                      */
357
/*                                                                           */
358
/*  Description   : Perform motion compensation and store the resulting block*/
359
/*                  in the buf                                               */
360
/*                                                                           */
361
/*  Inputs        : params - Parameters required to do motion compensation   */
362
/*                                                                           */
363
/*  Globals       :                                                          */
364
/*                                                                           */
365
/*  Processing    : Calls appropriate functions depending on the mode of     */
366
/*                  compensation                                             */
367
/*                                                                           */
368
/*  Outputs       : buf       - Buffer for the motion compensation result    */
369
/*                                                                           */
370
/*  Returns       : None                                                     */
371
/*                                                                           */
372
/*  Issues        : None                                                     */
373
/*                                                                           */
374
/*  Revision History:                                                        */
375
/*                                                                           */
376
/*         DD MM YYYY   Author(s)       Changes                              */
377
/*         14 09 2005   Hairsh M        First Version                        */
378
/*                                                                           */
379
/*****************************************************************************/
380
void impeg2d_mc_4mv(dec_state_t *ps_dec)
381
18.2k
{
382
    /************************************************************************/
383
    /* Perform Motion Compensation                                          */
384
    /************************************************************************/
385
18.2k
    impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[FORW][FIRST], &ps_dec->s_mc_fw_buf);
386
18.2k
    impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[BACK][FIRST], &ps_dec->s_mc_bk_buf);
387
18.2k
    impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[FORW][SECOND], &ps_dec->s_mc_fw_buf);
388
18.2k
    impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[BACK][SECOND], &ps_dec->s_mc_bk_buf);
389
390
18.2k
    ps_dec->pf_interpolate(&ps_dec->s_mc_fw_buf,&ps_dec->s_mc_bk_buf,&ps_dec->s_dest_buf,ps_dec->u2_picture_width);
391
18.2k
}
392
393
/*****************************************************************************/
394
/*                                                                           */
395
/*  Function Name : impeg2d_mc_2mv                                         */
396
/*                                                                           */
397
/*  Description   : Perform motion compensation and store the resulting block*/
398
/*                  in the buf                                               */
399
/*                                                                           */
400
/*  Inputs        : params - Parameters required to do motion compensation   */
401
/*                                                                           */
402
/*  Globals       :                                                          */
403
/*                                                                           */
404
/*  Processing    : Calls appropriate functions depending on the mode of     */
405
/*                  compensation                                             */
406
/*                                                                           */
407
/*  Outputs       : buf       - Buffer for the motion compensation result    */
408
/*                                                                           */
409
/*  Returns       : None                                                     */
410
/*                                                                           */
411
/*  Issues        : None                                                     */
412
/*                                                                           */
413
/*  Revision History:                                                        */
414
/*                                                                           */
415
/*         DD MM YYYY   Author(s)       Changes                              */
416
/*         14 09 2005   Hairsh M        First Version                        */
417
/*                                                                           */
418
/*****************************************************************************/
419
void impeg2d_mc_2mv(dec_state_t *ps_dec)
420
29.3k
{
421
   /************************************************************************/
422
    /* Perform Motion Compensation                                          */
423
    /************************************************************************/
424
29.3k
    impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[FORW][FIRST], &ps_dec->s_mc_fw_buf);
425
29.3k
    impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[BACK][FIRST], &ps_dec->s_mc_bk_buf);
426
427
29.3k
    ps_dec->pf_interpolate(&ps_dec->s_mc_fw_buf,&ps_dec->s_mc_bk_buf,&ps_dec->s_dest_buf,ps_dec->u2_picture_width);
428
29.3k
}
429
430
/*****************************************************************************
431
*  Function Name   : impeg2d_dec_intra_mb
432
*
433
*  Description     : Performs decoding of Intra MB
434
*
435
*  Arguments       :
436
*  dec             : Decoder state
437
*
438
*  Values Returned : None
439
*****************************************************************************/
440
void impeg2d_dec_intra_mb(dec_state_t *ps_dec)
441
5.99k
{
442
443
5.99k
    ps_dec->u2_cbp = 0x3F;
444
5.99k
    if(ps_dec->u2_concealment_motion_vectors)
445
2.05k
    {
446
447
2.05k
        stream_t *ps_stream;
448
449
2.05k
        ps_stream = &ps_dec->s_bit_stream;
450
        /* Decode the concealment motion vector */
451
2.05k
        impeg2d_dec_mv(ps_stream,ps_dec->ai2_pred_mv[FORW][FIRST],ps_dec->ai2_mv[FORW][FIRST],
452
2.05k
        ps_dec->au2_f_code[FORW],0,ps_dec->u2_fld_pic);
453
454
455
        /* Set the second motion vector predictor */
456
2.05k
        ps_dec->ai2_pred_mv[FORW][SECOND][MV_X] = ps_dec->ai2_pred_mv[FORW][FIRST][MV_X];
457
2.05k
        ps_dec->ai2_pred_mv[FORW][SECOND][MV_Y] = ps_dec->ai2_pred_mv[FORW][FIRST][MV_Y];
458
459
        /* Flush the marker bit */
460
2.05k
        if(0 == (impeg2d_bit_stream_get(ps_stream,1)))
461
538
        {
462
            /* Ignore marker bit error */
463
538
        }
464
2.05k
    }
465
3.93k
    else
466
3.93k
    {
467
        /* Reset the motion vector predictors */
468
3.93k
        memset(ps_dec->ai2_pred_mv,0,sizeof(ps_dec->ai2_pred_mv));
469
3.93k
    }
470
5.99k
}
471
472
/*****************************************************************************
473
*  Function Name   : impeg2d_dec_skip_p_mb
474
*
475
*  Description     : Performs decoding needed for Skipped MB encountered in
476
*                    P Pictures and B Pictures with previous MB not bi-predicted
477
*
478
*  Arguments       :
479
*  dec             : Decoder state
480
*
481
*  Values Returned : None
482
*****************************************************************************/
483
void impeg2d_dec_skip_p_mb(dec_state_t *ps_dec, WORD32 u4_num_of_mbs)
484
691k
{
485
691k
    WORD16  *pi2_mv;
486
487
691k
    e_mb_type_t e_mb_type;
488
691k
    mb_mc_params_t *ps_mc;
489
490
491
691k
    WORD32 i4_iter;
492
691k
    UWORD32 u4_dst_wd;
493
691k
    UWORD32  u4_dst_offset_x;
494
691k
    UWORD32  u4_dst_offset_y;
495
691k
    UWORD32 u4_frm_offset = 0;
496
691k
    yuv_buf_t s_dst;
497
498
691k
    u4_dst_wd = ps_dec->u2_frame_width;
499
500
691k
    if(ps_dec->u2_picture_structure != FRAME_PICTURE)
501
10.1k
    {
502
10.1k
        u4_dst_wd <<= 1;
503
10.1k
        if(ps_dec->u2_picture_structure == BOTTOM_FIELD)
504
8.06k
        {
505
8.06k
            u4_frm_offset = ps_dec->u2_frame_width;
506
8.06k
        }
507
10.1k
    }
508
509
13.3M
    for (i4_iter = u4_num_of_mbs; i4_iter > 0; i4_iter--)
510
12.6M
    {
511
12.6M
        if(ps_dec->u2_picture_structure == FRAME_PICTURE)
512
12.5M
        {
513
12.5M
            e_mb_type = MC_FRM_FW_AND_BK_2MV;
514
12.5M
        }
515
77.2k
        else
516
77.2k
        {
517
77.2k
            e_mb_type = MC_FLD_FW_AND_BK_2MV;
518
77.2k
        }
519
520
12.6M
        ps_dec->u2_prev_intra_mb = 0;
521
12.6M
        pi2_mv               = (WORD16 *)&(ps_dec->ai2_mv[FORW][FIRST]);
522
523
        /* Reset the motion vector predictors */
524
12.6M
        if(ps_dec->e_pic_type == P_PIC)
525
12.0M
        {
526
12.0M
            memset(ps_dec->ai2_pred_mv,0,sizeof(ps_dec->ai2_pred_mv));
527
12.0M
            pi2_mv[MV_X]    = pi2_mv[MV_Y] = 0;
528
529
12.0M
            ps_dec->u2_cbp     = 0;
530
531
12.0M
            pi2_mv           = (WORD16 *)&ps_dec->ai2_mv[FORW][FIRST];
532
12.0M
            ps_mc           = &ps_dec->as_mb_mc_params[FORW][FIRST];
533
12.0M
            ps_mc->s_ref      = ps_dec->as_ref_buf[ps_dec->e_mb_pred][ps_dec->u2_fld_parity];
534
535
12.0M
            impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, e_mb_type, 0,
536
12.0M
                      pi2_mv, ps_dec->u2_mb_x, ps_dec->u2_mb_y, ps_dec->u2_frame_width, ps_dec->u2_frame_height,ps_dec->u2_picture_width);
537
538
539
12.0M
            u4_dst_offset_x = (ps_dec->u2_mb_x << 4) + u4_frm_offset;
540
12.0M
            u4_dst_offset_y = (ps_dec->u2_mb_y << 4) * u4_dst_wd;
541
542
12.0M
            s_dst.pu1_y = ps_dec->s_cur_frm_buf.pu1_y + u4_dst_offset_x + u4_dst_offset_y;
543
544
12.0M
            u4_dst_offset_x = u4_dst_offset_x >> 1;
545
12.0M
            u4_dst_offset_y = u4_dst_offset_y >> 2;
546
547
12.0M
            s_dst.pu1_u = ps_dec->s_cur_frm_buf.pu1_u + u4_dst_offset_x + u4_dst_offset_y;
548
12.0M
            s_dst.pu1_v = ps_dec->s_cur_frm_buf.pu1_v + u4_dst_offset_x + u4_dst_offset_y;
549
550
551
12.0M
            ps_mc->s_ref.pu1_y += ps_mc->s_luma.u4_src_offset;
552
12.0M
            ps_mc->s_ref.pu1_u += ps_mc->s_chroma.u4_src_offset;
553
12.0M
            ps_mc->s_ref.pu1_v += ps_mc->s_chroma.u4_src_offset;
554
555
12.0M
            ps_dec->pf_copy_mb(&ps_mc->s_ref, &s_dst, ps_mc->s_luma.u4_src_wd, u4_dst_wd);
556
12.0M
        }
557
558
606k
        else
559
606k
        {
560
606k
            pi2_mv[MV_X]    = ps_dec->ai2_pred_mv[ps_dec->e_mb_pred][FIRST][MV_X];
561
606k
            pi2_mv[MV_Y]    = ps_dec->ai2_pred_mv[ps_dec->e_mb_pred][FIRST][MV_Y];
562
563
606k
            ps_dec->u2_cbp     = 0;
564
565
606k
            pi2_mv           = (WORD16 *)&ps_dec->ai2_mv[FORW][FIRST];
566
606k
            ps_mc           = &ps_dec->as_mb_mc_params[FORW][FIRST];
567
606k
            ps_mc->s_ref      = ps_dec->as_ref_buf[ps_dec->e_mb_pred][ps_dec->u2_fld_parity];
568
569
606k
            impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, e_mb_type, 0,
570
606k
                      pi2_mv, ps_dec->u2_mb_x, ps_dec->u2_mb_y, ps_dec->u2_frame_width, ps_dec->u2_frame_height,ps_dec->u2_picture_width);
571
572
606k
            u4_dst_offset_x = (ps_dec->u2_mb_x << 4) + u4_frm_offset;
573
606k
            u4_dst_offset_y = (ps_dec->u2_mb_y << 4) * u4_dst_wd;
574
575
606k
            ps_mc->s_luma.u4_dst_offset_res_buf = u4_dst_offset_x + u4_dst_offset_y;
576
606k
            ps_mc->s_luma.u4_dst_wd_res_buf = u4_dst_wd;
577
578
606k
            u4_dst_offset_x = u4_dst_offset_x >> 1;
579
606k
            u4_dst_offset_y = u4_dst_offset_y >> 2;
580
581
606k
            ps_mc->s_chroma.u4_dst_offset_res_buf = u4_dst_offset_x + u4_dst_offset_y;
582
606k
            ps_mc->s_chroma.u4_dst_wd_res_buf = u4_dst_wd >> 1;
583
584
606k
            impeg2d_motion_comp(ps_dec, ps_mc, &ps_dec->s_cur_frm_buf);
585
606k
        }
586
587
588
        /********************************************************************/
589
        /* Common MB processing tasks                                       */
590
        /********************************************************************/
591
12.6M
        ps_dec->u2_mb_x++;
592
12.6M
        ps_dec->u2_num_mbs_left--;
593
594
12.6M
        if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
595
87.1k
        {
596
87.1k
            ps_dec->u2_mb_x = 0;
597
87.1k
            ps_dec->u2_mb_y++;
598
87.1k
        }
599
12.6M
    }
600
601
691k
}
602
603
/*******************************************************************************
604
*  Function Name   : impeg2d_dec_skip_b_mb
605
*
606
*  Description     : Performs processing needed for Skipped MB encountered in
607
*                    B Pictures with previous MB bi-predicted.
608
*
609
*  Arguments       :
610
*  dec             : Decoder state
611
*
612
*  Values Returned : None
613
*******************************************************************************/
614
void impeg2d_dec_skip_b_mb(dec_state_t *ps_dec, WORD32 u4_num_of_mbs)
615
28.7k
{
616
617
618
28.7k
    WORD16  *pi2_mv;
619
620
28.7k
    UWORD32 i;
621
28.7k
    e_mb_type_t e_mb_type;
622
28.7k
    mb_mc_params_t *ps_mc;
623
624
28.7k
    WORD32 i4_iter;
625
28.7k
    UWORD32 u4_dst_wd;
626
28.7k
    yuv_buf_t s_dst;
627
28.7k
    UWORD32  u4_dst_offset_x;
628
28.7k
    UWORD32  u4_dst_offset_y;
629
28.7k
    UWORD32 u4_frm_offset = 0;
630
631
28.7k
    u4_dst_wd = ps_dec->u2_frame_width;
632
28.7k
    s_dst = ps_dec->s_cur_frm_buf;
633
634
28.7k
    if(ps_dec->u2_picture_structure != FRAME_PICTURE)
635
4.29k
    {
636
4.29k
        u4_dst_wd <<= 1;
637
4.29k
        if(ps_dec->u2_picture_structure == BOTTOM_FIELD)
638
3.44k
        {
639
3.44k
            u4_frm_offset = ps_dec->u2_frame_width;
640
3.44k
        }
641
4.29k
    }
642
643
128k
    for (i4_iter = u4_num_of_mbs; i4_iter > 0; i4_iter--)
644
99.3k
    {
645
99.3k
        ps_dec->u2_prev_intra_mb = 0;
646
647
99.3k
        if(ps_dec->u2_picture_structure == FRAME_PICTURE)
648
84.2k
        {
649
84.2k
            e_mb_type = MC_FRM_FW_AND_BK_2MV;
650
84.2k
        }
651
15.1k
        else
652
15.1k
        {
653
15.1k
            e_mb_type = MC_FLD_FW_AND_BK_2MV;
654
15.1k
        }
655
656
        /************************************************************************/
657
        /* Setting of first motion vector for B MB                              */
658
        /************************************************************************/
659
99.3k
        pi2_mv               = (WORD16 *)&(ps_dec->ai2_mv[FORW][FIRST]);
660
99.3k
        {
661
99.3k
            pi2_mv[MV_X]         = ps_dec->ai2_pred_mv[FORW][FIRST][MV_X];
662
99.3k
            pi2_mv[MV_Y]         = ps_dec->ai2_pred_mv[FORW][FIRST][MV_Y];
663
99.3k
        }
664
        /************************************************************************/
665
        /* Setting of second motion vector for B MB                             */
666
        /************************************************************************/
667
99.3k
        pi2_mv               = (WORD16 *)&(ps_dec->ai2_mv[BACK][FIRST]);
668
99.3k
        {
669
99.3k
            pi2_mv[MV_X]         = ps_dec->ai2_pred_mv[BACK][FIRST][MV_X];
670
99.3k
            pi2_mv[MV_Y]         = ps_dec->ai2_pred_mv[BACK][FIRST][MV_Y];
671
99.3k
        }
672
99.3k
        ps_dec->u2_cbp  = 0;
673
674
297k
        for(i = 0; i < 2; i++)
675
198k
        {
676
198k
            pi2_mv          = (WORD16 *)&ps_dec->ai2_mv[i][FIRST];
677
198k
            ps_mc          = &ps_dec->as_mb_mc_params[i][FIRST];
678
198k
            ps_mc->s_ref     = ps_dec->as_ref_buf[i][ps_dec->u2_fld_parity];
679
680
198k
            impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, e_mb_type, 0, pi2_mv, ps_dec->u2_mb_x,
681
198k
                          ps_dec->u2_mb_y, ps_dec->u2_frame_width, ps_dec->u2_frame_height,ps_dec->u2_picture_width);
682
198k
        }
683
684
99.3k
        impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[FORW][FIRST], &ps_dec->s_mc_fw_buf);
685
99.3k
        impeg2d_motion_comp(ps_dec, &ps_dec->as_mb_mc_params[BACK][FIRST], &ps_dec->s_mc_bk_buf);
686
687
99.3k
        u4_dst_offset_x = (ps_dec->u2_mb_x << 4) + u4_frm_offset;
688
99.3k
        u4_dst_offset_y = (ps_dec->u2_mb_y << 4) * u4_dst_wd;
689
690
99.3k
        s_dst.pu1_y = ps_dec->s_cur_frm_buf.pu1_y + u4_dst_offset_x + u4_dst_offset_y;
691
692
99.3k
        u4_dst_offset_x = u4_dst_offset_x >> 1;
693
99.3k
        u4_dst_offset_y = u4_dst_offset_y >> 2;
694
695
99.3k
        s_dst.pu1_u = ps_dec->s_cur_frm_buf.pu1_u + u4_dst_offset_x + u4_dst_offset_y;
696
99.3k
        s_dst.pu1_v = ps_dec->s_cur_frm_buf.pu1_v + u4_dst_offset_x + u4_dst_offset_y;
697
698
99.3k
        ps_dec->pf_interpolate(&ps_dec->s_mc_fw_buf,&ps_dec->s_mc_bk_buf,&s_dst, u4_dst_wd);
699
//        dec->pf_copy_mb(&dec->mc_buf, &dst, MB_SIZE, dst_wd);
700
701
        /********************************************************************/
702
        /* Common MB processing tasks                                       */
703
        /********************************************************************/
704
99.3k
        ps_dec->u2_mb_x++;
705
99.3k
        ps_dec->u2_num_mbs_left--;
706
707
99.3k
        if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
708
1.08k
        {
709
1.08k
            ps_dec->u2_mb_x = 0;
710
1.08k
            ps_dec->u2_mb_y++;
711
1.08k
        }
712
99.3k
    }
713
28.7k
}
714
/*******************************************************************************
715
*  Function Name   : impeg2d_dec_skip_mbs
716
*
717
*  Description     : Performs processing needed for Skipped MB encountered in
718
*                    B Pictures with previous MB bi-predicted.
719
*
720
*  Arguments       :
721
*  dec             : Decoder state
722
*
723
*  Values Returned : None
724
*******************************************************************************/
725
void impeg2d_dec_skip_mbs(dec_state_t *ps_dec, UWORD16 u2_num_skip_mbs)
726
720k
{
727
720k
    PROFILE_DISABLE_SKIP_MB();
728
729
720k
    if(ps_dec->e_mb_pred == BIDIRECT)
730
28.7k
    {
731
28.7k
        impeg2d_dec_skip_b_mb(ps_dec, u2_num_skip_mbs);
732
28.7k
    }
733
691k
    else
734
691k
    {
735
691k
        impeg2d_dec_skip_p_mb(ps_dec, u2_num_skip_mbs);
736
691k
    }
737
738
720k
    ps_dec->u2_def_dc_pred[Y_LUMA] = 128 << ps_dec->u2_intra_dc_precision;
739
720k
    ps_dec->u2_def_dc_pred[U_CHROMA] = 128 << ps_dec->u2_intra_dc_precision;
740
720k
    ps_dec->u2_def_dc_pred[V_CHROMA] = 128 << ps_dec->u2_intra_dc_precision;
741
720k
}
742
743
744
745
746
/*****************************************************************************
747
*  Function Name   : impeg2d_dec_0mv_coded_mb
748
*
749
*  Description     : Decodes the MB with 0 MV but coded. This can occur in P
750
*                    pictures only
751
*
752
*  Arguments       :
753
*  dec             : Decoder state
754
*
755
*  Values Returned : None
756
*****************************************************************************/
757
void impeg2d_dec_0mv_coded_mb(dec_state_t *ps_dec)
758
437k
{
759
760
761
437k
    WORD16   *pi2_mv;
762
437k
    e_mb_type_t e_mb_type;
763
437k
    mb_mc_params_t *ps_mc;
764
765
437k
    if(ps_dec->u2_picture_structure == FRAME_PICTURE)
766
431k
    {
767
431k
        e_mb_type = MC_FRM_FW_AND_BK_2MV;
768
431k
    }
769
6.70k
    else
770
6.70k
    {
771
6.70k
        e_mb_type = MC_FLD_FW_AND_BK_2MV;
772
6.70k
    }
773
774
775
776
777
    /* Reset the motion vector predictors */
778
437k
    memset(ps_dec->ai2_pred_mv,0,sizeof(ps_dec->ai2_pred_mv));
779
780
437k
    pi2_mv           = (WORD16 *)&ps_dec->ai2_mv[FORW][FIRST];
781
437k
    ps_mc           = &ps_dec->as_mb_mc_params[FORW][FIRST];
782
437k
    ps_mc->s_ref      = ps_dec->as_ref_buf[FORW][ps_dec->u2_fld_parity];
783
784
437k
    pi2_mv[MV_X] = 0;
785
437k
    pi2_mv[MV_Y] = 0;
786
787
437k
    impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, e_mb_type, 0,
788
437k
              pi2_mv, ps_dec->u2_mb_x, ps_dec->u2_mb_y, ps_dec->u2_frame_width, ps_dec->u2_frame_height,ps_dec->u2_picture_width);
789
437k
}
790
791
/*****************************************************************************/
792
/*                                                                           */
793
/*  Function Name : impeg2d_mc_halfx_halfy()                                 */
794
/*                                                                           */
795
/*  Description   : Gets the buffer from (0.5,0.5) to (8.5,8.5)              */
796
/*                  and the above block of size 8 x 8 will be placed as a    */
797
/*                  block from the current position of out_buf               */
798
/*                                                                           */
799
/*  Inputs        : ref - Reference frame from which the block will be       */
800
/*                        block will be extracted.                           */
801
/*                  ref_wid - WIdth of reference frame                       */
802
/*                  out_wid - WIdth of the output frame                      */
803
/*                  blk_width  - width of the block                          */
804
/*                  blk_width  - height of the block                         */
805
/*                                                                           */
806
/*  Globals       : None                                                     */
807
/*                                                                           */
808
/*  Processing    : Point to the (0,0),(1,0),(0,1),(1,1) position in         */
809
/*                  the ref frame.Interpolate these four values to get the   */
810
/*                  value at(0.5,0.5).Repeat this to get an 8 x 8 block      */
811
/*                  using 9 x 9 block from reference frame                   */
812
/*                                                                           */
813
/*  Outputs       : out -  Output containing the extracted block             */
814
/*                                                                           */
815
/*  Returns       : None                                                     */
816
/*                                                                           */
817
/*  Issues        : None                                                     */
818
/*                                                                           */
819
/*  Revision History:                                                        */
820
/*                                                                           */
821
/*         DD MM YYYY   Author(s)       Changes                              */
822
/*         05 09 2005   Harish M        First Version                        */
823
/*                                                                           */
824
/*****************************************************************************/
825
void impeg2d_mc_halfx_halfy(void *pv_dec,
826
                           UWORD8 *pu1_ref,
827
                           UWORD32 u4_ref_wid,
828
                           UWORD8 *pu1_out,
829
                           UWORD32 u4_out_wid,
830
                           UWORD32 u4_blk_width,
831
                           UWORD32 u4_blk_height)
832
4.69M
{
833
4.69M
   UWORD8 *pu1_out_ptr,*pu1_ref_ptr;
834
4.69M
   dec_state_t *ps_dec = (dec_state_t *)pv_dec;
835
836
4.69M
        pu1_out_ptr = pu1_out;
837
4.69M
        pu1_ref_ptr = pu1_ref;
838
839
4.69M
    if((u4_blk_width == MB_SIZE) && (u4_blk_height == MB_SIZE))
840
604k
    {
841
842
        /*luma 16 x 16*/
843
844
        /*block 0*/
845
604k
        ps_dec->pf_halfx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
846
847
        /*block1*/
848
604k
        pu1_out_ptr = (pu1_out + BLK_SIZE);
849
604k
        pu1_ref_ptr = (pu1_ref + BLK_SIZE);
850
604k
        ps_dec->pf_halfx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
851
852
        /*block 2*/
853
604k
        pu1_out_ptr = pu1_out + BLK_SIZE * u4_out_wid;
854
604k
        pu1_ref_ptr = pu1_ref + BLK_SIZE * u4_ref_wid;
855
604k
        ps_dec->pf_halfx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
856
857
        /*block 3*/
858
604k
        pu1_out_ptr = pu1_out + BLK_SIZE * u4_out_wid + BLK_SIZE;
859
604k
        pu1_ref_ptr = pu1_ref + BLK_SIZE * u4_ref_wid + BLK_SIZE;
860
604k
        ps_dec->pf_halfx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
861
862
863
864
865
604k
    }
866
4.08M
    else if ((u4_blk_width == BLK_SIZE) && (u4_blk_height == BLK_SIZE))
867
3.98M
    {
868
        /*chroma 8 x 8*/
869
3.98M
        ps_dec->pf_halfx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
870
3.98M
    }
871
104k
    else if ((u4_blk_width == MB_SIZE) && (u4_blk_height == BLK_SIZE))
872
33.7k
    {
873
        /*block 0*/
874
33.7k
        ps_dec->pf_halfx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
875
876
        /*block 1*/
877
33.7k
        pu1_out_ptr = (pu1_out + BLK_SIZE);
878
33.7k
        pu1_ref_ptr = (pu1_ref + BLK_SIZE);
879
33.7k
        ps_dec->pf_halfx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
880
881
33.7k
    }
882
883
71.0k
    else
884
71.0k
    {
885
71.0k
        UWORD8 *ref_p0,*ref_p1,*ref_p2,*ref_p3;
886
71.0k
        UWORD32 i,j;
887
        /* P0-P3 are the pixels in the reference frame and Q is the value being */
888
        /* estimated                                                            */
889
        /*
890
           P0 P1
891
             Q
892
           P2 P3
893
        */
894
895
71.0k
        ref_p0 = pu1_ref;
896
71.0k
        ref_p1 = pu1_ref + 1;
897
71.0k
        ref_p2 = pu1_ref + u4_ref_wid;
898
71.0k
        ref_p3 = pu1_ref + u4_ref_wid + 1;
899
900
359k
        for(i = 0; i < u4_blk_height; i++)
901
288k
        {
902
2.59M
            for(j = 0; j < u4_blk_width; j++)
903
2.30M
            {
904
2.30M
                *pu1_out++ =   (( (*ref_p0++ )
905
2.30M
                            + (*ref_p1++ )
906
2.30M
                            + (*ref_p2++ )
907
2.30M
                            + (*ref_p3++ ) + 2 ) >> 2);
908
2.30M
            }
909
288k
            ref_p0 += u4_ref_wid - u4_blk_width;
910
288k
            ref_p1 += u4_ref_wid - u4_blk_width;
911
288k
            ref_p2 += u4_ref_wid - u4_blk_width;
912
288k
            ref_p3 += u4_ref_wid - u4_blk_width;
913
914
288k
            pu1_out    += u4_out_wid - u4_blk_width;
915
288k
        }
916
71.0k
    }
917
4.69M
    return;
918
4.69M
}
919
920
/*****************************************************************************/
921
/*                                                                           */
922
/*  Function Name : impeg2d_mc_halfx_fully()                                 */
923
/*                                                                           */
924
/*  Description   : Gets the buffer from (0.5,0) to (8.5,8)                  */
925
/*                  and the above block of size 8 x 8 will be placed as a    */
926
/*                  block from the current position of out_buf               */
927
/*                                                                           */
928
/*  Inputs        : ref - Reference frame from which the block will be       */
929
/*                        block will be extracted.                           */
930
/*                  ref_wid - WIdth of reference frame                       */
931
/*                  out_wid - WIdth of the output frame                      */
932
/*                  blk_width  - width of the block                          */
933
/*                  blk_width  - height of the block                         */
934
/*                                                                           */
935
/*  Globals       : None                                                     */
936
/*                                                                           */
937
/*  Processing    : Point to the (0,0) and (1,0) position in the ref frame   */
938
/*                  Interpolate these two values to get the value at(0.5,0)  */
939
/*                  Repeat this to get an 8 x 8 block using 9 x 8 block from */
940
/*                  reference frame                                          */
941
/*                                                                           */
942
/*  Outputs       : out -  Output containing the extracted block             */
943
/*                                                                           */
944
/*  Returns       : None                                                     */
945
/*                                                                           */
946
/*  Issues        : None                                                     */
947
/*                                                                           */
948
/*  Revision History:                                                        */
949
/*                                                                           */
950
/*         DD MM YYYY   Author(s)       Changes                              */
951
/*         05 09 2005   Harish M        First Version                        */
952
/*                                                                           */
953
/*****************************************************************************/
954
955
void impeg2d_mc_halfx_fully(void *pv_dec,
956
                            UWORD8 *pu1_ref,
957
                            UWORD32 u4_ref_wid,
958
                            UWORD8 *pu1_out,
959
                            UWORD32 u4_out_wid,
960
                            UWORD32 u4_blk_width,
961
                            UWORD32 u4_blk_height)
962
4.29M
{
963
4.29M
    UWORD8 *pu1_out_ptr,*pu1_ref_ptr;
964
4.29M
    dec_state_t *ps_dec = (dec_state_t *)pv_dec;
965
966
4.29M
        pu1_out_ptr = pu1_out;
967
4.29M
        pu1_ref_ptr = pu1_ref;
968
969
4.29M
    if((u4_blk_width == MB_SIZE) && (u4_blk_height == MB_SIZE))
970
1.63M
    {
971
972
        /*luma 16 x 16*/
973
974
        /*block 0*/
975
1.63M
        ps_dec->pf_halfx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
976
977
        /*block1*/
978
1.63M
        pu1_out_ptr = (pu1_out + BLK_SIZE);
979
1.63M
        pu1_ref_ptr = (pu1_ref + BLK_SIZE);
980
1.63M
        ps_dec->pf_halfx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
981
982
        /*block 2*/
983
1.63M
        pu1_out_ptr = pu1_out + BLK_SIZE * u4_out_wid;
984
1.63M
        pu1_ref_ptr = pu1_ref + BLK_SIZE * u4_ref_wid;
985
1.63M
        ps_dec->pf_halfx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
986
987
        /*block 3*/
988
1.63M
        pu1_out_ptr = pu1_out + BLK_SIZE * u4_out_wid + BLK_SIZE;
989
1.63M
        pu1_ref_ptr = pu1_ref + BLK_SIZE * u4_ref_wid + BLK_SIZE;
990
1.63M
        ps_dec->pf_halfx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
991
992
993
994
995
1.63M
    }
996
2.66M
    else if ((u4_blk_width == BLK_SIZE) && (u4_blk_height == BLK_SIZE))
997
2.54M
    {
998
        /*chroma 8 x 8*/
999
2.54M
        ps_dec->pf_halfx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1000
2.54M
    }
1001
128k
    else if ((u4_blk_width == MB_SIZE) && (u4_blk_height == BLK_SIZE))
1002
42.8k
    {
1003
        /*block 0*/
1004
42.8k
        ps_dec->pf_halfx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1005
1006
        /*block 1*/
1007
42.8k
        pu1_out_ptr = (pu1_out + BLK_SIZE);
1008
42.8k
        pu1_ref_ptr = (pu1_ref + BLK_SIZE);
1009
42.8k
        ps_dec->pf_halfx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1010
1011
42.8k
    }
1012
1013
85.2k
    else
1014
85.2k
    {
1015
85.2k
        UWORD8 *ref_p0,*ref_p1;
1016
85.2k
        UWORD32 i,j;
1017
1018
        /* P0-P3 are the pixels in the reference frame and Q is the value being */
1019
        /* estimated                                                            */
1020
        /*
1021
           P0 Q P1
1022
        */
1023
1024
85.2k
        ref_p0 = pu1_ref;
1025
85.2k
        ref_p1 = pu1_ref + 1;
1026
1027
453k
        for(i = 0; i < u4_blk_height; i++)
1028
368k
        {
1029
3.30M
            for(j = 0; j < u4_blk_width; j++)
1030
2.93M
            {
1031
2.93M
                *pu1_out++ =   ((( *ref_p0++ )
1032
2.93M
                            + (*ref_p1++) + 1 ) >> 1);
1033
2.93M
            }
1034
368k
            ref_p0 += u4_ref_wid - u4_blk_width;
1035
368k
            ref_p1 += u4_ref_wid - u4_blk_width;
1036
1037
368k
            pu1_out    += u4_out_wid - u4_blk_width;
1038
368k
        }
1039
85.2k
    }
1040
4.29M
    return;
1041
4.29M
}
1042
1043
1044
/*****************************************************************************/
1045
/*                                                                           */
1046
/*  Function Name : impeg2d_mc_fullx_halfy()                                 */
1047
/*                                                                           */
1048
/*  Description   : Gets the buffer from (0,0.5) to (8,8.5)                  */
1049
/*                  and the above block of size 8 x 8 will be placed as a    */
1050
/*                  block from the current position of out_buf               */
1051
/*                                                                           */
1052
/*  Inputs        : ref - Reference frame from which the block will be       */
1053
/*                        block will be extracted.                           */
1054
/*                  ref_wid - WIdth of reference frame                       */
1055
/*                  out_wid - WIdth of the output frame                      */
1056
/*                  blk_width  - width of the block                          */
1057
/*                  blk_width  - height of the block                         */
1058
/*                                                                           */
1059
/*  Globals       : None                                                     */
1060
/*                                                                           */
1061
/*  Processing    : Point to the (0,0) and (0,1)   position in the ref frame */
1062
/*                  Interpolate these two values to get the value at(0,0.5)  */
1063
/*                  Repeat this to get an 8 x 8 block using 8 x 9 block from */
1064
/*                  reference frame                                          */
1065
/*                                                                           */
1066
/*  Outputs       : out -  Output containing the extracted block             */
1067
/*                                                                           */
1068
/*  Returns       : None                                                     */
1069
/*                                                                           */
1070
/*  Issues        : None                                                     */
1071
/*                                                                           */
1072
/*  Revision History:                                                        */
1073
/*                                                                           */
1074
/*         DD MM YYYY   Author(s)       Changes                              */
1075
/*         05 09 2005   Harish M        First Version                        */
1076
/*                                                                           */
1077
/*****************************************************************************/
1078
void impeg2d_mc_fullx_halfy(void *pv_dec,
1079
                            UWORD8 *pu1_ref,
1080
                            UWORD32 u4_ref_wid,
1081
                            UWORD8 *pu1_out,
1082
                            UWORD32 u4_out_wid,
1083
                            UWORD32 u4_blk_width,
1084
                            UWORD32 u4_blk_height)
1085
5.58M
{
1086
1087
5.58M
    UWORD8 *pu1_out_ptr,*pu1_ref_ptr;
1088
5.58M
    dec_state_t *ps_dec = (dec_state_t *)pv_dec;
1089
5.58M
        pu1_out_ptr = pu1_out;
1090
5.58M
        pu1_ref_ptr = pu1_ref;
1091
1092
5.58M
    if((u4_blk_width == MB_SIZE) && (u4_blk_height == MB_SIZE))
1093
1.14M
    {
1094
1095
        /*luma 16 x 16*/
1096
1097
        /*block 0*/
1098
1.14M
        ps_dec->pf_fullx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1099
1100
        /*block1*/
1101
1.14M
        pu1_out_ptr = (pu1_out + BLK_SIZE);
1102
1.14M
        pu1_ref_ptr = (pu1_ref + BLK_SIZE);
1103
1.14M
        ps_dec->pf_fullx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1104
1105
        /*block 2*/
1106
1.14M
        pu1_out_ptr = pu1_out + BLK_SIZE * u4_out_wid;
1107
1.14M
        pu1_ref_ptr = pu1_ref + BLK_SIZE * u4_ref_wid;
1108
1.14M
        ps_dec->pf_fullx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1109
1110
        /*block 3*/
1111
1.14M
        pu1_out_ptr = pu1_out + BLK_SIZE * u4_out_wid + BLK_SIZE;
1112
1.14M
        pu1_ref_ptr = pu1_ref + BLK_SIZE * u4_ref_wid + BLK_SIZE;
1113
1.14M
        ps_dec->pf_fullx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1114
1115
1116
1117
1118
1.14M
    }
1119
4.43M
    else if ((u4_blk_width == BLK_SIZE) && (u4_blk_height == BLK_SIZE))
1120
4.32M
    {
1121
        /*chroma 8 x 8*/
1122
4.32M
        ps_dec->pf_fullx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1123
4.32M
    }
1124
117k
    else if ((u4_blk_width == MB_SIZE) && (u4_blk_height == BLK_SIZE))
1125
45.2k
    {
1126
        /*block 0*/
1127
45.2k
        ps_dec->pf_fullx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1128
1129
        /*block 1*/
1130
45.2k
        pu1_out_ptr = (pu1_out + BLK_SIZE);
1131
45.2k
        pu1_ref_ptr = (pu1_ref + BLK_SIZE);
1132
45.2k
        ps_dec->pf_fullx_halfy_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1133
1134
45.2k
    }
1135
1136
80.1k
    else if ((u4_blk_width == BLK_SIZE) && (u4_blk_height == (BLK_SIZE / 2)))
1137
80.1k
    {
1138
80.1k
        UWORD8 *ref_p0,*ref_p1;
1139
80.1k
        UWORD32 i,j;
1140
        /* P0-P3 are the pixels in the reference frame and Q is the value being */
1141
        /* estimated                                                            */
1142
        /*
1143
           P0
1144
            x
1145
           P1
1146
        */
1147
80.1k
        ref_p0 = pu1_ref;
1148
80.1k
        ref_p1 = pu1_ref + u4_ref_wid;
1149
1150
399k
        for(i = 0; i < u4_blk_height; i++)
1151
319k
        {
1152
2.86M
            for(j = 0; j < u4_blk_width; j++)
1153
2.54M
            {
1154
2.54M
                *pu1_out++ =   ((( *ref_p0++)
1155
2.54M
                            + (*ref_p1++) + 1 ) >> 1);
1156
2.54M
            }
1157
319k
            ref_p0 += u4_ref_wid - u4_blk_width;
1158
319k
            ref_p1 += u4_ref_wid - u4_blk_width;
1159
1160
319k
            pu1_out    += u4_out_wid - u4_blk_width;
1161
319k
        }
1162
80.1k
    }
1163
5.58M
    return;
1164
5.58M
}
1165
1166
/*****************************************************************************/
1167
/*                                                                           */
1168
/*  Function Name : impeg2d_mc_fullx_fully()                                 */
1169
/*                                                                           */
1170
/*  Description   : Gets the buffer from (x,y) to (x+8,y+8)                  */
1171
/*                  and the above block of size 8 x 8 will be placed as a    */
1172
/*                  block from the current position of out_buf               */
1173
/*                                                                           */
1174
/*  Inputs        : ref - Reference frame from which the block will be       */
1175
/*                        block will be extracted.                           */
1176
/*                  ref_wid - WIdth of reference frame                       */
1177
/*                  out_wid - WIdth of the output frame                      */
1178
/*                  blk_width  - width of the block                          */
1179
/*                  blk_width  - height of the block                         */
1180
/*                                                                           */
1181
/*  Globals       : None                                                     */
1182
/*                                                                           */
1183
/*  Processing    : Point to the (0,0) position in the ref frame             */
1184
/*                  Get an 8 x 8 block from reference frame                  */
1185
/*                                                                           */
1186
/*  Outputs       : out -  Output containing the extracted block             */
1187
/*                                                                           */
1188
/*  Returns       : None                                                     */
1189
/*                                                                           */
1190
/*  Issues        : None                                                     */
1191
/*                                                                           */
1192
/*  Revision History:                                                        */
1193
/*                                                                           */
1194
/*         DD MM YYYY   Author(s)       Changes                              */
1195
/*         05 09 2005   Harish M        First Version                        */
1196
/*                                                                           */
1197
/*****************************************************************************/
1198
1199
void impeg2d_mc_fullx_fully(void *pv_dec,
1200
                            UWORD8 *pu1_ref,
1201
                            UWORD32 u4_ref_wid,
1202
                            UWORD8 *pu1_out,
1203
                            UWORD32 u4_out_wid,
1204
                            UWORD32 u4_blk_width,
1205
                            UWORD32 u4_blk_height)
1206
9.09M
{
1207
1208
9.09M
    UWORD8 *pu1_out_ptr,*pu1_ref_ptr;
1209
9.09M
    dec_state_t *ps_dec = (dec_state_t *)pv_dec;
1210
1211
9.09M
        pu1_out_ptr = pu1_out;
1212
9.09M
        pu1_ref_ptr = pu1_ref;
1213
1214
9.09M
    if((u4_blk_width == MB_SIZE) && (u4_blk_height == MB_SIZE))
1215
4.35M
    {
1216
1217
        /*luma 16 x 16*/
1218
1219
        /*block 0*/
1220
4.35M
        ps_dec->pf_fullx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1221
1222
        /*block1*/
1223
4.35M
        pu1_out_ptr = (pu1_out + BLK_SIZE);
1224
4.35M
        pu1_ref_ptr = (pu1_ref + BLK_SIZE);
1225
4.35M
        ps_dec->pf_fullx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1226
1227
        /*block 2*/
1228
4.35M
        pu1_out_ptr = pu1_out + BLK_SIZE * u4_out_wid;
1229
4.35M
        pu1_ref_ptr = pu1_ref + BLK_SIZE * u4_ref_wid;
1230
4.35M
        ps_dec->pf_fullx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1231
1232
        /*block 3*/
1233
4.35M
        pu1_out_ptr = pu1_out + BLK_SIZE * u4_out_wid + BLK_SIZE;
1234
4.35M
        pu1_ref_ptr = pu1_ref + BLK_SIZE * u4_ref_wid + BLK_SIZE;
1235
4.35M
        ps_dec->pf_fullx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1236
1237
1238
1239
1240
4.35M
    }
1241
4.74M
    else if ((u4_blk_width == BLK_SIZE) && (u4_blk_height == BLK_SIZE))
1242
4.56M
    {
1243
        /*chroma 8 x 8*/
1244
4.56M
        ps_dec->pf_fullx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1245
4.56M
    }
1246
177k
    else if ((u4_blk_width == MB_SIZE) && (u4_blk_height == BLK_SIZE))
1247
68.3k
    {
1248
        /*block 0*/
1249
68.3k
        ps_dec->pf_fullx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1250
1251
        /*block 1*/
1252
68.3k
        pu1_out_ptr = (pu1_out + BLK_SIZE);
1253
68.3k
        pu1_ref_ptr = (pu1_ref + BLK_SIZE);
1254
68.3k
        ps_dec->pf_fullx_fully_8x8(pu1_out_ptr,pu1_ref_ptr,u4_ref_wid,u4_out_wid);
1255
1256
68.3k
    }
1257
109k
    else
1258
109k
    {
1259
109k
        UWORD32 i;
1260
1261
642k
        for(i = 0; i < u4_blk_height; i++)
1262
533k
        {
1263
533k
            memmove(pu1_out, pu1_ref, u4_blk_width);
1264
533k
            pu1_ref += u4_ref_wid;
1265
533k
            pu1_out += u4_out_wid;
1266
533k
        }
1267
109k
    }
1268
9.09M
    return;
1269
9.09M
}
1270
1271
/*******************************************************************************
1272
*  Function Name   : impeg2d_set_mc_params
1273
*
1274
*  Description     : Sets the parameters for Motion Compensation
1275
*
1276
*  Arguments       :
1277
*  luma            : Parameters for luma blocks
1278
*  chroma          : Parameters for chroma blocks
1279
*  type            : Motion compensation type
1280
*  mv_num          : Number of motion vectors
1281
*  mv              : Motion Vectors
1282
*  mb_x            : X co-ordinate of MB
1283
*  mb_y            : Y co-ordinate of MB
1284
*  frm_wd          : Width of the frame
1285
*
1286
*  Values Returned : None
1287
*******************************************************************************/
1288
void impeg2d_set_mc_params(comp_mc_params_t *ps_luma,
1289
                           comp_mc_params_t *ps_chroma,
1290
                           e_mb_type_t e_type,
1291
                           UWORD16 u2_mv_num,
1292
                           WORD16 ai2_mv[],
1293
                           UWORD16 u2_mb_x,
1294
                           UWORD16 u2_mb_y,
1295
                           UWORD16 u2_frm_wd,
1296
                           UWORD16 u2_frm_ht,
1297
                           UWORD16 u2_picture_width)
1298
20.4M
{
1299
20.4M
    WORD16 i2_mvy_round;
1300
20.4M
    WORD16 i2_mvx_round;
1301
20.4M
    const mc_type_consts_t *ps_mc_params;
1302
20.4M
    WORD16 i2_mvx_fullp_round;
1303
20.4M
    WORD16 i2_mvy_fullp_round;
1304
20.4M
    UWORD32 u4_frm_chroma_wd;
1305
20.4M
    WORD16 i2_pix_x, i2_pix_y;
1306
1307
20.4M
    ps_mc_params = &gas_impeg2d_mc_params_luma[e_type][u2_mv_num];
1308
    /****************************************************************************/
1309
    /* get luma mc params                                                       */
1310
    /****************************************************************************/
1311
20.4M
    i2_pix_x = MB_SIZE * u2_mb_x + (ai2_mv[MV_X]>>1);
1312
20.4M
    i2_pix_y = (MB_SIZE * u2_mb_y  +
1313
20.4M
        (ai2_mv[MV_Y]>>1) * ps_mc_params->mvy_cf + u2_mv_num * ps_mc_params->mv_num_cf) * ps_mc_params->frm_wd_cf;
1314
1315
    // clip pix_x and pix_y so as it falls inside the frame boundary
1316
20.4M
    CLIP(i2_pix_x, (u2_frm_wd-16), 0);
1317
20.4M
    CLIP(i2_pix_y, (u2_frm_ht-16), 0);
1318
1319
20.4M
    ps_luma->u4_src_offset = i2_pix_x +  i2_pix_y * u2_frm_wd;
1320
1321
1322
    /* keep offset  in full pel */
1323
20.4M
    ps_luma->u4_rows          = ps_mc_params->rows;
1324
20.4M
    ps_luma->u4_cols          = MB_SIZE;
1325
20.4M
    ps_luma->u4_dst_wd_res_buf        = ps_mc_params->dst_wd;
1326
20.4M
    ps_luma->u4_src_wd        = u2_frm_wd * ps_mc_params->src_wd_cf;
1327
20.4M
    ps_luma->u4_dst_offset_res_buf    = ps_mc_params->dst_offset_scale * MB_SIZE;
1328
20.4M
    ps_luma->u4_dst_offset_cur_frm    = ps_mc_params->dst_offset_scale * u2_picture_width;
1329
20.4M
    ps_luma->u4_mode          = ((ai2_mv[MV_X] & 1) << 1) | (ai2_mv[MV_Y] & 1);
1330
1331
    /****************************************************************************/
1332
    /* get chroma mc params                                                     */
1333
    /****************************************************************************/
1334
20.4M
    ps_mc_params   = &gas_impeg2d_mc_params_chroma[e_type][u2_mv_num];
1335
20.4M
    i2_mvx_round   = ((ai2_mv[MV_X] + IS_NEG(ai2_mv[MV_X]))>>1);
1336
20.4M
    i2_mvy_round   = ((ai2_mv[MV_Y] + IS_NEG(ai2_mv[MV_Y]))>>1);
1337
1338
20.4M
    i2_mvx_fullp_round = (i2_mvx_round>>1);
1339
20.4M
    i2_mvy_fullp_round = (i2_mvy_round>>1)*ps_mc_params->mvy_cf;
1340
1341
20.4M
    u4_frm_chroma_wd = (u2_frm_wd>>1);
1342
1343
20.4M
    i2_pix_x = (MB_SIZE/2) * u2_mb_x + i2_mvx_fullp_round;
1344
20.4M
    i2_pix_y = ((MB_SIZE/2) * u2_mb_y + i2_mvy_fullp_round + u2_mv_num *
1345
20.4M
                           ps_mc_params->mv_num_cf)*ps_mc_params->frm_wd_cf;
1346
1347
20.4M
    CLIP(i2_pix_x, ((u2_frm_wd / 2)-8), 0);
1348
20.4M
    CLIP(i2_pix_y, ((u2_frm_ht / 2)-8), 0);
1349
20.4M
    ps_chroma->u4_src_offset = i2_pix_x + i2_pix_y * u4_frm_chroma_wd;
1350
1351
1352
    /* keep offset  in full pel */
1353
20.4M
    ps_chroma->u4_rows = ps_mc_params->rows;
1354
20.4M
    ps_chroma->u4_cols        = (MB_SIZE >> 1);
1355
20.4M
    ps_chroma->u4_dst_wd_res_buf = ps_mc_params->dst_wd;
1356
20.4M
    ps_chroma->u4_src_wd = (u2_frm_wd>>1) * ps_mc_params->src_wd_cf;
1357
20.4M
    ps_chroma->u4_dst_offset_res_buf = ps_mc_params->dst_offset_scale * MB_CHROMA_SIZE;
1358
20.4M
    ps_chroma->u4_dst_offset_cur_frm = ps_mc_params->dst_offset_scale * (u2_picture_width >> 1);
1359
20.4M
    ps_chroma->u4_mode = ((i2_mvx_round & 1) << 1) | (i2_mvy_round & 1);
1360
1361
1362
1363
20.4M
    ps_luma->u4_dst_wd_cur_frm = u2_picture_width;
1364
20.4M
    ps_chroma->u4_dst_wd_cur_frm = u2_picture_width >> 1;
1365
1366
20.4M
    if(ps_luma->u4_dst_wd_res_buf == MB_SIZE * 2)
1367
176k
    {
1368
176k
        ps_luma->u4_dst_wd_cur_frm = u2_frm_wd << 1;
1369
176k
        ps_chroma->u4_dst_wd_cur_frm = u2_frm_wd;
1370
176k
    }
1371
20.4M
}
1372
1373