1/******************************************************************************
2 *
3 * Copyright (C) 2015 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*/
20
21/*!
22 **************************************************************************
23 * \file ih264d_parse_islice.c
24 *
25 * \brief
26 *    Contains routines that decode a I slice type
27 *
28 * Detailed_description
29 *
30 * \date
31 *    07/07/2003
32 *
33 * \author  NS
34 **************************************************************************
35 */
36#include "ih264d_error_handler.h"
37#include "ih264d_debug.h"
38#include <string.h>
39#include "ih264d_bitstrm.h"
40#include "ih264d_defs.h"
41#include "ih264d_debug.h"
42#include "ih264d_tables.h"
43#include "ih264d_structs.h"
44#include "ih264d_defs.h"
45#include "ih264d_parse_cavlc.h"
46#include "ih264d_mb_utils.h"
47#include "ih264d_deblocking.h"
48#include "ih264d_cabac.h"
49#include "ih264d_parse_cabac.h"
50#include "ih264d_parse_mb_header.h"
51#include "ih264d_parse_slice.h"
52#include "ih264d_process_pslice.h"
53#include "ih264d_process_intra_mb.h"
54#include "ih264d_parse_islice.h"
55#include "ih264d_error_handler.h"
56#include "ih264d_mvpred.h"
57#include "ih264d_defs.h"
58#include "ih264d_thread_parse_decode.h"
59#include "ithread.h"
60#include "ih264d_parse_mb_header.h"
61#include "assert.h"
62#include "ih264d_utils.h"
63#include "ih264d_format_conv.h"
64
65void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec);
66
67void ih264d_itrans_recon_luma_dc(dec_struct_t *ps_dec,
68                                 WORD16* pi2_src,
69                                 WORD16* pi2_coeff_block,
70                                 const UWORD16 *pu2_weigh_mat);
71
72
73
74/*!
75 **************************************************************************
76 * \if Function name : ParseIMb \endif
77 *
78 * \brief
79 *    This function parses CAVLC syntax of a I MB. If 16x16 Luma DC transform
80 *    is also done here. Transformed Luma DC values are copied in their
81 *    0th pixel location of corrosponding CoeffBlock.
82 *
83 * \return
84 *    0 on Success and Error code otherwise
85 **************************************************************************
86 */
87WORD32 ih264d_parse_imb_cavlc(dec_struct_t * ps_dec,
88                              dec_mb_info_t * ps_cur_mb_info,
89                              UWORD8 u1_mb_num,
90                              UWORD8 u1_mb_type)
91{
92    WORD32 i4_delta_qp;
93    UWORD32 u4_temp;
94    UWORD32 ui_is_top_mb_available;
95    UWORD32 ui_is_left_mb_available;
96    UWORD32 u4_cbp;
97    UWORD32 u4_offset;
98    UWORD32 *pu4_bitstrm_buf;
99    WORD32 ret;
100
101    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
102    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
103    UNUSED(u1_mb_num);
104    ps_cur_mb_info->u1_tran_form8x8 = 0;
105    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
106
107    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
108
109    u4_temp = ps_dec->u1_mb_ngbr_availablity;
110    ui_is_top_mb_available = BOOLEAN(u4_temp & TOP_MB_AVAILABLE_MASK);
111    ui_is_left_mb_available = BOOLEAN(u4_temp & LEFT_MB_AVAILABLE_MASK);
112
113    pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
114
115    if(u1_mb_type == I_4x4_MB)
116    {
117        ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
118        u4_offset = 0;
119
120        /*--------------------------------------------------------------------*/
121        /* Read transform_size_8x8_flag if present                            */
122        /*--------------------------------------------------------------------*/
123        if(ps_dec->s_high_profile.u1_transform8x8_present)
124        {
125            ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
126            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
127            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
128        }
129
130        /*--------------------------------------------------------------------*/
131        /* Read the IntraPrediction modes for LUMA                            */
132        /*--------------------------------------------------------------------*/
133        if (!ps_cur_mb_info->u1_tran_form8x8)
134        {
135            UWORD8 *pu1_temp;
136            ih264d_read_intra_pred_modes(ps_dec,
137                                          ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data),
138                                          ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data+16),
139                                          ps_cur_mb_info->u1_tran_form8x8);
140            pu1_temp = (UWORD8 *)ps_dec->pv_parse_tu_coeff_data;
141            pu1_temp += 32;
142            ps_dec->pv_parse_tu_coeff_data = (void *)pu1_temp;
143        }
144        else
145        {
146            UWORD8 *pu1_temp;
147            ih264d_read_intra_pred_modes(ps_dec,
148                                          ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data),
149                                          ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data+4),
150                                          ps_cur_mb_info->u1_tran_form8x8);
151            pu1_temp = (UWORD8 *)ps_dec->pv_parse_tu_coeff_data;
152            pu1_temp += 8;
153            ps_dec->pv_parse_tu_coeff_data = (void *)pu1_temp;
154        }
155        /*--------------------------------------------------------------------*/
156        /* Read the IntraPrediction mode for CHROMA                           */
157        /*--------------------------------------------------------------------*/
158//Inlined ih264d_uev
159        {
160            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
161            UWORD32 u4_word, u4_ldz, u4_temp;
162
163            /***************************************************************/
164            /* Find leading zeros in next 32 bits                          */
165            /***************************************************************/
166            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
167            u4_ldz = CLZ(u4_word);
168            /* Flush the ps_bitstrm */
169            u4_bitstream_offset += (u4_ldz + 1);
170            /* Read the suffix from the ps_bitstrm */
171            u4_word = 0;
172            if(u4_ldz)
173            {
174                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
175                        u4_ldz);
176            }
177            *pu4_bitstrm_ofst = u4_bitstream_offset;
178            u4_temp = ((1 << u4_ldz) + u4_word - 1);
179            if(u4_temp > 3)
180            {
181                return ERROR_CHROMA_PRED_MODE;
182            }
183            ps_cur_mb_info->u1_chroma_pred_mode = u4_temp;
184            COPYTHECONTEXT("intra_chroma_pred_mode", ps_cur_mb_info->u1_chroma_pred_mode);
185        }
186        /*--------------------------------------------------------------------*/
187        /* Read the Coded block pattern                                       */
188        /*--------------------------------------------------------------------*/
189        {
190            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
191            UWORD32 u4_word, u4_ldz;
192
193            /***************************************************************/
194            /* Find leading zeros in next 32 bits                          */
195            /***************************************************************/
196            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
197            u4_ldz = CLZ(u4_word);
198            /* Flush the ps_bitstrm */
199            u4_bitstream_offset += (u4_ldz + 1);
200            /* Read the suffix from the ps_bitstrm */
201            u4_word = 0;
202            if(u4_ldz)
203            {
204                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
205                        u4_ldz);
206            }
207            *pu4_bitstrm_ofst = u4_bitstream_offset;
208            u4_cbp = ((1 << u4_ldz) + u4_word - 1);
209        }
210        if(u4_cbp > 47)
211        {
212            return ERROR_CBP;
213        }
214
215        u4_cbp = gau1_ih264d_cbp_table[u4_cbp][0];
216        COPYTHECONTEXT("coded_block_pattern", u1_cbp);
217        ps_cur_mb_info->u1_cbp = u4_cbp;
218
219        /*--------------------------------------------------------------------*/
220        /* Read mb_qp_delta                                                   */
221        /*--------------------------------------------------------------------*/
222        if(ps_cur_mb_info->u1_cbp)
223        {
224            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
225            UWORD32 u4_word, u4_ldz, u4_abs_val;
226
227            /***************************************************************/
228            /* Find leading zeros in next 32 bits                          */
229            /***************************************************************/
230            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
231            u4_ldz = CLZ(u4_word);
232
233            /* Flush the ps_bitstrm */
234            u4_bitstream_offset += (u4_ldz + 1);
235
236            /* Read the suffix from the ps_bitstrm */
237            u4_word = 0;
238            if(u4_ldz)
239            {
240                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
241                        u4_ldz);
242            }
243
244            *pu4_bitstrm_ofst = u4_bitstream_offset;
245            u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
246
247            if(u4_word & 0x1)
248            {
249                i4_delta_qp = (-(WORD32)u4_abs_val);
250            }
251            else
252            {
253                i4_delta_qp = (u4_abs_val);
254            }
255
256            if((i4_delta_qp < -26) || (i4_delta_qp > 25))
257            {
258                return ERROR_INV_RANGE_QP_T;
259            }
260
261            COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
262            if(i4_delta_qp != 0)
263            {
264                ret = ih264d_update_qp(ps_dec, (WORD8)i4_delta_qp);
265                if(ret != OK)
266                    return ret;
267            }
268        }
269
270    }
271    else
272    {
273        u4_offset = 1;
274        ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
275        /*-------------------------------------------------------------------*/
276        /* Read the IntraPrediction mode for CHROMA                          */
277        /*-------------------------------------------------------------------*/
278        {
279            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
280            UWORD32 u4_word, u4_ldz;
281
282            /***************************************************************/
283            /* Find leading zeros in next 32 bits                          */
284            /***************************************************************/
285            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
286            u4_ldz = CLZ(u4_word);
287            /* Flush the ps_bitstrm */
288            u4_bitstream_offset += (u4_ldz + 1);
289            /* Read the suffix from the ps_bitstrm */
290            u4_word = 0;
291            if(u4_ldz)
292            {
293                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
294                        u4_ldz);
295            }
296            *pu4_bitstrm_ofst = u4_bitstream_offset;
297            u4_temp = ((1 << u4_ldz) + u4_word - 1);
298
299//Inlined ih264d_uev
300
301            if(u4_temp > 3)
302            {
303                return ERROR_CHROMA_PRED_MODE;
304            }
305            ps_cur_mb_info->u1_chroma_pred_mode = u4_temp;
306            COPYTHECONTEXT("intra_chroma_pred_mode", ps_cur_mb_info->u1_chroma_pred_mode);
307        }
308        /*-------------------------------------------------------------------*/
309        /* Read the Coded block pattern                                      */
310        /*-------------------------------------------------------------------*/
311        u4_cbp = gau1_ih264d_cbp_tab[(u1_mb_type - 1) >> 2];
312        ps_cur_mb_info->u1_cbp = u4_cbp;
313
314        /*-------------------------------------------------------------------*/
315        /* Read mb_qp_delta                                                  */
316        /*-------------------------------------------------------------------*/
317        {
318            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
319            UWORD32 u4_word, u4_ldz, u4_abs_val;
320
321            /***************************************************************/
322            /* Find leading zeros in next 32 bits                          */
323            /***************************************************************/
324            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
325            u4_ldz = CLZ(u4_word);
326
327            /* Flush the ps_bitstrm */
328            u4_bitstream_offset += (u4_ldz + 1);
329
330            /* Read the suffix from the ps_bitstrm */
331            u4_word = 0;
332            if(u4_ldz)
333                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
334                        u4_ldz);
335
336            *pu4_bitstrm_ofst = u4_bitstream_offset;
337            u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
338
339            if(u4_word & 0x1)
340                i4_delta_qp = (-(WORD32)u4_abs_val);
341            else
342                i4_delta_qp = (u4_abs_val);
343
344            if((i4_delta_qp < -26) || (i4_delta_qp > 25))
345                return ERROR_INV_RANGE_QP_T;
346
347        }
348//inlinined ih264d_sev
349        COPYTHECONTEXT("Delta quant", i1_delta_qp);
350
351        if(i4_delta_qp != 0)
352        {
353            ret = ih264d_update_qp(ps_dec, (WORD8)i4_delta_qp);
354            if(ret != OK)
355                return ret;
356        }
357
358        {
359            WORD16 i_scaleFactor;
360            UWORD32 ui_N = 0;
361            WORD16 *pi2_scale_matrix_ptr;
362            /*******************************************************************/
363            /* for luma DC coefficients the scaling is done during the parsing */
364            /* to preserve the precision                                       */
365            /*******************************************************************/
366            if(ps_dec->s_high_profile.u1_scaling_present)
367            {
368                pi2_scale_matrix_ptr =
369                                ps_dec->s_high_profile.i2_scalinglist4x4[0];
370            }
371            else
372            {
373                i_scaleFactor = 16;
374                pi2_scale_matrix_ptr = &i_scaleFactor;
375            }
376
377            /*---------------------------------------------------------------*/
378            /* Decode DC coefficients                                        */
379            /*---------------------------------------------------------------*/
380            /*---------------------------------------------------------------*/
381            /* Calculation of N                                              */
382            /*---------------------------------------------------------------*/
383            if(ui_is_left_mb_available)
384            {
385
386                if(ui_is_top_mb_available)
387                {
388                    ui_N = ((ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0]
389                                    + ps_dec->pu1_left_nnz_y[0] + 1) >> 1);
390                }
391                else
392                {
393                    ui_N = ps_dec->pu1_left_nnz_y[0];
394                }
395            }
396            else if(ui_is_top_mb_available)
397            {
398                ui_N = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0];
399            }
400
401            {
402                WORD16 pi2_dc_coef[16];
403                WORD32 pi4_tmp[16];
404                tu_sblk4x4_coeff_data_t *ps_tu_4x4 =
405                                (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
406                WORD16 *pi2_coeff_block =
407                                (WORD16 *)ps_dec->pv_parse_tu_coeff_data;
408                UWORD32 u4_num_coeff;
409                ps_tu_4x4->u2_sig_coeff_map = 0;
410
411                ret = ps_dec->pf_cavlc_parse4x4coeff[(ui_N > 7)](pi2_dc_coef, 0, ui_N,
412                                                                 ps_dec, &u4_num_coeff);
413                if(ret != OK)
414                    return ret;
415
416                if(EXCEED_OFFSET(ps_bitstrm))
417                    return ERROR_EOB_TERMINATE_T;
418                if(ps_tu_4x4->u2_sig_coeff_map)
419                {
420                    memset(pi2_dc_coef,0,sizeof(pi2_dc_coef));
421                    ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4,
422                                                     pi2_dc_coef,
423                                                     ps_dec->pu1_inv_scan);
424
425                    PROFILE_DISABLE_IQ_IT_RECON()
426                    ps_dec->pf_ihadamard_scaling_4x4(pi2_dc_coef,
427                                                     pi2_coeff_block,
428                                                     ps_dec->pu2_quant_scale_y,
429                                                     (UWORD16 *)pi2_scale_matrix_ptr,
430                                                     ps_dec->u1_qp_y_div6,
431                                                     pi4_tmp);
432                    pi2_coeff_block += 16;
433                    ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_block;
434                    SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,0);
435                }
436
437            }
438        }
439    }
440
441
442    if(u4_cbp)
443    {
444
445        ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info,
446                                       (UWORD8)u4_offset);
447        if(ret != OK)
448            return ret;
449        if(EXCEED_OFFSET(ps_bitstrm))
450            return ERROR_EOB_TERMINATE_T;
451
452        /* Store Left Mb NNZ and TOP chroma NNZ */
453    }
454    else
455    {
456        ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6;
457        ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6;
458        ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6;
459        ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6;
460        ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6;
461        ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6;
462        ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
463    }
464
465    return OK;
466}
467
468/*!
469 **************************************************************************
470 * \if Function name : ParseIMbCab \endif
471 *
472 * \brief
473 *    This function parses CABAC syntax of a I MB. If 16x16 Luma DC transform
474 *    is also done here. Transformed Luma DC values are copied in their
475 *    0th pixel location of corrosponding CoeffBlock.
476 *
477 * \return
478 *    0 on Success and Error code otherwise
479 **************************************************************************
480 */
481WORD32 ih264d_parse_imb_cabac(dec_struct_t * ps_dec,
482                              dec_mb_info_t * ps_cur_mb_info,
483                              UWORD8 u1_mb_type)
484{
485    WORD8 i1_delta_qp;
486    UWORD8 u1_cbp;
487    UWORD8 u1_offset;
488    /* Variables for handling Cabac contexts */
489    ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
490    ctxt_inc_mb_info_t *ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
491    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
492    bin_ctxt_model_t *p_bin_ctxt;
493
494    UWORD8 u1_intra_chrom_pred_mode;
495    UWORD8 u1_dc_block_flag = 0;
496    WORD32 ret;
497
498    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
499
500    if(ps_left_ctxt == ps_dec->ps_def_ctxt_mb_info)
501    {
502        ps_dec->pu1_left_yuv_dc_csbp[0] = 0xf;
503    }
504
505    if(ps_dec->ps_cur_slice->u1_slice_type != I_SLICE)
506    {
507        WORD32 *pi4_buf;
508        WORD8 *pi1_buf;
509        MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
510        *((UWORD32 *)ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
511        MEMSET_16BYTES(p_curr_ctxt->u1_mv, 0);
512        pi1_buf = p_curr_ctxt->i1_ref_idx;
513        pi4_buf = (WORD32 *)pi1_buf;
514        *pi4_buf = 0;
515    }
516
517    if(u1_mb_type == I_4x4_MB)
518    {
519        ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
520        p_curr_ctxt->u1_mb_type = CAB_I4x4;
521        u1_offset = 0;
522
523        ps_cur_mb_info->u1_tran_form8x8 = 0;
524        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
525
526        /*--------------------------------------------------------------------*/
527        /* Read transform_size_8x8_flag if present                            */
528        /*--------------------------------------------------------------------*/
529        if(ps_dec->s_high_profile.u1_transform8x8_present)
530        {
531            ps_cur_mb_info->u1_tran_form8x8 = ih264d_parse_transform8x8flag_cabac(
532                            ps_dec, ps_cur_mb_info);
533            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
534            p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
535            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
536        }
537        else
538        {
539            p_curr_ctxt->u1_transform8x8_ctxt = 0;
540        }
541
542        /*--------------------------------------------------------------------*/
543        /* Read the IntraPrediction modes for LUMA                            */
544        /*--------------------------------------------------------------------*/
545        if (!ps_cur_mb_info->u1_tran_form8x8)
546        {
547            UWORD8 *pu1_temp;
548            ih264d_read_intra_pred_modes_cabac(
549                            ps_dec,
550                            ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data),
551                            ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data+16),
552                            ps_cur_mb_info->u1_tran_form8x8);
553            pu1_temp = (UWORD8 *)ps_dec->pv_parse_tu_coeff_data;
554            pu1_temp += 32;
555            ps_dec->pv_parse_tu_coeff_data = (void *)pu1_temp;
556        }
557        else
558        {
559            UWORD8 *pu1_temp;
560            ih264d_read_intra_pred_modes_cabac(
561                            ps_dec,
562                            ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data),
563                            ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data+4),
564                            ps_cur_mb_info->u1_tran_form8x8);
565            pu1_temp = (UWORD8 *)ps_dec->pv_parse_tu_coeff_data;
566            pu1_temp += 8;
567            ps_dec->pv_parse_tu_coeff_data = (void *)pu1_temp;
568        }
569        /*--------------------------------------------------------------------*/
570        /* Read the IntraPrediction mode for CHROMA                           */
571        /*--------------------------------------------------------------------*/
572        u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec);
573        COPYTHECONTEXT("intra_chroma_pred_mode", u1_intra_chrom_pred_mode);
574        p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode =
575                        u1_intra_chrom_pred_mode;
576
577        /*--------------------------------------------------------------------*/
578        /* Read the Coded block pattern                                       */
579        /*--------------------------------------------------------------------*/
580        u1_cbp = ih264d_parse_ctx_cbp_cabac(ps_dec);
581        COPYTHECONTEXT("coded_block_pattern", u1_cbp);
582        ps_cur_mb_info->u1_cbp = u1_cbp;
583        p_curr_ctxt->u1_cbp = u1_cbp;
584
585        /*--------------------------------------------------------------------*/
586        /* Read mb_qp_delta                                                   */
587        /*--------------------------------------------------------------------*/
588        if(ps_cur_mb_info->u1_cbp)
589        {
590            ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
591            if(ret != OK)
592                return ret;
593            COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
594            if(i1_delta_qp != 0)
595            {
596                ret = ih264d_update_qp(ps_dec, i1_delta_qp);
597                if(ret != OK)
598                    return ret;
599            }
600        }
601        else
602            ps_dec->i1_prev_mb_qp_delta = 0;
603        p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
604    }
605    else
606    {
607        u1_offset = 1;
608        ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
609        p_curr_ctxt->u1_mb_type = CAB_I16x16;
610        ps_cur_mb_info->u1_tran_form8x8 = 0;
611        p_curr_ctxt->u1_transform8x8_ctxt = 0;
612        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
613        /*--------------------------------------------------------------------*/
614        /* Read the IntraPrediction mode for CHROMA                           */
615        /*--------------------------------------------------------------------*/
616        u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec);
617        if(u1_intra_chrom_pred_mode > 3)
618            return ERROR_CHROMA_PRED_MODE;
619
620        COPYTHECONTEXT("Chroma intra_chroma_pred_mode pred mode", u1_intra_chrom_pred_mode);
621        p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode =
622                        u1_intra_chrom_pred_mode;
623
624        /*--------------------------------------------------------------------*/
625        /* Read the Coded block pattern                                       */
626        /*--------------------------------------------------------------------*/
627        u1_cbp = gau1_ih264d_cbp_tab[(u1_mb_type - 1) >> 2];
628        ps_cur_mb_info->u1_cbp = u1_cbp;
629        p_curr_ctxt->u1_cbp = u1_cbp;
630
631        /*--------------------------------------------------------------------*/
632        /* Read mb_qp_delta                                                   */
633        /*--------------------------------------------------------------------*/
634        ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
635        if(ret != OK)
636            return ret;
637        COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
638        if(i1_delta_qp != 0)
639        {
640            ret = ih264d_update_qp(ps_dec, i1_delta_qp);
641            if(ret != OK)
642                return ret;
643        }
644
645        {
646            WORD16 i_scaleFactor;
647            WORD16* pi2_scale_matrix_ptr;
648            /*******************************************************************/
649            /* for luma DC coefficients the scaling is done during the parsing */
650            /* to preserve the precision                                       */
651            /*******************************************************************/
652            if(ps_dec->s_high_profile.u1_scaling_present)
653            {
654                pi2_scale_matrix_ptr =
655                                ps_dec->s_high_profile.i2_scalinglist4x4[0];
656
657            }
658            else
659            {
660                i_scaleFactor = 16;
661                pi2_scale_matrix_ptr = &i_scaleFactor;
662            }
663            {
664                ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
665                UWORD8 uc_a, uc_b;
666                UWORD32 u4_ctx_inc;
667
668                INC_SYM_COUNT(&(ps_dec->s_cab_dec_env));
669
670                /* if MbAddrN not available then CondTermN = 1 */
671                uc_b = ((ps_top_ctxt->u1_yuv_dc_csbp) & 0x01);
672
673                /* if MbAddrN not available then CondTermN = 1 */
674                uc_a = ((ps_dec->pu1_left_yuv_dc_csbp[0]) & 0x01);
675
676                u4_ctx_inc = (uc_a + (uc_b << 1));
677
678                {
679                    WORD16 pi2_dc_coef[16];
680                    tu_sblk4x4_coeff_data_t *ps_tu_4x4 =
681                                    (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
682                    WORD16 *pi2_coeff_block =
683                                    (WORD16 *)ps_dec->pv_parse_tu_coeff_data;
684
685                    p_bin_ctxt = (ps_dec->p_cbf_t[LUMA_DC_CTXCAT]) + u4_ctx_inc;
686
687                    u1_dc_block_flag =
688                                    ih264d_read_coeff4x4_cabac(ps_bitstrm,
689                                                    LUMA_DC_CTXCAT,
690                                                    ps_dec->p_significant_coeff_flag_t[LUMA_DC_CTXCAT],
691                                                    ps_dec, p_bin_ctxt);
692
693                    /* Store coded_block_flag */
694                    p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
695                    p_curr_ctxt->u1_yuv_dc_csbp |= u1_dc_block_flag;
696                    if(u1_dc_block_flag)
697                    {
698                        WORD32 pi4_tmp[16];
699                        memset(pi2_dc_coef,0,sizeof(pi2_dc_coef));
700                        ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4,
701                                                         pi2_dc_coef,
702                                                         ps_dec->pu1_inv_scan);
703
704                        PROFILE_DISABLE_IQ_IT_RECON()
705                        ps_dec->pf_ihadamard_scaling_4x4(pi2_dc_coef,
706                                                         pi2_coeff_block,
707                                                         ps_dec->pu2_quant_scale_y,
708                                                         (UWORD16 *)pi2_scale_matrix_ptr,
709                                                         ps_dec->u1_qp_y_div6,
710                                                         pi4_tmp);
711                        pi2_coeff_block += 16;
712                        ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_block;
713                        SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,0);
714                    }
715
716                }
717
718            }
719        }
720    }
721
722    ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
723    ps_dec->pu1_left_yuv_dc_csbp[0] |= u1_dc_block_flag;
724
725    ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, u1_offset);
726    if(EXCEED_OFFSET(ps_bitstrm))
727        return ERROR_EOB_TERMINATE_T;
728    return OK;
729}
730
731/*****************************************************************************/
732/*                                                                           */
733/*  Function Name : ih264d_parse_islice_data_cavlc                                  */
734/*                                                                           */
735/*  Description   : This function parses cabac syntax of a inter slice on    */
736/*                  N MB basis.                                              */
737/*                                                                           */
738/*  Inputs        : ps_dec                                                   */
739/*                  sliceparams                                              */
740/*                  firstMbInSlice                                           */
741/*                                                                           */
742/*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
743/*                     decoded till the end of slice.                        */
744/*                                                                           */
745/*  Returns       : 0                                                        */
746/*                                                                           */
747/*  Issues        : <List any issues or problems with this function>         */
748/*                                                                           */
749/*  Revision History:                                                        */
750/*                                                                           */
751/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
752/*         24 06 2005   ARNY            Draft                                */
753/*                                                                           */
754/*****************************************************************************/
755WORD32 ih264d_parse_islice_data_cavlc(dec_struct_t * ps_dec,
756                                      dec_slice_params_t * ps_slice,
757                                      UWORD16 u2_first_mb_in_slice)
758{
759    UWORD8 uc_more_data_flag;
760    UWORD8 u1_num_mbs, u1_mb_idx;
761    dec_mb_info_t *ps_cur_mb_info;
762    deblk_mb_t *ps_cur_deblk_mb;
763    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
764    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
765    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
766    UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
767    WORD16 i2_cur_mb_addr;
768    UWORD8 u1_mbaff;
769    UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
770    WORD32 ret = OK;
771
772    ps_dec->u1_qp = ps_slice->u1_slice_qp;
773    ih264d_update_qp(ps_dec, 0);
774    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
775
776    /* initializations */
777    u1_mb_idx = ps_dec->u1_mb_idx;
778    u1_num_mbs = u1_mb_idx;
779
780    uc_more_data_flag = 1;
781    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
782
783    do
784    {
785        UWORD8 u1_mb_type;
786
787        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
788
789        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
790        {
791            break;
792        }
793
794        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
795        ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
796        ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
797
798        ps_cur_mb_info->u1_end_of_slice = 0;
799
800        /***************************************************************/
801        /* Get the required information for decoding of MB             */
802        /* mb_x, mb_y , neighbour availablity,                         */
803        /***************************************************************/
804        ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
805
806        /***************************************************************/
807        /* Set the deblocking parameters for this MB                   */
808        /***************************************************************/
809        ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
810
811        if(ps_dec->u4_app_disable_deblk_frm == 0)
812            ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
813                                             ps_dec->u1_mb_ngbr_availablity,
814                                             ps_dec->u1_cur_mb_fld_dec_flag);
815
816        ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
817
818        /**************************************************************/
819        /* Macroblock Layer Begins, Decode the u1_mb_type                */
820        /**************************************************************/
821//Inlined ih264d_uev
822        {
823            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
824            UWORD32 u4_word, u4_ldz, u4_temp;
825
826            /***************************************************************/
827            /* Find leading zeros in next 32 bits                          */
828            /***************************************************************/
829            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
830            u4_ldz = CLZ(u4_word);
831            /* Flush the ps_bitstrm */
832            u4_bitstream_offset += (u4_ldz + 1);
833            /* Read the suffix from the ps_bitstrm */
834            u4_word = 0;
835            if(u4_ldz)
836                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
837                        u4_ldz);
838            *pu4_bitstrm_ofst = u4_bitstream_offset;
839            u4_temp = ((1 << u4_ldz) + u4_word - 1);
840            if(u4_temp > 25)
841                return ERROR_MB_TYPE;
842            u1_mb_type = u4_temp;
843
844        }
845//Inlined ih264d_uev
846        ps_cur_mb_info->u1_mb_type = u1_mb_type;
847        COPYTHECONTEXT("u1_mb_type", u1_mb_type);
848
849        /**************************************************************/
850        /* Parse Macroblock data                                      */
851        /**************************************************************/
852        if(25 == u1_mb_type)
853        {
854            /* I_PCM_MB */
855            ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
856            ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
857            if(ret != OK)
858                return ret;
859            ps_cur_deblk_mb->u1_mb_qp = 0;
860        }
861        else
862        {
863            ret = ih264d_parse_imb_cavlc(ps_dec, ps_cur_mb_info, u1_num_mbs, u1_mb_type);
864            if(ret != OK)
865                return ret;
866            ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
867        }
868
869        if(u1_mbaff)
870        {
871            ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
872        }
873        /**************************************************************/
874        /* Get next Macroblock address                                */
875        /**************************************************************/
876
877        i2_cur_mb_addr++;
878        uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
879
880        /* Store the colocated information */
881        {
882            mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
883
884            mv_pred_t s_mvPred =
885                {
886                    { 0, 0, 0, 0 },
887                      { -1, -1 }, 0, 0};
888            ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
889                               (UWORD8)(ps_dec->u1_cur_mb_fld_dec_flag << 1), 4,
890                               4);
891        }
892
893        /*if num _cores is set to 3,compute bs will be done in another thread*/
894        if(ps_dec->u4_num_cores < 3)
895        {
896            if(ps_dec->u4_app_disable_deblk_frm == 0)
897                ps_dec->pf_compute_bs(ps_dec, ps_cur_mb_info,
898                                     (UWORD16)(u1_num_mbs >> u1_mbaff));
899        }
900        u1_num_mbs++;
901
902        /****************************************************************/
903        /* Check for End Of Row                                         */
904        /****************************************************************/
905        u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
906        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
907        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
908                        || (!uc_more_data_flag);
909        ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
910
911        /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d",
912         ps_slice->i4_poc >> ps_slice->u1_field_pic_flag,
913         ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb));
914         H264_DEC_DEBUG_PRINT("u1_tfr_n_mb || (!uc_more_data_flag): %d", u1_tfr_n_mb || (!uc_more_data_flag));*/
915        if(u1_tfr_n_mb || (!uc_more_data_flag))
916        {
917
918            if(ps_dec->u1_separate_parse)
919            {
920                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
921                                     u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
922                ps_dec->ps_nmb_info +=  u1_num_mbs;
923            }
924            else
925            {
926                ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
927                                            u1_num_mbs_next, u1_tfr_n_mb,
928                                            u1_end_of_row);
929            }
930            ps_dec->u2_total_mbs_coded += u1_num_mbs;
931            if(u1_tfr_n_mb)
932                u1_num_mbs = 0;
933            u1_mb_idx = u1_num_mbs;
934            ps_dec->u1_mb_idx = u1_num_mbs;
935
936        }
937    }
938    while(uc_more_data_flag);
939
940    ps_dec->u4_num_mbs_cur_nmb = 0;
941    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
942
943                        - (u2_first_mb_in_slice << u1_mbaff);
944
945    return ret;
946}
947
948/*****************************************************************************/
949/*                                                                           */
950/*  Function Name : ih264d_parse_islice_data_cabac                                  */
951/*                                                                           */
952/*  Description   : This function parses cabac syntax of a inter slice on    */
953/*                  N MB basis.                                              */
954/*                                                                           */
955/*  Inputs        : ps_dec                                                   */
956/*                  sliceparams                                              */
957/*                  firstMbInSlice                                           */
958/*                                                                           */
959/*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
960/*                     decoded till the end of slice.                        */
961/*                                                                           */
962/*  Returns       : 0                                                        */
963/*                                                                           */
964/*  Issues        : <List any issues or problems with this function>         */
965/*                                                                           */
966/*  Revision History:                                                        */
967/*                                                                           */
968/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
969/*         24 06 2005   ARNY            Draft                                */
970/*                                                                           */
971/*****************************************************************************/
972WORD32 ih264d_parse_islice_data_cabac(dec_struct_t * ps_dec,
973                                      dec_slice_params_t * ps_slice,
974                                      UWORD16 u2_first_mb_in_slice)
975{
976    UWORD8 uc_more_data_flag;
977    UWORD8 u1_num_mbs, u1_mb_idx;
978    dec_mb_info_t *ps_cur_mb_info;
979    deblk_mb_t *ps_cur_deblk_mb;
980
981    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
982    UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
983    WORD16 i2_cur_mb_addr;
984    UWORD8 u1_mbaff;
985    UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
986    WORD32 ret = OK;
987
988    ps_dec->u1_qp = ps_slice->u1_slice_qp;
989    ih264d_update_qp(ps_dec, 0);
990    u1_mbaff = ps_slice->u1_mbaff_frame_flag;
991
992    if(ps_bitstrm->u4_ofst & 0x07)
993    {
994        ps_bitstrm->u4_ofst += 8;
995        ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
996    }
997    ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
998    if(ret != OK)
999        return ret;
1000    ih264d_init_cabac_contexts(I_SLICE, ps_dec);
1001
1002    ps_dec->i1_prev_mb_qp_delta = 0;
1003
1004    /* initializations */
1005    u1_mb_idx = ps_dec->u1_mb_idx;
1006    u1_num_mbs = u1_mb_idx;
1007
1008    uc_more_data_flag = 1;
1009    i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
1010    do
1011    {
1012        UWORD16 u2_mbx;
1013
1014        ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1015
1016        if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
1017        {
1018            break;
1019        }
1020
1021        {
1022            UWORD8 u1_mb_type;
1023
1024            ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
1025            ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
1026            ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
1027
1028            ps_cur_mb_info->u1_end_of_slice = 0;
1029
1030            /***************************************************************/
1031            /* Get the required information for decoding of MB                  */
1032            /* mb_x, mb_y , neighbour availablity,                              */
1033            /***************************************************************/
1034            ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
1035            u2_mbx = ps_dec->u2_mbx;
1036
1037            /*********************************************************************/
1038            /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
1039            /*********************************************************************/
1040            ps_cur_mb_info->u1_tran_form8x8 = 0;
1041            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1042
1043            /***************************************************************/
1044            /* Set the deblocking parameters for this MB                   */
1045            /***************************************************************/
1046            ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
1047            if(ps_dec->u4_app_disable_deblk_frm == 0)
1048                ih264d_set_deblocking_parameters(
1049                                ps_cur_deblk_mb, ps_slice,
1050                                ps_dec->u1_mb_ngbr_availablity,
1051                                ps_dec->u1_cur_mb_fld_dec_flag);
1052
1053            ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type
1054                            | D_INTRA_MB;
1055
1056            /* Macroblock Layer Begins */
1057            /* Decode the u1_mb_type */
1058            u1_mb_type = ih264d_parse_mb_type_intra_cabac(0, ps_dec);
1059            if(u1_mb_type > 25)
1060                return ERROR_MB_TYPE;
1061            ps_cur_mb_info->u1_mb_type = u1_mb_type;
1062            COPYTHECONTEXT("u1_mb_type", u1_mb_type);
1063
1064            /* Parse Macroblock Data */
1065            if(25 == u1_mb_type)
1066            {
1067                /* I_PCM_MB */
1068                ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
1069                ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
1070                if(ret != OK)
1071                    return ret;
1072                ps_cur_deblk_mb->u1_mb_qp = 0;
1073            }
1074            else
1075            {
1076                ret = ih264d_parse_imb_cabac(ps_dec, ps_cur_mb_info, u1_mb_type);
1077                if(ret != OK)
1078                    return ret;
1079                ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
1080            }
1081
1082            if(u1_mbaff)
1083            {
1084                ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
1085            }
1086            /* Next macroblock information */
1087            i2_cur_mb_addr++;
1088
1089            if(ps_cur_mb_info->u1_topmb && u1_mbaff)
1090                uc_more_data_flag = 1;
1091            else
1092            {
1093                uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env,
1094                                                          ps_bitstrm);
1095                uc_more_data_flag = !uc_more_data_flag;
1096                COPYTHECONTEXT("Decode Sliceterm",!uc_more_data_flag);
1097            }
1098            /* Store the colocated information */
1099            {
1100
1101                mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
1102                mv_pred_t s_mvPred =
1103                    {
1104                        { 0, 0, 0, 0 },
1105                          { -1, -1 }, 0, 0};
1106                ih264d_rep_mv_colz(
1107                                ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
1108                                (UWORD8)(ps_dec->u1_cur_mb_fld_dec_flag << 1),
1109                                4, 4);
1110            }
1111            /*if num _cores is set to 3,compute bs will be done in another thread*/
1112            if(ps_dec->u4_num_cores < 3)
1113            {
1114                if(ps_dec->u4_app_disable_deblk_frm == 0)
1115                    ps_dec->pf_compute_bs(ps_dec, ps_cur_mb_info,
1116                                         (UWORD16)(u1_num_mbs >> u1_mbaff));
1117            }
1118            u1_num_mbs++;
1119
1120        }
1121
1122        /****************************************************************/
1123        /* Check for End Of Row                                         */
1124        /****************************************************************/
1125        u1_num_mbs_next = i2_pic_wdin_mbs - u2_mbx - 1;
1126        u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
1127        u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
1128                        || (!uc_more_data_flag);
1129        ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
1130
1131        if(u1_tfr_n_mb || (!uc_more_data_flag))
1132        {
1133
1134
1135            if(ps_dec->u1_separate_parse)
1136            {
1137                ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1138                                     u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
1139                ps_dec->ps_nmb_info +=  u1_num_mbs;
1140            }
1141            else
1142            {
1143                ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
1144                                            u1_num_mbs_next, u1_tfr_n_mb,
1145                                            u1_end_of_row);
1146            }
1147            ps_dec->u2_total_mbs_coded += u1_num_mbs;
1148            if(u1_tfr_n_mb)
1149                u1_num_mbs = 0;
1150            u1_mb_idx = u1_num_mbs;
1151            ps_dec->u1_mb_idx = u1_num_mbs;
1152
1153        }
1154    }
1155    while(uc_more_data_flag);
1156
1157    ps_dec->u4_num_mbs_cur_nmb = 0;
1158    ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
1159
1160                        - (u2_first_mb_in_slice << u1_mbaff);
1161
1162    return ret;
1163}
1164
1165/*****************************************************************************/
1166/*                                                                           */
1167/*  Function Name : ih264d_parse_ipcm_mb                                       */
1168/*                                                                           */
1169/*  Description   : This function decodes the pixel values of I_PCM Mb.      */
1170/*                                                                           */
1171/*  Inputs        : ps_dec,  ps_cur_mb_info and mb number                          */
1172/*                                                                           */
1173/*  Description   : This function reads the luma and chroma pixels directly  */
1174/*                  from the bitstream when the mbtype is I_PCM and stores   */
1175/*                  them in recon buffer. If the entropy coding mode is      */
1176/*                  cabac, decoding engine is re-initialized. The nnzs and   */
1177/*                  cabac contexts are appropriately modified.               */
1178/*  Returns       : void                                                     */
1179/*                                                                           */
1180/*  Revision History:                                                        */
1181/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1182/*         13 07 2002   Jay                                                  */
1183/*                                                                           */
1184/*****************************************************************************/
1185
1186WORD32 ih264d_parse_ipcm_mb(dec_struct_t * ps_dec,
1187                          dec_mb_info_t *ps_cur_mb_info,
1188                          UWORD8 u1_mbNum)
1189{
1190    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1191    UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
1192    UWORD8 *pu1_y, *pu1_u, *pu1_v;
1193    WORD32 ret;
1194
1195    UWORD32 u4_rec_width_y, u4_rec_width_uv;
1196    UWORD32 u1_num_mb_pair;
1197    UWORD8 u1_x, u1_y;
1198    /* CHANGED CODE */
1199    tfr_ctxt_t *ps_frame_buf;
1200    UWORD8 u1_mb_field_decoding_flag;
1201    UWORD32 *pu4_buf;
1202    UWORD8 *pu1_buf;
1203    /* CHANGED CODE */
1204
1205    if(ps_dec->u1_separate_parse)
1206    {
1207        ps_frame_buf = &ps_dec->s_tran_addrecon_parse;
1208    }
1209    else
1210    {
1211        ps_frame_buf = &ps_dec->s_tran_addrecon;
1212    }
1213    /* align bistream to byte boundary. */
1214    /* pcm_alignment_zero_bit discarded */
1215    /* For XX GotoByteBoundary */
1216    if(ps_bitstrm->u4_ofst & 0x07)
1217    {
1218        ps_bitstrm->u4_ofst += 8;
1219        ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
1220    }
1221
1222    /*  Store left Nnz as 16 for each 4x4 blk */
1223
1224    pu1_buf = ps_dec->pu1_left_nnz_y;
1225    pu4_buf = (UWORD32 *)pu1_buf;
1226    *pu4_buf = 0x10101010;
1227    pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_y;
1228    pu4_buf = (UWORD32 *)pu1_buf;
1229    *pu4_buf = 0x10101010;
1230    pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_uv;
1231    pu4_buf = (UWORD32 *)pu1_buf;
1232    *pu4_buf = 0x10101010;
1233    pu1_buf = ps_dec->pu1_left_nnz_uv;
1234    pu4_buf = (UWORD32 *)pu1_buf;
1235    *pu4_buf = 0x10101010;
1236    ps_cur_mb_info->u1_cbp = 0xff;
1237
1238    ps_dec->i1_prev_mb_qp_delta = 0;
1239    /* Get neighbour MB's */
1240    u1_num_mb_pair = (u1_mbNum >> u1_mbaff);
1241
1242    /*****************************************************************************/
1243    /* calculate the RECON buffer YUV pointers for the PCM data                  */
1244    /*****************************************************************************/
1245    /* CHANGED CODE  */
1246    u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
1247    pu1_y = ps_frame_buf->pu1_dest_y + (u1_num_mb_pair << 4);
1248    pu1_u = ps_frame_buf->pu1_dest_u + (u1_num_mb_pair << 4);
1249    pu1_v = pu1_u + 1;
1250
1251    u4_rec_width_y = ps_dec->u2_frm_wd_y << u1_mb_field_decoding_flag;
1252    u4_rec_width_uv = ps_dec->u2_frm_wd_uv << u1_mb_field_decoding_flag;
1253    /* CHANGED CODE  */
1254
1255    if(u1_mbaff)
1256    {
1257        UWORD8 u1_top_mb;
1258
1259        u1_top_mb = ps_cur_mb_info->u1_topmb;
1260
1261        if(u1_top_mb == 0)
1262        {
1263            pu1_y += (u1_mb_field_decoding_flag ?
1264                            (u4_rec_width_y >> 1) : (u4_rec_width_y << 4));
1265            pu1_u += (u1_mb_field_decoding_flag ?
1266                            (u4_rec_width_uv) : (u4_rec_width_uv << 4));
1267            pu1_v = pu1_u + 1;
1268        }
1269    }
1270
1271    /* Read Luma samples */
1272    for(u1_y = 0; u1_y < 16; u1_y++)
1273    {
1274        for(u1_x = 0; u1_x < 16; u1_x++)
1275            pu1_y[u1_x] = ih264d_get_bits_h264(ps_bitstrm, 8);
1276
1277        pu1_y += u4_rec_width_y;
1278    }
1279
1280    /* Read Chroma samples */
1281    for(u1_y = 0; u1_y < 8; u1_y++)
1282    {
1283        for(u1_x = 0; u1_x < 8; u1_x++)
1284            pu1_u[u1_x * YUV420SP_FACTOR] = ih264d_get_bits_h264(ps_bitstrm, 8);
1285
1286        pu1_u += u4_rec_width_uv;
1287    }
1288
1289    for(u1_y = 0; u1_y < 8; u1_y++)
1290    {
1291        for(u1_x = 0; u1_x < 8; u1_x++)
1292            pu1_v[u1_x * YUV420SP_FACTOR] = ih264d_get_bits_h264(ps_bitstrm, 8);
1293
1294        pu1_v += u4_rec_width_uv;
1295    }
1296
1297    if(CABAC == ps_dec->ps_cur_pps->u1_entropy_coding_mode)
1298    {
1299        UWORD32 *pu4_buf;
1300        UWORD8 *pu1_buf;
1301        ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
1302        /* Re-initialize the cabac decoding engine. */
1303        ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
1304        if(ret != OK)
1305            return ret;
1306        /* update the cabac contetxs */
1307        p_curr_ctxt->u1_mb_type = CAB_I_PCM;
1308        p_curr_ctxt->u1_cbp = 47;
1309        p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
1310        p_curr_ctxt->u1_transform8x8_ctxt = 0;
1311        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
1312
1313        pu1_buf = ps_dec->pu1_left_nnz_y;
1314        pu4_buf = (UWORD32 *)pu1_buf;
1315        *pu4_buf = 0x01010101;
1316
1317        pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_y;
1318        pu4_buf = (UWORD32 *)pu1_buf;
1319        *pu4_buf = 0x01010101;
1320
1321        pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_uv;
1322        pu4_buf = (UWORD32 *)pu1_buf;
1323        *pu4_buf = 0x01010101;
1324
1325        pu1_buf = ps_dec->pu1_left_nnz_uv;
1326        pu4_buf = (UWORD32 *)pu1_buf;
1327        *pu4_buf = 0x01010101;
1328
1329        p_curr_ctxt->u1_yuv_dc_csbp = 0x7;
1330        ps_dec->pu1_left_yuv_dc_csbp[0] = 0x7;
1331        if(ps_dec->ps_cur_slice->u1_slice_type != I_SLICE)
1332        {
1333
1334            MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
1335            memset(ps_dec->pi1_left_ref_idx_ctxt_inc, 0, 4);
1336            MEMSET_16BYTES(p_curr_ctxt->u1_mv, 0);
1337            memset(p_curr_ctxt->i1_ref_idx, 0, 4);
1338
1339        }
1340    }
1341    return OK;
1342}
1343
1344/*!
1345 **************************************************************************
1346 * \if Function name : ih264d_decode_islice \endif
1347 *
1348 * \brief
1349 *    Decodes an I Slice
1350 *
1351 *
1352 * \return
1353 *    0 on Success and Error code otherwise
1354 **************************************************************************
1355 */
1356WORD32 ih264d_parse_islice(dec_struct_t *ps_dec,
1357                            UWORD16 u2_first_mb_in_slice)
1358{
1359    dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps;
1360    dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice;
1361    UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
1362    UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
1363    UWORD32 u4_temp;
1364    WORD32 i_temp;
1365    WORD32 ret;
1366
1367    /*--------------------------------------------------------------------*/
1368    /* Read remaining contents of the slice header                        */
1369    /*--------------------------------------------------------------------*/
1370    /* dec_ref_pic_marking function */
1371    /* G050 */
1372    if(ps_slice->u1_nal_ref_idc != 0)
1373    {
1374        if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
1375        {
1376            i_temp = ih264d_read_mmco_commands(ps_dec);
1377            if (i_temp < 0)
1378            {
1379                return ERROR_DBP_MANAGER_T;
1380            }
1381            ps_dec->u4_bitoffset = i_temp;
1382        }
1383        else
1384            ps_dec->ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
1385    }
1386    /* G050 */
1387
1388    /* Read slice_qp_delta */
1389    i_temp = ps_pps->u1_pic_init_qp
1390                    + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1391    if((i_temp < 0) || (i_temp > 51))
1392        return ERROR_INV_RANGE_QP_T;
1393    ps_slice->u1_slice_qp = i_temp;
1394    COPYTHECONTEXT("SH: slice_qp_delta",
1395                    ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp);
1396
1397    if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
1398    {
1399        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1400        COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
1401
1402        if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
1403        {
1404            return ERROR_INV_SLICE_HDR_T;
1405        }
1406        ps_slice->u1_disable_dblk_filter_idc = u4_temp;
1407        if(u4_temp != 1)
1408        {
1409            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
1410                            << 1;
1411            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
1412            {
1413                return ERROR_INV_SLICE_HDR_T;
1414            }
1415            ps_slice->i1_slice_alpha_c0_offset = i_temp;
1416            COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
1417                            ps_slice->i1_slice_alpha_c0_offset >> 1);
1418
1419            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
1420                            << 1;
1421            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
1422            {
1423                return ERROR_INV_SLICE_HDR_T;
1424            }
1425            ps_slice->i1_slice_beta_offset = i_temp;
1426            COPYTHECONTEXT("SH: slice_beta_offset_div2",
1427                            ps_slice->i1_slice_beta_offset >> 1);
1428
1429        }
1430        else
1431        {
1432            ps_slice->i1_slice_alpha_c0_offset = 0;
1433            ps_slice->i1_slice_beta_offset = 0;
1434        }
1435    }
1436    else
1437    {
1438        ps_slice->u1_disable_dblk_filter_idc = 0;
1439        ps_slice->i1_slice_alpha_c0_offset = 0;
1440        ps_slice->i1_slice_beta_offset = 0;
1441    }
1442
1443    /* Initialization to check if number of motion vector per 2 Mbs */
1444    /* are exceeding the range or not */
1445    ps_dec->u2_mv_2mb[0] = 0;
1446    ps_dec->u2_mv_2mb[1] = 0;
1447
1448
1449    /*set slice header cone to 2 ,to indicate  correct header*/
1450    ps_dec->u1_slice_header_done = 2;
1451
1452    if(ps_pps->u1_entropy_coding_mode)
1453    {
1454        SWITCHOFFTRACE; SWITCHONTRACECABAC;
1455        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1456        {
1457            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
1458        }
1459        else
1460            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff;
1461
1462        ret = ih264d_parse_islice_data_cabac(ps_dec, ps_slice,
1463                                             u2_first_mb_in_slice);
1464        if(ret != OK)
1465            return ret;
1466        SWITCHONTRACE; SWITCHOFFTRACECABAC;
1467    }
1468    else
1469    {
1470        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1471        {
1472            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
1473        }
1474        else
1475            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff;
1476        ret = ih264d_parse_islice_data_cavlc(ps_dec, ps_slice,
1477                                       u2_first_mb_in_slice);
1478        if(ret != OK)
1479            return ret;
1480    }
1481
1482    return OK;
1483}
1484