• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright (C) 2022 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19  */
20 /**
21  *******************************************************************************
22  * @file
23  *  isvcd_parse_eislice.c
24  *
25  * @brief
26  *  Contains routines that decode a EI slice type
27  *
28  * @author
29  *  Kishore
30  *
31  * @par List of Functions:
32  *  - isvcd_parse_islice_data_cabac()
33  *  - isvcd_parse_islice_data_cavlc()
34  *  - isvcd_parse_imb_cavlc()
35  *  - isvcd_parse_eislice()
36  *  - isvcd_parse_eislice_data_cabac()
37  *  - isvcd_parse_eislice_data_cavlc()
38  *  - isvcd_parse_imb_cabac()
39  *  - isvcd_parse_islice()
40  *
41  * @remarks
42  *  None
43  *
44  *******************************************************************************
45  */
46 
47 #include <string.h>
48 #include "ih264_defs.h"
49 #include "ih264d_error_handler.h"
50 #include "ih264d_debug.h"
51 #include "ih264d_bitstrm.h"
52 #include "ih264d_defs.h"
53 #include "ih264d_tables.h"
54 #include "isvcd_structs.h"
55 #include "ih264d_parse_cavlc.h"
56 #include "ih264d_mb_utils.h"
57 #include "ih264d_deblocking.h"
58 #include "ih264d_cabac.h"
59 #include "ih264d_parse_cabac.h"
60 #include "ih264d_parse_mb_header.h"
61 #include "ih264d_parse_slice.h"
62 #include "ih264d_process_pslice.h"
63 #include "isvcd_process_epslice.h"
64 #include "ih264d_process_intra_mb.h"
65 #include "ih264d_parse_islice.h"
66 #include "ih264d_error_handler.h"
67 #include "ih264d_mvpred.h"
68 #include "ih264d_thread_parse_decode.h"
69 #include "ithread.h"
70 #include "ih264d_parse_mb_header.h"
71 #include "assert.h"
72 #include "ih264d_utils.h"
73 #include "ih264d_format_conv.h"
74 #include "ih264d_parse_headers.h"
75 #include "isvcd_parse_headers.h"
76 #include "isvcd_parse_slice.h"
77 #include "isvcd_mb_utils.h"
78 
79 void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t *ps_dec);
80 void isvcd_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t *ps_dec);
81 
82 /*****************************************************************************/
83 /*                                                                           */
84 /*  Function Name : isvcd_parse_islice_data_cabac                            */
85 /*                                                                           */
86 /*  Description   : This function parses cabac syntax of a inter slice on    */
87 /*                  N MB basis.                                              */
88 /*                                                                           */
89 /*  Inputs        : ps_dec                                                   */
90 /*                  sliceparams                                              */
91 /*                  firstMbInSlice                                           */
92 /*                                                                           */
93 /*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
94 /*                     decoded till the end of slice.                        */
95 /*                                                                           */
96 /*  Returns       : 0                                                        */
97 /*                                                                           */
98 /*  Issues        : <List any issues or problems with this function>         */
99 /*                                                                           */
100 /*  Revision History:                                                        */
101 /*                                                                           */
102 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
103 /*         24 06 2005   Kishore         Draft                                */
104 /*                                                                           */
105 /*****************************************************************************/
isvcd_parse_islice_data_cabac(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_slice_params_t * ps_slice,UWORD16 u2_first_mb_in_slice)106 WORD32 isvcd_parse_islice_data_cabac(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
107                                      dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice)
108 {
109     UWORD8 uc_more_data_flag;
110     UWORD8 u1_num_mbs, u1_mb_idx;
111     dec_mb_info_t *ps_cur_mb_info;
112     deblk_mb_t *ps_cur_deblk_mb;
113     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
114     dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
115     UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
116     WORD16 i2_cur_mb_addr;
117     UWORD8 u1_mbaff;
118     UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
119     WORD32 ret = OK;
120 
121     ps_dec->u1_qp = ps_slice->u1_slice_qp;
122     ih264d_update_qp(ps_dec, 0);
123     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
124 
125     if(ps_bitstrm->u4_ofst & 0x07)
126     {
127         ps_bitstrm->u4_ofst += 8;
128         ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
129     }
130     ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
131     if(ret != OK) return ret;
132     ih264d_init_cabac_contexts(I_SLICE, ps_dec);
133 
134     ps_dec->i1_prev_mb_qp_delta = 0;
135 
136     /* initializations */
137     u1_mb_idx = ps_dec->u1_mb_idx;
138     u1_num_mbs = u1_mb_idx;
139     uc_more_data_flag = 1;
140     i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
141     do
142     {
143         UWORD16 u2_mbx;
144         ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
145 
146         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
147         {
148             break;
149         }
150 
151         {
152             UWORD8 u1_mb_type;
153             ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
154             ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
155             ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
156             ps_cur_mb_info->u1_end_of_slice = 0;
157 
158             /***************************************************************/
159             /* Get the required information for decoding of MB                  */
160             /* mb_x, mb_y , neighbour availablity,                              */
161             /***************************************************************/
162             ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
163             u2_mbx = ps_dec->u2_mbx;
164 
165             /*********************************************************************/
166             /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
167             /*********************************************************************/
168             ps_cur_mb_info->u1_tran_form8x8 = 0;
169             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
170 
171             /***************************************************************/
172             /* Set the deblocking parameters for this MB                   */
173             /***************************************************************/
174             ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
175             if(ps_dec->u4_app_disable_deblk_frm == 0)
176                 ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
177                                                  ps_dec->u1_mb_ngbr_availablity,
178                                                  ps_dec->u1_cur_mb_fld_dec_flag);
179 
180             ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
181 
182             /* Macroblock Layer Begins */
183             /* Decode the u1_mb_type */
184             u1_mb_type = ih264d_parse_mb_type_intra_cabac(0, ps_dec);
185             if(u1_mb_type > 25) return ERROR_MB_TYPE;
186             ps_cur_mb_info->u1_mb_type = u1_mb_type;
187             COPYTHECONTEXT("u1_mb_type", u1_mb_type);
188 
189             /* Parse Macroblock Data */
190             if(25 == u1_mb_type)
191             {
192                 /* I_PCM_MB */
193                 ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
194                 ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
195                 if(ret != OK) return ret;
196                 ps_cur_deblk_mb->u1_mb_qp = 0;
197             }
198             else
199             {
200                 ret = ih264d_parse_imb_cabac(ps_dec, ps_cur_mb_info, u1_mb_type);
201                 if(ret != OK) return ret;
202                 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
203             }
204 
205             if(ps_dec->u1_enable_mb_info)
206             {
207                 ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
208                                             ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
209             }
210             if(u1_mbaff)
211             {
212                 ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
213             }
214 
215             if(ps_cur_mb_info->u1_topmb && u1_mbaff)
216                 uc_more_data_flag = 1;
217             else
218             {
219                 uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, ps_bitstrm);
220                 uc_more_data_flag = !uc_more_data_flag;
221                 COPYTHECONTEXT("Decode Sliceterm", !uc_more_data_flag);
222             }
223 
224             if(u1_mbaff)
225             {
226                 if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1)))
227                 {
228                     return ERROR_EOB_FLUSHBITS_T;
229                 }
230             }
231             /* Next macroblock information */
232             i2_cur_mb_addr++;
233             /* Store the colocated information */
234             {
235                 mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
236                 mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
237                 ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
238                                    (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
239             }
240             /*if num _cores is set to 3,compute bs will be done in another thread*/
241             if(ps_dec->u4_num_cores < 3)
242             {
243                 if(ps_dec->u4_app_disable_deblk_frm == 0)
244                     ps_svc_lyr_dec->pf_svc_compute_bs(ps_svc_lyr_dec, ps_cur_mb_info,
245                                                       (UWORD16) (u1_num_mbs >> u1_mbaff));
246             }
247             u1_num_mbs++;
248         }
249 
250         /****************************************************************/
251         /* Check for End Of Row                                         */
252         /****************************************************************/
253         u1_num_mbs_next = i2_pic_wdin_mbs - u2_mbx - 1;
254         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
255         u1_tfr_n_mb =
256             (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row || (!uc_more_data_flag);
257         ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
258 
259         if(u1_tfr_n_mb || (!uc_more_data_flag))
260         {
261             if(ps_dec->u1_separate_parse)
262             {
263                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
264                                      u1_end_of_row);
265                 ps_dec->ps_nmb_info += u1_num_mbs;
266                 ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
267             }
268             else
269             {
270                 if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
271                 {
272                     ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
273                                                 u1_tfr_n_mb, u1_end_of_row);
274                 }
275                 else
276                 {
277                     isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
278                                                         u1_num_mbs_next, u1_tfr_n_mb,
279                                                         u1_end_of_row);
280                 }
281             }
282             ps_dec->u2_total_mbs_coded += u1_num_mbs;
283             if(u1_tfr_n_mb) u1_num_mbs = 0;
284             u1_mb_idx = u1_num_mbs;
285             ps_dec->u1_mb_idx = u1_num_mbs;
286         }
287     } while(uc_more_data_flag);
288 
289     ps_dec->u4_num_mbs_cur_nmb = 0;
290     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
291 
292     return ret;
293 }
294 
295 /*****************************************************************************/
296 /*                                                                           */
297 /*  Function Name : isvcd_parse_islice_data_cavlc                            */
298 /*                                                                           */
299 /*  Description   : This function parses cabac syntax of a inter slice on    */
300 /*                  N MB basis.                                              */
301 /*                                                                           */
302 /*  Inputs        : ps_dec                                                   */
303 /*                  sliceparams                                              */
304 /*                  firstMbInSlice                                           */
305 /*                                                                           */
306 /*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
307 /*                     decoded till the end of slice.                        */
308 /*                                                                           */
309 /*  Returns       : 0                                                        */
310 /*                                                                           */
311 /*  Issues        : <List any issues or problems with this function>         */
312 /*                                                                           */
313 /*  Revision History:                                                        */
314 /*                                                                           */
315 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
316 /*         24 06 2005   Kishore         Draft                                */
317 /*                                                                           */
318 /*****************************************************************************/
319 
isvcd_parse_islice_data_cavlc(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_slice_params_t * ps_slice,UWORD16 u2_first_mb_in_slice)320 WORD32 isvcd_parse_islice_data_cavlc(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
321                                      dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice)
322 {
323     UWORD8 uc_more_data_flag;
324     UWORD8 u1_num_mbs, u1_mb_idx;
325     dec_mb_info_t *ps_cur_mb_info;
326     deblk_mb_t *ps_cur_deblk_mb;
327     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
328     dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
329     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
330     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
331     UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
332     WORD16 i2_cur_mb_addr;
333     UWORD8 u1_mbaff;
334     UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
335     WORD32 ret = OK;
336 
337     ps_dec->u1_qp = ps_slice->u1_slice_qp;
338     ih264d_update_qp(ps_dec, 0);
339     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
340 
341     /* initializations */
342     u1_mb_idx = ps_dec->u1_mb_idx;
343     u1_num_mbs = u1_mb_idx;
344 
345     uc_more_data_flag = 1;
346     i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
347     do
348     {
349         UWORD8 u1_mb_type;
350         ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
351         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
352         {
353             break;
354         }
355 
356         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
357         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
358         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
359         ps_cur_mb_info->u1_end_of_slice = 0;
360 
361         /***************************************************************/
362         /* Get the required information for decoding of MB             */
363         /* mb_x, mb_y , neighbour availablity,                         */
364         /***************************************************************/
365         ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
366 
367         /***************************************************************/
368         /* Set the deblocking parameters for this MB                   */
369         /***************************************************************/
370         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
371         if(ps_dec->u4_app_disable_deblk_frm == 0)
372             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
373                                              ps_dec->u1_mb_ngbr_availablity,
374                                              ps_dec->u1_cur_mb_fld_dec_flag);
375 
376         ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
377 
378         /**************************************************************/
379         /* Macroblock Layer Begins, Decode the u1_mb_type             */
380         /**************************************************************/
381         /* Inlined ih264d_uev */
382         {
383             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
384             UWORD32 u4_word, u4_ldz, u4_temp;
385 
386             /***************************************************************/
387             /* Find leading zeros in next 32 bits                          */
388             /***************************************************************/
389             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
390             u4_ldz = CLZ(u4_word);
391             /* Flush the ps_bitstrm */
392             u4_bitstream_offset += (u4_ldz + 1);
393             /* Read the suffix from the ps_bitstrm */
394             u4_word = 0;
395             if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
396             *pu4_bitstrm_ofst = u4_bitstream_offset;
397             u4_temp = ((1 << u4_ldz) + u4_word - 1);
398             if(u4_temp > 25) return ERROR_MB_TYPE;
399             u1_mb_type = u4_temp;
400         }
401         /* Inlined ih264d_uev */
402         ps_cur_mb_info->u1_mb_type = u1_mb_type;
403         COPYTHECONTEXT("u1_mb_type", u1_mb_type);
404 
405         /**************************************************************/
406         /* Parse Macroblock data                                      */
407         /**************************************************************/
408         if(25 == u1_mb_type)
409         {
410             /* I_PCM_MB */
411             ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
412             ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
413             if(ret != OK) return ret;
414             ps_cur_deblk_mb->u1_mb_qp = 0;
415         }
416         else
417         {
418             ret = ih264d_parse_imb_cavlc(ps_dec, ps_cur_mb_info, u1_num_mbs, u1_mb_type);
419             if(ret != OK) return ret;
420             ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
421         }
422         if(ps_dec->u1_enable_mb_info)
423         {
424             ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
425                                         ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
426         }
427         uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
428         if(u1_mbaff)
429         {
430             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
431             if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1)))
432             {
433                 return ERROR_EOB_FLUSHBITS_T;
434             }
435         }
436         /**************************************************************/
437         /* Get next Macroblock address                                */
438         /**************************************************************/
439         i2_cur_mb_addr++;
440         /* Store the colocated information */
441         {
442             mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
443             mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
444             ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
445                                (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
446         }
447 
448         /*if num _cores is set to 3,compute bs will be done in another thread*/
449         if(ps_dec->u4_num_cores < 3)
450         {
451             if(ps_dec->u4_app_disable_deblk_frm == 0)
452                 ps_svc_lyr_dec->pf_svc_compute_bs(ps_svc_lyr_dec, ps_cur_mb_info,
453                                                   (UWORD16) (u1_num_mbs >> u1_mbaff));
454         }
455         u1_num_mbs++;
456 
457         /****************************************************************/
458         /* Check for End Of Row                                         */
459         /****************************************************************/
460         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
461         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
462         u1_tfr_n_mb =
463             (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row || (!uc_more_data_flag);
464         ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
465 
466         if(u1_tfr_n_mb || (!uc_more_data_flag))
467         {
468             if(ps_dec->u1_separate_parse)
469             {
470                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
471                                      u1_end_of_row);
472                 ps_dec->ps_nmb_info += u1_num_mbs;
473                 ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
474             }
475             else
476             {
477                 if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
478                 {
479                     ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
480                                                 u1_tfr_n_mb, u1_end_of_row);
481                 }
482                 else
483                 {
484                     isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
485                                                         u1_num_mbs_next, u1_tfr_n_mb,
486                                                         u1_end_of_row);
487                 }
488             }
489             ps_dec->u2_total_mbs_coded += u1_num_mbs;
490             if(u1_tfr_n_mb) u1_num_mbs = 0;
491             u1_mb_idx = u1_num_mbs;
492             ps_dec->u1_mb_idx = u1_num_mbs;
493         }
494     } while(uc_more_data_flag);
495 
496     ps_dec->u4_num_mbs_cur_nmb = 0;
497     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
498 
499     return ret;
500 }
501 /*!
502 **************************************************************************
503 * \if Function name : ParseIMb \endif
504 *
505 * \brief
506 *    This function parses CAVLC syntax of a I MB. If 16x16 Luma DC transform
507 *    is also done here. Transformed Luma DC values are copied in their
508 *    0th pixel location of corrosponding CoeffBlock.
509 *
510 * \return
511 *    0 on Success and Error code otherwise
512 **************************************************************************
513 */
isvcd_parse_imb_cavlc(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info,dec_svc_mb_info_t * ps_svc_cur_mb_info,UWORD8 u1_mb_num,UWORD8 u1_mb_type)514 WORD32 isvcd_parse_imb_cavlc(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info,
515                              dec_svc_mb_info_t *ps_svc_cur_mb_info, UWORD8 u1_mb_num,
516                              UWORD8 u1_mb_type)
517 {
518     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
519     WORD32 i4_delta_qp;
520     UWORD32 u4_temp;
521     UWORD32 ui_is_top_mb_available;
522     UWORD32 ui_is_left_mb_available;
523     UWORD32 u4_cbp;
524     UWORD32 u4_offset;
525     UWORD32 *pu4_bitstrm_buf;
526     WORD32 ret;
527     dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
528     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
529     UNUSED(u1_mb_num);
530 
531     ps_cur_mb_info->u1_tran_form8x8 = 0;
532     ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
533     ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
534     u4_temp = ps_dec->u1_mb_ngbr_availablity;
535     ui_is_top_mb_available = BOOLEAN(u4_temp & TOP_MB_AVAILABLE_MASK);
536     ui_is_left_mb_available = BOOLEAN(u4_temp & LEFT_MB_AVAILABLE_MASK);
537     pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
538 
539     ps_cur_mb_info->ps_curmb->u1_mb_type = P_MB;
540     if(!ps_svc_cur_mb_info->u1_base_mode_flag)
541     {
542         if(u1_mb_type == I_4x4_MB)
543         {
544             ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
545             u4_offset = 0;
546 
547             /*--------------------------------------------------------------------*/
548             /* Read transform_size_8x8_flag if present                            */
549             /*--------------------------------------------------------------------*/
550             if(ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag)
551             {
552                 ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
553                 COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
554                 ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
555             }
556 
557             /*--------------------------------------------------------------------*/
558             /* Read the IntraPrediction modes for LUMA                            */
559             /*--------------------------------------------------------------------*/
560             if(!ps_cur_mb_info->u1_tran_form8x8)
561             {
562                 UWORD8 *pu1_temp;
563                 ih264d_read_intra_pred_modes(ps_dec, ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
564                                              ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 16),
565                                              ps_cur_mb_info->u1_tran_form8x8);
566                 pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
567                 pu1_temp += 32;
568                 ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
569             }
570             else
571             {
572                 UWORD8 *pu1_temp;
573                 ih264d_read_intra_pred_modes(ps_dec, ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
574                                              ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 4),
575                                              ps_cur_mb_info->u1_tran_form8x8);
576                 pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
577                 pu1_temp += 8;
578                 ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
579             }
580             /*--------------------------------------------------------------------*/
581             /* Read the IntraPrediction mode for CHROMA                           */
582             /*--------------------------------------------------------------------*/
583             /* Inlined ih264d_uev */
584             {
585                 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
586                 UWORD32 u4_word, u4_ldz, u4_temp;
587 
588                 /***************************************************************/
589                 /* Find leading zeros in next 32 bits                          */
590                 /***************************************************************/
591                 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
592                 u4_ldz = CLZ(u4_word);
593                 /* Flush the ps_bitstrm */
594                 u4_bitstream_offset += (u4_ldz + 1);
595                 /* Read the suffix from the ps_bitstrm */
596                 u4_word = 0;
597                 if(u4_ldz)
598                 {
599                     GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
600                 }
601                 *pu4_bitstrm_ofst = u4_bitstream_offset;
602                 u4_temp = ((1 << u4_ldz) + u4_word - 1);
603                 if(u4_temp > 3)
604                 {
605                     return ERROR_CHROMA_PRED_MODE;
606                 }
607                 ps_cur_mb_info->u1_chroma_pred_mode = u4_temp;
608                 COPYTHECONTEXT("intra_chroma_pred_mode", ps_cur_mb_info->u1_chroma_pred_mode);
609             }
610             /*--------------------------------------------------------------------*/
611             /* Read the Coded block pattern                                       */
612             /*--------------------------------------------------------------------*/
613             {
614                 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
615                 UWORD32 u4_word, u4_ldz;
616 
617                 /***************************************************************/
618                 /* Find leading zeros in next 32 bits                          */
619                 /***************************************************************/
620                 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
621                 u4_ldz = CLZ(u4_word);
622                 /* Flush the ps_bitstrm */
623                 u4_bitstream_offset += (u4_ldz + 1);
624                 /* Read the suffix from the ps_bitstrm */
625                 u4_word = 0;
626                 if(u4_ldz)
627                 {
628                     GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
629                 }
630                 *pu4_bitstrm_ofst = u4_bitstream_offset;
631                 u4_cbp = ((1 << u4_ldz) + u4_word - 1);
632             }
633             if(u4_cbp > 47)
634             {
635                 return ERROR_CBP;
636             }
637 
638             u4_cbp = gau1_ih264d_cbp_table[u4_cbp][0];
639             COPYTHECONTEXT("coded_block_pattern", u4_cbp);
640             ps_cur_mb_info->u1_cbp = u4_cbp;
641 
642             /*--------------------------------------------------------------------*/
643             /* Read mb_qp_delta                                                   */
644             /*--------------------------------------------------------------------*/
645             if(ps_cur_mb_info->u1_cbp)
646             {
647                 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
648                 UWORD32 u4_word, u4_ldz, u4_abs_val;
649 
650                 /***************************************************************/
651                 /* Find leading zeros in next 32 bits                          */
652                 /***************************************************************/
653                 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
654                 u4_ldz = CLZ(u4_word);
655 
656                 /* Flush the ps_bitstrm */
657                 u4_bitstream_offset += (u4_ldz + 1);
658 
659                 /* Read the suffix from the ps_bitstrm */
660                 u4_word = 0;
661                 if(u4_ldz)
662                 {
663                     GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
664                 }
665 
666                 *pu4_bitstrm_ofst = u4_bitstream_offset;
667                 u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
668 
669                 if(u4_word & 0x1)
670                 {
671                     i4_delta_qp = (-(WORD32) u4_abs_val);
672                 }
673                 else
674                 {
675                     i4_delta_qp = (u4_abs_val);
676                 }
677 
678                 if((i4_delta_qp < -26) || (i4_delta_qp > 25))
679                 {
680                     return ERROR_INV_RANGE_QP_T;
681                 }
682 
683                 COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
684                 if(i4_delta_qp != 0)
685                 {
686                     ret = ih264d_update_qp(ps_dec, (WORD8) i4_delta_qp);
687                     if(ret != OK) return ret;
688                 }
689             }
690         }
691         else
692         {
693             u4_offset = 1;
694             ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
695             /*-------------------------------------------------------------------*/
696             /* Read the IntraPrediction mode for CHROMA                          */
697             /*-------------------------------------------------------------------*/
698             {
699                 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
700                 UWORD32 u4_word, u4_ldz;
701 
702                 /***************************************************************/
703                 /* Find leading zeros in next 32 bits                          */
704                 /***************************************************************/
705                 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
706                 u4_ldz = CLZ(u4_word);
707                 /* Flush the ps_bitstrm */
708                 u4_bitstream_offset += (u4_ldz + 1);
709                 /* Read the suffix from the ps_bitstrm */
710                 u4_word = 0;
711                 if(u4_ldz)
712                 {
713                     GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
714                 }
715                 *pu4_bitstrm_ofst = u4_bitstream_offset;
716                 u4_temp = ((1 << u4_ldz) + u4_word - 1);
717 
718                 /* Inlined ih264d_uev */
719                 if(u4_temp > 3)
720                 {
721                     return ERROR_CHROMA_PRED_MODE;
722                 }
723                 ps_cur_mb_info->u1_chroma_pred_mode = u4_temp;
724                 COPYTHECONTEXT("intra_chroma_pred_mode", ps_cur_mb_info->u1_chroma_pred_mode);
725             }
726             /*-------------------------------------------------------------------*/
727             /* Read the Coded block pattern                                      */
728             /*-------------------------------------------------------------------*/
729             u4_cbp = gau1_ih264d_cbp_tab[(u1_mb_type - 1) >> 2];
730             ps_cur_mb_info->u1_cbp = u4_cbp;
731 
732             /*-------------------------------------------------------------------*/
733             /* Read mb_qp_delta                                                  */
734             /*-------------------------------------------------------------------*/
735             {
736                 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
737                 UWORD32 u4_word, u4_ldz, u4_abs_val;
738 
739                 /***************************************************************/
740                 /* Find leading zeros in next 32 bits                          */
741                 /***************************************************************/
742                 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
743                 u4_ldz = CLZ(u4_word);
744 
745                 /* Flush the ps_bitstrm */
746                 u4_bitstream_offset += (u4_ldz + 1);
747 
748                 /* Read the suffix from the ps_bitstrm */
749                 u4_word = 0;
750                 if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
751 
752                 *pu4_bitstrm_ofst = u4_bitstream_offset;
753                 u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
754 
755                 if(u4_word & 0x1)
756                     i4_delta_qp = (-(WORD32) u4_abs_val);
757                 else
758                     i4_delta_qp = (u4_abs_val);
759 
760                 if((i4_delta_qp < -26) || (i4_delta_qp > 25)) return ERROR_INV_RANGE_QP_T;
761             }
762             /* inlinined ih264d_sev */
763             COPYTHECONTEXT("Delta quant", i1_delta_qp);
764 
765             if(i4_delta_qp != 0)
766             {
767                 ret = ih264d_update_qp(ps_dec, (WORD8) i4_delta_qp);
768                 if(ret != OK) return ret;
769             }
770 
771             {
772                 WORD16 i_scaleFactor;
773                 UWORD32 ui_N = 0;
774                 WORD16 *pi2_scale_matrix_ptr;
775                 /*******************************************************************/
776                 /* for luma DC coefficients the scaling is done during the parsing */
777                 /* to preserve the precision                                       */
778                 /*******************************************************************/
779                 if(ps_dec->s_high_profile.u1_scaling_present)
780                 {
781                     pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist4x4[0];
782                 }
783                 else
784                 {
785                     i_scaleFactor = 16;
786                     pi2_scale_matrix_ptr = &i_scaleFactor;
787                 }
788 
789                 /*---------------------------------------------------------------*/
790                 /* Decode DC coefficients                                        */
791                 /*---------------------------------------------------------------*/
792                 /*---------------------------------------------------------------*/
793                 /* Calculation of N                                              */
794                 /*---------------------------------------------------------------*/
795                 if(ui_is_left_mb_available)
796                 {
797                     if(ui_is_top_mb_available)
798                     {
799                         ui_N = ((ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0] +
800                                  ps_dec->pu1_left_nnz_y[0] + 1) >>
801                                 1);
802                     }
803                     else
804                     {
805                         ui_N = ps_dec->pu1_left_nnz_y[0];
806                     }
807                 }
808                 else if(ui_is_top_mb_available)
809                 {
810                     ui_N = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0];
811                 }
812 
813                 {
814                     WORD16 pi2_dc_coef[16] = {0};
815                     WORD32 pi4_tmp[16] = {0};
816                     tu_sblk4x4_coeff_data_t *ps_tu_4x4 =
817                         (tu_sblk4x4_coeff_data_t *) ps_dec->pv_parse_tu_coeff_data;
818                     WORD16 *pi2_coeff_block = (WORD16 *) ps_dec->pv_parse_tu_coeff_data;
819                     UWORD32 u4_num_coeff;
820                     ps_tu_4x4->u2_sig_coeff_map = 0;
821                     ret = ps_dec->pf_cavlc_parse4x4coeff[(ui_N > 7)](pi2_dc_coef, 0, ui_N, ps_dec,
822                                                                      &u4_num_coeff);
823                     if(ret != OK) return ret;
824 
825                     if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
826                     if(ps_tu_4x4->u2_sig_coeff_map)
827                     {
828                         memset(pi2_dc_coef, 0, sizeof(pi2_dc_coef));
829                         ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4, pi2_dc_coef,
830                                                          ps_dec->pu1_inv_scan);
831 
832                         PROFILE_DISABLE_IQ_IT_RECON()
833                         ps_dec->pf_ihadamard_scaling_4x4(
834                             pi2_dc_coef, pi2_coeff_block, ps_dec->pu2_quant_scale_y,
835                             (UWORD16 *) pi2_scale_matrix_ptr, ps_dec->u1_qp_y_div6, pi4_tmp);
836                         pi2_coeff_block += 16;
837                         ps_dec->pv_parse_tu_coeff_data = (void *) pi2_coeff_block;
838                         SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 0);
839                     }
840                 }
841             }
842         }
843     }
844     else
845     {
846         ps_cur_mb_info->u1_tran_form8x8 = 0;
847         ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
848         u4_offset = 0;
849         /*--------------------------------------------------------------------*/
850         /* Read the Coded block pattern                                       */
851         /*--------------------------------------------------------------------*/
852         {
853             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
854             UWORD32 u4_word, u4_ldz;
855 
856             /***************************************************************/
857             /* Find leading zeros in next 32 bits                          */
858             /***************************************************************/
859             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
860             u4_ldz = CLZ(u4_word);
861             /* Flush the ps_bitstrm */
862             u4_bitstream_offset += (u4_ldz + 1);
863             /* Read the suffix from the ps_bitstrm */
864             u4_word = 0;
865             if(u4_ldz)
866             {
867                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
868             }
869             *pu4_bitstrm_ofst = u4_bitstream_offset;
870             u4_cbp = ((1 << u4_ldz) + u4_word - 1);
871         }
872         if(u4_cbp > 47)
873         {
874             return ERROR_CBP;
875         }
876 
877         /*  inter cbp table to be used for base mode flag*/
878         u4_cbp = gau1_ih264d_cbp_table[u4_cbp][1];
879         COPYTHECONTEXT("coded_block_pattern", u4_cbp);
880         ps_cur_mb_info->u1_cbp = u4_cbp;
881         ps_cur_mb_info->u1_tran_form8x8 = 0;
882         ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
883 
884         /*--------------------------------------------------------------------*/
885         /* Read transform_size_8x8_flag if present                            */
886         /*--------------------------------------------------------------------*/
887         if((ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag) && (ps_cur_mb_info->u1_cbp & 0xf))
888         {
889             ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
890             COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
891             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
892         }
893         /*--------------------------------------------------------------------*/
894         /* Read mb_qp_delta                                                   */
895         /*--------------------------------------------------------------------*/
896         if(ps_cur_mb_info->u1_cbp)
897         {
898             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
899             UWORD32 u4_word, u4_ldz, u4_abs_val;
900 
901             /***************************************************************/
902             /* Find leading zeros in next 32 bits                          */
903             /***************************************************************/
904             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
905             u4_ldz = CLZ(u4_word);
906 
907             /* Flush the ps_bitstrm */
908             u4_bitstream_offset += (u4_ldz + 1);
909 
910             /* Read the suffix from the ps_bitstrm */
911             u4_word = 0;
912             if(u4_ldz)
913             {
914                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
915             }
916 
917             *pu4_bitstrm_ofst = u4_bitstream_offset;
918             u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
919 
920             if(u4_word & 0x1)
921             {
922                 i4_delta_qp = (-(WORD32) u4_abs_val);
923             }
924             else
925             {
926                 i4_delta_qp = (u4_abs_val);
927             }
928 
929             if((i4_delta_qp < -26) || (i4_delta_qp > 25))
930             {
931                 return ERROR_INV_RANGE_QP_T;
932             }
933 
934             COPYTHECONTEXT("mb_qp_delta", i4_delta_qp);
935             if(i4_delta_qp != 0)
936             {
937                 ret = ih264d_update_qp(ps_dec, (WORD8) i4_delta_qp);
938                 if(ret != OK) return ret;
939             }
940         }
941     }
942     if(u4_cbp)
943     {
944         ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, (UWORD8) u4_offset);
945         if(ret != OK) return ret;
946         if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
947 
948         /* Store Left Mb NNZ and TOP chroma NNZ */
949     }
950     else
951     {
952         ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6;
953         ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6;
954         ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6;
955         ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6;
956         ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6;
957         ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6;
958         ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
959     }
960 
961     return OK;
962 }
963 
964 /*!
965 **************************************************************************
966 * \if Function name : ih264d_decode_eislice \endif
967 *
968 * \brief
969 *    Decodes an EI Slice
970 *
971 *
972 * \return
973 *    0 on Success and Error code otherwise
974 **************************************************************************
975 */
isvcd_parse_eislice(svc_dec_lyr_struct_t * ps_svc_lyr_dec,UWORD16 u2_first_mb_in_slice)976 WORD32 isvcd_parse_eislice(svc_dec_lyr_struct_t *ps_svc_lyr_dec, UWORD16 u2_first_mb_in_slice)
977 {
978     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
979     WORD32 i_status = OK;
980     dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
981     dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice;
982     dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
983     dec_seq_params_t *ps_seq;
984     dec_svc_seq_params_t *ps_subset_seq;
985     dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
986     dec_subset_seq_params_t *ps_sps_svc_ext = NULL;
987     dec_nal_unit_svc_ext_params_t *ps_nal_svc_ext = NULL;
988     UWORD32 u4_temp;
989     WORD32 i_temp;
990     WORD32 ret;
991     UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
992     UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
993 
994     ps_nal_svc_ext = ps_svc_lyr_dec->ps_nal_svc_ext;
995     ps_seq = ps_dec->ps_cur_sps;
996     ps_subset_seq =
997         &ps_svc_lyr_dec->ps_subset_sps[MAX_NUM_SEQ_PARAMS + ps_seq->u1_seq_parameter_set_id];
998     ps_sps_svc_ext = &ps_subset_seq->s_sps_svc_ext;
999     ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1000 
1001     if(0 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id)
1002     {
1003         /*--------------------------------------------------------------------*/
1004         /* Read remaining contents of the slice header                        */
1005         /*--------------------------------------------------------------------*/
1006         /* dec_ref_pic_marking function */
1007         /* G050 */
1008         if(ps_slice->u1_nal_ref_idc != 0)
1009         {
1010             if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
1011             {
1012                 dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1013                 dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps;
1014                 UWORD8 u1_nal_unit_type_tmp = ps_dec->u1_nal_unit_type;
1015 
1016                 ps_pps->ps_sps = ps_dec->ps_cur_sps;
1017                 if(ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag)
1018                     ps_dec->u1_nal_unit_type = IDR_SLICE_NAL;
1019 
1020                 i_temp = ih264d_read_mmco_commands(ps_dec);
1021 
1022                 ps_pps->ps_sps = ps_sps_tmp;
1023                 ps_dec->u1_nal_unit_type = u1_nal_unit_type_tmp;
1024                 if(i_temp < 0)
1025                 {
1026                     return ERROR_DBP_MANAGER_T;
1027                 }
1028                 ps_dec->u4_bitoffset = i_temp;
1029             }
1030             else
1031                 ps_dec->ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
1032 
1033             if(!ps_sps_svc_ext->u1_slice_header_restriction_flag)
1034             {
1035                 ps_svc_slice_params->u1_store_ref_base_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
1036                 COPYTHECONTEXT("SPS_SVC_EXT: u1_store_ref_base_pic_flag",
1037                                ps_svc_slice_params->u1_store_ref_base_pic_flag);
1038 
1039                 if(0 != ps_svc_slice_params->u1_store_ref_base_pic_flag)
1040                 {
1041                     return NOT_OK;
1042                 }
1043                 if(((1 == ps_nal_svc_ext->u1_use_ref_base_pic_flag) ||
1044                     (1 == ps_svc_slice_params->u1_store_ref_base_pic_flag)) &&
1045                    (!ps_nal_svc_ext->u1_idr_flag))
1046                 {
1047                     i_status = isvcd_dec_ref_base_pic_marking(
1048                         &ps_svc_slice_params->s_ref_base_pic_marking_svc_ext, ps_bitstrm);
1049                     if(i_status != OK)
1050                     {
1051                         return i_status;
1052                     }
1053                 }
1054             }
1055         }
1056     }
1057 
1058     {
1059         /* G050 */
1060         /* Read slice_qp_delta */
1061         WORD64 i8_temp =
1062             (WORD64) ps_pps->u1_pic_init_qp + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1063         if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) return ERROR_INV_RANGE_QP_T;
1064         ps_slice->u1_slice_qp = (UWORD8) i8_temp;
1065         COPYTHECONTEXT("Slice Header SVC ext: slice_qp_delta",
1066                        ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp);
1067     }
1068 
1069     if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
1070     {
1071         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1072         COPYTHECONTEXT("Slice Header SVC ext: disable_deblocking_filter_idc", u4_temp);
1073 
1074         if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
1075         {
1076             return ERROR_INV_SLICE_HDR_T;
1077         }
1078         ps_slice->u1_disable_dblk_filter_idc = u4_temp;
1079         if(u4_temp != 1)
1080         {
1081             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
1082             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
1083             {
1084                 return ERROR_INV_SLICE_HDR_T;
1085             }
1086             ps_slice->i1_slice_alpha_c0_offset = i_temp;
1087             COPYTHECONTEXT("Slice Header SVC ext: slice_alpha_c0_offset_div2",
1088                            ps_slice->i1_slice_alpha_c0_offset >> 1);
1089 
1090             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
1091             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
1092             {
1093                 return ERROR_INV_SLICE_HDR_T;
1094             }
1095             ps_slice->i1_slice_beta_offset = i_temp;
1096             COPYTHECONTEXT("Slice Header SVC ext: slice_beta_offset_div2",
1097                            ps_slice->i1_slice_beta_offset >> 1);
1098         }
1099         else
1100         {
1101             ps_slice->i1_slice_alpha_c0_offset = 0;
1102             ps_slice->i1_slice_beta_offset = 0;
1103         }
1104     }
1105     else
1106     {
1107         ps_slice->u1_disable_dblk_filter_idc = 0;
1108         ps_slice->i1_slice_alpha_c0_offset = 0;
1109         ps_slice->i1_slice_beta_offset = 0;
1110     }
1111 
1112     /* add the remaining part of the code for svc extension from reference */
1113     ret = isvcd_set_default_slice_header_ext(ps_svc_lyr_dec);
1114     if(ret != OK)
1115     {
1116         return ERROR_INV_SLICE_HDR_T;
1117     }
1118 
1119     ret = isvcd_parse_slice_header(ps_svc_lyr_dec);
1120     if(ret != OK)
1121     {
1122         return ERROR_INV_SLICE_HDR_T;
1123     }
1124 
1125     /* Initialization to check if number of motion vector per 2 Mbs */
1126     /* are exceeding the range or not */
1127     ps_dec->u2_mv_2mb[0] = 0;
1128     ps_dec->u2_mv_2mb[1] = 0;
1129 
1130     ret = isvcd_parse_interlayer_resamp_func_init(ps_svc_lyr_dec, u2_first_mb_in_slice);
1131     if(ret != OK)
1132     {
1133         return ERROR_CORRUPTED_SLICE;
1134     }
1135     /*set slice header cone to 2 ,to indicate  correct header*/
1136     ps_dec->u1_slice_header_done = 2;
1137 
1138     if(!ps_svc_slice_params->u1_slice_skip_flag)
1139     {
1140         if(ps_pps->u1_entropy_coding_mode)
1141         {
1142             SWITCHOFFTRACE;
1143             SWITCHONTRACECABAC;
1144             if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1145             {
1146                 ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
1147             }
1148             else
1149                 ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff;
1150 
1151             ret = isvcd_parse_eislice_data_cabac(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
1152             if(ret != OK) return ret;
1153             SWITCHONTRACE;
1154             SWITCHOFFTRACECABAC;
1155         }
1156         else
1157         {
1158             if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1159             {
1160                 ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
1161             }
1162             else
1163                 ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff;
1164             ret = isvcd_parse_eislice_data_cavlc(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
1165             if(ret != OK) return ret;
1166         }
1167     }
1168     else
1169     {
1170         return ERROR_FEATURE_UNAVAIL;
1171     }
1172 
1173     return OK;
1174 }
1175 
1176 /*****************************************************************************/
1177 /*                                                                           */
1178 /*  Function Name : isvcd_parse_eislice_data_cabac                          */
1179 /*                                                                           */
1180 /*  Description   : This function parses cabac syntax of a inter slice on    */
1181 /*                  N MB basis.                                              */
1182 /*                                                                           */
1183 /*  Inputs        : ps_dec                                                   */
1184 /*                  sliceparams                                              */
1185 /*                  firstMbInSlice                                           */
1186 /*                                                                           */
1187 /*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
1188 /*                     decoded till the end of slice.                        */
1189 /*                                                                           */
1190 /*  Returns       : 0                                                        */
1191 /*                                                                           */
1192 /*  Issues        : <List any issues or problems with this function>         */
1193 /*                                                                           */
1194 /*  Revision History:                                                        */
1195 /*                                                                           */
1196 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1197 /*         24 06 2005   Kishore         Draft                                */
1198 /*                                                                           */
1199 /*****************************************************************************/
isvcd_parse_eislice_data_cabac(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_slice_params_t * ps_slice,UWORD16 u2_first_mb_in_slice)1200 WORD32 isvcd_parse_eislice_data_cabac(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1201                                       dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice)
1202 {
1203     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1204     UWORD8 uc_more_data_flag;
1205     UWORD8 u1_num_mbs, u1_mb_idx;
1206     dec_mb_info_t *ps_cur_mb_info;
1207     dec_svc_mb_info_t *ps_svc_cur_mb_info;
1208     deblk_mb_t *ps_cur_deblk_mb;
1209     dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1210     UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1211     WORD16 i2_cur_mb_addr;
1212     UWORD8 u1_mbaff;
1213     UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
1214     WORD32 ret = OK;
1215     decoding_envirnoment_t *ps_cab_env;
1216     UWORD8 *pu1_cur_svc_base_mode_flag;
1217     UWORD8 u1_left_svc_base_mode_flag;
1218     UWORD8 u1_top_svc_base_mode_flag;
1219     UWORD32 u4_a, u4_b, u4_ctxt_inc;
1220     dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1221 
1222     ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1223     ps_dec->u1_qp = ps_slice->u1_slice_qp;
1224     ih264d_update_qp(ps_dec, 0);
1225     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1226 
1227     if(ps_bitstrm->u4_ofst & 0x07)
1228     {
1229         ps_bitstrm->u4_ofst += 8;
1230         ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
1231     }
1232     ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
1233     if(ret != OK) return ret;
1234     isvcd_init_cabac_contexts(I_SLICE, ps_dec);
1235     ps_dec->i1_prev_mb_qp_delta = 0;
1236     ps_cab_env = &ps_dec->s_cab_dec_env;
1237     /* initializations */
1238     u1_mb_idx = ps_dec->u1_mb_idx;
1239     u1_num_mbs = u1_mb_idx;
1240     uc_more_data_flag = 1;
1241     i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1242     do
1243     {
1244         UWORD16 u2_mbx;
1245         ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1246         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
1247         {
1248             break;
1249         }
1250 
1251         {
1252             UWORD8 u1_mb_type;
1253             ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1254             ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
1255             ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1256             ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1257             ps_cur_mb_info->u1_end_of_slice = 0;
1258             /***************************************************************/
1259             /* Get the required information for decoding of MB                  */
1260             /* mb_x, mb_y , neighbour availablity,                              */
1261             /***************************************************************/
1262             ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
1263             u2_mbx = ps_dec->u2_mbx;
1264             ps_svc_cur_mb_info->u1_crop_window_flag =
1265                 *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx +
1266                   (ps_cur_mb_info->u2_mby * ps_dec->u2_frm_wd_in_mbs));
1267             /*********************************************************************/
1268             /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
1269             /*********************************************************************/
1270             ps_cur_mb_info->u1_tran_form8x8 = 0;
1271             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1272             /***************************************************************/
1273             /* Set the deblocking parameters for this MB                   */
1274             /***************************************************************/
1275             ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1276             if(ps_dec->u4_app_disable_deblk_frm == 0)
1277                 ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1278                                                  ps_dec->u1_mb_ngbr_availablity,
1279                                                  ps_dec->u1_cur_mb_fld_dec_flag);
1280 
1281             ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1282             /* Macroblock Layer Begins */
1283             if(ps_svc_cur_mb_info->u1_crop_window_flag &&
1284                ps_svc_slice_params->u1_adaptive_base_mode_flag)
1285             {
1286                 pu1_cur_svc_base_mode_flag =
1287                     ps_svc_lyr_dec->pu1_svc_base_mode_flag + ps_cur_mb_info->u2_mbx;
1288                 pu1_cur_svc_base_mode_flag +=
1289                     ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride;
1290 
1291                 u1_left_svc_base_mode_flag = 0;
1292                 if(ps_dec->u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK)
1293                     u1_left_svc_base_mode_flag = *(pu1_cur_svc_base_mode_flag - 1);
1294 
1295                 u1_top_svc_base_mode_flag = 0;
1296                 if(ps_dec->u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK)
1297                     u1_top_svc_base_mode_flag =
1298                         *(pu1_cur_svc_base_mode_flag -
1299                           ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride);
1300 
1301                 u4_a = 1;
1302                 u4_b = 1;
1303 
1304                 if(u1_top_svc_base_mode_flag)
1305                 {
1306                     u4_a = 0;
1307                 }
1308 
1309                 if(u1_left_svc_base_mode_flag)
1310                 {
1311                     u4_b = 0;
1312                 }
1313 
1314                 u4_ctxt_inc = u4_a + u4_b;
1315                 ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_decode_bin(
1316                     u4_ctxt_inc, ps_svc_lyr_dec->ps_base_mode_flag, ps_bitstrm, ps_cab_env);
1317                 COPYTHECONTEXT("SVC ext: u1_base_mode_flag", ps_cur_mb_info->u1_base_mode_flag);
1318                 *pu1_cur_svc_base_mode_flag = ps_svc_cur_mb_info->u1_base_mode_flag;
1319             }
1320             else if(ps_svc_cur_mb_info->u1_crop_window_flag)
1321             {
1322                 ps_svc_cur_mb_info->u1_base_mode_flag =
1323                     ps_svc_slice_params->u1_default_base_mode_flag;
1324             }
1325 
1326             if(!ps_svc_cur_mb_info->u1_base_mode_flag)
1327             {
1328                 /* Decode the u1_mb_type */
1329                 u1_mb_type = ih264d_parse_mb_type_intra_cabac(0, ps_dec);
1330                 if(u1_mb_type > 25) return ERROR_MB_TYPE;
1331                 ps_cur_mb_info->u1_mb_type = u1_mb_type;
1332                 COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1333                 ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
1334             }
1335             else
1336             {
1337                 ps_cur_mb_info->u1_mb_type = MB_INFER;
1338                 ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_IBL;
1339             }
1340             /* Parse Macroblock Data */
1341             u1_mb_type = ps_cur_mb_info->u1_mb_type;
1342             if(25 == u1_mb_type)
1343             {
1344                 /* I_PCM_MB */
1345                 ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1346                 ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1347                 if(ret != OK) return ret;
1348                 ps_cur_deblk_mb->u1_mb_qp = 0;
1349             }
1350             else
1351             {
1352                 ret = isvcd_parse_imb_cabac(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info,
1353                                             u1_mb_type);
1354                 if(ret != OK) return ret;
1355                 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1356             }
1357 
1358             if(ps_dec->u1_enable_mb_info)
1359             {
1360                 ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
1361                                             ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
1362             }
1363             if(u1_mbaff)
1364             {
1365                 ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1366             }
1367 
1368             if(ps_cur_mb_info->u1_topmb && u1_mbaff)
1369                 uc_more_data_flag = 1;
1370             else
1371             {
1372                 uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, ps_bitstrm);
1373                 uc_more_data_flag = !uc_more_data_flag;
1374                 COPYTHECONTEXT("Decode Sliceterm", !uc_more_data_flag);
1375             }
1376 
1377             if(u1_mbaff)
1378             {
1379                 if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1)))
1380                 {
1381                     return ERROR_EOB_FLUSHBITS_T;
1382                 }
1383             }
1384             /* Next macroblock information */
1385             i2_cur_mb_addr++;
1386             /* Store the colocated information */
1387             {
1388                 mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
1389                 mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
1390                 if(ps_mv_nmb_start)
1391                 {
1392                     ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
1393                                        (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
1394                 }
1395                 else
1396                 {
1397                     return NOT_OK;
1398                 }
1399             }
1400 
1401             u1_num_mbs++;
1402         }
1403 
1404         /****************************************************************/
1405         /* Check for End Of Row                                         */
1406         /****************************************************************/
1407         u1_num_mbs_next = i2_pic_wdin_mbs - u2_mbx - 1;
1408         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1409         u1_tfr_n_mb =
1410             (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row || (!uc_more_data_flag);
1411         ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
1412 
1413         if(u1_tfr_n_mb || (!uc_more_data_flag))
1414         {
1415             if(ps_dec->u1_separate_parse)
1416             {
1417                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1418                                      u1_end_of_row);
1419                 ps_dec->ps_nmb_info += u1_num_mbs;
1420                 ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1421             }
1422             else
1423             {
1424                 ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1425                                                               u1_num_mbs_next, u1_tfr_n_mb,
1426                                                               u1_end_of_row);
1427                 if(ret != OK) return ret;
1428             }
1429             ps_dec->u2_total_mbs_coded += u1_num_mbs;
1430             if(u1_tfr_n_mb) u1_num_mbs = 0;
1431             u1_mb_idx = u1_num_mbs;
1432             ps_dec->u1_mb_idx = u1_num_mbs;
1433         }
1434     } while(uc_more_data_flag);
1435 
1436     ps_dec->u4_num_mbs_cur_nmb = 0;
1437     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1438 
1439     return ret;
1440 }
1441 
1442 /*****************************************************************************/
1443 /*                                                                           */
1444 /*  Function Name : isvcd_parse_eislice_data_cavlc */
1445 /*                                                                           */
1446 /*  Description   : This function parses cabac syntax of a inter slice on    */
1447 /*                  N MB basis.                                              */
1448 /*                                                                           */
1449 /*  Inputs        : ps_dec                                                   */
1450 /*                  sliceparams                                              */
1451 /*                  firstMbInSlice                                           */
1452 /*                                                                           */
1453 /*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
1454 /*                     decoded till the end of slice.                        */
1455 /*                                                                           */
1456 /*  Returns       : 0                                                        */
1457 /*                                                                           */
1458 /*  Issues        : <List any issues or problems with this function>         */
1459 /*                                                                           */
1460 /*  Revision History:                                                        */
1461 /*                                                                           */
1462 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1463 /*         24 06 2005   Kishore         Draft                                */
1464 /*                                                                           */
1465 /*****************************************************************************/
isvcd_parse_eislice_data_cavlc(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_slice_params_t * ps_slice,UWORD16 u2_first_mb_in_slice)1466 WORD32 isvcd_parse_eislice_data_cavlc(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1467                                       dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice)
1468 {
1469     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1470     UWORD8 uc_more_data_flag;
1471     UWORD8 u1_num_mbs, u1_mb_idx;
1472     dec_mb_info_t *ps_cur_mb_info;
1473     dec_svc_mb_info_t *ps_svc_cur_mb_info;
1474     deblk_mb_t *ps_cur_deblk_mb;
1475     dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1476     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1477     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1478     UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1479     WORD16 i2_cur_mb_addr;
1480     UWORD8 u1_mbaff;
1481     UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
1482     WORD32 ret = OK;
1483     dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1484 
1485     ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1486     ps_dec->u1_qp = ps_slice->u1_slice_qp;
1487     ih264d_update_qp(ps_dec, 0);
1488     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1489 
1490     u1_mb_idx = ps_dec->u1_mb_idx;
1491     u1_num_mbs = u1_mb_idx;
1492     uc_more_data_flag = 1;
1493     i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1494 
1495     do
1496     {
1497         UWORD8 u1_mb_type;
1498         ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1499         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
1500         {
1501             break;
1502         }
1503 
1504         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1505         ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
1506         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1507         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1508         ps_cur_mb_info->u1_end_of_slice = 0;
1509         /***************************************************************/
1510         /* Get the required information for decoding of MB             */
1511         /* mb_x, mb_y , neighbour availablity,                         */
1512         /***************************************************************/
1513         ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
1514         ps_svc_cur_mb_info->u1_crop_window_flag =
1515             *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx +
1516               (ps_cur_mb_info->u2_mby * ps_dec->u2_frm_wd_in_mbs));
1517 
1518         /***************************************************************/
1519         /* Set the deblocking parameters for this MB                   */
1520         /***************************************************************/
1521         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1522         if(ps_dec->u4_app_disable_deblk_frm == 0)
1523             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1524                                              ps_dec->u1_mb_ngbr_availablity,
1525                                              ps_dec->u1_cur_mb_fld_dec_flag);
1526 
1527         ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1528         if(ps_svc_cur_mb_info->u1_crop_window_flag &&
1529            ps_svc_slice_params->u1_adaptive_base_mode_flag)
1530         {
1531             ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_get_bit_h264(ps_bitstrm);
1532             COPYTHECONTEXT("SVC ext: u1_base_mode_flag", ps_cur_mb_info->u1_base_mode_flag);
1533         }
1534         else if(ps_svc_cur_mb_info->u1_crop_window_flag)
1535         {
1536             ps_svc_cur_mb_info->u1_base_mode_flag = ps_svc_slice_params->u1_default_base_mode_flag;
1537         }
1538 
1539         /**************************************************************/
1540         /* Macroblock Layer Begins, Decode the u1_mb_type                */
1541         /**************************************************************/
1542         if(!ps_svc_cur_mb_info->u1_base_mode_flag) /* Inlined ih264d_uev */
1543         {
1544             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
1545             UWORD32 u4_word, u4_ldz, u4_temp;
1546 
1547             /***************************************************************/
1548             /* Find leading zeros in next 32 bits                          */
1549             /***************************************************************/
1550             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1551             u4_ldz = CLZ(u4_word);
1552             /* Flush the ps_bitstrm */
1553             u4_bitstream_offset += (u4_ldz + 1);
1554             /* Read the suffix from the ps_bitstrm */
1555             u4_word = 0;
1556             if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
1557             *pu4_bitstrm_ofst = u4_bitstream_offset;
1558             u4_temp = ((1 << u4_ldz) + u4_word - 1);
1559             if(u4_temp > 25) return ERROR_MB_TYPE;
1560             u1_mb_type = u4_temp;
1561 
1562             /* Inlined ih264d_uev */
1563             ps_cur_mb_info->u1_mb_type = u1_mb_type;
1564             COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1565 
1566             ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
1567         }
1568         else
1569         {
1570             ps_cur_mb_info->u1_mb_type = MB_INFER;
1571             ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_IBL;
1572         }
1573 
1574         /**************************************************************/
1575         /* Parse Macroblock data                                      */
1576         /**************************************************************/
1577         u1_mb_type = ps_cur_mb_info->u1_mb_type;
1578         if(25 == u1_mb_type)
1579         {
1580             /* I_PCM_MB */
1581             ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1582             ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1583             if(ret != OK) return ret;
1584             ps_cur_deblk_mb->u1_mb_qp = 0;
1585         }
1586         else
1587         {
1588             ret = isvcd_parse_imb_cavlc(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info,
1589                                         u1_num_mbs, u1_mb_type);
1590             if(ret != OK) return ret;
1591             ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1592         }
1593 
1594         if(ps_dec->u1_enable_mb_info)
1595         {
1596             ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
1597                                         ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
1598         }
1599         uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1600 
1601         if(u1_mbaff)
1602         {
1603             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1604             if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1)))
1605             {
1606                 return ERROR_EOB_FLUSHBITS_T;
1607             }
1608         }
1609         /**************************************************************/
1610         /* Get next Macroblock address                                */
1611         /**************************************************************/
1612         i2_cur_mb_addr++;
1613         /* Store the colocated information */
1614         {
1615             mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
1616             mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
1617             if(ps_mv_nmb_start)
1618             {
1619                 ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
1620                                    (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
1621             }
1622             else
1623             {
1624                 return NOT_OK;
1625             }
1626         }
1627         u1_num_mbs++;
1628 
1629         /****************************************************************/
1630         /* Check for End Of Row                                         */
1631         /****************************************************************/
1632         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1633         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1634         u1_tfr_n_mb =
1635             (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row || (!uc_more_data_flag);
1636         ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
1637 
1638         if(u1_tfr_n_mb || (!uc_more_data_flag))
1639         {
1640             if(ps_dec->u1_separate_parse)
1641             {
1642                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1643                                      u1_end_of_row);
1644                 ps_dec->ps_nmb_info += u1_num_mbs;
1645                 ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1646             }
1647             else
1648             {
1649                 ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1650                                                               u1_num_mbs_next, u1_tfr_n_mb,
1651                                                               u1_end_of_row);
1652                 if(ret != OK) return ret;
1653             }
1654             ps_dec->u2_total_mbs_coded += u1_num_mbs;
1655             if(u1_tfr_n_mb) u1_num_mbs = 0;
1656             u1_mb_idx = u1_num_mbs;
1657             ps_dec->u1_mb_idx = u1_num_mbs;
1658         }
1659     } while(uc_more_data_flag);
1660 
1661     ps_dec->u4_num_mbs_cur_nmb = 0;
1662     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1663 
1664     return ret;
1665 }
1666 
1667 /*!
1668 **************************************************************************
1669 * \if Function name : ParseIMbCab \endif
1670 *
1671 * \brief
1672 *    This function parses CABAC syntax of a I MB. If 16x16 Luma DC transform
1673 *    is also done here. Transformed Luma DC values are copied in their
1674 *    0th pixel location of corrosponding CoeffBlock.
1675 *
1676 * \return
1677 *    0 on Success and Error code otherwise
1678 **************************************************************************
1679 */
isvcd_parse_imb_cabac(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info,dec_svc_mb_info_t * ps_svc_cur_mb_info,UWORD8 u1_mb_type)1680 WORD32 isvcd_parse_imb_cabac(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info,
1681                              dec_svc_mb_info_t *ps_svc_cur_mb_info, UWORD8 u1_mb_type)
1682 {
1683     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1684     WORD8 i1_delta_qp;
1685     UWORD8 u1_cbp;
1686     UWORD8 u1_offset;
1687     /* Variables for handling Cabac contexts */
1688     ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
1689     ctxt_inc_mb_info_t *ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
1690     dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1691     bin_ctxt_model_t *p_bin_ctxt;
1692     UWORD8 u1_intra_chrom_pred_mode;
1693     UWORD8 u1_dc_block_flag = 0;
1694     WORD32 ret;
1695 
1696     ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
1697 
1698     if(ps_left_ctxt == ps_dec->ps_def_ctxt_mb_info)
1699     {
1700         ps_dec->pu1_left_yuv_dc_csbp[0] = 0xf;
1701     }
1702 
1703     if(ps_dec->ps_cur_slice->u1_slice_type != I_SLICE)
1704     {
1705         MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
1706         *((UWORD32 *) ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
1707         MEMSET_16BYTES(p_curr_ctxt->u1_mv, 0);
1708         memset(p_curr_ctxt->i1_ref_idx, 0, 4);
1709     }
1710 
1711     /* default */
1712     ps_cur_mb_info->ps_curmb->u1_mb_type = P_MB;
1713     if(!ps_svc_cur_mb_info->u1_base_mode_flag)
1714     {
1715         if(u1_mb_type == I_4x4_MB)
1716         {
1717             ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
1718             p_curr_ctxt->u1_mb_type = CAB_I4x4;
1719             u1_offset = 0;
1720             ps_cur_mb_info->u1_tran_form8x8 = 0;
1721             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1722             /*--------------------------------------------------------------------*/
1723             /* Read transform_size_8x8_flag if present                            */
1724             /*--------------------------------------------------------------------*/
1725             if(ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag)
1726             {
1727                 ps_cur_mb_info->u1_tran_form8x8 =
1728                     ih264d_parse_transform8x8flag_cabac(ps_dec, ps_cur_mb_info);
1729                 COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
1730                 p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
1731                 ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
1732             }
1733             else
1734             {
1735                 p_curr_ctxt->u1_transform8x8_ctxt = 0;
1736             }
1737 
1738             /*--------------------------------------------------------------------*/
1739             /* Read the IntraPrediction modes for LUMA                            */
1740             /*--------------------------------------------------------------------*/
1741             if(!ps_cur_mb_info->u1_tran_form8x8)
1742             {
1743                 UWORD8 *pu1_temp;
1744                 ih264d_read_intra_pred_modes_cabac(ps_dec,
1745                                                    ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
1746                                                    ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 16),
1747                                                    ps_cur_mb_info->u1_tran_form8x8);
1748                 pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
1749                 pu1_temp += 32;
1750                 ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
1751             }
1752             else
1753             {
1754                 UWORD8 *pu1_temp;
1755                 ih264d_read_intra_pred_modes_cabac(ps_dec,
1756                                                    ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
1757                                                    ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 4),
1758                                                    ps_cur_mb_info->u1_tran_form8x8);
1759                 pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
1760                 pu1_temp += 8;
1761                 ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
1762             }
1763             /*--------------------------------------------------------------------*/
1764             /* Read the IntraPrediction mode for CHROMA                           */
1765             /*--------------------------------------------------------------------*/
1766             u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec);
1767             COPYTHECONTEXT("intra_chroma_pred_mode", u1_intra_chrom_pred_mode);
1768             p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode =
1769                 u1_intra_chrom_pred_mode;
1770 
1771             /*--------------------------------------------------------------------*/
1772             /* Read the Coded block pattern                                       */
1773             /*--------------------------------------------------------------------*/
1774             u1_cbp = ih264d_parse_ctx_cbp_cabac(ps_dec);
1775             COPYTHECONTEXT("coded_block_pattern", u1_cbp);
1776             ps_cur_mb_info->u1_cbp = u1_cbp;
1777             p_curr_ctxt->u1_cbp = u1_cbp;
1778 
1779             /*--------------------------------------------------------------------*/
1780             /* Read mb_qp_delta                                                   */
1781             /*--------------------------------------------------------------------*/
1782             if(ps_cur_mb_info->u1_cbp)
1783             {
1784                 ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
1785                 if(ret != OK) return ret;
1786                 COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
1787                 if(i1_delta_qp != 0)
1788                 {
1789                     ret = ih264d_update_qp(ps_dec, i1_delta_qp);
1790                     if(ret != OK) return ret;
1791                 }
1792             }
1793             else
1794                 ps_dec->i1_prev_mb_qp_delta = 0;
1795             p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
1796         }
1797         else
1798         {
1799             u1_offset = 1;
1800             ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
1801             p_curr_ctxt->u1_mb_type = CAB_I16x16;
1802             ps_cur_mb_info->u1_tran_form8x8 = 0;
1803             p_curr_ctxt->u1_transform8x8_ctxt = 0;
1804             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1805             /*--------------------------------------------------------------------*/
1806             /* Read the IntraPrediction mode for CHROMA                           */
1807             /*--------------------------------------------------------------------*/
1808             u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec);
1809             if(u1_intra_chrom_pred_mode > 3) return ERROR_CHROMA_PRED_MODE;
1810 
1811             COPYTHECONTEXT("Chroma intra_chroma_pred_mode pred mode", u1_intra_chrom_pred_mode);
1812             p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode =
1813                 u1_intra_chrom_pred_mode;
1814 
1815             /*--------------------------------------------------------------------*/
1816             /* Read the Coded block pattern                                       */
1817             /*--------------------------------------------------------------------*/
1818             u1_cbp = gau1_ih264d_cbp_tab[(u1_mb_type - 1) >> 2];
1819             ps_cur_mb_info->u1_cbp = u1_cbp;
1820             p_curr_ctxt->u1_cbp = u1_cbp;
1821 
1822             /*--------------------------------------------------------------------*/
1823             /* Read mb_qp_delta                                                   */
1824             /*--------------------------------------------------------------------*/
1825             ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
1826             if(ret != OK) return ret;
1827             COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
1828             if(i1_delta_qp != 0)
1829             {
1830                 ret = ih264d_update_qp(ps_dec, i1_delta_qp);
1831                 if(ret != OK) return ret;
1832             }
1833 
1834             {
1835                 WORD16 i_scaleFactor;
1836                 WORD16 *pi2_scale_matrix_ptr;
1837                 /*******************************************************************/
1838                 /* for luma DC coefficients the scaling is done during the parsing */
1839                 /* to preserve the precision                                       */
1840                 /*******************************************************************/
1841                 if(ps_dec->s_high_profile.u1_scaling_present)
1842                 {
1843                     pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist4x4[0];
1844                 }
1845                 else
1846                 {
1847                     i_scaleFactor = 16;
1848                     pi2_scale_matrix_ptr = &i_scaleFactor;
1849                 }
1850                 {
1851                     ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
1852                     UWORD8 uc_a, uc_b;
1853                     UWORD32 u4_ctx_inc;
1854                     INC_SYM_COUNT(&(ps_dec->s_cab_dec_env));
1855 
1856                     /* if MbAddrN not available then CondTermN = 1 */
1857                     uc_b = ((ps_top_ctxt->u1_yuv_dc_csbp) & 0x01);
1858 
1859                     /* if MbAddrN not available then CondTermN = 1 */
1860                     uc_a = ((ps_dec->pu1_left_yuv_dc_csbp[0]) & 0x01);
1861 
1862                     u4_ctx_inc = (uc_a + (uc_b << 1));
1863                     {
1864                         WORD16 pi2_dc_coef[16] = {0};
1865                         tu_sblk4x4_coeff_data_t *ps_tu_4x4 =
1866                             (tu_sblk4x4_coeff_data_t *) ps_dec->pv_parse_tu_coeff_data;
1867                         WORD16 *pi2_coeff_block = (WORD16 *) ps_dec->pv_parse_tu_coeff_data;
1868 
1869                         p_bin_ctxt = (ps_dec->p_cbf_t[LUMA_DC_CTXCAT]) + u4_ctx_inc;
1870 
1871                         u1_dc_block_flag = ih264d_read_coeff4x4_cabac(
1872                             ps_bitstrm, LUMA_DC_CTXCAT,
1873                             ps_dec->p_significant_coeff_flag_t[LUMA_DC_CTXCAT], ps_dec, p_bin_ctxt);
1874 
1875                         /* Store coded_block_flag */
1876                         p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
1877                         p_curr_ctxt->u1_yuv_dc_csbp |= u1_dc_block_flag;
1878                         if(u1_dc_block_flag)
1879                         {
1880                             WORD32 pi4_tmp[16] = {0};
1881                             memset(pi2_dc_coef, 0, sizeof(pi2_dc_coef));
1882                             ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4, pi2_dc_coef,
1883                                                              ps_dec->pu1_inv_scan);
1884 
1885                             PROFILE_DISABLE_IQ_IT_RECON()
1886                             ps_dec->pf_ihadamard_scaling_4x4(
1887                                 pi2_dc_coef, pi2_coeff_block, ps_dec->pu2_quant_scale_y,
1888                                 (UWORD16 *) pi2_scale_matrix_ptr, ps_dec->u1_qp_y_div6, pi4_tmp);
1889                             pi2_coeff_block += 16;
1890                             ps_dec->pv_parse_tu_coeff_data = (void *) pi2_coeff_block;
1891                             SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 0);
1892                         }
1893                     }
1894                 }
1895             }
1896         }
1897         ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
1898         ps_dec->pu1_left_yuv_dc_csbp[0] |= u1_dc_block_flag;
1899     }
1900     else
1901     {
1902         u1_offset = 0;
1903         /*--------------------------------------------------------------------*/
1904         /* Read the Coded block pattern                                       */
1905         /*--------------------------------------------------------------------*/
1906         u1_cbp = ih264d_parse_ctx_cbp_cabac(ps_dec);
1907         COPYTHECONTEXT("coded_block_pattern", u1_cbp);
1908 
1909         ps_cur_mb_info->u1_cbp = u1_cbp;
1910         p_curr_ctxt->u1_cbp = u1_cbp;
1911         p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
1912         ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
1913         p_curr_ctxt->u1_mb_type = CAB_INFERRED;
1914         p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
1915         ps_cur_mb_info->u1_tran_form8x8 = 0;
1916         ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1917 
1918         /*--------------------------------------------------------------------*/
1919         /* Read transform_size_8x8_flag if present                            */
1920         /*--------------------------------------------------------------------*/
1921         if((ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag) && (u1_cbp & 0xf))
1922         {
1923             ps_cur_mb_info->u1_tran_form8x8 =
1924                 ih264d_parse_transform8x8flag_cabac(ps_dec, ps_cur_mb_info);
1925             COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
1926             p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
1927             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
1928         }
1929         else
1930         {
1931             p_curr_ctxt->u1_transform8x8_ctxt = 0;
1932         }
1933 
1934         /*--------------------------------------------------------------------*/
1935         /* Read mb_qp_delta                                                   */
1936         /*--------------------------------------------------------------------*/
1937         if(ps_cur_mb_info->u1_cbp)
1938         {
1939             ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
1940             if(ret != OK) return ret;
1941             COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
1942             if(i1_delta_qp != 0)
1943             {
1944                 ret = ih264d_update_qp(ps_dec, i1_delta_qp);
1945                 if(ret != OK) return ret;
1946             }
1947         }
1948         else
1949             ps_dec->i1_prev_mb_qp_delta = 0;
1950     }
1951 
1952     ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, u1_offset);
1953     if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
1954     return OK;
1955 }
1956 
1957 /*!
1958 **************************************************************************
1959 * \if Function name : isvcd_decode_islice \endif
1960 *
1961 * \brief
1962 *    Decodes an I Slice
1963 *
1964 *
1965 * \return
1966 *    0 on Success and Error code otherwise
1967 **************************************************************************
1968 */
isvcd_parse_islice(svc_dec_lyr_struct_t * ps_svc_lyr_dec,UWORD16 u2_first_mb_in_slice)1969 WORD32 isvcd_parse_islice(svc_dec_lyr_struct_t *ps_svc_lyr_dec, UWORD16 u2_first_mb_in_slice)
1970 {
1971     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1972     dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1973     dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice;
1974     UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
1975     UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
1976     UWORD32 u4_temp;
1977     WORD32 i_temp;
1978     WORD32 ret;
1979 
1980     /*--------------------------------------------------------------------*/
1981     /* Read remaining contents of the slice header                        */
1982     /*--------------------------------------------------------------------*/
1983     /* dec_ref_pic_marking function */
1984     /* G050 */
1985     if(ps_slice->u1_nal_ref_idc != 0)
1986     {
1987         if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
1988         {
1989             dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1990             dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps;
1991             UWORD8 u1_nal_unit_type_tmp = ps_dec->u1_nal_unit_type;
1992 
1993             ps_pps->ps_sps = ps_dec->ps_cur_sps;
1994             if(ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag)
1995                 ps_dec->u1_nal_unit_type = IDR_SLICE_NAL;
1996 
1997             i_temp = ih264d_read_mmco_commands(ps_dec);
1998             ps_pps->ps_sps = ps_sps_tmp;
1999             ps_dec->u1_nal_unit_type = u1_nal_unit_type_tmp;
2000 
2001             if(i_temp < 0)
2002             {
2003                 return ERROR_DBP_MANAGER_T;
2004             }
2005             ps_dec->u4_bitoffset = i_temp;
2006         }
2007         else
2008             ps_dec->ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
2009     }
2010 
2011     {
2012         /* G050 */
2013         /* Read slice_qp_delta */
2014         WORD64 i8_temp =
2015             (WORD64) ps_pps->u1_pic_init_qp + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2016         if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) return ERROR_INV_RANGE_QP_T;
2017         ps_slice->u1_slice_qp = (UWORD8) i8_temp;
2018         COPYTHECONTEXT("SH: slice_qp_delta", ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp);
2019     }
2020     if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
2021     {
2022         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2023         COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
2024 
2025         if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
2026         {
2027             return ERROR_INV_SLICE_HDR_T;
2028         }
2029         ps_slice->u1_disable_dblk_filter_idc = u4_temp;
2030         if(u4_temp != 1)
2031         {
2032             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
2033             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2034             {
2035                 return ERROR_INV_SLICE_HDR_T;
2036             }
2037             ps_slice->i1_slice_alpha_c0_offset = i_temp;
2038             COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
2039                            ps_slice->i1_slice_alpha_c0_offset >> 1);
2040 
2041             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
2042             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2043             {
2044                 return ERROR_INV_SLICE_HDR_T;
2045             }
2046             ps_slice->i1_slice_beta_offset = i_temp;
2047             COPYTHECONTEXT("SH: slice_beta_offset_div2", ps_slice->i1_slice_beta_offset >> 1);
2048         }
2049         else
2050         {
2051             ps_slice->i1_slice_alpha_c0_offset = 0;
2052             ps_slice->i1_slice_beta_offset = 0;
2053         }
2054     }
2055     else
2056     {
2057         ps_slice->u1_disable_dblk_filter_idc = 0;
2058         ps_slice->i1_slice_alpha_c0_offset = 0;
2059         ps_slice->i1_slice_beta_offset = 0;
2060     }
2061 
2062     /* Initialization to check if number of motion vector per 2 Mbs */
2063     /* are exceeding the range or not */
2064     ps_dec->u2_mv_2mb[0] = 0;
2065     ps_dec->u2_mv_2mb[1] = 0;
2066 
2067     ret = isvcd_parse_interlayer_resamp_func_init(ps_svc_lyr_dec, u2_first_mb_in_slice);
2068     if(ret != OK)
2069     {
2070         return ERROR_CORRUPTED_SLICE;
2071     }
2072     /*set slice header cone to 2 ,to indicate  correct header*/
2073     ps_dec->u1_slice_header_done = 2;
2074     if(ps_pps->u1_entropy_coding_mode)
2075     {
2076         SWITCHOFFTRACE;
2077         SWITCHONTRACECABAC;
2078         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
2079         {
2080             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
2081         }
2082         else
2083             ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff;
2084 
2085         ret = isvcd_parse_islice_data_cabac(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
2086         if(ret != OK) return ret;
2087         SWITCHONTRACE;
2088         SWITCHOFFTRACECABAC;
2089     }
2090     else
2091     {
2092         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
2093         {
2094             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
2095         }
2096         else
2097             ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff;
2098         ret = isvcd_parse_islice_data_cavlc(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
2099         if(ret != OK) return ret;
2100     }
2101 
2102     return OK;
2103 }
2104