1 /******************************************************************************
2  *
3  * Copyright (C) 2015 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 /*!
21  **************************************************************************
22  * \file ih264d_mb_utils.c
23  *
24  * \brief
25  *    Contains utitlity functions needed for Macroblock decoding
26  *
27  * \date
28  *    18/12/2002
29  *
30  * \author  AI
31  **************************************************************************
32  */
33 #include <string.h>
34 #include <stdlib.h>
35 #include "ih264d_bitstrm.h"
36 #include "ih264d_defs.h"
37 #include "ih264d_debug.h"
38 #include "ih264d_structs.h"
39 #include "ih264d_defs.h"
40 #include "ih264d_mb_utils.h"
41 #include "ih264d_parse_slice.h"
42 #include "ih264d_error_handler.h"
43 #include "ih264d_parse_mb_header.h"
44 #include "ih264d_cabac.h"
45 #include "ih264d_defs.h"
46 #include "ih264d_tables.h"
47 
48 /*****************************************************************************/
49 /*                                                                           */
50 /*  Function Name : get_mb_info_cavlc                                        */
51 /*                                                                           */
52 /*  Description   : This function sets the following information of cur MB   */
53 /*                  (a) mb_x and mb_y                                        */
54 /*                  (b) Neighbour availablity                                */
55 /*                  (c) Macroblock location in the frame buffer              */
56 /*                  (e) For mbaff predicts field/frame u4_flag for topMb        */
57 /*                      and sets the field/frame for botMb. This is          */
58 /*                      written in ps_dec->u1_cur_mb_fld_dec_flag            */
59 /*                                                                           */
60 /*  Inputs        : pointer to decstruct                                     */
61 /*                  pointer to current mb info                               */
62 /*                  currentMbaddress                                         */
63 /*                                                                           */
64 /*  Processing    : leftMb and TopMb params are used by DecMbskip and        */
65 /*                  DecCtxMbfield  modules so that these modules do not      */
66 /*                  check for neigbour availability and then find the        */
67 /*                  neigbours for context increments                         */
68 /*                                                                           */
69 /*  Returns       : OK                                                       */
70 /*                                                                           */
71 /*  Issues        : <List any issues or problems with this function>         */
72 /*                                                                           */
73 /*  Revision History:                                                        */
74 /*                                                                           */
75 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
76 /*         13 07 2002   Jay             Draft                                */
77 /*                                                                           */
78 /*****************************************************************************/
79 
ih264d_get_mb_info_cavlc_nonmbaff(dec_struct_t * ps_dec,const UWORD16 u2_cur_mb_address,dec_mb_info_t * ps_cur_mb_info,UWORD32 u4_mbskip_run)80 UWORD32 ih264d_get_mb_info_cavlc_nonmbaff(dec_struct_t *ps_dec,
81                                           const UWORD16 u2_cur_mb_address,
82                                           dec_mb_info_t * ps_cur_mb_info,
83                                           UWORD32 u4_mbskip_run)
84 {
85     WORD32 mb_x;
86     WORD32 mb_y;
87     UWORD8 u1_mb_ngbr_avail = 0;
88     UWORD16 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs;
89     WORD16 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx;
90     UWORD16 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE;
91     UWORD16 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE;
92     UNUSED(u4_mbskip_run);
93     /*--------------------------------------------------------------------*/
94     /* Calculate values of mb_x and mb_y                                  */
95     /*--------------------------------------------------------------------*/
96     mb_x = (WORD16)ps_dec->u2_mbx;
97     mb_y = (WORD16)ps_dec->u2_mby;
98 
99     ps_dec->u2_cur_mb_addr = u2_cur_mb_address;
100 
101     mb_x++;
102 
103     if(mb_x == u2_frm_width_in_mb)
104     {
105         mb_x = 0;
106         mb_y++;
107     }
108     if(mb_y > ps_dec->i2_prev_slice_mby)
109     {
110         /* if not in the immemdiate row of prev slice end then top
111          will be available */
112         if(mb_y > (ps_dec->i2_prev_slice_mby + 1))
113             i2_prev_slice_mbx = -1;
114 
115         if(mb_x > i2_prev_slice_mbx)
116         {
117             u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
118             u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
119             u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
120         }
121 
122         if((mb_x > (i2_prev_slice_mbx - 1))
123                         && (mb_x != (u2_frm_width_in_mb - 1)))
124         {
125             u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK;
126             u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE;
127         }
128 
129         if(mb_x > (i2_prev_slice_mbx + 1))
130         {
131             u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
132             u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
133         }
134 
135         /* Next row  Left will be available*/
136         i2_prev_slice_mbx = -1;
137     }
138 
139     /* Same row */
140     if(mb_x > (i2_prev_slice_mbx + 1))
141     {
142         u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
143         u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
144     }
145 
146     {
147         mb_neigbour_params_t *ps_cur_mb_row = ps_dec->ps_cur_mb_row;
148         mb_neigbour_params_t *ps_top_mb_row = ps_dec->ps_top_mb_row;
149 
150         /* copy the parameters of topleft Mb */
151         ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype;
152         /* Neighbour pointer assignments*/
153         ps_cur_mb_info->ps_curmb = ps_cur_mb_row + mb_x;
154         ps_cur_mb_info->ps_left_mb = ps_cur_mb_row + mb_x - 1;
155         ps_cur_mb_info->ps_top_mb = ps_top_mb_row + mb_x;
156         ps_cur_mb_info->ps_top_right_mb = ps_top_mb_row + mb_x + 1;
157 
158         /* Update the parameters of topleftmb*/
159         ps_dec->u1_topleft_mbtype = ps_cur_mb_info->ps_top_mb->u1_mb_type;
160     }
161 
162     ps_dec->u2_mby = mb_y;
163     ps_dec->u2_mbx = mb_x;
164     ps_cur_mb_info->u2_mbx = mb_x;
165     ps_cur_mb_info->u2_mby = mb_y;
166     ps_cur_mb_info->u1_topmb = 1;
167     ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
168     ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
169     ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
170     ps_cur_mb_info->ps_curmb->u1_mb_fld = ps_dec->u1_cur_mb_fld_dec_flag;
171     ps_cur_mb_info->u1_mb_field_decodingflag = ps_dec->u1_cur_mb_fld_dec_flag;
172     ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask;
173     ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask;
174     return (OK);
175 
176 }
177 
178 /*****************************************************************************/
179 /*                                                                           */
180 /*  Function Name : get_mb_info_cavlc                                        */
181 /*                                                                           */
182 /*  Description   : This function sets the following information of cur MB   */
183 /*                  (a) mb_x and mb_y                                        */
184 /*                  (b) Neighbour availablity                                */
185 /*                  (c) Macroblock location in the frame buffer              */
186 /*                  (e) For mbaff predicts field/frame u4_flag for topMb        */
187 /*                      and sets the field/frame for botMb. This is          */
188 /*                      written in ps_dec->u1_cur_mb_fld_dec_flag            */
189 /*                                                                           */
190 /*  Inputs        : pointer to decstruct                                     */
191 /*                  pointer to current mb info                               */
192 /*                  currentMbaddress                                         */
193 /*                                                                           */
194 /*  Processing    : leftMb and TopMb params are used by DecMbskip and        */
195 /*                  DecCtxMbfield  modules so that these modules do not      */
196 /*                  check for neigbour availability and then find the        */
197 /*                  neigbours for context increments                         */
198 /*                                                                           */
199 /*  Returns       : OK                                                       */
200 /*                                                                           */
201 /*  Issues        : <List any issues or problems with this function>         */
202 /*                                                                           */
203 /*  Revision History:                                                        */
204 /*                                                                           */
205 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
206 /*         13 07 2002   Jay             Draft                                */
207 /*                                                                           */
208 /*****************************************************************************/
209 
ih264d_get_mb_info_cavlc_mbaff(dec_struct_t * ps_dec,const UWORD16 u2_cur_mb_address,dec_mb_info_t * ps_cur_mb_info,UWORD32 u4_mbskip_run)210 UWORD32 ih264d_get_mb_info_cavlc_mbaff(dec_struct_t *ps_dec,
211                                        const UWORD16 u2_cur_mb_address,
212                                        dec_mb_info_t * ps_cur_mb_info,
213                                        UWORD32 u4_mbskip_run)
214 {
215     UWORD16 u2_mb_x;
216     UWORD16 u2_mb_y;
217     UWORD8 u1_mb_ngbr_avail = 0;
218     UWORD16 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs;
219 
220     UWORD8 u1_top_mb = 1 - (u2_cur_mb_address & 0x01);
221     WORD16 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx;
222     UWORD8 u1_cur_mb_field = 0;
223     UWORD16 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE;
224     UWORD16 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE;
225 
226     /*--------------------------------------------------------------------*/
227     /* Calculate values of mb_x and mb_y                                  */
228     /*--------------------------------------------------------------------*/
229     u2_mb_x = ps_dec->u2_mbx;
230     u2_mb_y = ps_dec->u2_mby;
231 
232     ps_dec->u2_cur_mb_addr = u2_cur_mb_address;
233 
234 
235     if(u1_top_mb)
236     {
237         u2_mb_x++;
238         if(u2_mb_x == u2_frm_width_in_mb)
239         {
240             u2_mb_x = 0;
241             u2_mb_y += 2;
242         }
243         if(u2_mb_y > ps_dec->i2_prev_slice_mby)
244         {
245             /* if not in the immemdiate row of prev slice end then top
246              will be available */
247             if(u2_mb_y > (ps_dec->i2_prev_slice_mby + 2))
248                 i2_prev_slice_mbx = -1;
249             if(u2_mb_x > i2_prev_slice_mbx)
250             {
251                 u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
252                 u1_cur_mb_field = ps_dec->ps_top_mb_row[u2_mb_x << 1].u1_mb_fld;
253                 u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
254                 u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
255             }
256             if((u2_mb_x > (i2_prev_slice_mbx - 1))
257                             && (u2_mb_x != (u2_frm_width_in_mb - 1)))
258             {
259                 u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK;
260                 u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE;
261             }
262 
263             if(u2_mb_x > (i2_prev_slice_mbx + 1))
264             {
265                 u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
266                 u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
267             }
268 
269             i2_prev_slice_mbx = -1;
270         }
271         /* Same row */
272         if(u2_mb_x > (i2_prev_slice_mbx + 1))
273         {
274             u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
275             u1_cur_mb_field =
276                             ps_dec->ps_cur_mb_row[(u2_mb_x << 1) - 1].u1_mb_fld;
277             u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
278         }
279         /* Read u1_cur_mb_field from the bitstream if u4_mbskip_run <= 1*/
280         if(u4_mbskip_run <= 1)
281             u1_cur_mb_field = (UWORD8)ih264d_get_bit_h264(ps_dec->ps_bitstrm);
282 
283         ps_dec->u1_cur_mb_fld_dec_flag = u1_cur_mb_field;
284         ps_dec->u2_top_left_mask = u2_top_left_mask;
285         ps_dec->u2_top_right_mask = u2_top_right_mask;
286     }
287     else
288     {
289         u1_mb_ngbr_avail = ps_dec->u1_mb_ngbr_availablity;
290         u1_cur_mb_field = ps_dec->u1_cur_mb_fld_dec_flag;
291         u2_top_left_mask = ps_dec->u2_top_left_mask;
292         u2_top_right_mask = ps_dec->u2_top_right_mask;
293 
294         if(!u1_cur_mb_field)
295         {
296             /* Top is available */
297             u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
298             u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
299             u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
300             /* Top Right not available */
301             u1_mb_ngbr_avail &= TOP_RT_SUBBLOCK_MASK_MOD;
302             u2_top_right_mask &= (~TOP_RIGHT_TOPR_AVAILABLE);
303 
304             if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK)
305             {
306                 u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
307                 u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
308                 u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
309             }
310         }
311     }
312 
313     ps_dec->u2_mby = u2_mb_y;
314     ps_dec->u2_mbx = u2_mb_x;
315     ps_cur_mb_info->u2_mbx = u2_mb_x;
316     ps_cur_mb_info->u2_mby = u2_mb_y;
317     ps_cur_mb_info->u1_topmb = u1_top_mb;
318     ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
319     ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
320     ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
321     ps_cur_mb_info->u1_mb_field_decodingflag = u1_cur_mb_field;
322     ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask;
323     ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask;
324     ih264d_get_mbaff_neighbours(ps_dec, ps_cur_mb_info, u1_cur_mb_field);
325     return (OK);
326 }
327 
328 /*****************************************************************************/
329 /*                                                                           */
330 /*  Function Name : get_mb_info_cabac                                        */
331 /*                                                                           */
332 /*  Description   : This function sets the following information of cur MB   */
333 /*                  (a) mb_x and mb_y                                        */
334 /*                  (b) Neighbour availablity                                */
335 /*                  (c) Macroblock location in the frame buffer              */
336 /*                  (e) leftMb parama and TopMb params of curMB              */
337 /*                  (f) For Mbaff case leftMb params and TopMb params of     */
338 /*                      bottomMb are also set if curMB is top                */
339 /*                  (g) For mbaff predicts field/frame u4_flag for topMb        */
340 /*                      and sets the field/frame for botMb. This is          */
341 /*                      written in ps_dec->u1_cur_mb_fld_dec_flag            */
342 /*                                                                           */
343 /*  Inputs        : pointer to decstruct                                     */
344 /*                  pointer to current mb info                               */
345 /*                  currentMbaddress                                         */
346 /*                                                                           */
347 /*  Processing    : leftMb and TopMb params are used by DecMbskip and        */
348 /*                  DecCtxMbfield  modules so that these modules do not      */
349 /*                  check for neigbour availability and then find the        */
350 /*                  neigbours for context increments                         */
351 /*                                                                           */
352 /*  Returns       : OK                                                       */
353 /*                                                                           */
354 /*  Issues        : <List any issues or problems with this function>         */
355 /*                                                                           */
356 /*  Revision History:                                                        */
357 /*                                                                           */
358 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
359 /*         13 07 2002   Jay             Draft                                */
360 /*                                                                           */
361 /*****************************************************************************/
ih264d_get_mb_info_cabac_nonmbaff(dec_struct_t * ps_dec,const UWORD16 u2_cur_mb_address,dec_mb_info_t * ps_cur_mb_info,UWORD32 u4_mbskip)362 UWORD32 ih264d_get_mb_info_cabac_nonmbaff(dec_struct_t *ps_dec,
363                                           const UWORD16 u2_cur_mb_address,
364                                           dec_mb_info_t * ps_cur_mb_info,
365                                           UWORD32 u4_mbskip)
366 {
367     WORD32 mb_x;
368     WORD32 mb_y;
369     UWORD32 u1_mb_ngbr_avail = 0;
370     UWORD32 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs;
371     UWORD32 u1_top_mb = 1;
372     WORD32 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx;
373     UWORD32 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE;
374     UWORD32 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE;
375     ctxt_inc_mb_info_t * const p_ctx_inc_mb_map = ps_dec->p_ctxt_inc_mb_map;
376 
377     /*--------------------------------------------------------------------*/
378     /* Calculate values of mb_x and mb_y                                  */
379     /*--------------------------------------------------------------------*/
380     mb_x = (WORD16)ps_dec->u2_mbx;
381     mb_y = (WORD16)ps_dec->u2_mby;
382 
383     ps_dec->u2_cur_mb_addr = u2_cur_mb_address;
384 
385     mb_x++;
386     if((UWORD32)mb_x == u2_frm_width_in_mb)
387     {
388         mb_x = 0;
389         mb_y++;
390     }
391     /*********************************************************************/
392     /* Cabac Context Initialisations                                     */
393     /*********************************************************************/
394     ps_dec->ps_curr_ctxt_mb_info = p_ctx_inc_mb_map + mb_x;
395     ps_dec->p_left_ctxt_mb_info = p_ctx_inc_mb_map - 1;
396     ps_dec->p_top_ctxt_mb_info = p_ctx_inc_mb_map - 1;
397 
398     /********************************************************************/
399     /* neighbour availablility                                          */
400     /********************************************************************/
401     if(mb_y > ps_dec->i2_prev_slice_mby)
402     {
403         /* if not in the immemdiate row of prev slice end then top
404          will be available */
405         if(mb_y > (ps_dec->i2_prev_slice_mby + 1))
406             i2_prev_slice_mbx = -1;
407 
408         if(mb_x > i2_prev_slice_mbx)
409         {
410             u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
411             u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
412             u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
413             ps_dec->p_top_ctxt_mb_info = ps_dec->ps_curr_ctxt_mb_info;
414         }
415         if((mb_x > (i2_prev_slice_mbx - 1))
416                         && ((UWORD32)mb_x != (u2_frm_width_in_mb - 1)))
417         {
418             u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK;
419             u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE;
420         }
421 
422         if(mb_x > (i2_prev_slice_mbx + 1))
423         {
424             u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
425             u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
426         }
427         /* Next row */
428         i2_prev_slice_mbx = -1;
429     }
430     /* Same row */
431     if(mb_x > (i2_prev_slice_mbx + 1))
432     {
433         u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
434         u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
435         ps_dec->p_left_ctxt_mb_info = ps_dec->ps_curr_ctxt_mb_info - 1;
436     }
437     {
438         mb_neigbour_params_t *ps_cur_mb_row = ps_dec->ps_cur_mb_row;
439         mb_neigbour_params_t *ps_top_mb_row = ps_dec->ps_top_mb_row;
440         /* copy the parameters of topleft Mb */
441         ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype;
442         /* Neighbour pointer assignments*/
443         ps_cur_mb_info->ps_curmb = ps_cur_mb_row + mb_x;
444         ps_cur_mb_info->ps_left_mb = ps_cur_mb_row + mb_x - 1;
445         ps_cur_mb_info->ps_top_mb = ps_top_mb_row + mb_x;
446         ps_cur_mb_info->ps_top_right_mb = ps_top_mb_row + mb_x + 1;
447 
448         /* Update the parameters of topleftmb*/
449         ps_dec->u1_topleft_mbtype = ps_cur_mb_info->ps_top_mb->u1_mb_type;
450     }
451 
452     ps_dec->u2_mby = mb_y;
453     ps_dec->u2_mbx = mb_x;
454     ps_cur_mb_info->u2_mbx = mb_x;
455     ps_cur_mb_info->u2_mby = mb_y;
456     ps_cur_mb_info->u1_topmb = u1_top_mb;
457     ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
458     ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
459     ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
460     ps_cur_mb_info->ps_curmb->u1_mb_fld = ps_dec->u1_cur_mb_fld_dec_flag;
461     ps_cur_mb_info->u1_mb_field_decodingflag = ps_dec->u1_cur_mb_fld_dec_flag;
462     ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask;
463     ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask;
464 
465     /*********************************************************************/
466     /*                  Assign the neigbours                             */
467     /*********************************************************************/
468     if(u4_mbskip)
469     {
470         UWORD32 u4_ctx_inc =
471                         2
472                                         - ((!!(ps_dec->p_top_ctxt_mb_info->u1_mb_type
473                                                         & CAB_SKIP_MASK))
474                                                         + (!!(ps_dec->p_left_ctxt_mb_info->u1_mb_type
475                                                                         & CAB_SKIP_MASK)));
476 
477         u4_mbskip = ih264d_decode_bin(u4_ctx_inc, ps_dec->p_mb_skip_flag_t,
478                                       ps_dec->ps_bitstrm, &ps_dec->s_cab_dec_env);
479 
480         if(!u4_mbskip)
481         {
482             if(!(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK))
483             {
484                 UWORD32 *pu4_buf;
485                 UWORD8 *pu1_buf;
486 
487                 pu1_buf = ps_dec->pu1_left_nnz_y;
488                 pu4_buf = (UWORD32 *)pu1_buf;
489                 *pu4_buf = 0;
490                 pu1_buf = ps_dec->pu1_left_nnz_uv;
491                 pu4_buf = (UWORD32 *)pu1_buf;
492                 *pu4_buf = 0;
493 
494 
495                 *(ps_dec->pu1_left_yuv_dc_csbp) = 0;
496                 MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
497                 *(UWORD32 *)ps_dec->pi1_left_ref_idx_ctxt_inc = 0;
498             }
499             if(!(u1_mb_ngbr_avail & TOP_MB_AVAILABLE_MASK))
500             {
501                 MEMSET_16BYTES(ps_dec->ps_curr_ctxt_mb_info->u1_mv, 0);
502                 memset(ps_dec->ps_curr_ctxt_mb_info->i1_ref_idx, 0, 4);
503             }
504         }
505     }
506     return (u4_mbskip);
507 }
508 
509 /*****************************************************************************/
510 /*                                                                           */
511 /*  Function Name : get_mb_info_cabac                                        */
512 /*                                                                           */
513 /*  Description   : This function sets the following information of cur MB   */
514 /*                  (a) mb_x and mb_y                                        */
515 /*                  (b) Neighbour availablity                                */
516 /*                  (c) Macroblock location in the frame buffer              */
517 /*                  (e) leftMb parama and TopMb params of curMB              */
518 /*                  (f) For Mbaff case leftMb params and TopMb params of     */
519 /*                      bottomMb are also set if curMB is top                */
520 /*                  (g) For mbaff predicts field/frame u4_flag for topMb        */
521 /*                      and sets the field/frame for botMb. This is          */
522 /*                      written in ps_dec->u1_cur_mb_fld_dec_flag            */
523 /*                                                                           */
524 /*  Inputs        : pointer to decstruct                                     */
525 /*                  pointer to current mb info                               */
526 /*                  currentMbaddress                                         */
527 /*                                                                           */
528 /*  Processing    : leftMb and TopMb params are used by DecMbskip and        */
529 /*                  DecCtxMbfield  modules so that these modules do not      */
530 /*                  check for neigbour availability and then find the        */
531 /*                  neigbours for context increments                         */
532 /*                                                                           */
533 /*  Returns       : OK                                                       */
534 /*                                                                           */
535 /*  Issues        : <List any issues or problems with this function>         */
536 /*                                                                           */
537 /*  Revision History:                                                        */
538 /*                                                                           */
539 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
540 /*         13 07 2002   Jay             Draft                                */
541 /*                                                                           */
542 /*****************************************************************************/
543 
ih264d_get_mb_info_cabac_mbaff(dec_struct_t * ps_dec,const UWORD16 u2_cur_mb_address,dec_mb_info_t * ps_cur_mb_info,UWORD32 u4_mbskip)544 UWORD32 ih264d_get_mb_info_cabac_mbaff(dec_struct_t *ps_dec,
545                                        const UWORD16 u2_cur_mb_address,
546                                        dec_mb_info_t * ps_cur_mb_info,
547                                        UWORD32 u4_mbskip)
548 {
549     WORD32 mb_x;
550     WORD32 mb_y;
551     UWORD8 u1_mb_ngbr_avail = 0;
552     UWORD16 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs;
553     ctxt_inc_mb_info_t * const p_ctx_inc_mb_map = ps_dec->p_ctxt_inc_mb_map;
554     ctxt_inc_mb_info_t *ps_curr_ctxt, *ps_top_ctxt, *ps_left_ctxt;
555     mb_neigbour_params_t *ps_cur_mb_row = ps_dec->ps_cur_mb_row;
556     mb_neigbour_params_t *ps_top_mb_row = ps_dec->ps_top_mb_row;
557     UWORD32 u4_left_mb_pair_fld = 0;
558     UWORD32 u4_top_mb_pair_fld = 0;
559     UWORD8 u1_cur_mb_field = 0;
560     UWORD8 u1_top_mb = 1 - (u2_cur_mb_address & 0x01);
561     WORD16 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx;
562     UWORD16 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE;
563     UWORD16 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE;
564 
565     /*--------------------------------------------------------------------*/
566     /* Calculate values of mb_x and mb_y                                  */
567     /*--------------------------------------------------------------------*/
568     mb_x = (WORD16)ps_dec->u2_mbx;
569     mb_y = (WORD16)ps_dec->u2_mby;
570 
571     ps_dec->u2_cur_mb_addr = u2_cur_mb_address;
572 
573     ps_top_ctxt = ps_left_ctxt = p_ctx_inc_mb_map - 1;
574 
575     if(u1_top_mb)
576     {
577         ctxt_inc_mb_info_t *ps_left_mb_of_bot = ps_left_ctxt;
578         ctxt_inc_mb_info_t *ps_top_mb_of_bot = ps_top_ctxt;
579 
580         mb_x++;
581 
582         if(mb_x == u2_frm_width_in_mb)
583         {
584             mb_x = 0;
585             mb_y += 2;
586         }
587 
588         ps_curr_ctxt = p_ctx_inc_mb_map + (mb_x << 1);
589         if(mb_y > ps_dec->i2_prev_slice_mby)
590         {
591             UWORD8 u1_cur_mb_fld_flag_known = 0;
592             /* Next row */
593             if(mb_x > 0)
594             {
595                 /***********************************************************************/
596                 /*                    Left Mb is avialable                             */
597                 /***********************************************************************/
598                 u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
599                 ps_left_ctxt = ps_curr_ctxt - 2;
600                 ps_left_mb_of_bot = ps_curr_ctxt - 1;
601                 u1_cur_mb_field = u4_left_mb_pair_fld = ps_cur_mb_row[(mb_x
602                                 << 1) - 1].u1_mb_fld;
603                 u1_cur_mb_fld_flag_known = 1;
604                 u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
605             }
606             /* if not in the immemdiate row of prev slice end then top
607              will be available */
608             if(mb_y > (ps_dec->i2_prev_slice_mby + 2))
609                 i2_prev_slice_mbx = -1;
610             if(mb_x > i2_prev_slice_mbx)
611             {
612                 /*********************************************************************/
613                 /*                    Top Mb is avialable                            */
614                 /*********************************************************************/
615                 u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
616                 u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
617                 u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
618 
619                 /* point to MbAddrB + 1 */
620                 ps_top_ctxt = ps_curr_ctxt + 1;
621                 u4_top_mb_pair_fld = ps_top_mb_row[(mb_x << 1)].u1_mb_fld;
622 
623                 u1_cur_mb_field =
624                                 u1_cur_mb_fld_flag_known ?
625                                                 u1_cur_mb_field :
626                                                 u4_top_mb_pair_fld;
627                 ps_top_mb_of_bot = u1_cur_mb_field ? ps_top_ctxt : ps_curr_ctxt;
628 
629                 /* MbAddrB */
630                 ps_top_ctxt -= (u1_cur_mb_field && u4_top_mb_pair_fld);
631             }
632 
633             if((mb_x > (i2_prev_slice_mbx - 1))
634                             && (mb_x != (u2_frm_width_in_mb - 1)))
635             {
636                 u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK;
637                 u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE;
638             }
639 
640             if(mb_x > (i2_prev_slice_mbx + 1))
641             {
642                 u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
643                 u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
644             }
645         }
646         else
647         {
648             /* Same row */
649             if(mb_x > (i2_prev_slice_mbx + 1))
650             {
651                 /***************************************************************/
652                 /*                    Left Mb is avialable                     */
653                 /***************************************************************/
654                 u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
655 
656                 u1_cur_mb_field = u4_left_mb_pair_fld = ps_cur_mb_row[(mb_x
657                                 << 1) - 1].u1_mb_fld;
658                 ps_left_ctxt = ps_curr_ctxt - 2;
659                 ps_left_mb_of_bot = ps_curr_ctxt - 1;
660                 u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
661             }
662         }
663         /*********************************************************/
664         /* Check whether the call is from I slice or Inter slice */
665         /*********************************************************/
666         if(u4_mbskip)
667         {
668             UWORD32 u4_ctx_inc = 2
669                             - ((!!(ps_top_ctxt->u1_mb_type & CAB_SKIP_MASK))
670                                             + (!!(ps_left_ctxt->u1_mb_type
671                                                             & CAB_SKIP_MASK)));
672             dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
673             decoding_envirnoment_t *ps_cab_dec_env = &ps_dec->s_cab_dec_env;
674             bin_ctxt_model_t *p_mb_skip_flag_t = ps_dec->p_mb_skip_flag_t;
675 
676             ps_dec->u4_next_mb_skip = 0;
677             u4_mbskip = ih264d_decode_bin(u4_ctx_inc, p_mb_skip_flag_t,
678                                           ps_bitstrm, ps_cab_dec_env);
679 
680             if(u4_mbskip)
681             {
682                 UWORD32 u4_next_mbskip;
683                 ps_curr_ctxt->u1_mb_type = CAB_SKIP;
684 
685                 u4_ctx_inc =
686                                 2
687                                                 - ((!!(ps_top_mb_of_bot->u1_mb_type
688                                                                 & CAB_SKIP_MASK))
689                                                                 + (!!(ps_left_mb_of_bot->u1_mb_type
690                                                                                 & CAB_SKIP_MASK)));
691 
692                 /* Decode the skip u4_flag of bottom Mb */
693                 u4_next_mbskip = ih264d_decode_bin(u4_ctx_inc, p_mb_skip_flag_t,
694                                                    ps_bitstrm,
695                                                    ps_cab_dec_env);
696 
697                 ps_dec->u4_next_mb_skip = u4_next_mbskip;
698 
699                 if(!u4_next_mbskip)
700                 {
701                     u4_ctx_inc = u4_top_mb_pair_fld + u4_left_mb_pair_fld;
702 
703                     u1_cur_mb_field = ih264d_decode_bin(
704                                     u4_ctx_inc, ps_dec->p_mb_field_dec_flag_t,
705                                     ps_bitstrm, ps_cab_dec_env);
706                 }
707             }
708         }
709 
710         if(!u4_mbskip)
711         {
712             UWORD32 u4_ctx_inc = u4_top_mb_pair_fld + u4_left_mb_pair_fld;
713             u1_cur_mb_field = ih264d_decode_bin(u4_ctx_inc,
714                                                 ps_dec->p_mb_field_dec_flag_t,
715                                                 ps_dec->ps_bitstrm,
716                                                 &ps_dec->s_cab_dec_env);
717         }
718 
719         ps_dec->u1_cur_mb_fld_dec_flag = u1_cur_mb_field;
720         ps_dec->u2_top_left_mask = u2_top_left_mask;
721         ps_dec->u2_top_right_mask = u2_top_right_mask;
722         ps_dec->u2_mby = mb_y;
723         ps_dec->u2_mbx = mb_x;
724     }
725     else
726     {
727         u1_cur_mb_field = ps_dec->u1_cur_mb_fld_dec_flag;
728         u1_mb_ngbr_avail = ps_dec->u1_mb_ngbr_availablity;
729         u2_top_left_mask = ps_dec->u2_top_left_mask;
730         u2_top_right_mask = ps_dec->u2_top_right_mask;
731         ps_curr_ctxt = p_ctx_inc_mb_map + (mb_x << 1) + 1;
732 
733         if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK)
734         {
735             u4_left_mb_pair_fld = ps_cur_mb_row[(mb_x << 1) - 1].u1_mb_fld;
736 
737             /* point to A if top else A+1 */
738             ps_left_ctxt = ps_curr_ctxt - 2
739                             - (u4_left_mb_pair_fld != u1_cur_mb_field);
740         }
741 
742         if(u1_cur_mb_field)
743         {
744             if(u1_mb_ngbr_avail & TOP_MB_AVAILABLE_MASK)
745             {
746                 /* point to MbAddrB + 1 */
747                 ps_top_ctxt = ps_curr_ctxt;
748             }
749         }
750         else
751         {
752             /* Top is available */
753             u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
754             u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
755             u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
756             /* Top Right not available */
757             u1_mb_ngbr_avail &= TOP_RT_SUBBLOCK_MASK_MOD;
758             u2_top_right_mask &= (~TOP_RIGHT_TOPR_AVAILABLE);
759 
760             if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK)
761             {
762                 u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
763                 u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
764                 u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
765             }
766 
767             /* CurMbAddr - 1 */
768             ps_top_ctxt = ps_curr_ctxt - 1;
769         }
770 
771         if(u4_mbskip)
772         {
773             if(ps_curr_ctxt[-1].u1_mb_type & CAB_SKIP_MASK)
774             {
775                 /* If previous mb is skipped, return value of next mb skip */
776                 u4_mbskip = ps_dec->u4_next_mb_skip;
777 
778             }
779             else
780             {
781                 /* If previous mb is not skipped then call DecMbSkip */
782                 UWORD32 u4_ctx_inc =
783                                 2
784                                                 - ((!!(ps_top_ctxt->u1_mb_type
785                                                                 & CAB_SKIP_MASK))
786                                                                 + (!!(ps_left_ctxt->u1_mb_type
787                                                                                 & CAB_SKIP_MASK)));
788 
789                 u4_mbskip = ih264d_decode_bin(u4_ctx_inc,
790                                               ps_dec->p_mb_skip_flag_t,
791                                               ps_dec->ps_bitstrm,
792                                               &ps_dec->s_cab_dec_env);
793             }
794         }
795     }
796 
797     ps_cur_mb_info->u2_mbx = mb_x;
798     ps_cur_mb_info->u2_mby = mb_y;
799     ps_cur_mb_info->u1_topmb = u1_top_mb;
800     ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
801     ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
802     ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
803     ps_cur_mb_info->u1_mb_field_decodingflag = u1_cur_mb_field;
804     ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask;
805     ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask;
806 
807     ih264d_get_mbaff_neighbours(ps_dec, ps_cur_mb_info, u1_cur_mb_field);
808     {
809         ih264d_get_cabac_context_mbaff(ps_dec, ps_cur_mb_info, u4_mbskip);
810     }
811 
812     {
813         bin_ctxt_model_t *p_cabac_ctxt_table_t = ps_dec->p_cabac_ctxt_table_t;
814 
815         if(u1_cur_mb_field)
816         {
817             p_cabac_ctxt_table_t += SIGNIFICANT_COEFF_FLAG_FLD;
818         }
819         else
820         {
821             p_cabac_ctxt_table_t += SIGNIFICANT_COEFF_FLAG_FRAME;
822         }
823         {
824             bin_ctxt_model_t * * p_significant_coeff_flag_t =
825                             ps_dec->p_significant_coeff_flag_t;
826             p_significant_coeff_flag_t[0] = p_cabac_ctxt_table_t
827                             + SIG_COEFF_CTXT_CAT_0_OFFSET;
828             p_significant_coeff_flag_t[1] = p_cabac_ctxt_table_t
829                             + SIG_COEFF_CTXT_CAT_1_OFFSET;
830             p_significant_coeff_flag_t[2] = p_cabac_ctxt_table_t
831                             + SIG_COEFF_CTXT_CAT_2_OFFSET;
832             p_significant_coeff_flag_t[3] = p_cabac_ctxt_table_t
833                             + SIG_COEFF_CTXT_CAT_3_OFFSET;
834             p_significant_coeff_flag_t[4] = p_cabac_ctxt_table_t
835                             + SIG_COEFF_CTXT_CAT_4_OFFSET;
836             p_significant_coeff_flag_t[5] = p_cabac_ctxt_table_t
837                             + SIG_COEFF_CTXT_CAT_5_OFFSET;
838 
839         }
840     }
841     return (u4_mbskip);
842 }
843 
844 /*****************************************************************************/
845 /*                                                                           */
846 /*  Function Name : ih264d_get_cabac_context_mbaff                                  */
847 /*                                                                           */
848 /*  Description   : Gets the current macroblock Cabac Context and sets the   */
849 /*                  top and left cabac context ptrs in CtxIncMbMap           */
850 /*                  1. For Coss field left neigbours it alters coded block   */
851 /*                     u4_flag , motion vectors, reference indices, cbp of      */
852 /*                     the left neigbours which increases the code i4_size      */
853 /*                  2. For Coss field top neigbours it alters motion         */
854 /*                     vectors reference indices of the top neigbours        */
855 /*                     which further increases the code i4_size                 */
856 /*                                                                           */
857 /*  Inputs        : 1. dec_struct_t                                             */
858 /*                  2. CurMbAddr used for Mbaff (only to see if curMB        */
859 /*                  is top or bottom)                                        */
860 /*                  3. uc_curMbFldDecFlag only for Mbaff                     */
861 /*                                                                           */
862 /*  Returns       : 0                                                        */
863 /*                                                                           */
864 /*  Issues        : code i4_size can be reduced if ui_CodedBlockFlag storage    */
865 /*                  structure in context is changed. This change however     */
866 /*                  would break the parseResidual4x4Cabac asm routine.       */
867 /*                                                                           */
868 /*  Revision History:                                                        */
869 /*                                                                           */
870 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
871 /*         18 06 2005   Jay                                                  */
872 /*                                                                           */
873 /*****************************************************************************/
ih264d_get_cabac_context_mbaff(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD32 u4_mbskip)874 UWORD32 ih264d_get_cabac_context_mbaff(dec_struct_t * ps_dec,
875                                        dec_mb_info_t *ps_cur_mb_info,
876                                        UWORD32 u4_mbskip)
877 {
878     const UWORD8 u1_mb_ngbr_availablity = ps_dec->u1_mb_ngbr_availablity;
879     ctxt_inc_mb_info_t * const p_ctx_inc_mb_map = ps_dec->p_ctxt_inc_mb_map;
880 
881     UWORD8 (*pu1_left_mv_ctxt_inc_2d)[4] = &ps_dec->pu1_left_mv_ctxt_inc[0];
882     WORD8 (*pi1_left_ref_idx_ctxt_inc) = ps_dec->pi1_left_ref_idx_ctxt_inc;
883     const UWORD8 u1_cur_mb_fld_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
884     const UWORD8 u1_topmb = ps_cur_mb_info->u1_topmb;
885     const UWORD8 uc_botMb = 1 - ps_cur_mb_info->u1_topmb;
886 
887     ctxt_inc_mb_info_t * ps_leftMB;
888 
889     ps_dec->ps_curr_ctxt_mb_info = p_ctx_inc_mb_map + (ps_dec->u2_mbx << 1);
890     ps_dec->p_top_ctxt_mb_info = ps_dec->ps_curr_ctxt_mb_info;
891 
892     if(u1_topmb)
893     {
894         pu1_left_mv_ctxt_inc_2d = ps_dec->u1_left_mv_ctxt_inc_arr[0];
895         pi1_left_ref_idx_ctxt_inc = &ps_dec->i1_left_ref_idx_ctx_inc_arr[0][0];
896         ps_dec->pu1_left_yuv_dc_csbp = &ps_dec->u1_yuv_dc_csbp_topmb;
897     }
898     else
899     {
900         /* uc_botMb */
901         pu1_left_mv_ctxt_inc_2d = ps_dec->u1_left_mv_ctxt_inc_arr[1];
902         pi1_left_ref_idx_ctxt_inc = &ps_dec->i1_left_ref_idx_ctx_inc_arr[1][0];
903         ps_dec->pu1_left_yuv_dc_csbp = &ps_dec->u1_yuv_dc_csbp_bot_mb;
904         ps_dec->ps_curr_ctxt_mb_info += 1;
905     }
906 
907     ps_dec->pu1_left_mv_ctxt_inc = pu1_left_mv_ctxt_inc_2d;
908     ps_dec->pi1_left_ref_idx_ctxt_inc = pi1_left_ref_idx_ctxt_inc;
909 
910     if(u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK)
911     {
912         const UWORD8 u1_left_mb_fld_flag = ps_cur_mb_info->ps_left_mb->u1_mb_fld;
913 
914         ps_leftMB = ps_dec->ps_curr_ctxt_mb_info - 2;
915         if(u1_left_mb_fld_flag != u1_cur_mb_fld_flag)
916         {
917             ctxt_inc_mb_info_t *ps_tempLeft;
918             UWORD8 u1_cbp_t, u1_cbp_b;
919             UWORD8 u1_cr_cpb;
920 
921             ps_leftMB -= uc_botMb;
922             ps_tempLeft = ps_dec->ps_left_mb_ctxt_info;
923             ps_tempLeft->u1_mb_type = ps_leftMB->u1_mb_type;
924             ps_tempLeft->u1_intra_chroma_pred_mode =
925                             ps_leftMB->u1_intra_chroma_pred_mode;
926 
927             ps_tempLeft->u1_transform8x8_ctxt = ps_leftMB->u1_transform8x8_ctxt;
928 
929             u1_cr_cpb = ps_leftMB->u1_cbp;
930             /*****************************************************************/
931             /* reform RefIdx, CBP, MV and CBF ctxInc taking care of A and A+1*/
932             /*****************************************************************/
933             if(u1_cur_mb_fld_flag)
934             {
935                 /* current MB is a FLD and left a FRM */
936                 UWORD8 (* const pu1_left_mv_ctxt_inc_2d_arr_top)[4] =
937                                 ps_dec->u1_left_mv_ctxt_inc_arr[0];
938                 UWORD8 (* const pu1_left_mv_ctxt_inc_2d_arr_bot)[4] =
939                                 ps_dec->u1_left_mv_ctxt_inc_arr[1];
940                 WORD8 (* const i1_left_ref_idx_ctxt_inc_arr_top) =
941                                 &ps_dec->i1_left_ref_idx_ctx_inc_arr[0][0];
942                 WORD8 (* const i1_left_ref_idx_ctxt_inc_arr_bot) =
943                                 &ps_dec->i1_left_ref_idx_ctx_inc_arr[1][0];
944 
945                 u1_cbp_t = ps_leftMB->u1_cbp;
946                 u1_cbp_b = (ps_leftMB + 1)->u1_cbp;
947                 ps_tempLeft->u1_cbp = (u1_cbp_t & 0x02)
948                                 | ((u1_cbp_b & 0x02) << 2);
949 
950                 // set motionvectors as
951                 // 0T = 0T  0B = 0T
952                 // 1T = 2T  1B = 2T
953                 // 2T = 0B  2B = 0B
954                 // 3T = 2B  3B = 2B
955                 if(u1_topmb)
956                 {
957                     /********************************************/
958                     /*    Bottoms  DC CBF = Top DC CBF          */
959                     /********************************************/
960                     ps_dec->u1_yuv_dc_csbp_bot_mb =
961                                     ps_dec->u1_yuv_dc_csbp_topmb;
962 
963                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3] =
964                                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_bot[2];
965                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1] =
966                                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_top[2];
967                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2] =
968                                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_bot[0];
969                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[0] =
970                                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_top[0];
971 
972                     i1_left_ref_idx_ctxt_inc_arr_top[1] =
973                                     i1_left_ref_idx_ctxt_inc_arr_bot[0];
974                     i1_left_ref_idx_ctxt_inc_arr_top[3] =
975                                     i1_left_ref_idx_ctxt_inc_arr_bot[2];
976 
977                     *(UWORD32 *)(i1_left_ref_idx_ctxt_inc_arr_bot) =
978                                     *(UWORD32 *)(i1_left_ref_idx_ctxt_inc_arr_top);
979 
980                     memcpy(pu1_left_mv_ctxt_inc_2d_arr_bot,
981                            pu1_left_mv_ctxt_inc_2d_arr_top, 16);
982                 }
983 
984                 {
985                     UWORD8 i;
986                     for(i = 0; i < 4; i++)
987                     {
988                         pu1_left_mv_ctxt_inc_2d[i][1] >>= 1;
989                         pu1_left_mv_ctxt_inc_2d[i][3] >>= 1;
990                     }
991                 }
992             }
993             else
994             {
995                 /* current MB is a FRM and left FLD */
996                 if(u1_topmb)
997                 {
998                     u1_cbp_t = ps_leftMB->u1_cbp;
999                     u1_cbp_t = (u1_cbp_t & 0x02);
1000                     ps_tempLeft->u1_cbp = (u1_cbp_t | (u1_cbp_t << 2));
1001 
1002                     /********************************************/
1003                     /*    Bottoms  DC CBF = Top DC CBF          */
1004                     /********************************************/
1005                     ps_dec->u1_yuv_dc_csbp_bot_mb =
1006                                     ps_dec->u1_yuv_dc_csbp_topmb;
1007 
1008                     // set motionvectors as
1009                     // 3B = 2B = 3T
1010                     // 1B = 0B = 2T
1011                     // 3T = 2T = 1T
1012                     // 1T = 0T = 0T
1013 
1014                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[7] =
1015                                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3];
1016                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[6] =
1017                                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3];
1018 
1019                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[5] =
1020                                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2];
1021                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[4] =
1022                                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2];
1023 
1024                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3] =
1025                                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1];
1026                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2] =
1027                                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1];
1028 
1029                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1] =
1030                                     *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[0];
1031 
1032                     pi1_left_ref_idx_ctxt_inc[7] = (pi1_left_ref_idx_ctxt_inc[3]
1033                                     - 1);
1034                     pi1_left_ref_idx_ctxt_inc[6] = (pi1_left_ref_idx_ctxt_inc[3]
1035                                     - 1);
1036 
1037                     pi1_left_ref_idx_ctxt_inc[5] = (pi1_left_ref_idx_ctxt_inc[1]
1038                                     - 1);
1039                     pi1_left_ref_idx_ctxt_inc[4] = (pi1_left_ref_idx_ctxt_inc[1]
1040                                     - 1);
1041 
1042                     pi1_left_ref_idx_ctxt_inc[3] = (pi1_left_ref_idx_ctxt_inc[2]
1043                                     - 1);
1044                     pi1_left_ref_idx_ctxt_inc[2] = (pi1_left_ref_idx_ctxt_inc[2]
1045                                     - 1);
1046 
1047                     pi1_left_ref_idx_ctxt_inc[1] = (pi1_left_ref_idx_ctxt_inc[0]
1048                                     - 1);
1049                     pi1_left_ref_idx_ctxt_inc[0] = (pi1_left_ref_idx_ctxt_inc[0]
1050                                     - 1);
1051                 }
1052                 else
1053                 {
1054                     u1_cbp_t = ps_leftMB->u1_cbp;
1055                     u1_cbp_t = (u1_cbp_t & 0x08);
1056                     ps_tempLeft->u1_cbp = (u1_cbp_t | (u1_cbp_t >> 2));
1057                 }
1058 
1059                 {
1060                     UWORD8 i;
1061                     for(i = 0; i < 4; i++)
1062                     {
1063                         pu1_left_mv_ctxt_inc_2d[i][1] <<= 1;
1064                         pu1_left_mv_ctxt_inc_2d[i][3] <<= 1;
1065                     }
1066                 }
1067 
1068             }
1069 
1070             ps_tempLeft->u1_cbp = ps_tempLeft->u1_cbp + ((u1_cr_cpb >> 4) << 4);
1071             ps_leftMB = ps_tempLeft;
1072         }
1073 
1074         ps_dec->p_left_ctxt_mb_info = ps_leftMB;
1075     }
1076     else
1077     {
1078         ps_dec->p_left_ctxt_mb_info = p_ctx_inc_mb_map - 1;
1079         if(!u4_mbskip)
1080         {
1081             *(ps_dec->pu1_left_yuv_dc_csbp) = 0;
1082 
1083             MEMSET_16BYTES(&pu1_left_mv_ctxt_inc_2d[0][0], 0);
1084             *(UWORD32 *)pi1_left_ref_idx_ctxt_inc = 0;
1085         }
1086     }
1087 
1088     /*************************************************************************/
1089     /*                Now get the top context mb info                        */
1090     /*************************************************************************/
1091     {
1092         UWORD8 (*u1_top_mv_ctxt_inc_arr_2d)[4] =
1093                         ps_dec->ps_curr_ctxt_mb_info->u1_mv;
1094         WORD8 (*pi1_top_ref_idx_ctxt_inc) =
1095                         ps_dec->ps_curr_ctxt_mb_info->i1_ref_idx;
1096         UWORD8 uc_topMbFldDecFlag = ps_cur_mb_info->ps_top_mb->u1_mb_fld;
1097 
1098         if(u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK)
1099         {
1100             if(ps_cur_mb_info->i1_offset)
1101                 ps_dec->p_top_ctxt_mb_info += 1;
1102 
1103             if(!u4_mbskip)
1104             {
1105                 memcpy(u1_top_mv_ctxt_inc_arr_2d,
1106                        &ps_dec->p_top_ctxt_mb_info->u1_mv, 16);
1107                 memcpy(pi1_top_ref_idx_ctxt_inc,
1108                        &ps_dec->p_top_ctxt_mb_info->i1_ref_idx, 4);
1109                 if(uc_topMbFldDecFlag ^ u1_cur_mb_fld_flag)
1110                 {
1111                     UWORD8 i;
1112                     if(u1_cur_mb_fld_flag)
1113                     {
1114                         for(i = 0; i < 4; i++)
1115                         {
1116                             u1_top_mv_ctxt_inc_arr_2d[i][1] >>= 1;
1117                             u1_top_mv_ctxt_inc_arr_2d[i][3] >>= 1;
1118                         }
1119                     }
1120                     else
1121                     {
1122                         for(i = 0; i < 4; i++)
1123                         {
1124                             u1_top_mv_ctxt_inc_arr_2d[i][1] <<= 1;
1125                             u1_top_mv_ctxt_inc_arr_2d[i][3] <<= 1;
1126                             pi1_top_ref_idx_ctxt_inc[i] -= 1;
1127                         }
1128                     }
1129                 }
1130             }
1131         }
1132         else
1133         {
1134             ps_dec->p_top_ctxt_mb_info = p_ctx_inc_mb_map - 1;
1135             if(!u4_mbskip)
1136             {
1137 
1138                 MEMSET_16BYTES(&u1_top_mv_ctxt_inc_arr_2d[0][0], 0);
1139                 memset(pi1_top_ref_idx_ctxt_inc, 0, 4);
1140             }
1141         }
1142     }
1143 
1144     return OK;
1145 }
1146 
1147 /*****************************************************************************/
1148 /*                                                                           */
1149 /*  Function Name : ih264d_update_mbaff_left_nnz                                    */
1150 /*                                                                           */
1151 /*  Description   : This function updates the left luma and chroma nnz for   */
1152 /*                  mbaff cases.                                             */
1153 /*                                                                           */
1154 /*  Inputs        : <What inputs does the function take?>                    */
1155 /*  Globals       : <Does it use any global variables?>                      */
1156 /*  Processing    : <Describe how the function operates - include algorithm  */
1157 /*                  description>                                             */
1158 /*  Outputs       : <What does the function produce?>                        */
1159 /*  Returns       : <What does the function return?>                         */
1160 /*                                                                           */
1161 /*  Issues        : <List any issues or problems with this function>         */
1162 /*                                                                           */
1163 /*  Revision History:                                                        */
1164 /*                                                                           */
1165 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1166 /*         13 07 2002   Ittiam          Draft                                */
1167 /*                                                                           */
1168 /*****************************************************************************/
ih264d_update_mbaff_left_nnz(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info)1169 void ih264d_update_mbaff_left_nnz(dec_struct_t * ps_dec,
1170                                   dec_mb_info_t * ps_cur_mb_info)
1171 {
1172     UWORD32 *pu4_buf;
1173     UWORD8 *pu1_buf;
1174     if(ps_cur_mb_info->u1_topmb)
1175     {
1176         pu1_buf = ps_dec->pu1_left_nnz_y;
1177         pu4_buf = (UWORD32 *)pu1_buf;
1178         ps_dec->u4_n_left_temp_y = *pu4_buf;
1179 
1180         pu1_buf = ps_dec->pu1_left_nnz_uv;
1181         pu4_buf = (UWORD32 *)pu1_buf;
1182         ps_dec->u4_n_left_temp_uv = *pu4_buf;
1183     }
1184     else
1185     {
1186 
1187         ps_dec->u4_n_leftY[0] = ps_dec->u4_n_left_temp_y;
1188         pu1_buf = ps_dec->pu1_left_nnz_y;
1189         pu4_buf = (UWORD32 *)pu1_buf;
1190         ps_dec->u4_n_leftY[1] = *pu4_buf;
1191         ps_dec->u4_n_left_cr[0] = ps_dec->u4_n_left_temp_uv;
1192         pu1_buf = ps_dec->pu1_left_nnz_uv;
1193         pu4_buf = (UWORD32 *)pu1_buf;
1194         ps_dec->u4_n_left_cr[1] = *pu4_buf;
1195 
1196     }
1197 }
1198 
1199 /*!
1200  **************************************************************************
1201  * \if Function name : ih264d_get_mbaff_neighbours \endif
1202  *
1203  * \brief
1204  *    Gets the neighbors for the current MB if it is of type MB-AFF
1205  *  frame.
1206  *
1207  * \return
1208  *    None
1209  *
1210  **************************************************************************
1211  */
ih264d_get_mbaff_neighbours(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 uc_curMbFldDecFlag)1212 void ih264d_get_mbaff_neighbours(dec_struct_t * ps_dec,
1213                                  dec_mb_info_t * ps_cur_mb_info,
1214                                  UWORD8 uc_curMbFldDecFlag)
1215 {
1216 
1217     mb_neigbour_params_t *ps_left_mb;
1218     mb_neigbour_params_t *ps_top_mb;
1219     mb_neigbour_params_t *ps_top_right_mb = NULL;
1220     mb_neigbour_params_t *ps_curmb;
1221     const UWORD8 u1_topmb = ps_cur_mb_info->u1_topmb;
1222     const UWORD8 uc_botMb = 1 - u1_topmb;
1223     const UWORD32 u4_mb_x = ps_cur_mb_info->u2_mbx;
1224 
1225     /* Current MbParams location in top row buffer */
1226     ps_curmb = ps_dec->ps_cur_mb_row + (u4_mb_x << 1) + uc_botMb;
1227     ps_left_mb = ps_curmb - 2;
1228     /* point to A if top else A+1 */
1229     if(uc_botMb && (ps_left_mb->u1_mb_fld != uc_curMbFldDecFlag))
1230     {
1231         /* move from A + 1 to A */
1232         ps_left_mb--;
1233     }
1234     ps_cur_mb_info->i1_offset = 0;
1235     if((uc_curMbFldDecFlag == 0) && uc_botMb)
1236     {
1237         mb_neigbour_params_t *ps_topleft_mb;
1238         /* CurMbAddr - 1 */
1239         ps_top_mb = ps_curmb - 1;
1240 
1241         /* Mark Top right Not available */
1242         /* point to A */
1243         ps_topleft_mb = ps_curmb - 3;
1244 
1245         if(ps_topleft_mb->u1_mb_fld)
1246         {
1247             /* point to A + 1 */
1248             ps_topleft_mb++;
1249         }
1250         ps_cur_mb_info->u1_topleft_mb_fld = ps_topleft_mb->u1_mb_fld;
1251         ps_cur_mb_info->u1_topleft_mbtype = ps_topleft_mb->u1_mb_type;
1252     }
1253     else
1254     {
1255         /* Top = B + 1 */
1256         ps_top_mb = ps_dec->ps_top_mb_row + (u4_mb_x << 1) + 1;
1257         ps_top_right_mb = ps_top_mb + 2;
1258         ps_cur_mb_info->i1_offset = 4;
1259         /* TopRight =  C + 1 */
1260 
1261         /* TopLeft = D+1 */
1262         ps_cur_mb_info->u1_topleft_mb_fld = ps_dec->u1_topleft_mb_fld_bot;
1263         ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype_bot;
1264 
1265         if(uc_curMbFldDecFlag && u1_topmb)
1266         {
1267             if(ps_top_mb->u1_mb_fld)
1268             {
1269                 /* MbAddrB */
1270                 ps_top_mb--;
1271                 ps_cur_mb_info->i1_offset = 0;
1272             }
1273             /* If topright is field then point to C */
1274             ps_top_right_mb -= ps_top_right_mb->u1_mb_fld ? 1 : 0;
1275             if(ps_cur_mb_info->u1_topleft_mb_fld)
1276             {
1277                 /* TopLeft = D */
1278                 ps_cur_mb_info->u1_topleft_mb_fld = ps_dec->u1_topleft_mb_fld;
1279                 ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype;
1280             }
1281         }
1282     }
1283     if(u1_topmb)
1284     {
1285         /* Update the parameters of topleftmb*/
1286         ps_dec->u1_topleft_mb_fld = ps_top_mb->u1_mb_fld;
1287         ps_dec->u1_topleft_mbtype = ps_top_mb->u1_mb_type;
1288         /* Set invscan and dequantMatrixScan*/
1289         if(uc_curMbFldDecFlag)
1290         {
1291             ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
1292         }
1293         else
1294         {
1295             ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
1296         }
1297         ps_dec->pu2_quant_scale_y =
1298                         gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_y_rem6];
1299         ps_dec->pu2_quant_scale_u =
1300                         gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_u_rem6];
1301         ps_dec->pu2_quant_scale_v =
1302                         gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_v_rem6];
1303 
1304     }
1305     else
1306     {
1307         /* Update the parameters of topleftmb*/
1308         mb_neigbour_params_t *ps_top_mb_temp = ps_dec->ps_top_mb_row
1309                         + (u4_mb_x << 1) + 1;
1310         ps_dec->u1_topleft_mb_fld_bot = ps_top_mb_temp->u1_mb_fld;
1311         ps_dec->u1_topleft_mbtype_bot = ps_top_mb_temp->u1_mb_type;
1312     }
1313 
1314     ps_cur_mb_info->ps_left_mb = ps_left_mb;
1315     ps_cur_mb_info->ps_top_mb = ps_top_mb;
1316     ps_cur_mb_info->ps_top_right_mb = ps_top_right_mb;
1317     ps_cur_mb_info->ps_curmb = ps_curmb;
1318     ps_curmb->u1_mb_fld = uc_curMbFldDecFlag;
1319 
1320     {
1321         /* Form Left NNZ */
1322         UWORD8 u1_is_left_mb_fld = ps_left_mb->u1_mb_fld;
1323         UWORD8 *pu1_left_mb_pair_nnz_y = (UWORD8 *)&ps_dec->u4_n_leftY[0];
1324         UWORD8 *pu1_left_mb_pair_nnz_uv = (UWORD8 *)&ps_dec->u4_n_left_cr[0];
1325         UWORD8 *pu1_left_nnz_y = ps_dec->pu1_left_nnz_y;
1326         UWORD8 *pu1_left_nnz_uv = ps_dec->pu1_left_nnz_uv;
1327 
1328         if(uc_curMbFldDecFlag == u1_is_left_mb_fld)
1329         {
1330             *(UWORD32 *)pu1_left_nnz_y = *(UWORD32 *)(pu1_left_mb_pair_nnz_y
1331                             + (uc_botMb << 2));
1332             *(UWORD32 *)pu1_left_nnz_uv = *(UWORD32 *)(pu1_left_mb_pair_nnz_uv
1333                             + (uc_botMb << 2));
1334         }
1335         else if((uc_curMbFldDecFlag == 0) && u1_topmb && u1_is_left_mb_fld)
1336         {
1337             /* 0 0 1 1 of u4_n_leftY[0], 0 0 2 2 of u4_n_left_cr[0] */
1338             pu1_left_nnz_y[0] = pu1_left_nnz_y[1] = pu1_left_mb_pair_nnz_y[0];
1339             pu1_left_nnz_y[2] = pu1_left_nnz_y[3] = pu1_left_mb_pair_nnz_y[1];
1340             pu1_left_nnz_uv[0] = pu1_left_nnz_uv[1] =
1341                             pu1_left_mb_pair_nnz_uv[0];
1342             pu1_left_nnz_uv[2] = pu1_left_nnz_uv[3] =
1343                             pu1_left_mb_pair_nnz_uv[2];
1344         }
1345         else if((uc_curMbFldDecFlag == 0) && uc_botMb && u1_is_left_mb_fld)
1346         {
1347             /* 2 2 3 3 of u4_n_leftY[0] , 1 1 3 3 of u4_n_left_cr[0] */
1348             pu1_left_nnz_y[0] = pu1_left_nnz_y[1] = pu1_left_mb_pair_nnz_y[2];
1349             pu1_left_nnz_y[2] = pu1_left_nnz_y[3] = pu1_left_mb_pair_nnz_y[3];
1350             pu1_left_nnz_uv[0] = pu1_left_nnz_uv[1] =
1351                             pu1_left_mb_pair_nnz_uv[1];
1352             pu1_left_nnz_uv[2] = pu1_left_nnz_uv[3] =
1353                             pu1_left_mb_pair_nnz_uv[3];
1354         }
1355         else
1356         {
1357             /* 0 2 0 2 of u4_n_leftY[0], u4_n_leftY[1] */
1358             pu1_left_nnz_y[0] = pu1_left_mb_pair_nnz_y[0];
1359             pu1_left_nnz_y[1] = pu1_left_mb_pair_nnz_y[2];
1360             pu1_left_nnz_y[2] = pu1_left_mb_pair_nnz_y[4 + 0];
1361             pu1_left_nnz_y[3] = pu1_left_mb_pair_nnz_y[4 + 2];
1362 
1363             /* 0 of u4_n_left_cr[0] and 0 u4_n_left_cr[1]
1364              2 of u4_n_left_cr[0] and 2 u4_n_left_cr[1] */
1365             pu1_left_nnz_uv[0] = pu1_left_mb_pair_nnz_uv[0];
1366             pu1_left_nnz_uv[1] = pu1_left_mb_pair_nnz_uv[4 + 0];
1367             pu1_left_nnz_uv[2] = pu1_left_mb_pair_nnz_uv[2];
1368             pu1_left_nnz_uv[3] = pu1_left_mb_pair_nnz_uv[4 + 2];
1369         }
1370     }
1371 }
1372 
1373 /*
1374  **************************************************************************
1375  * \if Function name : ih264d_transfer_mb_group_data \endif
1376  *
1377  * \brief
1378  *     Transfer the Following things
1379  *     N-Mb DeblkParams Data    ( To Ext DeblkParams Buffer )
1380  *     N-Mb Recon Data          ( To Ext Frame Buffer )
1381  *     N-Mb Intrapredline Data  ( Updated Internally)
1382  *     N-Mb MV Data             ( To Ext MV Buffer )
1383  *     N-Mb MVTop/TopRight Data ( To Int MV Top Scratch Buffers)
1384  *
1385  * \return
1386  *    None
1387  *
1388  **************************************************************************
1389  */
ih264d_transfer_mb_group_data(dec_struct_t * ps_dec,const UWORD8 u1_num_mbs,const UWORD8 u1_end_of_row,const UWORD8 u1_end_of_row_next)1390 void ih264d_transfer_mb_group_data(dec_struct_t * ps_dec,
1391                                    const UWORD8 u1_num_mbs,
1392                                    const UWORD8 u1_end_of_row, /* Cur n-Mb End of Row Flag */
1393                                    const UWORD8 u1_end_of_row_next /* Next n-Mb End of Row Flag */
1394                                    )
1395 {
1396     dec_mb_info_t *ps_cur_mb_info = ps_dec->ps_nmb_info;
1397     tfr_ctxt_t *ps_trns_addr = &ps_dec->s_tran_addrecon;
1398     UWORD16 u2_mb_y;
1399     UWORD32 y_offset;
1400     UWORD32 u4_frame_stride;
1401     mb_neigbour_params_t *ps_temp;
1402     const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
1403     UNUSED(u1_end_of_row_next);
1404 
1405     ps_trns_addr->pu1_dest_y += ps_trns_addr->u4_inc_y[u1_end_of_row];
1406     ps_trns_addr->pu1_dest_u += ps_trns_addr->u4_inc_uv[u1_end_of_row];
1407     ps_trns_addr->pu1_dest_v += ps_trns_addr->u4_inc_uv[u1_end_of_row];
1408 
1409     /* Swap top and current pointers */
1410     if(u1_end_of_row)
1411     {
1412 
1413         if(ps_dec->u1_separate_parse)
1414         {
1415             u2_mb_y = ps_dec->i2_dec_thread_mb_y;
1416         }
1417         else
1418         {
1419             ps_temp = ps_dec->ps_cur_mb_row;
1420             ps_dec->ps_cur_mb_row = ps_dec->ps_top_mb_row;
1421             ps_dec->ps_top_mb_row = ps_temp;
1422 
1423             u2_mb_y = ps_dec->u2_mby + (1 + u1_mbaff);
1424         }
1425 
1426         u4_frame_stride = ps_dec->u2_frm_wd_y
1427                         << ps_dec->ps_cur_slice->u1_field_pic_flag;
1428         y_offset = (u2_mb_y * u4_frame_stride) << 4;
1429         ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + y_offset;
1430 
1431         u4_frame_stride = ps_dec->u2_frm_wd_uv
1432                         << ps_dec->ps_cur_slice->u1_field_pic_flag;
1433         y_offset = (u2_mb_y * u4_frame_stride) << 3;
1434         ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + y_offset;
1435         ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + y_offset;
1436 
1437         ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1438         ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1439         ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1440     }
1441 
1442     /*
1443      * The Slice boundary is also a valid condition to transfer. So recalculate
1444      * the Left increment, in case the number of MBs is lesser than the
1445      * N MB value. u1_num_mbs will be equal to N of N MB if the entire N Mb is
1446      * decoded.
1447      */
1448     ps_dec->s_tran_addrecon.u2_mv_left_inc = ((u1_num_mbs >> u1_mbaff) - 1)
1449                     << (4 + u1_mbaff);
1450     ps_dec->s_tran_addrecon.u2_mv_top_left_inc = (u1_num_mbs << 2) - 1
1451                     - (u1_mbaff << 2);
1452 
1453     if(ps_dec->u1_separate_parse == 0)
1454     {
1455         /* reassign left MV and cur MV pointers */
1456         ps_dec->ps_mv_left = ps_dec->ps_mv_cur
1457                         + ps_dec->s_tran_addrecon.u2_mv_left_inc;
1458 
1459         ps_dec->ps_mv_cur += (u1_num_mbs << 4);
1460     }
1461 
1462     /* Increment deblock parameters pointer in external memory */
1463 
1464     if(ps_dec->u1_separate_parse == 1)
1465     {
1466         ps_dec->ps_deblk_mbn_dec_thrd += u1_num_mbs;
1467     }
1468     else
1469     {
1470         ps_dec->ps_deblk_mbn += u1_num_mbs;
1471     }
1472 
1473 }
1474 
1475