Coverage Report

Created: 2025-12-14 06:42

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