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