xref: /aosp_15_r20/external/libavc/decoder/ih264d_parse_pslice.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
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  **************************************************************************
23  * \file ih264d_parse_pslice.c
24  *
25  * \brief
26  *    Contains routines that decode a I slice type
27  *
28  * Detailed_description
29  *
30  * \date
31  *    07/07/2003
32  *
33  * \author  NS
34  **************************************************************************
35  */
36 
37 #include <string.h>
38 #include "ih264_defs.h"
39 #include "ih264d_bitstrm.h"
40 #include "ih264d_defs.h"
41 #include "ih264d_debug.h"
42 #include "ih264d_tables.h"
43 #include "ih264d_structs.h"
44 #include "ih264d_defs.h"
45 #include "ih264d_parse_cavlc.h"
46 #include "ih264d_mb_utils.h"
47 #include "ih264d_parse_slice.h"
48 #include "ih264d_mvpred.h"
49 #include "ih264d_parse_islice.h"
50 #include "ih264d_process_intra_mb.h"
51 #include "ih264d_inter_pred.h"
52 #include "ih264d_process_pslice.h"
53 #include "ih264d_deblocking.h"
54 #include "ih264d_cabac.h"
55 #include "ih264d_parse_mb_header.h"
56 #include "ih264d_error_handler.h"
57 #include "ih264d_defs.h"
58 #include "ih264d_format_conv.h"
59 #include "ih264d_quant_scaling.h"
60 #include "ih264d_thread_parse_decode.h"
61 #include "ih264d_thread_compute_bs.h"
62 #include "ih264d_process_bslice.h"
63 #include "ithread.h"
64 #include "ih264d_utils.h"
65 #include "ih264d_format_conv.h"
66 
67 void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec);
68 void ih264d_deblock_mb_level(dec_struct_t *ps_dec,
69                              dec_mb_info_t *ps_cur_mb_info,
70                              UWORD32 nmb_index);
71 
72 /*!
73  **************************************************************************
74  * \if Function name : ih264d_parse_pmb_cavlc \endif
75  *
76  * \brief
77  *    This function parses CAVLC syntax of a P MB.
78  *
79  * \return
80  *    0 on Success and Error code otherwise
81  **************************************************************************
82  */
ih264d_parse_pmb_cavlc(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_mb_num,UWORD8 u1_num_mbsNby2)83 WORD32 ih264d_parse_pmb_cavlc(dec_struct_t * ps_dec,
84                               dec_mb_info_t * ps_cur_mb_info,
85                               UWORD8 u1_mb_num,
86                               UWORD8 u1_num_mbsNby2)
87 {
88     UWORD32 u1_num_mb_part;
89     UWORD32 uc_sub_mb;
90     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
91     UWORD32 * const pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
92     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
93 
94     parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data
95                     + u1_num_mbsNby2;
96     WORD8 * pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0];
97     const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
98     const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part;
99     UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info;
100 
101     UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type;
102     UWORD32 u4_sum_mb_mode_pack = 0;
103     WORD32 ret;
104 
105     UWORD8 u1_no_submb_part_size_lt8x8_flag = 1;
106     ps_cur_mb_info->u1_tran_form8x8 = 0;
107     ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
108 
109     ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
110 
111     ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type;
112     uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0));
113 
114     /* Reading the subMB type */
115     if(uc_sub_mb)
116     {
117         WORD32 i;
118         UWORD8 u1_colz = (PRED_8x8 << 6);
119 
120         for(i = 0; i < 4; i++)
121         {
122             UWORD32 ui_sub_mb_mode;
123 
124             //Inlined ih264d_uev
125             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
126             UWORD32 u4_word, u4_ldz;
127 
128             /***************************************************************/
129             /* Find leading zeros in next 32 bits                          */
130             /***************************************************************/
131             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
132             u4_ldz = CLZ(u4_word);
133             /* Flush the ps_bitstrm */
134             u4_bitstream_offset += (u4_ldz + 1);
135             /* Read the suffix from the ps_bitstrm */
136             u4_word = 0;
137             if(u4_ldz)
138                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
139                         u4_ldz);
140             *pu4_bitstrm_ofst = u4_bitstream_offset;
141             ui_sub_mb_mode = ((1 << u4_ldz) + u4_word - 1);
142             //Inlined ih264d_uev
143 
144             if(ui_sub_mb_mode > 3)
145             {
146                 return ERROR_SUB_MB_TYPE;
147             }
148             else
149             {
150                 u4_sum_mb_mode_pack = (u4_sum_mb_mode_pack << 8) | ui_sub_mb_mode;
151                 /* Storing collocated information */
152                 *pu1_col_info++ = u1_colz | (UWORD8)(ui_sub_mb_mode << 4);
153 
154                 COPYTHECONTEXT("sub_mb_type", ui_sub_mb_mode);
155             }
156 
157             /* check if Motion compensation is done below 8x8 */
158             if(ui_sub_mb_mode != P_L0_8x8)
159             {
160                 u1_no_submb_part_size_lt8x8_flag = 0;
161             }
162         }
163 
164         //
165         u1_num_mb_part = 4;
166     }
167     else
168     {
169         *pu1_col_info++ = (u1_mb_type << 6);
170         if(u1_mb_type)
171             *pu1_col_info++ = (u1_mb_type << 6);
172         u1_num_mb_part = pu1_num_mb_part[u1_mb_type];
173 
174     }
175 
176     /* Decoding reference index 0: For simple profile the following   */
177     /* conditions are always true (mb_field_decoding_flag == 0);      */
178     /* (MbPartPredMode != PredL1)                                     */
179 
180     {
181 
182         UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
183         UWORD8 uc_num_ref_idx_l0_active_minus1 =
184                         (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
185                                         << (u1_mbaff & uc_field)) - 1;
186 
187         if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0))
188         {
189             if(1 == uc_num_ref_idx_l0_active_minus1)
190                 ih264d_parse_pmb_ref_index_cavlc_range1(
191                                 u1_num_mb_part, ps_bitstrm, pi1_ref_idx,
192                                 uc_num_ref_idx_l0_active_minus1);
193             else
194             {
195                 ret = ih264d_parse_pmb_ref_index_cavlc(
196                                 u1_num_mb_part, ps_bitstrm, pi1_ref_idx,
197                                 uc_num_ref_idx_l0_active_minus1);
198                 if(ret != OK)
199                     return ret;
200             }
201         }
202         else
203         {
204             /* When there exists only a single frame to predict from */
205             UWORD8 uc_i;
206             for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++)
207                 /* Storing Reference Idx Information */
208                 pi1_ref_idx[uc_i] = 0;
209         }
210     }
211 
212     {
213         UWORD8 u1_p_idx, uc_i;
214         parse_part_params_t * ps_part = ps_dec->ps_part;
215         UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height;
216         UWORD8 u1_sub_mb_num;
217         const UWORD8 * pu1_top_left_sub_mb_indx;
218         mv_pred_t * ps_mv, *ps_mv_start = ps_dec->ps_mv_cur + (u1_mb_num << 4);
219         /* Loading the table pointers */
220         const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
221         const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
222         const UWORD8 * pu1_sub_mb_indx_mod =
223                         (const UWORD8 *)(gau1_ih264d_submb_indx_mod)
224                                         + (uc_sub_mb * 6);
225         const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw;
226         const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth;
227         const UWORD8 * pu1_num_sub_mb_part =
228                         (const UWORD8 *)gau1_ih264d_num_submb_part;
229 
230         UWORD16 u2_sub_mb_num = 0x028A;
231 
232         /*********************************************************/
233         /* default initialisations for condition (uc_sub_mb == 0) */
234         /* i.e. all are subpartitions of 8x8                     */
235         /*********************************************************/
236         u1_sub_mb_mode = 0;
237         u1_num_subpart = 1;
238         u1_mb_part_width = pu1_mb_partw[u1_mb_type];
239         u1_mb_part_height = pu1_mb_parth[u1_mb_type];
240         pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1);
241         u1_sub_mb_num = 0;
242 
243         /* Loop on number of partitions */
244         for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++)
245         {
246             UWORD8 uc_j;
247             if(uc_sub_mb)
248             {
249                 u1_sub_mb_mode = u4_sum_mb_mode_pack >> 24;
250                 u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode];
251                 u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode];
252                 u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode];
253                 pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1);
254                 u1_sub_mb_num = u2_sub_mb_num >> 12;
255                 u4_sum_mb_mode_pack <<= 8;
256                 u2_sub_mb_num <<= 4;
257             }
258 
259             /* Loop on Number of sub-partitions */
260             for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++)
261             {
262                 WORD16 i2_mvx, i2_mvy;
263                 u1_sub_mb_num += *pu1_top_left_sub_mb_indx;
264                 ps_mv = ps_mv_start + u1_sub_mb_num;
265 
266                 /* Reading the differential Mv from the bitstream */
267                 //i2_mvx = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
268                 //inlining ih264d_sev
269                 {
270                     UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
271                     UWORD32 u4_word, u4_ldz, u4_abs_val;
272 
273                     /***************************************************************/
274                     /* Find leading zeros in next 32 bits                          */
275                     /***************************************************************/
276                     NEXTBITS_32(u4_word, u4_bitstream_offset,
277                                 pu4_bitstrm_buf);
278                     u4_ldz = CLZ(u4_word);
279 
280                     /* Flush the ps_bitstrm */
281                     u4_bitstream_offset += (u4_ldz + 1);
282 
283                     /* Read the suffix from the ps_bitstrm */
284                     u4_word = 0;
285                     if(u4_ldz)
286                         GETBITS(u4_word, u4_bitstream_offset,
287                                 pu4_bitstrm_buf, u4_ldz);
288 
289                     *pu4_bitstrm_ofst = u4_bitstream_offset;
290                     u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
291 
292                     if(u4_word & 0x1)
293                         i2_mvx = (-(WORD32)u4_abs_val);
294                     else
295                         i2_mvx = (u4_abs_val);
296                 }
297                 //inlinined ih264d_sev
298                 COPYTHECONTEXT("MVD", i2_mvx);
299                 i2_mvy = ih264d_sev(pu4_bitstrm_ofst,
300                                      pu4_bitstrm_buf);
301                 COPYTHECONTEXT("MVD", i2_mvy);
302 
303                 /* Storing Info for partitions */
304                 ps_part->u1_is_direct = PART_NOT_DIRECT;
305                 ps_part->u1_sub_mb_num = u1_sub_mb_num;
306                 ps_part->u1_partheight = u1_mb_part_height;
307                 ps_part->u1_partwidth = u1_mb_part_width;
308 
309                 /* Storing Mv residuals */
310                 ps_mv->i2_mv[0] = i2_mvx;
311                 ps_mv->i2_mv[1] = i2_mvy;
312 
313                 /* Increment partition Index */
314                 u1_p_idx++;
315                 ps_part++;
316             }
317         }
318         ps_parse_mb_data->u1_num_part = u1_p_idx;
319         ps_dec->ps_part = ps_part;
320     }
321 
322     {
323         UWORD32 u4_cbp;
324 
325         /* Read the Coded block pattern */
326         UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
327         UWORD32 u4_word, u4_ldz;
328 
329         /***************************************************************/
330         /* Find leading zeros in next 32 bits                          */
331         /***************************************************************/
332         NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
333         u4_ldz = CLZ(u4_word);
334         /* Flush the ps_bitstrm */
335         u4_bitstream_offset += (u4_ldz + 1);
336         /* Read the suffix from the ps_bitstrm */
337         u4_word = 0;
338         if(u4_ldz)
339             GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
340         *pu4_bitstrm_ofst = u4_bitstream_offset;
341         u4_cbp = ((1 << u4_ldz) + u4_word - 1);
342 
343         if(u4_cbp > 47)
344             return ERROR_CBP;
345 
346         u4_cbp = *((UWORD8*)gau1_ih264d_cbp_inter + u4_cbp);
347         COPYTHECONTEXT("coded_block_pattern", u4_cbp);
348         ps_cur_mb_info->u1_cbp = u4_cbp;
349 
350         /* Read the transform8x8 u4_flag if present */
351         if((ps_dec->s_high_profile.u1_transform8x8_present) && (u4_cbp & 0xf)
352                         && u1_no_submb_part_size_lt8x8_flag)
353         {
354             ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
355             COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
356             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
357         }
358 
359         /* Read mb_qp_delta */
360         if(u4_cbp)
361         {
362             WORD32 i_temp;
363 
364             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
365             UWORD32 u4_word, u4_ldz, u4_abs_val;
366 
367             /***************************************************************/
368             /* Find leading zeros in next 32 bits                          */
369             /***************************************************************/
370             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
371             u4_ldz = CLZ(u4_word);
372 
373             /* Flush the ps_bitstrm */
374             u4_bitstream_offset += (u4_ldz + 1);
375 
376             /* Read the suffix from the ps_bitstrm */
377             u4_word = 0;
378             if(u4_ldz)
379                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
380                         u4_ldz);
381 
382             *pu4_bitstrm_ofst = u4_bitstream_offset;
383             u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
384 
385             if(u4_word & 0x1)
386                 i_temp = (-(WORD32)u4_abs_val);
387             else
388                 i_temp = (u4_abs_val);
389 
390             if((i_temp < -26) || (i_temp > 25))
391                 return ERROR_INV_RANGE_QP_T;
392             //inlinined ih264d_sev
393 
394             COPYTHECONTEXT("mb_qp_delta", i_temp);
395             if(i_temp)
396             {
397                 ret = ih264d_update_qp(ps_dec, (WORD8)i_temp);
398                 if(ret != OK)
399                     return ret;
400             }
401 
402             ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, 0);
403             if(ret != OK)
404                 return ret;
405             if(EXCEED_OFFSET(ps_bitstrm))
406                 return ERROR_EOB_TERMINATE_T;
407         }
408         else
409         {
410             ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
411         }
412 
413 
414 
415     }
416 
417     return OK;
418 }
419 
420 /*!
421  **************************************************************************
422  * \if Function name : ih264d_parse_pmb_cabac \endif
423  *
424  * \brief
425  *    This function parses CABAC syntax of a P MB.
426  *
427  * \return
428  *    0 on Success and Error code otherwise
429  **************************************************************************
430  */
ih264d_parse_pmb_cabac(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_mb_num,UWORD8 u1_num_mbsNby2)431 WORD32 ih264d_parse_pmb_cabac(dec_struct_t * ps_dec,
432                               dec_mb_info_t * ps_cur_mb_info,
433                               UWORD8 u1_mb_num,
434                               UWORD8 u1_num_mbsNby2)
435 {
436     UWORD32 u1_num_mb_part;
437     UWORD32 uc_sub_mb;
438     parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data
439                     + u1_num_mbsNby2;
440     WORD8 * pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0];
441     const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part;
442     const UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type;
443     UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info;
444     UWORD32 u1_mb_mc_mode = u1_mb_type;
445     ctxt_inc_mb_info_t * p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
446     decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
447     dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
448     UWORD32 u4_sub_mb_pack = 0;
449     WORD32 ret;
450 
451     UWORD8 u1_no_submb_part_size_lt8x8_flag = 1;
452     ps_cur_mb_info->u1_tran_form8x8 = 0;
453     ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
454 
455     ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
456 
457     p_curr_ctxt->u1_mb_type = CAB_P;
458     ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type;
459     uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0));
460 
461     /* Reading the subMB type */
462     if(uc_sub_mb)
463     {
464 
465         UWORD8 u1_colz = (PRED_8x8 << 6);
466         u1_mb_mc_mode = 0;
467 
468         {
469             UWORD8 u1_sub_mb_mode;
470             u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
471                             0, ps_cab_env, ps_bitstrm,
472                             ps_dec->p_sub_mb_type_t);
473             if(u1_sub_mb_mode > 3)
474                 return ERROR_SUB_MB_TYPE;
475 
476             u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
477             /* Storing collocated information */
478             *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4));
479             COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
480             /* check if Motion compensation is done below 8x8 */
481             if(u1_sub_mb_mode != P_L0_8x8)
482             {
483                 u1_no_submb_part_size_lt8x8_flag = 0;
484             }
485         }
486         {
487             UWORD8 u1_sub_mb_mode;
488             u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
489                             0, ps_cab_env, ps_bitstrm,
490                             ps_dec->p_sub_mb_type_t);
491             if(u1_sub_mb_mode > 3)
492                 return ERROR_SUB_MB_TYPE;
493 
494             u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
495             /* Storing collocated information */
496             *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4));
497             COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
498             /* check if Motion compensation is done below 8x8 */
499             if(u1_sub_mb_mode != P_L0_8x8)
500             {
501                 u1_no_submb_part_size_lt8x8_flag = 0;
502             }
503         }
504         {
505             UWORD8 u1_sub_mb_mode;
506             u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
507                             0, ps_cab_env, ps_bitstrm,
508                             ps_dec->p_sub_mb_type_t);
509             if(u1_sub_mb_mode > 3)
510                 return ERROR_SUB_MB_TYPE;
511 
512             u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
513             /* Storing collocated information */
514             *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4));
515             COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
516             /* check if Motion compensation is done below 8x8 */
517             if(u1_sub_mb_mode != P_L0_8x8)
518             {
519                 u1_no_submb_part_size_lt8x8_flag = 0;
520             }
521         }
522         {
523             UWORD8 u1_sub_mb_mode;
524             u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
525                             0, ps_cab_env, ps_bitstrm,
526                             ps_dec->p_sub_mb_type_t);
527             if(u1_sub_mb_mode > 3)
528                 return ERROR_SUB_MB_TYPE;
529 
530             u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
531             /* Storing collocated information */
532             *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4));
533             COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
534             /* check if Motion compensation is done below 8x8 */
535             if(u1_sub_mb_mode != P_L0_8x8)
536             {
537                 u1_no_submb_part_size_lt8x8_flag = 0;
538             }
539         }
540         u1_num_mb_part = 4;
541     }
542     else
543     {
544         u1_num_mb_part = pu1_num_mb_part[u1_mb_type];
545         /* Storing collocated Mb and SubMb mode information */
546         *pu1_col_info++ = (u1_mb_type << 6);
547         if(u1_mb_type)
548             *pu1_col_info++ = (u1_mb_type << 6);
549     }
550     /* Decoding reference index 0: For simple profile the following   */
551     /* conditions are always true (mb_field_decoding_flag == 0);      */
552     /* (MbPartPredMode != PredL1)                                     */
553     {
554         WORD8 * pi1_top_ref_idx_ctx_inc_arr = p_curr_ctxt->i1_ref_idx;
555         WORD8 * pi1_left_ref_idx_ctxt_inc = ps_dec->pi1_left_ref_idx_ctxt_inc;
556         UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
557         UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
558         UWORD8 uc_num_ref_idx_l0_active_minus1 =
559                         (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
560                                         << (u1_mbaff & uc_field)) - 1;
561 
562         if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0))
563         {
564             /* force the routine to decode ref idx for each partition */
565             *((UWORD32 *)pi1_ref_idx) = 0x01010101;
566             ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 0,
567                                              uc_num_ref_idx_l0_active_minus1,
568                                              u1_mb_mc_mode, pi1_ref_idx,
569                                              pi1_left_ref_idx_ctxt_inc,
570                                              pi1_top_ref_idx_ctx_inc_arr, ps_cab_env,
571                                              ps_bitstrm, ps_dec->p_ref_idx_t);
572             if(ret != OK)
573                 return ret;
574         }
575         else
576         {
577             /* When there exists only a single frame to predict from */
578             pi1_left_ref_idx_ctxt_inc[0] = 0;
579             pi1_left_ref_idx_ctxt_inc[1] = 0;
580             pi1_top_ref_idx_ctx_inc_arr[0] = 0;
581             pi1_top_ref_idx_ctx_inc_arr[1] = 0;
582             *((UWORD32 *)pi1_ref_idx) = 0;
583         }
584     }
585 
586     {
587         UWORD8 u1_p_idx, uc_i;
588         parse_part_params_t * ps_part = ps_dec->ps_part;
589         UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height;
590         UWORD8 u1_sub_mb_num;
591         const UWORD8 * pu1_top_left_sub_mb_indx;
592         mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u1_mb_num << 4);
593         UWORD16 u2_sub_mb_num_pack = 0x028A;
594 
595         /* Loading the table pointers */
596         const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
597         const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
598         const UWORD8 * pu1_sub_mb_indx_mod =
599                         (const UWORD8 *)(gau1_ih264d_submb_indx_mod)
600                                         + (uc_sub_mb * 6);
601         const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw;
602         const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth;
603         const UWORD8 * pu1_num_sub_mb_part =
604                         (const UWORD8 *)gau1_ih264d_num_submb_part;
605 
606         /*********************************************************/
607         /* default initialisations for condition (uc_sub_mb == 0) */
608         /* i.e. all are subpartitions of 8x8                     */
609         /*********************************************************/
610         u1_sub_mb_mode = 0;
611         u1_num_subpart = 1;
612         u1_mb_part_width = pu1_mb_partw[u1_mb_type];
613         u1_mb_part_height = pu1_mb_parth[u1_mb_type];
614         pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1);
615         u1_sub_mb_num = 0;
616 
617         /* Loop on number of partitions */
618         for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++)
619         {
620             UWORD8 uc_j;
621             if(uc_sub_mb)
622             {
623                 u1_sub_mb_mode = u4_sub_mb_pack >> 24;
624                 u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode];
625                 u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode];
626                 u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode];
627                 pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1);
628                 u1_sub_mb_num = u2_sub_mb_num_pack >> 12;
629                 u4_sub_mb_pack <<= 8;
630                 u2_sub_mb_num_pack <<= 4;
631             }
632             /* Loop on Number of sub-partitions */
633             for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++)
634             {
635                 mv_pred_t * ps_mv;
636 
637                 u1_sub_mb_num += *pu1_top_left_sub_mb_indx;
638                 ps_mv = ps_mv_start + u1_sub_mb_num;
639 
640                 /* Storing Info for partitions */
641                 ps_part->u1_is_direct = PART_NOT_DIRECT;
642                 ps_part->u1_sub_mb_num = u1_sub_mb_num;
643                 ps_part->u1_partheight = u1_mb_part_height;
644                 ps_part->u1_partwidth = u1_mb_part_width;
645 
646                 /* Increment partition Index */
647                 u1_p_idx++;
648                 ps_part++;
649 
650                 ih264d_get_mvd_cabac(u1_sub_mb_num, 0, u1_mb_part_width,
651                                      u1_mb_part_height, 1, ps_dec, ps_mv);
652             }
653         }
654         ps_parse_mb_data->u1_num_part = u1_p_idx;
655         ps_dec->ps_part = ps_part;
656     }
657     {
658         UWORD8 u1_cbp;
659 
660         /* Read the Coded block pattern */
661         u1_cbp = (WORD8)ih264d_parse_ctx_cbp_cabac(ps_dec);
662         COPYTHECONTEXT("coded_block_pattern", u1_cbp);
663         ps_cur_mb_info->u1_cbp = u1_cbp;
664         p_curr_ctxt->u1_cbp = u1_cbp;
665         p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
666         p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
667         ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
668 
669         if(u1_cbp > 47)
670             return ERROR_CBP;
671 
672         ps_cur_mb_info->u1_tran_form8x8 = 0;
673         ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
674 
675         /* Read the transform8x8 u4_flag if present */
676         if((ps_dec->s_high_profile.u1_transform8x8_present) && (u1_cbp & 0xf)
677                         && u1_no_submb_part_size_lt8x8_flag)
678         {
679             ps_cur_mb_info->u1_tran_form8x8 = ih264d_parse_transform8x8flag_cabac(
680                             ps_dec, ps_cur_mb_info);
681             COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
682             p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
683             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
684 
685         }
686         else
687         {
688             p_curr_ctxt->u1_transform8x8_ctxt = 0;
689         }
690 
691         /* Read mb_qp_delta */
692         if(u1_cbp)
693         {
694             WORD8 c_temp;
695             ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &c_temp);
696             if(ret != OK)
697                 return ret;
698             COPYTHECONTEXT("mb_qp_delta", c_temp);
699             if(c_temp != 0)
700             {
701                 ret = ih264d_update_qp(ps_dec, c_temp);
702                 if(ret != OK)
703                     return ret;
704             }
705         }
706         else
707             ps_dec->i1_prev_mb_qp_delta = 0;
708 
709 
710 
711         ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, 0);
712         if(EXCEED_OFFSET(ps_dec->ps_bitstrm))
713             return ERROR_EOB_TERMINATE_T;
714     }
715     return OK;
716 }
717 
718 /*!
719  **************************************************************************
720  * \if Function name : parsePSliceData \endif
721  *
722  * \brief
723  *    This function parses CAVLC syntax of N MB's of a P slice.
724  *    1. After parsing syntax of N MB's, for those N MB's (less than N, incase
725  *       of end of slice or end of row), MB is decoded. This process is carried
726  *       for one complete MB row or till end of slice.
727  *    2. Bottom one row of current MB is copied to IntraPredLine buffers.
728  *       IntraPredLine buffers are used for Intra prediction of next row.
729  *    3. Current MB row along with previous 4 rows of Luma (and 2 of Chroma) are
730  *       deblocked.
731  *    4. 4 rows (2 for Chroma) previous row and 12 rows (6 for Chroma) are
732  *       DMA'ed to picture buffers.
733  *
734  * \return
735  *    0 on Success and Error code otherwise
736  **************************************************************************
737  */
738 
739 /*!
740  **************************************************************************
741  * \if Function name : ih264d_update_nnz_for_skipmb \endif
742  *
743  * \brief
744  *
745  * \return
746  *    None
747  *
748  **************************************************************************
749  */
ih264d_update_nnz_for_skipmb(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_entrpy)750 void ih264d_update_nnz_for_skipmb(dec_struct_t * ps_dec,
751                                   dec_mb_info_t * ps_cur_mb_info,
752                                   UWORD8 u1_entrpy)
753 {
754     UWORD32 *pu4_buf;
755     UWORD8 *pu1_buf;
756     UNUSED(u1_entrpy);
757     pu1_buf = ps_dec->pu1_left_nnz_y;
758     pu4_buf = (UWORD32 *)pu1_buf;
759     *pu4_buf = 0;
760     pu1_buf = ps_dec->pu1_left_nnz_uv;
761     pu4_buf = (UWORD32 *)pu1_buf;
762     *pu4_buf = 0;
763     pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_y;
764     pu4_buf = (UWORD32 *)pu1_buf;
765     *pu4_buf = 0;
766     pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_uv;
767     pu4_buf = (UWORD32 *)pu1_buf;
768     *pu4_buf = 0;
769     ps_cur_mb_info->ps_curmb->u2_luma_csbp = 0;
770     ps_cur_mb_info->u2_luma_csbp = 0;
771     ps_cur_mb_info->u2_chroma_csbp = 0;
772 }
773 
774 
775 
776 /*****************************************************************************/
777 /*                                                                           */
778 /*  Function Name : ih264d_parse_inter_slice_data_cabac                             */
779 /*                                                                           */
780 /*  Description   : This function parses cabac syntax of a inter slice on    */
781 /*                  N MB basis.                                              */
782 /*                                                                           */
783 /*  Inputs        : ps_dec                                                   */
784 /*                  sliceparams                                              */
785 /*                  firstMbInSlice                                           */
786 /*                                                                           */
787 /*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
788 /*                     decoded till the end of slice.                        */
789 /*                  2. MV prediction and DMA happens on a N/2 MB basis.      */
790 /*                                                                           */
791 /*  Returns       : 0                                                        */
792 /*                                                                           */
793 /*  Issues        : <List any issues or problems with this function>         */
794 /*                                                                           */
795 /*  Revision History:                                                        */
796 /*                                                                           */
797 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
798 /*         13 07 2002   Jay             Draft                                */
799 /*                                                                           */
800 /*****************************************************************************/
ih264d_parse_inter_slice_data_cabac(dec_struct_t * ps_dec,dec_slice_params_t * ps_slice,UWORD16 u2_first_mb_in_slice)801 WORD32 ih264d_parse_inter_slice_data_cabac(dec_struct_t * ps_dec,
802                                            dec_slice_params_t * ps_slice,
803                                            UWORD16 u2_first_mb_in_slice)
804 {
805     UWORD32 uc_more_data_flag;
806     WORD32 i2_cur_mb_addr;
807     UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
808     UWORD32 u1_mbaff;
809     UWORD32 u1_num_mbs_next, u1_end_of_row;
810     const UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
811     UWORD32 u1_slice_end = 0;
812     UWORD32 u1_tfr_n_mb = 0;
813     UWORD32 u1_decode_nmb = 0;
814 
815 
816     deblk_mb_t *ps_cur_deblk_mb;
817     dec_mb_info_t *ps_cur_mb_info;
818 
819     parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
820     UWORD32 u1_inter_mb_skip_type;
821     UWORD32 u1_inter_mb_type;
822     UWORD32 u1_deblk_mb_type;
823     UWORD32 u1_mb_threshold;
824     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
825     WORD32 ret = OK;
826 
827     /******************************************************/
828     /* Initialisations specific to B or P slice           */
829     /******************************************************/
830     if(ps_slice->u1_slice_type == P_SLICE)
831     {
832         u1_inter_mb_skip_type = CAB_P_SKIP;
833         u1_inter_mb_type = P_MB;
834         u1_deblk_mb_type = D_INTER_MB;
835         u1_mb_threshold = 5;
836     }
837     else // B_SLICE
838     {
839         u1_inter_mb_skip_type = CAB_B_SKIP;
840         u1_inter_mb_type = B_MB;
841         u1_deblk_mb_type = D_B_SLICE;
842         u1_mb_threshold = 23;
843     }
844 
845     /******************************************************/
846     /* Slice Level Initialisations                        */
847     /******************************************************/
848     i2_cur_mb_addr = u2_first_mb_in_slice;
849     ps_dec->u1_qp = ps_slice->u1_slice_qp;
850     ih264d_update_qp(ps_dec, 0);
851     u1_mb_idx = ps_dec->u1_mb_idx;
852     u1_num_mbs = u1_mb_idx;
853     u1_num_mbsNby2 = 0;
854     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
855     i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
856     uc_more_data_flag = 1;
857 
858     /* Initialisations specific to cabac */
859     if(ps_bitstrm->u4_ofst & 0x07)
860     {
861         ps_bitstrm->u4_ofst += 8;
862         ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
863     }
864 
865     ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
866     if(ret != OK)
867         return ret;
868 
869     ps_dec->i1_prev_mb_qp_delta = 0;
870 
871     while(!u1_slice_end)
872     {
873         UWORD8 u1_mb_type;
874         UWORD32 u4_mb_skip;
875 
876         ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
877 
878         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
879         {
880             break;
881         }
882 
883         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
884         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
885 
886         ps_cur_mb_info->u1_Mux = 0;
887         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
888         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
889 
890         ps_cur_mb_info->u1_end_of_slice = 0;
891 
892         /* Storing Default partition info */
893         ps_parse_mb_data->u1_num_part = 1;
894         ps_parse_mb_data->u1_isI_mb = 0;
895 
896         /***************************************************************/
897         /* Get the required information for decoding of MB             */
898         /* mb_x, mb_y , neighbour availablity,                         */
899         /***************************************************************/
900         u4_mb_skip = ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 1);
901 
902         /*********************************************************************/
903         /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
904         /*********************************************************************/
905         ps_cur_mb_info->u1_tran_form8x8 = 0;
906         ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
907 
908         /***************************************************************/
909         /* Set the deblocking parameters for this MB                   */
910         /***************************************************************/
911         if(ps_dec->u4_app_disable_deblk_frm == 0)
912             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
913                                              ps_dec->u1_mb_ngbr_availablity,
914                                              ps_dec->u1_cur_mb_fld_dec_flag);
915 
916         if(u4_mb_skip)
917         {
918 
919             /* Set appropriate flags in ps_cur_mb_info and ps_dec */
920             memset(ps_dec->ps_curr_ctxt_mb_info, 0, sizeof(ctxt_inc_mb_info_t));
921             ps_dec->ps_curr_ctxt_mb_info->u1_mb_type = u1_inter_mb_skip_type;
922 
923             MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
924 
925             *((UWORD32 *)ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
926             *(ps_dec->pu1_left_yuv_dc_csbp) = 0;
927 
928             ps_dec->i1_prev_mb_qp_delta = 0;
929             ps_cur_mb_info->u1_mb_type = MB_SKIP;
930             ps_cur_mb_info->u1_cbp = 0;
931 
932             {
933                 /* Storing Skip partition info */
934                 parse_part_params_t *ps_part_info = ps_dec->ps_part;
935                 ps_part_info->u1_is_direct = PART_DIRECT_16x16;
936                 ps_part_info->u1_sub_mb_num = 0;
937                 ps_dec->ps_part++;
938             }
939 
940             /* Update Nnzs */
941             ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CABAC);
942 
943             ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
944             ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
945             ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
946 
947         }
948         else
949         {
950 
951             /* Macroblock Layer Begins */
952             /* Decode the u1_mb_type */
953             u1_mb_type = ih264d_parse_mb_type_cabac(ps_dec);
954             ps_cur_mb_info->u1_mb_type = u1_mb_type;
955             if(u1_mb_type > (25 + u1_mb_threshold))
956                 return ERROR_MB_TYPE;
957 
958             /* Parse Macroblock Data */
959             if(u1_mb_type < u1_mb_threshold)
960             {
961                 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
962                 *(ps_dec->pu1_left_yuv_dc_csbp) &= 0x6;
963 
964                 ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs,
965                                           u1_num_mbsNby2);
966                 if(ret != OK)
967                     return ret;
968                 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
969                 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
970             }
971             else
972             {
973                 /* Storing Intra partition info */
974                 ps_parse_mb_data->u1_num_part = 0;
975                 ps_parse_mb_data->u1_isI_mb = 1;
976 
977                 if((25 + u1_mb_threshold) == u1_mb_type)
978                 {
979                     /* I_PCM_MB */
980                     ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
981                     ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
982                     if(ret != OK)
983                         return ret;
984                     ps_cur_deblk_mb->u1_mb_qp = 0;
985                 }
986                 else
987                 {
988                     if(u1_mb_type == u1_mb_threshold)
989                         ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
990                     else
991                         ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
992 
993                     ret = ih264d_parse_imb_cabac(
994                                     ps_dec, ps_cur_mb_info,
995                                     (UWORD8)(u1_mb_type - u1_mb_threshold));
996                     if(ret != OK)
997                         return ret;
998                     ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
999                 }
1000                 ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1001 
1002             }
1003 
1004         }
1005 
1006         if(ps_dec->u1_enable_mb_info)
1007         {
1008             ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
1009                                         ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
1010         }
1011 
1012         if(u1_mbaff)
1013         {
1014             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1015         }
1016 
1017 
1018         if(ps_cur_mb_info->u1_topmb && u1_mbaff)
1019             uc_more_data_flag = 1;
1020         else
1021         {
1022             uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env,
1023                                                       ps_bitstrm);
1024             uc_more_data_flag = !uc_more_data_flag;
1025             COPYTHECONTEXT("Decode Sliceterm",!uc_more_data_flag);
1026         }
1027 
1028         if(u1_mbaff)
1029         {
1030             if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1)))
1031             {
1032                 return ERROR_EOB_FLUSHBITS_T;
1033             }
1034         }
1035         /* Next macroblock information */
1036         i2_cur_mb_addr++;
1037         u1_num_mbs++;
1038         u1_num_mbsNby2++;
1039         ps_parse_mb_data++;
1040 
1041         /****************************************************************/
1042         /* Check for End Of Row and other flags that determine when to  */
1043         /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
1044         /* N-Mb                                                         */
1045         /****************************************************************/
1046         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1047         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1048         u1_slice_end = !uc_more_data_flag;
1049         u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
1050                         || u1_slice_end;
1051         u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
1052         ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1053         /*u1_dma_nby2mb   = u1_decode_nmb ||
1054          (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/
1055 
1056 //if(u1_dma_nby2mb)
1057         if(u1_decode_nmb)
1058         {
1059 
1060             ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
1061             u1_num_mbsNby2 = 0;
1062 
1063             {
1064                 ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1065                 ps_dec->ps_part = ps_dec->ps_parse_part_params;
1066             }
1067         }
1068 
1069         /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d",
1070          ps_slice->i4_poc >> ps_slice->u1_field_pic_flag,
1071          ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb));
1072          H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d, u1_num_mbs: %d", u1_decode_nmb, u1_num_mbs);*/
1073         if(u1_decode_nmb)
1074         {
1075 
1076             if(ps_dec->u1_separate_parse)
1077             {
1078                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1079                                      u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
1080                 ps_dec->ps_nmb_info +=  u1_num_mbs;
1081             }
1082             else
1083             {
1084                 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1085                                             u1_num_mbs_next, u1_tfr_n_mb,
1086                                             u1_end_of_row);
1087             }
1088             ps_dec->u2_total_mbs_coded += u1_num_mbs;
1089             if(u1_tfr_n_mb)
1090                 u1_num_mbs = 0;
1091             u1_mb_idx = u1_num_mbs;
1092             ps_dec->u1_mb_idx = u1_num_mbs;
1093 
1094         }
1095     }
1096 
1097 
1098     ps_dec->u4_num_mbs_cur_nmb = 0;
1099     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
1100 
1101                         - (u2_first_mb_in_slice << u1_mbaff);
1102 
1103     return ret;
1104 }
1105 
1106 /*****************************************************************************/
1107 /*                                                                           */
1108 /*  Function Name : ih264d_parse_inter_slice_data_cavlc                             */
1109 /*                                                                           */
1110 /*  Description   : This function parses cavlc syntax of a inter slice on    */
1111 /*                  N MB basis.                                              */
1112 /*                                                                           */
1113 /*  Inputs        : ps_dec                                                   */
1114 /*                  sliceparams                                              */
1115 /*                  firstMbInSlice                                           */
1116 /*                                                                           */
1117 /*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
1118 /*                     decoded till the end of slice.                        */
1119 /*                  2. MV prediction and DMA happens on a N/2 MB basis.      */
1120 /*                                                                           */
1121 /*  Returns       : 0                                                        */
1122 /*                                                                           */
1123 /*  Issues        : <List any issues or problems with this function>         */
1124 /*                                                                           */
1125 /*  Revision History:                                                        */
1126 /*                                                                           */
1127 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1128 /*         13 07 2002   Jay             Draft                                */
1129 /*                                                                           */
1130 /*****************************************************************************/
1131 
ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec,dec_slice_params_t * ps_slice,UWORD16 u2_first_mb_in_slice)1132 WORD32 ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec,
1133                                            dec_slice_params_t * ps_slice,
1134                                            UWORD16 u2_first_mb_in_slice)
1135 {
1136     UWORD32 uc_more_data_flag;
1137     WORD32 i2_cur_mb_addr;
1138     UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
1139     UWORD32 i2_mb_skip_run;
1140     UWORD32 u1_read_mb_type;
1141 
1142     UWORD32 u1_mbaff;
1143     UWORD32 u1_num_mbs_next, u1_end_of_row;
1144     const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1145     UWORD32 u1_slice_end = 0;
1146     UWORD32 u1_tfr_n_mb = 0;
1147     UWORD32 u1_decode_nmb = 0;
1148 
1149     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1150     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1151     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1152     deblk_mb_t *ps_cur_deblk_mb;
1153     dec_mb_info_t *ps_cur_mb_info;
1154     parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1155     UWORD32 u1_inter_mb_type;
1156     UWORD32 u1_deblk_mb_type;
1157     UWORD32 u1_mb_threshold;
1158     WORD32 ret = OK;
1159 
1160     /******************************************************/
1161     /* Initialisations specific to B or P slice           */
1162     /******************************************************/
1163 
1164     if(ps_slice->u1_slice_type == P_SLICE)
1165     {
1166         u1_inter_mb_type = P_MB;
1167         u1_deblk_mb_type = D_INTER_MB;
1168         u1_mb_threshold = 5;
1169     }
1170     else // B_SLICE
1171     {
1172         u1_inter_mb_type = B_MB;
1173         u1_deblk_mb_type = D_B_SLICE;
1174         u1_mb_threshold = 23;
1175     }
1176     /******************************************************/
1177     /* Slice Level Initialisations                        */
1178     /******************************************************/
1179     ps_dec->u1_qp = ps_slice->u1_slice_qp;
1180     ih264d_update_qp(ps_dec, 0);
1181     u1_mb_idx = ps_dec->u1_mb_idx;
1182     u1_num_mbs = u1_mb_idx;
1183 
1184     u1_num_mbsNby2 = 0;
1185     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1186     i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1187     i2_mb_skip_run = 0;
1188     uc_more_data_flag = 1;
1189     u1_read_mb_type = 0;
1190 
1191     while(!u1_slice_end)
1192     {
1193         UWORD8 u1_mb_type;
1194 
1195         ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1196 
1197         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
1198         {
1199             break;
1200         }
1201 
1202 
1203         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1204         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1205 
1206         ps_cur_mb_info->u1_Mux = 0;
1207         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1208         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1209 
1210         ps_cur_mb_info->u1_end_of_slice = 0;
1211 
1212         /* Storing Default partition info */
1213         ps_parse_mb_data->u1_num_part = 1;
1214         ps_parse_mb_data->u1_isI_mb = 0;
1215 
1216         if((!i2_mb_skip_run) && (!u1_read_mb_type))
1217         {
1218 
1219             //Inlined ih264d_uev
1220             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
1221             UWORD32 u4_word, u4_ldz;
1222 
1223             /***************************************************************/
1224             /* Find leading zeros in next 32 bits                          */
1225             /***************************************************************/
1226             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1227 
1228             u4_ldz = CLZ(u4_word);
1229 
1230             /* Flush the ps_bitstrm */
1231             u4_bitstream_offset += (u4_ldz + 1);
1232             /* Read the suffix from the ps_bitstrm */
1233             u4_word = 0;
1234             if(u4_ldz)
1235             {
1236                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
1237                         u4_ldz);
1238             }
1239             *pu4_bitstrm_ofst = u4_bitstream_offset;
1240             i2_mb_skip_run = ((1 << u4_ldz) + u4_word - 1);
1241             //Inlined ih264d_uev
1242             COPYTHECONTEXT("mb_skip_run", i2_mb_skip_run);
1243             uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1244             u1_read_mb_type = uc_more_data_flag;
1245         }
1246 
1247         /***************************************************************/
1248         /* Get the required information for decoding of MB                  */
1249         /* mb_x, mb_y , neighbour availablity,                              */
1250         /***************************************************************/
1251         ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
1252 
1253         /***************************************************************/
1254         /* Set the deblocking parameters for this MB                   */
1255         /***************************************************************/
1256         if(ps_dec->u4_app_disable_deblk_frm == 0)
1257             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1258                                              ps_dec->u1_mb_ngbr_availablity,
1259                                              ps_dec->u1_cur_mb_fld_dec_flag);
1260 
1261         if(i2_mb_skip_run)
1262         {
1263             /* Set appropriate flags in ps_cur_mb_info and ps_dec */
1264             ps_dec->i1_prev_mb_qp_delta = 0;
1265             ps_dec->u1_sub_mb_num = 0;
1266             ps_cur_mb_info->u1_mb_type = MB_SKIP;
1267             ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
1268             ps_cur_mb_info->u1_cbp = 0;
1269 
1270             {
1271                 /* Storing Skip partition info */
1272                 parse_part_params_t *ps_part_info = ps_dec->ps_part;
1273                 ps_part_info->u1_is_direct = PART_DIRECT_16x16;
1274                 ps_part_info->u1_sub_mb_num = 0;
1275                 ps_dec->ps_part++;
1276             }
1277 
1278             /* Update Nnzs */
1279             ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
1280 
1281             ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1282             ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1283 
1284             i2_mb_skip_run--;
1285         }
1286         else
1287         {
1288             u1_read_mb_type = 0;
1289             /**************************************************************/
1290             /* Macroblock Layer Begins, Decode the u1_mb_type                */
1291             /**************************************************************/
1292             {
1293                 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
1294                 UWORD32 u4_word, u4_ldz, u4_temp;
1295 
1296 
1297                 //Inlined ih264d_uev
1298                 /***************************************************************/
1299                 /* Find leading zeros in next 32 bits                          */
1300                 /***************************************************************/
1301                 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1302                 u4_ldz = CLZ(u4_word);
1303                 /* Flush the ps_bitstrm */
1304                 u4_bitstream_offset += (u4_ldz + 1);
1305                 /* Read the suffix from the ps_bitstrm */
1306                 u4_word = 0;
1307                 if(u4_ldz)
1308                     GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
1309                             u4_ldz);
1310                 *pu4_bitstrm_ofst = u4_bitstream_offset;
1311                 u4_temp = ((1 << u4_ldz) + u4_word - 1);
1312                 //Inlined ih264d_uev
1313                 if(u4_temp > (UWORD32)(25 + u1_mb_threshold))
1314                     return ERROR_MB_TYPE;
1315                 u1_mb_type = u4_temp;
1316                 COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1317             }
1318             ps_cur_mb_info->u1_mb_type = u1_mb_type;
1319 
1320             /**************************************************************/
1321             /* Parse Macroblock data                                      */
1322             /**************************************************************/
1323             if(u1_mb_type < u1_mb_threshold)
1324             {
1325                 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1326 
1327                 ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs,
1328                                           u1_num_mbsNby2);
1329                 if(ret != OK)
1330                     return ret;
1331                 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1332             }
1333             else
1334             {
1335                 /* Storing Intra partition info */
1336                 ps_parse_mb_data->u1_num_part = 0;
1337                 ps_parse_mb_data->u1_isI_mb = 1;
1338 
1339                 if((25 + u1_mb_threshold) == u1_mb_type)
1340                 {
1341                     /* I_PCM_MB */
1342                     ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1343                     ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1344                     if(ret != OK)
1345                          return ret;
1346                     ps_dec->u1_qp = 0;
1347                 }
1348                 else
1349                 {
1350                     ret = ih264d_parse_imb_cavlc(
1351                                     ps_dec, ps_cur_mb_info, u1_num_mbs,
1352                                     (UWORD8)(u1_mb_type - u1_mb_threshold));
1353                     if(ret != OK)
1354                         return ret;
1355                 }
1356 
1357                 ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
1358             }
1359             uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1360         }
1361         ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1362 
1363         if(ps_dec->u1_enable_mb_info)
1364         {
1365             ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
1366                                         ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
1367         }
1368 
1369         if(u1_mbaff)
1370         {
1371             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1372             if(!uc_more_data_flag && !i2_mb_skip_run && (0 == (i2_cur_mb_addr & 1)))
1373             {
1374                 return ERROR_EOB_FLUSHBITS_T;
1375             }
1376         }
1377         /**************************************************************/
1378         /* Get next Macroblock address                                */
1379         /**************************************************************/
1380         i2_cur_mb_addr++;
1381 
1382         u1_num_mbs++;
1383         u1_num_mbsNby2++;
1384         ps_parse_mb_data++;
1385 
1386         /****************************************************************/
1387         /* Check for End Of Row and other flags that determine when to  */
1388         /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
1389         /* N-Mb                                                         */
1390         /****************************************************************/
1391         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1392         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1393         u1_slice_end = (!(uc_more_data_flag || i2_mb_skip_run));
1394         u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
1395                         || u1_slice_end;
1396         u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
1397         ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1398 
1399         /*u1_dma_nby2mb   = u1_decode_nmb ||
1400          (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/
1401 
1402 //if(u1_dma_nby2mb)
1403         if(u1_decode_nmb)
1404         {
1405             ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
1406             u1_num_mbsNby2 = 0;
1407 
1408             {
1409                 ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1410                 ps_dec->ps_part = ps_dec->ps_parse_part_params;
1411             }
1412         }
1413 
1414         /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d",
1415          ps_slice->i4_poc >> ps_slice->u1_field_pic_flag,
1416          ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb));
1417          H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d", u1_decode_nmb);*/
1418         if(u1_decode_nmb)
1419         {
1420 
1421 
1422 
1423             if(ps_dec->u1_separate_parse)
1424             {
1425                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1426                                      u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
1427                 ps_dec->ps_nmb_info +=  u1_num_mbs;
1428             }
1429             else
1430             {
1431                 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1432                                             u1_num_mbs_next, u1_tfr_n_mb,
1433                                             u1_end_of_row);
1434             }
1435             ps_dec->u2_total_mbs_coded += u1_num_mbs;
1436             if(u1_tfr_n_mb)
1437                 u1_num_mbs = 0;
1438             u1_mb_idx = u1_num_mbs;
1439             ps_dec->u1_mb_idx = u1_num_mbs;
1440 
1441         }
1442 //ps_dec->ps_pred++;
1443     }
1444 
1445     ps_dec->u4_num_mbs_cur_nmb = 0;
1446     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
1447                         - (u2_first_mb_in_slice << u1_mbaff);
1448 
1449 
1450     return ret;
1451 }
1452 
ih264d_mark_err_slice_skip(dec_struct_t * ps_dec,WORD32 num_mb_skip,UWORD8 u1_is_idr_slice,UWORD16 u2_frame_num,pocstruct_t * ps_cur_poc,WORD32 prev_slice_err)1453 WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec,
1454                                 WORD32 num_mb_skip,
1455                                 UWORD8 u1_is_idr_slice,
1456                                 UWORD16 u2_frame_num,
1457                                 pocstruct_t *ps_cur_poc,
1458                                 WORD32 prev_slice_err)
1459 {
1460     WORD32 i2_cur_mb_addr;
1461     UWORD32 u1_num_mbs, u1_num_mbsNby2;
1462     UWORD32 u1_mb_idx = ps_dec->u1_mb_idx;
1463     UWORD32 i2_mb_skip_run;
1464 
1465     UWORD32 u1_num_mbs_next, u1_end_of_row;
1466     const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1467     UWORD32 u1_slice_end;
1468     UWORD32 u1_tfr_n_mb;
1469     UWORD32 u1_decode_nmb;
1470     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1471     dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice;
1472     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1473     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1474     deblk_mb_t *ps_cur_deblk_mb;
1475     dec_mb_info_t *ps_cur_mb_info;
1476     parse_pmbarams_t *ps_parse_mb_data;
1477     UWORD32 u1_inter_mb_type;
1478     UWORD32 u1_deblk_mb_type;
1479     UWORD16 u2_total_mbs_coded;
1480     UWORD32 u1_mbaff;
1481     parse_part_params_t *ps_part_info;
1482     WORD32 ret;
1483     UNUSED(u1_is_idr_slice);
1484 
1485     if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
1486     {
1487         ih264d_err_pic_dispbuf_mgr(ps_dec);
1488         return 0;
1489     }
1490 
1491     if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag && (num_mb_skip & 1))
1492     {
1493         num_mb_skip++;
1494     }
1495     ps_dec->ps_dpb_cmds->u1_long_term_reference_flag = 0;
1496     if(prev_slice_err == 1)
1497     {
1498         /* first slice - missing/header corruption */
1499         ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num;
1500         {
1501             WORD32 i, j, poc = 0;
1502 
1503             ps_dec->ps_cur_slice->u2_first_mb_in_slice = 0;
1504 
1505             ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
1506             ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
1507             ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
1508 
1509             if(ps_dec->ps_cur_pic != NULL)
1510             {
1511                 poc = ps_dec->ps_cur_pic->i4_poc;
1512                 if (poc <= INT32_MAX - 2)
1513                     poc += 2;
1514             }
1515 
1516             j = -1;
1517             for(i = 0; i < MAX_NUM_PIC_PARAMS; i++)
1518             {
1519                    if(ps_dec->ps_pps[i].u1_is_valid == TRUE)
1520                    {
1521                        if(ps_dec->ps_pps[i].ps_sps->u1_is_valid == TRUE)
1522                        {
1523                            j = i;
1524                            break;
1525                        }
1526                    }
1527             }
1528 
1529             //if valid SPS PPS is not found return error
1530             if(j == -1)
1531             {
1532                 return ERROR_INV_SLICE_HDR_T;
1533             }
1534 
1535             /* call ih264d_start_of_pic only if it was not called earlier*/
1536             if(ps_dec->u4_pic_buf_got == 0)
1537             {
1538                 //initialize slice params required by ih264d_start_of_pic to valid values
1539                 ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
1540                 ps_dec->ps_cur_slice->u1_nal_ref_idc = 1;
1541                 ps_dec->ps_cur_slice->u1_nal_unit_type = 1;
1542                 ret = ih264d_start_of_pic(ps_dec, poc, ps_cur_poc,
1543                         ps_dec->ps_cur_slice->u2_frame_num,
1544                         &ps_dec->ps_pps[j]);
1545 
1546                 if(ret != OK)
1547                 {
1548                     return ret;
1549                 }
1550             }
1551 
1552             ps_dec->ps_ref_pic_buf_lx[0][0]->u1_pic_buf_id = 0;
1553 
1554             ps_dec->u4_output_present = 0;
1555 
1556             {
1557                 ih264d_get_next_display_field(ps_dec,
1558                                               ps_dec->ps_out_buffer,
1559                                               &(ps_dec->s_disp_op));
1560                 /* If error code is non-zero then there is no buffer available for display,
1561                  hence avoid format conversion */
1562 
1563                 if(0 != ps_dec->s_disp_op.u4_error_code)
1564                 {
1565                     ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
1566                 }
1567                 else
1568                     ps_dec->u4_output_present = 1;
1569             }
1570 
1571             if(ps_dec->u1_separate_parse == 1)
1572             {
1573                 if(ps_dec->u4_dec_thread_created == 0)
1574                 {
1575                     ithread_create(ps_dec->pv_dec_thread_handle, NULL,
1576                                    (void *)ih264d_decode_picture_thread,
1577                                    (void *)ps_dec);
1578 
1579                     ps_dec->u4_dec_thread_created = 1;
1580                 }
1581                 if(ps_dec->i4_threads_active)
1582                 {
1583                     ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]);
1584                     RETURN_IF((ret != IV_SUCCESS), ret);
1585 
1586                     ps_dec->ai4_process_start[0] = PROC_START;
1587                     ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[0]);
1588                     RETURN_IF((ret != IV_SUCCESS), ret);
1589 
1590                     ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]);
1591                     RETURN_IF((ret != IV_SUCCESS), ret);
1592                 }
1593 
1594                 if((ps_dec->u4_num_cores == 3) &&
1595                                 ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag)
1596                                 && (ps_dec->u4_bs_deblk_thread_created == 0))
1597                 {
1598                     ps_dec->u4_start_recon_deblk = 0;
1599                     ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL,
1600                                    (void *)ih264d_recon_deblk_thread,
1601                                    (void *)ps_dec);
1602                     ps_dec->u4_bs_deblk_thread_created = 1;
1603                 }
1604                 if(ps_dec->i4_threads_active)
1605                 {
1606                     if (ps_dec->u4_bs_deblk_thread_created)
1607                     {
1608                         ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]);
1609                         RETURN_IF((ret != IV_SUCCESS), ret);
1610 
1611                         ps_dec->ai4_process_start[1] = PROC_START;
1612                         ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[1]);
1613                         RETURN_IF((ret != IV_SUCCESS), ret);
1614 
1615                         ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]);
1616                         RETURN_IF((ret != IV_SUCCESS), ret);
1617                     }
1618                 }
1619             }
1620         }
1621     }
1622     else
1623     {
1624         // Middle / last slice
1625 
1626         dec_slice_struct_t *ps_parse_cur_slice;
1627         ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + ps_dec->u2_cur_slice_num;
1628 
1629         if(ps_dec->u1_slice_header_done
1630             && ps_parse_cur_slice == ps_dec->ps_parse_cur_slice)
1631         {
1632             // Slice data corrupted
1633             // in the case of mbaff, conceal from the even mb.
1634             if((ps_dec->ps_cur_slice->u1_mbaff_frame_flag) && (ps_dec->u4_num_mbs_cur_nmb & 1))
1635             {
1636                 ps_dec->u4_num_mbs_cur_nmb = ps_dec->u4_num_mbs_cur_nmb - 1;
1637                 ps_dec->u2_cur_mb_addr--;
1638             }
1639 
1640             u1_num_mbs = ps_dec->u4_num_mbs_cur_nmb;
1641             if(u1_num_mbs)
1642             {
1643                 ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs - 1;
1644             }
1645             else
1646             {
1647                 if(ps_dec->u1_separate_parse)
1648                 {
1649                     ps_cur_mb_info = ps_dec->ps_nmb_info;
1650                 }
1651                 else
1652                 {
1653                     ps_cur_mb_info = ps_dec->ps_nmb_info
1654                             + ps_dec->u4_num_mbs_prev_nmb - 1;
1655                 }
1656             }
1657 
1658             ps_dec->u2_mby = ps_cur_mb_info->u2_mby;
1659             ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx;
1660 
1661             ps_dec->u1_mb_ngbr_availablity =
1662                     ps_cur_mb_info->u1_mb_ngbr_availablity;
1663 
1664             if(u1_num_mbs)
1665             {
1666                 // Going back 1 mb
1667                 ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_prev_mb_parse_tu_coeff_data;
1668                 ps_dec->u2_cur_mb_addr--;
1669                 ps_dec->i4_submb_ofst -= SUB_BLK_SIZE;
1670 
1671                 // Parse/decode N-MB left unparsed
1672                 if (ps_dec->u1_pr_sl_type == P_SLICE
1673                         || ps_dec->u1_pr_sl_type == B_SLICE)
1674                 {
1675                     ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx,    u1_num_mbs);
1676                     ps_dec->ps_part = ps_dec->ps_parse_part_params;
1677                 }
1678 
1679                 u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1680                 u1_end_of_row = (!u1_num_mbs_next)
1681                         && (!(ps_dec->ps_cur_slice->u1_mbaff_frame_flag && (u1_num_mbs & 0x01)));
1682                 u1_slice_end = 1;
1683                 u1_tfr_n_mb = 1;
1684                 ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1685 
1686                 if(ps_dec->u1_separate_parse)
1687                 {
1688                     ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1689                             u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
1690                     ps_dec->ps_nmb_info += u1_num_mbs;
1691                 }
1692                 else
1693                 {
1694                     ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1695                             u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
1696                 }
1697                 ps_dec->u2_total_mbs_coded += u1_num_mbs;
1698                 ps_dec->u1_mb_idx = 0;
1699                 ps_dec->u4_num_mbs_cur_nmb = 0;
1700             }
1701 
1702             if(ps_dec->u2_total_mbs_coded
1703                     >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1704             {
1705                 ps_dec->u1_pic_decode_done = 1;
1706                 return 0;
1707             }
1708 
1709             /* Inserting new slice only if the current slice has atleast 1 MB*/
1710             if(ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice <
1711                     (UWORD32)(ps_dec->u2_total_mbs_coded >> ps_slice->u1_mbaff_frame_flag))
1712             {
1713                 ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1714                 ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1715                 ps_dec->u2_cur_slice_num++;
1716                 ps_dec->ps_parse_cur_slice++;
1717             }
1718 
1719         }
1720         else
1721         {
1722             // Slice missing / header corrupted
1723             ps_dec->ps_parse_cur_slice = ps_dec->ps_dec_slice_buf
1724                                             + ps_dec->u2_cur_slice_num;
1725         }
1726     }
1727 
1728     /******************************************************/
1729     /* Initializations to new slice                       */
1730     /******************************************************/
1731     {
1732         WORD32 num_entries;
1733         WORD32 size;
1734         UWORD8 *pu1_buf;
1735 
1736         num_entries = MAX_FRAMES;
1737         if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
1738             (0 == ps_dec->i4_display_delay))
1739         {
1740             num_entries = 1;
1741         }
1742         num_entries = ((2 * num_entries) + 1);
1743         num_entries *= 2;
1744 
1745         size = num_entries * sizeof(void *);
1746         size += PAD_MAP_IDX_POC * sizeof(void *);
1747 
1748         pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf;
1749         pu1_buf += size * ps_dec->u2_cur_slice_num;
1750         ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (volatile void **)pu1_buf;
1751     }
1752     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1753     ps_dec->ps_cur_slice->u2_first_mb_in_slice = ps_dec->u2_total_mbs_coded >> u1_mbaff;
1754     ps_dec->ps_cur_slice->i1_slice_alpha_c0_offset = 0;
1755     ps_dec->ps_cur_slice->i1_slice_beta_offset = 0;
1756 
1757     if(ps_dec->ps_cur_slice->u1_field_pic_flag)
1758         ps_dec->u2_prv_frame_num = ps_dec->ps_cur_slice->u2_frame_num;
1759 
1760     ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->u2_total_mbs_coded >> u1_mbaff;
1761     ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =    ps_dec->ps_cur_slice->u2_log2Y_crwd;
1762 
1763 
1764     if(ps_dec->u1_separate_parse)
1765     {
1766         ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
1767     }
1768     else
1769     {
1770         ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1771     }
1772 
1773     /******************************************************/
1774     /* Initializations specific to P slice                */
1775     /******************************************************/
1776     u1_inter_mb_type = P_MB;
1777     u1_deblk_mb_type = D_INTER_MB;
1778 
1779     ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
1780     ps_dec->ps_parse_cur_slice->slice_type = P_SLICE;
1781     ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
1782     ps_dec->ps_part = ps_dec->ps_parse_part_params;
1783     ps_dec->u2_mbx =
1784                     (MOD(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs));
1785     ps_dec->u2_mby =
1786                     (DIV(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs));
1787     ps_dec->u2_mby <<= u1_mbaff;
1788 
1789     /******************************************************/
1790     /* Parsing / decoding the slice                       */
1791     /******************************************************/
1792     ps_dec->u1_slice_header_done = 2;
1793     ps_dec->u1_qp = ps_slice->u1_slice_qp;
1794     ih264d_update_qp(ps_dec, 0);
1795     u1_mb_idx = ps_dec->u1_mb_idx;
1796     ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1797     u1_num_mbs = u1_mb_idx;
1798 
1799     u1_slice_end = 0;
1800     u1_tfr_n_mb = 0;
1801     u1_decode_nmb = 0;
1802     u1_num_mbsNby2 = 0;
1803     i2_cur_mb_addr = ps_dec->u2_total_mbs_coded;
1804     i2_mb_skip_run = num_mb_skip;
1805 
1806     while(!u1_slice_end)
1807     {
1808         UWORD8 u1_mb_type;
1809 
1810         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
1811             break;
1812 
1813         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1814         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1815 
1816         ps_cur_mb_info->u1_Mux = 0;
1817         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1818         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1819 
1820         ps_cur_mb_info->u1_end_of_slice = 0;
1821 
1822         /* Storing Default partition info */
1823         ps_parse_mb_data->u1_num_part = 1;
1824         ps_parse_mb_data->u1_isI_mb = 0;
1825 
1826         /**************************************************************/
1827         /* Get the required information for decoding of MB            */
1828         /**************************************************************/
1829         /* mb_x, mb_y, neighbor availablity, */
1830         if (u1_mbaff)
1831             ih264d_get_mb_info_cavlc_mbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
1832         else
1833             ih264d_get_mb_info_cavlc_nonmbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
1834 
1835         /* Set the deblocking parameters for this MB */
1836         if(ps_dec->u4_app_disable_deblk_frm == 0)
1837         {
1838             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1839                                              ps_dec->u1_mb_ngbr_availablity,
1840                                              ps_dec->u1_cur_mb_fld_dec_flag);
1841         }
1842 
1843         /* Set appropriate flags in ps_cur_mb_info and ps_dec */
1844         ps_dec->i1_prev_mb_qp_delta = 0;
1845         ps_dec->u1_sub_mb_num = 0;
1846         ps_cur_mb_info->u1_mb_type = MB_SKIP;
1847         ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
1848         ps_cur_mb_info->u1_cbp = 0;
1849 
1850         /* Storing Skip partition info */
1851         ps_part_info = ps_dec->ps_part;
1852         ps_part_info->u1_is_direct = PART_DIRECT_16x16;
1853         ps_part_info->u1_sub_mb_num = 0;
1854         ps_dec->ps_part++;
1855 
1856         /* Update Nnzs */
1857         ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
1858 
1859         ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1860         ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1861 
1862         i2_mb_skip_run--;
1863 
1864         ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1865 
1866         if (u1_mbaff)
1867         {
1868             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1869         }
1870 
1871         /**************************************************************/
1872         /* Get next Macroblock address                                */
1873         /**************************************************************/
1874         i2_cur_mb_addr++;
1875 
1876         u1_num_mbs++;
1877         u1_num_mbsNby2++;
1878         ps_parse_mb_data++;
1879 
1880         /****************************************************************/
1881         /* Check for End Of Row and other flags that determine when to  */
1882         /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
1883         /* N-Mb                                                         */
1884         /****************************************************************/
1885         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1886         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1887         u1_slice_end = !i2_mb_skip_run;
1888         u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
1889                         || u1_slice_end;
1890         u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
1891         ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1892 
1893         if(u1_decode_nmb)
1894         {
1895             ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
1896             u1_num_mbsNby2 = 0;
1897 
1898             ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1899             ps_dec->ps_part = ps_dec->ps_parse_part_params;
1900 
1901             if(ps_dec->u1_separate_parse)
1902             {
1903                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1904                                      u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
1905                 ps_dec->ps_nmb_info +=  u1_num_mbs;
1906             }
1907             else
1908             {
1909                 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
1910                                             u1_tfr_n_mb, u1_end_of_row);
1911             }
1912             ps_dec->u2_total_mbs_coded += u1_num_mbs;
1913             if(u1_tfr_n_mb)
1914                 u1_num_mbs = 0;
1915             u1_mb_idx = u1_num_mbs;
1916             ps_dec->u1_mb_idx = u1_num_mbs;
1917         }
1918     }
1919 
1920     ps_dec->u4_num_mbs_cur_nmb = 0;
1921     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
1922                         - ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice;
1923 
1924     H264_DEC_DEBUG_PRINT("Mbs in slice: %d\n", ps_dec->ps_cur_slice->u4_mbs_in_slice);
1925 
1926 
1927     /* incremented here only if first slice is inserted */
1928     if(ps_dec->u4_first_slice_in_pic != 0)
1929     {
1930         ps_dec->ps_parse_cur_slice++;
1931         ps_dec->u2_cur_slice_num++;
1932     }
1933 
1934     ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1935     ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1936 
1937     if(ps_dec->u2_total_mbs_coded
1938             >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1939     {
1940         ps_dec->u1_pic_decode_done = 1;
1941     }
1942 
1943     return 0;
1944 
1945 }
1946 
1947 /*!
1948  **************************************************************************
1949  * \if Function name : ih264d_decode_pslice \endif
1950  *
1951  * \brief
1952  *    Decodes a P Slice
1953  *
1954  *
1955  * \return
1956  *    0 on Success and Error code otherwise
1957  **************************************************************************
1958  */
ih264d_parse_pslice(dec_struct_t * ps_dec,UWORD16 u2_first_mb_in_slice)1959 WORD32 ih264d_parse_pslice(dec_struct_t *ps_dec, UWORD16 u2_first_mb_in_slice)
1960 {
1961     dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps;
1962     dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice;
1963     dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
1964     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1965     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1966     UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; //ps_dec->ps_cur_sps->u1_mb_aff_flag;
1967     UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
1968 
1969     UWORD64 u8_ref_idx_l0;
1970     UWORD32 u4_temp;
1971     WORD32 i_temp;
1972     WORD32 ret;
1973 
1974     /*--------------------------------------------------------------------*/
1975     /* Read remaining contents of the slice header                        */
1976     /*--------------------------------------------------------------------*/
1977     {
1978         WORD8 *pi1_buf;
1979         WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv;
1980         WORD32 *pi4_mv = (WORD32*)pi2_mv;
1981         WORD16 *pi16_refFrame;
1982 
1983         pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame;
1984         pi16_refFrame = (WORD16*)pi1_buf;
1985         *pi4_mv = 0;
1986         *(pi4_mv + 1) = 0;
1987         *pi16_refFrame = OUT_OF_RANGE_REF;
1988         ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8)-1;
1989         ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8)-1;
1990     }
1991 
1992     ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(
1993                     ps_bitstrm);
1994 
1995     COPYTHECONTEXT("SH: num_ref_idx_override_flag",
1996                     ps_cur_slice->u1_num_ref_idx_active_override_flag);
1997 
1998     u8_ref_idx_l0 = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0];
1999     if(ps_cur_slice->u1_num_ref_idx_active_override_flag)
2000     {
2001         u8_ref_idx_l0 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + (UWORD64)1;
2002     }
2003 
2004     {
2005         UWORD8 u1_max_ref_idx = H264_MAX_REF_PICS << u1_field_pic_flag;
2006         if(u8_ref_idx_l0 > u1_max_ref_idx)
2007         {
2008             return ERROR_NUM_REF;
2009         }
2010         ps_cur_slice->u1_num_ref_idx_lx_active[0] = u8_ref_idx_l0;
2011         COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1",
2012                         ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1);
2013 
2014     }
2015 
2016     {
2017         UWORD8 uc_refIdxReFlagL0 = ih264d_get_bit_h264(ps_bitstrm);
2018         COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0",uc_refIdxReFlagL0);
2019 
2020         ih264d_init_ref_idx_lx_p(ps_dec);
2021         /* Store the value for future slices in the same picture */
2022         ps_dec->u1_num_ref_idx_lx_active_prev =
2023                         ps_cur_slice->u1_num_ref_idx_lx_active[0];
2024 
2025         /* Modified temporarily */
2026         if(uc_refIdxReFlagL0)
2027         {
2028             WORD8 ret;
2029             ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
2030             ret = ih264d_ref_idx_reordering(ps_dec, 0);
2031             if(ret == -1)
2032                 return ERROR_REFIDX_ORDER_T;
2033             ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
2034         }
2035         else
2036             ps_dec->ps_ref_pic_buf_lx[0] =
2037                             ps_dec->ps_dpb_mgr->ps_init_dpb[0];
2038     }
2039     /* Create refIdx to POC mapping */
2040     {
2041         void **pui_map_ref_idx_to_poc_lx0, **pui_map_ref_idx_to_poc_lx1;
2042         WORD8 idx;
2043         struct pic_buffer_t *ps_pic;
2044 
2045         pui_map_ref_idx_to_poc_lx0 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0;
2046         pui_map_ref_idx_to_poc_lx0[0] = 0; //For ref_idx = -1
2047         pui_map_ref_idx_to_poc_lx0++;
2048         for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
2049         {
2050             ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
2051             pui_map_ref_idx_to_poc_lx0[idx] = (ps_pic->pu1_buf1);
2052         }
2053 
2054         /* Bug Fix Deblocking */
2055         pui_map_ref_idx_to_poc_lx1 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
2056         pui_map_ref_idx_to_poc_lx1[0] = 0;
2057 
2058         if(u1_mbaff)
2059         {
2060             void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b;
2061             void **ppv_map_ref_idx_to_poc_lx_t1, **ppv_map_ref_idx_to_poc_lx_b1;
2062             ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc
2063                             + TOP_LIST_FLD_L0;
2064             ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc
2065                             + BOT_LIST_FLD_L0;
2066 
2067             ppv_map_ref_idx_to_poc_lx_t[0] = 0; //  For ref_idx = -1
2068             ppv_map_ref_idx_to_poc_lx_t++;
2069             ppv_map_ref_idx_to_poc_lx_b[0] = 0; // For ref_idx = -1
2070             ppv_map_ref_idx_to_poc_lx_b++;
2071 
2072             idx = 0;
2073             for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
2074             {
2075                 ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
2076                 ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1);
2077                 ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1);
2078 
2079                 ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1;
2080                 ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1;
2081 
2082                 ppv_map_ref_idx_to_poc_lx_t += 2;
2083                 ppv_map_ref_idx_to_poc_lx_b += 2;
2084             }
2085             ppv_map_ref_idx_to_poc_lx_t1 = ps_dec->ppv_map_ref_idx_to_poc
2086                             + TOP_LIST_FLD_L1;
2087             ppv_map_ref_idx_to_poc_lx_t1[0] = 0;
2088             ppv_map_ref_idx_to_poc_lx_b1 = ps_dec->ppv_map_ref_idx_to_poc
2089                             + BOT_LIST_FLD_L1;
2090             ppv_map_ref_idx_to_poc_lx_b1[0] = 0;
2091 
2092         }
2093 
2094         if(ps_dec->u4_num_cores >= 3)
2095         {
2096             WORD32 num_entries;
2097             WORD32 size;
2098 
2099             num_entries = MAX_FRAMES;
2100             if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
2101                 (0 == ps_dec->i4_display_delay))
2102             {
2103                 num_entries = 1;
2104             }
2105             num_entries = ((2 * num_entries) + 1);
2106             num_entries *= 2;
2107 
2108             size = num_entries * sizeof(void *);
2109             size += PAD_MAP_IDX_POC * sizeof(void *);
2110 
2111             memcpy((void *)ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc,
2112                    ps_dec->ppv_map_ref_idx_to_poc,
2113                    size);
2114         }
2115 
2116 
2117     }
2118     if(ps_pps->u1_wted_pred_flag)
2119     {
2120         ret = ih264d_parse_pred_weight_table(ps_cur_slice, ps_bitstrm);
2121         if(ret != OK)
2122             return ret;
2123         ih264d_form_pred_weight_matrix(ps_dec);
2124         ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
2125     }
2126     else
2127     {
2128         ps_dec->ps_cur_slice->u2_log2Y_crwd = 0;
2129         ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
2130     }
2131 
2132     ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =
2133                     ps_dec->ps_cur_slice->u2_log2Y_crwd;
2134 
2135     if(u1_mbaff && (u1_field_pic_flag == 0))
2136     {
2137         ih264d_convert_frm_mbaff_list(ps_dec);
2138     }
2139 
2140     /* G050 */
2141     if(ps_cur_slice->u1_nal_ref_idc != 0)
2142     {
2143         if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
2144         {
2145             i_temp = ih264d_read_mmco_commands(ps_dec);
2146             if (i_temp < 0)
2147             {
2148                 return ERROR_DBP_MANAGER_T;
2149             }
2150             ps_dec->u4_bitoffset = i_temp;
2151         }
2152         else
2153             ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
2154 
2155     }
2156     /* G050 */
2157 
2158     if(ps_pps->u1_entropy_coding_mode == CABAC)
2159     {
2160         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2161 
2162         if(u4_temp > MAX_CABAC_INIT_IDC)
2163         {
2164             return ERROR_INV_SLICE_HDR_T;
2165         }
2166         ps_cur_slice->u1_cabac_init_idc = u4_temp;
2167         COPYTHECONTEXT("SH: cabac_init_idc",ps_cur_slice->u1_cabac_init_idc);
2168     }
2169     {
2170         WORD64 i8_temp;
2171         /* Read slice_qp_delta */
2172         i8_temp = (WORD64)ps_pps->u1_pic_init_qp
2173                             + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2174         if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP))
2175         {
2176             return ERROR_INV_RANGE_QP_T;
2177         }
2178         ps_cur_slice->u1_slice_qp = i8_temp;
2179         COPYTHECONTEXT("SH: slice_qp_delta",
2180                         (WORD8)(ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp));
2181     }
2182 
2183     if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
2184     {
2185         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2186         if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
2187         {
2188             return ERROR_INV_SLICE_HDR_T;
2189         }
2190 
2191         COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
2192         ps_cur_slice->u1_disable_dblk_filter_idc = u4_temp;
2193         if(u4_temp != 1)
2194         {
2195             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
2196                             << 1;
2197             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2198             {
2199                 return ERROR_INV_SLICE_HDR_T;
2200             }
2201             ps_cur_slice->i1_slice_alpha_c0_offset = i_temp;
2202             COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
2203                             ps_cur_slice->i1_slice_alpha_c0_offset >> 1);
2204 
2205             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
2206                             << 1;
2207             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2208             {
2209                 return ERROR_INV_SLICE_HDR_T;
2210             }
2211             ps_cur_slice->i1_slice_beta_offset = i_temp;
2212             COPYTHECONTEXT("SH: slice_beta_offset_div2",
2213                             ps_cur_slice->i1_slice_beta_offset >> 1);
2214         }
2215         else
2216         {
2217             ps_cur_slice->i1_slice_alpha_c0_offset = 0;
2218             ps_cur_slice->i1_slice_beta_offset = 0;
2219         }
2220     }
2221     else
2222     {
2223         ps_cur_slice->u1_disable_dblk_filter_idc = 0;
2224         ps_cur_slice->i1_slice_alpha_c0_offset = 0;
2225         ps_cur_slice->i1_slice_beta_offset = 0;
2226     }
2227 
2228     ps_dec->u1_slice_header_done = 2;
2229 
2230     if(ps_pps->u1_entropy_coding_mode)
2231     {
2232         SWITCHOFFTRACE; SWITCHONTRACECABAC;
2233         ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac;
2234         ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cabac;
2235         ih264d_init_cabac_contexts(P_SLICE, ps_dec);
2236 
2237         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
2238             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
2239         else
2240             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff;
2241     }
2242     else
2243     {
2244         SWITCHONTRACE; SWITCHOFFTRACECABAC;
2245         ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc;
2246         ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cavlc;
2247         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
2248         {
2249             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
2250         }
2251         else
2252             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff;
2253     }
2254 
2255     ps_dec->u1_B = 0;
2256     ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
2257     ret = ps_dec->pf_parse_inter_slice(ps_dec, ps_cur_slice, u2_first_mb_in_slice);
2258     if(ret != OK)
2259         return ret;
2260 //    ps_dec->curr_slice_in_error = 0 ;
2261     return OK;
2262 }
2263