xref: /aosp_15_r20/external/libavc/decoder/svc/isvcd_parse_eislice.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
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     /*set slice header cone to 2 ,to indicate  correct header*/
1131     ps_dec->u1_slice_header_done = 2;
1132 
1133     if(!ps_svc_slice_params->u1_slice_skip_flag)
1134     {
1135         if(ps_pps->u1_entropy_coding_mode)
1136         {
1137             SWITCHOFFTRACE;
1138             SWITCHONTRACECABAC;
1139             if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1140             {
1141                 ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
1142             }
1143             else
1144                 ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff;
1145 
1146             ret = isvcd_parse_eislice_data_cabac(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
1147             if(ret != OK) return ret;
1148             SWITCHONTRACE;
1149             SWITCHOFFTRACECABAC;
1150         }
1151         else
1152         {
1153             if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1154             {
1155                 ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
1156             }
1157             else
1158                 ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff;
1159             ret = isvcd_parse_eislice_data_cavlc(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
1160             if(ret != OK) return ret;
1161         }
1162     }
1163     else
1164     {
1165         return ERROR_FEATURE_UNAVAIL;
1166     }
1167 
1168     return OK;
1169 }
1170 
1171 /*****************************************************************************/
1172 /*                                                                           */
1173 /*  Function Name : isvcd_parse_eislice_data_cabac                          */
1174 /*                                                                           */
1175 /*  Description   : This function parses cabac syntax of a inter slice on    */
1176 /*                  N MB basis.                                              */
1177 /*                                                                           */
1178 /*  Inputs        : ps_dec                                                   */
1179 /*                  sliceparams                                              */
1180 /*                  firstMbInSlice                                           */
1181 /*                                                                           */
1182 /*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
1183 /*                     decoded till the end of slice.                        */
1184 /*                                                                           */
1185 /*  Returns       : 0                                                        */
1186 /*                                                                           */
1187 /*  Issues        : <List any issues or problems with this function>         */
1188 /*                                                                           */
1189 /*  Revision History:                                                        */
1190 /*                                                                           */
1191 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1192 /*         24 06 2005   Kishore         Draft                                */
1193 /*                                                                           */
1194 /*****************************************************************************/
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)1195 WORD32 isvcd_parse_eislice_data_cabac(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1196                                       dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice)
1197 {
1198     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1199     UWORD8 uc_more_data_flag;
1200     UWORD8 u1_num_mbs, u1_mb_idx;
1201     dec_mb_info_t *ps_cur_mb_info;
1202     dec_svc_mb_info_t *ps_svc_cur_mb_info;
1203     deblk_mb_t *ps_cur_deblk_mb;
1204     dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1205     UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1206     WORD16 i2_cur_mb_addr;
1207     UWORD8 u1_mbaff;
1208     UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
1209     WORD32 ret = OK;
1210     decoding_envirnoment_t *ps_cab_env;
1211     UWORD8 *pu1_cur_svc_base_mode_flag;
1212     UWORD8 u1_left_svc_base_mode_flag;
1213     UWORD8 u1_top_svc_base_mode_flag;
1214     UWORD32 u4_a, u4_b, u4_ctxt_inc;
1215     dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1216 
1217     ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1218     ps_dec->u1_qp = ps_slice->u1_slice_qp;
1219     ih264d_update_qp(ps_dec, 0);
1220     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1221 
1222     if(ps_bitstrm->u4_ofst & 0x07)
1223     {
1224         ps_bitstrm->u4_ofst += 8;
1225         ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
1226     }
1227     ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
1228     if(ret != OK) return ret;
1229     isvcd_init_cabac_contexts(I_SLICE, ps_dec);
1230     ps_dec->i1_prev_mb_qp_delta = 0;
1231     ps_cab_env = &ps_dec->s_cab_dec_env;
1232     /* initializations */
1233     u1_mb_idx = ps_dec->u1_mb_idx;
1234     u1_num_mbs = u1_mb_idx;
1235     uc_more_data_flag = 1;
1236     i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1237     do
1238     {
1239         UWORD16 u2_mbx;
1240         ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1241         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
1242         {
1243             break;
1244         }
1245 
1246         {
1247             UWORD8 u1_mb_type;
1248             ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1249             ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
1250             ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1251             ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1252             ps_cur_mb_info->u1_end_of_slice = 0;
1253             /***************************************************************/
1254             /* Get the required information for decoding of MB                  */
1255             /* mb_x, mb_y , neighbour availablity,                              */
1256             /***************************************************************/
1257             ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
1258             u2_mbx = ps_dec->u2_mbx;
1259             ps_svc_cur_mb_info->u1_crop_window_flag =
1260                 *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx +
1261                   (ps_cur_mb_info->u2_mby * ps_dec->u2_frm_wd_in_mbs));
1262             /*********************************************************************/
1263             /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
1264             /*********************************************************************/
1265             ps_cur_mb_info->u1_tran_form8x8 = 0;
1266             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1267             /***************************************************************/
1268             /* Set the deblocking parameters for this MB                   */
1269             /***************************************************************/
1270             ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1271             if(ps_dec->u4_app_disable_deblk_frm == 0)
1272                 ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1273                                                  ps_dec->u1_mb_ngbr_availablity,
1274                                                  ps_dec->u1_cur_mb_fld_dec_flag);
1275 
1276             ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1277             /* Macroblock Layer Begins */
1278             if(ps_svc_cur_mb_info->u1_crop_window_flag &&
1279                ps_svc_slice_params->u1_adaptive_base_mode_flag)
1280             {
1281                 pu1_cur_svc_base_mode_flag =
1282                     ps_svc_lyr_dec->pu1_svc_base_mode_flag + ps_cur_mb_info->u2_mbx;
1283                 pu1_cur_svc_base_mode_flag +=
1284                     ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride;
1285 
1286                 u1_left_svc_base_mode_flag = 0;
1287                 if(ps_dec->u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK)
1288                     u1_left_svc_base_mode_flag = *(pu1_cur_svc_base_mode_flag - 1);
1289 
1290                 u1_top_svc_base_mode_flag = 0;
1291                 if(ps_dec->u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK)
1292                     u1_top_svc_base_mode_flag =
1293                         *(pu1_cur_svc_base_mode_flag -
1294                           ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride);
1295 
1296                 u4_a = 1;
1297                 u4_b = 1;
1298 
1299                 if(u1_top_svc_base_mode_flag)
1300                 {
1301                     u4_a = 0;
1302                 }
1303 
1304                 if(u1_left_svc_base_mode_flag)
1305                 {
1306                     u4_b = 0;
1307                 }
1308 
1309                 u4_ctxt_inc = u4_a + u4_b;
1310                 ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_decode_bin(
1311                     u4_ctxt_inc, ps_svc_lyr_dec->ps_base_mode_flag, ps_bitstrm, ps_cab_env);
1312                 COPYTHECONTEXT("SVC ext: u1_base_mode_flag", ps_cur_mb_info->u1_base_mode_flag);
1313                 *pu1_cur_svc_base_mode_flag = ps_svc_cur_mb_info->u1_base_mode_flag;
1314             }
1315             else if(ps_svc_cur_mb_info->u1_crop_window_flag)
1316             {
1317                 ps_svc_cur_mb_info->u1_base_mode_flag =
1318                     ps_svc_slice_params->u1_default_base_mode_flag;
1319             }
1320 
1321             if(!ps_svc_cur_mb_info->u1_base_mode_flag)
1322             {
1323                 /* Decode the u1_mb_type */
1324                 u1_mb_type = ih264d_parse_mb_type_intra_cabac(0, ps_dec);
1325                 if(u1_mb_type > 25) return ERROR_MB_TYPE;
1326                 ps_cur_mb_info->u1_mb_type = u1_mb_type;
1327                 COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1328                 ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
1329             }
1330             else
1331             {
1332                 ps_cur_mb_info->u1_mb_type = MB_INFER;
1333                 ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_IBL;
1334             }
1335             /* Parse Macroblock Data */
1336             u1_mb_type = ps_cur_mb_info->u1_mb_type;
1337             if(25 == u1_mb_type)
1338             {
1339                 /* I_PCM_MB */
1340                 ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1341                 ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1342                 if(ret != OK) return ret;
1343                 ps_cur_deblk_mb->u1_mb_qp = 0;
1344             }
1345             else
1346             {
1347                 ret = isvcd_parse_imb_cabac(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info,
1348                                             u1_mb_type);
1349                 if(ret != OK) return ret;
1350                 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1351             }
1352 
1353             if(ps_dec->u1_enable_mb_info)
1354             {
1355                 ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
1356                                             ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
1357             }
1358             if(u1_mbaff)
1359             {
1360                 ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1361             }
1362 
1363             if(ps_cur_mb_info->u1_topmb && u1_mbaff)
1364                 uc_more_data_flag = 1;
1365             else
1366             {
1367                 uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, ps_bitstrm);
1368                 uc_more_data_flag = !uc_more_data_flag;
1369                 COPYTHECONTEXT("Decode Sliceterm", !uc_more_data_flag);
1370             }
1371 
1372             if(u1_mbaff)
1373             {
1374                 if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1)))
1375                 {
1376                     return ERROR_EOB_FLUSHBITS_T;
1377                 }
1378             }
1379             /* Next macroblock information */
1380             i2_cur_mb_addr++;
1381             /* Store the colocated information */
1382             {
1383                 mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
1384                 mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
1385                 if(ps_mv_nmb_start)
1386                 {
1387                     ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
1388                                        (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
1389                 }
1390                 else
1391                 {
1392                     return NOT_OK;
1393                 }
1394             }
1395 
1396             u1_num_mbs++;
1397         }
1398 
1399         /****************************************************************/
1400         /* Check for End Of Row                                         */
1401         /****************************************************************/
1402         u1_num_mbs_next = i2_pic_wdin_mbs - u2_mbx - 1;
1403         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1404         u1_tfr_n_mb =
1405             (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row || (!uc_more_data_flag);
1406         ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
1407 
1408         if(u1_tfr_n_mb || (!uc_more_data_flag))
1409         {
1410             if(ps_dec->u1_separate_parse)
1411             {
1412                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1413                                      u1_end_of_row);
1414                 ps_dec->ps_nmb_info += u1_num_mbs;
1415                 ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1416             }
1417             else
1418             {
1419                 ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1420                                                               u1_num_mbs_next, u1_tfr_n_mb,
1421                                                               u1_end_of_row);
1422                 if(ret != OK) return ret;
1423             }
1424             ps_dec->u2_total_mbs_coded += u1_num_mbs;
1425             if(u1_tfr_n_mb) u1_num_mbs = 0;
1426             u1_mb_idx = u1_num_mbs;
1427             ps_dec->u1_mb_idx = u1_num_mbs;
1428         }
1429     } while(uc_more_data_flag);
1430 
1431     ps_dec->u4_num_mbs_cur_nmb = 0;
1432     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1433 
1434     return ret;
1435 }
1436 
1437 /*****************************************************************************/
1438 /*                                                                           */
1439 /*  Function Name : isvcd_parse_eislice_data_cavlc */
1440 /*                                                                           */
1441 /*  Description   : This function parses cabac syntax of a inter slice on    */
1442 /*                  N MB basis.                                              */
1443 /*                                                                           */
1444 /*  Inputs        : ps_dec                                                   */
1445 /*                  sliceparams                                              */
1446 /*                  firstMbInSlice                                           */
1447 /*                                                                           */
1448 /*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
1449 /*                     decoded till the end of slice.                        */
1450 /*                                                                           */
1451 /*  Returns       : 0                                                        */
1452 /*                                                                           */
1453 /*  Issues        : <List any issues or problems with this function>         */
1454 /*                                                                           */
1455 /*  Revision History:                                                        */
1456 /*                                                                           */
1457 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1458 /*         24 06 2005   Kishore         Draft                                */
1459 /*                                                                           */
1460 /*****************************************************************************/
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)1461 WORD32 isvcd_parse_eislice_data_cavlc(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1462                                       dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice)
1463 {
1464     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1465     UWORD8 uc_more_data_flag;
1466     UWORD8 u1_num_mbs, u1_mb_idx;
1467     dec_mb_info_t *ps_cur_mb_info;
1468     dec_svc_mb_info_t *ps_svc_cur_mb_info;
1469     deblk_mb_t *ps_cur_deblk_mb;
1470     dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1471     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1472     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1473     UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
1474     WORD16 i2_cur_mb_addr;
1475     UWORD8 u1_mbaff;
1476     UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
1477     WORD32 ret = OK;
1478     dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
1479 
1480     ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params;
1481     ps_dec->u1_qp = ps_slice->u1_slice_qp;
1482     ih264d_update_qp(ps_dec, 0);
1483     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
1484 
1485     u1_mb_idx = ps_dec->u1_mb_idx;
1486     u1_num_mbs = u1_mb_idx;
1487     uc_more_data_flag = 1;
1488     i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1489 
1490     do
1491     {
1492         UWORD8 u1_mb_type;
1493         ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1494         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
1495         {
1496             break;
1497         }
1498 
1499         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1500         ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs;
1501         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1502         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1503         ps_cur_mb_info->u1_end_of_slice = 0;
1504         /***************************************************************/
1505         /* Get the required information for decoding of MB             */
1506         /* mb_x, mb_y , neighbour availablity,                         */
1507         /***************************************************************/
1508         ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
1509         ps_svc_cur_mb_info->u1_crop_window_flag =
1510             *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx +
1511               (ps_cur_mb_info->u2_mby * ps_dec->u2_frm_wd_in_mbs));
1512 
1513         /***************************************************************/
1514         /* Set the deblocking parameters for this MB                   */
1515         /***************************************************************/
1516         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1517         if(ps_dec->u4_app_disable_deblk_frm == 0)
1518             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
1519                                              ps_dec->u1_mb_ngbr_availablity,
1520                                              ps_dec->u1_cur_mb_fld_dec_flag);
1521 
1522         ps_svc_cur_mb_info->u1_base_mode_flag = 0;
1523         if(ps_svc_cur_mb_info->u1_crop_window_flag &&
1524            ps_svc_slice_params->u1_adaptive_base_mode_flag)
1525         {
1526             ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_get_bit_h264(ps_bitstrm);
1527             COPYTHECONTEXT("SVC ext: u1_base_mode_flag", ps_cur_mb_info->u1_base_mode_flag);
1528         }
1529         else if(ps_svc_cur_mb_info->u1_crop_window_flag)
1530         {
1531             ps_svc_cur_mb_info->u1_base_mode_flag = ps_svc_slice_params->u1_default_base_mode_flag;
1532         }
1533 
1534         /**************************************************************/
1535         /* Macroblock Layer Begins, Decode the u1_mb_type                */
1536         /**************************************************************/
1537         if(!ps_svc_cur_mb_info->u1_base_mode_flag) /* Inlined ih264d_uev */
1538         {
1539             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
1540             UWORD32 u4_word, u4_ldz, u4_temp;
1541 
1542             /***************************************************************/
1543             /* Find leading zeros in next 32 bits                          */
1544             /***************************************************************/
1545             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1546             u4_ldz = CLZ(u4_word);
1547             /* Flush the ps_bitstrm */
1548             u4_bitstream_offset += (u4_ldz + 1);
1549             /* Read the suffix from the ps_bitstrm */
1550             u4_word = 0;
1551             if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
1552             *pu4_bitstrm_ofst = u4_bitstream_offset;
1553             u4_temp = ((1 << u4_ldz) + u4_word - 1);
1554             if(u4_temp > 25) return ERROR_MB_TYPE;
1555             u1_mb_type = u4_temp;
1556 
1557             /* Inlined ih264d_uev */
1558             ps_cur_mb_info->u1_mb_type = u1_mb_type;
1559             COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1560 
1561             ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
1562         }
1563         else
1564         {
1565             ps_cur_mb_info->u1_mb_type = MB_INFER;
1566             ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_IBL;
1567         }
1568 
1569         /**************************************************************/
1570         /* Parse Macroblock data                                      */
1571         /**************************************************************/
1572         u1_mb_type = ps_cur_mb_info->u1_mb_type;
1573         if(25 == u1_mb_type)
1574         {
1575             /* I_PCM_MB */
1576             ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1577             ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1578             if(ret != OK) return ret;
1579             ps_cur_deblk_mb->u1_mb_qp = 0;
1580         }
1581         else
1582         {
1583             ret = isvcd_parse_imb_cavlc(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info,
1584                                         u1_num_mbs, u1_mb_type);
1585             if(ret != OK) return ret;
1586             ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1587         }
1588 
1589         if(ps_dec->u1_enable_mb_info)
1590         {
1591             ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1,
1592                                         ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp);
1593         }
1594         uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
1595 
1596         if(u1_mbaff)
1597         {
1598             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1599             if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1)))
1600             {
1601                 return ERROR_EOB_FLUSHBITS_T;
1602             }
1603         }
1604         /**************************************************************/
1605         /* Get next Macroblock address                                */
1606         /**************************************************************/
1607         i2_cur_mb_addr++;
1608         /* Store the colocated information */
1609         {
1610             mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
1611             mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0};
1612             if(ps_mv_nmb_start)
1613             {
1614                 ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
1615                                    (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4);
1616             }
1617             else
1618             {
1619                 return NOT_OK;
1620             }
1621         }
1622         u1_num_mbs++;
1623 
1624         /****************************************************************/
1625         /* Check for End Of Row                                         */
1626         /****************************************************************/
1627         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
1628         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1629         u1_tfr_n_mb =
1630             (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row || (!uc_more_data_flag);
1631         ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
1632 
1633         if(u1_tfr_n_mb || (!uc_more_data_flag))
1634         {
1635             if(ps_dec->u1_separate_parse)
1636             {
1637                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb,
1638                                      u1_end_of_row);
1639                 ps_dec->ps_nmb_info += u1_num_mbs;
1640                 ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs;
1641             }
1642             else
1643             {
1644                 ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs,
1645                                                               u1_num_mbs_next, u1_tfr_n_mb,
1646                                                               u1_end_of_row);
1647                 if(ret != OK) return ret;
1648             }
1649             ps_dec->u2_total_mbs_coded += u1_num_mbs;
1650             if(u1_tfr_n_mb) u1_num_mbs = 0;
1651             u1_mb_idx = u1_num_mbs;
1652             ps_dec->u1_mb_idx = u1_num_mbs;
1653         }
1654     } while(uc_more_data_flag);
1655 
1656     ps_dec->u4_num_mbs_cur_nmb = 0;
1657     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff);
1658 
1659     return ret;
1660 }
1661 
1662 /*!
1663 **************************************************************************
1664 * \if Function name : ParseIMbCab \endif
1665 *
1666 * \brief
1667 *    This function parses CABAC syntax of a I MB. If 16x16 Luma DC transform
1668 *    is also done here. Transformed Luma DC values are copied in their
1669 *    0th pixel location of corrosponding CoeffBlock.
1670 *
1671 * \return
1672 *    0 on Success and Error code otherwise
1673 **************************************************************************
1674 */
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)1675 WORD32 isvcd_parse_imb_cabac(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info,
1676                              dec_svc_mb_info_t *ps_svc_cur_mb_info, UWORD8 u1_mb_type)
1677 {
1678     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1679     WORD8 i1_delta_qp;
1680     UWORD8 u1_cbp;
1681     UWORD8 u1_offset;
1682     /* Variables for handling Cabac contexts */
1683     ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
1684     ctxt_inc_mb_info_t *ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
1685     dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm;
1686     bin_ctxt_model_t *p_bin_ctxt;
1687     UWORD8 u1_intra_chrom_pred_mode;
1688     UWORD8 u1_dc_block_flag = 0;
1689     WORD32 ret;
1690 
1691     ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
1692 
1693     if(ps_left_ctxt == ps_dec->ps_def_ctxt_mb_info)
1694     {
1695         ps_dec->pu1_left_yuv_dc_csbp[0] = 0xf;
1696     }
1697 
1698     if(ps_dec->ps_cur_slice->u1_slice_type != I_SLICE)
1699     {
1700         MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
1701         *((UWORD32 *) ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
1702         MEMSET_16BYTES(p_curr_ctxt->u1_mv, 0);
1703         memset(p_curr_ctxt->i1_ref_idx, 0, 4);
1704     }
1705 
1706     /* default */
1707     ps_cur_mb_info->ps_curmb->u1_mb_type = P_MB;
1708     if(!ps_svc_cur_mb_info->u1_base_mode_flag)
1709     {
1710         if(u1_mb_type == I_4x4_MB)
1711         {
1712             ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
1713             p_curr_ctxt->u1_mb_type = CAB_I4x4;
1714             u1_offset = 0;
1715             ps_cur_mb_info->u1_tran_form8x8 = 0;
1716             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1717             /*--------------------------------------------------------------------*/
1718             /* Read transform_size_8x8_flag if present                            */
1719             /*--------------------------------------------------------------------*/
1720             if(ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag)
1721             {
1722                 ps_cur_mb_info->u1_tran_form8x8 =
1723                     ih264d_parse_transform8x8flag_cabac(ps_dec, ps_cur_mb_info);
1724                 COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
1725                 p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
1726                 ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
1727             }
1728             else
1729             {
1730                 p_curr_ctxt->u1_transform8x8_ctxt = 0;
1731             }
1732 
1733             /*--------------------------------------------------------------------*/
1734             /* Read the IntraPrediction modes for LUMA                            */
1735             /*--------------------------------------------------------------------*/
1736             if(!ps_cur_mb_info->u1_tran_form8x8)
1737             {
1738                 UWORD8 *pu1_temp;
1739                 ih264d_read_intra_pred_modes_cabac(ps_dec,
1740                                                    ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
1741                                                    ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 16),
1742                                                    ps_cur_mb_info->u1_tran_form8x8);
1743                 pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
1744                 pu1_temp += 32;
1745                 ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
1746             }
1747             else
1748             {
1749                 UWORD8 *pu1_temp;
1750                 ih264d_read_intra_pred_modes_cabac(ps_dec,
1751                                                    ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data),
1752                                                    ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 4),
1753                                                    ps_cur_mb_info->u1_tran_form8x8);
1754                 pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data;
1755                 pu1_temp += 8;
1756                 ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp;
1757             }
1758             /*--------------------------------------------------------------------*/
1759             /* Read the IntraPrediction mode for CHROMA                           */
1760             /*--------------------------------------------------------------------*/
1761             u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec);
1762             COPYTHECONTEXT("intra_chroma_pred_mode", u1_intra_chrom_pred_mode);
1763             p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode =
1764                 u1_intra_chrom_pred_mode;
1765 
1766             /*--------------------------------------------------------------------*/
1767             /* Read the Coded block pattern                                       */
1768             /*--------------------------------------------------------------------*/
1769             u1_cbp = ih264d_parse_ctx_cbp_cabac(ps_dec);
1770             COPYTHECONTEXT("coded_block_pattern", u1_cbp);
1771             ps_cur_mb_info->u1_cbp = u1_cbp;
1772             p_curr_ctxt->u1_cbp = u1_cbp;
1773 
1774             /*--------------------------------------------------------------------*/
1775             /* Read mb_qp_delta                                                   */
1776             /*--------------------------------------------------------------------*/
1777             if(ps_cur_mb_info->u1_cbp)
1778             {
1779                 ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
1780                 if(ret != OK) return ret;
1781                 COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
1782                 if(i1_delta_qp != 0)
1783                 {
1784                     ret = ih264d_update_qp(ps_dec, i1_delta_qp);
1785                     if(ret != OK) return ret;
1786                 }
1787             }
1788             else
1789                 ps_dec->i1_prev_mb_qp_delta = 0;
1790             p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
1791         }
1792         else
1793         {
1794             u1_offset = 1;
1795             ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
1796             p_curr_ctxt->u1_mb_type = CAB_I16x16;
1797             ps_cur_mb_info->u1_tran_form8x8 = 0;
1798             p_curr_ctxt->u1_transform8x8_ctxt = 0;
1799             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1800             /*--------------------------------------------------------------------*/
1801             /* Read the IntraPrediction mode for CHROMA                           */
1802             /*--------------------------------------------------------------------*/
1803             u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec);
1804             if(u1_intra_chrom_pred_mode > 3) return ERROR_CHROMA_PRED_MODE;
1805 
1806             COPYTHECONTEXT("Chroma intra_chroma_pred_mode pred mode", u1_intra_chrom_pred_mode);
1807             p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode =
1808                 u1_intra_chrom_pred_mode;
1809 
1810             /*--------------------------------------------------------------------*/
1811             /* Read the Coded block pattern                                       */
1812             /*--------------------------------------------------------------------*/
1813             u1_cbp = gau1_ih264d_cbp_tab[(u1_mb_type - 1) >> 2];
1814             ps_cur_mb_info->u1_cbp = u1_cbp;
1815             p_curr_ctxt->u1_cbp = u1_cbp;
1816 
1817             /*--------------------------------------------------------------------*/
1818             /* Read mb_qp_delta                                                   */
1819             /*--------------------------------------------------------------------*/
1820             ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
1821             if(ret != OK) return ret;
1822             COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
1823             if(i1_delta_qp != 0)
1824             {
1825                 ret = ih264d_update_qp(ps_dec, i1_delta_qp);
1826                 if(ret != OK) return ret;
1827             }
1828 
1829             {
1830                 WORD16 i_scaleFactor;
1831                 WORD16 *pi2_scale_matrix_ptr;
1832                 /*******************************************************************/
1833                 /* for luma DC coefficients the scaling is done during the parsing */
1834                 /* to preserve the precision                                       */
1835                 /*******************************************************************/
1836                 if(ps_dec->s_high_profile.u1_scaling_present)
1837                 {
1838                     pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist4x4[0];
1839                 }
1840                 else
1841                 {
1842                     i_scaleFactor = 16;
1843                     pi2_scale_matrix_ptr = &i_scaleFactor;
1844                 }
1845                 {
1846                     ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
1847                     UWORD8 uc_a, uc_b;
1848                     UWORD32 u4_ctx_inc;
1849                     INC_SYM_COUNT(&(ps_dec->s_cab_dec_env));
1850 
1851                     /* if MbAddrN not available then CondTermN = 1 */
1852                     uc_b = ((ps_top_ctxt->u1_yuv_dc_csbp) & 0x01);
1853 
1854                     /* if MbAddrN not available then CondTermN = 1 */
1855                     uc_a = ((ps_dec->pu1_left_yuv_dc_csbp[0]) & 0x01);
1856 
1857                     u4_ctx_inc = (uc_a + (uc_b << 1));
1858                     {
1859                         WORD16 pi2_dc_coef[16] = {0};
1860                         tu_sblk4x4_coeff_data_t *ps_tu_4x4 =
1861                             (tu_sblk4x4_coeff_data_t *) ps_dec->pv_parse_tu_coeff_data;
1862                         WORD16 *pi2_coeff_block = (WORD16 *) ps_dec->pv_parse_tu_coeff_data;
1863 
1864                         p_bin_ctxt = (ps_dec->p_cbf_t[LUMA_DC_CTXCAT]) + u4_ctx_inc;
1865 
1866                         u1_dc_block_flag = ih264d_read_coeff4x4_cabac(
1867                             ps_bitstrm, LUMA_DC_CTXCAT,
1868                             ps_dec->p_significant_coeff_flag_t[LUMA_DC_CTXCAT], ps_dec, p_bin_ctxt);
1869 
1870                         /* Store coded_block_flag */
1871                         p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
1872                         p_curr_ctxt->u1_yuv_dc_csbp |= u1_dc_block_flag;
1873                         if(u1_dc_block_flag)
1874                         {
1875                             WORD32 pi4_tmp[16] = {0};
1876                             memset(pi2_dc_coef, 0, sizeof(pi2_dc_coef));
1877                             ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4, pi2_dc_coef,
1878                                                              ps_dec->pu1_inv_scan);
1879 
1880                             PROFILE_DISABLE_IQ_IT_RECON()
1881                             ps_dec->pf_ihadamard_scaling_4x4(
1882                                 pi2_dc_coef, pi2_coeff_block, ps_dec->pu2_quant_scale_y,
1883                                 (UWORD16 *) pi2_scale_matrix_ptr, ps_dec->u1_qp_y_div6, pi4_tmp);
1884                             pi2_coeff_block += 16;
1885                             ps_dec->pv_parse_tu_coeff_data = (void *) pi2_coeff_block;
1886                             SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 0);
1887                         }
1888                     }
1889                 }
1890             }
1891         }
1892         ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
1893         ps_dec->pu1_left_yuv_dc_csbp[0] |= u1_dc_block_flag;
1894     }
1895     else
1896     {
1897         u1_offset = 0;
1898         /*--------------------------------------------------------------------*/
1899         /* Read the Coded block pattern                                       */
1900         /*--------------------------------------------------------------------*/
1901         u1_cbp = ih264d_parse_ctx_cbp_cabac(ps_dec);
1902         COPYTHECONTEXT("coded_block_pattern", u1_cbp);
1903 
1904         ps_cur_mb_info->u1_cbp = u1_cbp;
1905         p_curr_ctxt->u1_cbp = u1_cbp;
1906         p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
1907         ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
1908         p_curr_ctxt->u1_mb_type = CAB_INFERRED;
1909         p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
1910         ps_cur_mb_info->u1_tran_form8x8 = 0;
1911         ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1912 
1913         /*--------------------------------------------------------------------*/
1914         /* Read transform_size_8x8_flag if present                            */
1915         /*--------------------------------------------------------------------*/
1916         if((ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag) && (u1_cbp & 0xf))
1917         {
1918             ps_cur_mb_info->u1_tran_form8x8 =
1919                 ih264d_parse_transform8x8flag_cabac(ps_dec, ps_cur_mb_info);
1920             COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
1921             p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
1922             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
1923         }
1924         else
1925         {
1926             p_curr_ctxt->u1_transform8x8_ctxt = 0;
1927         }
1928 
1929         /*--------------------------------------------------------------------*/
1930         /* Read mb_qp_delta                                                   */
1931         /*--------------------------------------------------------------------*/
1932         if(ps_cur_mb_info->u1_cbp)
1933         {
1934             ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
1935             if(ret != OK) return ret;
1936             COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
1937             if(i1_delta_qp != 0)
1938             {
1939                 ret = ih264d_update_qp(ps_dec, i1_delta_qp);
1940                 if(ret != OK) return ret;
1941             }
1942         }
1943         else
1944             ps_dec->i1_prev_mb_qp_delta = 0;
1945     }
1946 
1947     ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, u1_offset);
1948     if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T;
1949     return OK;
1950 }
1951 
1952 /*!
1953 **************************************************************************
1954 * \if Function name : isvcd_decode_islice \endif
1955 *
1956 * \brief
1957 *    Decodes an I Slice
1958 *
1959 *
1960 * \return
1961 *    0 on Success and Error code otherwise
1962 **************************************************************************
1963 */
isvcd_parse_islice(svc_dec_lyr_struct_t * ps_svc_lyr_dec,UWORD16 u2_first_mb_in_slice)1964 WORD32 isvcd_parse_islice(svc_dec_lyr_struct_t *ps_svc_lyr_dec, UWORD16 u2_first_mb_in_slice)
1965 {
1966     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1967     dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1968     dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice;
1969     UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
1970     UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
1971     UWORD32 u4_temp;
1972     WORD32 i_temp;
1973     WORD32 ret;
1974 
1975     /*--------------------------------------------------------------------*/
1976     /* Read remaining contents of the slice header                        */
1977     /*--------------------------------------------------------------------*/
1978     /* dec_ref_pic_marking function */
1979     /* G050 */
1980     if(ps_slice->u1_nal_ref_idc != 0)
1981     {
1982         if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
1983         {
1984             dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps;
1985             dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps;
1986             UWORD8 u1_nal_unit_type_tmp = ps_dec->u1_nal_unit_type;
1987 
1988             ps_pps->ps_sps = ps_dec->ps_cur_sps;
1989             if(ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag)
1990                 ps_dec->u1_nal_unit_type = IDR_SLICE_NAL;
1991 
1992             i_temp = ih264d_read_mmco_commands(ps_dec);
1993             ps_pps->ps_sps = ps_sps_tmp;
1994             ps_dec->u1_nal_unit_type = u1_nal_unit_type_tmp;
1995 
1996             if(i_temp < 0)
1997             {
1998                 return ERROR_DBP_MANAGER_T;
1999             }
2000             ps_dec->u4_bitoffset = i_temp;
2001         }
2002         else
2003             ps_dec->ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
2004     }
2005 
2006     {
2007         /* G050 */
2008         /* Read slice_qp_delta */
2009         WORD64 i8_temp =
2010             (WORD64) ps_pps->u1_pic_init_qp + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2011         if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) return ERROR_INV_RANGE_QP_T;
2012         ps_slice->u1_slice_qp = (UWORD8) i8_temp;
2013         COPYTHECONTEXT("SH: slice_qp_delta", ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp);
2014     }
2015     if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
2016     {
2017         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
2018         COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
2019 
2020         if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
2021         {
2022             return ERROR_INV_SLICE_HDR_T;
2023         }
2024         ps_slice->u1_disable_dblk_filter_idc = u4_temp;
2025         if(u4_temp != 1)
2026         {
2027             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
2028             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2029             {
2030                 return ERROR_INV_SLICE_HDR_T;
2031             }
2032             ps_slice->i1_slice_alpha_c0_offset = i_temp;
2033             COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
2034                            ps_slice->i1_slice_alpha_c0_offset >> 1);
2035 
2036             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1;
2037             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
2038             {
2039                 return ERROR_INV_SLICE_HDR_T;
2040             }
2041             ps_slice->i1_slice_beta_offset = i_temp;
2042             COPYTHECONTEXT("SH: slice_beta_offset_div2", ps_slice->i1_slice_beta_offset >> 1);
2043         }
2044         else
2045         {
2046             ps_slice->i1_slice_alpha_c0_offset = 0;
2047             ps_slice->i1_slice_beta_offset = 0;
2048         }
2049     }
2050     else
2051     {
2052         ps_slice->u1_disable_dblk_filter_idc = 0;
2053         ps_slice->i1_slice_alpha_c0_offset = 0;
2054         ps_slice->i1_slice_beta_offset = 0;
2055     }
2056 
2057     /* Initialization to check if number of motion vector per 2 Mbs */
2058     /* are exceeding the range or not */
2059     ps_dec->u2_mv_2mb[0] = 0;
2060     ps_dec->u2_mv_2mb[1] = 0;
2061 
2062     /*set slice header cone to 2 ,to indicate  correct header*/
2063     ps_dec->u1_slice_header_done = 2;
2064     if(ps_pps->u1_entropy_coding_mode)
2065     {
2066         SWITCHOFFTRACE;
2067         SWITCHONTRACECABAC;
2068         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
2069         {
2070             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
2071         }
2072         else
2073             ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff;
2074 
2075         ret = isvcd_parse_islice_data_cabac(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
2076         if(ret != OK) return ret;
2077         SWITCHONTRACE;
2078         SWITCHOFFTRACECABAC;
2079     }
2080     else
2081     {
2082         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
2083         {
2084             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
2085         }
2086         else
2087             ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff;
2088         ret = isvcd_parse_islice_data_cavlc(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice);
2089         if(ret != OK) return ret;
2090     }
2091 
2092     return OK;
2093 }
2094