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_parse_slice.c
23  *
24  * \brief
25  *    Contains routines that decodes a slice NAL unit
26  *
27  * \date
28  *    19/12/2002
29  *
30  * \author  AI
31  **************************************************************************
32  */
33 #include <string.h>
34 #include "ih264_typedefs.h"
35 #include "ih264_macros.h"
36 #include "ih264_platform_macros.h"
37 #include "ithread.h"
38 #include "ih264d_structs.h"
39 #include "ih264d_debug.h"
40 #include "ih264d_bitstrm.h"
41 #include "ih264d_parse_mb_header.h"
42 #include "ih264d_process_bslice.h"
43 #include "ih264d_process_pslice.h"
44 #include "ih264d_parse_cavlc.h"
45 #include "ih264d_utils.h"
46 #include "ih264d_deblocking.h"
47 #include "ih264d_defs.h"
48 #include "ih264d_error_handler.h"
49 #include "ih264d_tables.h"
50 #include "ih264d_defs.h"
51 #include "ih264d_mem_request.h"
52 #include "ih264d_parse_islice.h"
53 #include "ih264d_parse_slice.h"
54 #include "ih264d_mvpred.h"
55 #include "ih264d_mb_utils.h"
56 
57 #include "ih264d_defs.h"
58 #include "ih264d_quant_scaling.h"
59 
60 #include "ih264d_inter_pred.h"
61 
62 #include "ih264d_sei.h"
63 #include "ih264d.h"
64 #include "ih264_error.h"
65 #include "ih264_disp_mgr.h"
66 #include "ih264_buf_mgr.h"
67 
68 #include "ih264d_thread_parse_decode.h"
69 #include "ih264d_thread_compute_bs.h"
70 #include "ih264d_dpb_manager.h"
71 #include <assert.h>
72 #include "ih264d_parse_islice.h"
73 #define RET_LAST_SKIP  0x80000000
74 
75 /*!
76  **************************************************************************
77  * \if Function name : ih264d_form_pred_weight_matrix \endif
78  *
79  * \brief
80  *    Forms pred weight matrix.
81  *
82  * \return
83  *    None
84  *
85  **************************************************************************
86  */
87 
ih264d_form_pred_weight_matrix(dec_struct_t * ps_dec)88 void ih264d_form_pred_weight_matrix(dec_struct_t *ps_dec)
89 {
90     dec_slice_params_t *ps_cur_slice;
91     UWORD8 uc_num_ref_idx_l0_active, uc_num_ref_idx_l1_active;
92     UWORD8 i, j;
93     UWORD32 *pu4_mat_iwt_ofst;
94     UWORD16 i2_idx;
95     UWORD32 *pui32_weight_offset_l0, *pui32_weight_offset_l1;
96     UWORD32 u4_temp;
97 
98     ps_cur_slice = ps_dec->ps_cur_slice;
99     uc_num_ref_idx_l0_active = ps_cur_slice->u1_num_ref_idx_lx_active[0];
100     uc_num_ref_idx_l1_active = ps_cur_slice->u1_num_ref_idx_lx_active[1];
101 
102     pu4_mat_iwt_ofst = ps_dec->pu4_wts_ofsts_mat;
103 
104     if(ps_cur_slice->u1_slice_type == B_SLICE)
105     {
106         for(i = 0; i < uc_num_ref_idx_l0_active; i++)
107         {
108             pui32_weight_offset_l0 = ps_cur_slice->u4_wt_ofst_lx[0][i];
109             for(j = 0; j < uc_num_ref_idx_l1_active; j++)
110             {
111                 pui32_weight_offset_l1 = ps_cur_slice->u4_wt_ofst_lx[1][j];
112                 i2_idx = i * uc_num_ref_idx_l0_active + j;
113                 i2_idx = X3(i2_idx);
114                 /*        u4_temp = (pui32_weight_offset_l0[0] | (pui32_weight_offset_l1[0] << 16));
115                  pu4_mat_iwt_ofst[0] = u4_temp;
116                  u4_temp = (pui32_weight_offset_l0[1] | (pui32_weight_offset_l1[1] << 16));
117                  pu4_mat_iwt_ofst[1] = u4_temp;
118                  u4_temp = (pui32_weight_offset_l0[2] | (pui32_weight_offset_l1[2] << 16));
119                  pu4_mat_iwt_ofst[2] = u4_temp;
120                  pu4_mat_iwt_ofst += 3;*/
121                 pu4_mat_iwt_ofst[0] = pui32_weight_offset_l0[0];
122                 pu4_mat_iwt_ofst[1] = pui32_weight_offset_l1[0];
123                 pu4_mat_iwt_ofst[2] = pui32_weight_offset_l0[1];
124                 pu4_mat_iwt_ofst[3] = pui32_weight_offset_l1[1];
125                 pu4_mat_iwt_ofst[4] = pui32_weight_offset_l0[2];
126                 pu4_mat_iwt_ofst[5] = pui32_weight_offset_l1[2];
127                 pu4_mat_iwt_ofst += 6;
128             }
129         }
130     }
131     else
132     {
133         for(i = 0; i < uc_num_ref_idx_l0_active; i++)
134         {
135             pui32_weight_offset_l0 = ps_cur_slice->u4_wt_ofst_lx[0][i];
136             i2_idx = X3(i);
137             u4_temp = (UWORD32)pui32_weight_offset_l0[0];
138             pu4_mat_iwt_ofst[0] = u4_temp;
139             u4_temp = (UWORD32)pui32_weight_offset_l0[1];
140             pu4_mat_iwt_ofst[2] = u4_temp;
141             u4_temp = (UWORD32)pui32_weight_offset_l0[2];
142             pu4_mat_iwt_ofst[4] = u4_temp;
143             pu4_mat_iwt_ofst += 6;
144         }
145     }
146 }
147 
148 
149 /*!
150  **************************************************************************
151  * \if Function name :  init_firstSliceParam \endif
152  *
153  * \brief
154  *    Initialize the Parameter required for all the slices for a picture
155  *
156  * \return           : Nothing
157  *
158  **************************************************************************
159  */
160 
ih264d_start_of_pic(dec_struct_t * ps_dec,WORD32 i4_poc,pocstruct_t * ps_temp_poc,UWORD16 u2_frame_num,dec_pic_params_t * ps_pps)161 WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec,
162                          WORD32 i4_poc,
163                          pocstruct_t *ps_temp_poc,
164                          UWORD16 u2_frame_num,
165                          dec_pic_params_t *ps_pps)
166 {
167     pocstruct_t *ps_prev_poc = &ps_dec->s_cur_pic_poc;
168     pocstruct_t *ps_cur_poc = ps_temp_poc;
169 
170     pic_buffer_t *pic_buf;
171 
172     ivd_video_decode_op_t * ps_dec_output =
173                     (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
174     dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
175     dec_seq_params_t *ps_seq = ps_pps->ps_sps;
176     UWORD8 u1_bottom_field_flag = ps_cur_slice->u1_bottom_field_flag;
177     UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
178     /* high profile related declarations */
179     high_profile_tools_t s_high_profile;
180     WORD32 ret;
181 
182     H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
183 
184     ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
185     ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
186     ps_prev_poc->i4_delta_pic_order_cnt_bottom =
187                     ps_cur_poc->i4_delta_pic_order_cnt_bottom;
188     ps_prev_poc->i4_delta_pic_order_cnt[0] =
189                     ps_cur_poc->i4_delta_pic_order_cnt[0];
190     ps_prev_poc->i4_delta_pic_order_cnt[1] =
191                     ps_cur_poc->i4_delta_pic_order_cnt[1];
192     ps_prev_poc->u1_bot_field = ps_dec->ps_cur_slice->u1_bottom_field_flag;
193     ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
194     ps_prev_poc->u2_frame_num = u2_frame_num;
195     ps_dec->i1_prev_mb_qp_delta = 0;
196     ps_dec->i1_next_ctxt_idx = 0;
197 
198 
199     ps_dec->u4_nmb_deblk = 0;
200     if(ps_dec->u4_num_cores == 1)
201        ps_dec->u4_nmb_deblk = 1;
202 
203 
204 
205     if(ps_seq->u1_mb_aff_flag == 1)
206     {
207         ps_dec->u4_nmb_deblk = 0;
208         if(ps_dec->u4_num_cores > 2)
209             ps_dec->u4_num_cores = 2;
210     }
211 
212         ps_dec->u4_use_intrapred_line_copy = 0;
213 
214 
215 
216     if (ps_seq->u1_mb_aff_flag == 0)
217     {
218         ps_dec->u4_use_intrapred_line_copy = 1;
219     }
220 
221     ps_dec->u4_app_disable_deblk_frm = 0;
222     /* If degrade is enabled, set the degrade flags appropriately */
223     if(ps_dec->i4_degrade_type && ps_dec->i4_degrade_pics)
224     {
225         WORD32 degrade_pic;
226         ps_dec->i4_degrade_pic_cnt++;
227         degrade_pic = 0;
228 
229         /* If degrade is to be done in all frames, then do not check further */
230         switch(ps_dec->i4_degrade_pics)
231         {
232             case 4:
233             {
234                 degrade_pic = 1;
235                 break;
236             }
237             case 3:
238             {
239                 if(ps_cur_slice->u1_slice_type != I_SLICE)
240                     degrade_pic = 1;
241 
242                 break;
243             }
244             case 2:
245             {
246 
247                 /* If pic count hits non-degrade interval or it is an islice, then do not degrade */
248                 if((ps_cur_slice->u1_slice_type != I_SLICE)
249                                 && (ps_dec->i4_degrade_pic_cnt
250                                                 != ps_dec->i4_nondegrade_interval))
251                     degrade_pic = 1;
252 
253                 break;
254             }
255             case 1:
256             {
257                 /* Check if the current picture is non-ref */
258                 if(0 == ps_cur_slice->u1_nal_ref_idc)
259                 {
260                     degrade_pic = 1;
261                 }
262                 break;
263             }
264 
265         }
266         if(degrade_pic)
267         {
268             if(ps_dec->i4_degrade_type & 0x2)
269                 ps_dec->u4_app_disable_deblk_frm = 1;
270 
271             /* MC degrading is done only for non-ref pictures */
272             if(0 == ps_cur_slice->u1_nal_ref_idc)
273             {
274                 if(ps_dec->i4_degrade_type & 0x4)
275                     ps_dec->i4_mv_frac_mask = 0;
276 
277                 if(ps_dec->i4_degrade_type & 0x8)
278                     ps_dec->i4_mv_frac_mask = 0;
279             }
280         }
281         else
282             ps_dec->i4_degrade_pic_cnt = 0;
283     }
284 
285     {
286         dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
287         if(ps_dec->u1_sl_typ_5_9
288                         && ((ps_cur_slice->u1_slice_type == I_SLICE)
289                                         || (ps_cur_slice->u1_slice_type
290                                                         == SI_SLICE)))
291             ps_err->u1_cur_pic_type = PIC_TYPE_I;
292         else
293             ps_err->u1_cur_pic_type = PIC_TYPE_UNKNOWN;
294 
295         if(ps_err->u1_pic_aud_i == PIC_TYPE_I)
296         {
297             ps_err->u1_cur_pic_type = PIC_TYPE_I;
298             ps_err->u1_pic_aud_i = PIC_TYPE_UNKNOWN;
299         }
300 
301         if(ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)
302         {
303             if(ps_err->u1_err_flag)
304                 ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
305             ps_err->u1_err_flag = ACCEPT_ALL_PICS;
306         }
307     }
308 
309     if(ps_dec->u1_init_dec_flag && ps_dec->s_prev_seq_params.u1_eoseq_pending)
310     {
311         /* Reset the decoder picture buffers */
312         WORD32 j;
313         for(j = 0; j < MAX_DISP_BUFS_NEW; j++)
314         {
315 
316             ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
317                                   j,
318                                   BUF_MGR_REF);
319             ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
320                                   ps_dec->au1_pic_buf_id_mv_buf_id_map[j],
321                                   BUF_MGR_REF);
322             ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
323                                   j,
324                                   BUF_MGR_IO);
325         }
326 
327         /* reset the decoder structure parameters related to buffer handling */
328         ps_dec->u1_second_field = 0;
329         ps_dec->i4_cur_display_seq = 0;
330 
331         /********************************************************************/
332         /* indicate in the decoder output i4_status that some frames are being */
333         /* dropped, so that it resets timestamp and wait for a new sequence */
334         /********************************************************************/
335 
336         ps_dec->s_prev_seq_params.u1_eoseq_pending = 0;
337     }
338     ret = ih264d_init_pic(ps_dec, u2_frame_num, i4_poc, ps_pps);
339     if(ret != OK)
340         return ret;
341 
342     ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data;
343     ps_dec->pv_proc_tu_coeff_data  = ps_dec->pv_pic_tu_coeff_data;
344     ps_dec->ps_nmb_info = ps_dec->ps_frm_mb_info;
345     if(ps_dec->u1_separate_parse)
346     {
347         UWORD16 pic_wd;
348         UWORD16 pic_ht;
349         UWORD32 num_mbs;
350 
351         pic_wd = ps_dec->u2_pic_wd;
352         pic_ht = ps_dec->u2_pic_ht;
353         num_mbs = (pic_wd * pic_ht) >> 8;
354 
355         if(ps_dec->pu1_dec_mb_map)
356         {
357             memset((void *)ps_dec->pu1_dec_mb_map, 0, num_mbs);
358         }
359 
360         if(ps_dec->pu1_recon_mb_map)
361         {
362 
363             memset((void *)ps_dec->pu1_recon_mb_map, 0, num_mbs);
364         }
365 
366         if(ps_dec->pu2_slice_num_map)
367         {
368             memset((void *)ps_dec->pu2_slice_num_map, 0,
369                    (num_mbs * sizeof(UWORD16)));
370         }
371 
372     }
373 
374     ps_dec->ps_parse_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
375     ps_dec->ps_decode_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
376     ps_dec->ps_computebs_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
377     ps_dec->u2_cur_slice_num = 0;
378 
379     /* Initialize all the HP toolsets to zero */
380     ps_dec->s_high_profile.u1_scaling_present = 0;
381     ps_dec->s_high_profile.u1_transform8x8_present = 0;
382 
383     /* Get Next Free Picture */
384     if(1 == ps_dec->u4_share_disp_buf)
385     {
386         UWORD32 i;
387         /* Free any buffer that is in the queue to be freed */
388         for(i = 0; i < MAX_DISP_BUFS_NEW; i++)
389         {
390             if(0 == ps_dec->u4_disp_buf_to_be_freed[i])
391                 continue;
392             ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, i,
393             BUF_MGR_IO);
394             ps_dec->u4_disp_buf_to_be_freed[i] = 0;
395             ps_dec->u4_disp_buf_mapping[i] = 0;
396 
397         }
398     }
399     if(!(u1_field_pic_flag && 0 != ps_dec->u1_top_bottom_decoded)) //ps_dec->u1_second_field))
400     {
401         pic_buffer_t *ps_cur_pic;
402         WORD32 cur_pic_buf_id, cur_mv_buf_id;
403         col_mv_buf_t *ps_col_mv;
404         while(1)
405         {
406             ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free(
407                             (buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
408                             &cur_pic_buf_id);
409             if(ps_cur_pic == NULL)
410             {
411                 ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T;
412                 return ERROR_UNAVAIL_PICBUF_T;
413             }
414             if(0 == ps_dec->u4_disp_buf_mapping[cur_pic_buf_id])
415             {
416                 break;
417             }
418 
419         }
420         ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
421                                                                &cur_mv_buf_id);
422         if(ps_col_mv == NULL)
423         {
424             ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T;
425             return ERROR_UNAVAIL_MVBUF_T;
426         }
427 
428         ps_dec->ps_cur_pic = ps_cur_pic;
429         ps_dec->u1_pic_buf_id = cur_pic_buf_id;
430         ps_cur_pic->u4_ts = ps_dec->u4_ts;
431 
432 
433         ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id;
434         ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id;
435 
436         ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag;
437         ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv;
438         ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0;
439         if(ps_dec->u1_first_slice_in_stream)
440         {
441             /*make first entry of list0 point to cur pic,so that if first Islice is in error, ref pic struct will have valid entries*/
442             ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
443             *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][0]) = *ps_cur_pic;
444         }
445 
446         if(!ps_dec->ps_cur_pic)
447         {
448             WORD32 j;
449             H264_DEC_DEBUG_PRINT("------- Display Buffers Reset --------\n");
450             for(j = 0; j < MAX_DISP_BUFS_NEW; j++)
451             {
452 
453                 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
454                                       j,
455                                       BUF_MGR_REF);
456                 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
457                                       ps_dec->au1_pic_buf_id_mv_buf_id_map[j],
458                                       BUF_MGR_REF);
459                 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
460                                       j,
461                                       BUF_MGR_IO);
462             }
463 
464             ps_dec->i4_cur_display_seq = 0;
465             ps_dec->i4_prev_max_display_seq = 0;
466             ps_dec->i4_max_poc = 0;
467 
468             ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free(
469                             (buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
470                             &cur_pic_buf_id);
471             if(ps_cur_pic == NULL)
472             {
473                 ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T;
474                 return ERROR_UNAVAIL_PICBUF_T;
475             }
476 
477             ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
478                                                                    &cur_mv_buf_id);
479             if(ps_col_mv == NULL)
480             {
481                 ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T;
482                 return ERROR_UNAVAIL_MVBUF_T;
483             }
484 
485             ps_dec->ps_cur_pic = ps_cur_pic;
486             ps_dec->u1_pic_buf_id = cur_pic_buf_id;
487             ps_cur_pic->u4_ts = ps_dec->u4_ts;
488             ps_dec->apv_buf_id_pic_buf_map[cur_pic_buf_id] = (void *)ps_cur_pic;
489 
490             ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id;
491             ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id;
492 
493             ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag;
494             ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv;
495             ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0;
496 
497         }
498 
499         ps_dec->ps_cur_pic->u1_picturetype = u1_field_pic_flag;
500         ps_dec->ps_cur_pic->u4_pack_slc_typ = SKIP_NONE;
501         H264_DEC_DEBUG_PRINT("got a buffer\n");
502     }
503     else
504     {
505         H264_DEC_DEBUG_PRINT("did not get a buffer\n");
506     }
507 
508     ps_dec->u4_pic_buf_got = 1;
509 
510     ps_dec->ps_cur_pic->i4_poc = i4_poc;
511     ps_dec->ps_cur_pic->i4_frame_num = u2_frame_num;
512     ps_dec->ps_cur_pic->i4_pic_num = u2_frame_num;
513     ps_dec->ps_cur_pic->i4_top_field_order_cnt = ps_pps->i4_top_field_order_cnt;
514     ps_dec->ps_cur_pic->i4_bottom_field_order_cnt =
515                     ps_pps->i4_bottom_field_order_cnt;
516     ps_dec->ps_cur_pic->i4_avg_poc = ps_pps->i4_avg_poc;
517     ps_dec->ps_cur_pic->u4_time_stamp = ps_dec->u4_pts;
518 
519     ps_dec->s_cur_pic = *(ps_dec->ps_cur_pic);
520     if(u1_field_pic_flag && u1_bottom_field_flag)
521     {
522         WORD32 i4_temp_poc;
523         WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
524         /* Point to odd lines, since it's bottom field */
525         ps_dec->s_cur_pic.pu1_buf1 += ps_dec->s_cur_pic.u2_frm_wd_y;
526         ps_dec->s_cur_pic.pu1_buf2 += ps_dec->s_cur_pic.u2_frm_wd_uv;
527         ps_dec->s_cur_pic.pu1_buf3 += ps_dec->s_cur_pic.u2_frm_wd_uv;
528         ps_dec->s_cur_pic.ps_mv +=
529                         ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5);
530         ps_dec->s_cur_pic.pu1_col_zero_flag += ((ps_dec->u2_pic_ht
531                         * ps_dec->u2_pic_wd) >> 5);
532         ps_dec->ps_cur_pic->u1_picturetype |= BOT_FLD;
533         i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
534         i4_bot_field_order_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
535         i4_temp_poc = MIN(i4_top_field_order_poc,
536                                  i4_bot_field_order_poc);
537         ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
538     }
539 
540     ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag
541                     && (!u1_field_pic_flag);
542 
543     ps_dec->ps_cur_pic->u1_picturetype |= (ps_cur_slice->u1_mbaff_frame_flag
544                     << 2);
545 
546     ps_dec->ps_cur_mb_row = ps_dec->ps_nbr_mb_row; //[0];
547     //Increment by 2 ,so that left mb (mbaff decrements by 2)  will always be valid
548     ps_dec->ps_cur_mb_row += 2;
549     ps_dec->ps_top_mb_row = ps_dec->ps_nbr_mb_row;
550     ps_dec->ps_top_mb_row += ((ps_dec->u2_frm_wd_in_mbs + 2) << (1 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag));
551     //Increment by 2 ,so that left mb (mbaff decrements by 2)  will always be valid
552     ps_dec->ps_top_mb_row += 2;
553 
554     /* CHANGED CODE */
555     ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
556     ps_dec->ps_mv_top = ps_dec->ps_mv_top_p[0];
557     /* CHANGED CODE */
558     ps_dec->u1_mv_top_p = 0;
559     ps_dec->u1_mb_idx = 0;
560     /* CHANGED CODE */
561     ps_dec->ps_mv_left = ps_dec->s_cur_pic.ps_mv;
562     ps_dec->u2_total_mbs_coded = 0;
563     ps_dec->i4_submb_ofst = -(SUB_BLK_SIZE);
564     ps_dec->u4_pred_info_idx = 0;
565     ps_dec->u4_pred_info_pkd_idx = 0;
566     ps_dec->u4_dma_buf_idx = 0;
567     ps_dec->ps_mv = ps_dec->s_cur_pic.ps_mv;
568     ps_dec->ps_mv_bank_cur = ps_dec->s_cur_pic.ps_mv;
569     ps_dec->pu1_col_zero_flag = ps_dec->s_cur_pic.pu1_col_zero_flag;
570     ps_dec->ps_part = ps_dec->ps_parse_part_params;
571     ps_dec->i2_prev_slice_mbx = -1;
572     ps_dec->i2_prev_slice_mby = 0;
573     ps_dec->u2_mv_2mb[0] = 0;
574     ps_dec->u2_mv_2mb[1] = 0;
575     ps_dec->u1_last_pic_not_decoded = 0;
576 
577     ps_dec->u2_cur_slice_num_dec_thread = 0;
578     ps_dec->u2_cur_slice_num_bs = 0;
579     ps_dec->u4_intra_pred_line_ofst = 0;
580     ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line;
581     ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line;
582     ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line;
583 
584     ps_dec->pu1_cur_y_intra_pred_line_base = ps_dec->pu1_y_intra_pred_line;
585     ps_dec->pu1_cur_u_intra_pred_line_base = ps_dec->pu1_u_intra_pred_line;
586     ps_dec->pu1_cur_v_intra_pred_line_base = ps_dec->pu1_v_intra_pred_line;
587 
588 
589 
590 
591 
592     ps_dec->pu1_prev_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line
593                     + (ps_dec->u2_frm_wd_in_mbs * MB_SIZE);
594 
595     ps_dec->pu1_prev_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line
596                     + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE * YUV420SP_FACTOR;
597     ps_dec->pu1_prev_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line
598                     + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE;
599 
600     ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
601     /* Initialize The Function Pointer Depending Upon the Entropy and MbAff Flag */
602     {
603         if(ps_cur_slice->u1_mbaff_frame_flag)
604         {
605             ps_dec->pf_compute_bs = ih264d_compute_bs_mbaff;
606             ps_dec->pf_mvpred = ih264d_mvpred_mbaff;
607         }
608         else
609         {
610             ps_dec->pf_compute_bs = ih264d_compute_bs_non_mbaff;
611             ps_dec->u1_cur_mb_fld_dec_flag = ps_cur_slice->u1_field_pic_flag;
612         }
613     }
614     /* Set up the Parameter for DMA transfer */
615     {
616         UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
617 
618         UWORD8 u1_mbaff = ps_cur_slice->u1_mbaff_frame_flag;
619 
620         UWORD8 uc_lastmbs = (((ps_dec->u2_pic_wd) >> 4)
621                         % (ps_dec->u1_recon_mb_grp >> u1_mbaff));
622         UWORD16 ui16_lastmbs_widthY =
623                         (uc_lastmbs ? (uc_lastmbs << 4) : ((ps_dec->u1_recon_mb_grp
624                                         >> u1_mbaff) << 4));
625         UWORD16 ui16_lastmbs_widthUV =
626                         uc_lastmbs ? (uc_lastmbs << 3) : ((ps_dec->u1_recon_mb_grp
627                                         >> u1_mbaff) << 3);
628 
629         ps_dec->s_tran_addrecon.pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
630         ps_dec->s_tran_addrecon.pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
631         ps_dec->s_tran_addrecon.pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
632 
633         ps_dec->s_tran_addrecon.u2_frm_wd_y = ps_dec->u2_frm_wd_y
634                         << u1_field_pic_flag;
635         ps_dec->s_tran_addrecon.u2_frm_wd_uv = ps_dec->u2_frm_wd_uv
636                         << u1_field_pic_flag;
637 
638         if(u1_field_pic_flag)
639         {
640             ui16_lastmbs_widthY += ps_dec->u2_frm_wd_y;
641             ui16_lastmbs_widthUV += ps_dec->u2_frm_wd_uv;
642         }
643 
644         /* Normal Increment of Pointer */
645         ps_dec->s_tran_addrecon.u4_inc_y[0] = ((ps_dec->u1_recon_mb_grp << 4)
646                         >> u1_mbaff);
647         ps_dec->s_tran_addrecon.u4_inc_uv[0] = ((ps_dec->u1_recon_mb_grp << 4)
648                         >> u1_mbaff);
649 
650         /* End of Row Increment */
651         ps_dec->s_tran_addrecon.u4_inc_y[1] = (ui16_lastmbs_widthY
652                         + (PAD_LEN_Y_H << 1)
653                         + ps_dec->s_tran_addrecon.u2_frm_wd_y
654                                         * ((15 << u1_mbaff) + u1_mbaff));
655         ps_dec->s_tran_addrecon.u4_inc_uv[1] = (ui16_lastmbs_widthUV
656                         + (PAD_LEN_UV_H << 2)
657                         + ps_dec->s_tran_addrecon.u2_frm_wd_uv
658                                         * ((15 << u1_mbaff) + u1_mbaff));
659 
660         /* Assign picture numbers to each frame/field  */
661         /* only once per picture.                      */
662         ih264d_assign_pic_num(ps_dec);
663         ps_dec->s_tran_addrecon.u2_mv_top_left_inc = (ps_dec->u1_recon_mb_grp
664                         << 2) - 1 - (u1_mbaff << 2);
665         ps_dec->s_tran_addrecon.u2_mv_left_inc = ((ps_dec->u1_recon_mb_grp
666                         >> u1_mbaff) - 1) << (4 + u1_mbaff);
667     }
668     /**********************************************************************/
669     /* High profile related initialization at pictrue level               */
670     /**********************************************************************/
671     if(ps_seq->u1_profile_idc == HIGH_PROFILE_IDC)
672     {
673         if((ps_seq->i4_seq_scaling_matrix_present_flag)
674                         || (ps_pps->i4_pic_scaling_matrix_present_flag))
675         {
676             ih264d_form_scaling_matrix_picture(ps_seq, ps_pps, ps_dec);
677             ps_dec->s_high_profile.u1_scaling_present = 1;
678         }
679         else
680         {
681             ih264d_form_default_scaling_matrix(ps_dec);
682         }
683 
684         if(ps_pps->i4_transform_8x8_mode_flag)
685         {
686             ps_dec->s_high_profile.u1_transform8x8_present = 1;
687         }
688     }
689     else
690     {
691         ih264d_form_default_scaling_matrix(ps_dec);
692     }
693 
694     /* required while reading the transform_size_8x8 u4_flag */
695     ps_dec->s_high_profile.u1_direct_8x8_inference_flag =
696                     ps_seq->u1_direct_8x8_inference_flag;
697     ps_dec->s_high_profile.s_cavlc_ctxt = ps_dec->s_cavlc_ctxt;
698 
699     ps_dec->i1_recon_in_thread3_flag = 1;
700     ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_addrecon;
701     if(ps_dec->u1_separate_parse)
702     {
703         memcpy(&ps_dec->s_tran_addrecon_parse, &ps_dec->s_tran_addrecon,
704                sizeof(tfr_ctxt_t));
705         if(ps_dec->u4_num_cores >= 3 && ps_dec->i1_recon_in_thread3_flag)
706         {
707             memcpy(&ps_dec->s_tran_iprecon, &ps_dec->s_tran_addrecon,
708                    sizeof(tfr_ctxt_t));
709             ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_iprecon;
710         }
711     }
712 
713 
714     ih264d_init_deblk_tfr_ctxt(ps_dec,&(ps_dec->s_pad_mgr), &(ps_dec->s_tran_addrecon),
715                                ps_dec->u2_frm_wd_in_mbs, 0);
716 
717     ps_dec->ps_cur_deblk_mb = ps_dec->ps_deblk_pic;
718     ps_dec->u4_cur_deblk_mb_num = 0;
719 
720     ps_dec->u4_deblk_mb_x = 0;
721     ps_dec->u4_deblk_mb_y = 0;
722     ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
723 
724     H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
725     return OK;
726 }
727 
728 /*!
729  **************************************************************************
730  * \if Function name :  ih264d_deblock_display \endif
731  *
732  * \brief            :  The function callls the deblocking routine and manages
733  :  the Recon buffers and displays .
734  * \return           :  Nothing
735  *
736  **************************************************************************
737  */
ih264d_end_of_pic_dispbuf_mgr(dec_struct_t * ps_dec)738 WORD32 ih264d_end_of_pic_dispbuf_mgr(dec_struct_t * ps_dec)
739 {
740     dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
741     UWORD8 u1_num_of_users = 0;
742     WORD32 ret;
743 
744     H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
745     if(1)
746     {
747 
748         {
749             ih264d_delete_nonref_nondisplay_pics(ps_dec->ps_dpb_mgr);
750             if(ps_cur_slice->u1_mmco_equalto5
751                             || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL))
752             {
753                 ps_dec->ps_cur_pic->i4_poc = 0;
754                 if(ps_dec->u2_total_mbs_coded
755                                 == (ps_dec->ps_cur_sps->u2_max_mb_addr + 1))
756                     ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
757                 ih264d_release_display_bufs(ps_dec);
758             }
759             if(IVD_DECODE_FRAME_OUT != ps_dec->e_frm_out_mode)
760             {
761                 ret = ih264d_assign_display_seq(ps_dec);
762                 if(ret != OK)
763                     return ret;
764             }
765         }
766 
767         if(ps_cur_slice->u1_nal_ref_idc)
768         {
769             /* Mark pic buf as needed for reference */
770             ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
771                                      ps_dec->u1_pic_buf_id,
772                                      BUF_MGR_REF);
773             /* Mark mv buf as needed for reference */
774             ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
775                                      ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
776                                      BUF_MGR_REF);
777             ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 1;
778         }
779 
780         /* 420 consumer */
781         /* Increment the number of users by 1 for display based upon */
782         /*the SEEK KEY FRAME control sent to decoder                 */
783         if(((0 == ps_dec->u1_last_pic_not_decoded)
784                         && (0
785                                         == (ps_dec->ps_cur_pic->u4_pack_slc_typ
786                                                         & ps_dec->u4_skip_frm_mask)))
787                         || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL))
788         {
789             /* Mark pic buf as needed for display */
790             ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
791                                      ps_dec->u1_pic_buf_id,
792                                      BUF_MGR_IO);
793 
794         }
795 
796         if(!ps_cur_slice->u1_field_pic_flag
797                         || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY)
798                                         != ps_dec->u1_top_bottom_decoded))
799         {
800             pic_buffer_t *ps_cur_pic = ps_dec->ps_cur_pic;
801             ps_cur_pic->u2_disp_width = ps_dec->u2_disp_width;
802             ps_cur_pic->u2_disp_height = ps_dec->u2_disp_height >> 1;
803 
804             ps_cur_pic->u2_crop_offset_y = ps_dec->u2_crop_offset_y;
805             ps_cur_pic->u2_crop_offset_uv = ps_dec->u2_crop_offset_uv;
806             ps_cur_pic->u1_pic_type = 0;
807 
808             ret = ih264d_insert_pic_in_display_list(
809                             ps_dec->ps_dpb_mgr,
810                             ps_dec->u1_pic_buf_id,
811                             ps_dec->i4_prev_max_display_seq
812                                             + ps_dec->ps_cur_pic->i4_poc,
813                             ps_dec->ps_cur_pic->i4_frame_num);
814             if(ret != OK)
815                 return ret;
816 
817             {
818                 ivd_video_decode_op_t * ps_dec_output =
819                                 (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
820 
821                 ps_dec_output->u4_frame_decoded_flag = 1;
822             }
823             if(ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] == 0)
824             {
825                 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
826                                       ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
827                                       BUF_MGR_REF);
828                 ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 0;
829 
830             }
831         }
832         else
833         {
834             H264_DEC_DEBUG_PRINT("pic not inserted display %d %d\n",
835                                  ps_cur_slice->u1_field_pic_flag,
836                                  ps_dec->u1_second_field);
837         }
838 
839         if(!ps_cur_slice->u1_field_pic_flag
840                         || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY)
841                                         == ps_dec->u1_top_bottom_decoded))
842         {
843             if(IVD_DECODE_FRAME_OUT == ps_dec->e_frm_out_mode)
844             {
845                 ret = ih264d_assign_display_seq(ps_dec);
846                 if(ret != OK)
847                     return ret;
848             }
849         }
850     }
851 
852     H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
853 
854     return OK;
855 }
856 
ih264d_err_pic_dispbuf_mgr(dec_struct_t * ps_dec)857 void ih264d_err_pic_dispbuf_mgr(dec_struct_t *ps_dec)
858 {
859     dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
860     ivd_video_decode_op_t * ps_dec_output =
861                     (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
862 
863     ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
864                           ps_dec->u1_pic_buf_id,
865                           BUF_MGR_REF);
866     ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
867                           ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
868                           BUF_MGR_REF);
869     ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
870                           ps_dec->u1_pic_buf_id,
871                           BUF_MGR_IO);
872 }
873 
ih264d_deblock_picture(void * ptr)874 void ih264d_deblock_picture(void *ptr)
875 {
876     dec_struct_t *ps_dec = (dec_struct_t *)ptr;
877 
878     {
879         /*Deblock picture only if all the mb's in the frame have been decoded*/
880         if(ps_dec->u1_pic_decode_done == 1)
881         {
882             if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag
883                             || ps_dec->ps_cur_slice->u1_field_pic_flag)
884             {
885                 ps_dec->p_DeblockPicture[ps_dec->ps_cur_slice->u1_mbaff_frame_flag](
886                                 ps_dec);
887             }
888             else
889 
890             {
891 
892                 ih264d_deblock_picture_progressive(ps_dec);
893             }
894 
895         }
896     }
897 
898 }
899 
900 /*!
901  **************************************************************************
902  * \if Function name :  ih264d_deblock_display \endif
903  *
904  * \brief            :  The function callls the deblocking routine and manages
905  :  the Recon buffers and displays .
906  * \return           :  Nothing
907  *
908  **************************************************************************
909  */
ih264d_deblock_display(dec_struct_t * ps_dec)910 WORD32 ih264d_deblock_display(dec_struct_t *ps_dec)
911 {
912     WORD32 ret;
913     /* Call deblocking */
914     ih264d_deblock_picture(ps_dec);
915 
916     ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec);
917     if(ret != OK)
918         return ret;
919 
920     return OK;
921 }
922 
923 /*
924  *!
925  **************************************************************************
926  * \if Function name : EndofPoc \endif
927  *
928  * \brief
929  *    EndofPoc Processing
930  *
931  * \return
932  *    0 on Success and Error code otherwise
933  **************************************************************************
934  */
935 
ih264d_end_of_pic(dec_struct_t * ps_dec,UWORD8 u1_is_idr_slice,UWORD16 u2_frame_num)936 WORD32 ih264d_end_of_pic(dec_struct_t *ps_dec,
937                        UWORD8 u1_is_idr_slice,
938                        UWORD16 u2_frame_num)
939 {
940     dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
941     WORD32 ret;
942 
943     ps_dec->u2_mbx = 0xffff;
944     ps_dec->u2_mby = 0;
945     {
946         dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
947         if(ps_err->u1_err_flag & REJECT_CUR_PIC)
948         {
949             ih264d_err_pic_dispbuf_mgr(ps_dec);
950             return ERROR_NEW_FRAME_EXPECTED;
951         }
952     }
953 
954     H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
955     ret = ih264d_end_of_pic_processing(ps_dec);
956     if(ret != OK)
957         return ret;
958     ps_dec->u2_total_mbs_coded = 0;
959     /*--------------------------------------------------------------------*/
960     /* ih264d_decode_pic_order_cnt - calculate the Pic Order Cnt                    */
961     /* Needed to detect end of picture                                    */
962     /*--------------------------------------------------------------------*/
963     {
964         pocstruct_t *ps_prev_poc = &ps_dec->s_prev_pic_poc;
965         pocstruct_t *ps_cur_poc = &ps_dec->s_cur_pic_poc;
966         if((0 == u1_is_idr_slice) && ps_cur_slice->u1_nal_ref_idc)
967             ps_dec->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num;
968 
969         if(u1_is_idr_slice || ps_cur_slice->u1_mmco_equalto5)
970             ps_dec->u2_prev_ref_frame_num = 0;
971 
972         if(ps_dec->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag)
973         {
974             ret = ih264d_decode_gaps_in_frame_num(ps_dec, u2_frame_num);
975             if(ret != OK)
976                 return ret;
977         }
978 
979         ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
980         ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num;
981         ps_prev_poc->u1_mmco_equalto5 = ps_cur_slice->u1_mmco_equalto5;
982         if(ps_cur_slice->u1_nal_ref_idc)
983         {
984             ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
985             ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
986             ps_prev_poc->i4_delta_pic_order_cnt_bottom =
987                             ps_cur_poc->i4_delta_pic_order_cnt_bottom;
988             ps_prev_poc->i4_delta_pic_order_cnt[0] =
989                             ps_cur_poc->i4_delta_pic_order_cnt[0];
990             ps_prev_poc->i4_delta_pic_order_cnt[1] =
991                             ps_cur_poc->i4_delta_pic_order_cnt[1];
992             ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field;
993         }
994     }
995 
996     H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
997 
998     return OK;
999 }
1000 
1001 /*!
1002  **************************************************************************
1003  * \if Function name : DecodeSlice \endif
1004  *
1005  * \brief
1006  *    Parses a slice
1007  *
1008  * \return
1009  *    0 on Success and Error code otherwise
1010  **************************************************************************
1011  */
1012 
ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice,UWORD8 u1_nal_ref_idc,dec_struct_t * ps_dec)1013 WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice,
1014                                  UWORD8 u1_nal_ref_idc,
1015                                  dec_struct_t *ps_dec /* Decoder parameters */
1016                                  )
1017 {
1018     dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
1019     dec_pic_params_t *ps_pps;
1020     dec_seq_params_t *ps_seq;
1021     dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
1022     pocstruct_t s_tmp_poc;
1023     WORD32 i_delta_poc[2];
1024     WORD32 i4_poc = 0;
1025     UWORD16 u2_first_mb_in_slice, u2_frame_num;
1026     UWORD8 u1_field_pic_flag, u1_redundant_pic_cnt = 0, u1_slice_type;
1027     UWORD32 u4_idr_pic_id = 0;
1028     UWORD8 u1_bottom_field_flag, u1_pic_order_cnt_type;
1029 
1030     UWORD8 u1_nal_unit_type;
1031     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1032     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1033     WORD8 i1_is_end_of_poc;
1034 
1035     WORD32 ret, end_of_frame;
1036     WORD32 prev_slice_err, num_mb_skipped;
1037     UWORD8 u1_mbaff;
1038     pocstruct_t *ps_cur_poc;
1039 
1040     UWORD32 u4_temp;
1041     WORD32 i_temp;
1042     UWORD32 u4_call_end_of_pic = 0;
1043 
1044     /* read FirstMbInSlice  and slice type*/
1045     ps_dec->ps_dpb_cmds->u1_dpb_commands_read_slc = 0;
1046     u2_first_mb_in_slice = ih264d_uev(pu4_bitstrm_ofst,
1047                                      pu4_bitstrm_buf);
1048     if(u2_first_mb_in_slice
1049                     > (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs))
1050     {
1051 
1052         return ERROR_CORRUPTED_SLICE;
1053     }
1054 
1055     /*we currently don not support ASO*/
1056     if(((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag)
1057                     <= ps_dec->u2_cur_mb_addr) && (ps_dec->u2_cur_mb_addr != 0)
1058                     && (ps_dec->u4_first_slice_in_pic != 0))
1059     {
1060         return ERROR_CORRUPTED_SLICE;
1061     }
1062 
1063     COPYTHECONTEXT("SH: first_mb_in_slice",u2_first_mb_in_slice);
1064 
1065     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1066 
1067     if(u4_temp > 9)
1068         return ERROR_INV_SLC_TYPE_T;
1069 
1070     u1_slice_type = u4_temp;
1071     COPYTHECONTEXT("SH: slice_type",(u1_slice_type));
1072     ps_dec->u1_sl_typ_5_9 = 0;
1073     /* Find Out the Slice Type is 5 to 9 or not then Set the Flag   */
1074     /* u1_sl_typ_5_9 = 1 .Which tells that all the slices in the Pic*/
1075     /* will be of same type of current                            */
1076     if(u1_slice_type > 4)
1077     {
1078         u1_slice_type -= 5;
1079         ps_dec->u1_sl_typ_5_9 = 1;
1080     }
1081 
1082     {
1083         UWORD32 skip;
1084 
1085         if((ps_dec->i4_app_skip_mode == IVD_SKIP_PB)
1086                         || (ps_dec->i4_dec_skip_mode == IVD_SKIP_PB))
1087         {
1088             UWORD32 u4_bit_stream_offset = 0;
1089 
1090             if(ps_dec->u1_nal_unit_type == IDR_SLICE_NAL)
1091             {
1092                 skip = 0;
1093 
1094                 ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE;
1095             }
1096             else if((I_SLICE == u1_slice_type)
1097                             && (1 >= ps_dec->ps_cur_sps->u1_num_ref_frames))
1098             {
1099                 skip = 0;
1100 
1101                 ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE;
1102             }
1103             else
1104             {
1105                 skip = 1;
1106             }
1107 
1108             /* If one frame worth of data is already skipped, do not skip the next one */
1109             if((0 == u2_first_mb_in_slice) && (1 == ps_dec->u4_prev_nal_skipped))
1110             {
1111                 skip = 0;
1112             }
1113 
1114             if(skip)
1115             {
1116                 ps_dec->u4_prev_nal_skipped = 1;
1117                 ps_dec->i4_dec_skip_mode = IVD_SKIP_PB;
1118                 return 0;
1119             }
1120             else
1121             {
1122                 /* If the previous NAL was skipped, then
1123                  do not process that buffer in this call.
1124                  Return to app and process it in the next call.
1125                  This is necessary to handle cases where I/IDR is not complete in
1126                  the current buffer and application intends to fill the remaining part of the bitstream
1127                  later. This ensures we process only frame worth of data in every call */
1128                 if(1 == ps_dec->u4_prev_nal_skipped)
1129                 {
1130                     ps_dec->u4_return_to_app = 1;
1131                     return 0;
1132                 }
1133             }
1134         }
1135 
1136     }
1137 
1138     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1139     if(u4_temp & MASK_ERR_PIC_SET_ID)
1140         return ERROR_INV_SPS_PPS_T;
1141     /* discard slice if pic param is invalid */
1142     COPYTHECONTEXT("SH: pic_parameter_set_id", u4_temp);
1143     ps_pps = &ps_dec->ps_pps[u4_temp];
1144     if(FALSE == ps_pps->u1_is_valid)
1145     {
1146         return ERROR_INV_SPS_PPS_T;
1147     }
1148     ps_seq = ps_pps->ps_sps;
1149     if(!ps_seq)
1150         return ERROR_INV_SPS_PPS_T;
1151     if(FALSE == ps_seq->u1_is_valid)
1152         return ERROR_INV_SPS_PPS_T;
1153 
1154     /* Get the frame num */
1155     u2_frame_num = ih264d_get_bits_h264(ps_bitstrm,
1156                                          ps_seq->u1_bits_in_frm_num);
1157 //    H264_DEC_DEBUG_PRINT("FRAME %d First MB in slice: %d\n", u2_frame_num, u2_first_mb_in_slice);
1158 
1159     COPYTHECONTEXT("SH: frame_num", u2_frame_num);
1160 //    H264_DEC_DEBUG_PRINT("Second field: %d frame num: %d prv_frame_num: %d \n", ps_dec->u1_second_field, u2_frame_num, ps_dec->u2_prv_frame_num);
1161 
1162     /* Get the field related flags  */
1163     if(!ps_seq->u1_frame_mbs_only_flag)
1164     {
1165 
1166         u1_field_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
1167         COPYTHECONTEXT("SH: field_pic_flag", u1_field_pic_flag);
1168         u1_bottom_field_flag = 0;
1169 
1170         if(u1_field_pic_flag)
1171         {
1172             ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
1173             u1_bottom_field_flag = ih264d_get_bit_h264(ps_bitstrm);
1174             COPYTHECONTEXT("SH: bottom_field_flag", u1_bottom_field_flag);
1175 
1176         }
1177         else
1178         {
1179             ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
1180         }
1181     }
1182     else
1183     {
1184         u1_field_pic_flag = 0;
1185         u1_bottom_field_flag = 0;
1186 
1187         ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
1188     }
1189 
1190     u1_nal_unit_type = SLICE_NAL;
1191     if(u1_is_idr_slice)
1192     {
1193         if(0 == u1_field_pic_flag)
1194         {
1195             ps_dec->u1_top_bottom_decoded = TOP_FIELD_ONLY | BOT_FIELD_ONLY;
1196         }
1197         u1_nal_unit_type = IDR_SLICE_NAL;
1198         u4_idr_pic_id = ih264d_uev(pu4_bitstrm_ofst,
1199                                    pu4_bitstrm_buf);
1200         if(u4_idr_pic_id > 65535)
1201             return ERROR_INV_SPS_PPS_T;
1202         COPYTHECONTEXT("SH:  ", u4_idr_pic_id);
1203     }
1204 
1205     /* read delta pic order count information*/
1206     i_delta_poc[0] = i_delta_poc[1] = 0;
1207     s_tmp_poc.i4_pic_order_cnt_lsb = 0;
1208     s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
1209     u1_pic_order_cnt_type = ps_seq->u1_pic_order_cnt_type;
1210     if(u1_pic_order_cnt_type == 0)
1211     {
1212         i_temp = ih264d_get_bits_h264(
1213                         ps_bitstrm,
1214                         ps_seq->u1_log2_max_pic_order_cnt_lsb_minus);
1215         if(i_temp < 0 || i_temp >= ps_seq->i4_max_pic_order_cntLsb)
1216             return ERROR_INV_SPS_PPS_T;
1217         s_tmp_poc.i4_pic_order_cnt_lsb = i_temp;
1218         COPYTHECONTEXT("SH: pic_order_cnt_lsb", s_tmp_poc.i4_pic_order_cnt_lsb);
1219 
1220         if((ps_pps->u1_pic_order_present_flag == 1) && (!u1_field_pic_flag))
1221         {
1222             s_tmp_poc.i4_delta_pic_order_cnt_bottom = ih264d_sev(
1223                             pu4_bitstrm_ofst, pu4_bitstrm_buf);
1224             //if(s_tmp_poc.i4_delta_pic_order_cnt_bottom > ps_seq->i4_max_pic_order_cntLsb)
1225             COPYTHECONTEXT("SH: delta_pic_order_cnt_bottom",
1226                             s_tmp_poc.i4_delta_pic_order_cnt_bottom);
1227         }
1228     }
1229 
1230     s_tmp_poc.i4_delta_pic_order_cnt[0] = 0;
1231     s_tmp_poc.i4_delta_pic_order_cnt[1] = 0;
1232     if(u1_pic_order_cnt_type == 1
1233                     && (!ps_seq->u1_delta_pic_order_always_zero_flag))
1234     {
1235         s_tmp_poc.i4_delta_pic_order_cnt[0] = ih264d_sev(pu4_bitstrm_ofst,
1236                                                          pu4_bitstrm_buf);
1237         COPYTHECONTEXT("SH: delta_pic_order_cnt[0]",
1238                         s_tmp_poc.i4_delta_pic_order_cnt[0]);
1239 
1240         if(ps_pps->u1_pic_order_present_flag && !u1_field_pic_flag)
1241         {
1242             s_tmp_poc.i4_delta_pic_order_cnt[1] = ih264d_sev(
1243                             pu4_bitstrm_ofst, pu4_bitstrm_buf);
1244             COPYTHECONTEXT("SH: delta_pic_order_cnt[1]",
1245                             s_tmp_poc.i4_delta_pic_order_cnt[1]);
1246         }
1247     }
1248 
1249     if(ps_pps->u1_redundant_pic_cnt_present_flag)
1250     {
1251         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1252         if(u4_temp > MAX_REDUNDANT_PIC_CNT)
1253             return ERROR_INV_SPS_PPS_T;
1254         u1_redundant_pic_cnt = u4_temp;
1255         COPYTHECONTEXT("SH: redundant_pic_cnt", u1_redundant_pic_cnt);
1256     }
1257 
1258     /*--------------------------------------------------------------------*/
1259     /* Check if the slice is part of new picture                          */
1260     /*--------------------------------------------------------------------*/
1261     i1_is_end_of_poc = 0;
1262     if(!ps_dec->u1_first_slice_in_stream)
1263     {
1264         i1_is_end_of_poc = ih264d_is_end_of_pic(u2_frame_num, u1_nal_ref_idc,
1265                                             &s_tmp_poc, &ps_dec->s_cur_pic_poc,
1266                                             ps_cur_slice, u1_pic_order_cnt_type,
1267                                             u1_nal_unit_type, u4_idr_pic_id,
1268                                             u1_field_pic_flag,
1269                                             u1_bottom_field_flag);
1270 
1271         /* since we support only Full frame decode, every new process should
1272          * process a new pic
1273          */
1274         if((ps_dec->u4_first_slice_in_pic == 2) && (i1_is_end_of_poc == 0))
1275         {
1276             /* if it is the first slice is process call ,it should be a new frame. If it is not
1277              * reject current pic and dont add it to dpb
1278              */
1279             ps_dec->ps_dec_err_status->u1_err_flag |= REJECT_CUR_PIC;
1280             i1_is_end_of_poc = 1;
1281         }
1282         else
1283         {
1284             /* reset REJECT_CUR_PIC */
1285             ps_dec->ps_dec_err_status->u1_err_flag &= MASK_REJECT_CUR_PIC;
1286         }
1287     }
1288 
1289     /*--------------------------------------------------------------------*/
1290     /* Check for error in slice and parse the missing/corrupted MB's      */
1291     /* as skip-MB's in an inserted P-slice                                */
1292     /*--------------------------------------------------------------------*/
1293     u1_mbaff = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag);
1294     prev_slice_err = 0;
1295 
1296     if(i1_is_end_of_poc || ps_dec->u1_first_slice_in_stream)
1297     {
1298         if(u2_frame_num != ps_dec->u2_prv_frame_num
1299                && ps_dec->u1_top_bottom_decoded != 0
1300                    && ps_dec->u1_top_bottom_decoded
1301                        != (TOP_FIELD_ONLY | BOT_FIELD_ONLY))
1302         {
1303             ps_dec->u1_dangling_field = 1;
1304             if(ps_dec->u4_first_slice_in_pic)
1305             {
1306                 // first slice - dangling field
1307                 prev_slice_err = 1;
1308             }
1309             else
1310             {
1311                 // last slice - dangling field
1312                 prev_slice_err = 2;
1313             }
1314 
1315             if(ps_dec->u1_top_bottom_decoded ==TOP_FIELD_ONLY)
1316                 ps_cur_slice->u1_bottom_field_flag = 1;
1317             else
1318                 ps_cur_slice->u1_bottom_field_flag = 0;
1319 
1320             num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1321                     - ps_dec->u2_total_mbs_coded;
1322             ps_cur_poc = &ps_dec->s_cur_pic_poc;
1323 
1324             u1_is_idr_slice = ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL;
1325         }
1326         else if(ps_dec->u4_first_slice_in_pic == 2)
1327         {
1328             if(u2_first_mb_in_slice > 0)
1329             {
1330                 // first slice - missing/header corruption
1331                 prev_slice_err = 1;
1332                 num_mb_skipped = u2_first_mb_in_slice << u1_mbaff;
1333                 ps_cur_poc = &s_tmp_poc;
1334 
1335                 // initializing slice parameters
1336                 ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
1337                 ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
1338                 ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1339                 ps_cur_slice->i4_pic_order_cnt_lsb =
1340                         s_tmp_poc.i4_pic_order_cnt_lsb;
1341                 ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
1342                 ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
1343                 ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
1344                 ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
1345             }
1346         }
1347         else
1348         {
1349 
1350             if(ps_dec->u4_first_slice_in_pic)
1351             {
1352                 /* if valid slice header is not decoded do start of pic processing
1353                  * since in the current process call, frame num is not updated in the slice structure yet
1354                  * ih264d_is_end_of_pic is checked with valid frame num of previous process call,
1355                  * although i1_is_end_of_poc is set there could be  more slices in the frame,
1356                  * so conceal only till cur slice */
1357                 prev_slice_err = 1;
1358                 num_mb_skipped = u2_first_mb_in_slice << u1_mbaff;
1359             }
1360             else
1361             {
1362                 /* since i1_is_end_of_poc is set ,means new frame num is encountered. so conceal the current frame
1363                  * completely */
1364                 prev_slice_err = 2;
1365                 num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1366                         - ps_dec->u2_total_mbs_coded;
1367             }
1368             ps_cur_poc = &s_tmp_poc;
1369         }
1370     }
1371     else
1372     {
1373         if((u2_first_mb_in_slice << u1_mbaff) > ps_dec->u2_total_mbs_coded)
1374         {
1375             // previous slice - missing/corruption
1376             prev_slice_err = 2;
1377             num_mb_skipped = (u2_first_mb_in_slice << u1_mbaff)
1378                     - ps_dec->u2_total_mbs_coded;
1379             ps_cur_poc = &s_tmp_poc;
1380         }
1381         else if((u2_first_mb_in_slice << u1_mbaff) < ps_dec->u2_total_mbs_coded)
1382         {
1383             return ERROR_CORRUPTED_SLICE;
1384         }
1385     }
1386 
1387     if(prev_slice_err)
1388     {
1389         ret = ih264d_mark_err_slice_skip(ps_dec, num_mb_skipped, u1_is_idr_slice, u2_frame_num, ps_cur_poc, prev_slice_err);
1390 
1391         if(ps_dec->u1_dangling_field == 1)
1392         {
1393             ps_dec->u1_second_field = 1 - ps_dec->u1_second_field;
1394             ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1395             ps_dec->u2_prv_frame_num = u2_frame_num;
1396             ps_dec->u1_first_slice_in_stream = 0;
1397             return ERROR_DANGLING_FIELD_IN_PIC;
1398         }
1399 
1400         if(prev_slice_err == 2)
1401         {
1402             ps_dec->u1_first_slice_in_stream = 0;
1403             return ERROR_INCOMPLETE_FRAME;
1404         }
1405 
1406         if(ps_dec->u2_total_mbs_coded
1407                 >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1408         {
1409             /* return if all MBs in frame are parsed*/
1410             ps_dec->u1_first_slice_in_stream = 0;
1411             return ERROR_IN_LAST_SLICE_OF_PIC;
1412         }
1413 
1414         if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
1415         {
1416             ih264d_err_pic_dispbuf_mgr(ps_dec);
1417             return ERROR_NEW_FRAME_EXPECTED;
1418         }
1419 
1420         if(ret != OK)
1421             return ret;
1422 
1423         i1_is_end_of_poc = 0;
1424     }
1425 
1426     if (ps_dec->u4_first_slice_in_pic == 0)
1427     {
1428         ps_dec->ps_parse_cur_slice++;
1429         ps_dec->u2_cur_slice_num++;
1430     }
1431 
1432     ps_dec->u1_slice_header_done = 0;
1433 
1434     /*--------------------------------------------------------------------*/
1435     /* If the slice is part of new picture, do End of Pic processing.     */
1436     /*--------------------------------------------------------------------*/
1437     if(!ps_dec->u1_first_slice_in_stream)
1438     {
1439         UWORD8 uc_mbs_exceed = 0;
1440 
1441         if(ps_dec->u2_total_mbs_coded
1442                         == (ps_dec->ps_cur_sps->u2_max_mb_addr + 1))
1443         {
1444             /*u2_total_mbs_coded is forced  to u2_max_mb_addr+ 1 at the end of decode ,so
1445              ,if it is first slice in pic dont consider u2_total_mbs_coded to detect new picture */
1446             if(ps_dec->u4_first_slice_in_pic == 0)
1447                 uc_mbs_exceed = 1;
1448         }
1449 
1450         if(i1_is_end_of_poc || uc_mbs_exceed)
1451         {
1452 
1453             if(1 == ps_dec->u1_last_pic_not_decoded)
1454             {
1455                 ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec);
1456 
1457                 if(ret != OK)
1458                     return ret;
1459 
1460                 ret = ih264d_end_of_pic(ps_dec, u1_is_idr_slice, u2_frame_num);
1461                 if(ret != OK)
1462                     return ret;
1463 #if WIN32
1464                 H264_DEC_DEBUG_PRINT(" ------ PIC SKIPPED ------\n");
1465 #endif
1466                 return RET_LAST_SKIP;
1467             }
1468             else
1469             {
1470                 ret = ih264d_end_of_pic(ps_dec, u1_is_idr_slice, u2_frame_num);
1471                 if(ret != OK)
1472                     return ret;
1473             }
1474 
1475         }
1476     }
1477 
1478     if(u1_field_pic_flag)
1479     {
1480         ps_dec->u2_prv_frame_num = u2_frame_num;
1481     }
1482 
1483     if(ps_cur_slice->u1_mmco_equalto5)
1484     {
1485         WORD32 i4_temp_poc;
1486         WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
1487 
1488         if(!ps_cur_slice->u1_field_pic_flag) // or a complementary field pair
1489         {
1490             i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1491             i4_bot_field_order_poc =
1492                             ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1493             i4_temp_poc = MIN(i4_top_field_order_poc,
1494                                      i4_bot_field_order_poc);
1495         }
1496         else if(!ps_cur_slice->u1_bottom_field_flag)
1497             i4_temp_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1498         else
1499             i4_temp_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1500 
1501         ps_dec->ps_cur_pic->i4_top_field_order_cnt = i4_temp_poc
1502                         - ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1503         ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = i4_temp_poc
1504                         - ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1505         ps_dec->ps_cur_pic->i4_poc = i4_temp_poc;
1506         ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
1507     }
1508     if(ps_dec->u4_first_slice_in_pic == 2)
1509     {
1510         ret = ih264d_decode_pic_order_cnt(u1_is_idr_slice, u2_frame_num,
1511                                           &ps_dec->s_prev_pic_poc,
1512                                           &s_tmp_poc, ps_cur_slice, ps_pps,
1513                                           u1_nal_ref_idc,
1514                                           u1_bottom_field_flag,
1515                                           u1_field_pic_flag, &i4_poc);
1516         if(ret != OK)
1517             return ret;
1518         /* Display seq no calculations */
1519         if(i4_poc >= ps_dec->i4_max_poc)
1520             ps_dec->i4_max_poc = i4_poc;
1521         /* IDR Picture or POC wrap around */
1522         if(i4_poc == 0)
1523         {
1524             ps_dec->i4_prev_max_display_seq = ps_dec->i4_prev_max_display_seq
1525                             + ps_dec->i4_max_poc
1526                             + ps_dec->u1_max_dec_frame_buffering + 1;
1527             ps_dec->i4_max_poc = 0;
1528         }
1529     }
1530 
1531     /*--------------------------------------------------------------------*/
1532     /* Copy the values read from the bitstream to the slice header and then*/
1533     /* If the slice is first slice in picture, then do Start of Picture   */
1534     /* processing.                                                        */
1535     /*--------------------------------------------------------------------*/
1536     ps_cur_slice->i4_delta_pic_order_cnt[0] = i_delta_poc[0];
1537     ps_cur_slice->i4_delta_pic_order_cnt[1] = i_delta_poc[1];
1538     ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
1539     ps_cur_slice->u2_first_mb_in_slice = u2_first_mb_in_slice;
1540     ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
1541     ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1542     ps_cur_slice->u1_slice_type = u1_slice_type;
1543     ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb;
1544 
1545     ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
1546     ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
1547     ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
1548     ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
1549 
1550     if(ps_seq->u1_frame_mbs_only_flag)
1551         ps_cur_slice->u1_direct_8x8_inference_flag =
1552                         ps_seq->u1_direct_8x8_inference_flag;
1553     else
1554         ps_cur_slice->u1_direct_8x8_inference_flag = 1;
1555 
1556     if(u1_slice_type == B_SLICE)
1557     {
1558         ps_cur_slice->u1_direct_spatial_mv_pred_flag = ih264d_get_bit_h264(
1559                         ps_bitstrm);
1560         COPYTHECONTEXT("SH: direct_spatial_mv_pred_flag",
1561                         ps_cur_slice->u1_direct_spatial_mv_pred_flag);
1562 
1563         if(ps_cur_slice->u1_direct_spatial_mv_pred_flag)
1564             ps_cur_slice->pf_decodeDirect = ih264d_decode_spatial_direct;
1565         else
1566             ps_cur_slice->pf_decodeDirect = ih264d_decode_temporal_direct;
1567         if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag)))
1568             ps_dec->pf_mvpred = ih264d_mvpred_nonmbaffB;
1569     }
1570     else
1571     {
1572         if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag)))
1573             ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
1574     }
1575 
1576     if(ps_dec->u4_first_slice_in_pic == 2)
1577     {
1578         if(u2_first_mb_in_slice == 0)
1579         {
1580             ret = ih264d_start_of_pic(ps_dec, i4_poc, &s_tmp_poc, u2_frame_num, ps_pps);
1581             if(ret != OK)
1582                 return ret;
1583         }
1584 
1585         ps_dec->u4_output_present = 0;
1586 
1587         {
1588             ih264d_get_next_display_field(ps_dec,
1589                                           ps_dec->ps_out_buffer,
1590                                           &(ps_dec->s_disp_op));
1591             /* If error code is non-zero then there is no buffer available for display,
1592              hence avoid format conversion */
1593 
1594             if(0 != ps_dec->s_disp_op.u4_error_code)
1595             {
1596                 ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
1597             }
1598             else
1599                 ps_dec->u4_output_present = 1;
1600         }
1601         if(ps_dec->u1_separate_parse == 1)
1602         {
1603             if(ps_dec->u4_dec_thread_created == 0)
1604             {
1605                 ithread_create(ps_dec->pv_dec_thread_handle, NULL,
1606                                (void *)ih264d_decode_picture_thread,
1607                                (void *)ps_dec);
1608 
1609                 ps_dec->u4_dec_thread_created = 1;
1610             }
1611 
1612             if((ps_dec->u4_num_cores == 3) &&
1613                             ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag)
1614                             && (ps_dec->u4_bs_deblk_thread_created == 0))
1615             {
1616                 ps_dec->u4_start_recon_deblk = 0;
1617                 ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL,
1618                                (void *)ih264d_recon_deblk_thread,
1619                                (void *)ps_dec);
1620                 ps_dec->u4_bs_deblk_thread_created = 1;
1621             }
1622         }
1623 
1624     }
1625 
1626     /* INITIALIZATION of fn ptrs for MC and formMbPartInfo functions */
1627     {
1628         UWORD8 uc_nofield_nombaff;
1629 
1630 
1631 
1632         uc_nofield_nombaff = ((ps_dec->ps_cur_slice->u1_field_pic_flag == 0)
1633                         && (ps_dec->ps_cur_slice->u1_mbaff_frame_flag == 0)
1634                         && (u1_slice_type != B_SLICE)
1635                         && (ps_dec->ps_cur_pps->u1_wted_pred_flag == 0));
1636 
1637         /* Initialise MC and formMbPartInfo fn ptrs one time based on profile_idc */
1638 
1639         if(uc_nofield_nombaff)
1640         {
1641             ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
1642             ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
1643         }
1644         else
1645         {
1646             ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_mp;
1647             ps_dec->p_motion_compensate = ih264d_motion_compensate_mp;
1648         }
1649 
1650 
1651     }
1652 
1653     /*
1654      * Decide whether to decode the current picture or not
1655      */
1656     {
1657         dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
1658         if(ps_err->u4_frm_sei_sync == u2_frame_num)
1659         {
1660             ps_err->u1_err_flag = ACCEPT_ALL_PICS;
1661             ps_err->u4_frm_sei_sync = SYNC_FRM_DEFAULT;
1662         }
1663         ps_err->u4_cur_frm = u2_frame_num;
1664     }
1665 
1666     /* Decision for decoding if the picture is to be skipped */
1667     {
1668         WORD32 i4_skip_b_pic, i4_skip_p_pic;
1669 
1670         i4_skip_b_pic = (ps_dec->u4_skip_frm_mask & B_SLC_BIT)
1671                         && (B_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc);
1672 
1673         i4_skip_p_pic = (ps_dec->u4_skip_frm_mask & P_SLC_BIT)
1674                         && (P_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc);
1675 
1676         /**************************************************************/
1677         /* Skip the B picture if skip mask is set for B picture and   */
1678         /* Current B picture is a non reference B picture or there is */
1679         /* no user for reference B picture                            */
1680         /**************************************************************/
1681         if(i4_skip_b_pic)
1682         {
1683             ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
1684             /* Don't decode the picture in SKIP-B mode if that picture is B */
1685             /* and also it is not to be used as a reference picture         */
1686             ps_dec->u1_last_pic_not_decoded = 1;
1687 
1688             return OK;
1689         }
1690         /**************************************************************/
1691         /* Skip the P picture if skip mask is set for P picture and   */
1692         /* Current P picture is a non reference P picture or there is */
1693         /* no user for reference P picture                            */
1694         /**************************************************************/
1695         if(i4_skip_p_pic)
1696         {
1697             ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
1698             /* Don't decode the picture in SKIP-P mode if that picture is P */
1699             /* and also it is not to be used as a reference picture         */
1700             ps_dec->u1_last_pic_not_decoded = 1;
1701 
1702             return OK;
1703         }
1704     }
1705 
1706     {
1707         UWORD16 u2_mb_x, u2_mb_y;
1708 
1709         ps_dec->i4_submb_ofst = ((u2_first_mb_in_slice
1710                         << ps_cur_slice->u1_mbaff_frame_flag) * SUB_BLK_SIZE)
1711                         - SUB_BLK_SIZE;
1712         if(u2_first_mb_in_slice)
1713         {
1714             UWORD8 u1_mb_aff;
1715             UWORD8 u1_field_pic;
1716             UWORD16 u2_frm_wd_in_mbs;
1717             u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
1718             u1_mb_aff = ps_cur_slice->u1_mbaff_frame_flag;
1719             u1_field_pic = ps_cur_slice->u1_field_pic_flag;
1720 
1721             {
1722                 UWORD32 x_offset;
1723                 UWORD32 y_offset;
1724                 UWORD32 u4_frame_stride;
1725                 tfr_ctxt_t *ps_trns_addr; // = &ps_dec->s_tran_addrecon_parse;
1726 
1727                 if(ps_dec->u1_separate_parse)
1728                 {
1729                     ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
1730                 }
1731                 else
1732                 {
1733                     ps_trns_addr = &ps_dec->s_tran_addrecon;
1734                 }
1735                 u2_mb_x = MOD(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
1736                 u2_mb_y = DIV(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
1737 
1738                 u2_mb_y <<= u1_mb_aff;
1739 
1740                 if((u2_mb_x > u2_frm_wd_in_mbs - 1)
1741                                 || (u2_mb_y > ps_dec->u2_frm_ht_in_mbs - 1))
1742                 {
1743                     return ERROR_CORRUPTED_SLICE;
1744                 }
1745 
1746                 u4_frame_stride = ps_dec->u2_frm_wd_y << u1_field_pic;
1747                 x_offset = u2_mb_x << 4;
1748                 y_offset = (u2_mb_y * u4_frame_stride) << 4;
1749 
1750                 ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + x_offset
1751                                 + y_offset;
1752 
1753                 u4_frame_stride = ps_dec->u2_frm_wd_uv << u1_field_pic;
1754                 x_offset >>= 1;
1755                 y_offset = (u2_mb_y * u4_frame_stride) << 3;
1756 
1757                 x_offset *= YUV420SP_FACTOR;
1758 
1759                 ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + x_offset
1760                                 + y_offset;
1761                 ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + x_offset
1762                                 + y_offset;
1763 
1764                 ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1765                 ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1766                 ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1767 
1768 
1769                 // assign the deblock structure pointers to start of slice
1770                 if(ps_dec->u1_separate_parse == 1)
1771                 {
1772                     ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic
1773                                     + (u2_first_mb_in_slice << u1_mb_aff);
1774                 }
1775                 else
1776                 {
1777                         ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic
1778                                         + (u2_first_mb_in_slice << u1_mb_aff);
1779                 }
1780 
1781                 ps_dec->u2_cur_mb_addr = (u2_first_mb_in_slice << u1_mb_aff);
1782 
1783                 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv
1784                                 + ((u2_first_mb_in_slice << u1_mb_aff) << 4);
1785             }
1786         }
1787         else
1788         {
1789             tfr_ctxt_t *ps_trns_addr;
1790 
1791             if(ps_dec->u1_separate_parse)
1792             {
1793                 ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
1794             }
1795             else
1796             {
1797                 ps_trns_addr = &ps_dec->s_tran_addrecon;
1798             }
1799 
1800             u2_mb_x = 0xffff;
1801             u2_mb_y = 0;
1802             // assign the deblock structure pointers to start of slice
1803             ps_dec->u2_cur_mb_addr = 0;
1804             ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
1805             ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
1806             ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
1807             ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
1808             ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
1809 
1810             ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1811             ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1812             ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1813 
1814         }
1815 
1816         ps_dec->ps_part = ps_dec->ps_parse_part_params;
1817 
1818         ps_dec->u2_mbx =
1819                         (MOD(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
1820         ps_dec->u2_mby =
1821                         (DIV(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
1822         ps_dec->u2_mby <<= ps_cur_slice->u1_mbaff_frame_flag;
1823         ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1824         ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1825     }
1826 
1827     /* RBSP stop bit is used for CABAC decoding*/
1828     ps_bitstrm->u4_max_ofst += ps_dec->ps_cur_pps->u1_entropy_coding_mode;
1829 
1830     ps_dec->u1_B = (u1_slice_type == B_SLICE);
1831     ps_dec->u4_next_mb_skip = 0;
1832 
1833     ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice =
1834                     ps_dec->ps_cur_slice->u2_first_mb_in_slice;
1835     ps_dec->ps_parse_cur_slice->slice_type =
1836                     ps_dec->ps_cur_slice->u1_slice_type;
1837 
1838 
1839     ps_dec->u4_start_recon_deblk = 1;
1840     {
1841         WORD32 num_entries;
1842         WORD32 size;
1843         UWORD8 *pu1_buf;
1844 
1845         num_entries = MAX_FRAMES;
1846         if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
1847             (0 == ps_dec->i4_display_delay))
1848         {
1849             num_entries = 1;
1850         }
1851         num_entries = ((2 * num_entries) + 1);
1852         if(BASE_PROFILE_IDC != ps_dec->ps_cur_sps->u1_profile_idc)
1853         {
1854             num_entries *= 2;
1855         }
1856 
1857         size = num_entries * sizeof(void *);
1858         size += PAD_MAP_IDX_POC * sizeof(void *);
1859 
1860         pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf;
1861         pu1_buf += size * ps_dec->u2_cur_slice_num;
1862         ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = ( void *)pu1_buf;
1863     }
1864 
1865     if(ps_dec->u1_separate_parse)
1866     {
1867         ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
1868     }
1869     else
1870     {
1871         ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1872     }
1873 
1874     if(u1_slice_type == I_SLICE)
1875     {
1876         ps_dec->ps_cur_pic->u4_pack_slc_typ |= I_SLC_BIT;
1877 
1878         ret = ih264d_parse_islice(ps_dec, u2_first_mb_in_slice);
1879 
1880         if(ps_dec->i4_pic_type != B_SLICE && ps_dec->i4_pic_type != P_SLICE)
1881             ps_dec->i4_pic_type = I_SLICE;
1882 
1883     }
1884     else if(u1_slice_type == P_SLICE)
1885     {
1886         ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
1887         ret = ih264d_parse_pslice(ps_dec, u2_first_mb_in_slice);
1888         ps_dec->u1_pr_sl_type = u1_slice_type;
1889         if(ps_dec->i4_pic_type != B_SLICE)
1890             ps_dec->i4_pic_type = P_SLICE;
1891     }
1892     else if(u1_slice_type == B_SLICE)
1893     {
1894         ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
1895         ret = ih264d_parse_bslice(ps_dec, u2_first_mb_in_slice);
1896         ps_dec->u1_pr_sl_type = u1_slice_type;
1897         ps_dec->i4_pic_type = B_SLICE;
1898     }
1899     else
1900         return ERROR_INV_SLC_TYPE_T;
1901 
1902     if(ps_dec->u1_slice_header_done)
1903     {
1904         /* set to zero to indicate a valid slice has been decoded */
1905         /* first slice header successfully decoded */
1906         ps_dec->u4_first_slice_in_pic = 0;
1907         ps_dec->u1_first_slice_in_stream = 0;
1908     }
1909 
1910     if(ret != OK)
1911         return ret;
1912 
1913     /* storing last Mb X and MbY of the slice */
1914     ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1915     ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1916 
1917     /* End of Picture detection */
1918 
1919     if(ps_dec->u2_total_mbs_coded >= (ps_seq->u2_max_mb_addr + 1))
1920     {
1921         ps_dec->u1_pic_decode_done = 1;
1922 
1923     }
1924 
1925     {
1926         dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
1927         if((ps_err->u1_err_flag & REJECT_PB_PICS)
1928                         && (ps_err->u1_cur_pic_type == PIC_TYPE_I))
1929         {
1930             ps_err->u1_err_flag = ACCEPT_ALL_PICS;
1931         }
1932     }
1933 
1934     PRINT_BIN_BIT_RATIO(ps_dec)
1935 
1936     return ret;
1937 }
1938 
1939