Coverage Report

Created: 2025-07-11 06:39

/src/libavc/encoder/svc/isvce_cavlc.c
Line
Count
Source (jump to first uncovered line)
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2022 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
*  isvce_cavlc.c
25
*
26
* @brief
27
*  Contains all the routines to code syntax elements and residuals when entropy
28
*  coding chosen is CAVLC
29
*
30
* @author
31
*  ittiam
32
*
33
* @par List of Functions:
34
*  - isvce_compute_zeroruns_and_trailingones()
35
*  - isvce_write_coeff4x4_cavlc()
36
*  - isvce_write_coeff8x8_cavlc()
37
*  - isvce_encode_residue()
38
*  - isvce_write_islice_mb_cavlc()
39
*  - isvce_write_pslice_mb_cavlc()
40
*
41
* @remarks
42
*  None
43
*
44
*******************************************************************************
45
*/
46
47
/*****************************************************************************/
48
/* File Includes                                                             */
49
/*****************************************************************************/
50
51
/* System include files */
52
#include <stdio.h>
53
#include <assert.h>
54
#include <limits.h>
55
56
/* User include files */
57
#include "ih264e_config.h"
58
#include "ih264_typedefs.h"
59
#include "iv2.h"
60
#include "ive2.h"
61
#include "ih264_debug.h"
62
#include "isvc_macros.h"
63
#include "isvc_defs.h"
64
#include "isvce_defs.h"
65
#include "ih264e_error.h"
66
#include "ih264e_bitstream.h"
67
#include "ime_distortion_metrics.h"
68
#include "ime_defs.h"
69
#include "ime_structs.h"
70
#include "ih264_error.h"
71
#include "isvc_structs.h"
72
#include "isvc_trans_quant_itrans_iquant.h"
73
#include "isvc_inter_pred_filters.h"
74
#include "isvc_mem_fns.h"
75
#include "ih264_padding.h"
76
#include "ih264_intra_pred_filters.h"
77
#include "ih264_deblk_edge_filters.h"
78
#include "isvc_cabac_tables.h"
79
#include "irc_cntrl_param.h"
80
#include "irc_frame_info_collector.h"
81
#include "isvce_rate_control.h"
82
#include "isvce_cabac_structs.h"
83
#include "isvce_structs.h"
84
#include "isvce_encode_header.h"
85
#include "ih264_cavlc_tables.h"
86
#include "isvce_cavlc.h"
87
#include "ih264e_statistics.h"
88
#include "ih264e_trace.h"
89
#include "isvce_encode_header.h"
90
#include "isvce_utils.h"
91
92
/*****************************************************************************/
93
/* Function Definitions                                                      */
94
/*****************************************************************************/
95
96
/**
97
*******************************************************************************
98
*
99
* @brief
100
*  This function computes run of zero, number of trailing ones and sign of
101
*  trailing ones basing on the significant coeff map, residual block and
102
*  total nnz.
103
*
104
* @param[in] pi2_res_block
105
*  Pointer to residual block containing levels in scan order
106
*
107
* @param[in] u4_total_coeff
108
*  Total non-zero coefficients in that sub block
109
*
110
* @param[in] pu1_zero_run
111
*  Pointer to array to store run of zeros
112
*
113
* @param[in] u4_sig_coeff_map
114
*  significant coefficient map
115
*
116
* @returns u4_totzero_sign_trailone
117
*  Bits 0-8 contains number of trailing ones.
118
*  Bits 8-16 contains bitwise sign information of trailing one
119
*  Bits 16-24 contains total number of zeros.
120
*
121
* @remarks
122
*  None
123
*
124
*******************************************************************************
125
*/
126
static UWORD32 isvce_compute_zeroruns_and_trailingones(WORD16 *pi2_res_block,
127
                                                       UWORD32 u4_total_coeff, UWORD8 *pu1_zero_run,
128
                                                       UWORD32 u4_sig_coeff_map)
129
9.60M
{
130
9.60M
    UWORD32 i = 0;
131
9.60M
    UWORD32 u4_nnz_coeff = 0;
132
9.60M
    WORD32 i4_run = -1;
133
9.60M
    UWORD32 u4_sign = 0;
134
9.60M
    UWORD32 u4_tot_zero = 0;
135
9.60M
    UWORD32 u4_trailing1 = 0;
136
9.60M
    WORD32 i4_val;
137
9.60M
    UWORD32 u4_totzero_sign_trailone;
138
9.60M
    UWORD32 *pu4_zero_run;
139
140
9.60M
    pu4_zero_run = (void *) pu1_zero_run;
141
9.60M
    pu4_zero_run[0] = 0;
142
9.60M
    pu4_zero_run[1] = 0;
143
9.60M
    pu4_zero_run[2] = 0;
144
9.60M
    pu4_zero_run[3] = 0;
145
146
    /* Compute Runs of zeros for all nnz coefficients except the last 3 */
147
9.60M
    if(u4_total_coeff > 3)
148
4.45M
    {
149
37.4M
        for(i = 0; u4_nnz_coeff < (u4_total_coeff - 3); i++)
150
32.9M
        {
151
32.9M
            i4_run++;
152
153
32.9M
            i4_val = (u4_sig_coeff_map & 0x1);
154
32.9M
            u4_sig_coeff_map >>= 1;
155
156
32.9M
            if(i4_val != 0)
157
29.8M
            {
158
29.8M
                pu1_zero_run[u4_nnz_coeff++] = i4_run;
159
29.8M
                i4_run = -1;
160
29.8M
            }
161
32.9M
        }
162
4.45M
    }
163
164
    /* Compute T1's, Signof(T1's) and Runs of zeros for the last 3 */
165
51.4M
    while(u4_nnz_coeff != u4_total_coeff)
166
41.8M
    {
167
41.8M
        i4_run++;
168
169
41.8M
        i4_val = (u4_sig_coeff_map & 0x1);
170
41.8M
        u4_sig_coeff_map >>= 1;
171
172
41.8M
        if(i4_val != 0)
173
22.6M
        {
174
22.6M
            if(pi2_res_block[u4_nnz_coeff] == 1)
175
3.42M
            {
176
3.42M
                pu1_zero_run[u4_nnz_coeff] = i4_run;
177
3.42M
                u4_trailing1++;
178
3.42M
            }
179
19.2M
            else
180
19.2M
            {
181
19.2M
                if(pi2_res_block[u4_nnz_coeff] == -1)
182
4.26M
                {
183
4.26M
                    pu1_zero_run[u4_nnz_coeff] = i4_run;
184
4.26M
                    u4_sign |= 1 << u4_trailing1;
185
4.26M
                    u4_trailing1++;
186
4.26M
                }
187
14.9M
                else
188
14.9M
                {
189
14.9M
                    pu1_zero_run[u4_nnz_coeff] = i4_run;
190
14.9M
                    u4_trailing1 = 0;
191
14.9M
                    u4_sign = 0;
192
14.9M
                }
193
19.2M
            }
194
22.6M
            i4_run = -1;
195
22.6M
            u4_nnz_coeff++;
196
22.6M
        }
197
41.8M
        i++;
198
41.8M
    }
199
200
9.60M
    u4_tot_zero = i - u4_total_coeff;
201
9.60M
    u4_totzero_sign_trailone = (u4_tot_zero << 16) | (u4_sign << 8) | u4_trailing1;
202
203
9.60M
    return (u4_totzero_sign_trailone);
204
9.60M
}
205
206
/**
207
*******************************************************************************
208
*
209
* @brief
210
*  This function generates CAVLC coded bit stream for the given residual block
211
*
212
* @param[in] pi2_res_block
213
*  Pointer to residual block containing levels in scan order
214
*
215
* @param[in] u4_total_coeff
216
*  Total non-zero coefficients in the sub block
217
*
218
* @param[in] u4_block_type
219
*  block type
220
*
221
* @param[in] pu1_zero_run
222
*  Pointer to array to store run of zeros
223
*
224
* @param[in] u4_nc
225
*  average of non zero coeff from top and left blocks (when available)
226
*
227
* @param[in, out] ps_bit_stream
228
*  structure pointing to a buffer holding output bit stream
229
*
230
* @param[in] u4_sig_coeff_map
231
*  significant coefficient map of the residual block
232
*
233
* @returns
234
*  error code
235
*
236
* @remarks
237
*  If the block type is CAVLC_CHROMA_4x4_DC, then u4_nc is non-significant
238
*
239
*******************************************************************************
240
*/
241
static IH264E_ERROR_T isvce_write_coeff4x4_cavlc(WORD16 *pi2_res_block, UWORD32 u4_total_coeff,
242
                                                 ENTROPY_BLK_TYPE u4_block_type,
243
                                                 UWORD8 *pu1_zero_run, UWORD32 u4_nc,
244
                                                 bitstrm_t *ps_bit_stream, UWORD32 u4_sig_coeff_map)
