xref: /aosp_15_r20/external/libmpeg2/decoder/impeg2d_mv_dec.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 #include <stdio.h>
21*a97c2a1fSXin Li 
22*a97c2a1fSXin Li #include "iv_datatypedef.h"
23*a97c2a1fSXin Li #include "iv.h"
24*a97c2a1fSXin Li 
25*a97c2a1fSXin Li #include "impeg2_buf_mgr.h"
26*a97c2a1fSXin Li #include "impeg2_disp_mgr.h"
27*a97c2a1fSXin Li #include "impeg2_defs.h"
28*a97c2a1fSXin Li #include "impeg2_platform_macros.h"
29*a97c2a1fSXin Li #include "impeg2_inter_pred.h"
30*a97c2a1fSXin Li #include "impeg2_idct.h"
31*a97c2a1fSXin Li #include "impeg2_globals.h"
32*a97c2a1fSXin Li #include "impeg2_mem_func.h"
33*a97c2a1fSXin Li #include "impeg2_format_conv.h"
34*a97c2a1fSXin Li #include "impeg2_macros.h"
35*a97c2a1fSXin Li 
36*a97c2a1fSXin Li #include "ivd.h"
37*a97c2a1fSXin Li #include "impeg2d.h"
38*a97c2a1fSXin Li #include "impeg2d_bitstream.h"
39*a97c2a1fSXin Li #include "impeg2d_structs.h"
40*a97c2a1fSXin Li #include "impeg2d_globals.h"
41*a97c2a1fSXin Li #include "impeg2d_vld_tables.h"
42*a97c2a1fSXin Li #include "impeg2d_pic_proc.h"
43*a97c2a1fSXin Li #include "impeg2d_debug.h"
44*a97c2a1fSXin Li #include "impeg2d_mv_dec.h"
45*a97c2a1fSXin Li #include "impeg2d_mc.h"
46*a97c2a1fSXin Li 
47*a97c2a1fSXin Li /*******************************************************************************
48*a97c2a1fSXin Li * Function name : impeg2d_dec_1mv
49*a97c2a1fSXin Li *
50*a97c2a1fSXin Li * Description   : Decodes a motion vector and updates the predictors
51*a97c2a1fSXin Li *
52*a97c2a1fSXin Li * Arguments     :
53*a97c2a1fSXin Li * stream        : Bitstream
54*a97c2a1fSXin Li * predMv        : Prediction for the motion vectors
55*a97c2a1fSXin Li * mv            : Motion vectors
56*a97c2a1fSXin Li * fCode         : fcode to the used for the decoding
57*a97c2a1fSXin Li * shift         : Shift value to be used. This will be equal to
58*a97c2a1fSXin Li *                 (mv_format == "field") && (picture_structure == "Frame picture")
59*a97c2a1fSXin Li * i             : 0 - MV_X and 1 - MV_Y
60*a97c2a1fSXin Li *
61*a97c2a1fSXin Li * Value Returned: None
62*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_1mv(stream_t * ps_stream,WORD16 ai2_pred_mv[],WORD16 ai2_mv[],UWORD16 au2_fCode[],UWORD16 u2_mv_y_shift,WORD16 ai2_dmv[])63*a97c2a1fSXin Li void impeg2d_dec_1mv(stream_t *ps_stream, WORD16 ai2_pred_mv[], WORD16 ai2_mv[],UWORD16 au2_fCode[],
64*a97c2a1fSXin Li            UWORD16 u2_mv_y_shift, WORD16 ai2_dmv[])
65*a97c2a1fSXin Li {
66*a97c2a1fSXin Li     WORD16  i2_f;
67*a97c2a1fSXin Li     WORD16  i2_r_size;
68*a97c2a1fSXin Li     WORD16  i2_high,i2_low,i2_range;
69*a97c2a1fSXin Li     UWORD32  u4_mv_code;
70*a97c2a1fSXin Li     WORD16  i2_delta;
71*a97c2a1fSXin Li     UWORD16 u2_first_bit;
72*a97c2a1fSXin Li     WORD32 i;
73*a97c2a1fSXin Li     WORD32 ai2_shifts[2];
74*a97c2a1fSXin Li     UWORD32 u4_buf;
75*a97c2a1fSXin Li     UWORD32 u4_buf_nxt;
76*a97c2a1fSXin Li     UWORD32 u4_offset;
77*a97c2a1fSXin Li     UWORD32 *pu4_buf_aligned;
78*a97c2a1fSXin Li 
79*a97c2a1fSXin Li     ai2_shifts[0] = 0;
80*a97c2a1fSXin Li     ai2_shifts[1] = u2_mv_y_shift;
81*a97c2a1fSXin Li 
82*a97c2a1fSXin Li 
83*a97c2a1fSXin Li     GET_TEMP_STREAM_DATA(u4_buf,u4_buf_nxt,u4_offset,pu4_buf_aligned,ps_stream)
84*a97c2a1fSXin Li     for(i = 0; i < 2; i++)
85*a97c2a1fSXin Li     {
86*a97c2a1fSXin Li         WORD32 i4_shift = ai2_shifts[i];
87*a97c2a1fSXin Li         /* Decode the motion_code */
88*a97c2a1fSXin Li         IBITS_NXT(u4_buf, u4_buf_nxt, u4_offset, u4_mv_code, MV_CODE_LEN)
89*a97c2a1fSXin Li         u2_first_bit    = (u4_mv_code >> (MV_CODE_LEN - 1)) & 0x01;
90*a97c2a1fSXin Li         if(u2_first_bit == 1) /* mvCode == 0 */
91*a97c2a1fSXin Li         {
92*a97c2a1fSXin Li             i2_delta = 0;
93*a97c2a1fSXin Li             FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,1,pu4_buf_aligned)
94*a97c2a1fSXin Li 
95*a97c2a1fSXin Li             ai2_mv[i] = (ai2_pred_mv[i] >> i4_shift);
96*a97c2a1fSXin Li 
97*a97c2a1fSXin Li             ai2_pred_mv[i] = (ai2_mv[i] << i4_shift);
98*a97c2a1fSXin Li 
99*a97c2a1fSXin Li         }
100*a97c2a1fSXin Li         else
101*a97c2a1fSXin Li         {
102*a97c2a1fSXin Li             UWORD16 u2_index;
103*a97c2a1fSXin Li             UWORD16 u2_value;
104*a97c2a1fSXin Li             UWORD16 u2_mv_len;
105*a97c2a1fSXin Li             UWORD16 u2_abs_mvcode_minus1;
106*a97c2a1fSXin Li             UWORD16 u2_sign_bit;
107*a97c2a1fSXin Li 
108*a97c2a1fSXin Li             i2_r_size   = au2_fCode[i] - 1;
109*a97c2a1fSXin Li             i2_f       = 1 << i2_r_size;
110*a97c2a1fSXin Li             i2_high    = (16 * i2_f) - 1;
111*a97c2a1fSXin Li             i2_low     = ((-16) * i2_f);
112*a97c2a1fSXin Li             i2_range   = (32 * i2_f);
113*a97c2a1fSXin Li 
114*a97c2a1fSXin Li             u2_index               = (u4_mv_code >> 1) & 0x1FF;
115*a97c2a1fSXin Li             u2_value               = gau2_impeg2d_mv_code[u2_index];
116*a97c2a1fSXin Li             u2_mv_len               = (u2_value & 0x0F);
117*a97c2a1fSXin Li             u2_abs_mvcode_minus1   = (u2_value >> 8) & 0x0FF;
118*a97c2a1fSXin Li             u4_mv_code            >>= (MV_CODE_LEN - u2_mv_len - 1);
119*a97c2a1fSXin Li             u2_sign_bit             = u4_mv_code & 0x1;
120*a97c2a1fSXin Li 
121*a97c2a1fSXin Li             FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,(u2_mv_len + 1),pu4_buf_aligned)
122*a97c2a1fSXin Li             i2_delta = u2_abs_mvcode_minus1 * i2_f + 1;
123*a97c2a1fSXin Li             if(i2_r_size)
124*a97c2a1fSXin Li             {
125*a97c2a1fSXin Li                 UWORD32 val;
126*a97c2a1fSXin Li                 IBITS_GET(u4_buf, u4_buf_nxt, u4_offset, val, pu4_buf_aligned, i2_r_size)
127*a97c2a1fSXin Li                 i2_delta += (WORD16)val;
128*a97c2a1fSXin Li             }
129*a97c2a1fSXin Li 
130*a97c2a1fSXin Li             if(u2_sign_bit)
131*a97c2a1fSXin Li                 i2_delta = -i2_delta;
132*a97c2a1fSXin Li 
133*a97c2a1fSXin Li             ai2_mv[i] = (ai2_pred_mv[i] >> i4_shift) + i2_delta;
134*a97c2a1fSXin Li 
135*a97c2a1fSXin Li             if(ai2_mv[i] < i2_low)
136*a97c2a1fSXin Li             {
137*a97c2a1fSXin Li                 ai2_mv[i] += i2_range;
138*a97c2a1fSXin Li             }
139*a97c2a1fSXin Li 
140*a97c2a1fSXin Li             if(ai2_mv[i] > i2_high)
141*a97c2a1fSXin Li             {
142*a97c2a1fSXin Li                 ai2_mv[i] -= i2_range;
143*a97c2a1fSXin Li             }
144*a97c2a1fSXin Li             ai2_pred_mv[i] = (ai2_mv[i] << i4_shift);
145*a97c2a1fSXin Li 
146*a97c2a1fSXin Li         }
147*a97c2a1fSXin Li         if(ai2_dmv)
148*a97c2a1fSXin Li         {
149*a97c2a1fSXin Li             UWORD32 u4_val;
150*a97c2a1fSXin Li             ai2_dmv[i] = 0;
151*a97c2a1fSXin Li             IBITS_GET(u4_buf, u4_buf_nxt, u4_offset, u4_val, pu4_buf_aligned, 1)
152*a97c2a1fSXin Li             if(u4_val)
153*a97c2a1fSXin Li             {
154*a97c2a1fSXin Li                 IBITS_GET(u4_buf, u4_buf_nxt, u4_offset, u4_val, pu4_buf_aligned, 1)
155*a97c2a1fSXin Li                 ai2_dmv[i] = gai2_impeg2d_dec_mv[u4_val];
156*a97c2a1fSXin Li             }
157*a97c2a1fSXin Li         }
158*a97c2a1fSXin Li     }
159*a97c2a1fSXin Li     PUT_TEMP_STREAM_DATA(u4_buf, u4_buf_nxt, u4_offset, pu4_buf_aligned, ps_stream)
160*a97c2a1fSXin Li 
161*a97c2a1fSXin Li }
162*a97c2a1fSXin Li /*******************************************************************************
163*a97c2a1fSXin Li * Function name : impeg2d_dec_mv
164*a97c2a1fSXin Li *
165*a97c2a1fSXin Li * Description   : Decodes a motion vector and updates the predictors
166*a97c2a1fSXin Li *
167*a97c2a1fSXin Li * Arguments     :
168*a97c2a1fSXin Li * stream        : Bitstream
169*a97c2a1fSXin Li * predMv        : Prediction for the motion vectors
170*a97c2a1fSXin Li * mv            : Motion vectors
171*a97c2a1fSXin Li * fCode         : fcode to the used for the decoding
172*a97c2a1fSXin Li * shift         : Shift value to be used. This will be equal to
173*a97c2a1fSXin Li *                 (mv_format == "field") && (picture_structure == "Frame picture")
174*a97c2a1fSXin Li *
175*a97c2a1fSXin Li * Value Returned: None
176*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_mv(stream_t * ps_stream,WORD16 ai2_pred_mv[],WORD16 ai2_mv[],UWORD16 au2_f_code[],UWORD16 u2_shift,UWORD16 u2_fld_sel)177*a97c2a1fSXin Li e_field_t impeg2d_dec_mv(stream_t *ps_stream, WORD16 ai2_pred_mv[], WORD16 ai2_mv[],UWORD16 au2_f_code[],
178*a97c2a1fSXin Li            UWORD16 u2_shift, UWORD16 u2_fld_sel)
179*a97c2a1fSXin Li {
180*a97c2a1fSXin Li     e_field_t e_fld;
181*a97c2a1fSXin Li     if(u2_fld_sel)
182*a97c2a1fSXin Li     {
183*a97c2a1fSXin Li         e_fld = (e_field_t)impeg2d_bit_stream_get_bit(ps_stream);
184*a97c2a1fSXin Li     }
185*a97c2a1fSXin Li     else
186*a97c2a1fSXin Li     {
187*a97c2a1fSXin Li         e_fld = TOP;
188*a97c2a1fSXin Li     }
189*a97c2a1fSXin Li 
190*a97c2a1fSXin Li     impeg2d_dec_1mv(ps_stream,ai2_pred_mv,ai2_mv,au2_f_code,u2_shift,NULL);
191*a97c2a1fSXin Li 
192*a97c2a1fSXin Li     return(e_fld);
193*a97c2a1fSXin Li }
194*a97c2a1fSXin Li 
195*a97c2a1fSXin Li /*****************************************************************************
196*a97c2a1fSXin Li *  Function Name   : impeg2d_dec_1mv_mb
197*a97c2a1fSXin Li *
198*a97c2a1fSXin Li *  Description     : Decodes mc params for 1 MV  MB
199*a97c2a1fSXin Li *
200*a97c2a1fSXin Li *  Arguments       :
201*a97c2a1fSXin Li *  dec             : Decoder state
202*a97c2a1fSXin Li *
203*a97c2a1fSXin Li *  Values Returned : None
204*a97c2a1fSXin Li *****************************************************************************/
impeg2d_dec_1mv_mb(dec_state_t * ps_dec)205*a97c2a1fSXin Li void impeg2d_dec_1mv_mb(dec_state_t *ps_dec)
206*a97c2a1fSXin Li {
207*a97c2a1fSXin Li     stream_t         *ps_stream;
208*a97c2a1fSXin Li     WORD16          *pi2_mv;
209*a97c2a1fSXin Li     e_field_t         e_fld;
210*a97c2a1fSXin Li     mb_mc_params_t  *ps_mc;
211*a97c2a1fSXin Li     e_pred_direction_t   e_ref_pic;
212*a97c2a1fSXin Li 
213*a97c2a1fSXin Li 
214*a97c2a1fSXin Li     ps_stream  = &ps_dec->s_bit_stream;
215*a97c2a1fSXin Li     e_ref_pic = ps_dec->e_mb_pred;
216*a97c2a1fSXin Li     /************************************************************************/
217*a97c2a1fSXin Li     /* Decode the motion vector                                             */
218*a97c2a1fSXin Li     /************************************************************************/
219*a97c2a1fSXin Li     pi2_mv        = (WORD16 *)&ps_dec->ai2_mv[FORW][FIRST];
220*a97c2a1fSXin Li     e_fld = impeg2d_dec_mv(ps_stream,ps_dec->ai2_pred_mv[e_ref_pic][FIRST],pi2_mv,
221*a97c2a1fSXin Li                 ps_dec->au2_f_code[e_ref_pic],0, ps_dec->u2_fld_pic);
222*a97c2a1fSXin Li 
223*a97c2a1fSXin Li     ps_dec->ai2_pred_mv[e_ref_pic][SECOND][MV_X] = ps_dec->ai2_pred_mv[e_ref_pic][FIRST][MV_X];
224*a97c2a1fSXin Li     ps_dec->ai2_pred_mv[e_ref_pic][SECOND][MV_Y] = ps_dec->ai2_pred_mv[e_ref_pic][FIRST][MV_Y];
225*a97c2a1fSXin Li     /************************************************************************/
226*a97c2a1fSXin Li     /* Set the motion vector params                                         */
227*a97c2a1fSXin Li     /************************************************************************/
228*a97c2a1fSXin Li     ps_mc = &ps_dec->as_mb_mc_params[e_ref_pic][FIRST];
229*a97c2a1fSXin Li     ps_mc->s_ref = ps_dec->as_ref_buf[e_ref_pic][e_fld];
230*a97c2a1fSXin Li     impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type, 0,
231*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);
232*a97c2a1fSXin Li 
233*a97c2a1fSXin Li }
234*a97c2a1fSXin Li 
235*a97c2a1fSXin Li /*****************************************************************************
236*a97c2a1fSXin Li *  Function Name   : impeg2d_dec_2mv_fw_or_bk_mb
237*a97c2a1fSXin Li *
238*a97c2a1fSXin Li *  Description     : Decodes first part of params for 2 MV Interpolated MB
239*a97c2a1fSXin Li *
240*a97c2a1fSXin Li *  Arguments       :
241*a97c2a1fSXin Li *  dec             : Decoder state
242*a97c2a1fSXin Li *
243*a97c2a1fSXin Li *  Values Returned : None
244*a97c2a1fSXin Li *****************************************************************************/
impeg2d_dec_2mv_fw_or_bk_mb(dec_state_t * ps_dec)245*a97c2a1fSXin Li void impeg2d_dec_2mv_fw_or_bk_mb(dec_state_t *ps_dec)
246*a97c2a1fSXin Li {
247*a97c2a1fSXin Li     stream_t         *ps_stream;
248*a97c2a1fSXin Li     WORD16          *pi2_mv;
249*a97c2a1fSXin Li     e_field_t         e_fld;
250*a97c2a1fSXin Li     mb_mc_params_t  *ps_mc;
251*a97c2a1fSXin Li     e_pred_direction_t   e_ref_pic;
252*a97c2a1fSXin Li     UWORD16 i;
253*a97c2a1fSXin Li 
254*a97c2a1fSXin Li     ps_stream  = &ps_dec->s_bit_stream;
255*a97c2a1fSXin Li     e_ref_pic = ps_dec->e_mb_pred;
256*a97c2a1fSXin Li     for(i = 0; i < 2; i++)
257*a97c2a1fSXin Li     {
258*a97c2a1fSXin Li         /********************************************************************/
259*a97c2a1fSXin Li         /* Decode the first motion vector                                   */
260*a97c2a1fSXin Li         /********************************************************************/
261*a97c2a1fSXin Li         pi2_mv        = (WORD16 *)&ps_dec->ai2_mv[FORW][i];
262*a97c2a1fSXin Li         e_fld = impeg2d_dec_mv(ps_stream,ps_dec->ai2_pred_mv[e_ref_pic][i],pi2_mv,
263*a97c2a1fSXin Li                     ps_dec->au2_f_code[e_ref_pic],ps_dec->u2_frm_pic, 1);
264*a97c2a1fSXin Li 
265*a97c2a1fSXin Li         /********************************************************************/
266*a97c2a1fSXin Li         /* Set the motion vector params                                     */
267*a97c2a1fSXin Li         /********************************************************************/
268*a97c2a1fSXin Li         ps_mc = &ps_dec->as_mb_mc_params[FORW][i];
269*a97c2a1fSXin Li         ps_mc->s_ref = ps_dec->as_ref_buf[e_ref_pic][e_fld];
270*a97c2a1fSXin Li         impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type, i,
271*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);
272*a97c2a1fSXin Li     }
273*a97c2a1fSXin Li }
274*a97c2a1fSXin Li 
275*a97c2a1fSXin Li /*****************************************************************************
276*a97c2a1fSXin Li *  Function Name   : impeg2d_dec_frm_dual_prime
277*a97c2a1fSXin Li *
278*a97c2a1fSXin Li *  Description     : Decodes first part of params for 2 MV Interpolated MB
279*a97c2a1fSXin Li *
280*a97c2a1fSXin Li *  Arguments       :
281*a97c2a1fSXin Li *  dec             : Decoder state
282*a97c2a1fSXin Li *
283*a97c2a1fSXin Li *  Values Returned : None
284*a97c2a1fSXin Li *****************************************************************************/
impeg2d_dec_frm_dual_prime(dec_state_t * ps_dec)285*a97c2a1fSXin Li void impeg2d_dec_frm_dual_prime(dec_state_t *ps_dec)
286*a97c2a1fSXin Li {
287*a97c2a1fSXin Li     stream_t         *ps_stream;
288*a97c2a1fSXin Li     WORD16          *pi2_mv;
289*a97c2a1fSXin Li     mb_mc_params_t  *ps_mc;
290*a97c2a1fSXin Li 
291*a97c2a1fSXin Li     WORD16      ai2_dmv[2];
292*a97c2a1fSXin Li     WORD16      *pi2_mv1, *pi2_mv2, *pi2_mv3, *pi2_mv4;
293*a97c2a1fSXin Li     UWORD16 i,j;
294*a97c2a1fSXin Li 
295*a97c2a1fSXin Li     pi2_mv1     = (WORD16 *)&(ps_dec->ai2_mv[FORW][FIRST]);
296*a97c2a1fSXin Li     pi2_mv2     = (WORD16 *)&(ps_dec->ai2_mv[FORW][SECOND]);
297*a97c2a1fSXin Li     pi2_mv3     = (WORD16 *)&(ps_dec->ai2_mv[BACK][FIRST]);
298*a97c2a1fSXin Li     pi2_mv4     = (WORD16 *)&(ps_dec->ai2_mv[BACK][SECOND]);
299*a97c2a1fSXin Li 
300*a97c2a1fSXin Li 
301*a97c2a1fSXin Li 
302*a97c2a1fSXin Li     ps_stream  = &ps_dec->s_bit_stream;
303*a97c2a1fSXin Li 
304*a97c2a1fSXin Li     /************************************************************************/
305*a97c2a1fSXin Li     /* Decode the motion vector MV_X, MV_Y and dmv[0], dmv[1]               */
306*a97c2a1fSXin Li     /************************************************************************/
307*a97c2a1fSXin Li     impeg2d_dec_1mv(ps_stream,ps_dec->ai2_pred_mv[FORW][FIRST],pi2_mv1,ps_dec->au2_f_code[FORW],ps_dec->u2_frm_pic,ai2_dmv);
308*a97c2a1fSXin Li 
309*a97c2a1fSXin Li     {
310*a97c2a1fSXin Li         WORD16 ai2_m[2][2];
311*a97c2a1fSXin Li 
312*a97c2a1fSXin Li         if(ps_dec->u2_top_field_first)
313*a97c2a1fSXin Li         {
314*a97c2a1fSXin Li             ai2_m[1][0] = 1;
315*a97c2a1fSXin Li             ai2_m[0][1] = 3;
316*a97c2a1fSXin Li         }
317*a97c2a1fSXin Li         else
318*a97c2a1fSXin Li         {
319*a97c2a1fSXin Li             ai2_m[1][0] = 3;
320*a97c2a1fSXin Li             ai2_m[0][1] = 1;
321*a97c2a1fSXin Li         }
322*a97c2a1fSXin Li 
323*a97c2a1fSXin Li         pi2_mv2[MV_X] = pi2_mv1[MV_X];
324*a97c2a1fSXin Li         pi2_mv2[MV_Y] = pi2_mv1[MV_Y];
325*a97c2a1fSXin Li 
326*a97c2a1fSXin Li         pi2_mv3[MV_X] = ai2_dmv[0] + DIV_2_RND(pi2_mv1[MV_X] * ai2_m[1][0]);
327*a97c2a1fSXin Li         pi2_mv4[MV_X] = ai2_dmv[0] + DIV_2_RND(pi2_mv1[MV_X] * ai2_m[0][1]);
328*a97c2a1fSXin Li 
329*a97c2a1fSXin Li         pi2_mv3[MV_Y] = ai2_dmv[1] + DIV_2_RND(pi2_mv1[MV_Y] * ai2_m[1][0]) - 1;
330*a97c2a1fSXin Li         pi2_mv4[MV_Y] = ai2_dmv[1] + DIV_2_RND(pi2_mv1[MV_Y] * ai2_m[0][1]) + 1;
331*a97c2a1fSXin Li     }
332*a97c2a1fSXin Li 
333*a97c2a1fSXin Li     ps_dec->ai2_pred_mv[FORW][SECOND][MV_X] = ps_dec->ai2_pred_mv[FORW][FIRST][MV_X];
334*a97c2a1fSXin Li     ps_dec->ai2_pred_mv[FORW][SECOND][MV_Y] = ps_dec->ai2_pred_mv[FORW][FIRST][MV_Y];
335*a97c2a1fSXin Li 
336*a97c2a1fSXin Li     /************************************************************************/
337*a97c2a1fSXin Li     /* Set the motion vector params                                         */
338*a97c2a1fSXin Li     /************************************************************************/
339*a97c2a1fSXin Li     for(j = 0; j < 2; j++)
340*a97c2a1fSXin Li     {
341*a97c2a1fSXin Li         for(i = 0; i < 2; i++)
342*a97c2a1fSXin Li         {
343*a97c2a1fSXin Li             pi2_mv        = (WORD16 *)&ps_dec->ai2_mv[j][i];
344*a97c2a1fSXin Li             ps_mc = &ps_dec->as_mb_mc_params[j][i];
345*a97c2a1fSXin Li             ps_mc->s_ref = ps_dec->as_ref_buf[FORW][(i ^ j) & 1];
346*a97c2a1fSXin Li             impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type, i,
347*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);
348*a97c2a1fSXin Li         }
349*a97c2a1fSXin Li     }
350*a97c2a1fSXin Li 
351*a97c2a1fSXin Li }
352*a97c2a1fSXin Li /*****************************************************************************
353*a97c2a1fSXin Li *  Function Name   : impeg2d_dec_fld_dual_prime
354*a97c2a1fSXin Li *
355*a97c2a1fSXin Li *  Description     : Decodes first part of params for 2 MV Interpolated MB
356*a97c2a1fSXin Li *
357*a97c2a1fSXin Li *  Arguments       :
358*a97c2a1fSXin Li *  dec             : Decoder state
359*a97c2a1fSXin Li *
360*a97c2a1fSXin Li *  Values Returned : None
361*a97c2a1fSXin Li *****************************************************************************/
impeg2d_dec_fld_dual_prime(dec_state_t * ps_dec)362*a97c2a1fSXin Li void impeg2d_dec_fld_dual_prime(dec_state_t *ps_dec)
363*a97c2a1fSXin Li {
364*a97c2a1fSXin Li     stream_t         *ps_stream;
365*a97c2a1fSXin Li     WORD16          *pi2_mv;
366*a97c2a1fSXin Li     mb_mc_params_t  *ps_mc;
367*a97c2a1fSXin Li 
368*a97c2a1fSXin Li     WORD16      *pi2_mv1, *pi2_mv2;
369*a97c2a1fSXin Li     WORD16      ai2_dmv[2];
370*a97c2a1fSXin Li 
371*a97c2a1fSXin Li 
372*a97c2a1fSXin Li     pi2_mv1     = (WORD16 *)&(ps_dec->ai2_mv[FORW][FIRST]);
373*a97c2a1fSXin Li     pi2_mv2     = (WORD16 *)&(ps_dec->ai2_mv[FORW][SECOND]);
374*a97c2a1fSXin Li     ps_stream  = &ps_dec->s_bit_stream;
375*a97c2a1fSXin Li 
376*a97c2a1fSXin Li     /************************************************************************/
377*a97c2a1fSXin Li     /* Decode the motion vector MV_X, MV_Y and dmv[0], dmv[1]               */
378*a97c2a1fSXin Li     /************************************************************************/
379*a97c2a1fSXin Li     impeg2d_dec_1mv(ps_stream,ps_dec->ai2_pred_mv[FORW][FIRST],pi2_mv1,ps_dec->au2_f_code[FORW],0,ai2_dmv);
380*a97c2a1fSXin Li 
381*a97c2a1fSXin Li 
382*a97c2a1fSXin Li     pi2_mv2[MV_X] = ai2_dmv[0] + DIV_2_RND(pi2_mv1[MV_X]);
383*a97c2a1fSXin Li     pi2_mv2[MV_Y] = ai2_dmv[1] + DIV_2_RND(pi2_mv1[MV_Y]);
384*a97c2a1fSXin Li 
385*a97c2a1fSXin Li     if(ps_dec->u2_picture_structure == TOP_FIELD)
386*a97c2a1fSXin Li         pi2_mv2[MV_Y] -= 1;
387*a97c2a1fSXin Li     else
388*a97c2a1fSXin Li         pi2_mv2[MV_Y] += 1;
389*a97c2a1fSXin Li 
390*a97c2a1fSXin Li     ps_dec->ai2_pred_mv[FORW][SECOND][MV_X] = ps_dec->ai2_pred_mv[FORW][FIRST][MV_X];
391*a97c2a1fSXin Li     ps_dec->ai2_pred_mv[FORW][SECOND][MV_Y] = ps_dec->ai2_pred_mv[FORW][FIRST][MV_Y];
392*a97c2a1fSXin Li 
393*a97c2a1fSXin Li     /************************************************************************/
394*a97c2a1fSXin Li     /* Set the motion vector params                                         */
395*a97c2a1fSXin Li     /************************************************************************/
396*a97c2a1fSXin Li         pi2_mv        = (WORD16 *)&ps_dec->ai2_mv[FORW][0];
397*a97c2a1fSXin Li         ps_mc = &ps_dec->as_mb_mc_params[FORW][0];
398*a97c2a1fSXin Li         ps_mc->s_ref = ps_dec->as_ref_buf[FORW][ps_dec->u2_fld_parity];
399*a97c2a1fSXin Li         impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type, 0,
400*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);
401*a97c2a1fSXin Li 
402*a97c2a1fSXin Li         pi2_mv        = (WORD16 *)&ps_dec->ai2_mv[FORW][1];
403*a97c2a1fSXin Li         ps_mc = &ps_dec->as_mb_mc_params[FORW][1];
404*a97c2a1fSXin Li         ps_mc->s_ref = ps_dec->as_ref_buf[FORW][!ps_dec->u2_fld_parity];
405*a97c2a1fSXin Li         impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type, 0,
406*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);
407*a97c2a1fSXin Li 
408*a97c2a1fSXin Li 
409*a97c2a1fSXin Li }
410*a97c2a1fSXin Li /*****************************************************************************
411*a97c2a1fSXin Li *  Function Name   : impeg2d_dec_4mv_mb
412*a97c2a1fSXin Li *
413*a97c2a1fSXin Li *  Description     : Decodes first part of params for 2 MV Interpolated MB
414*a97c2a1fSXin Li *
415*a97c2a1fSXin Li *  Arguments       :
416*a97c2a1fSXin Li *  dec             : Decoder state
417*a97c2a1fSXin Li *
418*a97c2a1fSXin Li *  Values Returned : None
419*a97c2a1fSXin Li *****************************************************************************/
impeg2d_dec_4mv_mb(dec_state_t * ps_dec)420*a97c2a1fSXin Li void impeg2d_dec_4mv_mb(dec_state_t *ps_dec)
421*a97c2a1fSXin Li {
422*a97c2a1fSXin Li     stream_t         *ps_stream;
423*a97c2a1fSXin Li     WORD16          *pi2_mv;
424*a97c2a1fSXin Li     e_field_t         e_fld;
425*a97c2a1fSXin Li     mb_mc_params_t  *ps_mc;
426*a97c2a1fSXin Li 
427*a97c2a1fSXin Li     UWORD16 i,j;
428*a97c2a1fSXin Li 
429*a97c2a1fSXin Li     ps_stream  = &ps_dec->s_bit_stream;
430*a97c2a1fSXin Li 
431*a97c2a1fSXin Li     /***********************************************/
432*a97c2a1fSXin Li     /* loop for FW & BK                            */
433*a97c2a1fSXin Li     /***********************************************/
434*a97c2a1fSXin Li     for(j = 0; j < 2; j++)
435*a97c2a1fSXin Li     {
436*a97c2a1fSXin Li         /***********************************************/
437*a97c2a1fSXin Li         /* loop for decoding 2 mvs of same reference frame*/
438*a97c2a1fSXin Li         /***********************************************/
439*a97c2a1fSXin Li         for(i = 0; i < 2; i++)
440*a97c2a1fSXin Li         {
441*a97c2a1fSXin Li             /****************************************************************/
442*a97c2a1fSXin Li             /* Decode the first motion vector                               */
443*a97c2a1fSXin Li             /****************************************************************/
444*a97c2a1fSXin Li             pi2_mv        = (WORD16 *)&ps_dec->ai2_mv[j][i];
445*a97c2a1fSXin Li             e_fld = impeg2d_dec_mv(ps_stream,ps_dec->ai2_pred_mv[j][i],pi2_mv,
446*a97c2a1fSXin Li                         ps_dec->au2_f_code[j],ps_dec->u2_frm_pic, 1);
447*a97c2a1fSXin Li 
448*a97c2a1fSXin Li             /****************************************************************/
449*a97c2a1fSXin Li             /* Set the motion vector params                                 */
450*a97c2a1fSXin Li             /****************************************************************/
451*a97c2a1fSXin Li             ps_mc = &ps_dec->as_mb_mc_params[j][i];
452*a97c2a1fSXin Li             ps_mc->s_ref = ps_dec->as_ref_buf[j][e_fld];
453*a97c2a1fSXin Li             impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type, i,
454*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);
455*a97c2a1fSXin Li         }
456*a97c2a1fSXin Li     }
457*a97c2a1fSXin Li 
458*a97c2a1fSXin Li }
459*a97c2a1fSXin Li /*******************************************************************************
460*a97c2a1fSXin Li *  Function Name   : impeg2d_dec_2mv_interp_mb
461*a97c2a1fSXin Li *
462*a97c2a1fSXin Li *  Description     : Decodes first part of params for 2 MV Interpolated MB
463*a97c2a1fSXin Li *
464*a97c2a1fSXin Li *  Arguments       :
465*a97c2a1fSXin Li *  dec             : Decoder state
466*a97c2a1fSXin Li *
467*a97c2a1fSXin Li *  Values Returned : None
468*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_2mv_interp_mb(dec_state_t * ps_dec)469*a97c2a1fSXin Li void impeg2d_dec_2mv_interp_mb(dec_state_t *ps_dec)
470*a97c2a1fSXin Li {
471*a97c2a1fSXin Li     stream_t         *ps_stream;
472*a97c2a1fSXin Li     WORD16          *pi2_mv;
473*a97c2a1fSXin Li     e_field_t         e_fld;
474*a97c2a1fSXin Li     mb_mc_params_t  *ps_mc;
475*a97c2a1fSXin Li     UWORD16 i;
476*a97c2a1fSXin Li 
477*a97c2a1fSXin Li     ps_stream  = &ps_dec->s_bit_stream;
478*a97c2a1fSXin Li 
479*a97c2a1fSXin Li     for(i = 0; i < 2; i++)
480*a97c2a1fSXin Li     {
481*a97c2a1fSXin Li         /********************************************************************/
482*a97c2a1fSXin Li         /* Decode the first motion vector                                   */
483*a97c2a1fSXin Li         /********************************************************************/
484*a97c2a1fSXin Li         pi2_mv        = (WORD16 *)&ps_dec->ai2_mv[i][FIRST];
485*a97c2a1fSXin Li         e_fld = impeg2d_dec_mv(ps_stream,ps_dec->ai2_pred_mv[i][FIRST],pi2_mv,
486*a97c2a1fSXin Li                     ps_dec->au2_f_code[i],0, ps_dec->u2_fld_pic);
487*a97c2a1fSXin Li 
488*a97c2a1fSXin Li         ps_dec->ai2_pred_mv[i][SECOND][MV_X] = ps_dec->ai2_pred_mv[i][FIRST][MV_X];
489*a97c2a1fSXin Li         ps_dec->ai2_pred_mv[i][SECOND][MV_Y] = ps_dec->ai2_pred_mv[i][FIRST][MV_Y];
490*a97c2a1fSXin Li         /********************************************************************/
491*a97c2a1fSXin Li         /* Set the motion vector params                                     */
492*a97c2a1fSXin Li         /********************************************************************/
493*a97c2a1fSXin Li         ps_mc = &ps_dec->as_mb_mc_params[i][FIRST];
494*a97c2a1fSXin Li         ps_mc->s_ref = ps_dec->as_ref_buf[i][e_fld];
495*a97c2a1fSXin Li         impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type,i,
496*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);
497*a97c2a1fSXin Li     }
498*a97c2a1fSXin Li 
499*a97c2a1fSXin Li }
500