xref: /aosp_15_r20/external/libmpeg2/decoder/impeg2d_pnb_pic.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 #include <string.h>
22*a97c2a1fSXin Li 
23*a97c2a1fSXin Li #include "iv_datatypedef.h"
24*a97c2a1fSXin Li #include "iv.h"
25*a97c2a1fSXin Li 
26*a97c2a1fSXin Li #include "impeg2_buf_mgr.h"
27*a97c2a1fSXin Li #include "impeg2_disp_mgr.h"
28*a97c2a1fSXin Li #include "impeg2_defs.h"
29*a97c2a1fSXin Li #include "impeg2_platform_macros.h"
30*a97c2a1fSXin Li #include "impeg2_inter_pred.h"
31*a97c2a1fSXin Li #include "impeg2_idct.h"
32*a97c2a1fSXin Li #include "impeg2_globals.h"
33*a97c2a1fSXin Li #include "impeg2_mem_func.h"
34*a97c2a1fSXin Li #include "impeg2_format_conv.h"
35*a97c2a1fSXin Li #include "impeg2_macros.h"
36*a97c2a1fSXin Li 
37*a97c2a1fSXin Li #include "ivd.h"
38*a97c2a1fSXin Li #include "impeg2d.h"
39*a97c2a1fSXin Li #include "impeg2d_bitstream.h"
40*a97c2a1fSXin Li #include "impeg2d_structs.h"
41*a97c2a1fSXin Li #include "impeg2d_vld_tables.h"
42*a97c2a1fSXin Li #include "impeg2d_vld.h"
43*a97c2a1fSXin Li #include "impeg2d_pic_proc.h"
44*a97c2a1fSXin Li #include "impeg2d_debug.h"
45*a97c2a1fSXin Li #include "impeg2d_mc.h"
46*a97c2a1fSXin Li 
47*a97c2a1fSXin Li #define BLK_SIZE 8
48*a97c2a1fSXin Li #define LUMA_BLK_SIZE (2 * (BLK_SIZE))
49*a97c2a1fSXin Li #define CHROMA_BLK_SIZE (BLK_SIZE)
50*a97c2a1fSXin Li 
51*a97c2a1fSXin Li 
52*a97c2a1fSXin Li /*******************************************************************************
53*a97c2a1fSXin Li *
54*a97c2a1fSXin Li *  Function Name   : impeg2d_dec_p_mb_params
55*a97c2a1fSXin Li *
56*a97c2a1fSXin Li *  Description     : Decodes the parameters for P
57*a97c2a1fSXin Li *
58*a97c2a1fSXin Li *  Arguments       :
59*a97c2a1fSXin Li *  dec             : Decoder context
60*a97c2a1fSXin Li *
61*a97c2a1fSXin Li *  Values Returned : None
62*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_p_mb_params(dec_state_t * ps_dec)63*a97c2a1fSXin Li WORD32  impeg2d_dec_p_mb_params(dec_state_t *ps_dec)
64*a97c2a1fSXin Li {
65*a97c2a1fSXin Li     stream_t *ps_stream = &ps_dec->s_bit_stream;
66*a97c2a1fSXin Li     UWORD16 u2_mb_addr_incr;
67*a97c2a1fSXin Li     UWORD16 u2_total_len;
68*a97c2a1fSXin Li     UWORD16 u2_len;
69*a97c2a1fSXin Li     UWORD16 u2_mb_type;
70*a97c2a1fSXin Li     UWORD32 u4_next_word;
71*a97c2a1fSXin Li     const dec_mb_params_t *ps_dec_mb_params;
72*a97c2a1fSXin Li     if(impeg2d_bit_stream_nxt(ps_stream,1) == 1)
73*a97c2a1fSXin Li     {
74*a97c2a1fSXin Li         impeg2d_bit_stream_flush(ps_stream,1);
75*a97c2a1fSXin Li 
76*a97c2a1fSXin Li     }
77*a97c2a1fSXin Li     else
78*a97c2a1fSXin Li     {
79*a97c2a1fSXin Li         u2_mb_addr_incr = impeg2d_get_mb_addr_incr(ps_stream);
80*a97c2a1fSXin Li 
81*a97c2a1fSXin Li         if(!u2_mb_addr_incr)
82*a97c2a1fSXin Li         {
83*a97c2a1fSXin Li             return IV_FAIL;
84*a97c2a1fSXin Li         }
85*a97c2a1fSXin Li 
86*a97c2a1fSXin Li         if(0 == ps_dec->u2_first_mb)
87*a97c2a1fSXin Li         {
88*a97c2a1fSXin Li             /****************************************************************/
89*a97c2a1fSXin Li             /* If the 2nd member of a field picture pair is a P picture and */
90*a97c2a1fSXin Li             /* the first one was an I picture, there cannot be any skipped  */
91*a97c2a1fSXin Li             /* MBs in the second field picture                              */
92*a97c2a1fSXin Li             /****************************************************************/
93*a97c2a1fSXin Li             /*
94*a97c2a1fSXin Li             if((dec->picture_structure != FRAME_PICTURE) &&
95*a97c2a1fSXin Li                 (dec->f->FieldFuncCall != 0) &&
96*a97c2a1fSXin Li                 (dec->las->u1_last_coded_vop_type == I))
97*a97c2a1fSXin Li             {
98*a97c2a1fSXin Li                 core0_err_handler((void *)(VOLParams),
99*a97c2a1fSXin Li                     ITTMPEG2_ERR_INVALID_MB_SKIP);
100*a97c2a1fSXin Li             }
101*a97c2a1fSXin Li             */
102*a97c2a1fSXin Li             /****************************************************************/
103*a97c2a1fSXin Li             /* In MPEG-2, the last MB of the row cannot be skipped and the  */
104*a97c2a1fSXin Li             /* MBAddrIncr cannot be such that it will take the current MB   */
105*a97c2a1fSXin Li             /* beyond the current row                                       */
106*a97c2a1fSXin Li             /* In MPEG-1, the slice could start and end anywhere and is not */
107*a97c2a1fSXin Li             /* restricted to a row like in MPEG-2. Hence this check should  */
108*a97c2a1fSXin Li             /* not be done for MPEG-1 streams.                              */
109*a97c2a1fSXin Li             /****************************************************************/
110*a97c2a1fSXin Li             if(ps_dec->u2_is_mpeg2 && ((ps_dec->u2_mb_x + u2_mb_addr_incr) > ps_dec->u2_num_horiz_mb) )
111*a97c2a1fSXin Li             {
112*a97c2a1fSXin Li                 u2_mb_addr_incr    = ps_dec->u2_num_horiz_mb - ps_dec->u2_mb_x;
113*a97c2a1fSXin Li             }
114*a97c2a1fSXin Li 
115*a97c2a1fSXin Li             if ((u2_mb_addr_incr - 1) > ps_dec->u2_num_mbs_left)
116*a97c2a1fSXin Li             {
117*a97c2a1fSXin Li                 /* If the number of skip MBs are more than the number of MBs
118*a97c2a1fSXin Li                  * left, indicate error.
119*a97c2a1fSXin Li                  */
120*a97c2a1fSXin Li                 return IV_FAIL;
121*a97c2a1fSXin Li             }
122*a97c2a1fSXin Li 
123*a97c2a1fSXin Li             impeg2d_dec_skip_mbs(ps_dec, (UWORD16)(u2_mb_addr_incr - 1));
124*a97c2a1fSXin Li         }
125*a97c2a1fSXin Li         else
126*a97c2a1fSXin Li         {
127*a97c2a1fSXin Li 
128*a97c2a1fSXin Li             /****************************************************************/
129*a97c2a1fSXin Li             /* Section 6.3.17                                               */
130*a97c2a1fSXin Li             /* The first MB of a slice cannot be skipped                    */
131*a97c2a1fSXin Li             /* But the mb_addr_incr can be > 1, because at the beginning of */
132*a97c2a1fSXin Li             /* a slice, it indicates the offset from the last MB in the     */
133*a97c2a1fSXin Li             /* previous row. Hence for the first slice in a row, the        */
134*a97c2a1fSXin Li             /* mb_addr_incr needs to be 1.                                  */
135*a97c2a1fSXin Li             /****************************************************************/
136*a97c2a1fSXin Li             /* MB_x is set to zero whenever MB_y changes.                   */
137*a97c2a1fSXin Li             ps_dec->u2_mb_x = u2_mb_addr_incr - 1;
138*a97c2a1fSXin Li             /* For error resilience */
139*a97c2a1fSXin Li             ps_dec->u2_mb_x = MIN(ps_dec->u2_mb_x, (ps_dec->u2_num_horiz_mb - 1));
140*a97c2a1fSXin Li             ps_dec->u2_num_mbs_left = ((ps_dec->u2_num_vert_mb - ps_dec->u2_mb_y)
141*a97c2a1fSXin Li                             * ps_dec->u2_num_horiz_mb) - ps_dec->u2_mb_x;
142*a97c2a1fSXin Li 
143*a97c2a1fSXin Li             /****************************************************************/
144*a97c2a1fSXin Li             /* mb_addr_incr is forced to 1 because in this decoder it is used */
145*a97c2a1fSXin Li             /* more as an indicator of the number of MBs skipped than the   */
146*a97c2a1fSXin Li             /* as defined by the standard (Section 6.3.17)                  */
147*a97c2a1fSXin Li             /****************************************************************/
148*a97c2a1fSXin Li             u2_mb_addr_incr = 1;
149*a97c2a1fSXin Li             ps_dec->u2_first_mb = 0;
150*a97c2a1fSXin Li 
151*a97c2a1fSXin Li         }
152*a97c2a1fSXin Li 
153*a97c2a1fSXin Li     }
154*a97c2a1fSXin Li     u4_next_word = (UWORD16)impeg2d_bit_stream_nxt(ps_stream,16);
155*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
156*a97c2a1fSXin Li     /* MB type                                                               */
157*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
158*a97c2a1fSXin Li     {
159*a97c2a1fSXin Li         u2_mb_type   = ps_dec->pu2_mb_type[BITS((UWORD16)u4_next_word,15,10)];
160*a97c2a1fSXin Li         u2_len      = BITS(u2_mb_type,15,8);
161*a97c2a1fSXin Li         u2_total_len = u2_len;
162*a97c2a1fSXin Li         u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << u2_len);
163*a97c2a1fSXin Li     }
164*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
165*a97c2a1fSXin Li     /* motion type                                                           */
166*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
167*a97c2a1fSXin Li     {
168*a97c2a1fSXin Li         if((u2_mb_type & MB_FORW_OR_BACK) &&  ps_dec->u2_read_motion_type)
169*a97c2a1fSXin Li         {
170*a97c2a1fSXin Li             WORD32 i4_motion_type;
171*a97c2a1fSXin Li             ps_dec->u2_motion_type = BITS((UWORD16)u4_next_word,15,14);
172*a97c2a1fSXin Li             u2_total_len        += MB_MOTION_TYPE_LEN;
173*a97c2a1fSXin Li             u4_next_word        = (UWORD16)LSW((UWORD16)u4_next_word << MB_MOTION_TYPE_LEN);
174*a97c2a1fSXin Li             i4_motion_type     = ps_dec->u2_motion_type;
175*a97c2a1fSXin Li 
176*a97c2a1fSXin Li             if((i4_motion_type == 0) ||
177*a97c2a1fSXin Li                 (i4_motion_type == 4) ||
178*a97c2a1fSXin Li                 (i4_motion_type >  7))
179*a97c2a1fSXin Li             {
180*a97c2a1fSXin Li                 //TODO : VANG Check for validity
181*a97c2a1fSXin Li                 i4_motion_type = 1;
182*a97c2a1fSXin Li             }
183*a97c2a1fSXin Li 
184*a97c2a1fSXin Li         }
185*a97c2a1fSXin Li     }
186*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
187*a97c2a1fSXin Li     /* dct type                                                              */
188*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
189*a97c2a1fSXin Li     {
190*a97c2a1fSXin Li         if((u2_mb_type & MB_CODED) && ps_dec->u2_read_dct_type)
191*a97c2a1fSXin Li         {
192*a97c2a1fSXin Li             ps_dec->u2_field_dct = BIT((UWORD16)u4_next_word,15);
193*a97c2a1fSXin Li             u2_total_len += MB_DCT_TYPE_LEN;
194*a97c2a1fSXin Li             u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_DCT_TYPE_LEN);
195*a97c2a1fSXin Li         }
196*a97c2a1fSXin Li     }
197*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
198*a97c2a1fSXin Li     /* Quant scale code                                                      */
199*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
200*a97c2a1fSXin Li     if(u2_mb_type & MB_QUANT)
201*a97c2a1fSXin Li     {
202*a97c2a1fSXin Li         UWORD16 u2_quant_scale_code;
203*a97c2a1fSXin Li         u2_quant_scale_code = BITS((UWORD16)u4_next_word,15,11);
204*a97c2a1fSXin Li 
205*a97c2a1fSXin Li         ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ?
206*a97c2a1fSXin Li             gau1_impeg2_non_linear_quant_scale[u2_quant_scale_code] : (u2_quant_scale_code << 1);
207*a97c2a1fSXin Li         u2_total_len += MB_QUANT_SCALE_CODE_LEN;
208*a97c2a1fSXin Li     }
209*a97c2a1fSXin Li     impeg2d_bit_stream_flush(ps_stream,u2_total_len);
210*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
211*a97c2a1fSXin Li     /* Set the function pointers                                             */
212*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
213*a97c2a1fSXin Li     ps_dec->u2_coded_mb    = (UWORD16)(u2_mb_type & MB_CODED);
214*a97c2a1fSXin Li 
215*a97c2a1fSXin Li     if(u2_mb_type & MB_FORW_OR_BACK)
216*a97c2a1fSXin Li     {
217*a97c2a1fSXin Li 
218*a97c2a1fSXin Li         UWORD16 refPic      = !(u2_mb_type & MB_MV_FORW);
219*a97c2a1fSXin Li         UWORD16 index       = (ps_dec->u2_motion_type);
220*a97c2a1fSXin Li         ps_dec->u2_prev_intra_mb    = 0;
221*a97c2a1fSXin Li         ps_dec->e_mb_pred         = (e_pred_direction_t)refPic;
222*a97c2a1fSXin Li         ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[index];
223*a97c2a1fSXin Li         ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type;
224*a97c2a1fSXin Li         if(NULL == ps_dec_mb_params->pf_func_mb_params)
225*a97c2a1fSXin Li             return -1;
226*a97c2a1fSXin Li         ps_dec_mb_params->pf_func_mb_params(ps_dec);
227*a97c2a1fSXin Li 
228*a97c2a1fSXin Li     }
229*a97c2a1fSXin Li     else if(u2_mb_type & MB_TYPE_INTRA)
230*a97c2a1fSXin Li     {
231*a97c2a1fSXin Li         ps_dec->u2_prev_intra_mb    = 1;
232*a97c2a1fSXin Li         impeg2d_dec_intra_mb(ps_dec);
233*a97c2a1fSXin Li 
234*a97c2a1fSXin Li     }
235*a97c2a1fSXin Li     else
236*a97c2a1fSXin Li     {
237*a97c2a1fSXin Li         ps_dec->u2_prev_intra_mb    = 0;
238*a97c2a1fSXin Li         ps_dec->e_mb_pred = FORW;
239*a97c2a1fSXin Li         ps_dec->u2_motion_type = 0;
240*a97c2a1fSXin Li         impeg2d_dec_0mv_coded_mb(ps_dec);
241*a97c2a1fSXin Li     }
242*a97c2a1fSXin Li 
243*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
244*a97c2a1fSXin Li     /* decode cbp                                                            */
245*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
246*a97c2a1fSXin Li     if((u2_mb_type & MB_TYPE_INTRA))
247*a97c2a1fSXin Li     {
248*a97c2a1fSXin Li         ps_dec->u2_cbp  = 0x3f;
249*a97c2a1fSXin Li         ps_dec->u2_prev_intra_mb    = 1;
250*a97c2a1fSXin Li     }
251*a97c2a1fSXin Li     else
252*a97c2a1fSXin Li     {
253*a97c2a1fSXin Li         ps_dec->u2_prev_intra_mb  = 0;
254*a97c2a1fSXin Li         ps_dec->u2_def_dc_pred[Y_LUMA] = 128 << ps_dec->u2_intra_dc_precision;
255*a97c2a1fSXin Li         ps_dec->u2_def_dc_pred[U_CHROMA] = 128 << ps_dec->u2_intra_dc_precision;
256*a97c2a1fSXin Li         ps_dec->u2_def_dc_pred[V_CHROMA] = 128 << ps_dec->u2_intra_dc_precision;
257*a97c2a1fSXin Li         if((ps_dec->u2_coded_mb))
258*a97c2a1fSXin Li         {
259*a97c2a1fSXin Li             UWORD16 cbpValue;
260*a97c2a1fSXin Li             cbpValue  = gau2_impeg2d_cbp_code[impeg2d_bit_stream_nxt(ps_stream,MB_CBP_LEN)];
261*a97c2a1fSXin Li             ps_dec->u2_cbp  = cbpValue & 0xFF;
262*a97c2a1fSXin Li             impeg2d_bit_stream_flush(ps_stream,(cbpValue >> 8) & 0x0FF);
263*a97c2a1fSXin Li         }
264*a97c2a1fSXin Li         else
265*a97c2a1fSXin Li         {
266*a97c2a1fSXin Li             ps_dec->u2_cbp  = 0;
267*a97c2a1fSXin Li         }
268*a97c2a1fSXin Li     }
269*a97c2a1fSXin Li     return 0;
270*a97c2a1fSXin Li }
271*a97c2a1fSXin Li 
272*a97c2a1fSXin Li 
273*a97c2a1fSXin Li /*******************************************************************************
274*a97c2a1fSXin Li *
275*a97c2a1fSXin Li *  Function Name   : impeg2d_dec_pnb_mb_params
276*a97c2a1fSXin Li *
277*a97c2a1fSXin Li *  Description     : Decodes the parameters for P and B pictures
278*a97c2a1fSXin Li *
279*a97c2a1fSXin Li *  Arguments       :
280*a97c2a1fSXin Li *  dec             : Decoder context
281*a97c2a1fSXin Li *
282*a97c2a1fSXin Li *  Values Returned : None
283*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_pnb_mb_params(dec_state_t * ps_dec)284*a97c2a1fSXin Li WORD32 impeg2d_dec_pnb_mb_params(dec_state_t *ps_dec)
285*a97c2a1fSXin Li {
286*a97c2a1fSXin Li     stream_t *ps_stream = &ps_dec->s_bit_stream;
287*a97c2a1fSXin Li     UWORD16 u2_mb_addr_incr;
288*a97c2a1fSXin Li     UWORD16 u2_total_len;
289*a97c2a1fSXin Li     UWORD16 u2_len;
290*a97c2a1fSXin Li     UWORD16 u2_mb_type;
291*a97c2a1fSXin Li     UWORD32 u4_next_word;
292*a97c2a1fSXin Li     const dec_mb_params_t *ps_dec_mb_params;
293*a97c2a1fSXin Li     if(impeg2d_bit_stream_nxt(ps_stream,1) == 1)
294*a97c2a1fSXin Li     {
295*a97c2a1fSXin Li         impeg2d_bit_stream_flush(ps_stream,1);
296*a97c2a1fSXin Li 
297*a97c2a1fSXin Li     }
298*a97c2a1fSXin Li     else
299*a97c2a1fSXin Li     {
300*a97c2a1fSXin Li         u2_mb_addr_incr = impeg2d_get_mb_addr_incr(ps_stream);
301*a97c2a1fSXin Li 
302*a97c2a1fSXin Li         if(0 == u2_mb_addr_incr)
303*a97c2a1fSXin Li         {
304*a97c2a1fSXin Li             return IV_FAIL;
305*a97c2a1fSXin Li         }
306*a97c2a1fSXin Li 
307*a97c2a1fSXin Li         if(ps_dec->u2_first_mb)
308*a97c2a1fSXin Li         {
309*a97c2a1fSXin Li             /****************************************************************/
310*a97c2a1fSXin Li             /* Section 6.3.17                                               */
311*a97c2a1fSXin Li             /* The first MB of a slice cannot be skipped                    */
312*a97c2a1fSXin Li             /* But the mb_addr_incr can be > 1, because at the beginning of */
313*a97c2a1fSXin Li             /* a slice, it indicates the offset from the last MB in the     */
314*a97c2a1fSXin Li             /* previous row. Hence for the first slice in a row, the        */
315*a97c2a1fSXin Li             /* mb_addr_incr needs to be 1.                                  */
316*a97c2a1fSXin Li             /****************************************************************/
317*a97c2a1fSXin Li             /* MB_x is set to zero whenever MB_y changes.                   */
318*a97c2a1fSXin Li             ps_dec->u2_mb_x = u2_mb_addr_incr - 1;
319*a97c2a1fSXin Li             /* For error resilience */
320*a97c2a1fSXin Li             ps_dec->u2_mb_x = MIN(ps_dec->u2_mb_x, (ps_dec->u2_num_horiz_mb - 1));
321*a97c2a1fSXin Li             ps_dec->u2_num_mbs_left = ((ps_dec->u2_num_vert_mb - ps_dec->u2_mb_y)
322*a97c2a1fSXin Li                             * ps_dec->u2_num_horiz_mb) - ps_dec->u2_mb_x;
323*a97c2a1fSXin Li 
324*a97c2a1fSXin Li             /****************************************************************/
325*a97c2a1fSXin Li             /* mb_addr_incr is forced to 1 because in this decoder it is used */
326*a97c2a1fSXin Li             /* more as an indicator of the number of MBs skipped than the   */
327*a97c2a1fSXin Li             /* as defined by the standard (Section 6.3.17)                  */
328*a97c2a1fSXin Li             /****************************************************************/
329*a97c2a1fSXin Li             u2_mb_addr_incr = 1;
330*a97c2a1fSXin Li             ps_dec->u2_first_mb = 0;
331*a97c2a1fSXin Li         }
332*a97c2a1fSXin Li         else
333*a97c2a1fSXin Li         {
334*a97c2a1fSXin Li             /****************************************************************/
335*a97c2a1fSXin Li             /* In MPEG-2, the last MB of the row cannot be skipped and the  */
336*a97c2a1fSXin Li             /* mb_addr_incr cannot be such that it will take the current MB   */
337*a97c2a1fSXin Li             /* beyond the current row                                       */
338*a97c2a1fSXin Li             /* In MPEG-1, the slice could start and end anywhere and is not */
339*a97c2a1fSXin Li             /* restricted to a row like in MPEG-2. Hence this check should  */
340*a97c2a1fSXin Li             /* not be done for MPEG-1 streams.                              */
341*a97c2a1fSXin Li             /****************************************************************/
342*a97c2a1fSXin Li             if(ps_dec->u2_is_mpeg2 &&
343*a97c2a1fSXin Li                 ((ps_dec->u2_mb_x + u2_mb_addr_incr) > ps_dec->u2_num_horiz_mb))
344*a97c2a1fSXin Li             {
345*a97c2a1fSXin Li                 u2_mb_addr_incr    = ps_dec->u2_num_horiz_mb - ps_dec->u2_mb_x;
346*a97c2a1fSXin Li             }
347*a97c2a1fSXin Li 
348*a97c2a1fSXin Li             if ((u2_mb_addr_incr - 1) > ps_dec->u2_num_mbs_left)
349*a97c2a1fSXin Li             {
350*a97c2a1fSXin Li                 /* If the number of skip MBs are more than the number of MBs
351*a97c2a1fSXin Li                  * left, indicate error.
352*a97c2a1fSXin Li                  */
353*a97c2a1fSXin Li                 return IV_FAIL;
354*a97c2a1fSXin Li             }
355*a97c2a1fSXin Li 
356*a97c2a1fSXin Li             impeg2d_dec_skip_mbs(ps_dec, (UWORD16)(u2_mb_addr_incr - 1));
357*a97c2a1fSXin Li         }
358*a97c2a1fSXin Li 
359*a97c2a1fSXin Li     }
360*a97c2a1fSXin Li     u4_next_word = (UWORD16)impeg2d_bit_stream_nxt(ps_stream,16);
361*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
362*a97c2a1fSXin Li     /* MB type                                                               */
363*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
364*a97c2a1fSXin Li     {
365*a97c2a1fSXin Li         u2_mb_type   = ps_dec->pu2_mb_type[BITS((UWORD16)u4_next_word,15,10)];
366*a97c2a1fSXin Li         u2_len      = BITS(u2_mb_type,15,8);
367*a97c2a1fSXin Li         u2_total_len = u2_len;
368*a97c2a1fSXin Li         u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << u2_len);
369*a97c2a1fSXin Li     }
370*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
371*a97c2a1fSXin Li     /* motion type                                                           */
372*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
373*a97c2a1fSXin Li     {
374*a97c2a1fSXin Li         WORD32 i4_motion_type = ps_dec->u2_motion_type;
375*a97c2a1fSXin Li 
376*a97c2a1fSXin Li         if((u2_mb_type & MB_FORW_OR_BACK) &&  ps_dec->u2_read_motion_type)
377*a97c2a1fSXin Li         {
378*a97c2a1fSXin Li             ps_dec->u2_motion_type = BITS((UWORD16)u4_next_word,15,14);
379*a97c2a1fSXin Li             u2_total_len += MB_MOTION_TYPE_LEN;
380*a97c2a1fSXin Li             u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_MOTION_TYPE_LEN);
381*a97c2a1fSXin Li             i4_motion_type     = ps_dec->u2_motion_type;
382*a97c2a1fSXin Li 
383*a97c2a1fSXin Li         }
384*a97c2a1fSXin Li 
385*a97c2a1fSXin Li 
386*a97c2a1fSXin Li         if ((u2_mb_type & MB_FORW_OR_BACK) &&
387*a97c2a1fSXin Li             ((i4_motion_type == 0) ||
388*a97c2a1fSXin Li             (i4_motion_type == 3) ||
389*a97c2a1fSXin Li             (i4_motion_type == 4) ||
390*a97c2a1fSXin Li             (i4_motion_type >= 7)))
391*a97c2a1fSXin Li         {
392*a97c2a1fSXin Li             //TODO: VANG Check for validity
393*a97c2a1fSXin Li             i4_motion_type = 1;
394*a97c2a1fSXin Li         }
395*a97c2a1fSXin Li 
396*a97c2a1fSXin Li     }
397*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
398*a97c2a1fSXin Li     /* dct type                                                              */
399*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
400*a97c2a1fSXin Li     {
401*a97c2a1fSXin Li         if((u2_mb_type & MB_CODED) && ps_dec->u2_read_dct_type)
402*a97c2a1fSXin Li         {
403*a97c2a1fSXin Li             ps_dec->u2_field_dct = BIT((UWORD16)u4_next_word,15);
404*a97c2a1fSXin Li             u2_total_len += MB_DCT_TYPE_LEN;
405*a97c2a1fSXin Li             u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_DCT_TYPE_LEN);
406*a97c2a1fSXin Li         }
407*a97c2a1fSXin Li     }
408*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
409*a97c2a1fSXin Li     /* Quant scale code                                                      */
410*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
411*a97c2a1fSXin Li     if(u2_mb_type & MB_QUANT)
412*a97c2a1fSXin Li     {
413*a97c2a1fSXin Li         UWORD16 u2_quant_scale_code;
414*a97c2a1fSXin Li         u2_quant_scale_code = BITS((UWORD16)u4_next_word,15,11);
415*a97c2a1fSXin Li 
416*a97c2a1fSXin Li         ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ?
417*a97c2a1fSXin Li             gau1_impeg2_non_linear_quant_scale[u2_quant_scale_code] : (u2_quant_scale_code << 1);
418*a97c2a1fSXin Li         u2_total_len += MB_QUANT_SCALE_CODE_LEN;
419*a97c2a1fSXin Li     }
420*a97c2a1fSXin Li     impeg2d_bit_stream_flush(ps_stream,u2_total_len);
421*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
422*a97c2a1fSXin Li     /* Set the function pointers                                             */
423*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
424*a97c2a1fSXin Li     ps_dec->u2_coded_mb    = (UWORD16)(u2_mb_type & MB_CODED);
425*a97c2a1fSXin Li 
426*a97c2a1fSXin Li     if(u2_mb_type & MB_BIDRECT)
427*a97c2a1fSXin Li     {
428*a97c2a1fSXin Li         UWORD16 u2_index       = (ps_dec->u2_motion_type);
429*a97c2a1fSXin Li 
430*a97c2a1fSXin Li         ps_dec->u2_prev_intra_mb    = 0;
431*a97c2a1fSXin Li         ps_dec->e_mb_pred         = BIDIRECT;
432*a97c2a1fSXin Li         ps_dec_mb_params = &ps_dec->ps_func_bi_direct[u2_index];
433*a97c2a1fSXin Li         ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type;
434*a97c2a1fSXin Li         if(NULL == ps_dec_mb_params->pf_func_mb_params)
435*a97c2a1fSXin Li             return -1;
436*a97c2a1fSXin Li         ps_dec_mb_params->pf_func_mb_params(ps_dec);
437*a97c2a1fSXin Li     }
438*a97c2a1fSXin Li     else if(u2_mb_type & MB_FORW_OR_BACK)
439*a97c2a1fSXin Li     {
440*a97c2a1fSXin Li 
441*a97c2a1fSXin Li         UWORD16 u2_refPic      = !(u2_mb_type & MB_MV_FORW);
442*a97c2a1fSXin Li         UWORD16 u2_index       = (ps_dec->u2_motion_type);
443*a97c2a1fSXin Li         ps_dec->u2_prev_intra_mb    = 0;
444*a97c2a1fSXin Li         ps_dec->e_mb_pred         = (e_pred_direction_t)u2_refPic;
445*a97c2a1fSXin Li         ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[u2_index];
446*a97c2a1fSXin Li         ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type;
447*a97c2a1fSXin Li         if(NULL == ps_dec_mb_params->pf_func_mb_params)
448*a97c2a1fSXin Li             return -1;
449*a97c2a1fSXin Li         ps_dec_mb_params->pf_func_mb_params(ps_dec);
450*a97c2a1fSXin Li 
451*a97c2a1fSXin Li     }
452*a97c2a1fSXin Li     else if(u2_mb_type & MB_TYPE_INTRA)
453*a97c2a1fSXin Li     {
454*a97c2a1fSXin Li         ps_dec->u2_prev_intra_mb    = 1;
455*a97c2a1fSXin Li         impeg2d_dec_intra_mb(ps_dec);
456*a97c2a1fSXin Li 
457*a97c2a1fSXin Li     }
458*a97c2a1fSXin Li     else
459*a97c2a1fSXin Li     {
460*a97c2a1fSXin Li         ps_dec->u2_prev_intra_mb =0;
461*a97c2a1fSXin Li         ps_dec->e_mb_pred = FORW;
462*a97c2a1fSXin Li         ps_dec->u2_motion_type = 0;
463*a97c2a1fSXin Li         impeg2d_dec_0mv_coded_mb(ps_dec);
464*a97c2a1fSXin Li     }
465*a97c2a1fSXin Li 
466*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
467*a97c2a1fSXin Li     /* decode cbp                                                            */
468*a97c2a1fSXin Li     /*-----------------------------------------------------------------------*/
469*a97c2a1fSXin Li     if((u2_mb_type & MB_TYPE_INTRA))
470*a97c2a1fSXin Li     {
471*a97c2a1fSXin Li         ps_dec->u2_cbp  = 0x3f;
472*a97c2a1fSXin Li         ps_dec->u2_prev_intra_mb    = 1;
473*a97c2a1fSXin Li     }
474*a97c2a1fSXin Li     else
475*a97c2a1fSXin Li     {
476*a97c2a1fSXin Li         ps_dec->u2_prev_intra_mb  = 0;
477*a97c2a1fSXin Li         ps_dec->u2_def_dc_pred[Y_LUMA] = 128 << ps_dec->u2_intra_dc_precision;
478*a97c2a1fSXin Li         ps_dec->u2_def_dc_pred[U_CHROMA] = 128 << ps_dec->u2_intra_dc_precision;
479*a97c2a1fSXin Li         ps_dec->u2_def_dc_pred[V_CHROMA] = 128 << ps_dec->u2_intra_dc_precision;
480*a97c2a1fSXin Li         if((ps_dec->u2_coded_mb))
481*a97c2a1fSXin Li         {
482*a97c2a1fSXin Li             UWORD16 cbpValue;
483*a97c2a1fSXin Li             cbpValue  = gau2_impeg2d_cbp_code[impeg2d_bit_stream_nxt(ps_stream,MB_CBP_LEN)];
484*a97c2a1fSXin Li             ps_dec->u2_cbp  = cbpValue & 0xFF;
485*a97c2a1fSXin Li             impeg2d_bit_stream_flush(ps_stream,(cbpValue >> 8) & 0x0FF);
486*a97c2a1fSXin Li         }
487*a97c2a1fSXin Li         else
488*a97c2a1fSXin Li         {
489*a97c2a1fSXin Li             ps_dec->u2_cbp  = 0;
490*a97c2a1fSXin Li         }
491*a97c2a1fSXin Li     }
492*a97c2a1fSXin Li     return 0;
493*a97c2a1fSXin Li }
494*a97c2a1fSXin Li 
495*a97c2a1fSXin Li /*******************************************************************************
496*a97c2a1fSXin Li *  Function Name   : impeg2d_dec_p_b_slice
497*a97c2a1fSXin Li *
498*a97c2a1fSXin Li *  Description     : Decodes P and B slices
499*a97c2a1fSXin Li *
500*a97c2a1fSXin Li *  Arguments       :
501*a97c2a1fSXin Li *  dec             : Decoder state
502*a97c2a1fSXin Li *
503*a97c2a1fSXin Li *  Values Returned : None
504*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_p_b_slice(dec_state_t * ps_dec)505*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_dec_p_b_slice(dec_state_t *ps_dec)
506*a97c2a1fSXin Li {
507*a97c2a1fSXin Li     WORD16 *pi2_vld_out;
508*a97c2a1fSXin Li     UWORD32 i;
509*a97c2a1fSXin Li     yuv_buf_t *ps_cur_frm_buf      = &ps_dec->s_cur_frm_buf;
510*a97c2a1fSXin Li 
511*a97c2a1fSXin Li     UWORD32 u4_frm_offset          = 0;
512*a97c2a1fSXin Li     const dec_mb_params_t *ps_dec_mb_params;
513*a97c2a1fSXin Li     IMPEG2D_ERROR_CODES_T e_error   = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
514*a97c2a1fSXin Li 
515*a97c2a1fSXin Li     pi2_vld_out = ps_dec->ai2_vld_buf;
516*a97c2a1fSXin Li     memset(ps_dec->ai2_pred_mv,0,sizeof(ps_dec->ai2_pred_mv));
517*a97c2a1fSXin Li 
518*a97c2a1fSXin Li     ps_dec->u2_prev_intra_mb    = 0;
519*a97c2a1fSXin Li     ps_dec->u2_first_mb       = 1;
520*a97c2a1fSXin Li 
521*a97c2a1fSXin Li     ps_dec->u2_picture_width = ps_dec->u2_frame_width;
522*a97c2a1fSXin Li 
523*a97c2a1fSXin Li     if(ps_dec->u2_picture_structure != FRAME_PICTURE)
524*a97c2a1fSXin Li     {
525*a97c2a1fSXin Li         ps_dec->u2_picture_width <<= 1;
526*a97c2a1fSXin Li         if(ps_dec->u2_picture_structure == BOTTOM_FIELD)
527*a97c2a1fSXin Li         {
528*a97c2a1fSXin Li             u4_frm_offset = ps_dec->u2_frame_width;
529*a97c2a1fSXin Li         }
530*a97c2a1fSXin Li     }
531*a97c2a1fSXin Li 
532*a97c2a1fSXin Li     do
533*a97c2a1fSXin Li     {
534*a97c2a1fSXin Li         UWORD32 u4_x_offset, u4_y_offset;
535*a97c2a1fSXin Li         WORD32 ret;
536*a97c2a1fSXin Li 
537*a97c2a1fSXin Li 
538*a97c2a1fSXin Li         UWORD32 u4_x_dst_offset = 0;
539*a97c2a1fSXin Li         UWORD32 u4_y_dst_offset = 0;
540*a97c2a1fSXin Li         UWORD8  *pu1_out_p;
541*a97c2a1fSXin Li         UWORD8  *pu1_pred;
542*a97c2a1fSXin Li         WORD32 u4_pred_strd;
543*a97c2a1fSXin Li 
544*a97c2a1fSXin Li         IMPEG2D_TRACE_MB_START(ps_dec->u2_mb_x, ps_dec->u2_mb_y);
545*a97c2a1fSXin Li 
546*a97c2a1fSXin Li         if(ps_dec->e_pic_type == B_PIC)
547*a97c2a1fSXin Li             ret = impeg2d_dec_pnb_mb_params(ps_dec);
548*a97c2a1fSXin Li         else
549*a97c2a1fSXin Li             ret = impeg2d_dec_p_mb_params(ps_dec);
550*a97c2a1fSXin Li 
551*a97c2a1fSXin Li         if(ret)
552*a97c2a1fSXin Li             return IMPEG2D_MB_TEX_DECODE_ERR;
553*a97c2a1fSXin Li 
554*a97c2a1fSXin Li         if(0 >= ps_dec->u2_num_mbs_left)
555*a97c2a1fSXin Li         {
556*a97c2a1fSXin Li             break;
557*a97c2a1fSXin Li         }
558*a97c2a1fSXin Li 
559*a97c2a1fSXin Li         IMPEG2D_TRACE_MB_START(ps_dec->u2_mb_x, ps_dec->u2_mb_y);
560*a97c2a1fSXin Li 
561*a97c2a1fSXin Li         u4_x_dst_offset = u4_frm_offset + (ps_dec->u2_mb_x << 4);
562*a97c2a1fSXin Li         u4_y_dst_offset = (ps_dec->u2_mb_y << 4) * ps_dec->u2_picture_width;
563*a97c2a1fSXin Li         pu1_out_p = ps_cur_frm_buf->pu1_y + u4_x_dst_offset + u4_y_dst_offset;
564*a97c2a1fSXin Li         if(ps_dec->u2_prev_intra_mb == 0)
565*a97c2a1fSXin Li         {
566*a97c2a1fSXin Li             UWORD32 offset_x, offset_y, stride;
567*a97c2a1fSXin Li             UWORD16 index = (ps_dec->u2_motion_type);
568*a97c2a1fSXin Li             /*only for non intra mb's*/
569*a97c2a1fSXin Li             if(ps_dec->e_mb_pred == BIDIRECT)
570*a97c2a1fSXin Li             {
571*a97c2a1fSXin Li                 ps_dec_mb_params = &ps_dec->ps_func_bi_direct[index];
572*a97c2a1fSXin Li             }
573*a97c2a1fSXin Li             else
574*a97c2a1fSXin Li             {
575*a97c2a1fSXin Li                 ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[index];
576*a97c2a1fSXin Li             }
577*a97c2a1fSXin Li 
578*a97c2a1fSXin Li             stride = ps_dec->u2_picture_width;
579*a97c2a1fSXin Li 
580*a97c2a1fSXin Li             offset_x = u4_frm_offset + (ps_dec->u2_mb_x << 4);
581*a97c2a1fSXin Li 
582*a97c2a1fSXin Li             offset_y = (ps_dec->u2_mb_y << 4);
583*a97c2a1fSXin Li 
584*a97c2a1fSXin Li             ps_dec->s_dest_buf.pu1_y = ps_cur_frm_buf->pu1_y + offset_y * stride + offset_x;
585*a97c2a1fSXin Li 
586*a97c2a1fSXin Li             stride = stride >> 1;
587*a97c2a1fSXin Li 
588*a97c2a1fSXin Li             ps_dec->s_dest_buf.pu1_u = ps_cur_frm_buf->pu1_u + (offset_y >> 1) * stride
589*a97c2a1fSXin Li                             + (offset_x >> 1);
590*a97c2a1fSXin Li 
591*a97c2a1fSXin Li             ps_dec->s_dest_buf.pu1_v = ps_cur_frm_buf->pu1_v + (offset_y >> 1) * stride
592*a97c2a1fSXin Li                             + (offset_x >> 1);
593*a97c2a1fSXin Li 
594*a97c2a1fSXin Li             PROFILE_DISABLE_MC_IF0
595*a97c2a1fSXin Li             ps_dec_mb_params->pf_mc(ps_dec);
596*a97c2a1fSXin Li 
597*a97c2a1fSXin Li         }
598*a97c2a1fSXin Li         for(i = 0; i < NUM_LUMA_BLKS; ++i)
599*a97c2a1fSXin Li         {
600*a97c2a1fSXin Li             if((ps_dec->u2_cbp & (1 << (BLOCKS_IN_MB - 1 - i))) != 0)
601*a97c2a1fSXin Li             {
602*a97c2a1fSXin Li                 e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix,
603*a97c2a1fSXin Li                               ps_dec->u2_prev_intra_mb, Y_LUMA, 0);
604*a97c2a1fSXin Li                 if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
605*a97c2a1fSXin Li                 {
606*a97c2a1fSXin Li                     return e_error;
607*a97c2a1fSXin Li                 }
608*a97c2a1fSXin Li 
609*a97c2a1fSXin Li                 u4_x_offset = gai2_impeg2_blk_x_off[i];
610*a97c2a1fSXin Li 
611*a97c2a1fSXin Li                 if(ps_dec->u2_field_dct == 0)
612*a97c2a1fSXin Li                     u4_y_offset = gai2_impeg2_blk_y_off_frm[i] ;
613*a97c2a1fSXin Li                 else
614*a97c2a1fSXin Li                     u4_y_offset = gai2_impeg2_blk_y_off_fld[i] ;
615*a97c2a1fSXin Li 
616*a97c2a1fSXin Li 
617*a97c2a1fSXin Li 
618*a97c2a1fSXin Li 
619*a97c2a1fSXin Li 
620*a97c2a1fSXin Li                 IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
621*a97c2a1fSXin Li 
622*a97c2a1fSXin Li                 PROFILE_DISABLE_IDCT_IF0
623*a97c2a1fSXin Li                 {
624*a97c2a1fSXin Li                     WORD32 idx;
625*a97c2a1fSXin Li                     if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
626*a97c2a1fSXin Li                         idx = 0;
627*a97c2a1fSXin Li                     else
628*a97c2a1fSXin Li                         idx = 1;
629*a97c2a1fSXin Li 
630*a97c2a1fSXin Li                     if(0 == ps_dec->u2_prev_intra_mb)
631*a97c2a1fSXin Li                     {
632*a97c2a1fSXin Li                         pu1_pred = pu1_out_p + u4_y_offset * ps_dec->u2_picture_width + u4_x_offset;
633*a97c2a1fSXin Li                         u4_pred_strd = ps_dec->u2_picture_width << ps_dec->u2_field_dct;
634*a97c2a1fSXin Li                     }
635*a97c2a1fSXin Li                     else
636*a97c2a1fSXin Li                     {
637*a97c2a1fSXin Li                         pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf;
638*a97c2a1fSXin Li                         u4_pred_strd = 8;
639*a97c2a1fSXin Li                     }
640*a97c2a1fSXin Li 
641*a97c2a1fSXin Li                     ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out,
642*a97c2a1fSXin Li                                                             ps_dec->ai2_idct_stg1,
643*a97c2a1fSXin Li                                                             pu1_pred,
644*a97c2a1fSXin Li                                                             pu1_out_p + u4_y_offset * ps_dec->u2_picture_width + u4_x_offset,
645*a97c2a1fSXin Li                                                             8,
646*a97c2a1fSXin Li                                                             u4_pred_strd,
647*a97c2a1fSXin Li                                                             ps_dec->u2_picture_width << ps_dec->u2_field_dct,
648*a97c2a1fSXin Li                                                             ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows);
649*a97c2a1fSXin Li                 }
650*a97c2a1fSXin Li             }
651*a97c2a1fSXin Li 
652*a97c2a1fSXin Li         }
653*a97c2a1fSXin Li 
654*a97c2a1fSXin Li         /* For U and V blocks, divide the x and y offsets by 2. */
655*a97c2a1fSXin Li         u4_x_dst_offset >>= 1;
656*a97c2a1fSXin Li         u4_y_dst_offset >>= 2;
657*a97c2a1fSXin Li 
658*a97c2a1fSXin Li 
659*a97c2a1fSXin Li         /* In case of chrominance blocks the DCT will be frame DCT */
660*a97c2a1fSXin Li         /* i = 0, U component and i = 1 is V componet */
661*a97c2a1fSXin Li         if((ps_dec->u2_cbp & 0x02) != 0)
662*a97c2a1fSXin Li         {
663*a97c2a1fSXin Li             pu1_out_p = ps_cur_frm_buf->pu1_u + u4_x_dst_offset + u4_y_dst_offset;
664*a97c2a1fSXin Li             e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix,
665*a97c2a1fSXin Li                           ps_dec->u2_prev_intra_mb, U_CHROMA, 0);
666*a97c2a1fSXin Li             if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
667*a97c2a1fSXin Li             {
668*a97c2a1fSXin Li                 return e_error;
669*a97c2a1fSXin Li             }
670*a97c2a1fSXin Li 
671*a97c2a1fSXin Li 
672*a97c2a1fSXin Li             IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
673*a97c2a1fSXin Li 
674*a97c2a1fSXin Li             PROFILE_DISABLE_IDCT_IF0
675*a97c2a1fSXin Li             {
676*a97c2a1fSXin Li                 WORD32 idx;
677*a97c2a1fSXin Li                 if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
678*a97c2a1fSXin Li                     idx = 0;
679*a97c2a1fSXin Li                 else
680*a97c2a1fSXin Li                     idx = 1;
681*a97c2a1fSXin Li 
682*a97c2a1fSXin Li                 if(0 == ps_dec->u2_prev_intra_mb)
683*a97c2a1fSXin Li                 {
684*a97c2a1fSXin Li                     pu1_pred = pu1_out_p;
685*a97c2a1fSXin Li                     u4_pred_strd = ps_dec->u2_picture_width >> 1;
686*a97c2a1fSXin Li                 }
687*a97c2a1fSXin Li                 else
688*a97c2a1fSXin Li                 {
689*a97c2a1fSXin Li                     pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf;
690*a97c2a1fSXin Li                     u4_pred_strd = 8;
691*a97c2a1fSXin Li                 }
692*a97c2a1fSXin Li 
693*a97c2a1fSXin Li                 ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out,
694*a97c2a1fSXin Li                                                         ps_dec->ai2_idct_stg1,
695*a97c2a1fSXin Li                                                         pu1_pred,
696*a97c2a1fSXin Li                                                         pu1_out_p,
697*a97c2a1fSXin Li                                                         8,
698*a97c2a1fSXin Li                                                         u4_pred_strd,
699*a97c2a1fSXin Li                                                         ps_dec->u2_picture_width >> 1,
700*a97c2a1fSXin Li                                                         ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows);
701*a97c2a1fSXin Li 
702*a97c2a1fSXin Li             }
703*a97c2a1fSXin Li 
704*a97c2a1fSXin Li         }
705*a97c2a1fSXin Li 
706*a97c2a1fSXin Li 
707*a97c2a1fSXin Li         if((ps_dec->u2_cbp & 0x01) != 0)
708*a97c2a1fSXin Li         {
709*a97c2a1fSXin Li             pu1_out_p = ps_cur_frm_buf->pu1_v + u4_x_dst_offset + u4_y_dst_offset;
710*a97c2a1fSXin Li             e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix,
711*a97c2a1fSXin Li                           ps_dec->u2_prev_intra_mb, V_CHROMA, 0);
712*a97c2a1fSXin Li             if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
713*a97c2a1fSXin Li             {
714*a97c2a1fSXin Li                 return e_error;
715*a97c2a1fSXin Li             }
716*a97c2a1fSXin Li 
717*a97c2a1fSXin Li 
718*a97c2a1fSXin Li             IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
719*a97c2a1fSXin Li 
720*a97c2a1fSXin Li             PROFILE_DISABLE_IDCT_IF0
721*a97c2a1fSXin Li             {
722*a97c2a1fSXin Li                 WORD32 idx;
723*a97c2a1fSXin Li                 if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
724*a97c2a1fSXin Li                     idx = 0;
725*a97c2a1fSXin Li                 else
726*a97c2a1fSXin Li                     idx = 1;
727*a97c2a1fSXin Li                 if(0 == ps_dec->u2_prev_intra_mb)
728*a97c2a1fSXin Li                 {
729*a97c2a1fSXin Li                     pu1_pred = pu1_out_p;
730*a97c2a1fSXin Li                     u4_pred_strd = ps_dec->u2_picture_width >> 1;
731*a97c2a1fSXin Li                 }
732*a97c2a1fSXin Li                 else
733*a97c2a1fSXin Li                 {
734*a97c2a1fSXin Li                     pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf;
735*a97c2a1fSXin Li                     u4_pred_strd = 8;
736*a97c2a1fSXin Li                 }
737*a97c2a1fSXin Li 
738*a97c2a1fSXin Li                 ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out,
739*a97c2a1fSXin Li                                                         ps_dec->ai2_idct_stg1,
740*a97c2a1fSXin Li                                                         pu1_pred,
741*a97c2a1fSXin Li                                                         pu1_out_p,
742*a97c2a1fSXin Li                                                         8,
743*a97c2a1fSXin Li                                                         u4_pred_strd,
744*a97c2a1fSXin Li                                                         ps_dec->u2_picture_width >> 1,
745*a97c2a1fSXin Li                                                         ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows);
746*a97c2a1fSXin Li 
747*a97c2a1fSXin Li             }
748*a97c2a1fSXin Li         }
749*a97c2a1fSXin Li 
750*a97c2a1fSXin Li         ps_dec->u2_num_mbs_left--;
751*a97c2a1fSXin Li         ps_dec->u2_first_mb = 0;
752*a97c2a1fSXin Li         ps_dec->u2_mb_x++;
753*a97c2a1fSXin Li 
754*a97c2a1fSXin Li         if(ps_dec->s_bit_stream.u4_offset > ps_dec->s_bit_stream.u4_max_offset)
755*a97c2a1fSXin Li         {
756*a97c2a1fSXin Li             return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
757*a97c2a1fSXin Li         }
758*a97c2a1fSXin Li         else if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
759*a97c2a1fSXin Li         {
760*a97c2a1fSXin Li             ps_dec->u2_mb_x = 0;
761*a97c2a1fSXin Li             ps_dec->u2_mb_y++;
762*a97c2a1fSXin Li 
763*a97c2a1fSXin Li         }
764*a97c2a1fSXin Li     }
765*a97c2a1fSXin Li     while(ps_dec->u2_num_mbs_left != 0 && impeg2d_bit_stream_nxt(&ps_dec->s_bit_stream,23) != 0x0);
766*a97c2a1fSXin Li     return e_error;
767*a97c2a1fSXin Li }
768