245
14.9M
{
246
14.9M
    IH264E_ERROR_T error_status = IH264E_SUCCESS;
247
14.9M
    UWORD32 u4_totzero_sign_trailone = 0;
248
14.9M
    UWORD32 u4_trailing_ones = 0;
249
14.9M
    UWORD32 u4_tot_zeros = 0;
250
14.9M
    UWORD32 u4_remaining_coeff = 0;
251
14.9M
    UWORD32 u4_sign1 = 0;
252
14.9M
    UWORD32 u4_max_num_coeff = 0;
253
14.9M
    const UWORD32 au4_max_num_nnz_coeff[] = {16, 15, 16, 4, 15};
254
255
    /* validate inputs */
256
14.9M
    ASSERT(u4_block_type <= CAVLC_CHROMA_4x4_AC);
257
258
14.9M
    u4_max_num_coeff = au4_max_num_nnz_coeff[u4_block_type];
259
260
14.9M
    ASSERT(u4_total_coeff <= u4_max_num_coeff);
261
262
14.9M
    if(!u4_total_coeff)
263
5.38M
    {
264
5.38M
        UWORD32 u4_codeword = 15;
265
5.38M
        UWORD32 u4_codesize = 1;
266
5.38M
        if(u4_block_type == CAVLC_CHROMA_4x4_DC)
267
125k
        {
268
125k
            u4_codeword = 1;
269
125k
            u4_codesize = 2;
270
125k
            DEBUG("\n[%d numcoeff, %d numtrailing ones]", u4_total_coeff, 0);
271
125k
            ENTROPY_TRACE("\tnumber of non zero coeffs ", u4_total_coeff);
272
125k
            ENTROPY_TRACE("\tnumber of trailing ones ", 0);
273
125k
        }
274
5.25M
        else
275
5.25M
        {
276
5.25M
            UWORD32 u4_vlcnum = u4_nc >> 1;
277
278
            /* write coeff_token */
279
5.25M
            if(u4_vlcnum > 3)
280
197k
            {
281
                /* Num-FLC */
282
197k
                u4_codeword = 3;
283
197k
                u4_codesize = 6;
284
197k
            }
285
5.06M
            else
286
5.06M
            {
287
                /* Num-VLC 0, 1, 2 */
288
5.06M
                if(u4_vlcnum > 1)
289
196k
                {
290
196k
                    u4_vlcnum = 2;
291
196k
                }
292
5.06M
                u4_codesize <<= u4_vlcnum;
293
5.06M
                u4_codeword >>= (4 - u4_codesize);
294
5.06M
            }
295
296
5.25M
            DEBUG("\n[%d numcoeff, %d numtrailing ones, %d nnz]", u4_total_coeff, 0, u4_nc);
297
5.25M
            ENTROPY_TRACE("\tnumber of non zero coeffs ", u4_total_coeff);
298
5.25M
            ENTROPY_TRACE("\tnC ", u4_nc);
299
5.25M
        }
300
301
5.38M
        DEBUG("\nCOEFF TOKEN 0: %d u4_codeword, %d u4_codesize", u4_codeword, u4_codesize);
302
5.38M
        ENTROPY_TRACE("\tcodeword ", u4_codeword);
303
5.38M
        ENTROPY_TRACE("\tcodesize ", u4_codesize);
304
305
5.38M
        error_status = ih264e_put_bits(ps_bit_stream, u4_codeword, u4_codesize);
306
307
5.38M
        return error_status;
308
5.38M
    }
309
9.60M
    else
310
9.60M
    {
311
        /* Compute zero run, number of trailing ones and their sign. */
312
9.60M
        u4_totzero_sign_trailone = isvce_compute_zeroruns_and_trailingones(
313
9.60M
            pi2_res_block, u4_total_coeff, pu1_zero_run, u4_sig_coeff_map);
314
9.60M
        u4_trailing_ones = u4_totzero_sign_trailone & 0xFF;
315
9.60M
        u4_sign1 = (u4_totzero_sign_trailone >> 8) & 0xFF;
316
9.60M
        u4_tot_zeros = (u4_totzero_sign_trailone >> 16) & 0xFF;
317
9.60M
        u4_remaining_coeff = u4_total_coeff - u4_trailing_ones;
318
319
        /* write coeff_token */
320
9.60M
        {
321
9.60M
            UWORD32 u4_codeword;
322
9.60M
            UWORD32 u4_codesize;
323
9.60M
            if(u4_block_type == CAVLC_CHROMA_4x4_DC)
324
745k
            {
325
745k
                u4_codeword =
326
745k
                    gu1_code_coeff_token_table_chroma[u4_trailing_ones][u4_total_coeff - 1];
327
745k
                u4_codesize =
328
745k
                    gu1_size_coeff_token_table_chroma[u4_trailing_ones][u4_total_coeff - 1];
329
330
745k
                DEBUG("\n[%d numcoeff, %d numtrailing ones]", u4_total_coeff, u4_trailing_ones);
331
745k
                ENTROPY_TRACE("\tnumber of non zero coeffs ", u4_total_coeff);
332
745k
                ENTROPY_TRACE("\tnumber of trailing ones ", u4_trailing_ones);
333
745k
            }
334
8.86M
            else
335
8.86M
            {
336
8.86M
                UWORD32 u4_vlcnum = u4_nc >> 1;
337
338
8.86M
                if(u4_vlcnum > 3)
339
2.27M
                {
340
                    /* Num-FLC */
341
2.27M
                    u4_codeword = ((u4_total_coeff - 1) << 2) + u4_trailing_ones;
342
2.27M
                    u4_codesize = 6;
343
2.27M
                }
344
6.58M
                else
345
6.58M
                {
346
                    /* Num-VLC 0, 1, 2 */
347
6.58M
                    if(u4_vlcnum > 1)
348
1.32M
                    {
349
1.32M
                        u4_vlcnum = 2;
350
1.32M
                    }
351
6.58M
                    u4_codeword =
352
6.58M
                        gu1_code_coeff_token_table[u4_vlcnum][u4_trailing_ones][u4_total_coeff - 1];
353
6.58M
                    u4_codesize =
354
6.58M
                        gu1_size_coeff_token_table[u4_vlcnum][u4_trailing_ones][u4_total_coeff - 1];
355
6.58M
                }
356
357
8.86M
                DEBUG("\n[%d numcoeff, %d numtrailing ones, %d nnz]", u4_total_coeff,
358
8.86M
                      u4_trailing_ones, u4_nc);
359
8.86M
                ENTROPY_TRACE("\tnumber of non zero coeffs ", u4_total_coeff);
360
8.86M
                ENTROPY_TRACE("\tnumber of trailing ones ", u4_trailing_ones);
361
8.86M
                ENTROPY_TRACE("\tnC ", u4_nc);
362
8.86M
            }
363
364
9.60M
            DEBUG("\nCOEFF TOKEN 0: %d u4_codeword, %d u4_codesize", u4_codeword, u4_codesize);
365
9.60M
            ENTROPY_TRACE("\tcodeword ", u4_codeword);
366
9.60M
            ENTROPY_TRACE("\tcodesize ", u4_codesize);
367
368
9.60M
            error_status = ih264e_put_bits(ps_bit_stream, u4_codeword, u4_codesize);
369
9.60M
        }
370
371
        /* write sign of trailing ones */
372
9.60M
        if(u4_trailing_ones)
373
3.74M
        {
374
3.74M
            DEBUG("\nT1's: %d u4_codeword, %d u4_codesize", u4_sign1, u4_trailing_ones);
375
3.74M
            error_status = ih264e_put_bits(ps_bit_stream, u4_sign1, u4_trailing_ones);
376
3.74M
            ENTROPY_TRACE("\tnumber of trailing ones ", u4_trailing_ones);
377
3.74M
            ENTROPY_TRACE("\tsign of trailing ones ", u4_sign1);
378
3.74M
        }
379
380
        /* write level codes */
381
9.60M
        if(u4_remaining_coeff)
382
8.13M
        {
383
8.13M
            WORD32 i4_level = pi2_res_block[u4_remaining_coeff - 1];
384
8.13M
            UWORD32 u4_escape;
385
8.13M
            UWORD32 u4_suffix_length = 0;  // Level-VLC[N]
386
8.13M
            UWORD32 u4_abs_level, u4_abs_level_actual = 0;
387
8.13M
            WORD32 i4_sign;
388
8.13M
            const UWORD32 u4_rndfactor[] = {0, 0, 1, 3, 7, 15, 31};
389
390
8.13M
            DEBUG("\n \t%d coeff,", i4_level);
391
8.13M
            ENTROPY_TRACE("\tcoeff ", i4_level);
392
393
8.13M
            if(u4_trailing_ones < 3)
394
7.44M
            {
395
                /* If there are less than 3 T1s, then the first non-T1 level is
396
                 * incremented if negative (decremented if positive)*/
397
7.44M
                if(i4_level < 0)
398
3.88M
                {
399
3.88M
                    i4_level += 1;
400
3.88M
                }
401
3.55M
                else
402
3.55M
                {
403
3.55M
                    i4_level -= 1;
404
3.55M
                }
405
406
7.44M
                u4_abs_level_actual = 1;
407
408
                /* Initialize VLC table (Suffix Length) to encode the level */
409
7.44M
                if(u4_total_coeff > 10)
410
1.94M
                {
411
1.94M
                    u4_suffix_length = 1;
412
1.94M
                }
413
7.44M
            }
414
415
8.13M
            i4_sign = (i4_level >> (sizeof(WORD32) * CHAR_BIT - 1));
416
8.13M
            u4_abs_level = ((i4_level + i4_sign) ^ i4_sign);
417
418
8.13M
            u4_abs_level_actual += u4_abs_level;
419
420
8.13M
            u4_escape = (u4_abs_level + u4_rndfactor[u4_suffix_length]) >> u4_suffix_length;
421
422
45.9M
            while(1)
423
45.9M
            {
424
45.9M
                UWORD32 u4_codesize;
425
45.9M
                UWORD32 u4_codeword;
426
45.9M
                UWORD32 u4_codeval;
427
428
45.9M
                u4_remaining_coeff--;
429
430
45.9M
                GATHER_CAVLC_STATS1();
431
432
45.9M
                {
433
45.9M
                    u4_codeval = u4_abs_level << 1;
434
45.9M
                    u4_codeval = u4_codeval - 2 - i4_sign;
435
436
45.9M
                    if((!u4_suffix_length) && (u4_escape > 7) && (u4_abs_level < 16))
437
725k
                    {
438
725k
                        u4_codeword = (1 << 4) + (u4_codeval - 14);
439
725k
                        u4_codesize = 19;
440
725k
                    }
441
45.2M
                    else if(u4_escape > 7)
442
3.55M
                    {
443
3.55M
                        u4_codeword = (1 << 12) + (u4_codeval - (15 << u4_suffix_length));
444
3.55M
                        u4_codesize = 28;
445
3.55M
                        if(!u4_suffix_length)
446
1.40M
                        {
447
1.40M
                            u4_codeword -= 15;
448
1.40M
                        }
449
3.55M
                    }
450
41.7M
                    else
451
41.7M
                    {
452
41.7M
                        u4_codeword =
453
41.7M
                            (1 << u4_suffix_length) + (u4_codeval & ((1 << u4_suffix_length) - 1));
454
41.7M
                        u4_codesize = (u4_codeval >> u4_suffix_length) + 1 + u4_suffix_length;
455
41.7M
                    }
456
45.9M
                }
457
458
                /*put the level code in bitstream*/
459
45.9M
                DEBUG("\nLEVEL: %d u4_codeword, %d u4_codesize", u4_codeword, u4_codesize);
460
45.9M
                ENTROPY_TRACE("\tcodeword ", u4_codeword);
461
45.9M
                ENTROPY_TRACE("\tcodesize ", u4_codesize);
462
45.9M
                error_status = ih264e_put_bits(ps_bit_stream, u4_codeword, u4_codesize);
463
464
45.9M
                if(u4_remaining_coeff == 0) break;
465
466
                /*update suffix length for next level*/
467
37.8M
                if(u4_suffix_length == 0)
468
4.16M
                {
469
4.16M
                    u4_suffix_length++;
470
4.16M
                }
471
37.8M
                if(u4_suffix_length < 6)
472
35.2M
                {
473
35.2M
                    if(u4_abs_level_actual > gu1_threshold_vlc_level[u4_suffix_length])
474
10.6M
                    {
475
10.6M
                        u4_suffix_length++;
476
10.6M
                    }
477
35.2M
                }
478
479
                /* next level */
480
37.8M
                i4_level = pi2_res_block[u4_remaining_coeff - 1];
481
482
37.8M
                DEBUG("\n \t%d coeff,", i4_level);
483
37.8M
                ENTROPY_TRACE("\tcoeff ", i4_level);
484
485
37.8M
                i4_sign = (i4_level >> (sizeof(WORD32) * CHAR_BIT - 1));
486
37.8M
                u4_abs_level = ((i4_level + i4_sign) ^ i4_sign);
487
488
37.8M
                u4_abs_level_actual = u4_abs_level;
489
490
37.8M
                u4_escape = (u4_abs_level + u4_rndfactor[u4_suffix_length]) >> u4_suffix_length;
491
37.8M
            }
492
8.13M
        }
493
494
9.60M
        DEBUG("\n \t %d totalzeros", u4_tot_zeros);
495
9.60M
        ENTROPY_TRACE("\ttotal zeros ", u4_tot_zeros);
496
497
        /* Write Total Zeros */
498
9.60M
        if(u4_total_coeff < u4_max_num_coeff)
499
8.62M
        {
500
8.62M
            WORD32 index;
501
8.62M
            UWORD32 u4_codeword;
502
8.62M
            UWORD32 u4_codesize;
503
504
8.62M
            if(u4_block_type == CAVLC_CHROMA_4x4_DC)
505
574k
            {
506
574k
                UWORD8 gu1_index_zero_table_chroma[] = {0, 4, 7};
507
574k
                index = gu1_index_zero_table_chroma[u4_total_coeff - 1] + u4_tot_zeros;
508
574k
                u4_codesize = gu1_size_zero_table_chroma[index];
509
574k
                u4_codeword = gu1_code_zero_table_chroma[index];
510
574k
            }
511
8.04M
            else
512
8.04M
            {
513
8.04M
                index = gu1_index_zero_table[u4_total_coeff - 1] + u4_tot_zeros;
514
8.04M
                u4_codesize = gu1_size_zero_table[index];
515
8.04M
                u4_codeword = gu1_code_zero_table[index];
516
8.04M
            }
517
518
8.62M
            DEBUG("\nTOTAL ZEROS: %d u4_codeword, %d u4_codesize", u4_codeword, u4_codesize);
519
8.62M
            ENTROPY_TRACE("\tcodeword ", u4_codeword);
520
8.62M
            ENTROPY_TRACE("\tcodesize ", u4_codesize);
521
8.62M
            error_status = ih264e_put_bits(ps_bit_stream, u4_codeword, u4_codesize);
522
8.62M
        }
523
524
        /* Write Run Before */
525
9.60M
        if(u4_tot_zeros)
526
5.81M
        {
527
5.81M
            UWORD32 u4_max_num_coef = u4_total_coeff - 1;
528
5.81M
            UWORD32 u4_codeword;
529
5.81M
            UWORD32 u4_codesize;
530
5.81M
            UWORD32 u4_zeros_left = u4_tot_zeros;
531
532
20.4M
            while(u4_max_num_coef)
533
19.2M
            {
534
19.2M
                UWORD32 u4_run_before = pu1_zero_run[u4_max_num_coef];
535
19.2M
                UWORD32 u4_index;
536
537
19.2M
                if(u4_zeros_left > MAX_ZERO_LEFT)
538
680k
                {
539
680k
                    u4_index = gu1_index_run_table[MAX_ZERO_LEFT];
540
680k
                }
541
18.5M
                else
542
18.5M
                {
543
18.5M
                    u4_index = gu1_index_run_table[u4_zeros_left - 1];
544
18.5M
                }
545
546
19.2M
                u4_codesize = gu1_size_run_table[u4_index + u4_run_before];
547
19.2M
                u4_codeword = gu1_code_run_table[u4_index + u4_run_before];
548
549
19.2M
                DEBUG("\nRUN BEFORE ZEROS: %d u4_codeword, %d u4_codesize", u4_codeword,
550
19.2M
                      u4_codesize);
551
19.2M
                ENTROPY_TRACE("\tcodeword ", u4_codeword);
552
19.2M
                ENTROPY_TRACE("\tcodesize ", u4_codesize);
553
19.2M
                error_status = ih264e_put_bits(ps_bit_stream, u4_codeword, u4_codesize);
554
555
19.2M
                u4_zeros_left -= u4_run_before;
556
19.2M
                if(!u4_zeros_left)
557
4.61M
                {
558
4.61M
                    break;
559
4.61M
                }
560
14.5M
                u4_max_num_coef--;
561
14.5M
            }
562
5.81M
        }
563
9.60M
    }
564
565
9.60M
    return error_status;
566
14.9M
}
567
568
/**
569
*******************************************************************************
570
*
571
* @brief
572
*  This function generates CAVLC coded bit stream for the given subblock
573
*
574
* @param[in] ps_ent_ctxt
575
*  Pointer to entropy context
576
*
577
* @param[in] pi2_res_block
578
*  Pointers to residual blocks of all the partitions for the current subblk
579
*  (containing levels in scan order)
580
*
581
* @param[in] pu1_nnz
582
*  Total non-zero coefficients of all the partitions for the current subblk
583
*
584
* @param[in] pu2_sig_coeff_map
585
*  Significant coefficient map of all the partitions for the current subblk
586
*
587
* @param[in] u4_block_type
588
*  entropy coding block type
589
*
590
* @param[in] u4_ngbr_avbl
591
*  top and left availability of all the partitions for the current subblk
592
*  (packed)
593
*
594
* @param[in] pu1_top_nnz
595
*  pointer to the buffer containing nnz of all the subblks to the top
596
*
597
* @param[in] pu1_left_nnz
598
*  pointer to the buffer containing nnz of all the subblks to the left
599
*
600
* @returns error status
601
*
602
* @remarks none
603
*
604
*******************************************************************************
605
*/
606
static IH264E_ERROR_T isvce_write_coeff8x8_cavlc(isvce_entropy_ctxt_t *ps_ent_ctxt,
607
                                                 WORD16 **pi2_res_block, UWORD8 *pu1_nnz,
608
                                                 UWORD16 *pu2_sig_coeff_map,
609
                                                 ENTROPY_BLK_TYPE u4_block_type,
610
                                                 UWORD32 u4_ngbr_avlb, UWORD8 *pu1_top_nnz,
611
                                                 UWORD8 *pu1_left_nnz)
