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