1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2022 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 *******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker * isvce_cabac.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker * Contains all functions to encode in CABAC entropy mode
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker *
30*495ae853SAndroid Build Coastguard Worker * @author
31*495ae853SAndroid Build Coastguard Worker * Doney Alex
32*495ae853SAndroid Build Coastguard Worker *
33*495ae853SAndroid Build Coastguard Worker * @par List of Functions:
34*495ae853SAndroid Build Coastguard Worker *
35*495ae853SAndroid Build Coastguard Worker *
36*495ae853SAndroid Build Coastguard Worker * @remarks
37*495ae853SAndroid Build Coastguard Worker * None
38*495ae853SAndroid Build Coastguard Worker *
39*495ae853SAndroid Build Coastguard Worker *******************************************************************************
40*495ae853SAndroid Build Coastguard Worker */
41*495ae853SAndroid Build Coastguard Worker
42*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
43*495ae853SAndroid Build Coastguard Worker /* File Includes */
44*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
45*495ae853SAndroid Build Coastguard Worker
46*495ae853SAndroid Build Coastguard Worker /* System include files */
47*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
48*495ae853SAndroid Build Coastguard Worker #include <assert.h>
49*495ae853SAndroid Build Coastguard Worker #include <limits.h>
50*495ae853SAndroid Build Coastguard Worker #include <string.h>
51*495ae853SAndroid Build Coastguard Worker
52*495ae853SAndroid Build Coastguard Worker /* User include files */
53*495ae853SAndroid Build Coastguard Worker #include "ih264e_config.h"
54*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
55*495ae853SAndroid Build Coastguard Worker #include "iv2.h"
56*495ae853SAndroid Build Coastguard Worker #include "ive2.h"
57*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
58*495ae853SAndroid Build Coastguard Worker #include "isvc_defs.h"
59*495ae853SAndroid Build Coastguard Worker #include "isvce_defs.h"
60*495ae853SAndroid Build Coastguard Worker #include "isvc_macros.h"
61*495ae853SAndroid Build Coastguard Worker #include "ih264e_error.h"
62*495ae853SAndroid Build Coastguard Worker #include "ih264e_bitstream.h"
63*495ae853SAndroid Build Coastguard Worker #include "ime_distortion_metrics.h"
64*495ae853SAndroid Build Coastguard Worker #include "ime_defs.h"
65*495ae853SAndroid Build Coastguard Worker #include "ime_structs.h"
66*495ae853SAndroid Build Coastguard Worker #include "ih264_error.h"
67*495ae853SAndroid Build Coastguard Worker #include "isvc_structs.h"
68*495ae853SAndroid Build Coastguard Worker #include "isvc_trans_quant_itrans_iquant.h"
69*495ae853SAndroid Build Coastguard Worker #include "isvc_inter_pred_filters.h"
70*495ae853SAndroid Build Coastguard Worker #include "isvc_mem_fns.h"
71*495ae853SAndroid Build Coastguard Worker #include "ih264_padding.h"
72*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
73*495ae853SAndroid Build Coastguard Worker #include "ih264_intra_pred_filters.h"
74*495ae853SAndroid Build Coastguard Worker #include "ih264_deblk_edge_filters.h"
75*495ae853SAndroid Build Coastguard Worker #include "isvc_cabac_tables.h"
76*495ae853SAndroid Build Coastguard Worker #include "irc_cntrl_param.h"
77*495ae853SAndroid Build Coastguard Worker #include "irc_frame_info_collector.h"
78*495ae853SAndroid Build Coastguard Worker #include "isvce_rate_control.h"
79*495ae853SAndroid Build Coastguard Worker #include "isvce_cabac_structs.h"
80*495ae853SAndroid Build Coastguard Worker #include "isvce_structs.h"
81*495ae853SAndroid Build Coastguard Worker #include "isvce_cabac.h"
82*495ae853SAndroid Build Coastguard Worker #include "isvce_encode_header.h"
83*495ae853SAndroid Build Coastguard Worker #include "ih264_cavlc_tables.h"
84*495ae853SAndroid Build Coastguard Worker #include "isvce_cavlc.h"
85*495ae853SAndroid Build Coastguard Worker #include "ih264e_statistics.h"
86*495ae853SAndroid Build Coastguard Worker #include "ih264e_trace.h"
87*495ae853SAndroid Build Coastguard Worker #include "isvce_cabac_utils.h"
88*495ae853SAndroid Build Coastguard Worker #include "isvce_utils.h"
89*495ae853SAndroid Build Coastguard Worker
90*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
91*495ae853SAndroid Build Coastguard Worker /* Function Definitions */
92*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
93*495ae853SAndroid Build Coastguard Worker
94*495ae853SAndroid Build Coastguard Worker /**
95*495ae853SAndroid Build Coastguard Worker *******************************************************************************
96*495ae853SAndroid Build Coastguard Worker *
97*495ae853SAndroid Build Coastguard Worker * @brief
98*495ae853SAndroid Build Coastguard Worker * Encodes mb_skip_flag using CABAC entropy coding mode.
99*495ae853SAndroid Build Coastguard Worker *
100*495ae853SAndroid Build Coastguard Worker * @param[in] u1_mb_skip_flag
101*495ae853SAndroid Build Coastguard Worker * mb_skip_flag
102*495ae853SAndroid Build Coastguard Worker *
103*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cabac_ctxt
104*495ae853SAndroid Build Coastguard Worker * Pointer to cabac context structure
105*495ae853SAndroid Build Coastguard Worker *
106*495ae853SAndroid Build Coastguard Worker * @param[in] u4_ctxidx_offset
107*495ae853SAndroid Build Coastguard Worker * ctxIdxOffset for mb_skip_flag context
108*495ae853SAndroid Build Coastguard Worker *
109*495ae853SAndroid Build Coastguard Worker * @returns
110*495ae853SAndroid Build Coastguard Worker *
111*495ae853SAndroid Build Coastguard Worker * @remarks
112*495ae853SAndroid Build Coastguard Worker * None
113*495ae853SAndroid Build Coastguard Worker *
114*495ae853SAndroid Build Coastguard Worker *******************************************************************************
115*495ae853SAndroid Build Coastguard Worker */
isvce_cabac_enc_mb_skip(UWORD8 u1_mb_skip_flag,isvce_cabac_ctxt_t * ps_cabac_ctxt,UWORD32 u4_ctxidx_offset)116*495ae853SAndroid Build Coastguard Worker static void isvce_cabac_enc_mb_skip(UWORD8 u1_mb_skip_flag, isvce_cabac_ctxt_t *ps_cabac_ctxt,
117*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctxidx_offset)
118*495ae853SAndroid Build Coastguard Worker {
119*495ae853SAndroid Build Coastguard Worker UWORD8 u4_ctx_inc;
120*495ae853SAndroid Build Coastguard Worker WORD8 a, b;
121*495ae853SAndroid Build Coastguard Worker a = ((ps_cabac_ctxt->ps_left_ctxt_mb_info->u1_mb_type & CAB_SKIP_MASK) ? 0 : 1);
122*495ae853SAndroid Build Coastguard Worker b = ((ps_cabac_ctxt->ps_top_ctxt_mb_info->u1_mb_type & CAB_SKIP_MASK) ? 0 : 1);
123*495ae853SAndroid Build Coastguard Worker
124*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = a + b;
125*495ae853SAndroid Build Coastguard Worker /* Encode the bin */
126*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bin(ps_cabac_ctxt, (UWORD32) u1_mb_skip_flag,
127*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + u4_ctxidx_offset + u4_ctx_inc);
128*495ae853SAndroid Build Coastguard Worker }
129*495ae853SAndroid Build Coastguard Worker
130*495ae853SAndroid Build Coastguard Worker /* ! < Table 9-36 � Binarization for macroblock types in I slices in
131*495ae853SAndroid Build Coastguard Worker * ITU_T_H264-201402 Bits 0-7 : binarised value Bits 8-15: length of binary
132*495ae853SAndroid Build Coastguard Worker * sequence
133*495ae853SAndroid Build Coastguard Worker */
134*495ae853SAndroid Build Coastguard Worker static const UWORD32 u4_mb_type_intra[26] = {0x0100, 0x0620, 0x0621, 0x0622, 0x0623, 0x0748, 0x0749,
135*495ae853SAndroid Build Coastguard Worker 0x074a, 0x074b, 0x074c, 0x074d, 0x074e, 0x074f, 0x0628,
136*495ae853SAndroid Build Coastguard Worker 0x0629, 0x062a, 0x062b, 0x0758, 0x0759, 0x075a, 0x075b,
137*495ae853SAndroid Build Coastguard Worker 0x075c, 0x075d, 0x075e, 0x075f, 0x0203};
138*495ae853SAndroid Build Coastguard Worker
139*495ae853SAndroid Build Coastguard Worker /* CtxInc for mb types */
140*495ae853SAndroid Build Coastguard Worker static const UWORD32 u4_mb_ctxinc[2][26] = {
141*495ae853SAndroid Build Coastguard Worker /* Intra CtxInc's */
142*495ae853SAndroid Build Coastguard Worker {0x00, 0x03467, 0x03467, 0x03467, 0x03467, 0x034567, 0x034567, 0x034567, 0x034567,
143*495ae853SAndroid Build Coastguard Worker 0x034567, 0x034567, 0x034567, 0x034567, 0x03467, 0x03467, 0x03467, 0x03467, 0x034567,
144*495ae853SAndroid Build Coastguard Worker 0x034567, 0x034567, 0x034567, 0x034567, 0x034567, 0x034567, 0x034567, 0x00},
145*495ae853SAndroid Build Coastguard Worker /* Inter CtxInc's */
146*495ae853SAndroid Build Coastguard Worker {0x00, 0x001233, 0x001233, 0x001233, 0x001233, 0x0012233, 0x0012233,
147*495ae853SAndroid Build Coastguard Worker 0x0012233, 0x0012233, 0x0012233, 0x0012233, 0x0012233, 0x0012233, 0x001233,
148*495ae853SAndroid Build Coastguard Worker 0x001233, 0x001233, 0x001233, 0x0012233, 0x0012233, 0x0012233, 0x0012233,
149*495ae853SAndroid Build Coastguard Worker 0x0012233, 0x0012233, 0x0012233, 0x0012233, 0x00}};
150*495ae853SAndroid Build Coastguard Worker
151*495ae853SAndroid Build Coastguard Worker /**
152*495ae853SAndroid Build Coastguard Worker *******************************************************************************
153*495ae853SAndroid Build Coastguard Worker *
154*495ae853SAndroid Build Coastguard Worker * @brief
155*495ae853SAndroid Build Coastguard Worker * Encodes mb_type for an intra MB.
156*495ae853SAndroid Build Coastguard Worker *
157*495ae853SAndroid Build Coastguard Worker * @param[in] u4_slice_type
158*495ae853SAndroid Build Coastguard Worker * slice type
159*495ae853SAndroid Build Coastguard Worker *
160*495ae853SAndroid Build Coastguard Worker * @param[in] u4_intra_mb_type
161*495ae853SAndroid Build Coastguard Worker * MB type (Table 7-11)
162*495ae853SAndroid Build Coastguard Worker *
163*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cabac_ctxt
164*495ae853SAndroid Build Coastguard Worker * Pointer to cabac context structure
165*495ae853SAndroid Build Coastguard Worker *
166*495ae853SAndroid Build Coastguard Worker ** @param[in] u4_ctxidx_offset
167*495ae853SAndroid Build Coastguard Worker * ctxIdxOffset for mb_type context
168*495ae853SAndroid Build Coastguard Worker *
169*495ae853SAndroid Build Coastguard Worker * @returns
170*495ae853SAndroid Build Coastguard Worker *
171*495ae853SAndroid Build Coastguard Worker * @remarks
172*495ae853SAndroid Build Coastguard Worker * None
173*495ae853SAndroid Build Coastguard Worker *
174*495ae853SAndroid Build Coastguard Worker *******************************************************************************
175*495ae853SAndroid Build Coastguard Worker */
176*495ae853SAndroid Build Coastguard Worker
isvce_cabac_enc_intra_mb_type(UWORD32 u4_slice_type,UWORD32 u4_intra_mb_type,isvce_cabac_ctxt_t * ps_cabac_ctxt,UWORD32 u4_ctx_idx_offset)177*495ae853SAndroid Build Coastguard Worker static void isvce_cabac_enc_intra_mb_type(UWORD32 u4_slice_type, UWORD32 u4_intra_mb_type,
178*495ae853SAndroid Build Coastguard Worker isvce_cabac_ctxt_t *ps_cabac_ctxt,
179*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_idx_offset)
180*495ae853SAndroid Build Coastguard Worker {
181*495ae853SAndroid Build Coastguard Worker encoding_envirnoment_t *ps_cab_enc_env = &(ps_cabac_ctxt->s_cab_enc_env);
182*495ae853SAndroid Build Coastguard Worker bin_ctxt_model *pu1_mb_bin_ctxt, *pu1_bin_ctxt;
183*495ae853SAndroid Build Coastguard Worker UWORD8 u1_bin;
184*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info;
185*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info;
186*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bins;
187*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_inc;
188*495ae853SAndroid Build Coastguard Worker WORD8 i1_bins_len;
189*495ae853SAndroid Build Coastguard Worker UWORD32 u4_code_int_range;
190*495ae853SAndroid Build Coastguard Worker UWORD32 u4_code_int_low;
191*495ae853SAndroid Build Coastguard Worker UWORD16 u2_quant_code_int_range;
192*495ae853SAndroid Build Coastguard Worker UWORD16 u4_code_int_range_lps;
193*495ae853SAndroid Build Coastguard Worker WORD8 i;
194*495ae853SAndroid Build Coastguard Worker UWORD8 u1_ctx_inc;
195*495ae853SAndroid Build Coastguard Worker UWORD32 u4_table_val;
196*495ae853SAndroid Build Coastguard Worker
197*495ae853SAndroid Build Coastguard Worker pu1_mb_bin_ctxt = ps_cabac_ctxt->au1_cabac_ctxt_table + u4_ctx_idx_offset;
198*495ae853SAndroid Build Coastguard Worker
199*495ae853SAndroid Build Coastguard Worker u4_bins = u4_mb_type_intra[u4_intra_mb_type];
200*495ae853SAndroid Build Coastguard Worker i1_bins_len = (WORD8) ((u4_bins >> 8) & 0x0f);
201*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = u4_mb_ctxinc[(u4_slice_type != ISLICE)][u4_intra_mb_type];
202*495ae853SAndroid Build Coastguard Worker u1_ctx_inc = 0;
203*495ae853SAndroid Build Coastguard Worker if(u4_slice_type == ISLICE)
204*495ae853SAndroid Build Coastguard Worker {
205*495ae853SAndroid Build Coastguard Worker if(ps_left_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info)
206*495ae853SAndroid Build Coastguard Worker u1_ctx_inc += ((ps_left_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0);
207*495ae853SAndroid Build Coastguard Worker if(ps_top_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info)
208*495ae853SAndroid Build Coastguard Worker u1_ctx_inc += ((ps_top_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0);
209*495ae853SAndroid Build Coastguard Worker
210*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = (u4_ctx_inc | (u1_ctx_inc << ((i1_bins_len - 1) << 2)));
211*495ae853SAndroid Build Coastguard Worker }
212*495ae853SAndroid Build Coastguard Worker else
213*495ae853SAndroid Build Coastguard Worker {
214*495ae853SAndroid Build Coastguard Worker pu1_mb_bin_ctxt += 3;
215*495ae853SAndroid Build Coastguard Worker if(u4_slice_type == BSLICE) pu1_mb_bin_ctxt += 2;
216*495ae853SAndroid Build Coastguard Worker }
217*495ae853SAndroid Build Coastguard Worker
218*495ae853SAndroid Build Coastguard Worker u4_code_int_range = ps_cab_enc_env->u4_code_int_range;
219*495ae853SAndroid Build Coastguard Worker u4_code_int_low = ps_cab_enc_env->u4_code_int_low;
220*495ae853SAndroid Build Coastguard Worker
221*495ae853SAndroid Build Coastguard Worker for(i = (i1_bins_len - 1); i >= 0; i--)
222*495ae853SAndroid Build Coastguard Worker {
223*495ae853SAndroid Build Coastguard Worker WORD32 shift;
224*495ae853SAndroid Build Coastguard Worker
225*495ae853SAndroid Build Coastguard Worker u1_ctx_inc = ((u4_ctx_inc >> (i << 2)) & 0x0f);
226*495ae853SAndroid Build Coastguard Worker u1_bin = ((u4_bins >> i) & 0x01);
227*495ae853SAndroid Build Coastguard Worker /* Encode the bin */
228*495ae853SAndroid Build Coastguard Worker pu1_bin_ctxt = pu1_mb_bin_ctxt + u1_ctx_inc;
229*495ae853SAndroid Build Coastguard Worker if(i != (i1_bins_len - 2))
230*495ae853SAndroid Build Coastguard Worker {
231*495ae853SAndroid Build Coastguard Worker WORD8 i1_mps = !!((*pu1_bin_ctxt) & (0x40));
232*495ae853SAndroid Build Coastguard Worker WORD8 i1_state = (*pu1_bin_ctxt) & 0x3F;
233*495ae853SAndroid Build Coastguard Worker
234*495ae853SAndroid Build Coastguard Worker u2_quant_code_int_range = ((u4_code_int_range >> 6) & 0x03);
235*495ae853SAndroid Build Coastguard Worker u4_table_val = gau4_isvc_cabac_table[i1_state][u2_quant_code_int_range];
236*495ae853SAndroid Build Coastguard Worker u4_code_int_range_lps = u4_table_val & 0xFF;
237*495ae853SAndroid Build Coastguard Worker
238*495ae853SAndroid Build Coastguard Worker u4_code_int_range -= u4_code_int_range_lps;
239*495ae853SAndroid Build Coastguard Worker if(u1_bin != i1_mps)
240*495ae853SAndroid Build Coastguard Worker {
241*495ae853SAndroid Build Coastguard Worker u4_code_int_low += u4_code_int_range;
242*495ae853SAndroid Build Coastguard Worker u4_code_int_range = u4_code_int_range_lps;
243*495ae853SAndroid Build Coastguard Worker if(i1_state == 0)
244*495ae853SAndroid Build Coastguard Worker {
245*495ae853SAndroid Build Coastguard Worker /* MPS(CtxIdx) = 1 - MPS(CtxIdx) */
246*495ae853SAndroid Build Coastguard Worker i1_mps = 1 - i1_mps;
247*495ae853SAndroid Build Coastguard Worker }
248*495ae853SAndroid Build Coastguard Worker
249*495ae853SAndroid Build Coastguard Worker i1_state = (u4_table_val >> 15) & 0x3F;
250*495ae853SAndroid Build Coastguard Worker }
251*495ae853SAndroid Build Coastguard Worker else
252*495ae853SAndroid Build Coastguard Worker {
253*495ae853SAndroid Build Coastguard Worker i1_state = (u4_table_val >> 8) & 0x3F;
254*495ae853SAndroid Build Coastguard Worker }
255*495ae853SAndroid Build Coastguard Worker
256*495ae853SAndroid Build Coastguard Worker (*pu1_bin_ctxt) = (i1_mps << 6) | i1_state;
257*495ae853SAndroid Build Coastguard Worker }
258*495ae853SAndroid Build Coastguard Worker else
259*495ae853SAndroid Build Coastguard Worker {
260*495ae853SAndroid Build Coastguard Worker u4_code_int_range -= 2;
261*495ae853SAndroid Build Coastguard Worker }
262*495ae853SAndroid Build Coastguard Worker
263*495ae853SAndroid Build Coastguard Worker /* Renormalize */
264*495ae853SAndroid Build Coastguard Worker /*****************************************************************/
265*495ae853SAndroid Build Coastguard Worker /* Renormalization; calculate bits generated based on range(R) */
266*495ae853SAndroid Build Coastguard Worker /* Note : 6 <= R < 512; R is 2 only for terminating encode */
267*495ae853SAndroid Build Coastguard Worker /*****************************************************************/
268*495ae853SAndroid Build Coastguard Worker GETRANGE(shift, u4_code_int_range);
269*495ae853SAndroid Build Coastguard Worker shift = 9 - shift;
270*495ae853SAndroid Build Coastguard Worker u4_code_int_low <<= shift;
271*495ae853SAndroid Build Coastguard Worker u4_code_int_range <<= shift;
272*495ae853SAndroid Build Coastguard Worker
273*495ae853SAndroid Build Coastguard Worker /* bits to be inserted in the bitstream */
274*495ae853SAndroid Build Coastguard Worker ps_cab_enc_env->u4_bits_gen += shift;
275*495ae853SAndroid Build Coastguard Worker ps_cab_enc_env->u4_code_int_range = u4_code_int_range;
276*495ae853SAndroid Build Coastguard Worker ps_cab_enc_env->u4_code_int_low = u4_code_int_low;
277*495ae853SAndroid Build Coastguard Worker
278*495ae853SAndroid Build Coastguard Worker /* generate stream when a byte is ready */
279*495ae853SAndroid Build Coastguard Worker if(ps_cab_enc_env->u4_bits_gen > CABAC_BITS)
280*495ae853SAndroid Build Coastguard Worker {
281*495ae853SAndroid Build Coastguard Worker isvce_cabac_put_byte(ps_cabac_ctxt);
282*495ae853SAndroid Build Coastguard Worker u4_code_int_range = ps_cab_enc_env->u4_code_int_range;
283*495ae853SAndroid Build Coastguard Worker u4_code_int_low = ps_cab_enc_env->u4_code_int_low;
284*495ae853SAndroid Build Coastguard Worker }
285*495ae853SAndroid Build Coastguard Worker }
286*495ae853SAndroid Build Coastguard Worker }
287*495ae853SAndroid Build Coastguard Worker
288*495ae853SAndroid Build Coastguard Worker /**
289*495ae853SAndroid Build Coastguard Worker *******************************************************************************
290*495ae853SAndroid Build Coastguard Worker *
291*495ae853SAndroid Build Coastguard Worker * @brief
292*495ae853SAndroid Build Coastguard Worker * Encodes prev_intra4x4_pred_mode_flag and
293*495ae853SAndroid Build Coastguard Worker * rem_intra4x4_pred_mode using CABAC entropy coding mode
294*495ae853SAndroid Build Coastguard Worker *
295*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cabac_ctxt
296*495ae853SAndroid Build Coastguard Worker * Pointer to cabac context structure
297*495ae853SAndroid Build Coastguard Worker *
298*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_intra_4x4_modes
299*495ae853SAndroid Build Coastguard Worker * Pointer to array containing prev_intra4x4_pred_mode_flag and
300*495ae853SAndroid Build Coastguard Worker * rem_intra4x4_pred_mode
301*495ae853SAndroid Build Coastguard Worker *
302*495ae853SAndroid Build Coastguard Worker * @returns
303*495ae853SAndroid Build Coastguard Worker *
304*495ae853SAndroid Build Coastguard Worker * @remarks
305*495ae853SAndroid Build Coastguard Worker * None
306*495ae853SAndroid Build Coastguard Worker *
307*495ae853SAndroid Build Coastguard Worker *******************************************************************************
308*495ae853SAndroid Build Coastguard Worker */
isvce_cabac_enc_4x4mb_modes(isvce_cabac_ctxt_t * ps_cabac_ctxt,UWORD8 * pu1_intra_4x4_modes)309*495ae853SAndroid Build Coastguard Worker static void isvce_cabac_enc_4x4mb_modes(isvce_cabac_ctxt_t *ps_cabac_ctxt,
310*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_intra_4x4_modes)
311*495ae853SAndroid Build Coastguard Worker {
312*495ae853SAndroid Build Coastguard Worker WORD32 i;
313*495ae853SAndroid Build Coastguard Worker WORD8 byte;
314*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 16; i += 2)
315*495ae853SAndroid Build Coastguard Worker {
316*495ae853SAndroid Build Coastguard Worker /* sub blk idx 1 */
317*495ae853SAndroid Build Coastguard Worker byte = pu1_intra_4x4_modes[i >> 1];
318*495ae853SAndroid Build Coastguard Worker if(byte & 0x1)
319*495ae853SAndroid Build Coastguard Worker {
320*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bin(
321*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt, 1,
322*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + PREV_INTRA4X4_PRED_MODE_FLAG);
323*495ae853SAndroid Build Coastguard Worker }
324*495ae853SAndroid Build Coastguard Worker else
325*495ae853SAndroid Build Coastguard Worker {
326*495ae853SAndroid Build Coastguard Worker /* Binarization is FL and Cmax=7 */
327*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(
328*495ae853SAndroid Build Coastguard Worker byte & 0xF, 4, 0x05554, 4,
329*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + REM_INTRA4X4_PRED_MODE - 5, ps_cabac_ctxt);
330*495ae853SAndroid Build Coastguard Worker }
331*495ae853SAndroid Build Coastguard Worker /* sub blk idx 2 */
332*495ae853SAndroid Build Coastguard Worker byte >>= 4;
333*495ae853SAndroid Build Coastguard Worker if(byte & 0x1)
334*495ae853SAndroid Build Coastguard Worker {
335*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bin(
336*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt, 1,
337*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + PREV_INTRA4X4_PRED_MODE_FLAG);
338*495ae853SAndroid Build Coastguard Worker }
339*495ae853SAndroid Build Coastguard Worker else
340*495ae853SAndroid Build Coastguard Worker {
341*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(
342*495ae853SAndroid Build Coastguard Worker byte & 0xF, 4, 0x05554, 4,
343*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + REM_INTRA4X4_PRED_MODE - 5, ps_cabac_ctxt);
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 /**
349*495ae853SAndroid Build Coastguard Worker *******************************************************************************
350*495ae853SAndroid Build Coastguard Worker *
351*495ae853SAndroid Build Coastguard Worker * @brief
352*495ae853SAndroid Build Coastguard Worker * Encodes chroma intrapred mode for the MB.
353*495ae853SAndroid Build Coastguard Worker *
354*495ae853SAndroid Build Coastguard Worker * @param[in] u1_chroma_pred_mode
355*495ae853SAndroid Build Coastguard Worker * Chroma intr prediction mode
356*495ae853SAndroid Build Coastguard Worker *
357*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cabac_ctxt
358*495ae853SAndroid Build Coastguard Worker * Pointer to cabac context structure
359*495ae853SAndroid Build Coastguard Worker *
360*495ae853SAndroid Build Coastguard Worker * @returns
361*495ae853SAndroid Build Coastguard Worker *
362*495ae853SAndroid Build Coastguard Worker * @remarks
363*495ae853SAndroid Build Coastguard Worker * None
364*495ae853SAndroid Build Coastguard Worker *
365*495ae853SAndroid Build Coastguard Worker *******************************************************************************
366*495ae853SAndroid Build Coastguard Worker */
isvce_cabac_enc_chroma_predmode(UWORD8 u1_chroma_pred_mode,isvce_cabac_ctxt_t * ps_cabac_ctxt)367*495ae853SAndroid Build Coastguard Worker static void isvce_cabac_enc_chroma_predmode(UWORD8 u1_chroma_pred_mode,
368*495ae853SAndroid Build Coastguard Worker isvce_cabac_ctxt_t *ps_cabac_ctxt)
369*495ae853SAndroid Build Coastguard Worker {
370*495ae853SAndroid Build Coastguard Worker WORD8 i1_temp;
371*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info;
372*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info;
373*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info;
374*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bins = 0;
375*495ae853SAndroid Build Coastguard Worker WORD8 i1_bins_len = 1;
376*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_inc = 0;
377*495ae853SAndroid Build Coastguard Worker UWORD8 a, b;
378*495ae853SAndroid Build Coastguard Worker a = ((ps_left_ctxt->u1_intrapred_chroma_mode != 0) ? 1 : 0);
379*495ae853SAndroid Build Coastguard Worker b = ((ps_top_ctxt->u1_intrapred_chroma_mode != 0) ? 1 : 0);
380*495ae853SAndroid Build Coastguard Worker
381*495ae853SAndroid Build Coastguard Worker /* Binarization is TU and Cmax=3 */
382*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_intrapred_chroma_mode = u1_chroma_pred_mode;
383*495ae853SAndroid Build Coastguard Worker
384*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = a + b;
385*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = (u4_ctx_inc | 0x330);
386*495ae853SAndroid Build Coastguard Worker if(u1_chroma_pred_mode)
387*495ae853SAndroid Build Coastguard Worker {
388*495ae853SAndroid Build Coastguard Worker u4_bins = 1;
389*495ae853SAndroid Build Coastguard Worker i1_temp = u1_chroma_pred_mode;
390*495ae853SAndroid Build Coastguard Worker i1_temp--;
391*495ae853SAndroid Build Coastguard Worker /* Put a stream of 1's of length Chromaps_pred_mode_ctxt value */
392*495ae853SAndroid Build Coastguard Worker while(i1_temp)
393*495ae853SAndroid Build Coastguard Worker {
394*495ae853SAndroid Build Coastguard Worker u4_bins = (u4_bins | (1 << i1_bins_len));
395*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
396*495ae853SAndroid Build Coastguard Worker i1_temp--;
397*495ae853SAndroid Build Coastguard Worker }
398*495ae853SAndroid Build Coastguard Worker /* If Chromaps_pred_mode_ctxt < Cmax i.e 3. Terminate put a zero */
399*495ae853SAndroid Build Coastguard Worker if(u1_chroma_pred_mode < 3)
400*495ae853SAndroid Build Coastguard Worker {
401*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
402*495ae853SAndroid Build Coastguard Worker }
403*495ae853SAndroid Build Coastguard Worker }
404*495ae853SAndroid Build Coastguard Worker
405*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(u4_bins, i1_bins_len, u4_ctx_inc, 3,
406*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + INTRA_CHROMA_PRED_MODE,
407*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
408*495ae853SAndroid Build Coastguard Worker }
409*495ae853SAndroid Build Coastguard Worker
410*495ae853SAndroid Build Coastguard Worker /**
411*495ae853SAndroid Build Coastguard Worker *******************************************************************************
412*495ae853SAndroid Build Coastguard Worker *
413*495ae853SAndroid Build Coastguard Worker * @brief
414*495ae853SAndroid Build Coastguard Worker * Encodes CBP for the MB.
415*495ae853SAndroid Build Coastguard Worker *
416*495ae853SAndroid Build Coastguard Worker * @param[in] u1_cbp
417*495ae853SAndroid Build Coastguard Worker * CBP for the MB
418*495ae853SAndroid Build Coastguard Worker *
419*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cabac_ctxt
420*495ae853SAndroid Build Coastguard Worker * Pointer to cabac context structure
421*495ae853SAndroid Build Coastguard Worker *
422*495ae853SAndroid Build Coastguard Worker * @returns
423*495ae853SAndroid Build Coastguard Worker *
424*495ae853SAndroid Build Coastguard Worker * @remarks
425*495ae853SAndroid Build Coastguard Worker * None
426*495ae853SAndroid Build Coastguard Worker *
427*495ae853SAndroid Build Coastguard Worker *******************************************************************************
428*495ae853SAndroid Build Coastguard Worker */
isvce_cabac_enc_cbp(UWORD32 u4_cbp,isvce_cabac_ctxt_t * ps_cabac_ctxt)429*495ae853SAndroid Build Coastguard Worker static void isvce_cabac_enc_cbp(UWORD32 u4_cbp, isvce_cabac_ctxt_t *ps_cabac_ctxt)
430*495ae853SAndroid Build Coastguard Worker {
431*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info;
432*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info;
433*495ae853SAndroid Build Coastguard Worker WORD8 i2_cbp_chroma, i, j;
434*495ae853SAndroid Build Coastguard Worker UWORD8 u1_ctxt_inc, u1_bin;
435*495ae853SAndroid Build Coastguard Worker UWORD8 a, b;
436*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_inc;
437*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bins;
438*495ae853SAndroid Build Coastguard Worker WORD8 i1_bins_len;
439*495ae853SAndroid Build Coastguard Worker
440*495ae853SAndroid Build Coastguard Worker /* CBP Luma, FL, Cmax = 15, L = 4 */
441*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = 0;
442*495ae853SAndroid Build Coastguard Worker u4_bins = 0;
443*495ae853SAndroid Build Coastguard Worker i1_bins_len = 5;
444*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++)
445*495ae853SAndroid Build Coastguard Worker {
446*495ae853SAndroid Build Coastguard Worker /* calulate ctxtInc, depending on neighbour availability */
447*495ae853SAndroid Build Coastguard Worker /* u1_ctxt_inc = CondTerm(A) + 2 * CondTerm(B);
448*495ae853SAndroid Build Coastguard Worker A: Left block and B: Top block */
449*495ae853SAndroid Build Coastguard Worker
450*495ae853SAndroid Build Coastguard Worker /* Check for Top availability */
451*495ae853SAndroid Build Coastguard Worker if(i >> 1)
452*495ae853SAndroid Build Coastguard Worker {
453*495ae853SAndroid Build Coastguard Worker j = i - 2;
454*495ae853SAndroid Build Coastguard Worker /* Top is available always and it's current MB */
455*495ae853SAndroid Build Coastguard Worker b = (((u4_cbp >> j) & 0x01) != 0 ? 0 : 1);
456*495ae853SAndroid Build Coastguard Worker }
457*495ae853SAndroid Build Coastguard Worker else
458*495ae853SAndroid Build Coastguard Worker {
459*495ae853SAndroid Build Coastguard Worker /* for blocks whose top reference is in another MB */
460*495ae853SAndroid Build Coastguard Worker {
461*495ae853SAndroid Build Coastguard Worker j = i + 2;
462*495ae853SAndroid Build Coastguard Worker b = ((ps_top_ctxt->u1_cbp >> j) & 0x01) ? 0 : 1;
463*495ae853SAndroid Build Coastguard Worker }
464*495ae853SAndroid Build Coastguard Worker }
465*495ae853SAndroid Build Coastguard Worker
466*495ae853SAndroid Build Coastguard Worker /* Check for Left availability */
467*495ae853SAndroid Build Coastguard Worker if(i & 0x01)
468*495ae853SAndroid Build Coastguard Worker {
469*495ae853SAndroid Build Coastguard Worker /* Left is available always and it's current MB */
470*495ae853SAndroid Build Coastguard Worker j = i - 1;
471*495ae853SAndroid Build Coastguard Worker a = (((u4_cbp >> j) & 0x01) != 0 ? 0 : 1);
472*495ae853SAndroid Build Coastguard Worker }
473*495ae853SAndroid Build Coastguard Worker else
474*495ae853SAndroid Build Coastguard Worker {
475*495ae853SAndroid Build Coastguard Worker {
476*495ae853SAndroid Build Coastguard Worker j = i + 1;
477*495ae853SAndroid Build Coastguard Worker a = ((ps_left_ctxt->u1_cbp >> j) & 0x01) ? 0 : 1;
478*495ae853SAndroid Build Coastguard Worker }
479*495ae853SAndroid Build Coastguard Worker }
480*495ae853SAndroid Build Coastguard Worker u1_ctxt_inc = a + 2 * b;
481*495ae853SAndroid Build Coastguard Worker u1_bin = ((u4_cbp >> i) & 0x01);
482*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = (u4_ctx_inc | (u1_ctxt_inc << (i << 2)));
483*495ae853SAndroid Build Coastguard Worker u4_bins = (u4_bins | (u1_bin << i));
484*495ae853SAndroid Build Coastguard Worker }
485*495ae853SAndroid Build Coastguard Worker
486*495ae853SAndroid Build Coastguard Worker /* CBP Chroma, TU, Cmax = 2 */
487*495ae853SAndroid Build Coastguard Worker i2_cbp_chroma = u4_cbp >> 4;
488*495ae853SAndroid Build Coastguard Worker /* calulate ctxtInc, depending on neighbour availability */
489*495ae853SAndroid Build Coastguard Worker a = (ps_left_ctxt->u1_cbp > 15) ? 1 : 0;
490*495ae853SAndroid Build Coastguard Worker b = (ps_top_ctxt->u1_cbp > 15) ? 1 : 0;
491*495ae853SAndroid Build Coastguard Worker
492*495ae853SAndroid Build Coastguard Worker u1_ctxt_inc = a + 2 * b;
493*495ae853SAndroid Build Coastguard Worker if(i2_cbp_chroma)
494*495ae853SAndroid Build Coastguard Worker {
495*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = u4_ctx_inc | ((4 + u1_ctxt_inc) << 16);
496*495ae853SAndroid Build Coastguard Worker u4_bins = (u4_bins | 0x10);
497*495ae853SAndroid Build Coastguard Worker /* calulate ctxtInc, depending on neighbour availability */
498*495ae853SAndroid Build Coastguard Worker a = (ps_left_ctxt->u1_cbp > 31) ? 1 : 0;
499*495ae853SAndroid Build Coastguard Worker b = (ps_top_ctxt->u1_cbp > 31) ? 1 : 0;
500*495ae853SAndroid Build Coastguard Worker u1_ctxt_inc = a + 2 * b;
501*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = u4_ctx_inc | ((8 + u1_ctxt_inc) << 20);
502*495ae853SAndroid Build Coastguard Worker u4_bins = (u4_bins | (((i2_cbp_chroma >> 1) & 0x01) << i1_bins_len));
503*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
504*495ae853SAndroid Build Coastguard Worker }
505*495ae853SAndroid Build Coastguard Worker else
506*495ae853SAndroid Build Coastguard Worker {
507*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = (u4_ctx_inc | ((4 + u1_ctxt_inc) << 16));
508*495ae853SAndroid Build Coastguard Worker }
509*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(u4_bins, i1_bins_len, u4_ctx_inc, 8,
510*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + CBP_LUMA, ps_cabac_ctxt);
511*495ae853SAndroid Build Coastguard Worker }
512*495ae853SAndroid Build Coastguard Worker
513*495ae853SAndroid Build Coastguard Worker /**
514*495ae853SAndroid Build Coastguard Worker *******************************************************************************
515*495ae853SAndroid Build Coastguard Worker *
516*495ae853SAndroid Build Coastguard Worker * @brief
517*495ae853SAndroid Build Coastguard Worker * Encodes mb_qp_delta for the MB.
518*495ae853SAndroid Build Coastguard Worker *
519*495ae853SAndroid Build Coastguard Worker * @param[in] i1_mb_qp_delta
520*495ae853SAndroid Build Coastguard Worker * mb_qp_delta
521*495ae853SAndroid Build Coastguard Worker *
522*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cabac_ctxt
523*495ae853SAndroid Build Coastguard Worker * Pointer to cabac context structure
524*495ae853SAndroid Build Coastguard Worker *
525*495ae853SAndroid Build Coastguard Worker * @returns
526*495ae853SAndroid Build Coastguard Worker *
527*495ae853SAndroid Build Coastguard Worker * @remarks
528*495ae853SAndroid Build Coastguard Worker * None
529*495ae853SAndroid Build Coastguard Worker *
530*495ae853SAndroid Build Coastguard Worker *******************************************************************************
531*495ae853SAndroid Build Coastguard Worker */
isvce_cabac_enc_mb_qp_delta(WORD8 i1_mb_qp_delta,isvce_cabac_ctxt_t * ps_cabac_ctxt)532*495ae853SAndroid Build Coastguard Worker static void isvce_cabac_enc_mb_qp_delta(WORD8 i1_mb_qp_delta, isvce_cabac_ctxt_t *ps_cabac_ctxt)
533*495ae853SAndroid Build Coastguard Worker {
534*495ae853SAndroid Build Coastguard Worker UWORD8 u1_code_num;
535*495ae853SAndroid Build Coastguard Worker UWORD8 u1_ctxt_inc;
536*495ae853SAndroid Build Coastguard Worker
537*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bins;
538*495ae853SAndroid Build Coastguard Worker WORD8 i1_bins_len;
539*495ae853SAndroid Build Coastguard Worker
540*495ae853SAndroid Build Coastguard Worker /* Range of ps_mb_qp_delta_ctxt= -26 to +25 inclusive */
541*495ae853SAndroid Build Coastguard Worker ASSERT((i1_mb_qp_delta < 26) && (i1_mb_qp_delta > -27));
542*495ae853SAndroid Build Coastguard Worker
543*495ae853SAndroid Build Coastguard Worker /* if ps_mb_qp_delta_ctxt=0, then codeNum=0 */
544*495ae853SAndroid Build Coastguard Worker u1_code_num = 0;
545*495ae853SAndroid Build Coastguard Worker if(i1_mb_qp_delta > 0)
546*495ae853SAndroid Build Coastguard Worker {
547*495ae853SAndroid Build Coastguard Worker u1_code_num = (i1_mb_qp_delta << 1) - 1;
548*495ae853SAndroid Build Coastguard Worker }
549*495ae853SAndroid Build Coastguard Worker else if(i1_mb_qp_delta < 0)
550*495ae853SAndroid Build Coastguard Worker {
551*495ae853SAndroid Build Coastguard Worker u1_code_num = (ABS(i1_mb_qp_delta)) << 1;
552*495ae853SAndroid Build Coastguard Worker }
553*495ae853SAndroid Build Coastguard Worker
554*495ae853SAndroid Build Coastguard Worker u4_bins = 0;
555*495ae853SAndroid Build Coastguard Worker i1_bins_len = 1;
556*495ae853SAndroid Build Coastguard Worker
557*495ae853SAndroid Build Coastguard Worker u1_ctxt_inc = !!ps_cabac_ctxt->i1_prevps_mb_qp_delta_ctxt;
558*495ae853SAndroid Build Coastguard Worker
559*495ae853SAndroid Build Coastguard Worker if(u1_code_num == 0)
560*495ae853SAndroid Build Coastguard Worker {
561*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(u4_bins, i1_bins_len, u1_ctxt_inc, 3,
562*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + MB_QP_DELTA,
563*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
564*495ae853SAndroid Build Coastguard Worker }
565*495ae853SAndroid Build Coastguard Worker else
566*495ae853SAndroid Build Coastguard Worker {
567*495ae853SAndroid Build Coastguard Worker u4_bins = 1;
568*495ae853SAndroid Build Coastguard Worker u1_code_num--;
569*495ae853SAndroid Build Coastguard Worker
570*495ae853SAndroid Build Coastguard Worker if(u1_code_num == 0)
571*495ae853SAndroid Build Coastguard Worker {
572*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
573*495ae853SAndroid Build Coastguard Worker
574*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(u4_bins, i1_bins_len, u1_ctxt_inc | 0x20, 3,
575*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + MB_QP_DELTA,
576*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
577*495ae853SAndroid Build Coastguard Worker }
578*495ae853SAndroid Build Coastguard Worker else
579*495ae853SAndroid Build Coastguard Worker {
580*495ae853SAndroid Build Coastguard Worker u4_bins = (u4_bins | (1 << i1_bins_len));
581*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
582*495ae853SAndroid Build Coastguard Worker u1_code_num--;
583*495ae853SAndroid Build Coastguard Worker
584*495ae853SAndroid Build Coastguard Worker /* BinIdx from b2 onwards */
585*495ae853SAndroid Build Coastguard Worker if(u1_code_num < 30)
586*495ae853SAndroid Build Coastguard Worker {
587*495ae853SAndroid Build Coastguard Worker /* maximum i1_bins_len = 31 */
588*495ae853SAndroid Build Coastguard Worker while(u1_code_num)
589*495ae853SAndroid Build Coastguard Worker {
590*495ae853SAndroid Build Coastguard Worker u4_bins = (u4_bins | (1 << i1_bins_len));
591*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
592*495ae853SAndroid Build Coastguard Worker u1_code_num--;
593*495ae853SAndroid Build Coastguard Worker };
594*495ae853SAndroid Build Coastguard Worker
595*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
596*495ae853SAndroid Build Coastguard Worker
597*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(u4_bins, i1_bins_len, u1_ctxt_inc | 0x320, 2,
598*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + MB_QP_DELTA,
599*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
600*495ae853SAndroid Build Coastguard Worker }
601*495ae853SAndroid Build Coastguard Worker else
602*495ae853SAndroid Build Coastguard Worker {
603*495ae853SAndroid Build Coastguard Worker /* maximum i1_bins_len = 53 */
604*495ae853SAndroid Build Coastguard Worker u4_bins = 0xffffffff;
605*495ae853SAndroid Build Coastguard Worker i1_bins_len = 32;
606*495ae853SAndroid Build Coastguard Worker u1_code_num -= 30;
607*495ae853SAndroid Build Coastguard Worker
608*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(u4_bins, i1_bins_len, u1_ctxt_inc | 0x320, 2,
609*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + MB_QP_DELTA,
610*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
611*495ae853SAndroid Build Coastguard Worker
612*495ae853SAndroid Build Coastguard Worker u4_bins = 0;
613*495ae853SAndroid Build Coastguard Worker i1_bins_len = 0;
614*495ae853SAndroid Build Coastguard Worker
615*495ae853SAndroid Build Coastguard Worker while(u1_code_num)
616*495ae853SAndroid Build Coastguard Worker {
617*495ae853SAndroid Build Coastguard Worker u4_bins = (u4_bins | (1 << i1_bins_len));
618*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
619*495ae853SAndroid Build Coastguard Worker u1_code_num--;
620*495ae853SAndroid Build Coastguard Worker };
621*495ae853SAndroid Build Coastguard Worker
622*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
623*495ae853SAndroid Build Coastguard Worker
624*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(u4_bins, i1_bins_len, 0x333, 1,
625*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + MB_QP_DELTA,
626*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
627*495ae853SAndroid Build Coastguard Worker }
628*495ae853SAndroid Build Coastguard Worker }
629*495ae853SAndroid Build Coastguard Worker }
630*495ae853SAndroid Build Coastguard Worker }
631*495ae853SAndroid Build Coastguard Worker
632*495ae853SAndroid Build Coastguard Worker /**
633*495ae853SAndroid Build Coastguard Worker *******************************************************************************
634*495ae853SAndroid Build Coastguard Worker * @brief
635*495ae853SAndroid Build Coastguard Worker * Encodes 4residual_block_cabac as defined in 7.3.5.3.3.
636*495ae853SAndroid Build Coastguard Worker *
637*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_res_block
638*495ae853SAndroid Build Coastguard Worker * pointer to the array of residues
639*495ae853SAndroid Build Coastguard Worker *
640*495ae853SAndroid Build Coastguard Worker * @param[in] u1_nnz
641*495ae853SAndroid Build Coastguard Worker * Number of non zero coeffs in the block
642*495ae853SAndroid Build Coastguard Worker *
643*495ae853SAndroid Build Coastguard Worker * @param[in] u1_max_num_coeffs
644*495ae853SAndroid Build Coastguard Worker * Max number of coeffs that can be there in the block
645*495ae853SAndroid Build Coastguard Worker *
646*495ae853SAndroid Build Coastguard Worker * @param[in] u2_sig_coeff_map
647*495ae853SAndroid Build Coastguard Worker * Significant coeff map
648*495ae853SAndroid Build Coastguard Worker *
649*495ae853SAndroid Build Coastguard Worker * @param[in] u4_ctx_cat_offset
650*495ae853SAndroid Build Coastguard Worker * ctxIdxOffset for absolute value contexts
651*495ae853SAndroid Build Coastguard Worker *
652*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_ctxt_sig_coeff
653*495ae853SAndroid Build Coastguard Worker * Pointer to residual state variables
654*495ae853SAndroid Build Coastguard Worker *
655*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cabac_ctxt
656*495ae853SAndroid Build Coastguard Worker * Pointer to cabac context structure
657*495ae853SAndroid Build Coastguard Worker *
658*495ae853SAndroid Build Coastguard Worker * @returns
659*495ae853SAndroid Build Coastguard Worker *
660*495ae853SAndroid Build Coastguard Worker * @remarks
661*495ae853SAndroid Build Coastguard Worker * None
662*495ae853SAndroid Build Coastguard Worker *
663*495ae853SAndroid Build Coastguard Worker *******************************************************************************
664*495ae853SAndroid Build Coastguard Worker */
isvce_cabac_write_coeff4x4(WORD16 * pi2_res_block,UWORD8 u1_nnz,UWORD8 u1_max_num_coeffs,UWORD16 u2_sig_coeff_map,UWORD32 u4_ctx_cat_offset,bin_ctxt_model * pu1_ctxt_sig_coeff,isvce_cabac_ctxt_t * ps_cabac_ctxt)665*495ae853SAndroid Build Coastguard Worker static void isvce_cabac_write_coeff4x4(WORD16 *pi2_res_block, UWORD8 u1_nnz,
666*495ae853SAndroid Build Coastguard Worker UWORD8 u1_max_num_coeffs, UWORD16 u2_sig_coeff_map,
667*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_cat_offset,
668*495ae853SAndroid Build Coastguard Worker bin_ctxt_model *pu1_ctxt_sig_coeff,
669*495ae853SAndroid Build Coastguard Worker isvce_cabac_ctxt_t *ps_cabac_ctxt)
670*495ae853SAndroid Build Coastguard Worker {
671*495ae853SAndroid Build Coastguard Worker WORD8 i;
672*495ae853SAndroid Build Coastguard Worker WORD16 *pi16_coeffs;
673*495ae853SAndroid Build Coastguard Worker UWORD32 u4_sig_coeff, u4_bins;
674*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_inc;
675*495ae853SAndroid Build Coastguard Worker UWORD8 u1_last_sig_coef_index = (31 - CLZ(u2_sig_coeff_map));
676*495ae853SAndroid Build Coastguard Worker
677*495ae853SAndroid Build Coastguard Worker /* Always put Coded Block Flag as 1 */
678*495ae853SAndroid Build Coastguard Worker
679*495ae853SAndroid Build Coastguard Worker pi16_coeffs = pi2_res_block;
680*495ae853SAndroid Build Coastguard Worker {
681*495ae853SAndroid Build Coastguard Worker bin_ctxt_model *pu1_bin_ctxt;
682*495ae853SAndroid Build Coastguard Worker UWORD8 u1_bin, uc_last;
683*495ae853SAndroid Build Coastguard Worker
684*495ae853SAndroid Build Coastguard Worker i = 0;
685*495ae853SAndroid Build Coastguard Worker pu1_bin_ctxt = pu1_ctxt_sig_coeff;
686*495ae853SAndroid Build Coastguard Worker u4_sig_coeff = 0;
687*495ae853SAndroid Build Coastguard Worker u1_bin = 1;
688*495ae853SAndroid Build Coastguard Worker if((u1_last_sig_coef_index))
689*495ae853SAndroid Build Coastguard Worker {
690*495ae853SAndroid Build Coastguard Worker u1_bin = !!(u2_sig_coeff_map & 01);
691*495ae853SAndroid Build Coastguard Worker }
692*495ae853SAndroid Build Coastguard Worker uc_last = 1;
693*495ae853SAndroid Build Coastguard Worker
694*495ae853SAndroid Build Coastguard Worker do
695*495ae853SAndroid Build Coastguard Worker {
696*495ae853SAndroid Build Coastguard Worker /* Encode Decision */
697*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bin(ps_cabac_ctxt, u1_bin, pu1_bin_ctxt);
698*495ae853SAndroid Build Coastguard Worker
699*495ae853SAndroid Build Coastguard Worker if(u1_bin & uc_last)
700*495ae853SAndroid Build Coastguard Worker {
701*495ae853SAndroid Build Coastguard Worker u4_sig_coeff = (u4_sig_coeff | (1 << i));
702*495ae853SAndroid Build Coastguard Worker pu1_bin_ctxt = pu1_ctxt_sig_coeff + i + LAST_SIGNIFICANT_COEFF_FLAG_FRAME -
703*495ae853SAndroid Build Coastguard Worker SIGNIFICANT_COEFF_FLAG_FRAME;
704*495ae853SAndroid Build Coastguard Worker u1_bin = (i == u1_last_sig_coef_index);
705*495ae853SAndroid Build Coastguard Worker uc_last = 0;
706*495ae853SAndroid Build Coastguard Worker }
707*495ae853SAndroid Build Coastguard Worker else
708*495ae853SAndroid Build Coastguard Worker {
709*495ae853SAndroid Build Coastguard Worker i = i + 1;
710*495ae853SAndroid Build Coastguard Worker pu1_bin_ctxt = pu1_ctxt_sig_coeff + i;
711*495ae853SAndroid Build Coastguard Worker u1_bin = (i == u1_last_sig_coef_index);
712*495ae853SAndroid Build Coastguard Worker uc_last = 1;
713*495ae853SAndroid Build Coastguard Worker if((i != u1_last_sig_coef_index))
714*495ae853SAndroid Build Coastguard Worker {
715*495ae853SAndroid Build Coastguard Worker u1_bin = !!((u2_sig_coeff_map >> i) & 01);
716*495ae853SAndroid Build Coastguard Worker }
717*495ae853SAndroid Build Coastguard Worker }
718*495ae853SAndroid Build Coastguard Worker } while(!((i > u1_last_sig_coef_index) || (i > (u1_max_num_coeffs - 1))));
719*495ae853SAndroid Build Coastguard Worker }
720*495ae853SAndroid Build Coastguard Worker
721*495ae853SAndroid Build Coastguard Worker /* Encode coeff_abs_level_minus1 and coeff_sign_flag */
722*495ae853SAndroid Build Coastguard Worker {
723*495ae853SAndroid Build Coastguard Worker UWORD8 u1_sign;
724*495ae853SAndroid Build Coastguard Worker UWORD16 u2_abs_level;
725*495ae853SAndroid Build Coastguard Worker UWORD8 u1_abs_level_equal1 = 1, u1_abs_level_gt1 = 0;
726*495ae853SAndroid Build Coastguard Worker UWORD8 u1_ctx_inc;
727*495ae853SAndroid Build Coastguard Worker UWORD8 u1_coff;
728*495ae853SAndroid Build Coastguard Worker WORD16 i2_sufs;
729*495ae853SAndroid Build Coastguard Worker WORD8 i1_bins_len;
730*495ae853SAndroid Build Coastguard Worker i = u1_last_sig_coef_index;
731*495ae853SAndroid Build Coastguard Worker pi16_coeffs = pi2_res_block + u1_nnz - 1;
732*495ae853SAndroid Build Coastguard Worker do
733*495ae853SAndroid Build Coastguard Worker {
734*495ae853SAndroid Build Coastguard Worker {
735*495ae853SAndroid Build Coastguard Worker u4_sig_coeff = u4_sig_coeff & ((1 << i) - 1);
736*495ae853SAndroid Build Coastguard Worker u4_bins = 0;
737*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = 0;
738*495ae853SAndroid Build Coastguard Worker i1_bins_len = 1;
739*495ae853SAndroid Build Coastguard Worker /* Encode the AbsLevelMinus1 */
740*495ae853SAndroid Build Coastguard Worker u2_abs_level = ABS(*(pi16_coeffs)) - 1;
741*495ae853SAndroid Build Coastguard Worker /* CtxInc for bin0 */
742*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = MIN(u1_abs_level_equal1, 4);
743*495ae853SAndroid Build Coastguard Worker /* CtxInc for remaining */
744*495ae853SAndroid Build Coastguard Worker u1_ctx_inc = 5 + MIN(u1_abs_level_gt1, 4);
745*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = u4_ctx_inc + (u1_ctx_inc << 4);
746*495ae853SAndroid Build Coastguard Worker if(u2_abs_level)
747*495ae853SAndroid Build Coastguard Worker {
748*495ae853SAndroid Build Coastguard Worker u1_abs_level_gt1++;
749*495ae853SAndroid Build Coastguard Worker u1_abs_level_equal1 = 0;
750*495ae853SAndroid Build Coastguard Worker }
751*495ae853SAndroid Build Coastguard Worker if(!u1_abs_level_gt1) u1_abs_level_equal1++;
752*495ae853SAndroid Build Coastguard Worker
753*495ae853SAndroid Build Coastguard Worker u1_coff = 14;
754*495ae853SAndroid Build Coastguard Worker if(u2_abs_level >= u1_coff)
755*495ae853SAndroid Build Coastguard Worker {
756*495ae853SAndroid Build Coastguard Worker /* Prefix TU i.e string of 14 1's */
757*495ae853SAndroid Build Coastguard Worker u4_bins = 0x3fff;
758*495ae853SAndroid Build Coastguard Worker i1_bins_len = 14;
759*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(
760*495ae853SAndroid Build Coastguard Worker u4_bins, i1_bins_len, u4_ctx_inc, 1,
761*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + u4_ctx_cat_offset, ps_cabac_ctxt);
762*495ae853SAndroid Build Coastguard Worker
763*495ae853SAndroid Build Coastguard Worker /* Suffix, uses EncodeBypass */
764*495ae853SAndroid Build Coastguard Worker i2_sufs = u2_abs_level - u1_coff;
765*495ae853SAndroid Build Coastguard Worker
766*495ae853SAndroid Build Coastguard Worker u4_bins = isvce_cabac_UEGk0_binarization(i2_sufs, &i1_bins_len);
767*495ae853SAndroid Build Coastguard Worker
768*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bypass_bins(ps_cabac_ctxt, u4_bins, i1_bins_len);
769*495ae853SAndroid Build Coastguard Worker }
770*495ae853SAndroid Build Coastguard Worker else
771*495ae853SAndroid Build Coastguard Worker {
772*495ae853SAndroid Build Coastguard Worker /* Prefix only */
773*495ae853SAndroid Build Coastguard Worker u4_bins = (1 << u2_abs_level) - 1;
774*495ae853SAndroid Build Coastguard Worker i1_bins_len = u2_abs_level + 1;
775*495ae853SAndroid Build Coastguard Worker /* Encode Terminating bit */
776*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(
777*495ae853SAndroid Build Coastguard Worker u4_bins, i1_bins_len, u4_ctx_inc, 1,
778*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + u4_ctx_cat_offset, ps_cabac_ctxt);
779*495ae853SAndroid Build Coastguard Worker }
780*495ae853SAndroid Build Coastguard Worker }
781*495ae853SAndroid Build Coastguard Worker /* encode coeff_sign_flag[i] */
782*495ae853SAndroid Build Coastguard Worker u1_sign = ((*pi16_coeffs) < 0) ? 1 : 0;
783*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bypass_bin(ps_cabac_ctxt, u1_sign);
784*495ae853SAndroid Build Coastguard Worker i = CLZ(u4_sig_coeff);
785*495ae853SAndroid Build Coastguard Worker i = 31 - i;
786*495ae853SAndroid Build Coastguard Worker pi16_coeffs--;
787*495ae853SAndroid Build Coastguard Worker } while(u4_sig_coeff);
788*495ae853SAndroid Build Coastguard Worker }
789*495ae853SAndroid Build Coastguard Worker }
790*495ae853SAndroid Build Coastguard Worker
791*495ae853SAndroid Build Coastguard Worker /**
792*495ae853SAndroid Build Coastguard Worker *******************************************************************************
793*495ae853SAndroid Build Coastguard Worker * @brief
794*495ae853SAndroid Build Coastguard Worker * Write DC coeffs for intra predicted luma block
795*495ae853SAndroid Build Coastguard Worker *
796*495ae853SAndroid Build Coastguard Worker * @param[in] ps_ent_ctxt
797*495ae853SAndroid Build Coastguard Worker * Pointer to entropy context structure
798*495ae853SAndroid Build Coastguard Worker *
799*495ae853SAndroid Build Coastguard Worker * @returns
800*495ae853SAndroid Build Coastguard Worker *
801*495ae853SAndroid Build Coastguard Worker * @remarks
802*495ae853SAndroid Build Coastguard Worker * None
803*495ae853SAndroid Build Coastguard Worker *
804*495ae853SAndroid Build Coastguard Worker *******************************************************************************
805*495ae853SAndroid Build Coastguard Worker */
isvce_cabac_encode_residue_luma_dc(isvce_entropy_ctxt_t * ps_ent_ctxt)806*495ae853SAndroid Build Coastguard Worker static void isvce_cabac_encode_residue_luma_dc(isvce_entropy_ctxt_t *ps_ent_ctxt)
807*495ae853SAndroid Build Coastguard Worker {
808*495ae853SAndroid Build Coastguard Worker /* CABAC context */
809*495ae853SAndroid Build Coastguard Worker isvce_cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac;
810*495ae853SAndroid Build Coastguard Worker tu_sblk_coeff_data_t *ps_mb_coeff_data;
811*495ae853SAndroid Build Coastguard Worker
812*495ae853SAndroid Build Coastguard Worker /* packed residue */
813*495ae853SAndroid Build Coastguard Worker void *pv_mb_coeff_data = ps_ent_ctxt->pv_mb_coeff_data;
814*495ae853SAndroid Build Coastguard Worker UWORD16 u2_sig_coeff_map;
815*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_res_block;
816*495ae853SAndroid Build Coastguard Worker UWORD8 u1_nnz;
817*495ae853SAndroid Build Coastguard Worker UWORD8 u1_cbf;
818*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info;
819*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *p_CurCtxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info;
820*495ae853SAndroid Build Coastguard Worker
821*495ae853SAndroid Build Coastguard Worker PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, u1_nnz, u2_sig_coeff_map,
822*495ae853SAndroid Build Coastguard Worker pi2_res_block);
823*495ae853SAndroid Build Coastguard Worker
824*495ae853SAndroid Build Coastguard Worker u1_cbf = !!(u1_nnz);
825*495ae853SAndroid Build Coastguard Worker
826*495ae853SAndroid Build Coastguard Worker {
827*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_inc;
828*495ae853SAndroid Build Coastguard Worker UWORD8 u1_a, u1_b;
829*495ae853SAndroid Build Coastguard Worker
830*495ae853SAndroid Build Coastguard Worker u1_a = ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] & 0x1;
831*495ae853SAndroid Build Coastguard Worker u1_b = ps_top_ctxt->u1_yuv_dc_csbp & 0x1;
832*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = u1_a + (u1_b << 1);
833*495ae853SAndroid Build Coastguard Worker
834*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bin(
835*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt, u1_cbf,
836*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + CBF + (LUMA_DC_CTXCAT << 2) + u4_ctx_inc);
837*495ae853SAndroid Build Coastguard Worker }
838*495ae853SAndroid Build Coastguard Worker
839*495ae853SAndroid Build Coastguard Worker /* Write coded_block_flag */
840*495ae853SAndroid Build Coastguard Worker if(u1_cbf)
841*495ae853SAndroid Build Coastguard Worker {
842*495ae853SAndroid Build Coastguard Worker isvce_cabac_write_coeff4x4(pi2_res_block, u1_nnz, 15, u2_sig_coeff_map,
843*495ae853SAndroid Build Coastguard Worker COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_0_OFFSET,
844*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table +
845*495ae853SAndroid Build Coastguard Worker SIGNIFICANT_COEFF_FLAG_FRAME + SIG_COEFF_CTXT_CAT_0_OFFSET,
846*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
847*495ae853SAndroid Build Coastguard Worker
848*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] |= 0x1;
849*495ae853SAndroid Build Coastguard Worker p_CurCtxt->u1_yuv_dc_csbp |= 0x1;
850*495ae853SAndroid Build Coastguard Worker }
851*495ae853SAndroid Build Coastguard Worker else
852*495ae853SAndroid Build Coastguard Worker {
853*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6;
854*495ae853SAndroid Build Coastguard Worker p_CurCtxt->u1_yuv_dc_csbp &= 0x6;
855*495ae853SAndroid Build Coastguard Worker }
856*495ae853SAndroid Build Coastguard Worker
857*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->pv_mb_coeff_data = pv_mb_coeff_data;
858*495ae853SAndroid Build Coastguard Worker }
859*495ae853SAndroid Build Coastguard Worker
860*495ae853SAndroid Build Coastguard Worker /**
861*495ae853SAndroid Build Coastguard Worker *******************************************************************************
862*495ae853SAndroid Build Coastguard Worker * @brief
863*495ae853SAndroid Build Coastguard Worker * Write chroma residues to the bitstream
864*495ae853SAndroid Build Coastguard Worker *
865*495ae853SAndroid Build Coastguard Worker * @param[in] ps_ent_ctxt
866*495ae853SAndroid Build Coastguard Worker * Pointer to entropy context structure
867*495ae853SAndroid Build Coastguard Worker *
868*495ae853SAndroid Build Coastguard Worker * @param[in] u1_chroma_cbp
869*495ae853SAndroid Build Coastguard Worker * coded block pattern, chroma
870*495ae853SAndroid Build Coastguard Worker *
871*495ae853SAndroid Build Coastguard Worker * @returns
872*495ae853SAndroid Build Coastguard Worker *
873*495ae853SAndroid Build Coastguard Worker * @remarks
874*495ae853SAndroid Build Coastguard Worker * None
875*495ae853SAndroid Build Coastguard Worker *
876*495ae853SAndroid Build Coastguard Worker *******************************************************************************
877*495ae853SAndroid Build Coastguard Worker */
isvce_cabac_write_chroma_residue(isvce_entropy_ctxt_t * ps_ent_ctxt,UWORD8 u1_chroma_cbp)878*495ae853SAndroid Build Coastguard Worker static void isvce_cabac_write_chroma_residue(isvce_entropy_ctxt_t *ps_ent_ctxt,
879*495ae853SAndroid Build Coastguard Worker UWORD8 u1_chroma_cbp)
880*495ae853SAndroid Build Coastguard Worker {
881*495ae853SAndroid Build Coastguard Worker /* CABAC context */
882*495ae853SAndroid Build Coastguard Worker isvce_cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac;
883*495ae853SAndroid Build Coastguard Worker tu_sblk_coeff_data_t *ps_mb_coeff_data;
884*495ae853SAndroid Build Coastguard Worker /* packed residue */
885*495ae853SAndroid Build Coastguard Worker void *pv_mb_coeff_data = ps_ent_ctxt->pv_mb_coeff_data;
886*495ae853SAndroid Build Coastguard Worker UWORD16 u2_sig_coeff_map;
887*495ae853SAndroid Build Coastguard Worker UWORD8 u1_nnz;
888*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_top_ctxt_mb_info, *ps_curr_ctxt;
889*495ae853SAndroid Build Coastguard Worker
890*495ae853SAndroid Build Coastguard Worker ps_top_ctxt_mb_info = ps_cabac_ctxt->ps_top_ctxt_mb_info;
891*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info;
892*495ae853SAndroid Build Coastguard Worker
893*495ae853SAndroid Build Coastguard Worker /********************/
894*495ae853SAndroid Build Coastguard Worker /* Write Chroma DC */
895*495ae853SAndroid Build Coastguard Worker /********************/
896*495ae853SAndroid Build Coastguard Worker {
897*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_res_block;
898*495ae853SAndroid Build Coastguard Worker UWORD8 u1_left_dc_csbp, u1_top_dc_csbp, u1_uv, u1_cbf;
899*495ae853SAndroid Build Coastguard Worker
900*495ae853SAndroid Build Coastguard Worker u1_left_dc_csbp = (ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0]) >> 1;
901*495ae853SAndroid Build Coastguard Worker u1_top_dc_csbp = (ps_top_ctxt_mb_info->u1_yuv_dc_csbp) >> 1;
902*495ae853SAndroid Build Coastguard Worker
903*495ae853SAndroid Build Coastguard Worker for(u1_uv = 0; u1_uv < 2; u1_uv++)
904*495ae853SAndroid Build Coastguard Worker {
905*495ae853SAndroid Build Coastguard Worker PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, u1_nnz, u2_sig_coeff_map,
906*495ae853SAndroid Build Coastguard Worker pi2_res_block);
907*495ae853SAndroid Build Coastguard Worker u1_cbf = !!(u1_nnz);
908*495ae853SAndroid Build Coastguard Worker {
909*495ae853SAndroid Build Coastguard Worker UWORD8 u1_a, u1_b;
910*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_inc;
911*495ae853SAndroid Build Coastguard Worker u1_a = (u1_left_dc_csbp >> u1_uv) & 0x01;
912*495ae853SAndroid Build Coastguard Worker u1_b = (u1_top_dc_csbp >> u1_uv) & 0x01;
913*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = (u1_a + (u1_b << 1));
914*495ae853SAndroid Build Coastguard Worker
915*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bin(ps_cabac_ctxt, u1_cbf,
916*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + CBF +
917*495ae853SAndroid Build Coastguard Worker (CHROMA_DC_CTXCAT << 2) + u4_ctx_inc);
918*495ae853SAndroid Build Coastguard Worker }
919*495ae853SAndroid Build Coastguard Worker
920*495ae853SAndroid Build Coastguard Worker if(u1_cbf)
921*495ae853SAndroid Build Coastguard Worker {
922*495ae853SAndroid Build Coastguard Worker isvce_cabac_write_coeff4x4(pi2_res_block, u1_nnz, 3, u2_sig_coeff_map,
923*495ae853SAndroid Build Coastguard Worker COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_3_OFFSET,
924*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table +
925*495ae853SAndroid Build Coastguard Worker SIGNIFICANT_COEFF_FLAG_FRAME +
926*495ae853SAndroid Build Coastguard Worker SIG_COEFF_CTXT_CAT_3_OFFSET,
927*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
928*495ae853SAndroid Build Coastguard Worker
929*495ae853SAndroid Build Coastguard Worker SETBIT(u1_top_dc_csbp, u1_uv);
930*495ae853SAndroid Build Coastguard Worker SETBIT(u1_left_dc_csbp, u1_uv);
931*495ae853SAndroid Build Coastguard Worker }
932*495ae853SAndroid Build Coastguard Worker else
933*495ae853SAndroid Build Coastguard Worker {
934*495ae853SAndroid Build Coastguard Worker CLEARBIT(u1_top_dc_csbp, u1_uv);
935*495ae853SAndroid Build Coastguard Worker CLEARBIT(u1_left_dc_csbp, u1_uv);
936*495ae853SAndroid Build Coastguard Worker }
937*495ae853SAndroid Build Coastguard Worker }
938*495ae853SAndroid Build Coastguard Worker /*************************************************************/
939*495ae853SAndroid Build Coastguard Worker /* Update the DC csbp */
940*495ae853SAndroid Build Coastguard Worker /*************************************************************/
941*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x1;
942*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_yuv_dc_csbp &= 0x1;
943*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] |= (u1_left_dc_csbp << 1);
944*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_yuv_dc_csbp |= (u1_top_dc_csbp << 1);
945*495ae853SAndroid Build Coastguard Worker }
946*495ae853SAndroid Build Coastguard Worker /*******************/
947*495ae853SAndroid Build Coastguard Worker /* Write Chroma AC */
948*495ae853SAndroid Build Coastguard Worker /*******************/
949*495ae853SAndroid Build Coastguard Worker {
950*495ae853SAndroid Build Coastguard Worker if(u1_chroma_cbp == 2)
951*495ae853SAndroid Build Coastguard Worker {
952*495ae853SAndroid Build Coastguard Worker UWORD8 u1_uv_blkno, u1_left_ac_csbp, u1_top_ac_csbp;
953*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_res_block;
954*495ae853SAndroid Build Coastguard Worker u1_left_ac_csbp = ps_cabac_ctxt->pu1_left_uv_ac_csbp[0];
955*495ae853SAndroid Build Coastguard Worker u1_top_ac_csbp = ps_top_ctxt_mb_info->u1_yuv_ac_csbp >> 4;
956*495ae853SAndroid Build Coastguard Worker
957*495ae853SAndroid Build Coastguard Worker for(u1_uv_blkno = 0; u1_uv_blkno < 8; u1_uv_blkno++)
958*495ae853SAndroid Build Coastguard Worker {
959*495ae853SAndroid Build Coastguard Worker UWORD8 u1_cbf;
960*495ae853SAndroid Build Coastguard Worker UWORD8 u1_b2b0, u1_b2b1;
961*495ae853SAndroid Build Coastguard Worker PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, u1_nnz,
962*495ae853SAndroid Build Coastguard Worker u2_sig_coeff_map, pi2_res_block);
963*495ae853SAndroid Build Coastguard Worker
964*495ae853SAndroid Build Coastguard Worker u1_cbf = !!(u1_nnz);
965*495ae853SAndroid Build Coastguard Worker u1_b2b0 = ((u1_uv_blkno & 0x4) >> 1) | (u1_uv_blkno & 0x1);
966*495ae853SAndroid Build Coastguard Worker u1_b2b1 = ((u1_uv_blkno & 0x4) >> 1) | ((u1_uv_blkno & 0x2) >> 1);
967*495ae853SAndroid Build Coastguard Worker
968*495ae853SAndroid Build Coastguard Worker {
969*495ae853SAndroid Build Coastguard Worker UWORD8 u1_a, u1_b;
970*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_inc;
971*495ae853SAndroid Build Coastguard Worker /* write coded_block_flag */
972*495ae853SAndroid Build Coastguard Worker u1_a = (u1_left_ac_csbp >> u1_b2b1) & 0x1;
973*495ae853SAndroid Build Coastguard Worker u1_b = (u1_top_ac_csbp >> u1_b2b0) & 0x1;
974*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = u1_a + (u1_b << 1);
975*495ae853SAndroid Build Coastguard Worker
976*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bin(ps_cabac_ctxt, u1_cbf,
977*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + CBF +
978*495ae853SAndroid Build Coastguard Worker (CHROMA_AC_CTXCAT << 2) + u4_ctx_inc);
979*495ae853SAndroid Build Coastguard Worker }
980*495ae853SAndroid Build Coastguard Worker if(u1_cbf)
981*495ae853SAndroid Build Coastguard Worker {
982*495ae853SAndroid Build Coastguard Worker isvce_cabac_write_coeff4x4(
983*495ae853SAndroid Build Coastguard Worker pi2_res_block, u1_nnz, 14, u2_sig_coeff_map,
984*495ae853SAndroid Build Coastguard Worker COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_4_OFFSET,
985*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + +SIGNIFICANT_COEFF_FLAG_FRAME +
986*495ae853SAndroid Build Coastguard Worker SIG_COEFF_CTXT_CAT_4_OFFSET,
987*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
988*495ae853SAndroid Build Coastguard Worker
989*495ae853SAndroid Build Coastguard Worker SETBIT(u1_left_ac_csbp, u1_b2b1);
990*495ae853SAndroid Build Coastguard Worker SETBIT(u1_top_ac_csbp, u1_b2b0);
991*495ae853SAndroid Build Coastguard Worker }
992*495ae853SAndroid Build Coastguard Worker else
993*495ae853SAndroid Build Coastguard Worker {
994*495ae853SAndroid Build Coastguard Worker CLEARBIT(u1_left_ac_csbp, u1_b2b1);
995*495ae853SAndroid Build Coastguard Worker CLEARBIT(u1_top_ac_csbp, u1_b2b0);
996*495ae853SAndroid Build Coastguard Worker }
997*495ae853SAndroid Build Coastguard Worker }
998*495ae853SAndroid Build Coastguard Worker /*************************************************************/
999*495ae853SAndroid Build Coastguard Worker /* Update the AC csbp */
1000*495ae853SAndroid Build Coastguard Worker /*************************************************************/
1001*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_uv_ac_csbp[0] = u1_left_ac_csbp;
1002*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_yuv_ac_csbp &= 0x0f;
1003*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_yuv_ac_csbp |= (u1_top_ac_csbp << 4);
1004*495ae853SAndroid Build Coastguard Worker }
1005*495ae853SAndroid Build Coastguard Worker else
1006*495ae853SAndroid Build Coastguard Worker {
1007*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_uv_ac_csbp[0] = 0;
1008*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_yuv_ac_csbp &= 0xf;
1009*495ae853SAndroid Build Coastguard Worker }
1010*495ae853SAndroid Build Coastguard Worker }
1011*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->pv_mb_coeff_data = pv_mb_coeff_data;
1012*495ae853SAndroid Build Coastguard Worker }
1013*495ae853SAndroid Build Coastguard Worker
1014*495ae853SAndroid Build Coastguard Worker /**
1015*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1016*495ae853SAndroid Build Coastguard Worker * @brief
1017*495ae853SAndroid Build Coastguard Worker * Encodes Residues for the MB as defined in 7.3.5.3
1018*495ae853SAndroid Build Coastguard Worker *
1019*495ae853SAndroid Build Coastguard Worker * @param[in] ps_ent_ctxt
1020*495ae853SAndroid Build Coastguard Worker * Pointer to entropy context structure
1021*495ae853SAndroid Build Coastguard Worker *
1022*495ae853SAndroid Build Coastguard Worker * @param[in] u1_cbp
1023*495ae853SAndroid Build Coastguard Worker * coded block pattern
1024*495ae853SAndroid Build Coastguard Worker *
1025*495ae853SAndroid Build Coastguard Worker * @param[in] u1_ctx_cat
1026*495ae853SAndroid Build Coastguard Worker * Context category, LUMA_AC_CTXCAT or LUMA_4x4_CTXCAT
1027*495ae853SAndroid Build Coastguard Worker *
1028*495ae853SAndroid Build Coastguard Worker * @returns
1029*495ae853SAndroid Build Coastguard Worker *
1030*495ae853SAndroid Build Coastguard Worker * @remarks
1031*495ae853SAndroid Build Coastguard Worker * None
1032*495ae853SAndroid Build Coastguard Worker *
1033*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1034*495ae853SAndroid Build Coastguard Worker */
isvce_cabac_encode_residue(isvce_entropy_ctxt_t * ps_ent_ctxt,UWORD32 u4_cbp,UWORD8 u1_ctx_cat)1035*495ae853SAndroid Build Coastguard Worker static void isvce_cabac_encode_residue(isvce_entropy_ctxt_t *ps_ent_ctxt, UWORD32 u4_cbp,
1036*495ae853SAndroid Build Coastguard Worker UWORD8 u1_ctx_cat)
1037*495ae853SAndroid Build Coastguard Worker {
1038*495ae853SAndroid Build Coastguard Worker /* CABAC context */
1039*495ae853SAndroid Build Coastguard Worker isvce_cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac;
1040*495ae853SAndroid Build Coastguard Worker
1041*495ae853SAndroid Build Coastguard Worker tu_sblk_coeff_data_t *ps_mb_coeff_data;
1042*495ae853SAndroid Build Coastguard Worker /* packed residue */
1043*495ae853SAndroid Build Coastguard Worker void *pv_mb_coeff_data = ps_ent_ctxt->pv_mb_coeff_data;
1044*495ae853SAndroid Build Coastguard Worker UWORD16 u2_sig_coeff_map;
1045*495ae853SAndroid Build Coastguard Worker UWORD8 u1_nnz;
1046*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_curr_ctxt;
1047*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_top_ctxt;
1048*495ae853SAndroid Build Coastguard Worker UWORD8 u1_left_ac_csbp;
1049*495ae853SAndroid Build Coastguard Worker UWORD8 u1_top_ac_csbp;
1050*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_idx_offset_sig_coef, u4_ctx_idx_offset_abs_lvl;
1051*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info;
1052*495ae853SAndroid Build Coastguard Worker ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info;
1053*495ae853SAndroid Build Coastguard Worker u1_left_ac_csbp = ps_cabac_ctxt->pu1_left_y_ac_csbp[0];
1054*495ae853SAndroid Build Coastguard Worker u1_top_ac_csbp = ps_top_ctxt->u1_yuv_ac_csbp;
1055*495ae853SAndroid Build Coastguard Worker
1056*495ae853SAndroid Build Coastguard Worker if(u4_cbp & 0xf)
1057*495ae853SAndroid Build Coastguard Worker {
1058*495ae853SAndroid Build Coastguard Worker /* Write luma residue */
1059*495ae853SAndroid Build Coastguard Worker UWORD8 u1_offset;
1060*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_res_block;
1061*495ae853SAndroid Build Coastguard Worker UWORD8 u1_subblk_num;
1062*495ae853SAndroid Build Coastguard Worker if(u1_ctx_cat == LUMA_AC_CTXCAT)
1063*495ae853SAndroid Build Coastguard Worker {
1064*495ae853SAndroid Build Coastguard Worker u1_offset = 1;
1065*495ae853SAndroid Build Coastguard Worker u4_ctx_idx_offset_sig_coef = SIG_COEFF_CTXT_CAT_1_OFFSET;
1066*495ae853SAndroid Build Coastguard Worker u4_ctx_idx_offset_abs_lvl = COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_1_OFFSET;
1067*495ae853SAndroid Build Coastguard Worker }
1068*495ae853SAndroid Build Coastguard Worker else
1069*495ae853SAndroid Build Coastguard Worker {
1070*495ae853SAndroid Build Coastguard Worker u1_offset = 0;
1071*495ae853SAndroid Build Coastguard Worker u4_ctx_idx_offset_sig_coef = SIG_COEFF_CTXT_CAT_2_OFFSET;
1072*495ae853SAndroid Build Coastguard Worker u4_ctx_idx_offset_abs_lvl = COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_2_OFFSET;
1073*495ae853SAndroid Build Coastguard Worker }
1074*495ae853SAndroid Build Coastguard Worker
1075*495ae853SAndroid Build Coastguard Worker for(u1_subblk_num = 0; u1_subblk_num < 16; u1_subblk_num++)
1076*495ae853SAndroid Build Coastguard Worker {
1077*495ae853SAndroid Build Coastguard Worker UWORD8 u1_b0, u1_b1, u1_b2, u1_b3, u1_b2b0, u1_b3b1, u1_b3b2;
1078*495ae853SAndroid Build Coastguard Worker u1_b0 = (u1_subblk_num & 0x1);
1079*495ae853SAndroid Build Coastguard Worker u1_b1 = (u1_subblk_num & 0x2) >> 1;
1080*495ae853SAndroid Build Coastguard Worker u1_b2 = (u1_subblk_num & 0x4) >> 2;
1081*495ae853SAndroid Build Coastguard Worker u1_b3 = (u1_subblk_num & 0x8) >> 3;
1082*495ae853SAndroid Build Coastguard Worker u1_b2b0 = (u1_b2 << 1) | (u1_b0);
1083*495ae853SAndroid Build Coastguard Worker u1_b3b1 = (u1_b3 << 1) | (u1_b1);
1084*495ae853SAndroid Build Coastguard Worker u1_b3b2 = (u1_b3 << 1) | (u1_b2);
1085*495ae853SAndroid Build Coastguard Worker
1086*495ae853SAndroid Build Coastguard Worker if(!((u4_cbp >> u1_b3b2) & 0x1))
1087*495ae853SAndroid Build Coastguard Worker {
1088*495ae853SAndroid Build Coastguard Worker /* ---------------------------------------------------------- */
1089*495ae853SAndroid Build Coastguard Worker /* The current block is not coded so skip all the sub block */
1090*495ae853SAndroid Build Coastguard Worker /* and set the pointer of scan level, csbp accrodingly */
1091*495ae853SAndroid Build Coastguard Worker /* ---------------------------------------------------------- */
1092*495ae853SAndroid Build Coastguard Worker CLEARBIT(u1_top_ac_csbp, u1_b2b0);
1093*495ae853SAndroid Build Coastguard Worker CLEARBIT(u1_top_ac_csbp, (u1_b2b0 + 1));
1094*495ae853SAndroid Build Coastguard Worker CLEARBIT(u1_left_ac_csbp, u1_b3b1);
1095*495ae853SAndroid Build Coastguard Worker CLEARBIT(u1_left_ac_csbp, (u1_b3b1 + 1));
1096*495ae853SAndroid Build Coastguard Worker
1097*495ae853SAndroid Build Coastguard Worker u1_subblk_num += 3;
1098*495ae853SAndroid Build Coastguard Worker }
1099*495ae853SAndroid Build Coastguard Worker else
1100*495ae853SAndroid Build Coastguard Worker {
1101*495ae853SAndroid Build Coastguard Worker UWORD8 u1_csbf;
1102*495ae853SAndroid Build Coastguard Worker
1103*495ae853SAndroid Build Coastguard Worker PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, u1_nnz,
1104*495ae853SAndroid Build Coastguard Worker u2_sig_coeff_map, pi2_res_block);
1105*495ae853SAndroid Build Coastguard Worker
1106*495ae853SAndroid Build Coastguard Worker u1_csbf = !!(u1_nnz);
1107*495ae853SAndroid Build Coastguard Worker {
1108*495ae853SAndroid Build Coastguard Worker UWORD8 u1_a, u1_b;
1109*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_inc;
1110*495ae853SAndroid Build Coastguard Worker u1_b = (u1_top_ac_csbp >> u1_b2b0) & 0x01;
1111*495ae853SAndroid Build Coastguard Worker u1_a = (u1_left_ac_csbp >> u1_b3b1) & 0x01;
1112*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = u1_a + (u1_b << 1);
1113*495ae853SAndroid Build Coastguard Worker
1114*495ae853SAndroid Build Coastguard Worker /* Encode the bin */
1115*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bin(
1116*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt, u1_csbf,
1117*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + CBF + (u1_ctx_cat << 2) + u4_ctx_inc);
1118*495ae853SAndroid Build Coastguard Worker }
1119*495ae853SAndroid Build Coastguard Worker /**************************/
1120*495ae853SAndroid Build Coastguard Worker /* Write coded_block_flag */
1121*495ae853SAndroid Build Coastguard Worker /**************************/
1122*495ae853SAndroid Build Coastguard Worker if(u1_csbf)
1123*495ae853SAndroid Build Coastguard Worker {
1124*495ae853SAndroid Build Coastguard Worker isvce_cabac_write_coeff4x4(pi2_res_block, u1_nnz, (UWORD8) (15 - u1_offset),
1125*495ae853SAndroid Build Coastguard Worker u2_sig_coeff_map, u4_ctx_idx_offset_abs_lvl,
1126*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table +
1127*495ae853SAndroid Build Coastguard Worker SIGNIFICANT_COEFF_FLAG_FRAME +
1128*495ae853SAndroid Build Coastguard Worker u4_ctx_idx_offset_sig_coef,
1129*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
1130*495ae853SAndroid Build Coastguard Worker
1131*495ae853SAndroid Build Coastguard Worker SETBIT(u1_top_ac_csbp, u1_b2b0);
1132*495ae853SAndroid Build Coastguard Worker SETBIT(u1_left_ac_csbp, u1_b3b1);
1133*495ae853SAndroid Build Coastguard Worker }
1134*495ae853SAndroid Build Coastguard Worker else
1135*495ae853SAndroid Build Coastguard Worker {
1136*495ae853SAndroid Build Coastguard Worker CLEARBIT(u1_top_ac_csbp, u1_b2b0);
1137*495ae853SAndroid Build Coastguard Worker CLEARBIT(u1_left_ac_csbp, u1_b3b1);
1138*495ae853SAndroid Build Coastguard Worker }
1139*495ae853SAndroid Build Coastguard Worker }
1140*495ae853SAndroid Build Coastguard Worker }
1141*495ae853SAndroid Build Coastguard Worker /**************************************************************************/
1142*495ae853SAndroid Build Coastguard Worker /* Update the AC csbp */
1143*495ae853SAndroid Build Coastguard Worker /**************************************************************************/
1144*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_y_ac_csbp[0] = u1_left_ac_csbp & 0xf;
1145*495ae853SAndroid Build Coastguard Worker u1_top_ac_csbp &= 0x0f;
1146*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_yuv_ac_csbp &= 0xf0;
1147*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_yuv_ac_csbp |= u1_top_ac_csbp;
1148*495ae853SAndroid Build Coastguard Worker }
1149*495ae853SAndroid Build Coastguard Worker else
1150*495ae853SAndroid Build Coastguard Worker {
1151*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_y_ac_csbp[0] = 0;
1152*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_yuv_ac_csbp &= 0xf0;
1153*495ae853SAndroid Build Coastguard Worker }
1154*495ae853SAndroid Build Coastguard Worker
1155*495ae853SAndroid Build Coastguard Worker /* Write chroma residue */
1156*495ae853SAndroid Build Coastguard Worker
1157*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->pv_mb_coeff_data = pv_mb_coeff_data;
1158*495ae853SAndroid Build Coastguard Worker {
1159*495ae853SAndroid Build Coastguard Worker UWORD8 u1_cbp_chroma;
1160*495ae853SAndroid Build Coastguard Worker u1_cbp_chroma = u4_cbp >> 4;
1161*495ae853SAndroid Build Coastguard Worker if(u1_cbp_chroma)
1162*495ae853SAndroid Build Coastguard Worker {
1163*495ae853SAndroid Build Coastguard Worker isvce_cabac_write_chroma_residue(ps_ent_ctxt, u1_cbp_chroma);
1164*495ae853SAndroid Build Coastguard Worker }
1165*495ae853SAndroid Build Coastguard Worker else
1166*495ae853SAndroid Build Coastguard Worker {
1167*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x1;
1168*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_yuv_dc_csbp &= 0x1;
1169*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_uv_ac_csbp[0] = 0;
1170*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_yuv_ac_csbp &= 0xf;
1171*495ae853SAndroid Build Coastguard Worker }
1172*495ae853SAndroid Build Coastguard Worker }
1173*495ae853SAndroid Build Coastguard Worker }
1174*495ae853SAndroid Build Coastguard Worker
1175*495ae853SAndroid Build Coastguard Worker /**
1176*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1177*495ae853SAndroid Build Coastguard Worker * @brief
1178*495ae853SAndroid Build Coastguard Worker * Encodes a Motion vector (9.3.3.1.1.7 )
1179*495ae853SAndroid Build Coastguard Worker *
1180*495ae853SAndroid Build Coastguard Worker * @param[in] u1_mvd
1181*495ae853SAndroid Build Coastguard Worker * Motion vector to be encoded
1182*495ae853SAndroid Build Coastguard Worker *
1183*495ae853SAndroid Build Coastguard Worker * @param[in] u4_ctx_idx_offset
1184*495ae853SAndroid Build Coastguard Worker * * ctxIdxOffset for MV_X or MV_Ycontext
1185*495ae853SAndroid Build Coastguard Worker *
1186*495ae853SAndroid Build Coastguard Worker * @param[in] ui2_abs_mvd
1187*495ae853SAndroid Build Coastguard Worker * sum of absolute value of corresponding neighboring motion vectors
1188*495ae853SAndroid Build Coastguard Worker *
1189*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cabac_ctxt
1190*495ae853SAndroid Build Coastguard Worker * Pointer to cabac context structure
1191*495ae853SAndroid Build Coastguard Worker *
1192*495ae853SAndroid Build Coastguard Worker * @returns
1193*495ae853SAndroid Build Coastguard Worker *
1194*495ae853SAndroid Build Coastguard Worker * @remarks
1195*495ae853SAndroid Build Coastguard Worker * None
1196*495ae853SAndroid Build Coastguard Worker *
1197*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1198*495ae853SAndroid Build Coastguard Worker */
isvce_cabac_enc_ctx_mvd(WORD16 u1_mvd,UWORD32 u4_ctx_idx_offset,UWORD16 ui2_abs_mvd,isvce_cabac_ctxt_t * ps_cabac_ctxt)1199*495ae853SAndroid Build Coastguard Worker static void isvce_cabac_enc_ctx_mvd(WORD16 u1_mvd, UWORD32 u4_ctx_idx_offset, UWORD16 ui2_abs_mvd,
1200*495ae853SAndroid Build Coastguard Worker isvce_cabac_ctxt_t *ps_cabac_ctxt)
1201*495ae853SAndroid Build Coastguard Worker {
1202*495ae853SAndroid Build Coastguard Worker UWORD8 u1_bin, u1_ctxt_inc;
1203*495ae853SAndroid Build Coastguard Worker WORD8 k = 3, u1_coff = 9;
1204*495ae853SAndroid Build Coastguard Worker WORD16 i2_abs_mvd, i2_sufs;
1205*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_inc;
1206*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bins;
1207*495ae853SAndroid Build Coastguard Worker WORD8 i1_bins_len;
1208*495ae853SAndroid Build Coastguard Worker
1209*495ae853SAndroid Build Coastguard Worker /* if mvd < u1_coff
1210*495ae853SAndroid Build Coastguard Worker only Prefix
1211*495ae853SAndroid Build Coastguard Worker else
1212*495ae853SAndroid Build Coastguard Worker Prefix + Suffix
1213*495ae853SAndroid Build Coastguard Worker
1214*495ae853SAndroid Build Coastguard Worker encode sign bit
1215*495ae853SAndroid Build Coastguard Worker
1216*495ae853SAndroid Build Coastguard Worker Prefix TU encoding Cmax =u1_coff and Suffix 3rd order Exp-Golomb
1217*495ae853SAndroid Build Coastguard Worker */
1218*495ae853SAndroid Build Coastguard Worker
1219*495ae853SAndroid Build Coastguard Worker if(ui2_abs_mvd < 3)
1220*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = 0;
1221*495ae853SAndroid Build Coastguard Worker else if(ui2_abs_mvd > 32)
1222*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = 2;
1223*495ae853SAndroid Build Coastguard Worker else
1224*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = 1;
1225*495ae853SAndroid Build Coastguard Worker
1226*495ae853SAndroid Build Coastguard Worker u4_bins = 0;
1227*495ae853SAndroid Build Coastguard Worker i1_bins_len = 1;
1228*495ae853SAndroid Build Coastguard Worker
1229*495ae853SAndroid Build Coastguard Worker if(u1_mvd == 0)
1230*495ae853SAndroid Build Coastguard Worker {
1231*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bin(
1232*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt, 0, ps_cabac_ctxt->au1_cabac_ctxt_table + u4_ctx_idx_offset + u4_ctx_inc);
1233*495ae853SAndroid Build Coastguard Worker }
1234*495ae853SAndroid Build Coastguard Worker else
1235*495ae853SAndroid Build Coastguard Worker {
1236*495ae853SAndroid Build Coastguard Worker i2_abs_mvd = ABS(u1_mvd);
1237*495ae853SAndroid Build Coastguard Worker if(i2_abs_mvd >= u1_coff)
1238*495ae853SAndroid Build Coastguard Worker {
1239*495ae853SAndroid Build Coastguard Worker /* Prefix TU i.e string of 9 1's */
1240*495ae853SAndroid Build Coastguard Worker u4_bins = 0x1ff;
1241*495ae853SAndroid Build Coastguard Worker i1_bins_len = 9;
1242*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = (u4_ctx_inc | 0x065430);
1243*495ae853SAndroid Build Coastguard Worker
1244*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(u4_bins, i1_bins_len, u4_ctx_inc, 4,
1245*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + u4_ctx_idx_offset,
1246*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
1247*495ae853SAndroid Build Coastguard Worker
1248*495ae853SAndroid Build Coastguard Worker /* Suffix, uses EncodeBypass */
1249*495ae853SAndroid Build Coastguard Worker u4_bins = 0;
1250*495ae853SAndroid Build Coastguard Worker i1_bins_len = 0;
1251*495ae853SAndroid Build Coastguard Worker i2_sufs = i2_abs_mvd - u1_coff;
1252*495ae853SAndroid Build Coastguard Worker while(1)
1253*495ae853SAndroid Build Coastguard Worker {
1254*495ae853SAndroid Build Coastguard Worker if(i2_sufs >= (1 << k))
1255*495ae853SAndroid Build Coastguard Worker {
1256*495ae853SAndroid Build Coastguard Worker u4_bins = (u4_bins | (1 << (31 - i1_bins_len)));
1257*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
1258*495ae853SAndroid Build Coastguard Worker i2_sufs = i2_sufs - (1 << k);
1259*495ae853SAndroid Build Coastguard Worker k++;
1260*495ae853SAndroid Build Coastguard Worker }
1261*495ae853SAndroid Build Coastguard Worker else
1262*495ae853SAndroid Build Coastguard Worker {
1263*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
1264*495ae853SAndroid Build Coastguard Worker while(k--)
1265*495ae853SAndroid Build Coastguard Worker {
1266*495ae853SAndroid Build Coastguard Worker u1_bin = ((i2_sufs >> k) & 0x01);
1267*495ae853SAndroid Build Coastguard Worker u4_bins = (u4_bins | (u1_bin << (31 - i1_bins_len)));
1268*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
1269*495ae853SAndroid Build Coastguard Worker }
1270*495ae853SAndroid Build Coastguard Worker break;
1271*495ae853SAndroid Build Coastguard Worker }
1272*495ae853SAndroid Build Coastguard Worker }
1273*495ae853SAndroid Build Coastguard Worker u4_bins >>= (32 - i1_bins_len);
1274*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bypass_bins(ps_cabac_ctxt, u4_bins, i1_bins_len);
1275*495ae853SAndroid Build Coastguard Worker }
1276*495ae853SAndroid Build Coastguard Worker else
1277*495ae853SAndroid Build Coastguard Worker {
1278*495ae853SAndroid Build Coastguard Worker /* Prefix only */
1279*495ae853SAndroid Build Coastguard Worker /* b0 */
1280*495ae853SAndroid Build Coastguard Worker u4_bins = 1;
1281*495ae853SAndroid Build Coastguard Worker i2_abs_mvd--;
1282*495ae853SAndroid Build Coastguard Worker u1_ctxt_inc = 3;
1283*495ae853SAndroid Build Coastguard Worker while(i2_abs_mvd)
1284*495ae853SAndroid Build Coastguard Worker {
1285*495ae853SAndroid Build Coastguard Worker i2_abs_mvd--;
1286*495ae853SAndroid Build Coastguard Worker u4_bins = (u4_bins | (1 << i1_bins_len));
1287*495ae853SAndroid Build Coastguard Worker if(u1_ctxt_inc <= 6)
1288*495ae853SAndroid Build Coastguard Worker {
1289*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = (u4_ctx_inc | (u1_ctxt_inc << (i1_bins_len << 2)));
1290*495ae853SAndroid Build Coastguard Worker u1_ctxt_inc++;
1291*495ae853SAndroid Build Coastguard Worker }
1292*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
1293*495ae853SAndroid Build Coastguard Worker }
1294*495ae853SAndroid Build Coastguard Worker /* Encode Terminating bit */
1295*495ae853SAndroid Build Coastguard Worker if(i1_bins_len <= 4) u4_ctx_inc = (u4_ctx_inc | (u1_ctxt_inc << (i1_bins_len << 2)));
1296*495ae853SAndroid Build Coastguard Worker i1_bins_len++;
1297*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(u4_bins, i1_bins_len, u4_ctx_inc, 4,
1298*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + u4_ctx_idx_offset,
1299*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
1300*495ae853SAndroid Build Coastguard Worker }
1301*495ae853SAndroid Build Coastguard Worker /* sign bit, uses EncodeBypass */
1302*495ae853SAndroid Build Coastguard Worker if(u1_mvd > 0)
1303*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bypass_bin(ps_cabac_ctxt, 0);
1304*495ae853SAndroid Build Coastguard Worker else
1305*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bypass_bin(ps_cabac_ctxt, 1);
1306*495ae853SAndroid Build Coastguard Worker }
1307*495ae853SAndroid Build Coastguard Worker }
1308*495ae853SAndroid Build Coastguard Worker
1309*495ae853SAndroid Build Coastguard Worker /**
1310*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1311*495ae853SAndroid Build Coastguard Worker * @brief
1312*495ae853SAndroid Build Coastguard Worker * Encodes all motion vectors for a P16x16 MB
1313*495ae853SAndroid Build Coastguard Worker *
1314*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cabac_ctxt
1315*495ae853SAndroid Build Coastguard Worker * Pointer to cabac context structure
1316*495ae853SAndroid Build Coastguard Worker *
1317*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_mv_ptr
1318*495ae853SAndroid Build Coastguard Worker * Pointer to array of motion vectors
1319*495ae853SAndroid Build Coastguard Worker *
1320*495ae853SAndroid Build Coastguard Worker * @returns
1321*495ae853SAndroid Build Coastguard Worker *
1322*495ae853SAndroid Build Coastguard Worker * @remarks
1323*495ae853SAndroid Build Coastguard Worker * None
1324*495ae853SAndroid Build Coastguard Worker *
1325*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1326*495ae853SAndroid Build Coastguard Worker */
isvce_cabac_enc_mvds_p16x16(isvce_cabac_ctxt_t * ps_cabac_ctxt,WORD16 * pi2_mv_ptr)1327*495ae853SAndroid Build Coastguard Worker static void isvce_cabac_enc_mvds_p16x16(isvce_cabac_ctxt_t *ps_cabac_ctxt, WORD16 *pi2_mv_ptr)
1328*495ae853SAndroid Build Coastguard Worker {
1329*495ae853SAndroid Build Coastguard Worker UWORD8 u1_abs_mvd_x, u1_abs_mvd_y;
1330*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_top_mv_ctxt, *pu1_lft_mv_ctxt;
1331*495ae853SAndroid Build Coastguard Worker WORD16 u2_mv;
1332*495ae853SAndroid Build Coastguard Worker u1_abs_mvd_x = 0;
1333*495ae853SAndroid Build Coastguard Worker u1_abs_mvd_y = 0;
1334*495ae853SAndroid Build Coastguard Worker pu1_top_mv_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_mv[0];
1335*495ae853SAndroid Build Coastguard Worker pu1_lft_mv_ctxt = ps_cabac_ctxt->pu1_left_mv_ctxt_inc[0];
1336*495ae853SAndroid Build Coastguard Worker {
1337*495ae853SAndroid Build Coastguard Worker UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a, u2_abs_mvd_y_b;
1338*495ae853SAndroid Build Coastguard Worker u2_abs_mvd_x_b = (UWORD16) pu1_top_mv_ctxt[0];
1339*495ae853SAndroid Build Coastguard Worker u2_abs_mvd_y_b = (UWORD16) pu1_top_mv_ctxt[1];
1340*495ae853SAndroid Build Coastguard Worker u2_abs_mvd_x_a = (UWORD16) pu1_lft_mv_ctxt[0];
1341*495ae853SAndroid Build Coastguard Worker u2_abs_mvd_y_a = (UWORD16) pu1_lft_mv_ctxt[1];
1342*495ae853SAndroid Build Coastguard Worker u2_mv = *(pi2_mv_ptr++);
1343*495ae853SAndroid Build Coastguard Worker
1344*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_ctx_mvd(u2_mv, MVD_X, (UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b),
1345*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
1346*495ae853SAndroid Build Coastguard Worker
1347*495ae853SAndroid Build Coastguard Worker u1_abs_mvd_x = CLIP3(0, 127, ABS(u2_mv));
1348*495ae853SAndroid Build Coastguard Worker u2_mv = *(pi2_mv_ptr++);
1349*495ae853SAndroid Build Coastguard Worker
1350*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_ctx_mvd(u2_mv, MVD_Y, (UWORD16) (u2_abs_mvd_y_a + u2_abs_mvd_y_b),
1351*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
1352*495ae853SAndroid Build Coastguard Worker
1353*495ae853SAndroid Build Coastguard Worker u1_abs_mvd_y = CLIP3(0, 127, ABS(u2_mv));
1354*495ae853SAndroid Build Coastguard Worker }
1355*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1356*495ae853SAndroid Build Coastguard Worker /* Store abs_mvd_values cabac contexts */
1357*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1358*495ae853SAndroid Build Coastguard Worker pu1_top_mv_ctxt[0] = pu1_lft_mv_ctxt[0] = u1_abs_mvd_x;
1359*495ae853SAndroid Build Coastguard Worker pu1_top_mv_ctxt[1] = pu1_lft_mv_ctxt[1] = u1_abs_mvd_y;
1360*495ae853SAndroid Build Coastguard Worker }
1361*495ae853SAndroid Build Coastguard Worker
1362*495ae853SAndroid Build Coastguard Worker /**
1363*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1364*495ae853SAndroid Build Coastguard Worker * @brief
1365*495ae853SAndroid Build Coastguard Worker * Encodes all motion vectors for a B MB (Assues that mbype is B_L0_16x16,
1366*495ae853SAndroid Build Coastguard Worker *B_L1_16x16 or B_Bi_16x16
1367*495ae853SAndroid Build Coastguard Worker *
1368*495ae853SAndroid Build Coastguard Worker * @param[in] ps_cabac_ctxt
1369*495ae853SAndroid Build Coastguard Worker * Pointer to cabac context structure
1370*495ae853SAndroid Build Coastguard Worker *
1371*495ae853SAndroid Build Coastguard Worker * @param[in] pi2_mv_ptr
1372*495ae853SAndroid Build Coastguard Worker * Pointer to array of motion vectors
1373*495ae853SAndroid Build Coastguard Worker *
1374*495ae853SAndroid Build Coastguard Worker * @returns
1375*495ae853SAndroid Build Coastguard Worker *
1376*495ae853SAndroid Build Coastguard Worker * @remarks
1377*495ae853SAndroid Build Coastguard Worker * None
1378*495ae853SAndroid Build Coastguard Worker *
1379*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1380*495ae853SAndroid Build Coastguard Worker */
isvce_cabac_enc_mvds_b16x16(isvce_cabac_ctxt_t * ps_cabac_ctxt,WORD16 * pi2_mv_ptr,WORD32 i4_mb_part_pred_mode)1381*495ae853SAndroid Build Coastguard Worker static void isvce_cabac_enc_mvds_b16x16(isvce_cabac_ctxt_t *ps_cabac_ctxt, WORD16 *pi2_mv_ptr,
1382*495ae853SAndroid Build Coastguard Worker WORD32 i4_mb_part_pred_mode)
1383*495ae853SAndroid Build Coastguard Worker {
1384*495ae853SAndroid Build Coastguard Worker /* Encode the differential component of the motion vectors */
1385*495ae853SAndroid Build Coastguard Worker
1386*495ae853SAndroid Build Coastguard Worker {
1387*495ae853SAndroid Build Coastguard Worker UWORD8 u1_abs_mvd_x, u1_abs_mvd_y;
1388*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_top_mv_ctxt, *pu1_lft_mv_ctxt;
1389*495ae853SAndroid Build Coastguard Worker WORD16 u2_mv;
1390*495ae853SAndroid Build Coastguard Worker u1_abs_mvd_x = 0;
1391*495ae853SAndroid Build Coastguard Worker u1_abs_mvd_y = 0;
1392*495ae853SAndroid Build Coastguard Worker pu1_top_mv_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_mv[0];
1393*495ae853SAndroid Build Coastguard Worker pu1_lft_mv_ctxt = ps_cabac_ctxt->pu1_left_mv_ctxt_inc[0];
1394*495ae853SAndroid Build Coastguard Worker if(i4_mb_part_pred_mode != L1)
1395*495ae853SAndroid Build Coastguard Worker {
1396*495ae853SAndroid Build Coastguard Worker UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a, u2_abs_mvd_y_b;
1397*495ae853SAndroid Build Coastguard Worker u2_abs_mvd_x_b = (UWORD16) pu1_top_mv_ctxt[0];
1398*495ae853SAndroid Build Coastguard Worker u2_abs_mvd_y_b = (UWORD16) pu1_top_mv_ctxt[1];
1399*495ae853SAndroid Build Coastguard Worker u2_abs_mvd_x_a = (UWORD16) pu1_lft_mv_ctxt[0];
1400*495ae853SAndroid Build Coastguard Worker u2_abs_mvd_y_a = (UWORD16) pu1_lft_mv_ctxt[1];
1401*495ae853SAndroid Build Coastguard Worker u2_mv = pi2_mv_ptr[0];
1402*495ae853SAndroid Build Coastguard Worker
1403*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_ctx_mvd(u2_mv, MVD_X, (UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b),
1404*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
1405*495ae853SAndroid Build Coastguard Worker
1406*495ae853SAndroid Build Coastguard Worker u1_abs_mvd_x = CLIP3(0, 127, ABS(u2_mv));
1407*495ae853SAndroid Build Coastguard Worker u2_mv = pi2_mv_ptr[1];
1408*495ae853SAndroid Build Coastguard Worker
1409*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_ctx_mvd(u2_mv, MVD_Y, (UWORD16) (u2_abs_mvd_y_a + u2_abs_mvd_y_b),
1410*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
1411*495ae853SAndroid Build Coastguard Worker
1412*495ae853SAndroid Build Coastguard Worker u1_abs_mvd_y = CLIP3(0, 127, ABS(u2_mv));
1413*495ae853SAndroid Build Coastguard Worker }
1414*495ae853SAndroid Build Coastguard Worker
1415*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1416*495ae853SAndroid Build Coastguard Worker /* Store abs_mvd_values cabac contexts */
1417*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1418*495ae853SAndroid Build Coastguard Worker pu1_top_mv_ctxt[0] = pu1_lft_mv_ctxt[0] = u1_abs_mvd_x;
1419*495ae853SAndroid Build Coastguard Worker pu1_top_mv_ctxt[1] = pu1_lft_mv_ctxt[1] = u1_abs_mvd_y;
1420*495ae853SAndroid Build Coastguard Worker
1421*495ae853SAndroid Build Coastguard Worker u1_abs_mvd_x = 0;
1422*495ae853SAndroid Build Coastguard Worker u1_abs_mvd_y = 0;
1423*495ae853SAndroid Build Coastguard Worker if(i4_mb_part_pred_mode != L0)
1424*495ae853SAndroid Build Coastguard Worker {
1425*495ae853SAndroid Build Coastguard Worker UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a, u2_abs_mvd_y_b;
1426*495ae853SAndroid Build Coastguard Worker u2_abs_mvd_x_b = (UWORD16) pu1_top_mv_ctxt[2];
1427*495ae853SAndroid Build Coastguard Worker u2_abs_mvd_y_b = (UWORD16) pu1_top_mv_ctxt[3];
1428*495ae853SAndroid Build Coastguard Worker u2_abs_mvd_x_a = (UWORD16) pu1_lft_mv_ctxt[2];
1429*495ae853SAndroid Build Coastguard Worker u2_abs_mvd_y_a = (UWORD16) pu1_lft_mv_ctxt[3];
1430*495ae853SAndroid Build Coastguard Worker u2_mv = pi2_mv_ptr[2];
1431*495ae853SAndroid Build Coastguard Worker
1432*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_ctx_mvd(u2_mv, MVD_X, (UWORD16) (u2_abs_mvd_x_a + u2_abs_mvd_x_b),
1433*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
1434*495ae853SAndroid Build Coastguard Worker
1435*495ae853SAndroid Build Coastguard Worker u1_abs_mvd_x = CLIP3(0, 127, ABS(u2_mv));
1436*495ae853SAndroid Build Coastguard Worker u2_mv = pi2_mv_ptr[3];
1437*495ae853SAndroid Build Coastguard Worker
1438*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_ctx_mvd(u2_mv, MVD_Y, (UWORD16) (u2_abs_mvd_y_a + u2_abs_mvd_y_b),
1439*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
1440*495ae853SAndroid Build Coastguard Worker
1441*495ae853SAndroid Build Coastguard Worker u1_abs_mvd_y = CLIP3(0, 127, ABS(u2_mv));
1442*495ae853SAndroid Build Coastguard Worker }
1443*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1444*495ae853SAndroid Build Coastguard Worker /* Store abs_mvd_values cabac contexts */
1445*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1446*495ae853SAndroid Build Coastguard Worker pu1_top_mv_ctxt[2] = pu1_lft_mv_ctxt[2] = u1_abs_mvd_x;
1447*495ae853SAndroid Build Coastguard Worker pu1_top_mv_ctxt[3] = pu1_lft_mv_ctxt[3] = u1_abs_mvd_y;
1448*495ae853SAndroid Build Coastguard Worker }
1449*495ae853SAndroid Build Coastguard Worker }
1450*495ae853SAndroid Build Coastguard Worker
isvce_mb_ctxt_update(isvce_cabac_ctxt_t * ps_cabac_ctxt,isvce_mb_info_ctxt_t * ps_curr_ctxt,WORD8 i1_mb_qp_delta,UWORD8 u1_cbp,UWORD8 u1_base_mode_flag,MBTYPES_T e_mb_type)1451*495ae853SAndroid Build Coastguard Worker static FORCEINLINE void isvce_mb_ctxt_update(isvce_cabac_ctxt_t *ps_cabac_ctxt,
1452*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_curr_ctxt,
1453*495ae853SAndroid Build Coastguard Worker WORD8 i1_mb_qp_delta, UWORD8 u1_cbp,
1454*495ae853SAndroid Build Coastguard Worker UWORD8 u1_base_mode_flag, MBTYPES_T e_mb_type)
1455*495ae853SAndroid Build Coastguard Worker {
1456*495ae853SAndroid Build Coastguard Worker UWORD8 u1_is_intra_mb = (e_mb_type == I16x16) || (e_mb_type == I8x8) || (e_mb_type == I4x4);
1457*495ae853SAndroid Build Coastguard Worker UWORD8 u1_is_skip_mb = (e_mb_type == PSKIP) || (e_mb_type == BSKIP);
1458*495ae853SAndroid Build Coastguard Worker UWORD8 u1_is_direct_mb = (e_mb_type == BDIRECT);
1459*495ae853SAndroid Build Coastguard Worker
1460*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_cbp = u1_cbp;
1461*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_base_mode_flag = u1_base_mode_flag;
1462*495ae853SAndroid Build Coastguard Worker
1463*495ae853SAndroid Build Coastguard Worker if(u1_is_intra_mb || u1_is_skip_mb || u1_is_direct_mb || u1_base_mode_flag)
1464*495ae853SAndroid Build Coastguard Worker {
1465*495ae853SAndroid Build Coastguard Worker memset(ps_curr_ctxt->u1_mv, 0, 16);
1466*495ae853SAndroid Build Coastguard Worker memset(ps_cabac_ctxt->pu1_left_mv_ctxt_inc, 0, 16);
1467*495ae853SAndroid Build Coastguard Worker }
1468*495ae853SAndroid Build Coastguard Worker
1469*495ae853SAndroid Build Coastguard Worker if((0 == u1_cbp) && (e_mb_type != I16x16))
1470*495ae853SAndroid Build Coastguard Worker {
1471*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_yuv_ac_csbp = 0;
1472*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_yuv_dc_csbp = 0;
1473*495ae853SAndroid Build Coastguard Worker
1474*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_uv_ac_csbp[0] = 0;
1475*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_y_ac_csbp[0] = 0;
1476*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] = 0;
1477*495ae853SAndroid Build Coastguard Worker }
1478*495ae853SAndroid Build Coastguard Worker
1479*495ae853SAndroid Build Coastguard Worker if(u1_is_skip_mb)
1480*495ae853SAndroid Build Coastguard Worker {
1481*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->i1_prevps_mb_qp_delta_ctxt = 0;
1482*495ae853SAndroid Build Coastguard Worker }
1483*495ae853SAndroid Build Coastguard Worker else if((I16x16 != e_mb_type) && (0 == u1_cbp))
1484*495ae853SAndroid Build Coastguard Worker {
1485*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->i1_prevps_mb_qp_delta_ctxt = 0;
1486*495ae853SAndroid Build Coastguard Worker }
1487*495ae853SAndroid Build Coastguard Worker else if(0 == i1_mb_qp_delta)
1488*495ae853SAndroid Build Coastguard Worker {
1489*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->i1_prevps_mb_qp_delta_ctxt = 0;
1490*495ae853SAndroid Build Coastguard Worker }
1491*495ae853SAndroid Build Coastguard Worker else
1492*495ae853SAndroid Build Coastguard Worker {
1493*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->i1_prevps_mb_qp_delta_ctxt = 1;
1494*495ae853SAndroid Build Coastguard Worker }
1495*495ae853SAndroid Build Coastguard Worker
1496*495ae853SAndroid Build Coastguard Worker if(!u1_is_intra_mb || u1_base_mode_flag)
1497*495ae853SAndroid Build Coastguard Worker {
1498*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_intrapred_chroma_mode = 0;
1499*495ae853SAndroid Build Coastguard Worker }
1500*495ae853SAndroid Build Coastguard Worker }
1501*495ae853SAndroid Build Coastguard Worker
1502*495ae853SAndroid Build Coastguard Worker /**
1503*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1504*495ae853SAndroid Build Coastguard Worker *
1505*495ae853SAndroid Build Coastguard Worker * @brief
1506*495ae853SAndroid Build Coastguard Worker * This function generates CABAC coded bit stream for an Intra Slice.
1507*495ae853SAndroid Build Coastguard Worker *
1508*495ae853SAndroid Build Coastguard Worker * @description
1509*495ae853SAndroid Build Coastguard Worker * The mb syntax layer for intra slices constitutes luma mb mode, mb qp delta,
1510*495ae853SAndroid Build Coastguard Worker *coded block pattern, chroma mb mode and luma/chroma residue. These syntax
1511*495ae853SAndroid Build Coastguard Worker *elements are written as directed by table 7.3.5 of h264 specification.
1512*495ae853SAndroid Build Coastguard Worker *
1513*495ae853SAndroid Build Coastguard Worker * @param[in] ps_ent_ctxt
1514*495ae853SAndroid Build Coastguard Worker * pointer to entropy context
1515*495ae853SAndroid Build Coastguard Worker *
1516*495ae853SAndroid Build Coastguard Worker * @returns error code
1517*495ae853SAndroid Build Coastguard Worker *
1518*495ae853SAndroid Build Coastguard Worker * @remarks none
1519*495ae853SAndroid Build Coastguard Worker *
1520*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1521*495ae853SAndroid Build Coastguard Worker */
isvce_write_islice_mb_cabac(isvce_entropy_ctxt_t * ps_ent_ctxt)1522*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_write_islice_mb_cabac(isvce_entropy_ctxt_t *ps_ent_ctxt)
1523*495ae853SAndroid Build Coastguard Worker {
1524*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_curr_ctxt;
1525*495ae853SAndroid Build Coastguard Worker
1526*495ae853SAndroid Build Coastguard Worker WORD32 mb_tpm, mb_type, chroma_intra_mode, luma_intra_mode;
1527*495ae853SAndroid Build Coastguard Worker UWORD8 u1_cbp, u1_cbp_l, u1_cbp_c;
1528*495ae853SAndroid Build Coastguard Worker WORD8 mb_qp_delta;
1529*495ae853SAndroid Build Coastguard Worker WORD32 bitstream_start_offset, bitstream_end_offset;
1530*495ae853SAndroid Build Coastguard Worker UWORD8 u1_base_mode_flag;
1531*495ae853SAndroid Build Coastguard Worker
1532*495ae853SAndroid Build Coastguard Worker bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm;
1533*495ae853SAndroid Build Coastguard Worker isvce_cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac;
1534*495ae853SAndroid Build Coastguard Worker svc_slice_header_t *ps_svc_slice_header =
1535*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->ps_svc_slice_hdr_base +
1536*495ae853SAndroid Build Coastguard Worker (ps_ent_ctxt->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT);
1537*495ae853SAndroid Build Coastguard Worker isvce_mb_hdr_common_t *ps_mb_hdr = (isvce_mb_hdr_common_t *) ps_ent_ctxt->pv_mb_header_data;
1538*495ae853SAndroid Build Coastguard Worker
1539*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
1540*495ae853SAndroid Build Coastguard Worker
1541*495ae853SAndroid Build Coastguard Worker if((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB) >= ps_bitstream->u4_max_strm_size)
1542*495ae853SAndroid Build Coastguard Worker {
1543*495ae853SAndroid Build Coastguard Worker /* return without corrupting the buffer beyond its size */
1544*495ae853SAndroid Build Coastguard Worker return (IH264E_BITSTREAM_BUFFER_OVERFLOW);
1545*495ae853SAndroid Build Coastguard Worker }
1546*495ae853SAndroid Build Coastguard Worker
1547*495ae853SAndroid Build Coastguard Worker mb_tpm = ps_mb_hdr->u1_mb_type_mode;
1548*495ae853SAndroid Build Coastguard Worker u1_base_mode_flag = ps_mb_hdr->u1_base_mode_flag;
1549*495ae853SAndroid Build Coastguard Worker u1_cbp = ps_mb_hdr->u1_cbp;
1550*495ae853SAndroid Build Coastguard Worker u1_cbp_c = (u1_cbp >> 4);
1551*495ae853SAndroid Build Coastguard Worker u1_cbp_l = (u1_cbp & 0xF);
1552*495ae853SAndroid Build Coastguard Worker mb_type = mb_tpm & 0xF;
1553*495ae853SAndroid Build Coastguard Worker
1554*495ae853SAndroid Build Coastguard Worker isvce_get_cabac_context(ps_ent_ctxt, mb_type);
1555*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info;
1556*495ae853SAndroid Build Coastguard Worker
1557*495ae853SAndroid Build Coastguard Worker bitstream_start_offset = isvce_get_num_bits(ps_bitstream);
1558*495ae853SAndroid Build Coastguard Worker
1559*495ae853SAndroid Build Coastguard Worker if(mb_type == I16x16)
1560*495ae853SAndroid Build Coastguard Worker {
1561*495ae853SAndroid Build Coastguard Worker luma_intra_mode = ((mb_tpm >> 4) & 3) + 1 + (u1_cbp_c << 2) + (u1_cbp_l == 15) * 12;
1562*495ae853SAndroid Build Coastguard Worker }
1563*495ae853SAndroid Build Coastguard Worker else
1564*495ae853SAndroid Build Coastguard Worker {
1565*495ae853SAndroid Build Coastguard Worker luma_intra_mode = 0;
1566*495ae853SAndroid Build Coastguard Worker }
1567*495ae853SAndroid Build Coastguard Worker
1568*495ae853SAndroid Build Coastguard Worker chroma_intra_mode = (mb_tpm >> 6);
1569*495ae853SAndroid Build Coastguard Worker
1570*495ae853SAndroid Build Coastguard Worker if(ps_ent_ctxt->u1_spatial_layer_id && ps_svc_slice_header->i1_adaptive_base_mode_flag)
1571*495ae853SAndroid Build Coastguard Worker {
1572*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_base_mode_flag(ps_cabac_ctxt, u1_base_mode_flag);
1573*495ae853SAndroid Build Coastguard Worker }
1574*495ae853SAndroid Build Coastguard Worker
1575*495ae853SAndroid Build Coastguard Worker if(!u1_base_mode_flag)
1576*495ae853SAndroid Build Coastguard Worker {
1577*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_intra_mb_type(ISLICE, luma_intra_mode, ps_cabac_ctxt, MB_TYPE_I_SLICE);
1578*495ae853SAndroid Build Coastguard Worker
1579*495ae853SAndroid Build Coastguard Worker if(mb_type == I4x4)
1580*495ae853SAndroid Build Coastguard Worker {
1581*495ae853SAndroid Build Coastguard Worker isvce_mb_hdr_i4x4_t *ps_mb_hdr_i4x4 =
1582*495ae853SAndroid Build Coastguard Worker (isvce_mb_hdr_i4x4_t *) ps_ent_ctxt->pv_mb_header_data;
1583*495ae853SAndroid Build Coastguard Worker
1584*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_4x4mb_modes(ps_cabac_ctxt, ps_mb_hdr_i4x4->au1_sub_blk_modes);
1585*495ae853SAndroid Build Coastguard Worker }
1586*495ae853SAndroid Build Coastguard Worker
1587*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_chroma_predmode(chroma_intra_mode, ps_cabac_ctxt);
1588*495ae853SAndroid Build Coastguard Worker }
1589*495ae853SAndroid Build Coastguard Worker
1590*495ae853SAndroid Build Coastguard Worker if(u1_base_mode_flag || (mb_type != I16x16))
1591*495ae853SAndroid Build Coastguard Worker {
1592*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_cbp(u1_cbp, ps_cabac_ctxt);
1593*495ae853SAndroid Build Coastguard Worker }
1594*495ae853SAndroid Build Coastguard Worker
1595*495ae853SAndroid Build Coastguard Worker if((u1_cbp > 0) || (mb_type == I16x16))
1596*495ae853SAndroid Build Coastguard Worker {
1597*495ae853SAndroid Build Coastguard Worker mb_qp_delta =
1598*495ae853SAndroid Build Coastguard Worker ((WORD16) ps_mb_hdr->u1_mb_qp) - ((WORD16) ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp);
1599*495ae853SAndroid Build Coastguard Worker
1600*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt);
1601*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp = ps_mb_hdr->u1_mb_qp;
1602*495ae853SAndroid Build Coastguard Worker
1603*495ae853SAndroid Build Coastguard Worker bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1604*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset - bitstream_start_offset;
1605*495ae853SAndroid Build Coastguard Worker bitstream_start_offset = bitstream_end_offset;
1606*495ae853SAndroid Build Coastguard Worker
1607*495ae853SAndroid Build Coastguard Worker if(mb_type == I16x16)
1608*495ae853SAndroid Build Coastguard Worker {
1609*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_I16x16;
1610*495ae853SAndroid Build Coastguard Worker
1611*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue_luma_dc(ps_ent_ctxt);
1612*495ae853SAndroid Build Coastguard Worker
1613*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue(ps_ent_ctxt, u1_cbp, LUMA_AC_CTXCAT);
1614*495ae853SAndroid Build Coastguard Worker
1615*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_i16x16_t);
1616*495ae853SAndroid Build Coastguard Worker }
1617*495ae853SAndroid Build Coastguard Worker else if(mb_type == I4x4)
1618*495ae853SAndroid Build Coastguard Worker {
1619*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_I4x4;
1620*495ae853SAndroid Build Coastguard Worker
1621*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue(ps_ent_ctxt, u1_cbp, LUMA_4X4_CTXCAT);
1622*495ae853SAndroid Build Coastguard Worker
1623*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6;
1624*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6;
1625*495ae853SAndroid Build Coastguard Worker
1626*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_i4x4_t);
1627*495ae853SAndroid Build Coastguard Worker }
1628*495ae853SAndroid Build Coastguard Worker else if(mb_type == BASE_MODE)
1629*495ae853SAndroid Build Coastguard Worker {
1630*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_P | CAB_NON_BD16x16;
1631*495ae853SAndroid Build Coastguard Worker
1632*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue(ps_ent_ctxt, u1_cbp, LUMA_4X4_CTXCAT);
1633*495ae853SAndroid Build Coastguard Worker
1634*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6;
1635*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6;
1636*495ae853SAndroid Build Coastguard Worker
1637*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_base_mode_t);
1638*495ae853SAndroid Build Coastguard Worker }
1639*495ae853SAndroid Build Coastguard Worker
1640*495ae853SAndroid Build Coastguard Worker bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1641*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->u4_residue_bits[0] += bitstream_end_offset - bitstream_start_offset;
1642*495ae853SAndroid Build Coastguard Worker }
1643*495ae853SAndroid Build Coastguard Worker else
1644*495ae853SAndroid Build Coastguard Worker {
1645*495ae853SAndroid Build Coastguard Worker mb_qp_delta = 0;
1646*495ae853SAndroid Build Coastguard Worker
1647*495ae853SAndroid Build Coastguard Worker if(mb_type == I16x16)
1648*495ae853SAndroid Build Coastguard Worker {
1649*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_I16x16;
1650*495ae853SAndroid Build Coastguard Worker
1651*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_i16x16_t);
1652*495ae853SAndroid Build Coastguard Worker }
1653*495ae853SAndroid Build Coastguard Worker else if(mb_type == I4x4)
1654*495ae853SAndroid Build Coastguard Worker {
1655*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_I4x4;
1656*495ae853SAndroid Build Coastguard Worker
1657*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_i4x4_t);
1658*495ae853SAndroid Build Coastguard Worker }
1659*495ae853SAndroid Build Coastguard Worker else if(mb_type == BASE_MODE)
1660*495ae853SAndroid Build Coastguard Worker {
1661*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_P | CAB_NON_BD16x16;
1662*495ae853SAndroid Build Coastguard Worker
1663*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_base_mode_t);
1664*495ae853SAndroid Build Coastguard Worker }
1665*495ae853SAndroid Build Coastguard Worker
1666*495ae853SAndroid Build Coastguard Worker bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1667*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset - bitstream_start_offset;
1668*495ae853SAndroid Build Coastguard Worker }
1669*495ae853SAndroid Build Coastguard Worker
1670*495ae853SAndroid Build Coastguard Worker isvce_mb_ctxt_update(ps_cabac_ctxt, ps_curr_ctxt, mb_qp_delta, u1_cbp, u1_base_mode_flag,
1671*495ae853SAndroid Build Coastguard Worker mb_type);
1672*495ae853SAndroid Build Coastguard Worker
1673*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->pv_mb_header_data = pu1_byte;
1674*495ae853SAndroid Build Coastguard Worker
1675*495ae853SAndroid Build Coastguard Worker return IH264E_SUCCESS;
1676*495ae853SAndroid Build Coastguard Worker }
1677*495ae853SAndroid Build Coastguard Worker
1678*495ae853SAndroid Build Coastguard Worker /**
1679*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1680*495ae853SAndroid Build Coastguard Worker *
1681*495ae853SAndroid Build Coastguard Worker * @brief
1682*495ae853SAndroid Build Coastguard Worker * This function generates CABAC coded bit stream for Inter slices
1683*495ae853SAndroid Build Coastguard Worker *
1684*495ae853SAndroid Build Coastguard Worker * @description
1685*495ae853SAndroid Build Coastguard Worker * The mb syntax layer for inter slices constitutes luma mb mode, mb qp delta,
1686*495ae853SAndroid Build Coastguard Worker *coded block pattern, chroma mb mode and luma/chroma residue. These syntax
1687*495ae853SAndroid Build Coastguard Worker *elements are written as directed by table 7.3.5 of h264 specification
1688*495ae853SAndroid Build Coastguard Worker *
1689*495ae853SAndroid Build Coastguard Worker * @param[in] ps_ent_ctxt
1690*495ae853SAndroid Build Coastguard Worker * pointer to entropy context
1691*495ae853SAndroid Build Coastguard Worker *
1692*495ae853SAndroid Build Coastguard Worker * @returns error code
1693*495ae853SAndroid Build Coastguard Worker *
1694*495ae853SAndroid Build Coastguard Worker * @remarks none
1695*495ae853SAndroid Build Coastguard Worker *
1696*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1697*495ae853SAndroid Build Coastguard Worker */
isvce_write_pslice_mb_cabac(isvce_entropy_ctxt_t * ps_ent_ctxt)1698*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_write_pslice_mb_cabac(isvce_entropy_ctxt_t *ps_ent_ctxt)
1699*495ae853SAndroid Build Coastguard Worker {
1700*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_curr_ctxt;
1701*495ae853SAndroid Build Coastguard Worker
1702*495ae853SAndroid Build Coastguard Worker WORD32 mb_tpm, mb_type, chroma_intra_mode, luma_intra_mode;
1703*495ae853SAndroid Build Coastguard Worker UWORD8 u1_cbp, u1_cbp_l, u1_cbp_c;
1704*495ae853SAndroid Build Coastguard Worker WORD8 mb_qp_delta;
1705*495ae853SAndroid Build Coastguard Worker WORD32 bitstream_start_offset, bitstream_end_offset;
1706*495ae853SAndroid Build Coastguard Worker UWORD8 u1_base_mode_flag;
1707*495ae853SAndroid Build Coastguard Worker UWORD8 u1_is_intra_mb;
1708*495ae853SAndroid Build Coastguard Worker
1709*495ae853SAndroid Build Coastguard Worker bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm;
1710*495ae853SAndroid Build Coastguard Worker isvce_cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac;
1711*495ae853SAndroid Build Coastguard Worker svc_slice_header_t *ps_svc_slice_header =
1712*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->ps_svc_slice_hdr_base +
1713*495ae853SAndroid Build Coastguard Worker (ps_ent_ctxt->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT);
1714*495ae853SAndroid Build Coastguard Worker isvce_mb_hdr_common_t *ps_mb_hdr = (isvce_mb_hdr_common_t *) ps_ent_ctxt->pv_mb_header_data;
1715*495ae853SAndroid Build Coastguard Worker
1716*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
1717*495ae853SAndroid Build Coastguard Worker
1718*495ae853SAndroid Build Coastguard Worker if((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB) >= ps_bitstream->u4_max_strm_size)
1719*495ae853SAndroid Build Coastguard Worker {
1720*495ae853SAndroid Build Coastguard Worker /* return without corrupting the buffer beyond its size */
1721*495ae853SAndroid Build Coastguard Worker return IH264E_BITSTREAM_BUFFER_OVERFLOW;
1722*495ae853SAndroid Build Coastguard Worker }
1723*495ae853SAndroid Build Coastguard Worker
1724*495ae853SAndroid Build Coastguard Worker /* mb header info */
1725*495ae853SAndroid Build Coastguard Worker mb_tpm = ps_mb_hdr->u1_mb_type_mode;
1726*495ae853SAndroid Build Coastguard Worker u1_base_mode_flag = ps_mb_hdr->u1_base_mode_flag;
1727*495ae853SAndroid Build Coastguard Worker u1_cbp = ps_mb_hdr->u1_cbp;
1728*495ae853SAndroid Build Coastguard Worker u1_cbp_c = (u1_cbp >> 4);
1729*495ae853SAndroid Build Coastguard Worker u1_cbp_l = (u1_cbp & 0xF);
1730*495ae853SAndroid Build Coastguard Worker
1731*495ae853SAndroid Build Coastguard Worker /* mb type */
1732*495ae853SAndroid Build Coastguard Worker mb_type = mb_tpm & 0xF;
1733*495ae853SAndroid Build Coastguard Worker u1_is_intra_mb = (mb_type == I16x16) || (mb_type == I8x8) || (mb_type == I4x4);
1734*495ae853SAndroid Build Coastguard Worker
1735*495ae853SAndroid Build Coastguard Worker /* CABAC contexts for the MB */
1736*495ae853SAndroid Build Coastguard Worker isvce_get_cabac_context(ps_ent_ctxt, mb_type);
1737*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info;
1738*495ae853SAndroid Build Coastguard Worker
1739*495ae853SAndroid Build Coastguard Worker /* Starting bitstream offset for header in bits */
1740*495ae853SAndroid Build Coastguard Worker bitstream_start_offset = isvce_get_num_bits(ps_bitstream);
1741*495ae853SAndroid Build Coastguard Worker
1742*495ae853SAndroid Build Coastguard Worker /* Encode mb_skip_flag */
1743*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_mb_skip(mb_type == PSKIP, ps_cabac_ctxt, MB_SKIP_FLAG_P_SLICE);
1744*495ae853SAndroid Build Coastguard Worker
1745*495ae853SAndroid Build Coastguard Worker if(mb_type == PSKIP)
1746*495ae853SAndroid Build Coastguard Worker {
1747*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_P_SKIP;
1748*495ae853SAndroid Build Coastguard Worker
1749*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->pi4_mb_skip_run[0]++;
1750*495ae853SAndroid Build Coastguard Worker
1751*495ae853SAndroid Build Coastguard Worker isvce_mb_ctxt_update(ps_cabac_ctxt, ps_curr_ctxt, 0, 0, 0, PSKIP);
1752*495ae853SAndroid Build Coastguard Worker
1753*495ae853SAndroid Build Coastguard Worker bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1754*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->u4_header_bits[!u1_is_intra_mb] +=
1755*495ae853SAndroid Build Coastguard Worker bitstream_end_offset - bitstream_start_offset;
1756*495ae853SAndroid Build Coastguard Worker
1757*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_pskip_t);
1758*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->pv_mb_header_data = pu1_byte;
1759*495ae853SAndroid Build Coastguard Worker
1760*495ae853SAndroid Build Coastguard Worker return IH264E_SUCCESS;
1761*495ae853SAndroid Build Coastguard Worker }
1762*495ae853SAndroid Build Coastguard Worker
1763*495ae853SAndroid Build Coastguard Worker if(ps_ent_ctxt->u1_spatial_layer_id && ps_svc_slice_header->i1_adaptive_base_mode_flag)
1764*495ae853SAndroid Build Coastguard Worker {
1765*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_base_mode_flag(ps_cabac_ctxt, u1_base_mode_flag);
1766*495ae853SAndroid Build Coastguard Worker }
1767*495ae853SAndroid Build Coastguard Worker
1768*495ae853SAndroid Build Coastguard Worker if(!u1_base_mode_flag)
1769*495ae853SAndroid Build Coastguard Worker {
1770*495ae853SAndroid Build Coastguard Worker if(u1_is_intra_mb)
1771*495ae853SAndroid Build Coastguard Worker {
1772*495ae853SAndroid Build Coastguard Worker if(mb_type == I16x16)
1773*495ae853SAndroid Build Coastguard Worker {
1774*495ae853SAndroid Build Coastguard Worker luma_intra_mode = ((mb_tpm >> 4) & 3) + 1 + (u1_cbp_c << 2) + (u1_cbp_l == 15) * 12;
1775*495ae853SAndroid Build Coastguard Worker }
1776*495ae853SAndroid Build Coastguard Worker else
1777*495ae853SAndroid Build Coastguard Worker {
1778*495ae853SAndroid Build Coastguard Worker luma_intra_mode = 0;
1779*495ae853SAndroid Build Coastguard Worker }
1780*495ae853SAndroid Build Coastguard Worker
1781*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bin(ps_cabac_ctxt, 1,
1782*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + MB_TYPE_P_SLICE);
1783*495ae853SAndroid Build Coastguard Worker
1784*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_intra_mb_type(PSLICE, (UWORD8) luma_intra_mode, ps_cabac_ctxt,
1785*495ae853SAndroid Build Coastguard Worker MB_TYPE_P_SLICE);
1786*495ae853SAndroid Build Coastguard Worker
1787*495ae853SAndroid Build Coastguard Worker if(mb_type == I4x4)
1788*495ae853SAndroid Build Coastguard Worker {
1789*495ae853SAndroid Build Coastguard Worker isvce_mb_hdr_i4x4_t *ps_mb_hdr_i4x4 =
1790*495ae853SAndroid Build Coastguard Worker (isvce_mb_hdr_i4x4_t *) ps_ent_ctxt->pv_mb_header_data;
1791*495ae853SAndroid Build Coastguard Worker
1792*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_4x4mb_modes(ps_cabac_ctxt, ps_mb_hdr_i4x4->au1_sub_blk_modes);
1793*495ae853SAndroid Build Coastguard Worker }
1794*495ae853SAndroid Build Coastguard Worker
1795*495ae853SAndroid Build Coastguard Worker chroma_intra_mode = (mb_tpm >> 6);
1796*495ae853SAndroid Build Coastguard Worker
1797*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_chroma_predmode(chroma_intra_mode, ps_cabac_ctxt);
1798*495ae853SAndroid Build Coastguard Worker }
1799*495ae853SAndroid Build Coastguard Worker else
1800*495ae853SAndroid Build Coastguard Worker {
1801*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_inc_p;
1802*495ae853SAndroid Build Coastguard Worker
1803*495ae853SAndroid Build Coastguard Worker isvce_mb_hdr_p16x16_t *ps_mb_hdr_p16x16 =
1804*495ae853SAndroid Build Coastguard Worker (isvce_mb_hdr_p16x16_t *) ps_ent_ctxt->pv_mb_header_data;
1805*495ae853SAndroid Build Coastguard Worker
1806*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_mv_ptr = (WORD16 *) ps_mb_hdr_p16x16->ai2_mvd;
1807*495ae853SAndroid Build Coastguard Worker
1808*495ae853SAndroid Build Coastguard Worker /* Encoding mb_type as P16x16 */
1809*495ae853SAndroid Build Coastguard Worker u4_ctx_inc_p = (0x010 + ((2) << 8));
1810*495ae853SAndroid Build Coastguard Worker
1811*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(0, 3, u4_ctx_inc_p, 3,
1812*495ae853SAndroid Build Coastguard Worker &(ps_cabac_ctxt->au1_cabac_ctxt_table[MB_TYPE_P_SLICE]),
1813*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
1814*495ae853SAndroid Build Coastguard Worker
1815*495ae853SAndroid Build Coastguard Worker if(ps_ent_ctxt->u1_spatial_layer_id &&
1816*495ae853SAndroid Build Coastguard Worker ps_svc_slice_header->i1_adaptive_motion_prediction_flag)
1817*495ae853SAndroid Build Coastguard Worker {
1818*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_motion_prediction_flag(ps_cabac_ctxt, ps_mb_hdr_p16x16->u1_mvp_idx,
1819*495ae853SAndroid Build Coastguard Worker 1);
1820*495ae853SAndroid Build Coastguard Worker }
1821*495ae853SAndroid Build Coastguard Worker
1822*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_mvds_p16x16(ps_cabac_ctxt, pi2_mv_ptr);
1823*495ae853SAndroid Build Coastguard Worker }
1824*495ae853SAndroid Build Coastguard Worker }
1825*495ae853SAndroid Build Coastguard Worker
1826*495ae853SAndroid Build Coastguard Worker if(ps_ent_ctxt->u1_spatial_layer_id && (u1_base_mode_flag || !u1_is_intra_mb) &&
1827*495ae853SAndroid Build Coastguard Worker ps_svc_slice_header->i1_adaptive_residual_prediction_flag)
1828*495ae853SAndroid Build Coastguard Worker {
1829*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_residual_prediction_flag(ps_cabac_ctxt, u1_base_mode_flag,
1830*495ae853SAndroid Build Coastguard Worker ps_mb_hdr->u1_residual_prediction_flag);
1831*495ae853SAndroid Build Coastguard Worker }
1832*495ae853SAndroid Build Coastguard Worker
1833*495ae853SAndroid Build Coastguard Worker if(u1_base_mode_flag || (mb_type != I16x16))
1834*495ae853SAndroid Build Coastguard Worker {
1835*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_cbp(u1_cbp, ps_cabac_ctxt);
1836*495ae853SAndroid Build Coastguard Worker }
1837*495ae853SAndroid Build Coastguard Worker
1838*495ae853SAndroid Build Coastguard Worker if((u1_cbp > 0) || (mb_type == I16x16))
1839*495ae853SAndroid Build Coastguard Worker {
1840*495ae853SAndroid Build Coastguard Worker mb_qp_delta =
1841*495ae853SAndroid Build Coastguard Worker ((WORD16) ps_mb_hdr->u1_mb_qp) - ((WORD16) ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp);
1842*495ae853SAndroid Build Coastguard Worker
1843*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt);
1844*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp = ps_mb_hdr->u1_mb_qp;
1845*495ae853SAndroid Build Coastguard Worker
1846*495ae853SAndroid Build Coastguard Worker bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1847*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->u4_header_bits[!u1_is_intra_mb] +=
1848*495ae853SAndroid Build Coastguard Worker bitstream_end_offset - bitstream_start_offset;
1849*495ae853SAndroid Build Coastguard Worker
1850*495ae853SAndroid Build Coastguard Worker bitstream_start_offset = bitstream_end_offset;
1851*495ae853SAndroid Build Coastguard Worker
1852*495ae853SAndroid Build Coastguard Worker if(mb_type == I16x16)
1853*495ae853SAndroid Build Coastguard Worker {
1854*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_I16x16;
1855*495ae853SAndroid Build Coastguard Worker
1856*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue_luma_dc(ps_ent_ctxt);
1857*495ae853SAndroid Build Coastguard Worker
1858*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue(ps_ent_ctxt, u1_cbp, LUMA_AC_CTXCAT);
1859*495ae853SAndroid Build Coastguard Worker
1860*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_i16x16_t);
1861*495ae853SAndroid Build Coastguard Worker }
1862*495ae853SAndroid Build Coastguard Worker else if(mb_type == I4x4)
1863*495ae853SAndroid Build Coastguard Worker {
1864*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_I4x4;
1865*495ae853SAndroid Build Coastguard Worker
1866*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue(ps_ent_ctxt, u1_cbp, LUMA_4X4_CTXCAT);
1867*495ae853SAndroid Build Coastguard Worker
1868*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6;
1869*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6;
1870*495ae853SAndroid Build Coastguard Worker
1871*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_i4x4_t);
1872*495ae853SAndroid Build Coastguard Worker }
1873*495ae853SAndroid Build Coastguard Worker else if(mb_type == P16x16)
1874*495ae853SAndroid Build Coastguard Worker {
1875*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = (CAB_P | CAB_NON_BD16x16);
1876*495ae853SAndroid Build Coastguard Worker
1877*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue(ps_ent_ctxt, u1_cbp, LUMA_4X4_CTXCAT);
1878*495ae853SAndroid Build Coastguard Worker
1879*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6;
1880*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6;
1881*495ae853SAndroid Build Coastguard Worker
1882*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_p16x16_t);
1883*495ae853SAndroid Build Coastguard Worker }
1884*495ae853SAndroid Build Coastguard Worker else if(mb_type == BASE_MODE)
1885*495ae853SAndroid Build Coastguard Worker {
1886*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = (CAB_P | CAB_NON_BD16x16);
1887*495ae853SAndroid Build Coastguard Worker
1888*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue(ps_ent_ctxt, u1_cbp, LUMA_4X4_CTXCAT);
1889*495ae853SAndroid Build Coastguard Worker
1890*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6;
1891*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6;
1892*495ae853SAndroid Build Coastguard Worker
1893*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_base_mode_t);
1894*495ae853SAndroid Build Coastguard Worker }
1895*495ae853SAndroid Build Coastguard Worker
1896*495ae853SAndroid Build Coastguard Worker bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1897*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->u4_residue_bits[!u1_is_intra_mb] +=
1898*495ae853SAndroid Build Coastguard Worker bitstream_end_offset - bitstream_start_offset;
1899*495ae853SAndroid Build Coastguard Worker }
1900*495ae853SAndroid Build Coastguard Worker else
1901*495ae853SAndroid Build Coastguard Worker {
1902*495ae853SAndroid Build Coastguard Worker mb_qp_delta = 0;
1903*495ae853SAndroid Build Coastguard Worker
1904*495ae853SAndroid Build Coastguard Worker if(mb_type == I16x16)
1905*495ae853SAndroid Build Coastguard Worker {
1906*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_I16x16;
1907*495ae853SAndroid Build Coastguard Worker
1908*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_i16x16_t);
1909*495ae853SAndroid Build Coastguard Worker }
1910*495ae853SAndroid Build Coastguard Worker else if(mb_type == I4x4)
1911*495ae853SAndroid Build Coastguard Worker {
1912*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_I4x4;
1913*495ae853SAndroid Build Coastguard Worker
1914*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_i4x4_t);
1915*495ae853SAndroid Build Coastguard Worker }
1916*495ae853SAndroid Build Coastguard Worker else if(mb_type == P16x16)
1917*495ae853SAndroid Build Coastguard Worker {
1918*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = (CAB_P | CAB_NON_BD16x16);
1919*495ae853SAndroid Build Coastguard Worker
1920*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_p16x16_t);
1921*495ae853SAndroid Build Coastguard Worker }
1922*495ae853SAndroid Build Coastguard Worker else if(mb_type == BASE_MODE)
1923*495ae853SAndroid Build Coastguard Worker {
1924*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = (CAB_P | CAB_NON_BD16x16);
1925*495ae853SAndroid Build Coastguard Worker
1926*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_base_mode_t);
1927*495ae853SAndroid Build Coastguard Worker }
1928*495ae853SAndroid Build Coastguard Worker
1929*495ae853SAndroid Build Coastguard Worker bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1930*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->u4_header_bits[!u1_is_intra_mb] +=
1931*495ae853SAndroid Build Coastguard Worker bitstream_end_offset - bitstream_start_offset;
1932*495ae853SAndroid Build Coastguard Worker }
1933*495ae853SAndroid Build Coastguard Worker
1934*495ae853SAndroid Build Coastguard Worker isvce_mb_ctxt_update(ps_cabac_ctxt, ps_curr_ctxt, mb_qp_delta, u1_cbp, u1_base_mode_flag,
1935*495ae853SAndroid Build Coastguard Worker mb_type);
1936*495ae853SAndroid Build Coastguard Worker
1937*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->pv_mb_header_data = pu1_byte;
1938*495ae853SAndroid Build Coastguard Worker
1939*495ae853SAndroid Build Coastguard Worker return IH264E_SUCCESS;
1940*495ae853SAndroid Build Coastguard Worker }
1941*495ae853SAndroid Build Coastguard Worker
1942*495ae853SAndroid Build Coastguard Worker /* ! < Table 9-37 � Binarization for macroblock types in B slices in
1943*495ae853SAndroid Build Coastguard Worker * ITU_T_H264-201402 Bits 0-7 : binarised value Bits 8-15: length of binary
1944*495ae853SAndroid Build Coastguard Worker * sequence */
1945*495ae853SAndroid Build Coastguard Worker
1946*495ae853SAndroid Build Coastguard Worker static const UWORD32 u4_b_mb_type[27] = {
1947*495ae853SAndroid Build Coastguard Worker 0x0100, 0x0301, 0x0305, 0x0603, 0x0623, 0x0613, 0x0633, 0x060b, 0x062b, 0x061b, 0x063b, 0x061f,
1948*495ae853SAndroid Build Coastguard Worker 0x0707, 0x0747, 0x0727, 0x0767, 0x0717, 0x0757, 0x0737, 0x0777, 0x070f, 0x074f, 0x063f};
1949*495ae853SAndroid Build Coastguard Worker /* CtxInc for mb types in B slices */
1950*495ae853SAndroid Build Coastguard Worker static const UWORD32 ui_b_mb_type_ctx_inc[27] = {
1951*495ae853SAndroid Build Coastguard Worker 0x00, 0x0530, 0x0530, 0x0555430, 0x0555430, 0x0555430, 0x0555430, 0x0555430,
1952*495ae853SAndroid Build Coastguard Worker 0x0555430, 0x0555430, 0x0555430, 0x0555430, 0x05555430, 0x05555430, 0x05555430, 0x05555430,
1953*495ae853SAndroid Build Coastguard Worker 0x05555430, 0x05555430, 0x05555430, 0x05555430, 0x05555430, 0x05555430, 0x0555430};
1954*495ae853SAndroid Build Coastguard Worker
1955*495ae853SAndroid Build Coastguard Worker /**
1956*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1957*495ae853SAndroid Build Coastguard Worker *
1958*495ae853SAndroid Build Coastguard Worker * @brief
1959*495ae853SAndroid Build Coastguard Worker * This function generates CABAC coded bit stream for B slices
1960*495ae853SAndroid Build Coastguard Worker *
1961*495ae853SAndroid Build Coastguard Worker * @description
1962*495ae853SAndroid Build Coastguard Worker * The mb syntax layer for inter slices constitutes luma mb mode,
1963*495ae853SAndroid Build Coastguard Worker * mb qp delta, coded block pattern, chroma mb mode and
1964*495ae853SAndroid Build Coastguard Worker * luma/chroma residue. These syntax elements are written as directed by table
1965*495ae853SAndroid Build Coastguard Worker * 7.3.5 of h264 specification
1966*495ae853SAndroid Build Coastguard Worker *
1967*495ae853SAndroid Build Coastguard Worker * @param[in] ps_ent_ctxt
1968*495ae853SAndroid Build Coastguard Worker * pointer to entropy context
1969*495ae853SAndroid Build Coastguard Worker *
1970*495ae853SAndroid Build Coastguard Worker * @returns error code
1971*495ae853SAndroid Build Coastguard Worker *
1972*495ae853SAndroid Build Coastguard Worker * @remarks none
1973*495ae853SAndroid Build Coastguard Worker *
1974*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1975*495ae853SAndroid Build Coastguard Worker */
isvce_write_bslice_mb_cabac(isvce_entropy_ctxt_t * ps_ent_ctxt)1976*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_write_bslice_mb_cabac(isvce_entropy_ctxt_t *ps_ent_ctxt)
1977*495ae853SAndroid Build Coastguard Worker {
1978*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_curr_ctxt;
1979*495ae853SAndroid Build Coastguard Worker
1980*495ae853SAndroid Build Coastguard Worker WORD32 mb_tpm, mb_type, chroma_intra_mode, luma_intra_mode;
1981*495ae853SAndroid Build Coastguard Worker UWORD8 u1_cbp, u1_cbp_l, u1_cbp_c;
1982*495ae853SAndroid Build Coastguard Worker WORD8 mb_qp_delta;
1983*495ae853SAndroid Build Coastguard Worker WORD32 bitstream_start_offset, bitstream_end_offset;
1984*495ae853SAndroid Build Coastguard Worker UWORD8 u1_base_mode_flag;
1985*495ae853SAndroid Build Coastguard Worker UWORD8 u1_is_intra_mb;
1986*495ae853SAndroid Build Coastguard Worker
1987*495ae853SAndroid Build Coastguard Worker bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm;
1988*495ae853SAndroid Build Coastguard Worker isvce_cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac;
1989*495ae853SAndroid Build Coastguard Worker svc_slice_header_t *ps_svc_slice_header =
1990*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->ps_svc_slice_hdr_base +
1991*495ae853SAndroid Build Coastguard Worker (ps_ent_ctxt->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT);
1992*495ae853SAndroid Build Coastguard Worker isvce_mb_hdr_common_t *ps_mb_hdr = (isvce_mb_hdr_common_t *) ps_ent_ctxt->pv_mb_header_data;
1993*495ae853SAndroid Build Coastguard Worker
1994*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
1995*495ae853SAndroid Build Coastguard Worker
1996*495ae853SAndroid Build Coastguard Worker if((ps_bitstream->u4_strm_buf_offset + MIN_STREAM_SIZE_MB) >= ps_bitstream->u4_max_strm_size)
1997*495ae853SAndroid Build Coastguard Worker {
1998*495ae853SAndroid Build Coastguard Worker /* return without corrupting the buffer beyond its size */
1999*495ae853SAndroid Build Coastguard Worker return (IH264E_BITSTREAM_BUFFER_OVERFLOW);
2000*495ae853SAndroid Build Coastguard Worker }
2001*495ae853SAndroid Build Coastguard Worker
2002*495ae853SAndroid Build Coastguard Worker /* mb header info */
2003*495ae853SAndroid Build Coastguard Worker mb_tpm = ps_mb_hdr->u1_mb_type_mode;
2004*495ae853SAndroid Build Coastguard Worker u1_base_mode_flag = ps_mb_hdr->u1_base_mode_flag;
2005*495ae853SAndroid Build Coastguard Worker u1_cbp = ps_mb_hdr->u1_cbp;
2006*495ae853SAndroid Build Coastguard Worker u1_cbp_c = (u1_cbp >> 4);
2007*495ae853SAndroid Build Coastguard Worker u1_cbp_l = (u1_cbp & 0xF);
2008*495ae853SAndroid Build Coastguard Worker
2009*495ae853SAndroid Build Coastguard Worker /* mb type */
2010*495ae853SAndroid Build Coastguard Worker mb_type = mb_tpm & 0xF;
2011*495ae853SAndroid Build Coastguard Worker u1_is_intra_mb = (mb_type == I16x16) || (mb_type == I8x8) || (mb_type == I4x4);
2012*495ae853SAndroid Build Coastguard Worker
2013*495ae853SAndroid Build Coastguard Worker /* CABAC contexts for the MB */
2014*495ae853SAndroid Build Coastguard Worker isvce_get_cabac_context(ps_ent_ctxt, mb_type);
2015*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info;
2016*495ae853SAndroid Build Coastguard Worker
2017*495ae853SAndroid Build Coastguard Worker /* Starting bitstream offset for header in bits */
2018*495ae853SAndroid Build Coastguard Worker bitstream_start_offset = isvce_get_num_bits(ps_bitstream);
2019*495ae853SAndroid Build Coastguard Worker
2020*495ae853SAndroid Build Coastguard Worker /* Encode mb_skip_flag */
2021*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_mb_skip(mb_type == BSKIP, ps_cabac_ctxt, MB_SKIP_FLAG_B_SLICE);
2022*495ae853SAndroid Build Coastguard Worker
2023*495ae853SAndroid Build Coastguard Worker if(mb_type == BSKIP)
2024*495ae853SAndroid Build Coastguard Worker {
2025*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_B_SKIP;
2026*495ae853SAndroid Build Coastguard Worker
2027*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->pi4_mb_skip_run[0]++;
2028*495ae853SAndroid Build Coastguard Worker
2029*495ae853SAndroid Build Coastguard Worker isvce_mb_ctxt_update(ps_cabac_ctxt, ps_curr_ctxt, 0, 0, 0, BSKIP);
2030*495ae853SAndroid Build Coastguard Worker
2031*495ae853SAndroid Build Coastguard Worker bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
2032*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->u4_header_bits[!u1_is_intra_mb] +=
2033*495ae853SAndroid Build Coastguard Worker bitstream_end_offset - bitstream_start_offset;
2034*495ae853SAndroid Build Coastguard Worker
2035*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_bskip_t);
2036*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->pv_mb_header_data = pu1_byte;
2037*495ae853SAndroid Build Coastguard Worker
2038*495ae853SAndroid Build Coastguard Worker return IH264E_SUCCESS;
2039*495ae853SAndroid Build Coastguard Worker }
2040*495ae853SAndroid Build Coastguard Worker
2041*495ae853SAndroid Build Coastguard Worker if(ps_ent_ctxt->u1_spatial_layer_id && ps_svc_slice_header->i1_adaptive_base_mode_flag)
2042*495ae853SAndroid Build Coastguard Worker {
2043*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_base_mode_flag(ps_cabac_ctxt, u1_base_mode_flag);
2044*495ae853SAndroid Build Coastguard Worker }
2045*495ae853SAndroid Build Coastguard Worker
2046*495ae853SAndroid Build Coastguard Worker if(!u1_base_mode_flag)
2047*495ae853SAndroid Build Coastguard Worker {
2048*495ae853SAndroid Build Coastguard Worker if(u1_is_intra_mb)
2049*495ae853SAndroid Build Coastguard Worker {
2050*495ae853SAndroid Build Coastguard Worker if(mb_type == I16x16)
2051*495ae853SAndroid Build Coastguard Worker {
2052*495ae853SAndroid Build Coastguard Worker luma_intra_mode = ((mb_tpm >> 4) & 3) + 1 + (u1_cbp_c << 2) + (u1_cbp_l == 15) * 12;
2053*495ae853SAndroid Build Coastguard Worker }
2054*495ae853SAndroid Build Coastguard Worker else
2055*495ae853SAndroid Build Coastguard Worker {
2056*495ae853SAndroid Build Coastguard Worker luma_intra_mode = 0;
2057*495ae853SAndroid Build Coastguard Worker }
2058*495ae853SAndroid Build Coastguard Worker
2059*495ae853SAndroid Build Coastguard Worker {
2060*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info;
2061*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info;
2062*495ae853SAndroid Build Coastguard Worker
2063*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_inc = 0;
2064*495ae853SAndroid Build Coastguard Worker
2065*495ae853SAndroid Build Coastguard Worker if(ps_left_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info)
2066*495ae853SAndroid Build Coastguard Worker {
2067*495ae853SAndroid Build Coastguard Worker u4_ctx_inc +=
2068*495ae853SAndroid Build Coastguard Worker ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16) ? 1 : 0;
2069*495ae853SAndroid Build Coastguard Worker }
2070*495ae853SAndroid Build Coastguard Worker
2071*495ae853SAndroid Build Coastguard Worker if(ps_top_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info)
2072*495ae853SAndroid Build Coastguard Worker {
2073*495ae853SAndroid Build Coastguard Worker u4_ctx_inc +=
2074*495ae853SAndroid Build Coastguard Worker ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16) ? 1 : 0;
2075*495ae853SAndroid Build Coastguard Worker }
2076*495ae853SAndroid Build Coastguard Worker
2077*495ae853SAndroid Build Coastguard Worker /* Intra Prefix Only "111101" */
2078*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = (u4_ctx_inc | 0x05555430);
2079*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(0x2f, 6, u4_ctx_inc, 3,
2080*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + MB_TYPE_B_SLICE,
2081*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
2082*495ae853SAndroid Build Coastguard Worker
2083*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_intra_mb_type(BSLICE, (UWORD8) luma_intra_mode, ps_cabac_ctxt,
2084*495ae853SAndroid Build Coastguard Worker MB_TYPE_B_SLICE);
2085*495ae853SAndroid Build Coastguard Worker }
2086*495ae853SAndroid Build Coastguard Worker
2087*495ae853SAndroid Build Coastguard Worker if(mb_type == I4x4)
2088*495ae853SAndroid Build Coastguard Worker {
2089*495ae853SAndroid Build Coastguard Worker isvce_mb_hdr_i4x4_t *ps_mb_hdr_i4x4 =
2090*495ae853SAndroid Build Coastguard Worker (isvce_mb_hdr_i4x4_t *) ps_ent_ctxt->pv_mb_header_data;
2091*495ae853SAndroid Build Coastguard Worker
2092*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_4x4mb_modes(ps_cabac_ctxt, ps_mb_hdr_i4x4->au1_sub_blk_modes);
2093*495ae853SAndroid Build Coastguard Worker }
2094*495ae853SAndroid Build Coastguard Worker
2095*495ae853SAndroid Build Coastguard Worker chroma_intra_mode = (mb_tpm >> 6);
2096*495ae853SAndroid Build Coastguard Worker
2097*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_chroma_predmode(chroma_intra_mode, ps_cabac_ctxt);
2098*495ae853SAndroid Build Coastguard Worker }
2099*495ae853SAndroid Build Coastguard Worker else if(mb_type == BDIRECT)
2100*495ae853SAndroid Build Coastguard Worker {
2101*495ae853SAndroid Build Coastguard Worker /* Encoding mb_type as B_Direct_16x16 */
2102*495ae853SAndroid Build Coastguard Worker {
2103*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info;
2104*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info;
2105*495ae853SAndroid Build Coastguard Worker
2106*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_inc = 0;
2107*495ae853SAndroid Build Coastguard Worker
2108*495ae853SAndroid Build Coastguard Worker if(ps_left_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info)
2109*495ae853SAndroid Build Coastguard Worker {
2110*495ae853SAndroid Build Coastguard Worker u4_ctx_inc +=
2111*495ae853SAndroid Build Coastguard Worker ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16) ? 1 : 0;
2112*495ae853SAndroid Build Coastguard Worker }
2113*495ae853SAndroid Build Coastguard Worker
2114*495ae853SAndroid Build Coastguard Worker if(ps_top_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info)
2115*495ae853SAndroid Build Coastguard Worker {
2116*495ae853SAndroid Build Coastguard Worker u4_ctx_inc +=
2117*495ae853SAndroid Build Coastguard Worker ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16) ? 1 : 0;
2118*495ae853SAndroid Build Coastguard Worker }
2119*495ae853SAndroid Build Coastguard Worker
2120*495ae853SAndroid Build Coastguard Worker /* Encode the bin */
2121*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_bin(
2122*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt, 0,
2123*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->au1_cabac_ctxt_table + MB_TYPE_B_SLICE + u4_ctx_inc);
2124*495ae853SAndroid Build Coastguard Worker }
2125*495ae853SAndroid Build Coastguard Worker }
2126*495ae853SAndroid Build Coastguard Worker else
2127*495ae853SAndroid Build Coastguard Worker {
2128*495ae853SAndroid Build Coastguard Worker WORD32 i;
2129*495ae853SAndroid Build Coastguard Worker
2130*495ae853SAndroid Build Coastguard Worker isvce_mb_hdr_b16x16_t *ps_mb_hdr_b16x16 =
2131*495ae853SAndroid Build Coastguard Worker (isvce_mb_hdr_b16x16_t *) ps_ent_ctxt->pv_mb_header_data;
2132*495ae853SAndroid Build Coastguard Worker
2133*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_mv_ptr = (WORD16 *) ps_mb_hdr_b16x16->ai2_mvd;
2134*495ae853SAndroid Build Coastguard Worker WORD32 i4_mb_part_pred_mode = (mb_tpm >> 4);
2135*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mb_type = mb_type - B16x16 + B_L0_16x16 + i4_mb_part_pred_mode;
2136*495ae853SAndroid Build Coastguard Worker
2137*495ae853SAndroid Build Coastguard Worker /* Encoding mb_type as B16x16 */
2138*495ae853SAndroid Build Coastguard Worker {
2139*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_left_ctxt = ps_cabac_ctxt->ps_left_ctxt_mb_info;
2140*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_top_ctxt = ps_cabac_ctxt->ps_top_ctxt_mb_info;
2141*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ctx_inc = 0;
2142*495ae853SAndroid Build Coastguard Worker
2143*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mb_type_bins = u4_b_mb_type[u4_mb_type];
2144*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bin_len = (u4_mb_type_bins >> 8) & 0x0F;
2145*495ae853SAndroid Build Coastguard Worker u4_mb_type_bins = u4_mb_type_bins & 0xFF;
2146*495ae853SAndroid Build Coastguard Worker
2147*495ae853SAndroid Build Coastguard Worker if(ps_left_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info)
2148*495ae853SAndroid Build Coastguard Worker u4_ctx_inc +=
2149*495ae853SAndroid Build Coastguard Worker ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16) ? 1 : 0;
2150*495ae853SAndroid Build Coastguard Worker if(ps_top_ctxt != ps_cabac_ctxt->ps_def_ctxt_mb_info)
2151*495ae853SAndroid Build Coastguard Worker u4_ctx_inc +=
2152*495ae853SAndroid Build Coastguard Worker ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16) ? 1 : 0;
2153*495ae853SAndroid Build Coastguard Worker
2154*495ae853SAndroid Build Coastguard Worker u4_ctx_inc = u4_ctx_inc | ui_b_mb_type_ctx_inc[u4_mb_type];
2155*495ae853SAndroid Build Coastguard Worker
2156*495ae853SAndroid Build Coastguard Worker isvce_encode_decision_bins(u4_mb_type_bins, u4_bin_len, u4_ctx_inc, u4_bin_len,
2157*495ae853SAndroid Build Coastguard Worker &(ps_cabac_ctxt->au1_cabac_ctxt_table[MB_TYPE_B_SLICE]),
2158*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt);
2159*495ae853SAndroid Build Coastguard Worker }
2160*495ae853SAndroid Build Coastguard Worker
2161*495ae853SAndroid Build Coastguard Worker for(i = 0; i < NUM_PRED_DIRS; i++)
2162*495ae853SAndroid Build Coastguard Worker {
2163*495ae853SAndroid Build Coastguard Worker PRED_MODE_T e_pred_mode = (PRED_MODE_T) i;
2164*495ae853SAndroid Build Coastguard Worker PRED_MODE_T e_cmpl_pred_mode = (e_pred_mode == L0) ? L1 : L0;
2165*495ae853SAndroid Build Coastguard Worker
2166*495ae853SAndroid Build Coastguard Worker if(((PRED_MODE_T) i4_mb_part_pred_mode) != e_pred_mode)
2167*495ae853SAndroid Build Coastguard Worker {
2168*495ae853SAndroid Build Coastguard Worker if(ps_svc_slice_header->i1_adaptive_motion_prediction_flag &&
2169*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->u1_spatial_layer_id)
2170*495ae853SAndroid Build Coastguard Worker {
2171*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_motion_prediction_flag(
2172*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt, ps_mb_hdr_b16x16->au1_mvp_idx[e_cmpl_pred_mode],
2173*495ae853SAndroid Build Coastguard Worker e_cmpl_pred_mode == L0);
2174*495ae853SAndroid Build Coastguard Worker }
2175*495ae853SAndroid Build Coastguard Worker }
2176*495ae853SAndroid Build Coastguard Worker }
2177*495ae853SAndroid Build Coastguard Worker
2178*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_mvds_b16x16(ps_cabac_ctxt, pi2_mv_ptr, i4_mb_part_pred_mode);
2179*495ae853SAndroid Build Coastguard Worker }
2180*495ae853SAndroid Build Coastguard Worker }
2181*495ae853SAndroid Build Coastguard Worker
2182*495ae853SAndroid Build Coastguard Worker if(ps_svc_slice_header->i1_adaptive_residual_prediction_flag &&
2183*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->u1_spatial_layer_id && (u1_base_mode_flag || !u1_is_intra_mb))
2184*495ae853SAndroid Build Coastguard Worker {
2185*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_residual_prediction_flag(ps_cabac_ctxt, u1_base_mode_flag,
2186*495ae853SAndroid Build Coastguard Worker ps_mb_hdr->u1_residual_prediction_flag);
2187*495ae853SAndroid Build Coastguard Worker }
2188*495ae853SAndroid Build Coastguard Worker
2189*495ae853SAndroid Build Coastguard Worker if(u1_base_mode_flag || (mb_type != I16x16))
2190*495ae853SAndroid Build Coastguard Worker {
2191*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_cbp(u1_cbp, ps_cabac_ctxt);
2192*495ae853SAndroid Build Coastguard Worker }
2193*495ae853SAndroid Build Coastguard Worker
2194*495ae853SAndroid Build Coastguard Worker if((u1_cbp > 0) || (mb_type == I16x16))
2195*495ae853SAndroid Build Coastguard Worker {
2196*495ae853SAndroid Build Coastguard Worker mb_qp_delta =
2197*495ae853SAndroid Build Coastguard Worker ((WORD16) ps_mb_hdr->u1_mb_qp) - ((WORD16) ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp);
2198*495ae853SAndroid Build Coastguard Worker
2199*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_mb_qp_delta(mb_qp_delta, ps_cabac_ctxt);
2200*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp = ps_mb_hdr->u1_mb_qp;
2201*495ae853SAndroid Build Coastguard Worker
2202*495ae853SAndroid Build Coastguard Worker bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
2203*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->u4_header_bits[!u1_is_intra_mb] +=
2204*495ae853SAndroid Build Coastguard Worker bitstream_end_offset - bitstream_start_offset;
2205*495ae853SAndroid Build Coastguard Worker bitstream_start_offset = bitstream_end_offset;
2206*495ae853SAndroid Build Coastguard Worker
2207*495ae853SAndroid Build Coastguard Worker if(mb_type == I16x16)
2208*495ae853SAndroid Build Coastguard Worker {
2209*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_I16x16;
2210*495ae853SAndroid Build Coastguard Worker
2211*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue_luma_dc(ps_ent_ctxt);
2212*495ae853SAndroid Build Coastguard Worker
2213*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue(ps_ent_ctxt, u1_cbp, LUMA_AC_CTXCAT);
2214*495ae853SAndroid Build Coastguard Worker
2215*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_i16x16_t);
2216*495ae853SAndroid Build Coastguard Worker }
2217*495ae853SAndroid Build Coastguard Worker else if(mb_type == I4x4)
2218*495ae853SAndroid Build Coastguard Worker {
2219*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_I4x4;
2220*495ae853SAndroid Build Coastguard Worker
2221*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue(ps_ent_ctxt, u1_cbp, LUMA_4X4_CTXCAT);
2222*495ae853SAndroid Build Coastguard Worker
2223*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6;
2224*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6;
2225*495ae853SAndroid Build Coastguard Worker
2226*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_i4x4_t);
2227*495ae853SAndroid Build Coastguard Worker }
2228*495ae853SAndroid Build Coastguard Worker else if(mb_type == B16x16)
2229*495ae853SAndroid Build Coastguard Worker {
2230*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_NON_BD16x16;
2231*495ae853SAndroid Build Coastguard Worker
2232*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue(ps_ent_ctxt, u1_cbp, LUMA_4X4_CTXCAT);
2233*495ae853SAndroid Build Coastguard Worker
2234*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6;
2235*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6;
2236*495ae853SAndroid Build Coastguard Worker
2237*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_b16x16_t);
2238*495ae853SAndroid Build Coastguard Worker }
2239*495ae853SAndroid Build Coastguard Worker else if(mb_type == BDIRECT)
2240*495ae853SAndroid Build Coastguard Worker {
2241*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_BD16x16;
2242*495ae853SAndroid Build Coastguard Worker
2243*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue(ps_ent_ctxt, u1_cbp, LUMA_4X4_CTXCAT);
2244*495ae853SAndroid Build Coastguard Worker
2245*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6;
2246*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6;
2247*495ae853SAndroid Build Coastguard Worker
2248*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_b16x16_t);
2249*495ae853SAndroid Build Coastguard Worker }
2250*495ae853SAndroid Build Coastguard Worker else if(mb_type == BASE_MODE)
2251*495ae853SAndroid Build Coastguard Worker {
2252*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_NON_BD16x16;
2253*495ae853SAndroid Build Coastguard Worker
2254*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_residue(ps_ent_ctxt, u1_cbp, LUMA_4X4_CTXCAT);
2255*495ae853SAndroid Build Coastguard Worker
2256*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->pu1_left_yuv_dc_csbp[0] &= 0x6;
2257*495ae853SAndroid Build Coastguard Worker ps_cabac_ctxt->ps_curr_ctxt_mb_info->u1_yuv_dc_csbp &= 0x6;
2258*495ae853SAndroid Build Coastguard Worker
2259*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_base_mode_t);
2260*495ae853SAndroid Build Coastguard Worker }
2261*495ae853SAndroid Build Coastguard Worker
2262*495ae853SAndroid Build Coastguard Worker bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
2263*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->u4_residue_bits[!u1_is_intra_mb] +=
2264*495ae853SAndroid Build Coastguard Worker bitstream_end_offset - bitstream_start_offset;
2265*495ae853SAndroid Build Coastguard Worker }
2266*495ae853SAndroid Build Coastguard Worker else
2267*495ae853SAndroid Build Coastguard Worker {
2268*495ae853SAndroid Build Coastguard Worker mb_qp_delta = 0;
2269*495ae853SAndroid Build Coastguard Worker
2270*495ae853SAndroid Build Coastguard Worker if(mb_type == I16x16)
2271*495ae853SAndroid Build Coastguard Worker {
2272*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_I16x16;
2273*495ae853SAndroid Build Coastguard Worker
2274*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_i16x16_t);
2275*495ae853SAndroid Build Coastguard Worker }
2276*495ae853SAndroid Build Coastguard Worker else if(mb_type == I4x4)
2277*495ae853SAndroid Build Coastguard Worker {
2278*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_I4x4;
2279*495ae853SAndroid Build Coastguard Worker
2280*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_i4x4_t);
2281*495ae853SAndroid Build Coastguard Worker }
2282*495ae853SAndroid Build Coastguard Worker else if(mb_type == B16x16)
2283*495ae853SAndroid Build Coastguard Worker {
2284*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_NON_BD16x16;
2285*495ae853SAndroid Build Coastguard Worker
2286*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_b16x16_t);
2287*495ae853SAndroid Build Coastguard Worker }
2288*495ae853SAndroid Build Coastguard Worker else if(mb_type == BDIRECT)
2289*495ae853SAndroid Build Coastguard Worker {
2290*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_BD16x16;
2291*495ae853SAndroid Build Coastguard Worker
2292*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_b16x16_t);
2293*495ae853SAndroid Build Coastguard Worker }
2294*495ae853SAndroid Build Coastguard Worker else if(mb_type == BDIRECT)
2295*495ae853SAndroid Build Coastguard Worker {
2296*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_NON_BD16x16;
2297*495ae853SAndroid Build Coastguard Worker
2298*495ae853SAndroid Build Coastguard Worker pu1_byte += sizeof(isvce_mb_hdr_base_mode_t);
2299*495ae853SAndroid Build Coastguard Worker }
2300*495ae853SAndroid Build Coastguard Worker
2301*495ae853SAndroid Build Coastguard Worker bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
2302*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->u4_header_bits[!u1_is_intra_mb] +=
2303*495ae853SAndroid Build Coastguard Worker bitstream_end_offset - bitstream_start_offset;
2304*495ae853SAndroid Build Coastguard Worker }
2305*495ae853SAndroid Build Coastguard Worker
2306*495ae853SAndroid Build Coastguard Worker isvce_mb_ctxt_update(ps_cabac_ctxt, ps_curr_ctxt, mb_qp_delta, u1_cbp, u1_base_mode_flag,
2307*495ae853SAndroid Build Coastguard Worker mb_type);
2308*495ae853SAndroid Build Coastguard Worker
2309*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->pv_mb_header_data = pu1_byte;
2310*495ae853SAndroid Build Coastguard Worker
2311*495ae853SAndroid Build Coastguard Worker return IH264E_SUCCESS;
2312*495ae853SAndroid Build Coastguard Worker }
2313*495ae853SAndroid Build Coastguard Worker
2314*495ae853SAndroid Build Coastguard Worker #if ENABLE_RE_ENC_AS_SKIP
isvce_reencode_as_skip_frame_cabac(isvce_entropy_ctxt_t * ps_ent_ctxt)2315*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_reencode_as_skip_frame_cabac(isvce_entropy_ctxt_t *ps_ent_ctxt)
2316*495ae853SAndroid Build Coastguard Worker {
2317*495ae853SAndroid Build Coastguard Worker isvce_cabac_ctxt_t *ps_cabac_ctxt = ps_ent_ctxt->ps_cabac;
2318*495ae853SAndroid Build Coastguard Worker bitstrm_t *ps_bitstrm = ps_ent_ctxt->ps_bitstrm;
2319*495ae853SAndroid Build Coastguard Worker bitstrm_t *ps_bitstrm_after_slice_hdr = ps_ent_ctxt->ps_bitstrm_after_slice_hdr;
2320*495ae853SAndroid Build Coastguard Worker
2321*495ae853SAndroid Build Coastguard Worker isvce_mb_info_ctxt_t *ps_curr_ctxt;
2322*495ae853SAndroid Build Coastguard Worker
2323*495ae853SAndroid Build Coastguard Worker slice_header_t *ps_slice_header =
2324*495ae853SAndroid Build Coastguard Worker (ps_ent_ctxt->u1_spatial_layer_id == 0)
2325*495ae853SAndroid Build Coastguard Worker ? &ps_ent_ctxt->ps_slice_hdr_base[ps_ent_ctxt->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT]
2326*495ae853SAndroid Build Coastguard Worker : &ps_ent_ctxt
2327*495ae853SAndroid Build Coastguard Worker ->ps_svc_slice_hdr_base[ps_ent_ctxt->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT]
2328*495ae853SAndroid Build Coastguard Worker .s_slice_header;
2329*495ae853SAndroid Build Coastguard Worker
2330*495ae853SAndroid Build Coastguard Worker /* total mb cnt */
2331*495ae853SAndroid Build Coastguard Worker UWORD32 i4_wd_mbs = ps_ent_ctxt->i4_wd_mbs;
2332*495ae853SAndroid Build Coastguard Worker UWORD32 i4_ht_mbs = ps_ent_ctxt->i4_ht_mbs;
2333*495ae853SAndroid Build Coastguard Worker UWORD8 i, j;
2334*495ae853SAndroid Build Coastguard Worker
2335*495ae853SAndroid Build Coastguard Worker isvce_init_cabac_ctxt(ps_ent_ctxt, ps_slice_header);
2336*495ae853SAndroid Build Coastguard Worker
2337*495ae853SAndroid Build Coastguard Worker ps_bitstrm->i4_bits_left_in_cw = ps_bitstrm_after_slice_hdr->i4_bits_left_in_cw;
2338*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_cur_word = ps_bitstrm_after_slice_hdr->u4_cur_word;
2339*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_strm_buf_offset = ps_bitstrm_after_slice_hdr->u4_strm_buf_offset;
2340*495ae853SAndroid Build Coastguard Worker ps_bitstrm->i4_zero_bytes_run = ps_bitstrm_after_slice_hdr->i4_zero_bytes_run;
2341*495ae853SAndroid Build Coastguard Worker
2342*495ae853SAndroid Build Coastguard Worker for(i = 0; i < i4_ht_mbs; i++)
2343*495ae853SAndroid Build Coastguard Worker {
2344*495ae853SAndroid Build Coastguard Worker for(j = 0; j < i4_wd_mbs; j++)
2345*495ae853SAndroid Build Coastguard Worker {
2346*495ae853SAndroid Build Coastguard Worker MBTYPES_T mb_type = PSKIP;
2347*495ae853SAndroid Build Coastguard Worker
2348*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->i4_mb_x = j;
2349*495ae853SAndroid Build Coastguard Worker ps_ent_ctxt->i4_mb_y = i;
2350*495ae853SAndroid Build Coastguard Worker
2351*495ae853SAndroid Build Coastguard Worker isvce_get_cabac_context(ps_ent_ctxt, mb_type);
2352*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt = ps_cabac_ctxt->ps_curr_ctxt_mb_info;
2353*495ae853SAndroid Build Coastguard Worker
2354*495ae853SAndroid Build Coastguard Worker isvce_cabac_enc_mb_skip(mb_type == PSKIP, ps_cabac_ctxt, MB_SKIP_FLAG_P_SLICE);
2355*495ae853SAndroid Build Coastguard Worker
2356*495ae853SAndroid Build Coastguard Worker if(mb_type == PSKIP)
2357*495ae853SAndroid Build Coastguard Worker {
2358*495ae853SAndroid Build Coastguard Worker ps_curr_ctxt->u1_mb_type = CAB_P_SKIP;
2359*495ae853SAndroid Build Coastguard Worker isvce_mb_ctxt_update(ps_cabac_ctxt, ps_curr_ctxt, 0, 0, 0, PSKIP);
2360*495ae853SAndroid Build Coastguard Worker }
2361*495ae853SAndroid Build Coastguard Worker
2362*495ae853SAndroid Build Coastguard Worker if(j == i4_wd_mbs - 1 && i == i4_ht_mbs - 1)
2363*495ae853SAndroid Build Coastguard Worker {
2364*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_terminate(ps_cabac_ctxt, 1);
2365*495ae853SAndroid Build Coastguard Worker }
2366*495ae853SAndroid Build Coastguard Worker else
2367*495ae853SAndroid Build Coastguard Worker {
2368*495ae853SAndroid Build Coastguard Worker isvce_cabac_encode_terminate(ps_cabac_ctxt, 0);
2369*495ae853SAndroid Build Coastguard Worker }
2370*495ae853SAndroid Build Coastguard Worker }
2371*495ae853SAndroid Build Coastguard Worker }
2372*495ae853SAndroid Build Coastguard Worker return IH264E_SUCCESS;
2373*495ae853SAndroid Build Coastguard Worker }
2374*495ae853SAndroid Build Coastguard Worker #endif
2375