612
2.77M
{
613
2.77M
    IH264E_ERROR_T error_status = IH264E_SUCCESS;
614
2.77M
    bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm;
615
2.77M
    UWORD8 *pu1_zero_run = ps_ent_ctxt->au1_zero_run, *pu1_ngbr_avbl;
616
2.77M
    UWORD32 u4_nC;
617
2.77M
    UWORD8 u1_mb_a, u1_mb_b;
618
619
2.77M
    pu1_ngbr_avbl = (void *) (&u4_ngbr_avlb);
620
621
    /* encode ac block index 4x4 = 0*/
622
2.77M
    u1_mb_a = pu1_ngbr_avbl[0] & 0x0F;
623
2.77M
    u1_mb_b = pu1_ngbr_avbl[0] & 0xF0;
624
2.77M
    u4_nC = 0;
625
2.77M
    if(u1_mb_a) u4_nC += pu1_left_nnz[0];
626
2.77M
    if(u1_mb_b) u4_nC += pu1_top_nnz[0];
627
2.77M
    if(u1_mb_a && u1_mb_b) u4_nC = (u4_nC + 1) >> 1;
628
2.77M
    pu1_left_nnz[0] = pu1_top_nnz[0] = pu1_nnz[0];
629
2.77M
    error_status =
630
2.77M
        isvce_write_coeff4x4_cavlc(pi2_res_block[0], pu1_nnz[0], u4_block_type, pu1_zero_run, u4_nC,
631
2.77M
                                   ps_bitstream, pu2_sig_coeff_map[0]);
632
633
    /* encode ac block index 4x4 = 1*/
634
2.77M
    u1_mb_a = pu1_ngbr_avbl[1] & 0x0F;
635
2.77M
    u1_mb_b = pu1_ngbr_avbl[1] & 0xF0;
636
2.77M
    u4_nC = 0;
637
2.77M
    if(u1_mb_a) u4_nC += pu1_left_nnz[0];
638
2.77M
    if(u1_mb_b) u4_nC += pu1_top_nnz[1];
639
2.77M
    if(u1_mb_a && u1_mb_b) u4_nC = (u4_nC + 1) >> 1;
640
2.77M
    pu1_left_nnz[0] = pu1_top_nnz[1] = pu1_nnz[1];
641
2.77M
    error_status =
642
2.77M
        isvce_write_coeff4x4_cavlc(pi2_res_block[1], pu1_nnz[1], u4_block_type, pu1_zero_run, u4_nC,
643
2.77M
                                   ps_bitstream, pu2_sig_coeff_map[1]);
644
645
    /* encode ac block index 4x4 = 2*/
646
2.77M
    u1_mb_a = pu1_ngbr_avbl[2] & 0x0F;
647
2.77M
    u1_mb_b = pu1_ngbr_avbl[2] & 0xF0;
648
2.77M
    u4_nC = 0;
649
2.77M
    if(u1_mb_a) u4_nC += pu1_left_nnz[1];
650
2.77M
    if(u1_mb_b) u4_nC += pu1_top_nnz[0];
651
2.77M
    if(u1_mb_a && u1_mb_b) u4_nC = (u4_nC + 1) >> 1;
652
2.77M
    pu1_left_nnz[1] = pu1_top_nnz[0] = pu1_nnz[2];
653
2.77M
    error_status =
654
2.77M
        isvce_write_coeff4x4_cavlc(pi2_res_block[2], pu1_nnz[2], u4_block_type, pu1_zero_run, u4_nC,
655
2.77M
                                   ps_bitstream, pu2_sig_coeff_map[2]);
656
657
    /* encode ac block index 4x4 = 0*/
658
2.77M
    u1_mb_a = pu1_ngbr_avbl[3] & 0x0F;
659
2.77M
    u1_mb_b = pu1_ngbr_avbl[3] & 0xF0;
660
2.77M
    u4_nC = 0;
661
2.77M
    if(u1_mb_a) u4_nC += pu1_left_nnz[1];
662
2.77M
    if(u1_mb_b) u4_nC += pu1_top_nnz[1];
663
2.77M
    if(u1_mb_a && u1_mb_b) u4_nC = (u4_nC + 1) >> 1;
664
2.77M
    pu1_left_nnz[1] = pu1_top_nnz[1] = pu1_nnz[3];
665
2.77M
    error_status =
666
2.77M
        isvce_write_coeff4x4_cavlc(pi2_res_block[3], pu1_nnz[3], u4_block_type, pu1_zero_run, u4_nC,
667
2.77M
                                   ps_bitstream, pu2_sig_coeff_map[3]);
668
669
2.77M
    return error_status;
670
2.77M
}
671
672
/**
673
*******************************************************************************
674
*
675
* @brief
676
*  This function encodes luma and chroma residues of a macro block when
677
*  the entropy coding mode chosen is cavlc.
678
*
679
* @param[in] ps_ent_ctxt
680
*  Pointer to entropy context
681
*
682
* @param[in] u4_mb_type
683
*  current mb type
684
*
685
* @param[in] u4_cbp
686
*  coded block pattern for the current mb
687
*
688
* @returns error code
689
*
690
* @remarks none
691
*
692
*******************************************************************************
693
*/
694
static IH264E_ERROR_T isvce_encode_residue(isvce_entropy_ctxt_t *ps_ent_ctxt, UWORD32 u4_mb_type,
695
                                           UWORD32 u4_cbp)
696
4.80M
{
697
    /* error status */
698
4.80M
    IH264E_ERROR_T error_status = IH264E_SUCCESS;
699
700
    /* packed residue */
701
4.80M
    void *pv_mb_coeff_data = ps_ent_ctxt->pv_mb_coeff_data;
702
703
    /* bit stream buffer */
704
4.80M
    bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm;
705
706
    /* zero run */
707
4.80M
    UWORD8 *pu1_zero_run = ps_ent_ctxt->au1_zero_run;
708
709
    /* temp var */
710
4.80M
    UWORD32 u4_nC, u4_ngbr_avlb;
711
4.80M
    UWORD8 au1_nnz[4], *pu1_ngbr_avlb, *pu1_top_nnz, *pu1_left_nnz;
712
4.80M
    UWORD16 au2_sig_coeff_map[4] = {0};
713
4.80M
    WORD16 *pi2_res_block[4] = {NULL};
714
4.80M
    UWORD8 *pu1_slice_idx = ps_ent_ctxt->pu1_slice_idx;
715
4.80M
    tu_sblk_coeff_data_t *ps_mb_coeff_data;
716
4.80M
    ENTROPY_BLK_TYPE e_entropy_blk_type = CAVLC_LUMA_4x4;
717
718
    /* ngbr availability */
719
4.80M
    UWORD8 u1_mb_a, u1_mb_b;
720
721
    /* cbp */
722
4.80M
    UWORD32 u4_cbp_luma = u4_cbp & 0xF, u4_cbp_chroma = u4_cbp >> 4;
723
724
    /* mb indices */
725
4.80M
    WORD32 i4_mb_x, i4_mb_y;
726
727
    /* derive neighbor availability */
728
4.80M
    i4_mb_x = ps_ent_ctxt->i4_mb_x;
729
4.80M
    i4_mb_y = ps_ent_ctxt->i4_mb_y;
730
4.80M
    pu1_slice_idx += (i4_mb_y * ps_ent_ctxt->i4_wd_mbs);
731
    /* left macroblock availability */
732
4.80M
    u1_mb_a = (i4_mb_x == 0 || (pu1_slice_idx[i4_mb_x - 1] != pu1_slice_idx[i4_mb_x])) ? 0 : 1;
733
    /* top macroblock availability */
734
4.80M
    u1_mb_b = (i4_mb_y == 0 ||
735
4.80M
               (pu1_slice_idx[i4_mb_x - ps_ent_ctxt->i4_wd_mbs] != pu1_slice_idx[i4_mb_x]))
736
4.80M
                  ? 0
737
4.80M
                  : 1;
738
739
4.80M
    pu1_ngbr_avlb = (void *) (&u4_ngbr_avlb);
740
4.80M
    pu1_top_nnz = ps_ent_ctxt->pu1_top_nnz_luma[ps_ent_ctxt->i4_mb_x];
741
4.80M
    pu1_left_nnz = (UWORD8 *) &ps_ent_ctxt->u4_left_nnz_luma;
742
743
    /* encode luma residue */
744
745
    /* mb type intra 16x16 */
746
4.80M
    if(u4_mb_type == I16x16)
747
3.01M
    {
748
        /* parse packed coeff data structure for residual data */
749
3.01M
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
750
3.01M
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
751
        /* estimate nnz for the current mb */
752
3.01M
        u4_nC = 0;
753
3.01M
        if(u1_mb_a) u4_nC += pu1_left_nnz[0];
754
3.01M
        if(u1_mb_b) u4_nC += pu1_top_nnz[0];
755
3.01M
        if(u1_mb_a && u1_mb_b) u4_nC = (u4_nC + 1) >> 1;
756
757
        /* encode dc block */
758
3.01M
        ENTROPY_TRACE("Luma DC blk idx %d", 0);
759
3.01M
        error_status =
760
3.01M
            isvce_write_coeff4x4_cavlc(pi2_res_block[0], au1_nnz[0], CAVLC_LUMA_4x4_DC,
761
3.01M
                                       pu1_zero_run, u4_nC, ps_bitstream, au2_sig_coeff_map[0]);
762
763
3.01M
        e_entropy_blk_type = CAVLC_LUMA_4x4_AC;
764
3.01M
    }
765
766
4.80M
    if(u4_cbp_luma & 1)
767
541k
    {
768
        /* encode ac block index 8x8 = 0*/
769
        /* parse packed coeff data structure for residual data */
770
541k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
771
541k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
772
541k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
773
541k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
774
541k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[2],
775
541k
                                   au2_sig_coeff_map[2], pi2_res_block[2]);
776
541k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[3],
777
541k
                                   au2_sig_coeff_map[3], pi2_res_block[3]);
