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