• 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         num_entries *= 2;
1700 
1701         size = num_entries * sizeof(void *);
1702         size += PAD_MAP_IDX_POC * sizeof(void *);
1703 
1704         pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf;
1705         pu1_buf += size * ps_dec->u2_cur_slice_num;
1706         ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (volatile void **)pu1_buf;
1707     }
1708     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1709     ps_dec->ps_cur_slice->u2_first_mb_in_slice = ps_dec->u2_total_mbs_coded >> u1_mbaff;
1710     ps_dec->ps_cur_slice->i1_slice_alpha_c0_offset = 0;
1711     ps_dec->ps_cur_slice->i1_slice_beta_offset = 0;
1712 
1713     if(ps_dec->ps_cur_slice->u1_field_pic_flag)
1714         ps_dec->u2_prv_frame_num = ps_dec->ps_cur_slice->u2_frame_num;
1715 
1716     ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->u2_total_mbs_coded >> u1_mbaff;
1717     ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =    ps_dec->ps_cur_slice->u2_log2Y_crwd;
1718 
1719 
1720     if(ps_dec->u1_separate_parse)
1721     {
1722         ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
1723     }
1724     else
1725     {
1726         ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1727     }
1728 
1729     /******************************************************/
1730     /* Initializations specific to P slice                */
1731     /******************************************************/
1732     u1_inter_mb_type = P_MB;
1733     u1_deblk_mb_type = D_INTER_MB;
1734 
1735     ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
1736     ps_dec->ps_parse_cur_slice->slice_type = P_SLICE;
1737     ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
1738     ps_dec->ps_part = ps_dec->ps_parse_part_params;
1739     ps_dec->u2_mbx =
1740                     (MOD(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs));
1741     ps_dec->u2_mby =
1742                     (DIV(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs));
1743     ps_dec->u2_mby <<= u1_mbaff;
1744 
1745     /******************************************************/
1746     /* Parsing / decoding the slice                       */
1747     /******************************************************/
1748     ps_dec->u1_slice_header_done = 2;
1749     ps_dec->u1_qp = ps_slice->u1_slice_qp;
1750     ih264d_update_qp(ps_dec, 0);
1751     u1_mb_idx = ps_dec->u1_mb_idx;
1752     ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1753     u1_num_mbs = u1_mb_idx;
1754 
1755     u1_slice_end = 0;
1756     u1_tfr_n_mb = 0;
1757     u1_decode_nmb = 0;
1758     u1_num_mbsNby2 = 0;
1759     i2_cur_mb_addr = ps_dec->u2_total_mbs_coded;
1760     i2_mb_skip_run = num_mb_skip;
1761 
1762     while(!u1_slice_end)
1763     {
1764         UWORD8 u1_mb_type;
1765 
1766         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
1767             break;
1768 
1769         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1770         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1771 
1772         ps_cur_mb_info->u1_Mux = 0;
1773         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1774         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1775 
1776         ps_cur_mb_info->u1_end_of_slice = 0;
1777 
1778         /* Storing Default partition info */
1779         ps_parse_mb_data->u1_num_part = 1;
1780         ps_parse_mb_data->u1_isI_mb = 0;
1781 
1782         /**************************************************************/
1783         /* Get the required information for decoding of MB            */
1784         /**************************************************************/
1785         /* mb_x, mb_y, neighbor availablity, */
1786         if (u1_mbaff)
1787             ih264d_get_mb_info_cavlc_mbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
1788         else
1789             ih264d_get_mb_info_cavlc_nonmbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
1790 
1791         /* Set the deblocking parameters for this MB */
1792         if(ps_dec->u4_app_disable_deblk_frm == 0)
1793         {
1794             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1795                                              ps_dec->u1_mb_ngbr_availablity,
1796                                              ps_dec->u1_cur_mb_fld_dec_flag);
1797         }
1798 
1799         /* Set appropriate flags in ps_cur_mb_info and ps_dec */
1800         ps_dec->i1_prev_mb_qp_delta = 0;
1801         ps_dec->u1_sub_mb_num = 0;
1802         ps_cur_mb_info->u1_mb_type = MB_SKIP;
1803         ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
1804         ps_cur_mb_info->u1_cbp = 0;
1805 
1806         /* Storing Skip partition info */
1807         ps_part_info = ps_dec->ps_part;
1808         ps_part_info->u1_is_direct = PART_DIRECT_16x16;
1809         ps_part_info->u1_sub_mb_num = 0;
1810         ps_dec->ps_part++;
1811 
1812         /* Update Nnzs */
1813         ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
1814 
1815         ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
1816         ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
1817 
1818         i2_mb_skip_run--;
1819 
1820         ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1821 
1822         if (u1_mbaff)
1823         {
1824             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1825         }
1826 
1827         /**************************************************************/
1828         /* Get next Macroblock address                                */
1829         /**************************************************************/
1830         i2_cur_mb_addr++;
1831 
1832         u1_num_mbs++;
1833         u1_num_mbsNby2++;
1834         ps_parse_mb_data++;
1835 
1836         /****************************************************************/
1837         /* Check for End Of Row and other flags that determine when to  */
1838         /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
1839         /* N-Mb                                                         */
1840         /****************************************************************/
1841         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1842         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1843         u1_slice_end = !i2_mb_skip_run;
1844         u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
1845                         || u1_slice_end;
1846         u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
1847         ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
1848 
1849         if(u1_decode_nmb)
1850         {
1851             ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
1852             u1_num_mbsNby2 = 0;
1853 
1854             ps_parse_mb_data = ps_dec->ps_parse_mb_data;
1855             ps_dec->ps_part = ps_dec->ps_parse_part_params;
1856 
1857             if(ps_dec->u1_separate_parse)
1858             {
1859                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1860                                      u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
1861                 ps_dec->ps_nmb_info +=  u1_num_mbs;
1862             }
1863             else
1864             {
1865                 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
1866                                             u1_tfr_n_mb, u1_end_of_row);
1867             }
1868             ps_dec->u2_total_mbs_coded += u1_num_mbs;
1869             if(u1_tfr_n_mb)
1870                 u1_num_mbs = 0;
1871             u1_mb_idx = u1_num_mbs;
1872             ps_dec->u1_mb_idx = u1_num_mbs;
1873         }
1874     }
1875 
1876     ps_dec->u4_num_mbs_cur_nmb = 0;
1877     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
1878                         - ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice;
1879 
1880     H264_DEC_DEBUG_PRINT("Mbs in slice: %d\n", ps_dec->ps_cur_slice->u4_mbs_in_slice);
1881 
1882 
1883     /* incremented here only if first slice is inserted */
1884     if(ps_dec->u4_first_slice_in_pic != 0)
1885     {
1886         ps_dec->ps_parse_cur_slice++;
1887         ps_dec->u2_cur_slice_num++;
1888     }
1889 
1890     ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1891     ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1892 
1893     if(ps_dec->u2_total_mbs_coded
1894             >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1895     {
1896         ps_dec->u1_pic_decode_done = 1;
1897     }
1898 
1899     return 0;
1900 
1901 }
1902 
1903 /*!
1904  **************************************************************************
1905  * \if Function name : ih264d_decode_pslice \endif
1906  *
1907  * \brief
1908  *    Decodes a P Slice
1909  *
1910  *
1911  * \return
1912  *    0 on Success and Error code otherwise
1913  **************************************************************************
1914  */
ih264d_parse_pslice(dec_struct_t * ps_dec,UWORD16 u2_first_mb_in_slice)1915 WORD32 ih264d_parse_pslice(dec_struct_t *ps_dec, UWORD16 u2_first_mb_in_slice)
1916 {
1917     dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps;
1918     dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice;
1919     dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
1920     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1921     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1922     UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; //ps_dec->ps_cur_sps->u1_mb_aff_flag;
1923     UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
1924 
1925     UWORD32 u4_temp;
1926     WORD32 i_temp;
1927     WORD32 ret;
1928 
1929     /*--------------------------------------------------------------------*/
1930     /* Read remaining contents of the slice header                        */
1931     /*--------------------------------------------------------------------*/
1932     {
1933         WORD8 *pi1_buf;
1934         WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv;
1935         WORD32 *pi4_mv = (WORD32*)pi2_mv;
1936         WORD16 *pi16_refFrame;
1937 
1938         pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame;
1939         pi16_refFrame = (WORD16*)pi1_buf;
1940         *pi4_mv = 0;
1941         *(pi4_mv + 1) = 0;
1942         *pi16_refFrame = OUT_OF_RANGE_REF;
1943         ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8)-1;
1944         ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8)-1;
1945     }
1946 
1947     ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(
1948                     ps_bitstrm);
1949 
1950     COPYTHECONTEXT("SH: num_ref_idx_override_flag",
1951                     ps_cur_slice->u1_num_ref_idx_active_override_flag);
1952 
1953     u4_temp = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0];
1954     if(ps_cur_slice->u1_num_ref_idx_active_override_flag)
1955     {
1956         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + 1;
1957     }
1958 
1959     {
1960 
1961 
1962 
1963         UWORD8 u1_max_ref_idx = MAX_FRAMES << u1_field_pic_flag;
1964         if(u4_temp > u1_max_ref_idx || u4_temp < 1)
1965         {
1966             return ERROR_NUM_REF;
1967         }
1968         ps_cur_slice->u1_num_ref_idx_lx_active[0] = u4_temp;
1969         COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1",
1970                         ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1);
1971 
1972     }
1973 
1974     {
1975         UWORD8 uc_refIdxReFlagL0 = ih264d_get_bit_h264(ps_bitstrm);
1976         COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0",uc_refIdxReFlagL0);
1977 
1978         ih264d_init_ref_idx_lx_p(ps_dec);
1979         /* Store the value for future slices in the same picture */
1980         ps_dec->u1_num_ref_idx_lx_active_prev =
1981                         ps_cur_slice->u1_num_ref_idx_lx_active[0];
1982 
1983         /* Modified temporarily */
1984         if(uc_refIdxReFlagL0)
1985         {
1986             WORD8 ret;
1987             ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
1988             ret = ih264d_ref_idx_reordering(ps_dec, 0);
1989             if(ret == -1)
1990                 return ERROR_REFIDX_ORDER_T;
1991             ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
1992         }
1993         else
1994             ps_dec->ps_ref_pic_buf_lx[0] =
1995                             ps_dec->ps_dpb_mgr->ps_init_dpb[0];
1996     }
1997     /* Create refIdx to POC mapping */
1998     {
1999         void **pui_map_ref_idx_to_poc_lx0, **pui_map_ref_idx_to_poc_lx1;
2000         WORD8 idx;
2001         struct pic_buffer_t *ps_pic;
2002 
2003         pui_map_ref_idx_to_poc_lx0 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0;
2004         pui_map_ref_idx_to_poc_lx0[0] = 0; //For ref_idx = -1
2005         pui_map_ref_idx_to_poc_lx0++;
2006         for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
2007         {
2008             ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
2009             pui_map_ref_idx_to_poc_lx0[idx] = (ps_pic->pu1_buf1);
2010         }
2011 
2012         /* Bug Fix Deblocking */
2013         pui_map_ref_idx_to_poc_lx1 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
2014         pui_map_ref_idx_to_poc_lx1[0] = 0;
2015 
2016         if(u1_mbaff)
2017         {
2018             void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b;
2019             void **ppv_map_ref_idx_to_poc_lx_t1, **ppv_map_ref_idx_to_poc_lx_b1;
2020             ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc
2021                             + TOP_LIST_FLD_L0;
2022             ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc
2023                             + BOT_LIST_FLD_L0;
2024 
2025             ppv_map_ref_idx_to_poc_lx_t[0] = 0; //  For ref_idx = -1
2026             ppv_map_ref_idx_to_poc_lx_t++;
2027             ppv_map_ref_idx_to_poc_lx_b[0] = 0; // For ref_idx = -1
2028             ppv_map_ref_idx_to_poc_lx_b++;
2029 
2030             idx = 0;
2031             for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
2032             {
2033                 ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
2034                 ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1);
2035                 ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1);
2036 
2037                 ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1;
2038                 ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1;
2039 
2040                 ppv_map_ref_idx_to_poc_lx_t += 2;
2041                 ppv_map_ref_idx_to_poc_lx_b += 2;
2042             }
2043             ppv_map_ref_idx_to_poc_lx_t1 = ps_dec->ppv_map_ref_idx_to_poc
2044                             + TOP_LIST_FLD_L1;
2045             ppv_map_ref_idx_to_poc_lx_t1[0] = 0;
2046             ppv_map_ref_idx_to_poc_lx_b1 = ps_dec->ppv_map_ref_idx_to_poc
2047                             + BOT_LIST_FLD_L1;
2048             ppv_map_ref_idx_to_poc_lx_b1[0] = 0;
2049 
2050         }
2051 
2052         if(ps_dec->u4_num_cores >= 3)
2053         {
2054             WORD32 num_entries;
2055             WORD32 size;
2056 
2057             num_entries = MAX_FRAMES;
2058             if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
2059                 (0 == ps_dec->i4_display_delay))
2060             {
2061                 num_entries = 1;
2062             }
2063             num_entries = ((2 * num_entries) + 1);
2064             num_entries *= 2;
2065 
2066             size = num_entries * sizeof(void *);
2067             size += PAD_MAP_IDX_POC * sizeof(void *);
2068 
2069             memcpy((void *)ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc,
2070                    ps_dec->ppv_map_ref_idx_to_poc,
2071                    size);
2072         }
2073 
2074 
2075     }
2076     if(ps_pps->u1_wted_pred_flag)
2077     {
2078         ret = ih264d_parse_pred_weight_table(ps_cur_slice, ps_bitstrm);
2079         if(ret != OK)
2080             return ret;
2081         ih264d_form_pred_weight_matrix(ps_dec);
2082         ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
2083     }
2084     else
2085     {
2086         ps_dec->ps_cur_slice->u2_log2Y_crwd = 0;
2087         ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
2088     }
2089 
2090     ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =
2091                     ps_dec->ps_cur_slice->u2_log2Y_crwd;
2092 
2093     if(u1_mbaff && (u1_field_pic_flag == 0))
2094     {
2095         ih264d_convert_frm_mbaff_list(ps_dec);
2096     }
2097 
2098     /* G050 */
2099     if(ps_cur_slice->u1_nal_ref_idc != 0)
2100     {
2101         if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
2102         {
2103             i_temp = ih264d_read_mmco_commands(ps_dec);
2104             if (i_temp < 0)
2105             {
2106                 return ERROR_DBP_MANAGER_T;
2107             }
2108             ps_dec->u4_bitoffset = i_temp;
2109         }
2110         else
2111             ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
2112 
2113     }
2114     /* G050 */
2115 
2116     if(ps_pps->u1_entropy_coding_mode == CABAC)
2117     {
2118         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2119 
2120         if(u4_temp > MAX_CABAC_INIT_IDC)
2121         {
2122             return ERROR_INV_SLICE_HDR_T;
2123         }
2124         ps_cur_slice->u1_cabac_init_idc = u4_temp;
2125         COPYTHECONTEXT("SH: cabac_init_idc",ps_cur_slice->u1_cabac_init_idc);
2126     }
2127 
2128     /* Read slice_qp_delta */
2129     i_temp = ps_pps->u1_pic_init_qp
2130                     + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2131     if((i_temp < 0) || (i_temp > 51))
2132     {
2133         return ERROR_INV_RANGE_QP_T;
2134     }
2135     ps_cur_slice->u1_slice_qp = i_temp;
2136     COPYTHECONTEXT("SH: slice_qp_delta",
2137                     (WORD8)(ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp));
2138 
2139     if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
2140     {
2141         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2142         if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
2143         {
2144             return ERROR_INV_SLICE_HDR_T;
2145         }
2146 
2147         COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
2148         ps_cur_slice->u1_disable_dblk_filter_idc = u4_temp;
2149         if(u4_temp != 1)
2150         {
2151             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
2152                             << 1;
2153             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2154             {
2155                 return ERROR_INV_SLICE_HDR_T;
2156             }
2157             ps_cur_slice->i1_slice_alpha_c0_offset = i_temp;
2158             COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
2159                             ps_cur_slice->i1_slice_alpha_c0_offset >> 1);
2160 
2161             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
2162                             << 1;
2163             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2164             {
2165                 return ERROR_INV_SLICE_HDR_T;
2166             }
2167             ps_cur_slice->i1_slice_beta_offset = i_temp;
2168             COPYTHECONTEXT("SH: slice_beta_offset_div2",
2169                             ps_cur_slice->i1_slice_beta_offset >> 1);
2170         }
2171         else
2172         {
2173             ps_cur_slice->i1_slice_alpha_c0_offset = 0;
2174             ps_cur_slice->i1_slice_beta_offset = 0;
2175         }
2176     }
2177     else
2178     {
2179         ps_cur_slice->u1_disable_dblk_filter_idc = 0;
2180         ps_cur_slice->i1_slice_alpha_c0_offset = 0;
2181         ps_cur_slice->i1_slice_beta_offset = 0;
2182     }
2183 
2184     ps_dec->u1_slice_header_done = 2;
2185 
2186     if(ps_pps->u1_entropy_coding_mode)
2187     {
2188         SWITCHOFFTRACE; SWITCHONTRACECABAC;
2189         ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac;
2190         ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cabac;
2191         ih264d_init_cabac_contexts(P_SLICE, ps_dec);
2192 
2193         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
2194             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
2195         else
2196             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff;
2197     }
2198     else
2199     {
2200         SWITCHONTRACE; SWITCHOFFTRACECABAC;
2201         ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc;
2202         ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cavlc;
2203         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
2204         {
2205             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
2206         }
2207         else
2208             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff;
2209     }
2210 
2211     ps_dec->u1_B = 0;
2212     ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
2213     ret = ps_dec->pf_parse_inter_slice(ps_dec, ps_cur_slice, u2_first_mb_in_slice);
2214     if(ret != OK)
2215         return ret;
2216 //    ps_dec->curr_slice_in_error = 0 ;
2217     return OK;
2218 }
2219