778
        /* derive sub block neighbor availability */
779
780
541k
        pu1_ngbr_avlb[0] = (u1_mb_b << 4) | (u1_mb_a);
781
541k
        pu1_ngbr_avlb[1] = (u1_mb_b << 4) | 1;
782
541k
        pu1_ngbr_avlb[2] = (1 << 4) | (u1_mb_a);
783
541k
        pu1_ngbr_avlb[3] = 0x11;
784
        /* encode sub blk */
785
541k
        ENTROPY_TRACE("Luma blk idx %d", 0);
786
541k
        error_status =
787
541k
            isvce_write_coeff8x8_cavlc(ps_ent_ctxt, pi2_res_block, au1_nnz, au2_sig_coeff_map,
788
541k
                                       e_entropy_blk_type, u4_ngbr_avlb, pu1_top_nnz, pu1_left_nnz);
789
541k
    }
790
4.26M
    else
791
4.26M
    {
792
4.26M
        pu1_top_nnz[0] = pu1_top_nnz[1] = 0;
793
4.26M
        pu1_left_nnz[0] = pu1_left_nnz[1] = 0;
794
4.26M
    }
795
796
4.80M
    if(u4_cbp_luma & 2)
797
528k
    {
798
        /* encode ac block index 8x8 = 1*/
799
        /* parse packed coeff data structure for residual data */
800
528k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
801
528k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
802
528k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
803
528k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
804
528k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[2],
805
528k
                                   au2_sig_coeff_map[2], pi2_res_block[2]);
806
528k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[3],
807
528k
                                   au2_sig_coeff_map[3], pi2_res_block[3]);
808
809
        /* derive sub block neighbor availability */
810
528k
        pu1_ngbr_avlb[1] = pu1_ngbr_avlb[0] = (u1_mb_b << 4) | 1;
811
528k
        pu1_ngbr_avlb[3] = pu1_ngbr_avlb[2] = 0x11;
812
        /* encode sub blk */
813
528k
        ENTROPY_TRACE("Luma blk idx %d", 1);
814
528k
        error_status = isvce_write_coeff8x8_cavlc(ps_ent_ctxt, pi2_res_block, au1_nnz,
815
528k
                                                  au2_sig_coeff_map, e_entropy_blk_type,
816
528k
                                                  u4_ngbr_avlb, pu1_top_nnz + 2, pu1_left_nnz);
817
528k
    }
818
4.27M
    else
819
4.27M
    {
820
4.27M
        (pu1_top_nnz + 2)[0] = (pu1_top_nnz + 2)[1] = 0;
821
4.27M
        pu1_left_nnz[0] = pu1_left_nnz[1] = 0;
822
4.27M
    }
823
824
4.80M
    if(u4_cbp_luma & 0x4)
825
501k
    {
826
        /* encode ac block index 8x8 = 2*/
827
        /* parse packed coeff data structure for residual data */
828
501k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
829
501k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
830
501k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
831
501k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
832
501k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[2],
833
501k
                                   au2_sig_coeff_map[2], pi2_res_block[2]);
834
501k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[3],
835
501k
                                   au2_sig_coeff_map[3], pi2_res_block[3]);
836
837
        /* derive sub block neighbor availability */
838
501k
        pu1_ngbr_avlb[2] = pu1_ngbr_avlb[0] = (1 << 4) | u1_mb_a;
839
501k
        pu1_ngbr_avlb[1] = pu1_ngbr_avlb[3] = 0x11;
840
        /* encode sub blk */
841
501k
        ENTROPY_TRACE("Luma blk idx %d", 2);
842
501k
        error_status = isvce_write_coeff8x8_cavlc(ps_ent_ctxt, pi2_res_block, au1_nnz,
843
501k
                                                  au2_sig_coeff_map, e_entropy_blk_type,
844
501k
                                                  u4_ngbr_avlb, pu1_top_nnz, (pu1_left_nnz + 2));
845
501k
    }
846
4.30M
    else
847
4.30M
    {
848
4.30M
        pu1_top_nnz[0] = pu1_top_nnz[1] = 0;
849
4.30M
        (pu1_left_nnz + 2)[0] = (pu1_left_nnz + 2)[1] = 0;
850
4.30M
    }
851
852
4.80M
    if(u4_cbp_luma & 0x8)
853
496k
    {
854
        /* encode ac block index 8x8 = 3*/
855
        /* parse packed coeff data structure for residual data */
856
496k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
857
496k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
858
496k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
859
496k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
860
496k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[2],
861
496k
                                   au2_sig_coeff_map[2], pi2_res_block[2]);
862
496k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[3],
863
496k
                                   au2_sig_coeff_map[3], pi2_res_block[3]);
864
865
        /* derive sub block neighbor availability */
866
496k
        u4_ngbr_avlb = 0x11111111;
867
        /* encode sub blk */
868
496k
        ENTROPY_TRACE("Luma blk idx %d", 3);
869
496k
        error_status = isvce_write_coeff8x8_cavlc(ps_ent_ctxt, pi2_res_block, au1_nnz,
870
496k
                                                  au2_sig_coeff_map, e_entropy_blk_type,
871
496k
                                                  u4_ngbr_avlb, pu1_top_nnz + 2, pu1_left_nnz + 2);
872
496k
    }
873
4.30M
    else
874
4.30M
    {
875
4.30M
        (pu1_top_nnz + 2)[0] = (pu1_top_nnz + 2)[1] = 0;
876
4.30M
        (pu1_left_nnz + 2)[0] = (pu1_left_nnz + 2)[1] = 0;
877
4.30M
    }
878
879
    /* encode chroma residue */
880
4.80M
    if(u4_cbp_chroma & 3)
881
435k
    {
882
        /* parse packed coeff data structure for residual data */
883
        /* cb, cr */
884
435k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
885
435k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
886
435k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
887
435k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
888
889
        /* encode dc block */
890
        /* cb, cr */
891
435k
        ENTROPY_TRACE("Chroma DC blk idx %d", 0);
892
435k
        error_status =
893
435k
            isvce_write_coeff4x4_cavlc(pi2_res_block[0], au1_nnz[0], CAVLC_CHROMA_4x4_DC,
894
435k
                                       pu1_zero_run, 0, ps_bitstream, au2_sig_coeff_map[0]);
895
435k
        ENTROPY_TRACE("Chroma DC blk idx %d", 1);
896
435k
        error_status =
897
435k
            isvce_write_coeff4x4_cavlc(pi2_res_block[1], au1_nnz[1], CAVLC_CHROMA_4x4_DC,
898
435k
                                       pu1_zero_run, 0, ps_bitstream, au2_sig_coeff_map[1]);
899
435k
    }
900
901
4.80M
    pu1_top_nnz = ps_ent_ctxt->pu1_top_nnz_cbcr[ps_ent_ctxt->i4_mb_x];
902
4.80M
    pu1_left_nnz = (UWORD8 *) &ps_ent_ctxt->u4_left_nnz_cbcr;
903
904
    /* encode sub blk */
905
4.80M
    if(u4_cbp_chroma & 0x2)
906
354k
    {
907
        /* encode ac block index 8x8 = 0*/
908
        /* derive sub block neighbor availability */
909
354k
        pu1_ngbr_avlb[0] = (u1_mb_b << 4) | (u1_mb_a);
910
354k
        pu1_ngbr_avlb[1] = (u1_mb_b << 4) | 1;
911
354k
        pu1_ngbr_avlb[2] = (1 << 4) | (u1_mb_a);
912
354k
        pu1_ngbr_avlb[3] = 0x11;
913
914
        /* parse packed coeff data structure for residual data */
915
354k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
916
354k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
917
354k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
918
354k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
919
354k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[2],
920
354k
                                   au2_sig_coeff_map[2], pi2_res_block[2]);
921
354k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[3],
922
354k
                                   au2_sig_coeff_map[3], pi2_res_block[3]);
923
924
354k
        ENTROPY_TRACE("Chroma AC blk idx %d", 0);
925
354k
        error_status = isvce_write_coeff8x8_cavlc(ps_ent_ctxt, pi2_res_block, au1_nnz,
926
354k
                                                  au2_sig_coeff_map, CAVLC_CHROMA_4x4_AC,
927
354k
                                                  u4_ngbr_avlb, pu1_top_nnz, pu1_left_nnz);
928
354k
    }
929
4.44M
    else
930
4.44M
    {
931
4.44M
        pu1_top_nnz[0] = pu1_top_nnz[1] = 0;
932
4.44M
        pu1_left_nnz[0] = pu1_left_nnz[1] = 0;
933
4.44M
    }
934
935
4.80M
    pu1_top_nnz += 2;
936
4.80M
    pu1_left_nnz += 2;
937
938
    /* encode sub blk */
939
4.80M
    if(u4_cbp_chroma & 0x2)
940
354k
    {
941
        /* parse packed coeff data structure for residual data */
942
354k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
943
354k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
944
354k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
945
354k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
946
354k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[2],
947
354k
                                   au2_sig_coeff_map[2], pi2_res_block[2]);
948
354k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[3],
949
354k
                                   au2_sig_coeff_map[3], pi2_res_block[3]);
950
951
354k
        ENTROPY_TRACE("Chroma AC blk idx %d", 1);
952
354k
        error_status = isvce_write_coeff8x8_cavlc(ps_ent_ctxt, pi2_res_block, au1_nnz,
953
354k
                                                  au2_sig_coeff_map, CAVLC_CHROMA_4x4_AC,
954
354k
                                                  u4_ngbr_avlb, pu1_top_nnz, pu1_left_nnz);
955
354k
    }
956
4.44M
    else
957
4.44M
    {
958
4.44M
        pu1_top_nnz[0] = pu1_top_nnz[1] = 0;
959
4.44M
        pu1_left_nnz[0] = pu1_left_nnz[1] = 0;
960
4.44M
    }
961
962
    /* store the index of the next mb coeff data */
963
4.80M
    ps_ent_ctxt->pv_mb_coeff_data = pv_mb_coeff_data;
964
965
4.80M
    return error_status;
