xref: /aosp_15_r20/external/libavc/decoder/ih264d_parse_mb_header.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker /*!
21*495ae853SAndroid Build Coastguard Worker  ***************************************************************************
22*495ae853SAndroid Build Coastguard Worker  * \file ih264d_parse_mb_header.c
23*495ae853SAndroid Build Coastguard Worker  *
24*495ae853SAndroid Build Coastguard Worker  * \brief
25*495ae853SAndroid Build Coastguard Worker  *    This file contains context identifier encoding routines.
26*495ae853SAndroid Build Coastguard Worker  *
27*495ae853SAndroid Build Coastguard Worker  * \date
28*495ae853SAndroid Build Coastguard Worker  *    04/02/2003
29*495ae853SAndroid Build Coastguard Worker  *
30*495ae853SAndroid Build Coastguard Worker  * \author  NS
31*495ae853SAndroid Build Coastguard Worker  ***************************************************************************
32*495ae853SAndroid Build Coastguard Worker  */
33*495ae853SAndroid Build Coastguard Worker #include <string.h>
34*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
35*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
36*495ae853SAndroid Build Coastguard Worker #include "ih264d_cabac.h"
37*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
38*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
39*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
40*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
42*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
43*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
44*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
45*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
46*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
47*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_mb_header.h"
48*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
49*495ae853SAndroid Build Coastguard Worker 
50*495ae853SAndroid Build Coastguard Worker /*! < CtxtInc index 0 - CtxMbTypeI, CtxMbTypeSISuffix
51*495ae853SAndroid Build Coastguard Worker  index 1 - CtxMbTypePSuffix, CtxMbTypeBSuffix
52*495ae853SAndroid Build Coastguard Worker  */
53*495ae853SAndroid Build Coastguard Worker 
54*495ae853SAndroid Build Coastguard Worker 
55*495ae853SAndroid Build Coastguard Worker 
56*495ae853SAndroid Build Coastguard Worker /*!
57*495ae853SAndroid Build Coastguard Worker  **************************************************************************
58*495ae853SAndroid Build Coastguard Worker  * \if Function name : ih264d_parse_mb_type_intra_cabac \endif
59*495ae853SAndroid Build Coastguard Worker  *
60*495ae853SAndroid Build Coastguard Worker  * \brief
61*495ae853SAndroid Build Coastguard Worker  *    This function decodes MB type using CABAC entropy coding mode.
62*495ae853SAndroid Build Coastguard Worker  *
63*495ae853SAndroid Build Coastguard Worker  * \return
64*495ae853SAndroid Build Coastguard Worker  *    MBType.
65*495ae853SAndroid Build Coastguard Worker  *
66*495ae853SAndroid Build Coastguard Worker  **************************************************************************
67*495ae853SAndroid Build Coastguard Worker  */
ih264d_parse_mb_type_intra_cabac(UWORD8 u1_inter,struct _DecStruct * ps_dec)68*495ae853SAndroid Build Coastguard Worker UWORD8 ih264d_parse_mb_type_intra_cabac(UWORD8 u1_inter,
69*495ae853SAndroid Build Coastguard Worker                                         struct _DecStruct * ps_dec)
70*495ae853SAndroid Build Coastguard Worker {
71*495ae853SAndroid Build Coastguard Worker     decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
72*495ae853SAndroid Build Coastguard Worker     dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
73*495ae853SAndroid Build Coastguard Worker     ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
74*495ae853SAndroid Build Coastguard Worker     ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
75*495ae853SAndroid Build Coastguard Worker     bin_ctxt_model_t *ps_mb_bin_ctxt = ps_dec->p_mb_type_t;
76*495ae853SAndroid Build Coastguard Worker     WORD8 u1_mb_type, u1_bin;
77*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cxt_inc;
78*495ae853SAndroid Build Coastguard Worker 
79*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc = 0;
80*495ae853SAndroid Build Coastguard Worker     if(!u1_inter)
81*495ae853SAndroid Build Coastguard Worker     {
82*495ae853SAndroid Build Coastguard Worker         if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info)
83*495ae853SAndroid Build Coastguard Worker             u4_cxt_inc += ((ps_left_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0);
84*495ae853SAndroid Build Coastguard Worker         if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info)
85*495ae853SAndroid Build Coastguard Worker             u4_cxt_inc += ((ps_top_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0);
86*495ae853SAndroid Build Coastguard Worker     }
87*495ae853SAndroid Build Coastguard Worker     else
88*495ae853SAndroid Build Coastguard Worker     {
89*495ae853SAndroid Build Coastguard Worker         ps_mb_bin_ctxt = ps_mb_bin_ctxt + 3 + (ps_dec->u1_B << 1);
90*495ae853SAndroid Build Coastguard Worker     }
91*495ae853SAndroid Build Coastguard Worker 
92*495ae853SAndroid Build Coastguard Worker     /* b0 */
93*495ae853SAndroid Build Coastguard Worker     u1_mb_type = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
94*495ae853SAndroid Build Coastguard Worker                                           ps_cab_env);
95*495ae853SAndroid Build Coastguard Worker     if(u1_mb_type)
96*495ae853SAndroid Build Coastguard Worker     {
97*495ae853SAndroid Build Coastguard Worker         /* I16x16 or I_PCM mode */
98*495ae853SAndroid Build Coastguard Worker         /* b1 */
99*495ae853SAndroid Build Coastguard Worker         u1_bin = ih264d_decode_terminate(ps_cab_env, ps_bitstrm);
100*495ae853SAndroid Build Coastguard Worker         if(u1_bin == 0)
101*495ae853SAndroid Build Coastguard Worker         {
102*495ae853SAndroid Build Coastguard Worker             /* I16x16 mode */
103*495ae853SAndroid Build Coastguard Worker             /* Read b2 and b3 */
104*495ae853SAndroid Build Coastguard Worker             u4_cxt_inc = (u1_inter) ? 0x021 : 0x043;
105*495ae853SAndroid Build Coastguard Worker 
106*495ae853SAndroid Build Coastguard Worker             u1_bin = ih264d_decode_bins(2, u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
107*495ae853SAndroid Build Coastguard Worker                                         ps_cab_env);
108*495ae853SAndroid Build Coastguard Worker 
109*495ae853SAndroid Build Coastguard Worker             if(u1_bin & 0x01)
110*495ae853SAndroid Build Coastguard Worker                 u1_mb_type += 4;
111*495ae853SAndroid Build Coastguard Worker 
112*495ae853SAndroid Build Coastguard Worker             if(u1_bin & 0x02)
113*495ae853SAndroid Build Coastguard Worker                 u1_mb_type += 12;
114*495ae853SAndroid Build Coastguard Worker 
115*495ae853SAndroid Build Coastguard Worker             if(u1_bin & 0x01)
116*495ae853SAndroid Build Coastguard Worker             {
117*495ae853SAndroid Build Coastguard Worker                 /* since b3=1, Read three bins */
118*495ae853SAndroid Build Coastguard Worker                 u4_cxt_inc = (u1_inter) ? 0x0332 : 0x0765;
119*495ae853SAndroid Build Coastguard Worker                 u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc, ps_mb_bin_ctxt,
120*495ae853SAndroid Build Coastguard Worker                                                     ps_bitstrm, ps_cab_env);
121*495ae853SAndroid Build Coastguard Worker 
122*495ae853SAndroid Build Coastguard Worker             }
123*495ae853SAndroid Build Coastguard Worker             else
124*495ae853SAndroid Build Coastguard Worker             {
125*495ae853SAndroid Build Coastguard Worker                 /* Read two bins */
126*495ae853SAndroid Build Coastguard Worker                 u4_cxt_inc = (u1_inter) ? 0x033 : 0x076;
127*495ae853SAndroid Build Coastguard Worker                 u1_bin = (UWORD8)ih264d_decode_bins(2, u4_cxt_inc, ps_mb_bin_ctxt,
128*495ae853SAndroid Build Coastguard Worker                                                     ps_bitstrm, ps_cab_env);
129*495ae853SAndroid Build Coastguard Worker             }
130*495ae853SAndroid Build Coastguard Worker             u1_mb_type += u1_bin;
131*495ae853SAndroid Build Coastguard Worker         }
132*495ae853SAndroid Build Coastguard Worker         else
133*495ae853SAndroid Build Coastguard Worker         {
134*495ae853SAndroid Build Coastguard Worker             /* I_PCM mode */
135*495ae853SAndroid Build Coastguard Worker             /* b1=1 */
136*495ae853SAndroid Build Coastguard Worker             u1_mb_type = 25;
137*495ae853SAndroid Build Coastguard Worker         }
138*495ae853SAndroid Build Coastguard Worker     }
139*495ae853SAndroid Build Coastguard Worker     return (u1_mb_type);
140*495ae853SAndroid Build Coastguard Worker }
141*495ae853SAndroid Build Coastguard Worker 
142*495ae853SAndroid Build Coastguard Worker /*!
143*495ae853SAndroid Build Coastguard Worker  **************************************************************************
144*495ae853SAndroid Build Coastguard Worker  * \if Function name : ih264d_parse_mb_type_cabac \endif
145*495ae853SAndroid Build Coastguard Worker  *
146*495ae853SAndroid Build Coastguard Worker  * \brief
147*495ae853SAndroid Build Coastguard Worker  *    This function decodes MB type using CABAC entropy coding mode.
148*495ae853SAndroid Build Coastguard Worker  *
149*495ae853SAndroid Build Coastguard Worker  * \return
150*495ae853SAndroid Build Coastguard Worker  *    MBType.
151*495ae853SAndroid Build Coastguard Worker  *
152*495ae853SAndroid Build Coastguard Worker  **************************************************************************
153*495ae853SAndroid Build Coastguard Worker  */
ih264d_parse_mb_type_cabac(struct _DecStruct * ps_dec)154*495ae853SAndroid Build Coastguard Worker UWORD32 ih264d_parse_mb_type_cabac(struct _DecStruct * ps_dec)
155*495ae853SAndroid Build Coastguard Worker {
156*495ae853SAndroid Build Coastguard Worker     const UWORD8 uc_slice_type = ps_dec->ps_cur_slice->u1_slice_type;
157*495ae853SAndroid Build Coastguard Worker     decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env;
158*495ae853SAndroid Build Coastguard Worker     dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
159*495ae853SAndroid Build Coastguard Worker     ctxt_inc_mb_info_t *ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
160*495ae853SAndroid Build Coastguard Worker     ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
161*495ae853SAndroid Build Coastguard Worker     WORD8 c_ctxt_inc;
162*495ae853SAndroid Build Coastguard Worker     bin_ctxt_model_t *ps_mb_bin_ctxt = ps_dec->p_mb_type_t;
163*495ae853SAndroid Build Coastguard Worker     WORD8 u1_mb_type = 0, u1_bin;
164*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cxt_inc;
165*495ae853SAndroid Build Coastguard Worker 
166*495ae853SAndroid Build Coastguard Worker     INC_SYM_COUNT(ps_cab_env);
167*495ae853SAndroid Build Coastguard Worker 
168*495ae853SAndroid Build Coastguard Worker     c_ctxt_inc = 0;
169*495ae853SAndroid Build Coastguard Worker 
170*495ae853SAndroid Build Coastguard Worker     if(uc_slice_type == SI_SLICE)
171*495ae853SAndroid Build Coastguard Worker     {
172*495ae853SAndroid Build Coastguard Worker         /* b0 */
173*495ae853SAndroid Build Coastguard Worker         if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info)
174*495ae853SAndroid Build Coastguard Worker             c_ctxt_inc += ((ps_left_ctxt->u1_mb_type != CAB_SI4x4) ? 1 : 0);
175*495ae853SAndroid Build Coastguard Worker         if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info)
176*495ae853SAndroid Build Coastguard Worker             c_ctxt_inc += ((ps_top_ctxt->u1_mb_type != CAB_SI4x4) ? 1 : 0);
177*495ae853SAndroid Build Coastguard Worker 
178*495ae853SAndroid Build Coastguard Worker         u4_cxt_inc = c_ctxt_inc;
179*495ae853SAndroid Build Coastguard Worker         u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
180*495ae853SAndroid Build Coastguard Worker                                            ps_cab_env);
181*495ae853SAndroid Build Coastguard Worker         if(u1_bin == 0)
182*495ae853SAndroid Build Coastguard Worker         {
183*495ae853SAndroid Build Coastguard Worker             /* SI MB */
184*495ae853SAndroid Build Coastguard Worker             u1_mb_type = 0;
185*495ae853SAndroid Build Coastguard Worker         }
186*495ae853SAndroid Build Coastguard Worker         else
187*495ae853SAndroid Build Coastguard Worker         {
188*495ae853SAndroid Build Coastguard Worker             u1_mb_type = 1 + ih264d_parse_mb_type_intra_cabac(0, ps_dec);
189*495ae853SAndroid Build Coastguard Worker         }
190*495ae853SAndroid Build Coastguard Worker     }
191*495ae853SAndroid Build Coastguard Worker     else if(uc_slice_type == P_SLICE)
192*495ae853SAndroid Build Coastguard Worker     {
193*495ae853SAndroid Build Coastguard Worker         /* P Slice */
194*495ae853SAndroid Build Coastguard Worker         /* b0 */
195*495ae853SAndroid Build Coastguard Worker         u4_cxt_inc = 0;
196*495ae853SAndroid Build Coastguard Worker         u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
197*495ae853SAndroid Build Coastguard Worker                                            ps_cab_env);
198*495ae853SAndroid Build Coastguard Worker         if(!u1_bin)
199*495ae853SAndroid Build Coastguard Worker         {
200*495ae853SAndroid Build Coastguard Worker             /* Inter MB types */
201*495ae853SAndroid Build Coastguard Worker             /* b1 */
202*495ae853SAndroid Build Coastguard Worker             u4_cxt_inc = 0x01;
203*495ae853SAndroid Build Coastguard Worker             u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
204*495ae853SAndroid Build Coastguard Worker                                                ps_bitstrm, ps_cab_env);
205*495ae853SAndroid Build Coastguard Worker             /* b2 */
206*495ae853SAndroid Build Coastguard Worker             u4_cxt_inc = u1_bin + 2;
207*495ae853SAndroid Build Coastguard Worker             u1_mb_type = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
208*495ae853SAndroid Build Coastguard Worker                                                   ps_bitstrm, ps_cab_env);
209*495ae853SAndroid Build Coastguard Worker             u1_mb_type = (u1_bin << 1) + u1_mb_type;
210*495ae853SAndroid Build Coastguard Worker             if(u1_mb_type)
211*495ae853SAndroid Build Coastguard Worker                 u1_mb_type = 4 - u1_mb_type;
212*495ae853SAndroid Build Coastguard Worker         }
213*495ae853SAndroid Build Coastguard Worker         else
214*495ae853SAndroid Build Coastguard Worker         {
215*495ae853SAndroid Build Coastguard Worker             /* Intra Prefix 1 found */
216*495ae853SAndroid Build Coastguard Worker             /* Intra MB type */
217*495ae853SAndroid Build Coastguard Worker             u1_mb_type = 5 + ih264d_parse_mb_type_intra_cabac(1, ps_dec);
218*495ae853SAndroid Build Coastguard Worker         }
219*495ae853SAndroid Build Coastguard Worker     }
220*495ae853SAndroid Build Coastguard Worker     else if(uc_slice_type == B_SLICE)
221*495ae853SAndroid Build Coastguard Worker     {
222*495ae853SAndroid Build Coastguard Worker         WORD8 a, b;
223*495ae853SAndroid Build Coastguard Worker         /* B Slice */
224*495ae853SAndroid Build Coastguard Worker         /* b0 */
225*495ae853SAndroid Build Coastguard Worker         /* a = b = 0, if B slice and MB is a SKIP or B_DIRECT16x16 */
226*495ae853SAndroid Build Coastguard Worker         a = 0;
227*495ae853SAndroid Build Coastguard Worker         b = 0;
228*495ae853SAndroid Build Coastguard Worker         u1_mb_type = 0;
229*495ae853SAndroid Build Coastguard Worker         if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info)
230*495ae853SAndroid Build Coastguard Worker             a = ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16);
231*495ae853SAndroid Build Coastguard Worker         if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info)
232*495ae853SAndroid Build Coastguard Worker             b = ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16);
233*495ae853SAndroid Build Coastguard Worker 
234*495ae853SAndroid Build Coastguard Worker         u4_cxt_inc = a + b;
235*495ae853SAndroid Build Coastguard Worker 
236*495ae853SAndroid Build Coastguard Worker         u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm,
237*495ae853SAndroid Build Coastguard Worker                                            ps_cab_env);
238*495ae853SAndroid Build Coastguard Worker 
239*495ae853SAndroid Build Coastguard Worker         if(u1_bin)
240*495ae853SAndroid Build Coastguard Worker         {
241*495ae853SAndroid Build Coastguard Worker 
242*495ae853SAndroid Build Coastguard Worker             /* b1 */
243*495ae853SAndroid Build Coastguard Worker             u4_cxt_inc = 0x03;
244*495ae853SAndroid Build Coastguard Worker             u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
245*495ae853SAndroid Build Coastguard Worker                                                ps_bitstrm, ps_cab_env);
246*495ae853SAndroid Build Coastguard Worker 
247*495ae853SAndroid Build Coastguard Worker             if(!u1_bin)
248*495ae853SAndroid Build Coastguard Worker             {
249*495ae853SAndroid Build Coastguard Worker                 /* b2 */
250*495ae853SAndroid Build Coastguard Worker                 u4_cxt_inc = 0x05;
251*495ae853SAndroid Build Coastguard Worker                 u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
252*495ae853SAndroid Build Coastguard Worker                                                    ps_bitstrm, ps_cab_env);
253*495ae853SAndroid Build Coastguard Worker 
254*495ae853SAndroid Build Coastguard Worker                 u1_mb_type = u1_bin + 1;
255*495ae853SAndroid Build Coastguard Worker             }
256*495ae853SAndroid Build Coastguard Worker             else
257*495ae853SAndroid Build Coastguard Worker             {
258*495ae853SAndroid Build Coastguard Worker                 u1_mb_type = 3;
259*495ae853SAndroid Build Coastguard Worker                 /* b2 */
260*495ae853SAndroid Build Coastguard Worker                 u4_cxt_inc = 0x04;
261*495ae853SAndroid Build Coastguard Worker                 u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
262*495ae853SAndroid Build Coastguard Worker                                                    ps_bitstrm, ps_cab_env);
263*495ae853SAndroid Build Coastguard Worker 
264*495ae853SAndroid Build Coastguard Worker                 if(u1_bin)
265*495ae853SAndroid Build Coastguard Worker                 {
266*495ae853SAndroid Build Coastguard Worker                     u1_mb_type += 8;
267*495ae853SAndroid Build Coastguard Worker                     /* b3 */
268*495ae853SAndroid Build Coastguard Worker                     u4_cxt_inc = 0x05;
269*495ae853SAndroid Build Coastguard Worker                     u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt,
270*495ae853SAndroid Build Coastguard Worker                                                        ps_bitstrm, ps_cab_env);
271*495ae853SAndroid Build Coastguard Worker 
272*495ae853SAndroid Build Coastguard Worker                     if(!u1_bin)
273*495ae853SAndroid Build Coastguard Worker                     {
274*495ae853SAndroid Build Coastguard Worker                         u1_mb_type++;
275*495ae853SAndroid Build Coastguard Worker                         /* b4, b5, b6 */
276*495ae853SAndroid Build Coastguard Worker                         u4_cxt_inc = 0x0555;
277*495ae853SAndroid Build Coastguard Worker                         u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc,
278*495ae853SAndroid Build Coastguard Worker                                                             ps_mb_bin_ctxt,
279*495ae853SAndroid Build Coastguard Worker                                                             ps_bitstrm,
280*495ae853SAndroid Build Coastguard Worker                                                             ps_cab_env);
281*495ae853SAndroid Build Coastguard Worker 
282*495ae853SAndroid Build Coastguard Worker 
283*495ae853SAndroid Build Coastguard Worker 
284*495ae853SAndroid Build Coastguard Worker                         u1_mb_type += u1_bin;
285*495ae853SAndroid Build Coastguard Worker                     }
286*495ae853SAndroid Build Coastguard Worker                     else
287*495ae853SAndroid Build Coastguard Worker                     {
288*495ae853SAndroid Build Coastguard Worker                         /* b4 */
289*495ae853SAndroid Build Coastguard Worker                         u4_cxt_inc = 0x05;
290*495ae853SAndroid Build Coastguard Worker                         u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc,
291*495ae853SAndroid Build Coastguard Worker                                                            ps_mb_bin_ctxt,
292*495ae853SAndroid Build Coastguard Worker                                                            ps_bitstrm,
293*495ae853SAndroid Build Coastguard Worker                                                            ps_cab_env);
294*495ae853SAndroid Build Coastguard Worker 
295*495ae853SAndroid Build Coastguard Worker                         if(u1_bin)
296*495ae853SAndroid Build Coastguard Worker                         {
297*495ae853SAndroid Build Coastguard Worker                             /* b5 */
298*495ae853SAndroid Build Coastguard Worker                             u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc,
299*495ae853SAndroid Build Coastguard Worker                                                                ps_mb_bin_ctxt,
300*495ae853SAndroid Build Coastguard Worker                                                                ps_bitstrm,
301*495ae853SAndroid Build Coastguard Worker                                                                ps_cab_env);
302*495ae853SAndroid Build Coastguard Worker 
303*495ae853SAndroid Build Coastguard Worker                             u1_mb_type += (u1_bin ? 11 : 0);
304*495ae853SAndroid Build Coastguard Worker                         }
305*495ae853SAndroid Build Coastguard Worker                         else
306*495ae853SAndroid Build Coastguard Worker                         {
307*495ae853SAndroid Build Coastguard Worker                             u1_mb_type = 20;
308*495ae853SAndroid Build Coastguard Worker                             /* b5 */
309*495ae853SAndroid Build Coastguard Worker                             u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc,
310*495ae853SAndroid Build Coastguard Worker                                                                ps_mb_bin_ctxt,
311*495ae853SAndroid Build Coastguard Worker                                                                ps_bitstrm,
312*495ae853SAndroid Build Coastguard Worker                                                                ps_cab_env);
313*495ae853SAndroid Build Coastguard Worker 
314*495ae853SAndroid Build Coastguard Worker                             if(!u1_bin)
315*495ae853SAndroid Build Coastguard Worker                             {
316*495ae853SAndroid Build Coastguard Worker                                 /* b6 */
317*495ae853SAndroid Build Coastguard Worker                                 u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc,
318*495ae853SAndroid Build Coastguard Worker                                                                    ps_mb_bin_ctxt,
319*495ae853SAndroid Build Coastguard Worker                                                                    ps_bitstrm,
320*495ae853SAndroid Build Coastguard Worker                                                                    ps_cab_env);
321*495ae853SAndroid Build Coastguard Worker 
322*495ae853SAndroid Build Coastguard Worker                                 u1_mb_type += u1_bin;
323*495ae853SAndroid Build Coastguard Worker                             }
324*495ae853SAndroid Build Coastguard Worker                             else
325*495ae853SAndroid Build Coastguard Worker                             {
326*495ae853SAndroid Build Coastguard Worker                                 /* Intra Prefix 111101 found */
327*495ae853SAndroid Build Coastguard Worker                                 /* Intra MB type */
328*495ae853SAndroid Build Coastguard Worker                                 u1_mb_type =
329*495ae853SAndroid Build Coastguard Worker                                                 23
330*495ae853SAndroid Build Coastguard Worker                                                                 + ih264d_parse_mb_type_intra_cabac(
331*495ae853SAndroid Build Coastguard Worker                                                                                 1,
332*495ae853SAndroid Build Coastguard Worker                                                                                 ps_dec);
333*495ae853SAndroid Build Coastguard Worker                             }
334*495ae853SAndroid Build Coastguard Worker                         }
335*495ae853SAndroid Build Coastguard Worker                     }
336*495ae853SAndroid Build Coastguard Worker                 }
337*495ae853SAndroid Build Coastguard Worker                 else
338*495ae853SAndroid Build Coastguard Worker                 {
339*495ae853SAndroid Build Coastguard Worker                     /* b3, b4, b5 */
340*495ae853SAndroid Build Coastguard Worker                     u4_cxt_inc = 0x0555;
341*495ae853SAndroid Build Coastguard Worker                     u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc,
342*495ae853SAndroid Build Coastguard Worker                                                         ps_mb_bin_ctxt, ps_bitstrm,
343*495ae853SAndroid Build Coastguard Worker                                                         ps_cab_env);
344*495ae853SAndroid Build Coastguard Worker 
345*495ae853SAndroid Build Coastguard Worker 
346*495ae853SAndroid Build Coastguard Worker 
347*495ae853SAndroid Build Coastguard Worker 
348*495ae853SAndroid Build Coastguard Worker                     u1_mb_type += u1_bin;
349*495ae853SAndroid Build Coastguard Worker                 }
350*495ae853SAndroid Build Coastguard Worker             }
351*495ae853SAndroid Build Coastguard Worker         }
352*495ae853SAndroid Build Coastguard Worker     }
353*495ae853SAndroid Build Coastguard Worker     return ((UWORD32)u1_mb_type);
354*495ae853SAndroid Build Coastguard Worker }
355*495ae853SAndroid Build Coastguard Worker 
356*495ae853SAndroid Build Coastguard Worker /*!
357*495ae853SAndroid Build Coastguard Worker  **************************************************************************
358*495ae853SAndroid Build Coastguard Worker  * \if Function name : DecSubMBType \endif
359*495ae853SAndroid Build Coastguard Worker  *
360*495ae853SAndroid Build Coastguard Worker  * \brief
361*495ae853SAndroid Build Coastguard Worker  *    This function decodes MB type using CABAC entropy coding mode.
362*495ae853SAndroid Build Coastguard Worker  *
363*495ae853SAndroid Build Coastguard Worker  * \return
364*495ae853SAndroid Build Coastguard Worker  *    MBType.
365*495ae853SAndroid Build Coastguard Worker  *
366*495ae853SAndroid Build Coastguard Worker  **************************************************************************
367*495ae853SAndroid Build Coastguard Worker  */
ih264d_parse_submb_type_cabac(const UWORD8 u1_slc_type_b,decoding_envirnoment_t * ps_cab_env,dec_bit_stream_t * ps_bitstrm,bin_ctxt_model_t * ps_sub_mb_cxt)368*495ae853SAndroid Build Coastguard Worker UWORD32 ih264d_parse_submb_type_cabac(const UWORD8 u1_slc_type_b,
369*495ae853SAndroid Build Coastguard Worker                                       decoding_envirnoment_t * ps_cab_env,
370*495ae853SAndroid Build Coastguard Worker                                       dec_bit_stream_t * ps_bitstrm,
371*495ae853SAndroid Build Coastguard Worker                                       bin_ctxt_model_t * ps_sub_mb_cxt)
372*495ae853SAndroid Build Coastguard Worker {
373*495ae853SAndroid Build Coastguard Worker     WORD8 u1_sub_mb_type, u1_bin;
374*495ae853SAndroid Build Coastguard Worker 
375*495ae853SAndroid Build Coastguard Worker     INC_SYM_COUNT(ps_cab_env);
376*495ae853SAndroid Build Coastguard Worker 
377*495ae853SAndroid Build Coastguard Worker     u1_sub_mb_type = 0;
378*495ae853SAndroid Build Coastguard Worker     u1_bin = (UWORD8)ih264d_decode_bin(0, ps_sub_mb_cxt, ps_bitstrm,
379*495ae853SAndroid Build Coastguard Worker                                        ps_cab_env);
380*495ae853SAndroid Build Coastguard Worker 
381*495ae853SAndroid Build Coastguard Worker     if(u1_slc_type_b ^ u1_bin)
382*495ae853SAndroid Build Coastguard Worker         return 0;
383*495ae853SAndroid Build Coastguard Worker 
384*495ae853SAndroid Build Coastguard Worker     if(!u1_slc_type_b)
385*495ae853SAndroid Build Coastguard Worker     {
386*495ae853SAndroid Build Coastguard Worker         /* P Slice */
387*495ae853SAndroid Build Coastguard Worker         u1_sub_mb_type = 1;
388*495ae853SAndroid Build Coastguard Worker         u1_bin = (UWORD8)ih264d_decode_bin(1, ps_sub_mb_cxt, ps_bitstrm,
389*495ae853SAndroid Build Coastguard Worker                                            ps_cab_env);
390*495ae853SAndroid Build Coastguard Worker         if(u1_bin == 1)
391*495ae853SAndroid Build Coastguard Worker         {
392*495ae853SAndroid Build Coastguard Worker             u1_bin = (UWORD8)ih264d_decode_bin(2, ps_sub_mb_cxt, ps_bitstrm,
393*495ae853SAndroid Build Coastguard Worker                                                ps_cab_env);
394*495ae853SAndroid Build Coastguard Worker             u1_sub_mb_type = (2 + (!u1_bin));
395*495ae853SAndroid Build Coastguard Worker         }
396*495ae853SAndroid Build Coastguard Worker 
397*495ae853SAndroid Build Coastguard Worker         return u1_sub_mb_type;
398*495ae853SAndroid Build Coastguard Worker     }
399*495ae853SAndroid Build Coastguard Worker     else
400*495ae853SAndroid Build Coastguard Worker     {
401*495ae853SAndroid Build Coastguard Worker         /* B Slice */
402*495ae853SAndroid Build Coastguard Worker 
403*495ae853SAndroid Build Coastguard Worker         /* b1 */
404*495ae853SAndroid Build Coastguard Worker         u1_bin = (UWORD8)ih264d_decode_bin(1, ps_sub_mb_cxt, ps_bitstrm,
405*495ae853SAndroid Build Coastguard Worker                                            ps_cab_env);
406*495ae853SAndroid Build Coastguard Worker         if(u1_bin)
407*495ae853SAndroid Build Coastguard Worker         {
408*495ae853SAndroid Build Coastguard Worker             /* b2 */
409*495ae853SAndroid Build Coastguard Worker             u1_bin = (UWORD8)ih264d_decode_bin(2, ps_sub_mb_cxt, ps_bitstrm,
410*495ae853SAndroid Build Coastguard Worker                                                ps_cab_env);
411*495ae853SAndroid Build Coastguard Worker             if(u1_bin)
412*495ae853SAndroid Build Coastguard Worker             {
413*495ae853SAndroid Build Coastguard Worker                 /* b3 */
414*495ae853SAndroid Build Coastguard Worker                 u1_sub_mb_type = 7;
415*495ae853SAndroid Build Coastguard Worker                 u1_bin = (UWORD8)ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm,
416*495ae853SAndroid Build Coastguard Worker                                                    ps_cab_env);
417*495ae853SAndroid Build Coastguard Worker                 u1_sub_mb_type += u1_bin << 2;
418*495ae853SAndroid Build Coastguard Worker                 u1_bin = !u1_bin;
419*495ae853SAndroid Build Coastguard Worker                 /* b4 */
420*495ae853SAndroid Build Coastguard Worker                 if(u1_bin == 0)
421*495ae853SAndroid Build Coastguard Worker                 {
422*495ae853SAndroid Build Coastguard Worker                     u1_bin = ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm,
423*495ae853SAndroid Build Coastguard Worker                                                ps_cab_env);
424*495ae853SAndroid Build Coastguard Worker                 }
425*495ae853SAndroid Build Coastguard Worker                 else
426*495ae853SAndroid Build Coastguard Worker                 {
427*495ae853SAndroid Build Coastguard Worker                     u1_bin = (UWORD8)ih264d_decode_bins(2, 0x33, ps_sub_mb_cxt,
428*495ae853SAndroid Build Coastguard Worker                                                         ps_bitstrm, ps_cab_env);
429*495ae853SAndroid Build Coastguard Worker                 }
430*495ae853SAndroid Build Coastguard Worker 
431*495ae853SAndroid Build Coastguard Worker                 return (u1_sub_mb_type + u1_bin);
432*495ae853SAndroid Build Coastguard Worker             }
433*495ae853SAndroid Build Coastguard Worker             else
434*495ae853SAndroid Build Coastguard Worker             {
435*495ae853SAndroid Build Coastguard Worker                 /* b3 */
436*495ae853SAndroid Build Coastguard Worker                 u1_bin = (UWORD8)ih264d_decode_bins(2, 0x33, ps_sub_mb_cxt,
437*495ae853SAndroid Build Coastguard Worker                                                     ps_bitstrm, ps_cab_env);
438*495ae853SAndroid Build Coastguard Worker                 return (3 + u1_bin);
439*495ae853SAndroid Build Coastguard Worker             }
440*495ae853SAndroid Build Coastguard Worker         }
441*495ae853SAndroid Build Coastguard Worker         else
442*495ae853SAndroid Build Coastguard Worker         {
443*495ae853SAndroid Build Coastguard Worker             /* b2 */
444*495ae853SAndroid Build Coastguard Worker             u1_bin = (UWORD8)ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm,
445*495ae853SAndroid Build Coastguard Worker                                                ps_cab_env);
446*495ae853SAndroid Build Coastguard Worker             return (1 + u1_bin);
447*495ae853SAndroid Build Coastguard Worker         }
448*495ae853SAndroid Build Coastguard Worker     }
449*495ae853SAndroid Build Coastguard Worker }
450*495ae853SAndroid Build Coastguard Worker 
451*495ae853SAndroid Build Coastguard Worker /*!
452*495ae853SAndroid Build Coastguard Worker  **************************************************************************
453*495ae853SAndroid Build Coastguard Worker  * \if Function name : ih264d_parse_ref_idx_cabac \endif
454*495ae853SAndroid Build Coastguard Worker  *
455*495ae853SAndroid Build Coastguard Worker  * \brief
456*495ae853SAndroid Build Coastguard Worker  *    This function decodes Reference Index using CABAC entropy coding mode.
457*495ae853SAndroid Build Coastguard Worker  *
458*495ae853SAndroid Build Coastguard Worker  * \return
459*495ae853SAndroid Build Coastguard Worker  *    None
460*495ae853SAndroid Build Coastguard Worker  *
461*495ae853SAndroid Build Coastguard Worker  **************************************************************************
462*495ae853SAndroid Build Coastguard Worker  */
ih264d_parse_ref_idx_cabac(const UWORD8 u1_num_part,const UWORD8 u1_b2,const UWORD8 u1_max_ref_minus1,const UWORD8 u1_mb_mode,WORD8 * pi1_ref_idx,WORD8 * const pi1_lft_cxt,WORD8 * const pi1_top_cxt,decoding_envirnoment_t * const ps_cab_env,dec_bit_stream_t * const ps_bitstrm,bin_ctxt_model_t * const ps_ref_cxt)463*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_parse_ref_idx_cabac(const UWORD8 u1_num_part,
464*495ae853SAndroid Build Coastguard Worker                                 const UWORD8 u1_b2,
465*495ae853SAndroid Build Coastguard Worker                                 const UWORD8 u1_max_ref_minus1,
466*495ae853SAndroid Build Coastguard Worker                                 const UWORD8 u1_mb_mode,
467*495ae853SAndroid Build Coastguard Worker                                 WORD8 * pi1_ref_idx,
468*495ae853SAndroid Build Coastguard Worker                                 WORD8 * const pi1_lft_cxt,
469*495ae853SAndroid Build Coastguard Worker                                 WORD8 * const pi1_top_cxt,
470*495ae853SAndroid Build Coastguard Worker                                 decoding_envirnoment_t * const ps_cab_env,
471*495ae853SAndroid Build Coastguard Worker                                 dec_bit_stream_t * const ps_bitstrm,
472*495ae853SAndroid Build Coastguard Worker                                 bin_ctxt_model_t * const ps_ref_cxt)
473*495ae853SAndroid Build Coastguard Worker {
474*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_a, u1_b;
475*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cxt_inc;
476*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_blk_no, u1_i, u1_idx_lft, u1_idx_top;
477*495ae853SAndroid Build Coastguard Worker     WORD8 i1_ref_idx;
478*495ae853SAndroid Build Coastguard Worker 
479*495ae853SAndroid Build Coastguard Worker     for(u1_blk_no = 0, u1_i = 0; u1_i < u1_num_part; u1_i++, pi1_ref_idx++)
480*495ae853SAndroid Build Coastguard Worker     {
481*495ae853SAndroid Build Coastguard Worker         u1_idx_lft = ((u1_blk_no & 0x02) >> 1) + u1_b2;
482*495ae853SAndroid Build Coastguard Worker         u1_idx_top = (u1_blk_no & 0x01) + u1_b2;
483*495ae853SAndroid Build Coastguard Worker         i1_ref_idx = *pi1_ref_idx;
484*495ae853SAndroid Build Coastguard Worker 
485*495ae853SAndroid Build Coastguard Worker         if(i1_ref_idx > 0)
486*495ae853SAndroid Build Coastguard Worker         {
487*495ae853SAndroid Build Coastguard Worker             u1_a = pi1_lft_cxt[u1_idx_lft] > 0;
488*495ae853SAndroid Build Coastguard Worker             u1_b = pi1_top_cxt[u1_idx_top] > 0;
489*495ae853SAndroid Build Coastguard Worker 
490*495ae853SAndroid Build Coastguard Worker             u4_cxt_inc = u1_a + (u1_b << 1);
491*495ae853SAndroid Build Coastguard Worker             u4_cxt_inc = (u4_cxt_inc | 0x55540);
492*495ae853SAndroid Build Coastguard Worker 
493*495ae853SAndroid Build Coastguard Worker             i1_ref_idx = (WORD8)ih264d_decode_bins_unary(32, u4_cxt_inc,
494*495ae853SAndroid Build Coastguard Worker                                                          ps_ref_cxt, ps_bitstrm,
495*495ae853SAndroid Build Coastguard Worker                                                          ps_cab_env);
496*495ae853SAndroid Build Coastguard Worker 
497*495ae853SAndroid Build Coastguard Worker             if((i1_ref_idx > u1_max_ref_minus1) || (i1_ref_idx < 0))
498*495ae853SAndroid Build Coastguard Worker             {
499*495ae853SAndroid Build Coastguard Worker                 return ERROR_REF_IDX;
500*495ae853SAndroid Build Coastguard Worker             }
501*495ae853SAndroid Build Coastguard Worker 
502*495ae853SAndroid Build Coastguard Worker             *pi1_ref_idx = i1_ref_idx;
503*495ae853SAndroid Build Coastguard Worker 
504*495ae853SAndroid Build Coastguard Worker             INC_SYM_COUNT(ps_cab_env);
505*495ae853SAndroid Build Coastguard Worker 
506*495ae853SAndroid Build Coastguard Worker         }
507*495ae853SAndroid Build Coastguard Worker 
508*495ae853SAndroid Build Coastguard Worker         /* Storing Reference Idx Information */
509*495ae853SAndroid Build Coastguard Worker         pi1_lft_cxt[u1_idx_lft] = i1_ref_idx;
510*495ae853SAndroid Build Coastguard Worker         pi1_top_cxt[u1_idx_top] = i1_ref_idx;
511*495ae853SAndroid Build Coastguard Worker         u1_blk_no = u1_blk_no + 1 + (u1_mb_mode & 0x01);
512*495ae853SAndroid Build Coastguard Worker     }
513*495ae853SAndroid Build Coastguard Worker     /* if(!u1_sub_mb) */
514*495ae853SAndroid Build Coastguard Worker     if(u1_num_part != 4)
515*495ae853SAndroid Build Coastguard Worker     {
516*495ae853SAndroid Build Coastguard Worker         pi1_lft_cxt[(!(u1_mb_mode & 0x1)) + u1_b2] = pi1_lft_cxt[u1_b2];
517*495ae853SAndroid Build Coastguard Worker         pi1_top_cxt[(!(u1_mb_mode & 0x2)) + u1_b2] = pi1_top_cxt[u1_b2];
518*495ae853SAndroid Build Coastguard Worker     }
519*495ae853SAndroid Build Coastguard Worker     return OK;
520*495ae853SAndroid Build Coastguard Worker }
521*495ae853SAndroid Build Coastguard Worker 
522*495ae853SAndroid Build Coastguard Worker /*!
523*495ae853SAndroid Build Coastguard Worker  **************************************************************************
524*495ae853SAndroid Build Coastguard Worker  * \if Function name : ih264d_parse_mb_qp_delta_cabac \endif
525*495ae853SAndroid Build Coastguard Worker  *
526*495ae853SAndroid Build Coastguard Worker  * \brief
527*495ae853SAndroid Build Coastguard Worker  *    This function decodes MB Qp delta using CABAC entropy coding mode.
528*495ae853SAndroid Build Coastguard Worker  *
529*495ae853SAndroid Build Coastguard Worker  * \return
530*495ae853SAndroid Build Coastguard Worker  *    None
531*495ae853SAndroid Build Coastguard Worker  *
532*495ae853SAndroid Build Coastguard Worker  **************************************************************************
533*495ae853SAndroid Build Coastguard Worker  */
ih264d_parse_mb_qp_delta_cabac(struct _DecStruct * ps_dec,WORD8 * pi1_mb_qp_delta)534*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_parse_mb_qp_delta_cabac(struct _DecStruct * ps_dec,
535*495ae853SAndroid Build Coastguard Worker                                       WORD8 *pi1_mb_qp_delta)
536*495ae853SAndroid Build Coastguard Worker {
537*495ae853SAndroid Build Coastguard Worker     decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
538*495ae853SAndroid Build Coastguard Worker     dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
539*495ae853SAndroid Build Coastguard Worker 
540*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_code_num;
541*495ae853SAndroid Build Coastguard Worker     bin_ctxt_model_t *ps_mb_qp_delta_ctxt = ps_dec->p_mb_qp_delta_t;
542*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cxt_inc;
543*495ae853SAndroid Build Coastguard Worker 
544*495ae853SAndroid Build Coastguard Worker     INC_SYM_COUNT(ps_cab_env);
545*495ae853SAndroid Build Coastguard Worker 
546*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc = (!(!(ps_dec->i1_prev_mb_qp_delta)));
547*495ae853SAndroid Build Coastguard Worker 
548*495ae853SAndroid Build Coastguard Worker     u1_code_num = 0;
549*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc = (u4_cxt_inc | 0x33320);
550*495ae853SAndroid Build Coastguard Worker     /* max number of bins = 53,
551*495ae853SAndroid Build Coastguard Worker      since Range for MbQpDelta= -26 to +25 inclusive, UNARY code */
552*495ae853SAndroid Build Coastguard Worker     u1_code_num = ih264d_decode_bins_unary(32, u4_cxt_inc, ps_mb_qp_delta_ctxt,
553*495ae853SAndroid Build Coastguard Worker                                           ps_bitstrm, ps_cab_env);
554*495ae853SAndroid Build Coastguard Worker     if(u1_code_num == 32)
555*495ae853SAndroid Build Coastguard Worker     {
556*495ae853SAndroid Build Coastguard Worker         /* Read remaining 21 bins */
557*495ae853SAndroid Build Coastguard Worker         UWORD8 uc_codeNumX;
558*495ae853SAndroid Build Coastguard Worker         u4_cxt_inc = 0x33333;
559*495ae853SAndroid Build Coastguard Worker         uc_codeNumX = ih264d_decode_bins_unary(21, u4_cxt_inc, ps_mb_qp_delta_ctxt,
560*495ae853SAndroid Build Coastguard Worker                                                ps_bitstrm, ps_cab_env);
561*495ae853SAndroid Build Coastguard Worker         u1_code_num = u1_code_num + uc_codeNumX;
562*495ae853SAndroid Build Coastguard Worker     }
563*495ae853SAndroid Build Coastguard Worker 
564*495ae853SAndroid Build Coastguard Worker     *pi1_mb_qp_delta = (u1_code_num + 1) >> 1;
565*495ae853SAndroid Build Coastguard Worker     /* Table 9.3: If code_num is even Syntax Element has -ve value */
566*495ae853SAndroid Build Coastguard Worker     if(!(u1_code_num & 0x01))
567*495ae853SAndroid Build Coastguard Worker         *pi1_mb_qp_delta = -(*pi1_mb_qp_delta);
568*495ae853SAndroid Build Coastguard Worker 
569*495ae853SAndroid Build Coastguard Worker     /* Range of MbQpDelta= -26 to +25 inclusive */
570*495ae853SAndroid Build Coastguard Worker     if((*pi1_mb_qp_delta < -26) || (*pi1_mb_qp_delta > 25))
571*495ae853SAndroid Build Coastguard Worker         return ERROR_INV_RANGE_QP_T;
572*495ae853SAndroid Build Coastguard Worker     ps_dec->i1_prev_mb_qp_delta = *pi1_mb_qp_delta;
573*495ae853SAndroid Build Coastguard Worker     return OK;
574*495ae853SAndroid Build Coastguard Worker }
575*495ae853SAndroid Build Coastguard Worker /*!
576*495ae853SAndroid Build Coastguard Worker  **************************************************************************
577*495ae853SAndroid Build Coastguard Worker  * \if Function name : ih264d_parse_chroma_pred_mode_cabac \endif
578*495ae853SAndroid Build Coastguard Worker  *
579*495ae853SAndroid Build Coastguard Worker  * \brief
580*495ae853SAndroid Build Coastguard Worker  *    This function decodes Chroma Pred mode using CABAC entropy coding mode.
581*495ae853SAndroid Build Coastguard Worker  *
582*495ae853SAndroid Build Coastguard Worker  * \return
583*495ae853SAndroid Build Coastguard Worker  *    None
584*495ae853SAndroid Build Coastguard Worker  *
585*495ae853SAndroid Build Coastguard Worker  **************************************************************************
586*495ae853SAndroid Build Coastguard Worker  */
ih264d_parse_chroma_pred_mode_cabac(struct _DecStruct * ps_dec)587*495ae853SAndroid Build Coastguard Worker WORD8 ih264d_parse_chroma_pred_mode_cabac(struct _DecStruct * ps_dec)
588*495ae853SAndroid Build Coastguard Worker {
589*495ae853SAndroid Build Coastguard Worker     decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
590*495ae853SAndroid Build Coastguard Worker     dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
591*495ae853SAndroid Build Coastguard Worker     ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
592*495ae853SAndroid Build Coastguard Worker     ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
593*495ae853SAndroid Build Coastguard Worker     WORD8 i1_chroma_pred_mode, a, b;
594*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cxt_inc;
595*495ae853SAndroid Build Coastguard Worker 
596*495ae853SAndroid Build Coastguard Worker     INC_SYM_COUNT(ps_cab_env);
597*495ae853SAndroid Build Coastguard Worker 
598*495ae853SAndroid Build Coastguard Worker     /* Binarization is TU and Cmax=3 */
599*495ae853SAndroid Build Coastguard Worker     i1_chroma_pred_mode = 0;
600*495ae853SAndroid Build Coastguard Worker     a = 0;
601*495ae853SAndroid Build Coastguard Worker     b = 0;
602*495ae853SAndroid Build Coastguard Worker 
603*495ae853SAndroid Build Coastguard Worker     a = ((ps_left_ctxt->u1_intra_chroma_pred_mode != 0) ? 1 : 0);
604*495ae853SAndroid Build Coastguard Worker 
605*495ae853SAndroid Build Coastguard Worker     b = ((ps_top_ctxt->u1_intra_chroma_pred_mode != 0) ? 1 : 0);
606*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc = a + b;
607*495ae853SAndroid Build Coastguard Worker 
608*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc = (u4_cxt_inc | 0x330);
609*495ae853SAndroid Build Coastguard Worker 
610*495ae853SAndroid Build Coastguard Worker     i1_chroma_pred_mode = ih264d_decode_bins_tunary(
611*495ae853SAndroid Build Coastguard Worker                     3, u4_cxt_inc, ps_dec->p_intra_chroma_pred_mode_t,
612*495ae853SAndroid Build Coastguard Worker                     ps_bitstrm, ps_cab_env);
613*495ae853SAndroid Build Coastguard Worker 
614*495ae853SAndroid Build Coastguard Worker     return (i1_chroma_pred_mode);
615*495ae853SAndroid Build Coastguard Worker }
616*495ae853SAndroid Build Coastguard Worker 
617*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
618*495ae853SAndroid Build Coastguard Worker /*                                                                           */
619*495ae853SAndroid Build Coastguard Worker /*  Function Name : ih264d_parse_transform8x8flag_cabac                                     */
620*495ae853SAndroid Build Coastguard Worker /*                                                                           */
621*495ae853SAndroid Build Coastguard Worker /*  Description   :                                                          */
622*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
623*495ae853SAndroid Build Coastguard Worker /*                                                                           */
624*495ae853SAndroid Build Coastguard Worker /*                                                                           */
625*495ae853SAndroid Build Coastguard Worker /*  Returns       :                                                          */
626*495ae853SAndroid Build Coastguard Worker /*                                                                           */
627*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
628*495ae853SAndroid Build Coastguard Worker /*                                                                           */
629*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
630*495ae853SAndroid Build Coastguard Worker /*                      Rajasekhar      Creation                             */
631*495ae853SAndroid Build Coastguard Worker /*                                                                           */
632*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_parse_transform8x8flag_cabac(struct _DecStruct * ps_dec,dec_mb_info_t * ps_cur_mb_info)633*495ae853SAndroid Build Coastguard Worker UWORD8 ih264d_parse_transform8x8flag_cabac(struct _DecStruct * ps_dec,
634*495ae853SAndroid Build Coastguard Worker                                            dec_mb_info_t * ps_cur_mb_info)
635*495ae853SAndroid Build Coastguard Worker {
636*495ae853SAndroid Build Coastguard Worker     decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
637*495ae853SAndroid Build Coastguard Worker     dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
638*495ae853SAndroid Build Coastguard Worker     ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
639*495ae853SAndroid Build Coastguard Worker     ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
640*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_transform_8x8flag;
641*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_mb_ngbr_avail = ps_cur_mb_info->u1_mb_ngbr_availablity;
642*495ae853SAndroid Build Coastguard Worker 
643*495ae853SAndroid Build Coastguard Worker     WORD8 a, b;
644*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cxt_inc;
645*495ae853SAndroid Build Coastguard Worker 
646*495ae853SAndroid Build Coastguard Worker     /* for calculating the context increment for transform8x8 u4_flag */
647*495ae853SAndroid Build Coastguard Worker     /* it reads transform8x8 u4_flag of the neighbors through */
648*495ae853SAndroid Build Coastguard Worker 
649*495ae853SAndroid Build Coastguard Worker     /* Binarization is FLC */
650*495ae853SAndroid Build Coastguard Worker     a = 0;
651*495ae853SAndroid Build Coastguard Worker     b = 0;
652*495ae853SAndroid Build Coastguard Worker 
653*495ae853SAndroid Build Coastguard Worker     if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK)
654*495ae853SAndroid Build Coastguard Worker     {
655*495ae853SAndroid Build Coastguard Worker         a = ps_left_ctxt->u1_transform8x8_ctxt;
656*495ae853SAndroid Build Coastguard Worker     }
657*495ae853SAndroid Build Coastguard Worker     if(u1_mb_ngbr_avail & TOP_MB_AVAILABLE_MASK)
658*495ae853SAndroid Build Coastguard Worker     {
659*495ae853SAndroid Build Coastguard Worker         b = ps_top_ctxt->u1_transform8x8_ctxt;
660*495ae853SAndroid Build Coastguard Worker 
661*495ae853SAndroid Build Coastguard Worker     }
662*495ae853SAndroid Build Coastguard Worker 
663*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc = a + b;
664*495ae853SAndroid Build Coastguard Worker 
665*495ae853SAndroid Build Coastguard Worker     u1_transform_8x8flag = ih264d_decode_bin(
666*495ae853SAndroid Build Coastguard Worker                     u4_cxt_inc, ps_dec->s_high_profile.ps_transform8x8_flag,
667*495ae853SAndroid Build Coastguard Worker                     ps_bitstrm, ps_cab_env);
668*495ae853SAndroid Build Coastguard Worker 
669*495ae853SAndroid Build Coastguard Worker     return (u1_transform_8x8flag);
670*495ae853SAndroid Build Coastguard Worker }
671*495ae853SAndroid Build Coastguard Worker 
672*495ae853SAndroid Build Coastguard Worker /*!
673*495ae853SAndroid Build Coastguard Worker  **************************************************************************
674*495ae853SAndroid Build Coastguard Worker  * \if Function name : ih264d_read_intra_pred_modes_cabac \endif
675*495ae853SAndroid Build Coastguard Worker  *
676*495ae853SAndroid Build Coastguard Worker  * \brief
677*495ae853SAndroid Build Coastguard Worker  *    Reads the intra pred mode related values of I4x4 MB from bitstream.
678*495ae853SAndroid Build Coastguard Worker  *
679*495ae853SAndroid Build Coastguard Worker  *    This function will read the prev intra pred mode flags and
680*495ae853SAndroid Build Coastguard Worker  *    stores it in pu1_prev_intra4x4_pred_mode_flag. If the u4_flag
681*495ae853SAndroid Build Coastguard Worker  *    indicates that most probable mode is not intra pred mode, then
682*495ae853SAndroid Build Coastguard Worker  *    the rem_intra4x4_pred_mode is read and stored in
683*495ae853SAndroid Build Coastguard Worker  *    pu1_rem_intra4x4_pred_mode array.
684*495ae853SAndroid Build Coastguard Worker  *
685*495ae853SAndroid Build Coastguard Worker  *
686*495ae853SAndroid Build Coastguard Worker  * \return
687*495ae853SAndroid Build Coastguard Worker  *    0 on success and Error code otherwise
688*495ae853SAndroid Build Coastguard Worker  *
689*495ae853SAndroid Build Coastguard Worker  **************************************************************************
690*495ae853SAndroid Build Coastguard Worker  */
ih264d_read_intra_pred_modes_cabac(dec_struct_t * ps_dec,UWORD8 * pu1_prev_intra4x4_pred_mode_flag,UWORD8 * pu1_rem_intra4x4_pred_mode,UWORD8 u1_tran_form8x8)691*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_read_intra_pred_modes_cabac(dec_struct_t * ps_dec,
692*495ae853SAndroid Build Coastguard Worker                                           UWORD8 * pu1_prev_intra4x4_pred_mode_flag,
693*495ae853SAndroid Build Coastguard Worker                                           UWORD8 * pu1_rem_intra4x4_pred_mode,
694*495ae853SAndroid Build Coastguard Worker                                           UWORD8 u1_tran_form8x8)
695*495ae853SAndroid Build Coastguard Worker {
696*495ae853SAndroid Build Coastguard Worker     WORD32 i4x4_luma_blk_idx = 0;
697*495ae853SAndroid Build Coastguard Worker     dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
698*495ae853SAndroid Build Coastguard Worker     decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
699*495ae853SAndroid Build Coastguard Worker     bin_ctxt_model_t *ps_ctxt_ipred_luma_mpm, *ps_ctx_ipred_luma_rm;
700*495ae853SAndroid Build Coastguard Worker     WORD32 i4_rem_intra4x4_pred_mode;
701*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_prev_intra4x4_pred_mode_flag;
702*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_code_int_range, u4_code_int_val_ofst;
703*495ae853SAndroid Build Coastguard Worker     const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
704*495ae853SAndroid Build Coastguard Worker 
705*495ae853SAndroid Build Coastguard Worker     ps_ctxt_ipred_luma_mpm = ps_dec->p_prev_intra4x4_pred_mode_flag_t;
706*495ae853SAndroid Build Coastguard Worker     ps_ctx_ipred_luma_rm = ps_dec->p_rem_intra4x4_pred_mode_t;
707*495ae853SAndroid Build Coastguard Worker     SWITCHOFFTRACE;
708*495ae853SAndroid Build Coastguard Worker 
709*495ae853SAndroid Build Coastguard Worker     i4x4_luma_blk_idx = (0 == u1_tran_form8x8) ? 16 : 4;
710*495ae853SAndroid Build Coastguard Worker 
711*495ae853SAndroid Build Coastguard Worker     u4_code_int_range = ps_cab_env->u4_code_int_range;
712*495ae853SAndroid Build Coastguard Worker     u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
713*495ae853SAndroid Build Coastguard Worker 
714*495ae853SAndroid Build Coastguard Worker     do
715*495ae853SAndroid Build Coastguard Worker     {
716*495ae853SAndroid Build Coastguard Worker 
717*495ae853SAndroid Build Coastguard Worker         DECODE_ONE_BIN_MACRO(ps_ctxt_ipred_luma_mpm, u4_code_int_range,
718*495ae853SAndroid Build Coastguard Worker                              u4_code_int_val_ofst, pu4_table, ps_bitstrm,
719*495ae853SAndroid Build Coastguard Worker                              u4_prev_intra4x4_pred_mode_flag)
720*495ae853SAndroid Build Coastguard Worker         *pu1_prev_intra4x4_pred_mode_flag = u4_prev_intra4x4_pred_mode_flag;
721*495ae853SAndroid Build Coastguard Worker 
722*495ae853SAndroid Build Coastguard Worker         i4_rem_intra4x4_pred_mode = -1;
723*495ae853SAndroid Build Coastguard Worker         if(!u4_prev_intra4x4_pred_mode_flag)
724*495ae853SAndroid Build Coastguard Worker         {
725*495ae853SAndroid Build Coastguard Worker 
726*495ae853SAndroid Build Coastguard Worker             /*inlining DecodeDecisionBins_FLC*/
727*495ae853SAndroid Build Coastguard Worker 
728*495ae853SAndroid Build Coastguard Worker             {
729*495ae853SAndroid Build Coastguard Worker 
730*495ae853SAndroid Build Coastguard Worker                 UWORD8 u1_max_bins = 3;
731*495ae853SAndroid Build Coastguard Worker                 UWORD32 u4_value;
732*495ae853SAndroid Build Coastguard Worker                 UWORD32 u4_symbol, i;
733*495ae853SAndroid Build Coastguard Worker 
734*495ae853SAndroid Build Coastguard Worker                 i = 0;
735*495ae853SAndroid Build Coastguard Worker                 u4_value = 0;
736*495ae853SAndroid Build Coastguard Worker 
737*495ae853SAndroid Build Coastguard Worker                 do
738*495ae853SAndroid Build Coastguard Worker                 {
739*495ae853SAndroid Build Coastguard Worker 
740*495ae853SAndroid Build Coastguard Worker                     DECODE_ONE_BIN_MACRO(ps_ctx_ipred_luma_rm, u4_code_int_range,
741*495ae853SAndroid Build Coastguard Worker                                          u4_code_int_val_ofst, pu4_table,
742*495ae853SAndroid Build Coastguard Worker                                          ps_bitstrm, u4_symbol)
743*495ae853SAndroid Build Coastguard Worker 
744*495ae853SAndroid Build Coastguard Worker                     INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
745*495ae853SAndroid Build Coastguard Worker 
746*495ae853SAndroid Build Coastguard Worker                     u4_value = u4_value | (u4_symbol << i);
747*495ae853SAndroid Build Coastguard Worker 
748*495ae853SAndroid Build Coastguard Worker                     i++;
749*495ae853SAndroid Build Coastguard Worker                 }
750*495ae853SAndroid Build Coastguard Worker                 while(i < u1_max_bins);
751*495ae853SAndroid Build Coastguard Worker 
752*495ae853SAndroid Build Coastguard Worker                 i4_rem_intra4x4_pred_mode = (u4_value);
753*495ae853SAndroid Build Coastguard Worker 
754*495ae853SAndroid Build Coastguard Worker             }
755*495ae853SAndroid Build Coastguard Worker 
756*495ae853SAndroid Build Coastguard Worker         }
757*495ae853SAndroid Build Coastguard Worker 
758*495ae853SAndroid Build Coastguard Worker         (*pu1_rem_intra4x4_pred_mode) = i4_rem_intra4x4_pred_mode;
759*495ae853SAndroid Build Coastguard Worker 
760*495ae853SAndroid Build Coastguard Worker         COPYTHECONTEXT("intra4x4_pred_mode", i4_rem_intra4x4_pred_mode);
761*495ae853SAndroid Build Coastguard Worker 
762*495ae853SAndroid Build Coastguard Worker         pu1_prev_intra4x4_pred_mode_flag++;
763*495ae853SAndroid Build Coastguard Worker         pu1_rem_intra4x4_pred_mode++;
764*495ae853SAndroid Build Coastguard Worker 
765*495ae853SAndroid Build Coastguard Worker         i4x4_luma_blk_idx--;
766*495ae853SAndroid Build Coastguard Worker     }
767*495ae853SAndroid Build Coastguard Worker     while(i4x4_luma_blk_idx);
768*495ae853SAndroid Build Coastguard Worker 
769*495ae853SAndroid Build Coastguard Worker     ps_cab_env->u4_code_int_range = u4_code_int_range;
770*495ae853SAndroid Build Coastguard Worker     ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
771*495ae853SAndroid Build Coastguard Worker 
772*495ae853SAndroid Build Coastguard Worker     return (0);
773*495ae853SAndroid Build Coastguard Worker 
774*495ae853SAndroid Build Coastguard Worker }
775*495ae853SAndroid Build Coastguard Worker 
776*495ae853SAndroid Build Coastguard Worker /*!
777*495ae853SAndroid Build Coastguard Worker  **************************************************************************
778*495ae853SAndroid Build Coastguard Worker  * \if Function name : ih264d_parse_ctx_cbp_cabac \endif
779*495ae853SAndroid Build Coastguard Worker  *
780*495ae853SAndroid Build Coastguard Worker  * \brief
781*495ae853SAndroid Build Coastguard Worker  *    This function decodes CtxCbpLuma and CtxCbpChroma (CBP of a Macroblock).
782*495ae853SAndroid Build Coastguard Worker  *    using CABAC entropy coding mode.
783*495ae853SAndroid Build Coastguard Worker  *
784*495ae853SAndroid Build Coastguard Worker  * \return
785*495ae853SAndroid Build Coastguard Worker  *    CBP of a MB.
786*495ae853SAndroid Build Coastguard Worker  *
787*495ae853SAndroid Build Coastguard Worker  **************************************************************************
788*495ae853SAndroid Build Coastguard Worker  */
ih264d_parse_ctx_cbp_cabac(struct _DecStruct * ps_dec)789*495ae853SAndroid Build Coastguard Worker UWORD32 ih264d_parse_ctx_cbp_cabac(struct _DecStruct * ps_dec)
790*495ae853SAndroid Build Coastguard Worker {
791*495ae853SAndroid Build Coastguard Worker 
792*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cxt_inc;
793*495ae853SAndroid Build Coastguard Worker     decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
794*495ae853SAndroid Build Coastguard Worker     dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
795*495ae853SAndroid Build Coastguard Worker     ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
796*495ae853SAndroid Build Coastguard Worker     ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
797*495ae853SAndroid Build Coastguard Worker     bin_ctxt_model_t *ps_ctxt_cbp_luma = ps_dec->p_cbp_luma_t, *ps_bin_ctxt;
798*495ae853SAndroid Build Coastguard Worker     WORD8 c_Cbp; //,i,j;
799*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_code_int_range, u4_code_int_val_ofst;
800*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_offset, *pu4_buffer;
801*495ae853SAndroid Build Coastguard Worker     const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
802*495ae853SAndroid Build Coastguard Worker 
803*495ae853SAndroid Build Coastguard Worker     INC_SYM_COUNT(ps_cab_env);
804*495ae853SAndroid Build Coastguard Worker 
805*495ae853SAndroid Build Coastguard Worker 
806*495ae853SAndroid Build Coastguard Worker 
807*495ae853SAndroid Build Coastguard Worker     /* CBP Luma, FL, Cmax = 15, L = 4 */
808*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc = (!((ps_top_ctxt->u1_cbp >> 2) & 0x01)) << 1;
809*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc += !((ps_left_ctxt->u1_cbp >> 1) & 0x01);
810*495ae853SAndroid Build Coastguard Worker 
811*495ae853SAndroid Build Coastguard Worker     u4_offset = ps_bitstrm->u4_ofst;
812*495ae853SAndroid Build Coastguard Worker     pu4_buffer = ps_bitstrm->pu4_buffer;
813*495ae853SAndroid Build Coastguard Worker 
814*495ae853SAndroid Build Coastguard Worker     u4_code_int_range = ps_cab_env->u4_code_int_range;
815*495ae853SAndroid Build Coastguard Worker     u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
816*495ae853SAndroid Build Coastguard Worker     /*renormalize to ensure there 23 bits more in the u4_code_int_val_ofst*/
817*495ae853SAndroid Build Coastguard Worker     {
818*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_clz, read_bits;
819*495ae853SAndroid Build Coastguard Worker 
820*495ae853SAndroid Build Coastguard Worker         u4_clz = CLZ(u4_code_int_range);
821*495ae853SAndroid Build Coastguard Worker         FLUSHBITS(u4_offset, u4_clz)
822*495ae853SAndroid Build Coastguard Worker         NEXTBITS(read_bits, u4_offset, pu4_buffer, 23)
823*495ae853SAndroid Build Coastguard Worker         u4_code_int_range = u4_code_int_range << u4_clz;
824*495ae853SAndroid Build Coastguard Worker         u4_code_int_val_ofst = (u4_code_int_val_ofst << u4_clz) | read_bits;
825*495ae853SAndroid Build Coastguard Worker     }
826*495ae853SAndroid Build Coastguard Worker 
827*495ae853SAndroid Build Coastguard Worker     ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc;
828*495ae853SAndroid Build Coastguard Worker 
829*495ae853SAndroid Build Coastguard Worker     /*inlining DecodeDecision_onebin without renorm*/
830*495ae853SAndroid Build Coastguard Worker     {
831*495ae853SAndroid Build Coastguard Worker 
832*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_qnt_int_range, u4_int_range_lps;
833*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_symbol, u1_mps_state;
834*495ae853SAndroid Build Coastguard Worker         UWORD32 table_lookup;
835*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_clz;
836*495ae853SAndroid Build Coastguard Worker 
837*495ae853SAndroid Build Coastguard Worker         u1_mps_state = (ps_bin_ctxt->u1_mps_state);
838*495ae853SAndroid Build Coastguard Worker 
839*495ae853SAndroid Build Coastguard Worker         u4_clz = CLZ(u4_code_int_range);
840*495ae853SAndroid Build Coastguard Worker         u4_qnt_int_range = u4_code_int_range << u4_clz;
841*495ae853SAndroid Build Coastguard Worker         u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
842*495ae853SAndroid Build Coastguard Worker 
843*495ae853SAndroid Build Coastguard Worker         table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
844*495ae853SAndroid Build Coastguard Worker         u4_int_range_lps = table_lookup & 0xff;
845*495ae853SAndroid Build Coastguard Worker 
846*495ae853SAndroid Build Coastguard Worker         u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
847*495ae853SAndroid Build Coastguard Worker         u4_code_int_range = u4_code_int_range - u4_int_range_lps;
848*495ae853SAndroid Build Coastguard Worker 
849*495ae853SAndroid Build Coastguard Worker         u4_symbol = ((u1_mps_state >> 6) & 0x1);
850*495ae853SAndroid Build Coastguard Worker 
851*495ae853SAndroid Build Coastguard Worker         /*if mps*/
852*495ae853SAndroid Build Coastguard Worker         u1_mps_state = (table_lookup >> 8) & 0x7F;
853*495ae853SAndroid Build Coastguard Worker 
854*495ae853SAndroid Build Coastguard Worker         CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
855*495ae853SAndroid Build Coastguard Worker                      u4_int_range_lps, u1_mps_state, table_lookup)
856*495ae853SAndroid Build Coastguard Worker 
857*495ae853SAndroid Build Coastguard Worker         INC_BIN_COUNT(ps_cab_env);
858*495ae853SAndroid Build Coastguard Worker 
859*495ae853SAndroid Build Coastguard Worker         ps_bin_ctxt->u1_mps_state = u1_mps_state;
860*495ae853SAndroid Build Coastguard Worker 
861*495ae853SAndroid Build Coastguard Worker         c_Cbp = u4_symbol;
862*495ae853SAndroid Build Coastguard Worker 
863*495ae853SAndroid Build Coastguard Worker     }
864*495ae853SAndroid Build Coastguard Worker 
865*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc = (!((ps_top_ctxt->u1_cbp >> 3) & 0x01)) << 1;
866*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc += !(c_Cbp & 0x01);
867*495ae853SAndroid Build Coastguard Worker     ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc;
868*495ae853SAndroid Build Coastguard Worker     /*inlining DecodeDecision_onebin without renorm*/
869*495ae853SAndroid Build Coastguard Worker 
870*495ae853SAndroid Build Coastguard Worker     {
871*495ae853SAndroid Build Coastguard Worker 
872*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_qnt_int_range, u4_int_range_lps;
873*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_symbol, u1_mps_state;
874*495ae853SAndroid Build Coastguard Worker         UWORD32 table_lookup;
875*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_clz;
876*495ae853SAndroid Build Coastguard Worker 
877*495ae853SAndroid Build Coastguard Worker         u1_mps_state = (ps_bin_ctxt->u1_mps_state);
878*495ae853SAndroid Build Coastguard Worker 
879*495ae853SAndroid Build Coastguard Worker         u4_clz = CLZ(u4_code_int_range);
880*495ae853SAndroid Build Coastguard Worker         u4_qnt_int_range = u4_code_int_range << u4_clz;
881*495ae853SAndroid Build Coastguard Worker         u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
882*495ae853SAndroid Build Coastguard Worker 
883*495ae853SAndroid Build Coastguard Worker         table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
884*495ae853SAndroid Build Coastguard Worker         u4_int_range_lps = table_lookup & 0xff;
885*495ae853SAndroid Build Coastguard Worker 
886*495ae853SAndroid Build Coastguard Worker         u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
887*495ae853SAndroid Build Coastguard Worker         u4_code_int_range = u4_code_int_range - u4_int_range_lps;
888*495ae853SAndroid Build Coastguard Worker 
889*495ae853SAndroid Build Coastguard Worker         u4_symbol = ((u1_mps_state >> 6) & 0x1);
890*495ae853SAndroid Build Coastguard Worker 
891*495ae853SAndroid Build Coastguard Worker         /*if mps*/
892*495ae853SAndroid Build Coastguard Worker         u1_mps_state = (table_lookup >> 8) & 0x7F;
893*495ae853SAndroid Build Coastguard Worker 
894*495ae853SAndroid Build Coastguard Worker         CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
895*495ae853SAndroid Build Coastguard Worker                      u4_int_range_lps, u1_mps_state, table_lookup)
896*495ae853SAndroid Build Coastguard Worker 
897*495ae853SAndroid Build Coastguard Worker         INC_BIN_COUNT(ps_cab_env);
898*495ae853SAndroid Build Coastguard Worker 
899*495ae853SAndroid Build Coastguard Worker         ps_bin_ctxt->u1_mps_state = u1_mps_state;
900*495ae853SAndroid Build Coastguard Worker 
901*495ae853SAndroid Build Coastguard Worker         c_Cbp |= u4_symbol << 1;
902*495ae853SAndroid Build Coastguard Worker 
903*495ae853SAndroid Build Coastguard Worker     }
904*495ae853SAndroid Build Coastguard Worker 
905*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc = (!(c_Cbp & 0x01)) << 1;
906*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc += !((ps_left_ctxt->u1_cbp >> 3) & 0x01);
907*495ae853SAndroid Build Coastguard Worker     ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc;
908*495ae853SAndroid Build Coastguard Worker     /*inlining DecodeDecision_onebin without renorm*/
909*495ae853SAndroid Build Coastguard Worker 
910*495ae853SAndroid Build Coastguard Worker     {
911*495ae853SAndroid Build Coastguard Worker 
912*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_qnt_int_range, u4_int_range_lps;
913*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_symbol, u1_mps_state;
914*495ae853SAndroid Build Coastguard Worker         UWORD32 table_lookup;
915*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_clz;
916*495ae853SAndroid Build Coastguard Worker 
917*495ae853SAndroid Build Coastguard Worker         u1_mps_state = (ps_bin_ctxt->u1_mps_state);
918*495ae853SAndroid Build Coastguard Worker 
919*495ae853SAndroid Build Coastguard Worker         u4_clz = CLZ(u4_code_int_range);
920*495ae853SAndroid Build Coastguard Worker         u4_qnt_int_range = u4_code_int_range << u4_clz;
921*495ae853SAndroid Build Coastguard Worker         u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
922*495ae853SAndroid Build Coastguard Worker 
923*495ae853SAndroid Build Coastguard Worker         table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
924*495ae853SAndroid Build Coastguard Worker         u4_int_range_lps = table_lookup & 0xff;
925*495ae853SAndroid Build Coastguard Worker 
926*495ae853SAndroid Build Coastguard Worker         u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
927*495ae853SAndroid Build Coastguard Worker         u4_code_int_range = u4_code_int_range - u4_int_range_lps;
928*495ae853SAndroid Build Coastguard Worker 
929*495ae853SAndroid Build Coastguard Worker         u4_symbol = ((u1_mps_state >> 6) & 0x1);
930*495ae853SAndroid Build Coastguard Worker 
931*495ae853SAndroid Build Coastguard Worker         /*if mps*/
932*495ae853SAndroid Build Coastguard Worker         u1_mps_state = (table_lookup >> 8) & 0x7F;
933*495ae853SAndroid Build Coastguard Worker 
934*495ae853SAndroid Build Coastguard Worker         CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
935*495ae853SAndroid Build Coastguard Worker                      u4_int_range_lps, u1_mps_state, table_lookup)
936*495ae853SAndroid Build Coastguard Worker 
937*495ae853SAndroid Build Coastguard Worker         INC_BIN_COUNT(ps_cab_env);
938*495ae853SAndroid Build Coastguard Worker 
939*495ae853SAndroid Build Coastguard Worker         ps_bin_ctxt->u1_mps_state = u1_mps_state;
940*495ae853SAndroid Build Coastguard Worker 
941*495ae853SAndroid Build Coastguard Worker         c_Cbp |= u4_symbol << 2;
942*495ae853SAndroid Build Coastguard Worker 
943*495ae853SAndroid Build Coastguard Worker     }
944*495ae853SAndroid Build Coastguard Worker 
945*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc = (!((c_Cbp >> 1) & 0x01)) << 1;
946*495ae853SAndroid Build Coastguard Worker     u4_cxt_inc += !((c_Cbp >> 2) & 0x01);
947*495ae853SAndroid Build Coastguard Worker     ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc;
948*495ae853SAndroid Build Coastguard Worker     /*inlining DecodeDecision_onebin without renorm*/
949*495ae853SAndroid Build Coastguard Worker 
950*495ae853SAndroid Build Coastguard Worker     {
951*495ae853SAndroid Build Coastguard Worker 
952*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_qnt_int_range, u4_int_range_lps;
953*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_symbol, u1_mps_state;
954*495ae853SAndroid Build Coastguard Worker         UWORD32 table_lookup;
955*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_clz;
956*495ae853SAndroid Build Coastguard Worker 
957*495ae853SAndroid Build Coastguard Worker         u1_mps_state = (ps_bin_ctxt->u1_mps_state);
958*495ae853SAndroid Build Coastguard Worker 
959*495ae853SAndroid Build Coastguard Worker         u4_clz = CLZ(u4_code_int_range);
960*495ae853SAndroid Build Coastguard Worker         u4_qnt_int_range = u4_code_int_range << u4_clz;
961*495ae853SAndroid Build Coastguard Worker         u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
962*495ae853SAndroid Build Coastguard Worker 
963*495ae853SAndroid Build Coastguard Worker         table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
964*495ae853SAndroid Build Coastguard Worker         u4_int_range_lps = table_lookup & 0xff;
965*495ae853SAndroid Build Coastguard Worker 
966*495ae853SAndroid Build Coastguard Worker         u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
967*495ae853SAndroid Build Coastguard Worker         u4_code_int_range = u4_code_int_range - u4_int_range_lps;
968*495ae853SAndroid Build Coastguard Worker 
969*495ae853SAndroid Build Coastguard Worker         u4_symbol = ((u1_mps_state >> 6) & 0x1);
970*495ae853SAndroid Build Coastguard Worker 
971*495ae853SAndroid Build Coastguard Worker         /*if mps*/
972*495ae853SAndroid Build Coastguard Worker         u1_mps_state = (table_lookup >> 8) & 0x7F;
973*495ae853SAndroid Build Coastguard Worker 
974*495ae853SAndroid Build Coastguard Worker         CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
975*495ae853SAndroid Build Coastguard Worker                      u4_int_range_lps, u1_mps_state, table_lookup)
976*495ae853SAndroid Build Coastguard Worker 
977*495ae853SAndroid Build Coastguard Worker         INC_BIN_COUNT(ps_cab_env);
978*495ae853SAndroid Build Coastguard Worker 
979*495ae853SAndroid Build Coastguard Worker         ps_bin_ctxt->u1_mps_state = u1_mps_state;
980*495ae853SAndroid Build Coastguard Worker 
981*495ae853SAndroid Build Coastguard Worker         c_Cbp |= u4_symbol << 3;
982*495ae853SAndroid Build Coastguard Worker 
983*495ae853SAndroid Build Coastguard Worker     }
984*495ae853SAndroid Build Coastguard Worker 
985*495ae853SAndroid Build Coastguard Worker     if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8)
986*495ae853SAndroid Build Coastguard Worker     {
987*495ae853SAndroid Build Coastguard Worker 
988*495ae853SAndroid Build Coastguard Worker         RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
989*495ae853SAndroid Build Coastguard Worker                             pu4_buffer)
990*495ae853SAndroid Build Coastguard Worker 
991*495ae853SAndroid Build Coastguard Worker     }
992*495ae853SAndroid Build Coastguard Worker 
993*495ae853SAndroid Build Coastguard Worker     {
994*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_cxt_inc;
995*495ae853SAndroid Build Coastguard Worker         WORD8 a, b, c, d;
996*495ae853SAndroid Build Coastguard Worker         bin_ctxt_model_t *p_CtxtCbpChroma = ps_dec->p_cbp_chroma_t;
997*495ae853SAndroid Build Coastguard Worker 
998*495ae853SAndroid Build Coastguard Worker         /* CBP Chroma, TU, Cmax = 2 */
999*495ae853SAndroid Build Coastguard Worker         a = 0;
1000*495ae853SAndroid Build Coastguard Worker         b = 0;
1001*495ae853SAndroid Build Coastguard Worker         c = 0;
1002*495ae853SAndroid Build Coastguard Worker         d = 0;
1003*495ae853SAndroid Build Coastguard Worker 
1004*495ae853SAndroid Build Coastguard Worker         {
1005*495ae853SAndroid Build Coastguard Worker             a = (ps_top_ctxt->u1_cbp > 15) ? 2 : 0;
1006*495ae853SAndroid Build Coastguard Worker             c = (ps_top_ctxt->u1_cbp > 31) ? 2 : 0;
1007*495ae853SAndroid Build Coastguard Worker         }
1008*495ae853SAndroid Build Coastguard Worker 
1009*495ae853SAndroid Build Coastguard Worker         {
1010*495ae853SAndroid Build Coastguard Worker             b = (ps_left_ctxt->u1_cbp > 15) ? 1 : 0;
1011*495ae853SAndroid Build Coastguard Worker             d = (ps_left_ctxt->u1_cbp > 31) ? 1 : 0;
1012*495ae853SAndroid Build Coastguard Worker         }
1013*495ae853SAndroid Build Coastguard Worker         u4_cxt_inc = a + b;
1014*495ae853SAndroid Build Coastguard Worker         u4_cxt_inc = (u4_cxt_inc | ((4 + c + d) << 4));
1015*495ae853SAndroid Build Coastguard Worker 
1016*495ae853SAndroid Build Coastguard Worker         /*inlining ih264d_decode_bins_tunary */
1017*495ae853SAndroid Build Coastguard Worker 
1018*495ae853SAndroid Build Coastguard Worker         {
1019*495ae853SAndroid Build Coastguard Worker 
1020*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_max_bins = 2;
1021*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_ctx_inc = u4_cxt_inc;
1022*495ae853SAndroid Build Coastguard Worker 
1023*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_value;
1024*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_symbol;
1025*495ae853SAndroid Build Coastguard Worker             UWORD8 u4_ctx_Inc;
1026*495ae853SAndroid Build Coastguard Worker             bin_ctxt_model_t *ps_bin_ctxt;
1027*495ae853SAndroid Build Coastguard Worker             u4_value = 0;
1028*495ae853SAndroid Build Coastguard Worker 
1029*495ae853SAndroid Build Coastguard Worker             do
1030*495ae853SAndroid Build Coastguard Worker             {
1031*495ae853SAndroid Build Coastguard Worker                 u4_ctx_Inc = u4_ctx_inc & 0xF;
1032*495ae853SAndroid Build Coastguard Worker                 u4_ctx_inc = u4_ctx_inc >> 4;
1033*495ae853SAndroid Build Coastguard Worker 
1034*495ae853SAndroid Build Coastguard Worker                 ps_bin_ctxt = p_CtxtCbpChroma + u4_ctx_Inc;
1035*495ae853SAndroid Build Coastguard Worker                 /*inlining DecodeDecision_onebin*/
1036*495ae853SAndroid Build Coastguard Worker                 {
1037*495ae853SAndroid Build Coastguard Worker 
1038*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_qnt_int_range, u4_int_range_lps;
1039*495ae853SAndroid Build Coastguard Worker 
1040*495ae853SAndroid Build Coastguard Worker                     UWORD32 u1_mps_state;
1041*495ae853SAndroid Build Coastguard Worker                     UWORD32 table_lookup;
1042*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_clz;
1043*495ae853SAndroid Build Coastguard Worker 
1044*495ae853SAndroid Build Coastguard Worker                     u1_mps_state = (ps_bin_ctxt->u1_mps_state);
1045*495ae853SAndroid Build Coastguard Worker 
1046*495ae853SAndroid Build Coastguard Worker                     u4_clz = CLZ(u4_code_int_range);
1047*495ae853SAndroid Build Coastguard Worker                     u4_qnt_int_range = u4_code_int_range << u4_clz;
1048*495ae853SAndroid Build Coastguard Worker                     u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
1049*495ae853SAndroid Build Coastguard Worker 
1050*495ae853SAndroid Build Coastguard Worker                     table_lookup = pu4_table[(u1_mps_state << 2)
1051*495ae853SAndroid Build Coastguard Worker                                     + u4_qnt_int_range];
1052*495ae853SAndroid Build Coastguard Worker                     u4_int_range_lps = table_lookup & 0xff;
1053*495ae853SAndroid Build Coastguard Worker 
1054*495ae853SAndroid Build Coastguard Worker                     u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
1055*495ae853SAndroid Build Coastguard Worker                     u4_code_int_range = u4_code_int_range - u4_int_range_lps;
1056*495ae853SAndroid Build Coastguard Worker 
1057*495ae853SAndroid Build Coastguard Worker                     u4_symbol = ((u1_mps_state >> 6) & 0x1);
1058*495ae853SAndroid Build Coastguard Worker 
1059*495ae853SAndroid Build Coastguard Worker                     /*if mps*/
1060*495ae853SAndroid Build Coastguard Worker                     u1_mps_state = (table_lookup >> 8) & 0x7F;
1061*495ae853SAndroid Build Coastguard Worker 
1062*495ae853SAndroid Build Coastguard Worker                     CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst,
1063*495ae853SAndroid Build Coastguard Worker                                  u4_symbol, u4_int_range_lps, u1_mps_state,
1064*495ae853SAndroid Build Coastguard Worker                                  table_lookup)
1065*495ae853SAndroid Build Coastguard Worker 
1066*495ae853SAndroid Build Coastguard Worker                     if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8)
1067*495ae853SAndroid Build Coastguard Worker                     {
1068*495ae853SAndroid Build Coastguard Worker                         RENORM_RANGE_OFFSET(u4_code_int_range,
1069*495ae853SAndroid Build Coastguard Worker                                             u4_code_int_val_ofst, u4_offset,
1070*495ae853SAndroid Build Coastguard Worker                                             pu4_buffer)
1071*495ae853SAndroid Build Coastguard Worker                     }
1072*495ae853SAndroid Build Coastguard Worker                     ps_bin_ctxt->u1_mps_state = u1_mps_state;
1073*495ae853SAndroid Build Coastguard Worker                 }
1074*495ae853SAndroid Build Coastguard Worker 
1075*495ae853SAndroid Build Coastguard Worker                 INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(
1076*495ae853SAndroid Build Coastguard Worker                                 ps_cab_env);
1077*495ae853SAndroid Build Coastguard Worker 
1078*495ae853SAndroid Build Coastguard Worker                 u4_value++;
1079*495ae853SAndroid Build Coastguard Worker             }
1080*495ae853SAndroid Build Coastguard Worker             while((u4_value < u1_max_bins) & (u4_symbol));
1081*495ae853SAndroid Build Coastguard Worker 
1082*495ae853SAndroid Build Coastguard Worker             u4_value = u4_value - 1 + u4_symbol;
1083*495ae853SAndroid Build Coastguard Worker 
1084*495ae853SAndroid Build Coastguard Worker             a = (u4_value);
1085*495ae853SAndroid Build Coastguard Worker 
1086*495ae853SAndroid Build Coastguard Worker         }
1087*495ae853SAndroid Build Coastguard Worker 
1088*495ae853SAndroid Build Coastguard Worker c_Cbp = (c_Cbp | (a << 4));
1089*495ae853SAndroid Build Coastguard Worker }
1090*495ae853SAndroid Build Coastguard Worker 
1091*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_ofst = u4_offset;
1092*495ae853SAndroid Build Coastguard Worker 
1093*495ae853SAndroid Build Coastguard Worker ps_cab_env->u4_code_int_range = u4_code_int_range;
1094*495ae853SAndroid Build Coastguard Worker ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
1095*495ae853SAndroid Build Coastguard Worker 
1096*495ae853SAndroid Build Coastguard Worker return (c_Cbp);
1097*495ae853SAndroid Build Coastguard Worker }
1098*495ae853SAndroid Build Coastguard Worker 
1099*495ae853SAndroid Build Coastguard Worker /*!
1100*495ae853SAndroid Build Coastguard Worker  **************************************************************************
1101*495ae853SAndroid Build Coastguard Worker  * \if Function name : ih264d_get_mvd_cabac \endif
1102*495ae853SAndroid Build Coastguard Worker  *
1103*495ae853SAndroid Build Coastguard Worker  * \brief
1104*495ae853SAndroid Build Coastguard Worker  *    This function decodes Horz and Vert mvd_l0 and mvd_l1 using CABAC entropy
1105*495ae853SAndroid Build Coastguard Worker  *    coding mode as defined in 9.3.2.3.
1106*495ae853SAndroid Build Coastguard Worker  *
1107*495ae853SAndroid Build Coastguard Worker  * \return
1108*495ae853SAndroid Build Coastguard Worker  *    None
1109*495ae853SAndroid Build Coastguard Worker  *
1110*495ae853SAndroid Build Coastguard Worker  **************************************************************************
1111*495ae853SAndroid Build Coastguard Worker  */
ih264d_get_mvd_cabac(UWORD8 u1_sub_mb,UWORD8 u1_b2,UWORD8 u1_part_wd,UWORD8 u1_part_ht,UWORD8 u1_dec_mvd,dec_struct_t * ps_dec,mv_pred_t * ps_mv)1112*495ae853SAndroid Build Coastguard Worker void ih264d_get_mvd_cabac(UWORD8 u1_sub_mb,
1113*495ae853SAndroid Build Coastguard Worker                           UWORD8 u1_b2,
1114*495ae853SAndroid Build Coastguard Worker                           UWORD8 u1_part_wd,
1115*495ae853SAndroid Build Coastguard Worker                           UWORD8 u1_part_ht,
1116*495ae853SAndroid Build Coastguard Worker                           UWORD8 u1_dec_mvd,
1117*495ae853SAndroid Build Coastguard Worker                           dec_struct_t *ps_dec,
1118*495ae853SAndroid Build Coastguard Worker                           mv_pred_t *ps_mv)
1119*495ae853SAndroid Build Coastguard Worker {
1120*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_abs_mvd_x = 0, u1_abs_mvd_y = 0;
1121*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_sub_mb_x, u1_sub_mb_y;
1122*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_top_mv_ctxt, *pu1_lft_mv_ctxt;
1123*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_mv;
1124*495ae853SAndroid Build Coastguard Worker 
1125*495ae853SAndroid Build Coastguard Worker     u1_sub_mb_x = (UWORD8)(u1_sub_mb & 0x03);
1126*495ae853SAndroid Build Coastguard Worker     u1_sub_mb_y = (UWORD8)(u1_sub_mb >> 2);
1127*495ae853SAndroid Build Coastguard Worker     pu1_top_mv_ctxt = &ps_dec->ps_curr_ctxt_mb_info->u1_mv[u1_sub_mb_x][u1_b2];
1128*495ae853SAndroid Build Coastguard Worker     pu1_lft_mv_ctxt = &ps_dec->pu1_left_mv_ctxt_inc[u1_sub_mb_y][u1_b2];
1129*495ae853SAndroid Build Coastguard Worker     pi2_mv = &ps_mv->i2_mv[u1_b2];
1130*495ae853SAndroid Build Coastguard Worker 
1131*495ae853SAndroid Build Coastguard Worker     if(u1_dec_mvd)
1132*495ae853SAndroid Build Coastguard Worker     {
1133*495ae853SAndroid Build Coastguard Worker         WORD16 i2_mv_x, i2_mv_y;
1134*495ae853SAndroid Build Coastguard Worker         WORD32 i2_temp;
1135*495ae853SAndroid Build Coastguard Worker         {
1136*495ae853SAndroid Build Coastguard Worker             decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
1137*495ae853SAndroid Build Coastguard Worker             dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
1138*495ae853SAndroid Build Coastguard Worker             UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a,
1139*495ae853SAndroid Build Coastguard Worker                             u2_abs_mvd_y_b;
1140*495ae853SAndroid Build Coastguard Worker 
1141*495ae853SAndroid Build Coastguard Worker             u2_abs_mvd_x_b = (UWORD16)pu1_top_mv_ctxt[0];
1142*495ae853SAndroid Build Coastguard Worker             u2_abs_mvd_y_b = (UWORD16)pu1_top_mv_ctxt[1];
1143*495ae853SAndroid Build Coastguard Worker             u2_abs_mvd_x_a = (UWORD16)pu1_lft_mv_ctxt[0];
1144*495ae853SAndroid Build Coastguard Worker             u2_abs_mvd_y_a = (UWORD16)pu1_lft_mv_ctxt[1];
1145*495ae853SAndroid Build Coastguard Worker 
1146*495ae853SAndroid Build Coastguard Worker             i2_temp = u2_abs_mvd_x_a + u2_abs_mvd_x_b;
1147*495ae853SAndroid Build Coastguard Worker 
1148*495ae853SAndroid Build Coastguard Worker             i2_mv_x = ih264d_parse_mvd_cabac(ps_bitstrm, ps_cab_env,
1149*495ae853SAndroid Build Coastguard Worker                                              ps_dec->p_mvd_x_t, i2_temp);
1150*495ae853SAndroid Build Coastguard Worker 
1151*495ae853SAndroid Build Coastguard Worker             i2_temp = u2_abs_mvd_y_a + u2_abs_mvd_y_b;
1152*495ae853SAndroid Build Coastguard Worker 
1153*495ae853SAndroid Build Coastguard Worker             i2_mv_y = ih264d_parse_mvd_cabac(ps_bitstrm, ps_cab_env,
1154*495ae853SAndroid Build Coastguard Worker                                              ps_dec->p_mvd_y_t, i2_temp);
1155*495ae853SAndroid Build Coastguard Worker         }
1156*495ae853SAndroid Build Coastguard Worker 
1157*495ae853SAndroid Build Coastguard Worker         /***********************************************************************/
1158*495ae853SAndroid Build Coastguard Worker         /* Store the abs_mvd_values in cabac contexts                          */
1159*495ae853SAndroid Build Coastguard Worker         /* The follownig code can be easily optimzed if mvX, mvY clip values   */
1160*495ae853SAndroid Build Coastguard Worker         /* are packed in 16 bits follwed by memcpy                             */
1161*495ae853SAndroid Build Coastguard Worker         /***********************************************************************/
1162*495ae853SAndroid Build Coastguard Worker         u1_abs_mvd_x = CLIP3(0, 127, ABS(i2_mv_x));
1163*495ae853SAndroid Build Coastguard Worker         u1_abs_mvd_y = CLIP3(0, 127, ABS(i2_mv_y));
1164*495ae853SAndroid Build Coastguard Worker 
1165*495ae853SAndroid Build Coastguard Worker         COPYTHECONTEXT("MVD", i2_mv_x);COPYTHECONTEXT("MVD", i2_mv_y);
1166*495ae853SAndroid Build Coastguard Worker 
1167*495ae853SAndroid Build Coastguard Worker         /* Storing Mv residuals */
1168*495ae853SAndroid Build Coastguard Worker         pi2_mv[0] = i2_mv_x;
1169*495ae853SAndroid Build Coastguard Worker         pi2_mv[1] = i2_mv_y;
1170*495ae853SAndroid Build Coastguard Worker     }
1171*495ae853SAndroid Build Coastguard Worker 
1172*495ae853SAndroid Build Coastguard Worker     /***************************************************************/
1173*495ae853SAndroid Build Coastguard Worker     /* Store abs_mvd_values cabac contexts                         */
1174*495ae853SAndroid Build Coastguard Worker     /***************************************************************/
1175*495ae853SAndroid Build Coastguard Worker     {
1176*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_i;
1177*495ae853SAndroid Build Coastguard Worker         for(u1_i = 0; u1_i < u1_part_wd; u1_i++, pu1_top_mv_ctxt += 4)
1178*495ae853SAndroid Build Coastguard Worker         {
1179*495ae853SAndroid Build Coastguard Worker             pu1_top_mv_ctxt[0] = u1_abs_mvd_x;
1180*495ae853SAndroid Build Coastguard Worker             pu1_top_mv_ctxt[1] = u1_abs_mvd_y;
1181*495ae853SAndroid Build Coastguard Worker         }
1182*495ae853SAndroid Build Coastguard Worker 
1183*495ae853SAndroid Build Coastguard Worker         for(u1_i = 0; u1_i < u1_part_ht; u1_i++, pu1_lft_mv_ctxt += 4)
1184*495ae853SAndroid Build Coastguard Worker         {
1185*495ae853SAndroid Build Coastguard Worker             pu1_lft_mv_ctxt[0] = u1_abs_mvd_x;
1186*495ae853SAndroid Build Coastguard Worker             pu1_lft_mv_ctxt[1] = u1_abs_mvd_y;
1187*495ae853SAndroid Build Coastguard Worker         }
1188*495ae853SAndroid Build Coastguard Worker     }
1189*495ae853SAndroid Build Coastguard Worker }
1190*495ae853SAndroid Build Coastguard Worker 
1191*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1192*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1193*495ae853SAndroid Build Coastguard Worker /*  Function Name : ih264d_parse_mvd_cabac                                                  */
1194*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1195*495ae853SAndroid Build Coastguard Worker /*  Description   : This cabac function decodes the mvd in a given direction */
1196*495ae853SAndroid Build Coastguard Worker /*                  direction ( x or y ) as defined in 9.3.2.3.              */
1197*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1198*495ae853SAndroid Build Coastguard Worker /*  Inputs        : 1. pointer to Bitstream                                  */
1199*495ae853SAndroid Build Coastguard Worker /*                  2. pointer to cabac decoding environmnet                 */
1200*495ae853SAndroid Build Coastguard Worker /*                  3. pointer to Mvd context                                */
1201*495ae853SAndroid Build Coastguard Worker /*                  4. abs(Top mvd) = u2_abs_mvd_b                           */
1202*495ae853SAndroid Build Coastguard Worker /*                  5. abs(left mvd)= u2_abs_mvd_a                           */
1203*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1204*495ae853SAndroid Build Coastguard Worker /*  Processing    : see section 9.3.2.3 of the standard                      */
1205*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1206*495ae853SAndroid Build Coastguard Worker /*  Outputs       : i2_mvd                                                   */
1207*495ae853SAndroid Build Coastguard Worker /*  Returns       : i2_mvd                                                   */
1208*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1209*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
1210*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1211*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1212*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1213*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1214*495ae853SAndroid Build Coastguard Worker /*         16 06 2005   Jay          Draft                                   */
1215*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1216*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_parse_mvd_cabac(dec_bit_stream_t * ps_bitstrm,decoding_envirnoment_t * ps_cab_env,bin_ctxt_model_t * p_ctxt_mvd,UWORD32 i4_temp)1217*495ae853SAndroid Build Coastguard Worker WORD16 ih264d_parse_mvd_cabac(dec_bit_stream_t * ps_bitstrm,
1218*495ae853SAndroid Build Coastguard Worker                               decoding_envirnoment_t * ps_cab_env,
1219*495ae853SAndroid Build Coastguard Worker                               bin_ctxt_model_t * p_ctxt_mvd,
1220*495ae853SAndroid Build Coastguard Worker                               UWORD32 i4_temp)
1221*495ae853SAndroid Build Coastguard Worker 
1222*495ae853SAndroid Build Coastguard Worker {
1223*495ae853SAndroid Build Coastguard Worker     WORD8 k;
1224*495ae853SAndroid Build Coastguard Worker     WORD16 i2_suf;
1225*495ae853SAndroid Build Coastguard Worker     WORD16 i2_mvd;
1226*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_abs_mvd;
1227*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ctx_inc;
1228*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_prefix;
1229*495ae853SAndroid Build Coastguard Worker     const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
1230*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_code_int_range, u4_code_int_val_ofst;
1231*495ae853SAndroid Build Coastguard Worker 
1232*495ae853SAndroid Build Coastguard Worker     /*  if mvd < 9                                                  */
1233*495ae853SAndroid Build Coastguard Worker     /*  mvd =  Prefix                                                   */
1234*495ae853SAndroid Build Coastguard Worker     /*  else                                                            */
1235*495ae853SAndroid Build Coastguard Worker     /*  mvd = Prefix + Suffix                                           */
1236*495ae853SAndroid Build Coastguard Worker     /*  decode sign bit                                                 */
1237*495ae853SAndroid Build Coastguard Worker     /*  Prefix TU decoding Cmax =Ucoff and Suffix 3rd order Exp-Golomb  */
1238*495ae853SAndroid Build Coastguard Worker 
1239*495ae853SAndroid Build Coastguard Worker     u2_abs_mvd = (UWORD16)i4_temp;
1240*495ae853SAndroid Build Coastguard Worker     u4_ctx_inc = 1;
1241*495ae853SAndroid Build Coastguard Worker 
1242*495ae853SAndroid Build Coastguard Worker     if(u2_abs_mvd < 3)
1243*495ae853SAndroid Build Coastguard Worker         u4_ctx_inc = 0;
1244*495ae853SAndroid Build Coastguard Worker     else if(u2_abs_mvd > 32)
1245*495ae853SAndroid Build Coastguard Worker         u4_ctx_inc = 2;
1246*495ae853SAndroid Build Coastguard Worker 
1247*495ae853SAndroid Build Coastguard Worker     u4_ctx_inc = (u4_ctx_inc | 0x65430);
1248*495ae853SAndroid Build Coastguard Worker 
1249*495ae853SAndroid Build Coastguard Worker     /*inlining modified version of ih264d_decode_bins_unary*/
1250*495ae853SAndroid Build Coastguard Worker 
1251*495ae853SAndroid Build Coastguard Worker     {
1252*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_max_bins = 9;
1253*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_value;
1254*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_symbol;
1255*495ae853SAndroid Build Coastguard Worker         bin_ctxt_model_t *ps_bin_ctxt;
1256*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_ctx_Inc;
1257*495ae853SAndroid Build Coastguard Worker 
1258*495ae853SAndroid Build Coastguard Worker         u4_value = 0;
1259*495ae853SAndroid Build Coastguard Worker         u4_code_int_range = ps_cab_env->u4_code_int_range;
1260*495ae853SAndroid Build Coastguard Worker         u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
1261*495ae853SAndroid Build Coastguard Worker 
1262*495ae853SAndroid Build Coastguard Worker         do
1263*495ae853SAndroid Build Coastguard Worker         {
1264*495ae853SAndroid Build Coastguard Worker             u4_ctx_Inc = u4_ctx_inc & 0xf;
1265*495ae853SAndroid Build Coastguard Worker             u4_ctx_inc = u4_ctx_inc >> 4;
1266*495ae853SAndroid Build Coastguard Worker 
1267*495ae853SAndroid Build Coastguard Worker             ps_bin_ctxt = p_ctxt_mvd + u4_ctx_Inc;
1268*495ae853SAndroid Build Coastguard Worker 
1269*495ae853SAndroid Build Coastguard Worker             DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range,
1270*495ae853SAndroid Build Coastguard Worker                                  u4_code_int_val_ofst, pu4_table, ps_bitstrm,
1271*495ae853SAndroid Build Coastguard Worker                                  u4_symbol)
1272*495ae853SAndroid Build Coastguard Worker 
1273*495ae853SAndroid Build Coastguard Worker             INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
1274*495ae853SAndroid Build Coastguard Worker 
1275*495ae853SAndroid Build Coastguard Worker             u4_value++;
1276*495ae853SAndroid Build Coastguard Worker 
1277*495ae853SAndroid Build Coastguard Worker         }
1278*495ae853SAndroid Build Coastguard Worker         while(u4_symbol && u4_value < 5);
1279*495ae853SAndroid Build Coastguard Worker 
1280*495ae853SAndroid Build Coastguard Worker         ps_bin_ctxt = p_ctxt_mvd + 6;
1281*495ae853SAndroid Build Coastguard Worker 
1282*495ae853SAndroid Build Coastguard Worker         if(u4_symbol && (u4_value < u1_max_bins))
1283*495ae853SAndroid Build Coastguard Worker         {
1284*495ae853SAndroid Build Coastguard Worker 
1285*495ae853SAndroid Build Coastguard Worker             do
1286*495ae853SAndroid Build Coastguard Worker             {
1287*495ae853SAndroid Build Coastguard Worker 
1288*495ae853SAndroid Build Coastguard Worker                 DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range,
1289*495ae853SAndroid Build Coastguard Worker                                      u4_code_int_val_ofst, pu4_table,
1290*495ae853SAndroid Build Coastguard Worker                                      ps_bitstrm, u4_symbol)
1291*495ae853SAndroid Build Coastguard Worker 
1292*495ae853SAndroid Build Coastguard Worker                 INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
1293*495ae853SAndroid Build Coastguard Worker                 u4_value++;
1294*495ae853SAndroid Build Coastguard Worker             }
1295*495ae853SAndroid Build Coastguard Worker             while(u4_symbol && (u4_value < u1_max_bins));
1296*495ae853SAndroid Build Coastguard Worker 
1297*495ae853SAndroid Build Coastguard Worker         }
1298*495ae853SAndroid Build Coastguard Worker 
1299*495ae853SAndroid Build Coastguard Worker         ps_cab_env->u4_code_int_range = u4_code_int_range;
1300*495ae853SAndroid Build Coastguard Worker         ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
1301*495ae853SAndroid Build Coastguard Worker         u4_value = u4_value - 1 + u4_symbol;
1302*495ae853SAndroid Build Coastguard Worker         u4_prefix = (u4_value);
1303*495ae853SAndroid Build Coastguard Worker     }
1304*495ae853SAndroid Build Coastguard Worker 
1305*495ae853SAndroid Build Coastguard Worker     i2_mvd = u4_prefix;
1306*495ae853SAndroid Build Coastguard Worker 
1307*495ae853SAndroid Build Coastguard Worker     if(i2_mvd == 9)
1308*495ae853SAndroid Build Coastguard Worker     {
1309*495ae853SAndroid Build Coastguard Worker         /* Read Suffix */
1310*495ae853SAndroid Build Coastguard Worker         k = ih264d_decode_bypass_bins_unary(ps_cab_env, ps_bitstrm);
1311*495ae853SAndroid Build Coastguard Worker         i2_suf = (1 << k) - 1;
1312*495ae853SAndroid Build Coastguard Worker         k = k + 3;
1313*495ae853SAndroid Build Coastguard Worker         i2_suf = (i2_suf << 3);
1314*495ae853SAndroid Build Coastguard Worker         i2_mvd += i2_suf;
1315*495ae853SAndroid Build Coastguard Worker         i2_suf = ih264d_decode_bypass_bins(ps_cab_env, k, ps_bitstrm);
1316*495ae853SAndroid Build Coastguard Worker         i2_mvd += i2_suf;
1317*495ae853SAndroid Build Coastguard Worker     }
1318*495ae853SAndroid Build Coastguard Worker     /* Read Sign bit */
1319*495ae853SAndroid Build Coastguard Worker     if(!i2_mvd)
1320*495ae853SAndroid Build Coastguard Worker         return (i2_mvd);
1321*495ae853SAndroid Build Coastguard Worker 
1322*495ae853SAndroid Build Coastguard Worker     else
1323*495ae853SAndroid Build Coastguard Worker     {
1324*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_code_int_val_ofst, u4_code_int_range;
1325*495ae853SAndroid Build Coastguard Worker 
1326*495ae853SAndroid Build Coastguard Worker         u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
1327*495ae853SAndroid Build Coastguard Worker         u4_code_int_range = ps_cab_env->u4_code_int_range;
1328*495ae853SAndroid Build Coastguard Worker 
1329*495ae853SAndroid Build Coastguard Worker         if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
1330*495ae853SAndroid Build Coastguard Worker         {
1331*495ae853SAndroid Build Coastguard Worker             UWORD32 *pu4_buffer, u4_offset;
1332*495ae853SAndroid Build Coastguard Worker 
1333*495ae853SAndroid Build Coastguard Worker             pu4_buffer = ps_bitstrm->pu4_buffer;
1334*495ae853SAndroid Build Coastguard Worker             u4_offset = ps_bitstrm->u4_ofst;
1335*495ae853SAndroid Build Coastguard Worker 
1336*495ae853SAndroid Build Coastguard Worker             RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst,
1337*495ae853SAndroid Build Coastguard Worker                                 u4_offset, pu4_buffer)
1338*495ae853SAndroid Build Coastguard Worker             ps_bitstrm->u4_ofst = u4_offset;
1339*495ae853SAndroid Build Coastguard Worker         }
1340*495ae853SAndroid Build Coastguard Worker 
1341*495ae853SAndroid Build Coastguard Worker         u4_code_int_range = u4_code_int_range >> 1;
1342*495ae853SAndroid Build Coastguard Worker 
1343*495ae853SAndroid Build Coastguard Worker         if(u4_code_int_val_ofst >= u4_code_int_range)
1344*495ae853SAndroid Build Coastguard Worker         {
1345*495ae853SAndroid Build Coastguard Worker             /* S=1 */
1346*495ae853SAndroid Build Coastguard Worker             u4_code_int_val_ofst -= u4_code_int_range;
1347*495ae853SAndroid Build Coastguard Worker             i2_mvd = (-i2_mvd);
1348*495ae853SAndroid Build Coastguard Worker         }
1349*495ae853SAndroid Build Coastguard Worker 
1350*495ae853SAndroid Build Coastguard Worker         ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
1351*495ae853SAndroid Build Coastguard Worker         ps_cab_env->u4_code_int_range = u4_code_int_range;
1352*495ae853SAndroid Build Coastguard Worker 
1353*495ae853SAndroid Build Coastguard Worker         return (i2_mvd);
1354*495ae853SAndroid Build Coastguard Worker 
1355*495ae853SAndroid Build Coastguard Worker     }
1356*495ae853SAndroid Build Coastguard Worker }
1357