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