966
4.80M
}
967
968
/**
969
*******************************************************************************
970
*
971
* @brief
972
*  This function generates CAVLC coded bit stream for an Intra Slice.
973
*
974
* @description
975
*  The mb syntax layer for intra slices constitutes luma mb mode, luma sub modes
976
*  (if present), mb qp delta, coded block pattern, chroma mb mode and
977
*  luma/chroma residue. These syntax elements are written as directed by table
978
*  7.3.5 of h264 specification.
979
*
980
* @param[in] ps_ent_ctxt
981
*  pointer to entropy context
982
*
983
* @returns error code
984
*
985
* @remarks none
986
*
987
*******************************************************************************
988
*/
989
IH264E_ERROR_T isvce_write_islice_mb_cavlc(isvce_entropy_ctxt_t *ps_ent_ctxt)
990
4.21M
{
991
    /* error status */
992
4.21M
    IH264E_ERROR_T error_status = IH264E_SUCCESS;
993
994
    /* bit stream ptr */
995
4.21M
    bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm;
996
997
    /* packed header data */
998
4.21M
    UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
999
4.21M
    isvce_mb_hdr_common_t *ps_mb_hdr = (isvce_mb_hdr_common_t *) ps_ent_ctxt->pv_mb_header_data;
1000
1001
    /* mb header info */
1002
    /*
1003
     * mb_tpm : mb type plus mode
1004
     * mb_type : luma mb type and chroma mb type are packed
1005
     * cbp : coded block pattern
1006
     * mb_qp_delta : mb qp delta
1007
     * chroma_intra_mode : chroma intra mode
1008
     * luma_intra_mode : luma intra mode
1009
     */
1010
4.21M
    WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode;
1011
4.21M
    WORD8 mb_qp_delta;
1012
1013
    /* temp var */
1014
4.21M
    WORD32 i, mb_type_stream;
1015
1016
4.21M
    WORD32 bitstream_start_offset, bitstream_end_offset;
1017
1018
4.21M
    svc_slice_header_t *ps_svc_slice_header =
1019
4.21M
        ps_ent_ctxt->ps_svc_slice_hdr_base +
1020
4.21M
        (ps_ent_ctxt->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT);
1021
1022
    /* Starting bitstream offset for header in bits */
1023
4.21M
    bitstream_start_offset = isvce_get_num_bits(ps_bitstream);
1024
1025
    /********************************************************************/
1026
    /*                    BEGIN HEADER GENERATION                       */
1027
    /********************************************************************/
1028
1029
4.21M
    if(ps_ent_ctxt->u1_spatial_layer_id && ps_svc_slice_header->i1_adaptive_base_mode_flag)
1030
2.77M
    {
1031
        /* write base_mode_flag */
1032
2.77M
        PUT_BITS(ps_bitstream, ps_mb_hdr->u1_base_mode_flag, 1, error_status, "base_mode_flag");
1033
2.77M
    }
1034
1.43M
    else
1035
1.43M
    {
1036
1.43M
        ps_mb_hdr->u1_base_mode_flag = 0;
1037
1.43M
    }
1038
1039
    /* mb header info */
1040
4.21M
    mb_tpm = ps_mb_hdr->u1_mb_type_mode;
1041
4.21M
    cbp = ps_mb_hdr->u1_cbp;
1042
4.21M
    mb_qp_delta =
1043
4.21M
        ((WORD16) ps_mb_hdr->u1_mb_qp) - ((WORD16) ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp);
1044
1045
    /* mb type */
1046
4.21M
    mb_type = mb_tpm & 0xF;
1047
    /* is intra ? */
1048
4.21M
    if(!ps_mb_hdr->u1_base_mode_flag)
1049
3.17M
    {
1050
3.17M
        if(mb_type == I16x16)
1051
2.85M
        {
1052
2.85M
            UWORD32 u4_cbp_l, u4_cbp_c;
1053
1054
2.85M
            u4_cbp_c = (cbp >> 4);
1055
2.85M
            u4_cbp_l = (cbp & 0xF);
1056
2.85M
            luma_intra_mode = (mb_tpm >> 4) & 3;
1057
2.85M
            chroma_intra_mode = (mb_tpm >> 6);
1058
1059
2.85M
            mb_type_stream = luma_intra_mode + 1 + (u4_cbp_c << 2) + (u4_cbp_l == 15) * 12;
1060
1061
            /* write mb type */
1062
2.85M
            PUT_BITS_UEV(ps_bitstream, mb_type_stream, error_status, "mb type");
1063
1064
            /* intra_chroma_pred_mode */
1065
2.85M
            PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
1066
1067
2.85M
            pu1_byte += sizeof(isvce_mb_hdr_i16x16_t);
1068
2.85M
        }
1069
319k
        else if(mb_type == I4x4)
1070
319k
        {
1071
319k
            isvce_mb_hdr_i4x4_t *ps_mb_hdr_i4x4 =
1072
319k
                (isvce_mb_hdr_i4x4_t *) ps_ent_ctxt->pv_mb_header_data;
1073
1074
            /* mb sub blk modes */
1075
319k
            WORD32 intra_pred_mode_flag, rem_intra_mode;
1076
319k
            WORD32 byte;
1077
1078
319k
            chroma_intra_mode = (mb_tpm >> 6);
1079
1080
            /* write mb type */
1081
319k
            PUT_BITS_UEV(ps_bitstream, 0, error_status, "mb type");
1082
1083
2.87M
            for(i = 0; i < 16; i += 2)
1084
2.55M
            {
1085
                /* sub blk idx 1 */
1086
2.55M
                byte = ps_mb_hdr_i4x4->au1_sub_blk_modes[i >> 1];
1087
1088
2.55M
                intra_pred_mode_flag = byte & 0x1;
1089
1090
                /* prev_intra4x4_pred_mode_flag */
1091
2.55M
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1092
2.55M
                         "prev_intra4x4_pred_mode_flag");
1093
1094
                /* rem_intra4x4_pred_mode */
1095
2.55M
                if(!intra_pred_mode_flag)
1096
444k
                {
1097
444k
                    rem_intra_mode = (byte & 0xF) >> 1;
1098
444k
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1099
444k
                             "rem_intra4x4_pred_mode");
1100
444k
                }
1101
1102
                /* sub blk idx 2 */
1103
2.55M
                byte >>= 4;
1104
1105
2.55M
                intra_pred_mode_flag = byte & 0x1;
1106
1107
                /* prev_intra4x4_pred_mode_flag */
1108
2.55M
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1109
2.55M
                         "prev_intra4x4_pred_mode_flag");
1110
1111
                /* rem_intra4x4_pred_mode */
1112
2.55M
                if(!intra_pred_mode_flag)
1113
435k
                {
1114
435k
                    rem_intra_mode = (byte & 0xF) >> 1;
1115
435k
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1116
435k
                             "rem_intra4x4_pred_mode");
1117
435k
                }
1118
2.55M
            }
1119
1120
            /* intra_chroma_pred_mode */
1121
319k
            PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
1122
1123
319k
            pu1_byte += sizeof(isvce_mb_hdr_i4x4_t);
1124
319k
        }
1125
0
        else if(mb_type == I8x8)
1126
0
        {
1127
            /* transform 8x8 flag */
1128
0
            UWORD32 u4_transform_size_8x8_flag = ps_ent_ctxt->i1_transform_8x8_mode_flag;
1129
0
            isvce_mb_hdr_i8x8_t *ps_mb_hdr_i8x8 =
1130
0
                (isvce_mb_hdr_i8x8_t *) ps_ent_ctxt->pv_mb_header_data;
1131
1132
            /* mb sub blk modes */
1133
0
            WORD32 intra_pred_mode_flag, rem_intra_mode;
1134
0
            WORD32 byte;
1135
1136
0
            chroma_intra_mode = (mb_tpm >> 6);
1137
1138
0
            ASSERT(0);
1139
1140
            /* write mb type */
1141
0
            PUT_BITS_UEV(ps_bitstream, 0, error_status, "mb type");
1142
1143
            /* u4_transform_size_8x8_flag */
1144
0
            PUT_BITS(ps_bitstream, u4_transform_size_8x8_flag, 1, error_status,
1145
0
                     "u4_transform_size_8x8_flag");
1146
1147
            /* write sub block modes */
1148
0
            for(i = 0; i < 4; i++)
1149
0
            {
1150
                /* sub blk idx 1 */
1151
0
                byte = ps_mb_hdr_i8x8->au1_sub_blk_modes[i >> 1];
1152
1153
0
                intra_pred_mode_flag = byte & 0x1;
1154
1155
                /* prev_intra4x4_pred_mode_flag */
1156
0
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1157
0
                         "prev_intra4x4_pred_mode_flag");
1158
1159
                /* rem_intra4x4_pred_mode */
1160
0
                if(!intra_pred_mode_flag)
1161
0
                {
1162
0
                    rem_intra_mode = (byte & 0xF) >> 1;
1163
0
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1164
0
                             "rem_intra4x4_pred_mode");
1165
0
                }
1166
1167
                /* sub blk idx 2 */
1168
0
                byte >>= 4;
1169
1170
0
                intra_pred_mode_flag = byte & 0x1;
1171
1172
                /* prev_intra4x4_pred_mode_flag */
1173
0
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1174
0
                         "prev_intra4x4_pred_mode_flag");
1175
1176
                /* rem_intra4x4_pred_mode */
1177
0
                if(!intra_pred_mode_flag)
1178
0
                {
1179
0
                    rem_intra_mode = (byte & 0xF) >> 1;
1180
0
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1181
0
                             "rem_intra4x4_pred_mode");
1182
0
                }
1183
0
            }
1184
1185
            /* intra_chroma_pred_mode */
1186
0
            PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
1187
1188
0
            pu1_byte += sizeof(isvce_mb_hdr_i8x8_t);
1189
0
        }
1190
3.17M
    }
1191
1.03M
    else
1192
1.03M
    {
1193
1.03M
        pu1_byte += sizeof(isvce_mb_hdr_base_mode_t);
1194
1.03M
    }
1195
1196
    /* coded_block_pattern */
1197
4.21M
    if(ps_mb_hdr->u1_base_mode_flag || mb_type != I16x16)
1198
1.35M
    {
1199
1.35M
        PUT_BITS_UEV(ps_bitstream, gu1_cbp_map_tables[cbp][ps_mb_hdr->u1_base_mode_flag],
1200
1.35M
                     error_status, "coded_block_pattern");
1201
1202
1.35M
        if(cbp % 16 > 0 && ps_ent_ctxt->i1_transform_8x8_mode_flag &&
1203
1.35M
           (ps_mb_hdr->u1_base_mode_flag || (mb_type == I8x8 || mb_type == I4x4)))
1204
0
        {
1205
0
            PUT_BITS(ps_bitstream, ps_ent_ctxt->i1_transform_8x8_mode_flag, 1, error_status,
1206
0
                     "u4_transform_size_8x8_flag");
1207
0
        }
1208
1.35M
    }
1209
1210
4.21M
    if((cbp > 0) || (mb_type == I16x16))
1211
3.08M
    {
1212
        /* mb_qp_delta */
1213
3.08M
        PUT_BITS_SEV(ps_bitstream, mb_qp_delta, error_status, "mb_qp_delta");
1214
3.08M
        ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp = ps_mb_hdr->u1_mb_qp;
1215
3.08M
    }
1216
1217
    /* Ending bitstream offset for header in bits */
1218
4.21M
    bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1219
1220
4.21M
    ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset - bitstream_start_offset;
1221
1222
    /* Starting bitstream offset for residue */
1223
4.21M
    bitstream_start_offset = bitstream_end_offset;
1224
1225
    /* residual */
1226
4.21M
    error_status = isvce_encode_residue(ps_ent_ctxt, mb_type, cbp);
1227
1228
    /* Ending bitstream offset for reside in bits */
1229
4.21M
    bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1230
4.21M
    ps_ent_ctxt->u4_residue_bits[0] += bitstream_end_offset - bitstream_start_offset;
1231
1232
    /* store the index of the next mb syntax layer */
1233
4.21M
    ps_ent_ctxt->pv_mb_header_data = pu1_byte;
1234
1235
4.21M
    return error_status;
1236
4.21M
}
1237
1238
/**
1239
*******************************************************************************
1240
*
1241
* @brief
1242
*  This function generates CAVLC coded bit stream for Inter slices
1243
*
1244
* @description
1245
*  The mb syntax layer for inter slices constitutes luma mb mode, luma sub modes
1246
*  (if present), mb qp delta, coded block pattern, chroma mb mode and
1247
*  luma/chroma residue. These syntax elements are written as directed by table
1248
*  7.3.5 of h264 specification
1249
*
1250
* @param[in] ps_ent_ctxt
1251
*  pointer to entropy context
1252
*
1253
* @returns error code
1254
*
1255
* @remarks none
1256
*
1257
*******************************************************************************
1258
*/
1259
IH264E_ERROR_T isvce_write_pslice_mb_cavlc(isvce_entropy_ctxt_t *ps_ent_ctxt)
1260
589k
{
1261
    /* mb header info */
1262
    /*
1263
     * mb_tpm : mb type plus mode
1264
     * mb_type : luma mb type and chroma mb type are packed
1265
     * cbp : coded block pattern
1266
     * mb_qp_delta : mb qp delta
1267
     * chroma_intra_mode : chroma intra mode
1268
     * luma_intra_mode : luma intra mode
1269
     * ps_pu :  Pointer to the array of structures having motion vectors, size
1270
     * and position of sub partitions
1271
     */
1272
589k
    WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode;
1273
589k
    WORD8 mb_qp_delta;
1274
589k
    WORD32 i, mb_type_stream;
1275
589k
    WORD32 bitstream_start_offset, bitstream_end_offset;
1276
589k
    UWORD8 u1_is_intra_mb;
1277
1278
589k
    bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm;
1279
589k
    isvce_mb_hdr_common_t *ps_mb_hdr = (isvce_mb_hdr_common_t *) ps_ent_ctxt->pv_mb_header_data;
1280
589k
    svc_slice_header_t *ps_svc_slice_header =
1281
589k
        ps_ent_ctxt->ps_svc_slice_hdr_base +
1282
589k
        (ps_ent_ctxt->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT);
1283
1284
589k
    IH264E_ERROR_T error_status = IH264E_SUCCESS;
1285
1286
589k
    UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
1287
589k
    WORD32 cbptable = 1;
1288
589k
    WORD32 is_inter = 0;
1289
1290
    /* Starting bitstream offset for header in bits */
1291
589k
    bitstream_start_offset = isvce_get_num_bits(ps_bitstream);
1292
1293
    /********************************************************************/
1294
    /*                    BEGIN HEADER GENERATION                       */
1295
    /********************************************************************/
1296
1297
    /* mb header info */
1298
589k
    mb_tpm = ps_mb_hdr->u1_mb_type_mode;
1299
1300
    /* mb type */
1301
589k
    mb_type = mb_tpm & 0xF;
1302
589k
    u1_is_intra_mb = (mb_type == I16x16) || (mb_type == I8x8) || (mb_type == I4x4);
1303
1304
    /* check for skip */
1305
589k
    if(mb_type == PSKIP)
1306
133k
    {
1307
133k
        UWORD32 *nnz;
1308
1309
133k
        is_inter = 1;
1310
1311
        /* increment skip counter */
1312
133k
        (*ps_ent_ctxt->pi4_mb_skip_run)++;
1313
1314
        /* store the index of the next mb syntax layer */
1315
133k
        pu1_byte += sizeof(isvce_mb_hdr_pskip_t);
1316
133k
        ps_ent_ctxt->pv_mb_header_data = pu1_byte;
1317
1318
        /* set nnz to zero */
1319
133k
        ps_ent_ctxt->u4_left_nnz_luma = 0;
1320
133k
        nnz = (UWORD32 *) ps_ent_ctxt->pu1_top_nnz_luma[ps_ent_ctxt->i4_mb_x];
1321
133k
        *nnz = 0;
1322
133k
        ps_ent_ctxt->u4_left_nnz_cbcr = 0;
1323
133k
        nnz = (UWORD32 *) ps_ent_ctxt->pu1_top_nnz_cbcr[ps_ent_ctxt->i4_mb_x];
1324
133k
        *nnz = 0;
1325
1326
        /* residual */
1327
133k
        error_status = isvce_encode_residue(ps_ent_ctxt, P16x16, 0);
1328
1329
133k
        bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1330
1331
133k
        ps_ent_ctxt->u4_header_bits[is_inter] += bitstream_end_offset - bitstream_start_offset;
1332
1333
133k
        return error_status;
1334
133k
    }
1335
1336
    /* remaining mb header info */
1337
456k
    cbp = ps_mb_hdr->u1_cbp;
1338
456k
    mb_qp_delta =
1339
456k
        ((WORD16) ps_mb_hdr->u1_mb_qp) - ((WORD16) ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp);
1340
1341
    /* mb skip run */
1342
456k
    PUT_BITS_UEV(ps_bitstream, *ps_ent_ctxt->pi4_mb_skip_run, error_status, "mb skip run");
1343
1344
    /* reset skip counter */
1345
456k
    *ps_ent_ctxt->pi4_mb_skip_run = 0;
1346
1347
456k
    if(ps_ent_ctxt->u1_spatial_layer_id && ps_svc_slice_header->i1_adaptive_base_mode_flag)
1348
294k
    {
1349
        /* write base_mode_flag */
1350
294k
        PUT_BITS(ps_bitstream, ps_mb_hdr->u1_base_mode_flag, 1, error_status, "base_mode_flag");
1351
294k
    }
1352
161k
    else
1353
161k
    {
1354
161k
        ps_mb_hdr->u1_base_mode_flag = 0;
1355
161k
    }
1356
1357
456k
    if(!ps_mb_hdr->u1_base_mode_flag)
1358
438k
    {
1359
        /* is intra ? */
1360
438k
        if(mb_type == I16x16)
1361
154k
        {
1362
154k
            UWORD32 u4_cbp_l, u4_cbp_c;
1363
1364
154k
            is_inter = 0;
1365
1366
154k
            u4_cbp_c = (cbp >> 4);
1367
154k
            u4_cbp_l = (cbp & 0xF);
1368
154k
            luma_intra_mode = (mb_tpm >> 4) & 3;
1369
154k
            chroma_intra_mode = (mb_tpm >> 6);
1370
1371
154k
            mb_type_stream = luma_intra_mode + 1 + (u4_cbp_c << 2) + (u4_cbp_l == 15) * 12;
1372
1373
154k
            mb_type_stream += 5;
1374
1375
            /* write mb type */
1376
154k
            PUT_BITS_UEV(ps_bitstream, mb_type_stream, error_status, "mb type");
1377
1378
            /* intra_chroma_pred_mode */
1379
154k
            PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
1380
154k
            pu1_byte += sizeof(isvce_mb_hdr_i16x16_t);
1381
154k
        }
1382
283k
        else if(mb_type == I4x4)
1383
48.7k
        {
1384
48.7k
            isvce_mb_hdr_i4x4_t *ps_mb_hdr_i4x4 =
1385
48.7k
                (isvce_mb_hdr_i4x4_t *) ps_ent_ctxt->pv_mb_header_data;
1386
1387
            /* mb sub blk modes */
1388
48.7k
            WORD32 intra_pred_mode_flag, rem_intra_mode;
1389
48.7k
            WORD32 byte;
1390
1391
48.7k
            is_inter = 0;
1392
1393
48.7k
            chroma_intra_mode = (mb_tpm >> 6);
1394
48.7k
            cbptable = 0;
1395
1396
            /* write mb type */
1397
48.7k
            PUT_BITS_UEV(ps_bitstream, 5, error_status, "mb type");
1398
1399
438k
            for(i = 0; i < 16; i += 2)
1400
390k
            {
1401
                /* sub blk idx 1 */
1402
390k
                byte = ps_mb_hdr_i4x4->au1_sub_blk_modes[i >> 1];
1403
1404
390k
                intra_pred_mode_flag = byte & 0x1;
1405
1406
                /* prev_intra4x4_pred_mode_flag */
1407
390k
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1408
390k
                         "prev_intra4x4_pred_mode_flag");
1409
1410
                /* rem_intra4x4_pred_mode */
1411
390k
                if(!intra_pred_mode_flag)
1412
125k
                {
1413
125k
                    rem_intra_mode = (byte & 0xF) >> 1;
1414
125k
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1415
125k
                             "rem_intra4x4_pred_mode");
1416
125k
                }
1417
1418
                /* sub blk idx 2 */
1419
390k
                byte >>= 4;
1420
1421
390k
                intra_pred_mode_flag = byte & 0x1;
1422
1423
                /* prev_intra4x4_pred_mode_flag */
1424
390k
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1425
390k
                         "prev_intra4x4_pred_mode_flag");
1426
1427
                /* rem_intra4x4_pred_mode */
1428
390k
                if(!intra_pred_mode_flag)
1429
99.7k
                {
1430
99.7k
                    rem_intra_mode = (byte & 0xF) >> 1;
1431
99.7k
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1432
99.7k
                             "rem_intra4x4_pred_mode");
1433
99.7k
                }
1434
390k
            }
1435
1436
            /* intra_chroma_pred_mode */
1437
48.7k
            PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
1438
1439
48.7k
            pu1_byte += sizeof(isvce_mb_hdr_i4x4_t);
1440
48.7k
        }
1441
234k
        else if(mb_type == I8x8)
1442
0
        {
1443
0
            isvce_mb_hdr_i8x8_t *ps_mb_hdr_i8x8 =
1444
0
                (isvce_mb_hdr_i8x8_t *) ps_ent_ctxt->pv_mb_header_data;
1445
1446
            /* transform 8x8 flag */
1447
0
            UWORD32 u4_transform_size_8x8_flag = ps_ent_ctxt->i1_transform_8x8_mode_flag;
1448
1449
            /* mb sub blk modes */
1450
0
            WORD32 intra_pred_mode_flag, rem_intra_mode;
1451
0
            WORD32 byte;
1452
1453
0
            is_inter = 0;
1454
1455
0
            chroma_intra_mode = (mb_tpm >> 6);
1456
0
            cbptable = 0;
1457
1458
0
            ASSERT(0);
1459
1460
            /* write mb type */
1461
0
            PUT_BITS_UEV(ps_bitstream, 5, error_status, "mb type");
1462
1463
            /* u4_transform_size_8x8_flag */
1464
0
            PUT_BITS(ps_bitstream, u4_transform_size_8x8_flag, 1, error_status,
1465
0
                     "u4_transform_size_8x8_flag");
1466
1467
            /* write sub block modes */
1468
0
            for(i = 0; i < 4; i++)
1469
0
            {
1470
                /* sub blk idx 1 */
1471
0
                byte = ps_mb_hdr_i8x8->au1_sub_blk_modes[i >> 1];
1472
1473
0
                intra_pred_mode_flag = byte & 0x1;
1474
1475
                /* prev_intra4x4_pred_mode_flag */
1476
0
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1477
0
                         "prev_intra4x4_pred_mode_flag");
1478
1479
                /* rem_intra4x4_pred_mode */
1480
0
                if(!intra_pred_mode_flag)
1481
0
                {
1482
0
                    rem_intra_mode = (byte & 0xF) >> 1;
1483
0
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1484
0
                             "rem_intra4x4_pred_mode");
1485
0
                }
1486
1487
                /* sub blk idx 2 */
1488
0
                byte >>= 4;
1489
1490
0
                intra_pred_mode_flag = byte & 0x1;
1491
1492
                /* prev_intra4x4_pred_mode_flag */
1493
0
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1494
0
                         "prev_intra4x4_pred_mode_flag");
1495
1496
                /* rem_intra4x4_pred_mode */
1497
0
                if(!intra_pred_mode_flag)
1498
0
                {
1499
0
                    rem_intra_mode = (byte & 0xF) >> 1;
1500
0
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1501
0
                             "rem_intra4x4_pred_mode");
1502
0
                }
1503
0
            }
1504
1505
            /* intra_chroma_pred_mode */
1506
0
            PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
1507
1508
0
            pu1_byte += sizeof(isvce_mb_hdr_i8x8_t);
1509
0
        }
1510
234k
        else
1511
234k
        {
1512
234k
            isvce_mb_hdr_p16x16_t *ps_mb_hdr_p16x16 =
1513
234k
                (isvce_mb_hdr_p16x16_t *) ps_ent_ctxt->pv_mb_header_data;
1514
1515
            /* inter macro block partition cnt */
1516
234k
            const UWORD8 au1_part_cnt[] = {1, 2, 2, 4};
1517
1518
            /* mv ptr */
1519
234k
            WORD16 *pi2_mv_ptr = (WORD16 *) ps_mb_hdr_p16x16->ai2_mvd;
1520
1521
            /* number of partitions for the current mb */
1522
234k
            UWORD32 u4_part_cnt = au1_part_cnt[mb_type - 3];
1523
1524
234k
            is_inter = 1;
1525
1526
            /* write mb type */
1527
234k
            PUT_BITS_UEV(ps_bitstream, mb_type - 3, error_status, "mb type");
1528
1529
469k
            for(i = 0; i < (WORD32) u4_part_cnt; i++)
1530
234k
            {
1531
234k
                if(ps_ent_ctxt->u1_spatial_layer_id &&
1532
234k
                   ps_svc_slice_header->i1_adaptive_motion_prediction_flag)
1533
114k
                {
1534
114k
                    PUT_BITS(ps_bitstream, ps_mb_hdr_p16x16->u1_mvp_idx, 1, error_status,
1535
114k
                             "motion_prediction_flag_l0");
1536
114k
                }
1537
234k
            }
1538
1539
469k
            for(i = 0; i < (WORD32) u4_part_cnt; i++)
1540
234k
            {
1541
234k
                PUT_BITS_SEV(ps_bitstream, pi2_mv_ptr[i], error_status, "mv x");
1542
234k
                PUT_BITS_SEV(ps_bitstream, pi2_mv_ptr[i + 1], error_status, "mv y");
1543
234k
            }
1544
1545
234k
            pu1_byte += sizeof(isvce_mb_hdr_p16x16_t);
1546
234k
        }
1547
438k
    }
1548
18.0k
    else
1549
18.0k
    {
1550
18.0k
        pu1_byte += sizeof(isvce_mb_hdr_base_mode_t);
1551
18.0k
    }
1552
1553
456k
    if(ps_ent_ctxt->u1_spatial_layer_id &&
1554
456k
       ps_svc_slice_header->i1_adaptive_residual_prediction_flag &&
1555
456k
       !ps_ent_ctxt
1556
294k
            ->ps_svc_nalu_ext_base[1 + (ps_ent_ctxt->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT)]
1557
294k
            .u1_idr_flag &&
1558
456k
       (ps_mb_hdr->u1_base_mode_flag || !u1_is_intra_mb))
1559
132k
    {
1560
132k
        PUT_BITS(ps_bitstream, ps_mb_hdr->u1_residual_prediction_flag, 1, error_status,
1561
132k
                 "residual_prediction_flag");
1562
132k
    }
1563
1564
    /* coded_block_pattern */
1565
456k
    if(ps_mb_hdr->u1_base_mode_flag || (mb_type != I16x16))
1566
301k
    {
1567
301k
        PUT_BITS_UEV(ps_bitstream, gu1_cbp_map_tables[cbp][cbptable], error_status,
1568
301k
                     "coded_block_pattern");
1569
301k
    }
1570
1571
456k
    if((cbp > 0) || (mb_type == I16x16))
1572
434k
    {
1573
        /* mb_qp_delta */
1574
434k
        PUT_BITS_SEV(ps_bitstream, mb_qp_delta, error_status, "mb_qp_delta");
1575
434k
        ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp = ps_mb_hdr->u1_mb_qp;
1576
434k
    }
1577
1578
    /* Ending bitstream offset for header in bits */
1579
456k
    bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1580
1581
456k
    ps_ent_ctxt->u4_header_bits[is_inter] += bitstream_end_offset - bitstream_start_offset;
1582
1583
    /* start bitstream offset for residue in bits */
1584
456k
    bitstream_start_offset = bitstream_end_offset;
1585
1586
    /* residual */
1587
456k
    error_status = isvce_encode_residue(ps_ent_ctxt, mb_type, cbp);
1588
1589
    /* Ending bitstream offset for residue in bits */
1590
456k
    bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1591
1592
456k
    ps_ent_ctxt->u4_residue_bits[is_inter] += bitstream_end_offset - bitstream_start_offset;
1593
1594
    /* store the index of the next mb syntax layer */
1595
456k
    ps_ent_ctxt->pv_mb_header_data = pu1_byte;
1596
1597
456k
    return error_status;
1598
456k
}
1599
1600
/**
1601
*******************************************************************************
1602
*
1603
* @brief
1604
*  This function generates CAVLC coded bit stream for B slices
1605
*
1606
* @description
1607
*  The mb syntax layer for inter slices constitutes luma mb mode, luma sub modes
1608
*  (if present), mb qp delta, coded block pattern, chroma mb mode and
1609
*  luma/chroma residue. These syntax elements are written as directed by table
1610
*  7.3.5 of h264 specification
1611
*
1612
* @param[in] ps_ent_ctxt
1613
*  pointer to entropy context
1614
*
1615
* @returns error code
1616
*
1617
* @remarks none
1618
*
1619
*******************************************************************************
1620
*/
1621
IH264E_ERROR_T isvce_write_bslice_mb_cavlc(isvce_entropy_ctxt_t *ps_ent_ctxt)
1622
0
{
1623
    /* mb header info */
1624
    /*
1625
     * mb_tpm : mb type plus mode
1626
     * mb_type : luma mb type and chroma mb type are packed
1627
     * cbp : coded block pattern
1628
     * mb_qp_delta : mb qp delta
1629
     * chroma_intra_mode : chroma intra mode
1630
     * luma_intra_mode : luma intra mode
1631
     * ps_pu :  Pointer to the array of structures having motion vectors, size
1632
     * and position of sub partitions
1633
     */
1634
0
    WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode;
1635
0
    WORD8 mb_qp_delta;
1636
0
    WORD32 i, j;
1637
0
    WORD32 mb_type_stream;
1638
0
    WORD32 bitstream_start_offset, bitstream_end_offset;
1639
0
    UWORD8 u1_is_intra_mb;
1640
1641
0
    bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm;
1642
0
    isvce_mb_hdr_common_t *ps_mb_hdr = (isvce_mb_hdr_common_t *) ps_ent_ctxt->pv_mb_header_data;
1643
0
    svc_slice_header_t *ps_svc_slice_header =
1644
0
        ps_ent_ctxt->ps_svc_slice_hdr_base +
1645
0
        (ps_ent_ctxt->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT);
1646
1647
0
    IH264E_ERROR_T error_status = IH264E_SUCCESS;
1648
1649
0
    UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
1650
0
    WORD32 cbptable = 1;
1651
0
    WORD32 is_inter = 0;
1652
1653
    /* Starting bitstream offset for header in bits */
1654
0
    bitstream_start_offset = isvce_get_num_bits(ps_bitstream);
1655
1656
    /********************************************************************/
1657
    /*                    BEGIN HEADER GENERATION                       */
1658
    /********************************************************************/
1659
1660
0
    mb_tpm = ps_mb_hdr->u1_mb_type_mode;
1661
1662
    /* mb type */
1663
0
    mb_type = mb_tpm & 0xF;
1664
0
    u1_is_intra_mb = (mb_type == I16x16) || (mb_type == I8x8) || (mb_type == I4x4);
1665
1666
    /* check for skip */
1667
0
    if(mb_type == BSKIP)
1668
0
    {
1669
0
        UWORD32 *nnz;
1670
1671
0
        is_inter = 1;
1672
1673
        /* increment skip counter */
1674
0
        (*ps_ent_ctxt->pi4_mb_skip_run)++;
1675
1676
        /* store the index of the next mb syntax layer */
1677
0
        pu1_byte += sizeof(isvce_mb_hdr_bskip_t);
1678
0
        ps_ent_ctxt->pv_mb_header_data = pu1_byte;
1679
1680
        /* set nnz to zero */
1681
0
        ps_ent_ctxt->u4_left_nnz_luma = 0;
1682
0
        nnz = (UWORD32 *) ps_ent_ctxt->pu1_top_nnz_luma[ps_ent_ctxt->i4_mb_x];
1683
0
        *nnz = 0;
1684
0
        ps_ent_ctxt->u4_left_nnz_cbcr = 0;
1685
0
        nnz = (UWORD32 *) ps_ent_ctxt->pu1_top_nnz_cbcr[ps_ent_ctxt->i4_mb_x];
1686
0
        *nnz = 0;
1687
1688
        /* residual */
1689
0
        error_status = isvce_encode_residue(ps_ent_ctxt, B16x16, 0);
1690
1691
0
        bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1692
1693
0
        ps_ent_ctxt->u4_header_bits[is_inter] += bitstream_end_offset - bitstream_start_offset;
1694
1695
0
        return error_status;
1696
0
    }
1697
1698
    /* remaining mb header info */
1699
0
    cbp = ps_mb_hdr->u1_cbp;
1700
0
    mb_qp_delta =
1701
0
        ((WORD16) ps_mb_hdr->u1_mb_qp) - ((WORD16) ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp);
1702
1703
    /* mb skip run */
1704
0
    PUT_BITS_UEV(ps_bitstream, *ps_ent_ctxt->pi4_mb_skip_run, error_status, "mb skip run");
1705
1706
    /* reset skip counter */
1707
0
    *ps_ent_ctxt->pi4_mb_skip_run = 0;
1708
1709
0
    if(ps_ent_ctxt->u1_spatial_layer_id && ps_svc_slice_header->i1_adaptive_base_mode_flag)
1710
0
    {
1711
        /* write base_mode_flag */
1712
0
        PUT_BITS(ps_bitstream, ps_mb_hdr->u1_base_mode_flag, 1, error_status, "base_mode_flag");
1713
0
    }
1714
0
    else
1715
0
    {
1716
0
        ps_mb_hdr->u1_base_mode_flag = 0;
1717
0
    }
1718
1719
0
    if(!ps_mb_hdr->u1_base_mode_flag)
1720
0
    {
1721
        /* is intra ? */
1722
0
        if(mb_type == I16x16)
1723
0
        {
1724
0
            UWORD32 u4_cbp_l, u4_cbp_c;
1725
1726
0
            is_inter = 0;
1727
1728
0
            u4_cbp_c = (cbp >> 4);
1729
0
            u4_cbp_l = (cbp & 0xF);
1730
0
            luma_intra_mode = (mb_tpm >> 4) & 3;
1731
0
            chroma_intra_mode = (mb_tpm >> 6);
1732
1733
0
            mb_type_stream = luma_intra_mode + 1 + (u4_cbp_c << 2) + (u4_cbp_l == 15) * 12;
1734
1735
0
            mb_type_stream += 23;
1736
1737
            /* write mb type */
1738
0
            PUT_BITS_UEV(ps_bitstream, mb_type_stream, error_status, "mb type");
1739
1740
            /* intra_chroma_pred_mode */
1741
0
            PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
1742
0
            pu1_byte += sizeof(isvce_mb_hdr_i16x16_t);
1743
0
        }
1744
0
        else if(mb_type == I4x4)
1745
0
        {
1746
0
            isvce_mb_hdr_i4x4_t *ps_mb_hdr_i4x4 =
1747
0
                (isvce_mb_hdr_i4x4_t *) ps_ent_ctxt->pv_mb_header_data;
1748
1749
            /* mb sub blk modes */
1750
0
            WORD32 intra_pred_mode_flag, rem_intra_mode;
1751
0
            WORD32 byte;
1752
1753
0
            is_inter = 0;
1754
1755
0
            chroma_intra_mode = (mb_tpm >> 6);
1756
0
            cbptable = 0;
1757
1758
            /* write mb type */
1759
0
            PUT_BITS_UEV(ps_bitstream, 23, error_status, "mb type");
1760
1761
0
            for(i = 0; i < 16; i += 2)
1762
0
            {
1763
                /* sub blk idx 1 */
1764
0
                byte = ps_mb_hdr_i4x4->au1_sub_blk_modes[i >> 1];
1765
1766
0
                intra_pred_mode_flag = byte & 0x1;
1767
1768
                /* prev_intra4x4_pred_mode_flag */
1769
0
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1770
0
                         "prev_intra4x4_pred_mode_flag");
1771
1772
                /* rem_intra4x4_pred_mode */
1773
0
                if(!intra_pred_mode_flag)
1774
0
                {
1775
0
                    rem_intra_mode = (byte & 0xF) >> 1;
1776
0
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1777
0
                             "rem_intra4x4_pred_mode");
1778
0
                }
1779
1780
                /* sub blk idx 2 */
1781
0
                byte >>= 4;
1782
1783
0
                intra_pred_mode_flag = byte & 0x1;
1784
1785
                /* prev_intra4x4_pred_mode_flag */
1786
0
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1787
0
                         "prev_intra4x4_pred_mode_flag");
1788
1789
                /* rem_intra4x4_pred_mode */
1790
0
                if(!intra_pred_mode_flag)
1791
0
                {
1792
0
                    rem_intra_mode = (byte & 0xF) >> 1;
1793
0
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1794
0
                             "rem_intra4x4_pred_mode");
1795
0
                }
1796
0
            }
1797
1798
            /* intra_chroma_pred_mode */
1799
0
            PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
1800
0
            pu1_byte += sizeof(isvce_mb_hdr_i4x4_t);
1801
0
        }
1802
0
        else if(mb_type == I8x8)
1803
0
        {
1804
0
            isvce_mb_hdr_i8x8_t *ps_mb_hdr_i8x8 =
1805
0
                (isvce_mb_hdr_i8x8_t *) ps_ent_ctxt->pv_mb_header_data;
1806
1807
            /* transform 8x8 flag */
1808
0
            UWORD32 u4_transform_size_8x8_flag = ps_ent_ctxt->i1_transform_8x8_mode_flag;
1809
1810
            /* mb sub blk modes */
1811
0
            WORD32 intra_pred_mode_flag, rem_intra_mode;
1812
0
            WORD32 byte;
1813
1814
0
            is_inter = 0;
1815
1816
0
            chroma_intra_mode = (mb_tpm >> 6);
1817
0
            cbptable = 0;
1818
1819
0
            ASSERT(0);
1820
1821
            /* write mb type */
1822
0
            PUT_BITS_UEV(ps_bitstream, 23, error_status, "mb type");
1823
1824
            /* u4_transform_size_8x8_flag */
1825
0
            PUT_BITS(ps_bitstream, u4_transform_size_8x8_flag, 1, error_status,
1826
0
                     "u4_transform_size_8x8_flag");
1827
1828
            /* write sub block modes */
1829
0
            for(i = 0; i < 4; i++)
1830
0
            {
1831
                /* sub blk idx 1 */
1832
0
                byte = ps_mb_hdr_i8x8->au1_sub_blk_modes[i >> 1];
1833
1834
0
                intra_pred_mode_flag = byte & 0x1;
1835
1836
                /* prev_intra4x4_pred_mode_flag */
1837
0
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1838
0
                         "prev_intra4x4_pred_mode_flag");
1839
1840
                /* rem_intra4x4_pred_mode */
1841
0
                if(!intra_pred_mode_flag)
1842
0
                {
1843
0
                    rem_intra_mode = (byte & 0xF) >> 1;
1844
0
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1845
0
                             "rem_intra4x4_pred_mode");
1846
0
                }
1847
1848
                /* sub blk idx 2 */
1849
0
                byte >>= 4;
1850
1851
0
                intra_pred_mode_flag = byte & 0x1;
1852
1853
                /* prev_intra4x4_pred_mode_flag */
1854
0
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1855
0
                         "prev_intra4x4_pred_mode_flag");
1856
1857
                /* rem_intra4x4_pred_mode */
1858
0
                if(!intra_pred_mode_flag)
1859
0
                {
1860
0
                    rem_intra_mode = (byte & 0xF) >> 1;
1861
0
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1862
0
                             "rem_intra4x4_pred_mode");
1863
0
                }
1864
0
            }
1865
1866
            /* intra_chroma_pred_mode */
1867
0
            PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
1868
0
            pu1_byte += sizeof(isvce_mb_hdr_i8x8_t);
1869
0
        }
1870
0
        else if(mb_type == BDIRECT)
1871
0
        {
1872
0
            is_inter = 1;
1873
            /* write mb type */
1874
0
            PUT_BITS_UEV(ps_bitstream, B_DIRECT_16x16, error_status, "mb type");
1875
0
            pu1_byte += sizeof(isvce_mb_hdr_bdirect_t);
1876
0
        }
1877
0
        else
1878
0
        {
1879
0
            isvce_mb_hdr_b16x16_t *ps_mb_hdr_b16x16 =
1880
0
                (isvce_mb_hdr_b16x16_t *) ps_ent_ctxt->pv_mb_header_data;
1881
1882
            /* inter macro block partition cnt for 16x16 16x8 8x16 8x8 */
1883
0
            const UWORD8 au1_part_cnt[] = {1, 2, 2, 4};
1884
1885
            /* number of partitions for the current mb */
1886
0
            UWORD32 u4_part_cnt = au1_part_cnt[mb_type - B16x16];
1887
1888
            /* Get the pred modes */
1889
0
            WORD32 i4_mb_part_pred_mode = (mb_tpm >> 4);
1890
1891
0
            ASSERT(mb_type == B16x16);
1892
1893
0
            is_inter = 1;
1894
1895
0
            mb_type_stream = mb_type - B16x16 + B_L0_16x16 + i4_mb_part_pred_mode;
1896
1897
            /* write mb type */
1898
0
            PUT_BITS_UEV(ps_bitstream, mb_type_stream, error_status, "mb type");
1899
1900
0
            for(i = 0; i < (WORD32) u4_part_cnt; i++)
1901
0
            {
1902
0
                for(j = 0; j < NUM_PRED_DIRS; j++)
1903
0
                {
1904
0
                    PRED_MODE_T e_pred_mode = (PRED_MODE_T) j;
1905
0
                    PRED_MODE_T e_cmpl_pred_mode = (e_pred_mode == L0) ? L1 : L0;
1906
1907
0
                    if(((PRED_MODE_T) i4_mb_part_pred_mode) != e_pred_mode)
1908
0
                    {
1909
0
                        if(ps_svc_slice_header->i1_adaptive_motion_prediction_flag &&
1910
0
                           ps_ent_ctxt->u1_spatial_layer_id)
1911
0
                        {
1912
0
                            PUT_BITS(ps_bitstream, ps_mb_hdr_b16x16->au1_mvp_idx[e_cmpl_pred_mode],
1913
0
                                     1, error_status, "motion_prediction_flag_l0");
1914
0
                        }
1915
0
                    }
1916
0
                }
1917
0
            }
1918
1919
0
            for(i = 0; i < (WORD32) u4_part_cnt; i++)
1920
0
            {
1921
0
                if(i4_mb_part_pred_mode != L1)
1922
0
                {
1923
0
                    PUT_BITS_SEV(ps_bitstream, ps_mb_hdr_b16x16->ai2_mvd[0][0], error_status,
1924
0
                                 "mv l0 x");
1925
0
                    PUT_BITS_SEV(ps_bitstream, ps_mb_hdr_b16x16->ai2_mvd[0][1], error_status,
1926
0
                                 "mv l0 y");
1927
0
                }
1928
0
                if(i4_mb_part_pred_mode != L0)
1929
0
                {
1930
0
                    PUT_BITS_SEV(ps_bitstream, ps_mb_hdr_b16x16->ai2_mvd[1][0], error_status,
1931
0
                                 "mv l1 x");
1932
0
                    PUT_BITS_SEV(ps_bitstream, ps_mb_hdr_b16x16->ai2_mvd[1][1], error_status,
1933
0
                                 "mv l1 y");
1934
0
                }
1935
0
            }
1936
1937
0
            pu1_byte += sizeof(isvce_mb_hdr_b16x16_t);
1938
0
        }
1939
0
    }
1940
1941
0
    if(ps_svc_slice_header->i1_adaptive_residual_prediction_flag &&
1942
0
       ps_ent_ctxt->u1_spatial_layer_id && (ps_mb_hdr->u1_base_mode_flag || !u1_is_intra_mb))
1943
0
    {
1944
0
        PUT_BITS(ps_bitstream, ps_mb_hdr->u1_residual_prediction_flag, 1, error_status,
1945
0
                 "residual_prediction_flag");
1946
0
    }
1947
1948
    /* coded_block_pattern */
1949
0
    if(ps_mb_hdr->u1_base_mode_flag || mb_type != I16x16)
1950
0
    {
1951
0
        PUT_BITS_UEV(ps_bitstream, gu1_cbp_map_tables[cbp][cbptable], error_status,
1952
0
                     "coded_block_pattern");
1953
0
    }
1954
1955
0
    if((cbp > 0) || (mb_type == I16x16))
1956
0
    {
1957
        /* mb_qp_delta */
1958
0
        PUT_BITS_SEV(ps_bitstream, mb_qp_delta, error_status, "mb_qp_delta");
1959
0
        ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp = ps_mb_hdr->u1_mb_qp;
1960
0
    }
1961
1962
    /* Ending bitstream offset for header in bits */
1963
0
    bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1964
1965
0
    ps_ent_ctxt->u4_header_bits[is_inter] += bitstream_end_offset - bitstream_start_offset;
1966
1967
    /* start bitstream offset for residue in bits */
1968
0
    bitstream_start_offset = bitstream_end_offset;
1969
1970
    /* residual */
1971
0
    error_status = isvce_encode_residue(ps_ent_ctxt, mb_type, cbp);
1972
1973
    /* Ending bitstream offset for residue in bits */
1974
0
    bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1975
1976
0
    ps_ent_ctxt->u4_residue_bits[is_inter] += bitstream_end_offset - bitstream_start_offset;
1977
1978
    /* store the index of the next mb syntax layer */
1979
0
    ps_ent_ctxt->pv_mb_header_data = pu1_byte;
1980
1981
0
    return error_status;
1982
0
}
1983
1984
#if ENABLE_RE_ENC_AS_SKIP
1985
/**
1986
******************************************************************************
1987
*
1988
*  @brief re-encode frame as all skip MBs
1989
*
1990
*  @par   Description
1991
*  The frame is encoded as all skip MBs to comply with VBV restrictions
1992
*
1993
*  @param[in]    ps_entropy
1994
*  pointer to entropy context (handle)
1995
*
1996
*  @return      success or failure error code
1997
*
1998
******************************************************************************
1999
*/
2000
IH264E_ERROR_T isvce_reencode_as_skip_frame_cavlc(isvce_entropy_ctxt_t *ps_entropy)
2001
13.9k
{
2002
13.9k
    WORD32 i4_mb_skip_run;
2003
2004
13.9k
    bitstrm_t *ps_bitstrm = ps_entropy->ps_bitstrm;
2005
13.9k
    bitstrm_t *ps_bitstrm_after_slice_hdr = ps_entropy->ps_bitstrm_after_slice_hdr;
2006
2007
13.9k
    ps_bitstrm->i4_bits_left_in_cw = ps_bitstrm_after_slice_hdr->i4_bits_left_in_cw;
2008
13.9k
    ps_bitstrm->u4_cur_word = ps_bitstrm_after_slice_hdr->u4_cur_word;
2009
13.9k
    ps_bitstrm->u4_strm_buf_offset = ps_bitstrm_after_slice_hdr->u4_strm_buf_offset;
2010
13.9k
    ps_bitstrm->i4_zero_bytes_run = ps_bitstrm_after_slice_hdr->i4_zero_bytes_run;
2011
2012
    /* mb skip run */
2013
13.9k
    i4_mb_skip_run = ps_entropy->i4_wd_mbs * ps_entropy->i4_ht_mbs;
2014
13.9k
    PUT_BITS_UEV(ps_bitstrm, i4_mb_skip_run, ps_entropy->i4_error_code, "mb skip run");
2015
2016
    /* put rbsp trailing bits */
2017
13.9k
    ps_entropy->i4_error_code = ih264e_put_rbsp_trailing_bits(ps_bitstrm);
2018
2019
13.9k
    return ps_entropy->i4_error_code;
2020
13.9k
}
2021
#endif