Coverage Report

Created: 2026-10-17 07:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/encoder/svc/isvce_cavlc.c
Line
Count
Source
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.14M
{
130
9.14M
    UWORD32 i = 0;
131
9.14M
    UWORD32 u4_nnz_coeff = 0;
132
9.14M
    WORD32 i4_run = -1;
133
9.14M
    UWORD32 u4_sign = 0;
134
9.14M
    UWORD32 u4_tot_zero = 0;
135
9.14M
    UWORD32 u4_trailing1 = 0;
136
9.14M
    WORD32 i4_val;
137
9.14M
    UWORD32 u4_totzero_sign_trailone;
138
9.14M
    UWORD32 *pu4_zero_run;
139
140
9.14M
    pu4_zero_run = (void *) pu1_zero_run;
141
9.14M
    pu4_zero_run[0] = 0;
142
9.14M
    pu4_zero_run[1] = 0;
143
9.14M
    pu4_zero_run[2] = 0;
144
9.14M
    pu4_zero_run[3] = 0;
145
146
    /* Compute Runs of zeros for all nnz coefficients except the last 3 */
147
9.14M
    if(u4_total_coeff > 3)
148
4.17M
    {
149
35.2M
        for(i = 0; u4_nnz_coeff < (u4_total_coeff - 3); i++)
150
31.0M
        {
151
31.0M
            i4_run++;
152
153
31.0M
            i4_val = (u4_sig_coeff_map & 0x1);
154
31.0M
            u4_sig_coeff_map >>= 1;
155
156
31.0M
            if(i4_val != 0)
157
28.6M
            {
158
28.6M
                pu1_zero_run[u4_nnz_coeff++] = i4_run;
159
28.6M
                i4_run = -1;
160
28.6M
            }
161
31.0M
        }
162
4.17M
    }
163
164
    /* Compute T1's, Signof(T1's) and Runs of zeros for the last 3 */
165
46.9M
    while(u4_nnz_coeff != u4_total_coeff)
166
37.7M
    {
167
37.7M
        i4_run++;
168
169
37.7M
        i4_val = (u4_sig_coeff_map & 0x1);
170
37.7M
        u4_sig_coeff_map >>= 1;
171
172
37.7M
        if(i4_val != 0)
173
21.3M
        {
174
21.3M
            if(pi2_res_block[u4_nnz_coeff] == 1)
175
3.22M
            {
176
3.22M
                pu1_zero_run[u4_nnz_coeff] = i4_run;
177
3.22M
                u4_trailing1++;
178
3.22M
            }
179
18.0M
            else
180
18.0M
            {
181
18.0M
                if(pi2_res_block[u4_nnz_coeff] == -1)
182
3.79M
                {
183
3.79M
                    pu1_zero_run[u4_nnz_coeff] = i4_run;
184
3.79M
                    u4_sign |= 1 << u4_trailing1;
185
3.79M
                    u4_trailing1++;
186
3.79M
                }
187
14.2M
                else
188
14.2M
                {
189
14.2M
                    pu1_zero_run[u4_nnz_coeff] = i4_run;
190
14.2M
                    u4_trailing1 = 0;
191
14.2M
                    u4_sign = 0;
192
14.2M
                }
193
18.0M
            }
194
21.3M
            i4_run = -1;
195
21.3M
            u4_nnz_coeff++;
196
21.3M
        }
197
37.7M
        i++;
198
37.7M
    }
199
200
9.14M
    u4_tot_zero = i - u4_total_coeff;
201
9.14M
    u4_totzero_sign_trailone = (u4_tot_zero << 16) | (u4_sign << 8) | u4_trailing1;
202
203
9.14M
    return (u4_totzero_sign_trailone);
204
9.14M
}
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.2M
{
246
14.2M
    IH264E_ERROR_T error_status = IH264E_SUCCESS;
247
14.2M
    UWORD32 u4_totzero_sign_trailone = 0;
248
14.2M
    UWORD32 u4_trailing_ones = 0;
249
14.2M
    UWORD32 u4_tot_zeros = 0;
250
14.2M
    UWORD32 u4_remaining_coeff = 0;
251
14.2M
    UWORD32 u4_sign1 = 0;
252
14.2M
    UWORD32 u4_max_num_coeff = 0;
253
14.2M
    const UWORD32 au4_max_num_nnz_coeff[] = {16, 15, 16, 4, 15};
254
255
    /* validate inputs */
256
14.2M
    ASSERT(u4_block_type <= CAVLC_CHROMA_4x4_AC);
257
258
14.2M
    u4_max_num_coeff = au4_max_num_nnz_coeff[u4_block_type];
259
260
14.2M
    ASSERT(u4_total_coeff <= u4_max_num_coeff);
261
262
14.2M
    if(!u4_total_coeff)
263
5.15M
    {
264
5.15M
        UWORD32 u4_codeword = 15;
265
5.15M
        UWORD32 u4_codesize = 1;
266
5.15M
        if(u4_block_type == CAVLC_CHROMA_4x4_DC)
267
112k
        {
268
112k
            u4_codeword = 1;
269
112k
            u4_codesize = 2;
270
112k
            DEBUG("\n[%d numcoeff, %d numtrailing ones]", u4_total_coeff, 0);
271
112k
            ENTROPY_TRACE("\tnumber of non zero coeffs ", u4_total_coeff);
272
112k
            ENTROPY_TRACE("\tnumber of trailing ones ", 0);
273
112k
        }
274
5.04M
        else
275
5.04M
        {
276
5.04M
            UWORD32 u4_vlcnum = u4_nc >> 1;
277
278
            /* write coeff_token */
279
5.04M
            if(u4_vlcnum > 3)
280
160k
            {
281
                /* Num-FLC */
282
160k
                u4_codeword = 3;
283
160k
                u4_codesize = 6;
284
160k
            }
285
4.87M
            else
286
4.87M
            {
287
                /* Num-VLC 0, 1, 2 */
288
4.87M
                if(u4_vlcnum > 1)
289
174k
                {
290
174k
                    u4_vlcnum = 2;
291
174k
                }
292
4.87M
                u4_codesize <<= u4_vlcnum;
293
4.87M
                u4_codeword >>= (4 - u4_codesize);
294
4.87M
            }
295
296
5.04M
            DEBUG("\n[%d numcoeff, %d numtrailing ones, %d nnz]", u4_total_coeff, 0, u4_nc);
297
5.04M
            ENTROPY_TRACE("\tnumber of non zero coeffs ", u4_total_coeff);
298
5.04M
            ENTROPY_TRACE("\tnC ", u4_nc);
299
5.04M
        }
300
301
5.15M
        DEBUG("\nCOEFF TOKEN 0: %d u4_codeword, %d u4_codesize", u4_codeword, u4_codesize);
302
5.15M
        ENTROPY_TRACE("\tcodeword ", u4_codeword);
303
5.15M
        ENTROPY_TRACE("\tcodesize ", u4_codesize);
304
305
5.15M
        error_status = ih264e_put_bits(ps_bit_stream, u4_codeword, u4_codesize);
306
307
5.15M
        return error_status;
308
5.15M
    }
309
9.14M
    else
310
9.14M
    {
311
        /* Compute zero run, number of trailing ones and their sign. */
312
9.14M
        u4_totzero_sign_trailone = isvce_compute_zeroruns_and_trailingones(
313
9.14M
            pi2_res_block, u4_total_coeff, pu1_zero_run, u4_sig_coeff_map);
314
9.14M
        u4_trailing_ones = u4_totzero_sign_trailone & 0xFF;
315
9.14M
        u4_sign1 = (u4_totzero_sign_trailone >> 8) & 0xFF;
316
9.14M
        u4_tot_zeros = (u4_totzero_sign_trailone >> 16) & 0xFF;
317
9.14M
        u4_remaining_coeff = u4_total_coeff - u4_trailing_ones;
318
319
        /* write coeff_token */
320
9.14M
        {
321
9.14M
            UWORD32 u4_codeword;
322
9.14M
            UWORD32 u4_codesize;
323
9.14M
            if(u4_block_type == CAVLC_CHROMA_4x4_DC)
324
649k
            {
325
649k
                u4_codeword =
326
649k
                    gu1_code_coeff_token_table_chroma[u4_trailing_ones][u4_total_coeff - 1];
327
649k
                u4_codesize =
328
649k
                    gu1_size_coeff_token_table_chroma[u4_trailing_ones][u4_total_coeff - 1];
329
330
649k
                DEBUG("\n[%d numcoeff, %d numtrailing ones]", u4_total_coeff, u4_trailing_ones);
331
649k
                ENTROPY_TRACE("\tnumber of non zero coeffs ", u4_total_coeff);
332
649k
                ENTROPY_TRACE("\tnumber of trailing ones ", u4_trailing_ones);
333
649k
            }
334
8.49M
            else
335
8.49M
            {
336
8.49M
                UWORD32 u4_vlcnum = u4_nc >> 1;
337
338
8.49M
                if(u4_vlcnum > 3)
339
2.19M
                {
340
                    /* Num-FLC */
341
2.19M
                    u4_codeword = ((u4_total_coeff - 1) << 2) + u4_trailing_ones;
342
2.19M
                    u4_codesize = 6;
343
2.19M
                }
344
6.29M
                else
345
6.29M
                {
346
                    /* Num-VLC 0, 1, 2 */
347
6.29M
                    if(u4_vlcnum > 1)
348
1.28M
                    {
349
1.28M
                        u4_vlcnum = 2;
350
1.28M
                    }
351
6.29M
                    u4_codeword =
352
6.29M
                        gu1_code_coeff_token_table[u4_vlcnum][u4_trailing_ones][u4_total_coeff - 1];
353
6.29M
                    u4_codesize =
354
6.29M
                        gu1_size_coeff_token_table[u4_vlcnum][u4_trailing_ones][u4_total_coeff - 1];
355
6.29M
                }
356
357
8.49M
                DEBUG("\n[%d numcoeff, %d numtrailing ones, %d nnz]", u4_total_coeff,
358
8.49M
                      u4_trailing_ones, u4_nc);
359
8.49M
                ENTROPY_TRACE("\tnumber of non zero coeffs ", u4_total_coeff);
360
8.49M
                ENTROPY_TRACE("\tnumber of trailing ones ", u4_trailing_ones);
361
8.49M
                ENTROPY_TRACE("\tnC ", u4_nc);
362
8.49M
            }
363
364
9.14M
            DEBUG("\nCOEFF TOKEN 0: %d u4_codeword, %d u4_codesize", u4_codeword, u4_codesize);
365
9.14M
            ENTROPY_TRACE("\tcodeword ", u4_codeword);
366
9.14M
            ENTROPY_TRACE("\tcodesize ", u4_codesize);
367
368
9.14M
            error_status = ih264e_put_bits(ps_bit_stream, u4_codeword, u4_codesize);
369
9.14M
        }
370
371
        /* write sign of trailing ones */
372
9.14M
        if(u4_trailing_ones)
373
3.50M
        {
374
3.50M
            DEBUG("\nT1's: %d u4_codeword, %d u4_codesize", u4_sign1, u4_trailing_ones);
375
3.50M
            error_status = ih264e_put_bits(ps_bit_stream, u4_sign1, u4_trailing_ones);
376
3.50M
            ENTROPY_TRACE("\tnumber of trailing ones ", u4_trailing_ones);
377
3.50M
            ENTROPY_TRACE("\tsign of trailing ones ", u4_sign1);
378
3.50M
        }
379
380
        /* write level codes */
381
9.14M
        if(u4_remaining_coeff)
382
7.76M
        {
383
7.76M
            WORD32 i4_level = pi2_res_block[u4_remaining_coeff - 1];
384
7.76M
            UWORD32 u4_escape;
385
7.76M
            UWORD32 u4_suffix_length = 0;  // Level-VLC[N]
386
7.76M
            UWORD32 u4_abs_level, u4_abs_level_actual = 0;
387
7.76M
            WORD32 i4_sign;
388
7.76M
            const UWORD32 u4_rndfactor[] = {0, 0, 1, 3, 7, 15, 31};
389
390
7.76M
            DEBUG("\n \t%d coeff,", i4_level);
391
7.76M
            ENTROPY_TRACE("\tcoeff ", i4_level);
392
393
7.76M
            if(u4_trailing_ones < 3)
394
7.18M
            {
395
                /* If there are less than 3 T1s, then the first non-T1 level is
396
                 * incremented if negative (decremented if positive)*/
397
7.18M
                if(i4_level < 0)
398
3.65M
                {
399
3.65M
                    i4_level += 1;
400
3.65M
                }
401
3.53M
                else
402
3.53M
                {
403
3.53M
                    i4_level -= 1;
404
3.53M
                }
405
406
7.18M
                u4_abs_level_actual = 1;
407
408
                /* Initialize VLC table (Suffix Length) to encode the level */
409
7.18M
                if(u4_total_coeff > 10)
410
1.89M
                {
411
1.89M
                    u4_suffix_length = 1;
412
1.89M
                }
413
7.18M
            }
414
415
7.76M
            i4_sign = (i4_level >> (sizeof(WORD32) * CHAR_BIT - 1));
416
7.76M
            u4_abs_level = ((i4_level + i4_sign) ^ i4_sign);
417
418
7.76M
            u4_abs_level_actual += u4_abs_level;
419
420
7.76M
            u4_escape = (u4_abs_level + u4_rndfactor[u4_suffix_length]) >> u4_suffix_length;
421
422
43.9M
            while(1)
423
43.9M
            {
424
43.9M
                UWORD32 u4_codesize;
425
43.9M
                UWORD32 u4_codeword;
426
43.9M
                UWORD32 u4_codeval;
427
428
43.9M
                u4_remaining_coeff--;
429
430
43.9M
                GATHER_CAVLC_STATS1();
431
432
43.9M
                {
433
43.9M
                    u4_codeval = u4_abs_level << 1;
434
43.9M
                    u4_codeval = u4_codeval - 2 - i4_sign;
435
436
43.9M
                    if((!u4_suffix_length) && (u4_escape > 7) && (u4_abs_level < 16))
437
634k
                    {
438
634k
                        u4_codeword = (1 << 4) + (u4_codeval - 14);
439
634k
                        u4_codesize = 19;
440
634k
                    }
441
43.3M
                    else if(u4_escape > 7)
442
4.00M
                    {
443
4.00M
                        u4_codeword = (1 << 12) + (u4_codeval - (15 << u4_suffix_length));
444
4.00M
                        u4_codesize = 28;
445
4.00M
                        if(!u4_suffix_length)
446
1.40M
                        {
447
1.40M
                            u4_codeword -= 15;
448
1.40M
                        }
449
4.00M
                    }
450
39.3M
                    else
451
39.3M
                    {
452
39.3M
                        u4_codeword =
453
39.3M
                            (1 << u4_suffix_length) + (u4_codeval & ((1 << u4_suffix_length) - 1));
454
39.3M
                        u4_codesize = (u4_codeval >> u4_suffix_length) + 1 + u4_suffix_length;
455
39.3M
                    }
456
43.9M
                }
457
458
                /*put the level code in bitstream*/
459
43.9M
                DEBUG("\nLEVEL: %d u4_codeword, %d u4_codesize", u4_codeword, u4_codesize);
460
43.9M
                ENTROPY_TRACE("\tcodeword ", u4_codeword);
461
43.9M
                ENTROPY_TRACE("\tcodesize ", u4_codesize);
462
43.9M
                error_status = ih264e_put_bits(ps_bit_stream, u4_codeword, u4_codesize);
463
464
43.9M
                if(u4_remaining_coeff == 0) break;
465
466
                /*update suffix length for next level*/
467
36.1M
                if(u4_suffix_length == 0)
468
3.73M
                {
469
3.73M
                    u4_suffix_length++;
470
3.73M
                }
471
36.1M
                if(u4_suffix_length < 6)
472
31.6M
                {
473
31.6M
                    if(u4_abs_level_actual > gu1_threshold_vlc_level[u4_suffix_length])
474
10.5M
                    {
475
10.5M
                        u4_suffix_length++;
476
10.5M
                    }
477
31.6M
                }
478
479
                /* next level */
480
36.1M
                i4_level = pi2_res_block[u4_remaining_coeff - 1];
481
482
36.1M
                DEBUG("\n \t%d coeff,", i4_level);
483
36.1M
                ENTROPY_TRACE("\tcoeff ", i4_level);
484
485
36.1M
                i4_sign = (i4_level >> (sizeof(WORD32) * CHAR_BIT - 1));
486
36.1M
                u4_abs_level = ((i4_level + i4_sign) ^ i4_sign);
487
488
36.1M
                u4_abs_level_actual = u4_abs_level;
489
490
36.1M
                u4_escape = (u4_abs_level + u4_rndfactor[u4_suffix_length]) >> u4_suffix_length;
491
36.1M
            }
492
7.76M
        }
493
494
9.14M
        DEBUG("\n \t %d totalzeros", u4_tot_zeros);
495
9.14M
        ENTROPY_TRACE("\ttotal zeros ", u4_tot_zeros);
496
497
        /* Write Total Zeros */
498
9.14M
        if(u4_total_coeff < u4_max_num_coeff)
499
8.02M
        {
500
8.02M
            WORD32 index;
501
8.02M
            UWORD32 u4_codeword;
502
8.02M
            UWORD32 u4_codesize;
503
504
8.02M
            if(u4_block_type == CAVLC_CHROMA_4x4_DC)
505
497k
            {
506
497k
                UWORD8 gu1_index_zero_table_chroma[] = {0, 4, 7};
507
497k
                index = gu1_index_zero_table_chroma[u4_total_coeff - 1] + u4_tot_zeros;
508
497k
                u4_codesize = gu1_size_zero_table_chroma[index];
509
497k
                u4_codeword = gu1_code_zero_table_chroma[index];
510
497k
            }
511
7.52M
            else
512
7.52M
            {
513
7.52M
                index = gu1_index_zero_table[u4_total_coeff - 1] + u4_tot_zeros;
514
7.52M
                u4_codesize = gu1_size_zero_table[index];
515
7.52M
                u4_codeword = gu1_code_zero_table[index];
516
7.52M
            }
517
518
8.02M
            DEBUG("\nTOTAL ZEROS: %d u4_codeword, %d u4_codesize", u4_codeword, u4_codesize);
519
8.02M
            ENTROPY_TRACE("\tcodeword ", u4_codeword);
520
8.02M
            ENTROPY_TRACE("\tcodesize ", u4_codesize);
521
8.02M
            error_status = ih264e_put_bits(ps_bit_stream, u4_codeword, u4_codesize);
522
8.02M
        }
523
524
        /* Write Run Before */
525
9.14M
        if(u4_tot_zeros)
526
5.12M
        {
527
5.12M
            UWORD32 u4_max_num_coef = u4_total_coeff - 1;
528
5.12M
            UWORD32 u4_codeword;
529
5.12M
            UWORD32 u4_codesize;
530
5.12M
            UWORD32 u4_zeros_left = u4_tot_zeros;
531
532
17.1M
            while(u4_max_num_coef)
533
16.2M
            {
534
16.2M
                UWORD32 u4_run_before = pu1_zero_run[u4_max_num_coef];
535
16.2M
                UWORD32 u4_index;
536
537
16.2M
                if(u4_zeros_left > MAX_ZERO_LEFT)
538
467k
                {
539
467k
                    u4_index = gu1_index_run_table[MAX_ZERO_LEFT];
540
467k
                }
541
15.7M
                else
542
15.7M
                {
543
15.7M
                    u4_index = gu1_index_run_table[u4_zeros_left - 1];
544
15.7M
                }
545
546
16.2M
                u4_codesize = gu1_size_run_table[u4_index + u4_run_before];
547
16.2M
                u4_codeword = gu1_code_run_table[u4_index + u4_run_before];
548
549
16.2M
                DEBUG("\nRUN BEFORE ZEROS: %d u4_codeword, %d u4_codesize", u4_codeword,
550
16.2M
                      u4_codesize);
551
16.2M
                ENTROPY_TRACE("\tcodeword ", u4_codeword);
552
16.2M
                ENTROPY_TRACE("\tcodesize ", u4_codesize);
553
16.2M
                error_status = ih264e_put_bits(ps_bit_stream, u4_codeword, u4_codesize);
554
555
16.2M
                u4_zeros_left -= u4_run_before;
556
16.2M
                if(!u4_zeros_left)
557
4.19M
                {
558
4.19M
                    break;
559
4.19M
                }
560
12.0M
                u4_max_num_coef--;
561
12.0M
            }
562
5.12M
        }
563
9.14M
    }
564
565
9.14M
    return error_status;
566
14.2M
}
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.65M
{
613
2.65M
    IH264E_ERROR_T error_status = IH264E_SUCCESS;
614
2.65M
    bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm;
615
2.65M
    UWORD8 *pu1_zero_run = ps_ent_ctxt->au1_zero_run, *pu1_ngbr_avbl;
616
2.65M
    UWORD32 u4_nC;
617
2.65M
    UWORD8 u1_mb_a, u1_mb_b;
618
619
2.65M
    pu1_ngbr_avbl = (void *) (&u4_ngbr_avlb);
620
621
    /* encode ac block index 4x4 = 0*/
622
2.65M
    u1_mb_a = pu1_ngbr_avbl[0] & 0x0F;
623
2.65M
    u1_mb_b = pu1_ngbr_avbl[0] & 0xF0;
624
2.65M
    u4_nC = 0;
625
2.65M
    if(u1_mb_a) u4_nC += pu1_left_nnz[0];
626
2.65M
    if(u1_mb_b) u4_nC += pu1_top_nnz[0];
627
2.65M
    if(u1_mb_a && u1_mb_b) u4_nC = (u4_nC + 1) >> 1;
628
2.65M
    pu1_left_nnz[0] = pu1_top_nnz[0] = pu1_nnz[0];
629
2.65M
    error_status =
630
2.65M
        isvce_write_coeff4x4_cavlc(pi2_res_block[0], pu1_nnz[0], u4_block_type, pu1_zero_run, u4_nC,
631
2.65M
                                   ps_bitstream, pu2_sig_coeff_map[0]);
632
633
    /* encode ac block index 4x4 = 1*/
634
2.65M
    u1_mb_a = pu1_ngbr_avbl[1] & 0x0F;
635
2.65M
    u1_mb_b = pu1_ngbr_avbl[1] & 0xF0;
636
2.65M
    u4_nC = 0;
637
2.65M
    if(u1_mb_a) u4_nC += pu1_left_nnz[0];
638
2.65M
    if(u1_mb_b) u4_nC += pu1_top_nnz[1];
639
2.65M
    if(u1_mb_a && u1_mb_b) u4_nC = (u4_nC + 1) >> 1;
640
2.65M
    pu1_left_nnz[0] = pu1_top_nnz[1] = pu1_nnz[1];
641
2.65M
    error_status =
642
2.65M
        isvce_write_coeff4x4_cavlc(pi2_res_block[1], pu1_nnz[1], u4_block_type, pu1_zero_run, u4_nC,
643
2.65M
                                   ps_bitstream, pu2_sig_coeff_map[1]);
644
645
    /* encode ac block index 4x4 = 2*/
646
2.65M
    u1_mb_a = pu1_ngbr_avbl[2] & 0x0F;
647
2.65M
    u1_mb_b = pu1_ngbr_avbl[2] & 0xF0;
648
2.65M
    u4_nC = 0;
649
2.65M
    if(u1_mb_a) u4_nC += pu1_left_nnz[1];
650
2.65M
    if(u1_mb_b) u4_nC += pu1_top_nnz[0];
651
2.65M
    if(u1_mb_a && u1_mb_b) u4_nC = (u4_nC + 1) >> 1;
652
2.65M
    pu1_left_nnz[1] = pu1_top_nnz[0] = pu1_nnz[2];
653
2.65M
    error_status =
654
2.65M
        isvce_write_coeff4x4_cavlc(pi2_res_block[2], pu1_nnz[2], u4_block_type, pu1_zero_run, u4_nC,
655
2.65M
                                   ps_bitstream, pu2_sig_coeff_map[2]);
656
657
    /* encode ac block index 4x4 = 0*/
658
2.65M
    u1_mb_a = pu1_ngbr_avbl[3] & 0x0F;
659
2.65M
    u1_mb_b = pu1_ngbr_avbl[3] & 0xF0;
660
2.65M
    u4_nC = 0;
661
2.65M
    if(u1_mb_a) u4_nC += pu1_left_nnz[1];
662
2.65M
    if(u1_mb_b) u4_nC += pu1_top_nnz[1];
663
2.65M
    if(u1_mb_a && u1_mb_b) u4_nC = (u4_nC + 1) >> 1;
664
2.65M
    pu1_left_nnz[1] = pu1_top_nnz[1] = pu1_nnz[3];
665
2.65M
    error_status =
666
2.65M
        isvce_write_coeff4x4_cavlc(pi2_res_block[3], pu1_nnz[3], u4_block_type, pu1_zero_run, u4_nC,
667
2.65M
                                   ps_bitstream, pu2_sig_coeff_map[3]);
668
669
2.65M
    return error_status;
670
2.65M
}
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.88M
{
697
    /* error status */
698
4.88M
    IH264E_ERROR_T error_status = IH264E_SUCCESS;
699
700
    /* packed residue */
701
4.88M
    void *pv_mb_coeff_data = ps_ent_ctxt->pv_mb_coeff_data;
702
703
    /* bit stream buffer */
704
4.88M
    bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm;
705
706
    /* zero run */
707
4.88M
    UWORD8 *pu1_zero_run = ps_ent_ctxt->au1_zero_run;
708
709
    /* temp var */
710
4.88M
    UWORD32 u4_nC, u4_ngbr_avlb;
711
4.88M
    UWORD8 au1_nnz[4], *pu1_ngbr_avlb, *pu1_top_nnz, *pu1_left_nnz;
712
4.88M
    UWORD16 au2_sig_coeff_map[4] = {0};
713
4.88M
    WORD16 *pi2_res_block[4] = {NULL};
714
4.88M
    UWORD8 *pu1_slice_idx = ps_ent_ctxt->pu1_slice_idx;
715
4.88M
    tu_sblk_coeff_data_t *ps_mb_coeff_data;
716
4.88M
    ENTROPY_BLK_TYPE e_entropy_blk_type = CAVLC_LUMA_4x4;
717
718
    /* ngbr availability */
719
4.88M
    UWORD8 u1_mb_a, u1_mb_b;
720
721
    /* cbp */
722
4.88M
    UWORD32 u4_cbp_luma = u4_cbp & 0xF, u4_cbp_chroma = u4_cbp >> 4;
723
724
    /* mb indices */
725
4.88M
    WORD32 i4_mb_x, i4_mb_y;
726
727
    /* derive neighbor availability */
728
4.88M
    i4_mb_x = ps_ent_ctxt->i4_mb_x;
729
4.88M
    i4_mb_y = ps_ent_ctxt->i4_mb_y;
730
4.88M
    pu1_slice_idx += (i4_mb_y * ps_ent_ctxt->i4_wd_mbs);
731
    /* left macroblock availability */
732
4.88M
    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.88M
    u1_mb_b = (i4_mb_y == 0 ||
735
4.56M
               (pu1_slice_idx[i4_mb_x - ps_ent_ctxt->i4_wd_mbs] != pu1_slice_idx[i4_mb_x]))
736
4.88M
                  ? 0
737
4.88M
                  : 1;
738
739
4.88M
    pu1_ngbr_avlb = (void *) (&u4_ngbr_avlb);
740
4.88M
    pu1_top_nnz = ps_ent_ctxt->pu1_top_nnz_luma[ps_ent_ctxt->i4_mb_x];
741
4.88M
    pu1_left_nnz = (UWORD8 *) &ps_ent_ctxt->u4_left_nnz_luma;
742
743
    /* encode luma residue */
744
745
    /* mb type intra 16x16 */
746
4.88M
    if(u4_mb_type == I16x16)
747
2.91M
    {
748
        /* parse packed coeff data structure for residual data */
749
2.91M
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
750
2.91M
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
751
        /* estimate nnz for the current mb */
752
2.91M
        u4_nC = 0;
753
2.91M
        if(u1_mb_a) u4_nC += pu1_left_nnz[0];
754
2.91M
        if(u1_mb_b) u4_nC += pu1_top_nnz[0];
755
2.91M
        if(u1_mb_a && u1_mb_b) u4_nC = (u4_nC + 1) >> 1;
756
757
        /* encode dc block */
758
2.91M
        ENTROPY_TRACE("Luma DC blk idx %d", 0);
759
2.91M
        error_status =
760
2.91M
            isvce_write_coeff4x4_cavlc(pi2_res_block[0], au1_nnz[0], CAVLC_LUMA_4x4_DC,
761
2.91M
                                       pu1_zero_run, u4_nC, ps_bitstream, au2_sig_coeff_map[0]);
762
763
2.91M
        e_entropy_blk_type = CAVLC_LUMA_4x4_AC;
764
2.91M
    }
765
766
4.88M
    if(u4_cbp_luma & 1)
767
531k
    {
768
        /* encode ac block index 8x8 = 0*/
769
        /* parse packed coeff data structure for residual data */
770
531k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
771
531k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
772
531k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
773
531k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
774
531k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[2],
775
531k
                                   au2_sig_coeff_map[2], pi2_res_block[2]);
776
531k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[3],
777
531k
                                   au2_sig_coeff_map[3], pi2_res_block[3]);
778
        /* derive sub block neighbor availability */
779
780
531k
        pu1_ngbr_avlb[0] = (u1_mb_b << 4) | (u1_mb_a);
781
531k
        pu1_ngbr_avlb[1] = (u1_mb_b << 4) | 1;
782
531k
        pu1_ngbr_avlb[2] = (1 << 4) | (u1_mb_a);
783
531k
        pu1_ngbr_avlb[3] = 0x11;
784
        /* encode sub blk */
785
531k
        ENTROPY_TRACE("Luma blk idx %d", 0);
786
531k
        error_status =
787
531k
            isvce_write_coeff8x8_cavlc(ps_ent_ctxt, pi2_res_block, au1_nnz, au2_sig_coeff_map,
788
531k
                                       e_entropy_blk_type, u4_ngbr_avlb, pu1_top_nnz, pu1_left_nnz);
789
531k
    }
790
4.35M
    else
791
4.35M
    {
792
4.35M
        pu1_top_nnz[0] = pu1_top_nnz[1] = 0;
793
4.35M
        pu1_left_nnz[0] = pu1_left_nnz[1] = 0;
794
4.35M
    }
795
796
4.88M
    if(u4_cbp_luma & 2)
797
518k
    {
798
        /* encode ac block index 8x8 = 1*/
799
        /* parse packed coeff data structure for residual data */
800
518k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
801
518k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
802
518k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
803
518k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
804
518k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[2],
805
518k
                                   au2_sig_coeff_map[2], pi2_res_block[2]);
806
518k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[3],
807
518k
                                   au2_sig_coeff_map[3], pi2_res_block[3]);
808
809
        /* derive sub block neighbor availability */
810
518k
        pu1_ngbr_avlb[1] = pu1_ngbr_avlb[0] = (u1_mb_b << 4) | 1;
811
518k
        pu1_ngbr_avlb[3] = pu1_ngbr_avlb[2] = 0x11;
812
        /* encode sub blk */
813
518k
        ENTROPY_TRACE("Luma blk idx %d", 1);
814
518k
        error_status = isvce_write_coeff8x8_cavlc(ps_ent_ctxt, pi2_res_block, au1_nnz,
815
518k
                                                  au2_sig_coeff_map, e_entropy_blk_type,
816
518k
                                                  u4_ngbr_avlb, pu1_top_nnz + 2, pu1_left_nnz);
817
518k
    }
818
4.37M
    else
819
4.37M
    {
820
4.37M
        (pu1_top_nnz + 2)[0] = (pu1_top_nnz + 2)[1] = 0;
821
4.37M
        pu1_left_nnz[0] = pu1_left_nnz[1] = 0;
822
4.37M
    }
823
824
4.88M
    if(u4_cbp_luma & 0x4)
825
495k
    {
826
        /* encode ac block index 8x8 = 2*/
827
        /* parse packed coeff data structure for residual data */
828
495k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
829
495k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
830
495k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
831
495k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
832
495k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[2],
833
495k
                                   au2_sig_coeff_map[2], pi2_res_block[2]);
834
495k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[3],
835
495k
                                   au2_sig_coeff_map[3], pi2_res_block[3]);
836
837
        /* derive sub block neighbor availability */
838
495k
        pu1_ngbr_avlb[2] = pu1_ngbr_avlb[0] = (1 << 4) | u1_mb_a;
839
495k
        pu1_ngbr_avlb[1] = pu1_ngbr_avlb[3] = 0x11;
840
        /* encode sub blk */
841
495k
        ENTROPY_TRACE("Luma blk idx %d", 2);
842
495k
        error_status = isvce_write_coeff8x8_cavlc(ps_ent_ctxt, pi2_res_block, au1_nnz,
843
495k
                                                  au2_sig_coeff_map, e_entropy_blk_type,
844
495k
                                                  u4_ngbr_avlb, pu1_top_nnz, (pu1_left_nnz + 2));
845
495k
    }
846
4.39M
    else
847
4.39M
    {
848
4.39M
        pu1_top_nnz[0] = pu1_top_nnz[1] = 0;
849
4.39M
        (pu1_left_nnz + 2)[0] = (pu1_left_nnz + 2)[1] = 0;
850
4.39M
    }
851
852
4.88M
    if(u4_cbp_luma & 0x8)
853
490k
    {
854
        /* encode ac block index 8x8 = 3*/
855
        /* parse packed coeff data structure for residual data */
856
490k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
857
490k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
858
490k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
859
490k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
860
490k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[2],
861
490k
                                   au2_sig_coeff_map[2], pi2_res_block[2]);
862
490k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[3],
863
490k
                                   au2_sig_coeff_map[3], pi2_res_block[3]);
864
865
        /* derive sub block neighbor availability */
866
490k
        u4_ngbr_avlb = 0x11111111;
867
        /* encode sub blk */
868
490k
        ENTROPY_TRACE("Luma blk idx %d", 3);
869
490k
        error_status = isvce_write_coeff8x8_cavlc(ps_ent_ctxt, pi2_res_block, au1_nnz,
870
490k
                                                  au2_sig_coeff_map, e_entropy_blk_type,
871
490k
                                                  u4_ngbr_avlb, pu1_top_nnz + 2, pu1_left_nnz + 2);
872
490k
    }
873
4.39M
    else
874
4.39M
    {
875
4.39M
        (pu1_top_nnz + 2)[0] = (pu1_top_nnz + 2)[1] = 0;
876
4.39M
        (pu1_left_nnz + 2)[0] = (pu1_left_nnz + 2)[1] = 0;
877
4.39M
    }
878
879
    /* encode chroma residue */
880
4.88M
    if(u4_cbp_chroma & 3)
881
380k
    {
882
        /* parse packed coeff data structure for residual data */
883
        /* cb, cr */
884
380k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
885
380k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
886
380k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
887
380k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
888
889
        /* encode dc block */
890
        /* cb, cr */
891
380k
        ENTROPY_TRACE("Chroma DC blk idx %d", 0);
892
380k
        error_status =
893
380k
            isvce_write_coeff4x4_cavlc(pi2_res_block[0], au1_nnz[0], CAVLC_CHROMA_4x4_DC,
894
380k
                                       pu1_zero_run, 0, ps_bitstream, au2_sig_coeff_map[0]);
895
380k
        ENTROPY_TRACE("Chroma DC blk idx %d", 1);
896
380k
        error_status =
897
380k
            isvce_write_coeff4x4_cavlc(pi2_res_block[1], au1_nnz[1], CAVLC_CHROMA_4x4_DC,
898
380k
                                       pu1_zero_run, 0, ps_bitstream, au2_sig_coeff_map[1]);
899
380k
    }
900
901
4.88M
    pu1_top_nnz = ps_ent_ctxt->pu1_top_nnz_cbcr[ps_ent_ctxt->i4_mb_x];
902
4.88M
    pu1_left_nnz = (UWORD8 *) &ps_ent_ctxt->u4_left_nnz_cbcr;
903
904
    /* encode sub blk */
905
4.88M
    if(u4_cbp_chroma & 0x2)
906
310k
    {
907
        /* encode ac block index 8x8 = 0*/
908
        /* derive sub block neighbor availability */
909
310k
        pu1_ngbr_avlb[0] = (u1_mb_b << 4) | (u1_mb_a);
910
310k
        pu1_ngbr_avlb[1] = (u1_mb_b << 4) | 1;
911
310k
        pu1_ngbr_avlb[2] = (1 << 4) | (u1_mb_a);
912
310k
        pu1_ngbr_avlb[3] = 0x11;
913
914
        /* parse packed coeff data structure for residual data */
915
310k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
916
310k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
917
310k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
918
310k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
919
310k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[2],
920
310k
                                   au2_sig_coeff_map[2], pi2_res_block[2]);
921
310k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[3],
922
310k
                                   au2_sig_coeff_map[3], pi2_res_block[3]);
923
924
310k
        ENTROPY_TRACE("Chroma AC blk idx %d", 0);
925
310k
        error_status = isvce_write_coeff8x8_cavlc(ps_ent_ctxt, pi2_res_block, au1_nnz,
926
310k
                                                  au2_sig_coeff_map, CAVLC_CHROMA_4x4_AC,
927
310k
                                                  u4_ngbr_avlb, pu1_top_nnz, pu1_left_nnz);
928
310k
    }
929
4.57M
    else
930
4.57M
    {
931
4.57M
        pu1_top_nnz[0] = pu1_top_nnz[1] = 0;
932
4.57M
        pu1_left_nnz[0] = pu1_left_nnz[1] = 0;
933
4.57M
    }
934
935
4.88M
    pu1_top_nnz += 2;
936
4.88M
    pu1_left_nnz += 2;
937
938
    /* encode sub blk */
939
4.88M
    if(u4_cbp_chroma & 0x2)
940
310k
    {
941
        /* parse packed coeff data structure for residual data */
942
310k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[0],
943
310k
                                   au2_sig_coeff_map[0], pi2_res_block[0]);
944
310k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[1],
945
310k
                                   au2_sig_coeff_map[1], pi2_res_block[1]);
946
310k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[2],
947
310k
                                   au2_sig_coeff_map[2], pi2_res_block[2]);
948
310k
        PARSE_COEFF_DATA_BLOCK_4x4(pv_mb_coeff_data, ps_mb_coeff_data, au1_nnz[3],
949
310k
                                   au2_sig_coeff_map[3], pi2_res_block[3]);
950
951
310k
        ENTROPY_TRACE("Chroma AC blk idx %d", 1);
952
310k
        error_status = isvce_write_coeff8x8_cavlc(ps_ent_ctxt, pi2_res_block, au1_nnz,
953
310k
                                                  au2_sig_coeff_map, CAVLC_CHROMA_4x4_AC,
954
310k
                                                  u4_ngbr_avlb, pu1_top_nnz, pu1_left_nnz);
955
310k
    }
956
4.57M
    else
957
4.57M
    {
958
4.57M
        pu1_top_nnz[0] = pu1_top_nnz[1] = 0;
959
4.57M
        pu1_left_nnz[0] = pu1_left_nnz[1] = 0;
960
4.57M
    }
961
962
    /* store the index of the next mb coeff data */
963
4.88M
    ps_ent_ctxt->pv_mb_coeff_data = pv_mb_coeff_data;
964
965
4.88M
    return error_status;
966
4.88M
}
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.41M
{
991
    /* error status */
992
4.41M
    IH264E_ERROR_T error_status = IH264E_SUCCESS;
993
994
    /* bit stream ptr */
995
4.41M
    bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm;
996
997
    /* packed header data */
998
4.41M
    UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
999
4.41M
    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.41M
    WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode;
1011
4.41M
    WORD8 mb_qp_delta;
1012
1013
    /* temp var */
1014
4.41M
    WORD32 i, mb_type_stream;
1015
1016
4.41M
    WORD32 bitstream_start_offset, bitstream_end_offset;
1017
1018
4.41M
    svc_slice_header_t *ps_svc_slice_header =
1019
4.41M
        ps_ent_ctxt->ps_svc_slice_hdr_base +
1020
4.41M
        (ps_ent_ctxt->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT);
1021
1022
    /* Starting bitstream offset for header in bits */
1023
4.41M
    bitstream_start_offset = isvce_get_num_bits(ps_bitstream);
1024
1025
    /********************************************************************/
1026
    /*                    BEGIN HEADER GENERATION                       */
1027
    /********************************************************************/
1028
1029
4.41M
    if(ps_ent_ctxt->u1_spatial_layer_id && ps_svc_slice_header->i1_adaptive_base_mode_flag)
1030
3.08M
    {
1031
        /* write base_mode_flag */
1032
3.08M
        PUT_BITS(ps_bitstream, ps_mb_hdr->u1_base_mode_flag, 1, error_status, "base_mode_flag");
1033
3.08M
    }
1034
1.32M
    else
1035
1.32M
    {
1036
1.32M
        ps_mb_hdr->u1_base_mode_flag = 0;
1037
1.32M
    }
1038
1039
    /* mb header info */
1040
4.41M
    mb_tpm = ps_mb_hdr->u1_mb_type_mode;
1041
4.41M
    cbp = ps_mb_hdr->u1_cbp;
1042
4.41M
    mb_qp_delta =
1043
4.41M
        ((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.41M
    mb_type = mb_tpm & 0xF;
1047
    /* is intra ? */
1048
4.41M
    if(!ps_mb_hdr->u1_base_mode_flag)
1049
3.11M
    {
1050
3.11M
        if(mb_type == I16x16)
1051
2.79M
        {
1052
2.79M
            UWORD32 u4_cbp_l, u4_cbp_c;
1053
1054
2.79M
            u4_cbp_c = (cbp >> 4);
1055
2.79M
            u4_cbp_l = (cbp & 0xF);
1056
2.79M
            luma_intra_mode = (mb_tpm >> 4) & 3;
1057
2.79M
            chroma_intra_mode = (mb_tpm >> 6);
1058
1059
2.79M
            mb_type_stream = luma_intra_mode + 1 + (u4_cbp_c << 2) + (u4_cbp_l == 15) * 12;
1060
1061
            /* write mb type */
1062
2.79M
            PUT_BITS_UEV(ps_bitstream, mb_type_stream, error_status, "mb type");
1063
1064
            /* intra_chroma_pred_mode */
1065
2.79M
            PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
1066
1067
2.79M
            pu1_byte += sizeof(isvce_mb_hdr_i16x16_t);
1068
2.79M
        }
1069
314k
        else if(mb_type == I4x4)
1070
314k
        {
1071
314k
            isvce_mb_hdr_i4x4_t *ps_mb_hdr_i4x4 =
1072
314k
                (isvce_mb_hdr_i4x4_t *) ps_ent_ctxt->pv_mb_header_data;
1073
1074
            /* mb sub blk modes */
1075
314k
            WORD32 intra_pred_mode_flag, rem_intra_mode;
1076
314k
            WORD32 byte;
1077
1078
314k
            chroma_intra_mode = (mb_tpm >> 6);
1079
1080
            /* write mb type */
1081
314k
            PUT_BITS_UEV(ps_bitstream, 0, error_status, "mb type");
1082
1083
2.83M
            for(i = 0; i < 16; i += 2)
1084
2.51M
            {
1085
                /* sub blk idx 1 */
1086
2.51M
                byte = ps_mb_hdr_i4x4->au1_sub_blk_modes[i >> 1];
1087
1088
2.51M
                intra_pred_mode_flag = byte & 0x1;
1089
1090
                /* prev_intra4x4_pred_mode_flag */
1091
2.51M
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1092
2.51M
                         "prev_intra4x4_pred_mode_flag");
1093
1094
                /* rem_intra4x4_pred_mode */
1095
2.51M
                if(!intra_pred_mode_flag)
1096
488k
                {
1097
488k
                    rem_intra_mode = (byte & 0xF) >> 1;
1098
488k
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1099
488k
                             "rem_intra4x4_pred_mode");
1100
488k
                }
1101
1102
                /* sub blk idx 2 */
1103
2.51M
                byte >>= 4;
1104
1105
2.51M
                intra_pred_mode_flag = byte & 0x1;
1106
1107
                /* prev_intra4x4_pred_mode_flag */
1108
2.51M
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1109
2.51M
                         "prev_intra4x4_pred_mode_flag");
1110
1111
                /* rem_intra4x4_pred_mode */
1112
2.51M
                if(!intra_pred_mode_flag)
1113
478k
                {
1114
478k
                    rem_intra_mode = (byte & 0xF) >> 1;
1115
478k
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1116
478k
                             "rem_intra4x4_pred_mode");
1117
478k
                }
1118
2.51M
            }
1119
1120
            /* intra_chroma_pred_mode */
1121
314k
            PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
1122
1123
314k
            pu1_byte += sizeof(isvce_mb_hdr_i4x4_t);
1124
314k
        }
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.11M
    }
1191
1.30M
    else
1192
1.30M
    {
1193
1.30M
        pu1_byte += sizeof(isvce_mb_hdr_base_mode_t);
1194
1.30M
    }
1195
1196
    /* coded_block_pattern */
1197
4.41M
    if(ps_mb_hdr->u1_base_mode_flag || mb_type != I16x16)
1198
1.61M
    {
1199
1.61M
        PUT_BITS_UEV(ps_bitstream, gu1_cbp_map_tables[cbp][ps_mb_hdr->u1_base_mode_flag],
1200
1.61M
                     error_status, "coded_block_pattern");
1201
1202
1.61M
        if(cbp % 16 > 0 && ps_ent_ctxt->i1_transform_8x8_mode_flag &&
1203
0
           (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.61M
    }
1209
1210
4.41M
    if((cbp > 0) || (mb_type == I16x16))
1211
3.07M
    {
1212
        /* mb_qp_delta */
1213
3.07M
        PUT_BITS_SEV(ps_bitstream, mb_qp_delta, error_status, "mb_qp_delta");
1214
3.07M
        ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp = ps_mb_hdr->u1_mb_qp;
1215
3.07M
    }
1216
1217
    /* Ending bitstream offset for header in bits */
1218
4.41M
    bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1219
1220
4.41M
    ps_ent_ctxt->u4_header_bits[0] += bitstream_end_offset - bitstream_start_offset;
1221
1222
    /* Starting bitstream offset for residue */
1223
4.41M
    bitstream_start_offset = bitstream_end_offset;
1224
1225
    /* residual */
1226
4.41M
    error_status = isvce_encode_residue(ps_ent_ctxt, mb_type, cbp);
1227
1228
    /* Ending bitstream offset for reside in bits */
1229
4.41M
    bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1230
4.41M
    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.41M
    ps_ent_ctxt->pv_mb_header_data = pu1_byte;
1234
1235
4.41M
    return error_status;
1236
4.41M
}
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
473k
{
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
473k
    WORD32 mb_tpm, mb_type, cbp, chroma_intra_mode, luma_intra_mode;
1273
473k
    WORD8 mb_qp_delta;
1274
473k
    WORD32 i, mb_type_stream;
1275
473k
    WORD32 bitstream_start_offset, bitstream_end_offset;
1276
473k
    UWORD8 u1_is_intra_mb;
1277
1278
473k
    bitstrm_t *ps_bitstream = ps_ent_ctxt->ps_bitstrm;
1279
473k
    isvce_mb_hdr_common_t *ps_mb_hdr = (isvce_mb_hdr_common_t *) ps_ent_ctxt->pv_mb_header_data;
1280
473k
    svc_slice_header_t *ps_svc_slice_header =
1281
473k
        ps_ent_ctxt->ps_svc_slice_hdr_base +
1282
473k
        (ps_ent_ctxt->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT);
1283
1284
473k
    IH264E_ERROR_T error_status = IH264E_SUCCESS;
1285
1286
473k
    UWORD8 *pu1_byte = ps_ent_ctxt->pv_mb_header_data;
1287
473k
    WORD32 cbptable = 1;
1288
473k
    WORD32 is_inter = 0;
1289
1290
    /* Starting bitstream offset for header in bits */
1291
473k
    bitstream_start_offset = isvce_get_num_bits(ps_bitstream);
1292
1293
    /********************************************************************/
1294
    /*                    BEGIN HEADER GENERATION                       */
1295
    /********************************************************************/
1296
1297
    /* mb header info */
1298
473k
    mb_tpm = ps_mb_hdr->u1_mb_type_mode;
1299
1300
    /* mb type */
1301
473k
    mb_type = mb_tpm & 0xF;
1302
473k
    u1_is_intra_mb = (mb_type == I16x16) || (mb_type == I8x8) || (mb_type == I4x4);
1303
1304
    /* check for skip */
1305
473k
    if(mb_type == PSKIP)
1306
112k
    {
1307
112k
        UWORD32 *nnz;
1308
1309
112k
        is_inter = 1;
1310
1311
        /* increment skip counter */
1312
112k
        (*ps_ent_ctxt->pi4_mb_skip_run)++;
1313
1314
        /* store the index of the next mb syntax layer */
1315
112k
        pu1_byte += sizeof(isvce_mb_hdr_pskip_t);
1316
112k
        ps_ent_ctxt->pv_mb_header_data = pu1_byte;
1317
1318
        /* set nnz to zero */
1319
112k
        ps_ent_ctxt->u4_left_nnz_luma = 0;
1320
112k
        nnz = (UWORD32 *) ps_ent_ctxt->pu1_top_nnz_luma[ps_ent_ctxt->i4_mb_x];
1321
112k
        *nnz = 0;
1322
112k
        ps_ent_ctxt->u4_left_nnz_cbcr = 0;
1323
112k
        nnz = (UWORD32 *) ps_ent_ctxt->pu1_top_nnz_cbcr[ps_ent_ctxt->i4_mb_x];
1324
112k
        *nnz = 0;
1325
1326
        /* residual */
1327
112k
        error_status = isvce_encode_residue(ps_ent_ctxt, P16x16, 0);
1328
1329
112k
        bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1330
1331
112k
        ps_ent_ctxt->u4_header_bits[is_inter] += bitstream_end_offset - bitstream_start_offset;
1332
1333
112k
        return error_status;
1334
112k
    }
1335
1336
    /* remaining mb header info */
1337
360k
    cbp = ps_mb_hdr->u1_cbp;
1338
360k
    mb_qp_delta =
1339
360k
        ((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
360k
    PUT_BITS_UEV(ps_bitstream, *ps_ent_ctxt->pi4_mb_skip_run, error_status, "mb skip run");
1343
1344
    /* reset skip counter */
1345
360k
    *ps_ent_ctxt->pi4_mb_skip_run = 0;
1346
1347
360k
    if(ps_ent_ctxt->u1_spatial_layer_id && ps_svc_slice_header->i1_adaptive_base_mode_flag)
1348
222k
    {
1349
        /* write base_mode_flag */
1350
222k
        PUT_BITS(ps_bitstream, ps_mb_hdr->u1_base_mode_flag, 1, error_status, "base_mode_flag");
1351
222k
    }
1352
138k
    else
1353
138k
    {
1354
138k
        ps_mb_hdr->u1_base_mode_flag = 0;
1355
138k
    }
1356
1357
360k
    if(!ps_mb_hdr->u1_base_mode_flag)
1358
348k
    {
1359
        /* is intra ? */
1360
348k
        if(mb_type == I16x16)
1361
116k
        {
1362
116k
            UWORD32 u4_cbp_l, u4_cbp_c;
1363
1364
116k
            is_inter = 0;
1365
1366
116k
            u4_cbp_c = (cbp >> 4);
1367
116k
            u4_cbp_l = (cbp & 0xF);
1368
116k
            luma_intra_mode = (mb_tpm >> 4) & 3;
1369
116k
            chroma_intra_mode = (mb_tpm >> 6);
1370
1371
116k
            mb_type_stream = luma_intra_mode + 1 + (u4_cbp_c << 2) + (u4_cbp_l == 15) * 12;
1372
1373
116k
            mb_type_stream += 5;
1374
1375
            /* write mb type */
1376
116k
            PUT_BITS_UEV(ps_bitstream, mb_type_stream, error_status, "mb type");
1377
1378
            /* intra_chroma_pred_mode */
1379
116k
            PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
1380
116k
            pu1_byte += sizeof(isvce_mb_hdr_i16x16_t);
1381
116k
        }
1382
232k
        else if(mb_type == I4x4)
1383
24.4k
        {
1384
24.4k
            isvce_mb_hdr_i4x4_t *ps_mb_hdr_i4x4 =
1385
24.4k
                (isvce_mb_hdr_i4x4_t *) ps_ent_ctxt->pv_mb_header_data;
1386
1387
            /* mb sub blk modes */
1388
24.4k
            WORD32 intra_pred_mode_flag, rem_intra_mode;
1389
24.4k
            WORD32 byte;
1390
1391
24.4k
            is_inter = 0;
1392
1393
24.4k
            chroma_intra_mode = (mb_tpm >> 6);
1394
24.4k
            cbptable = 0;
1395
1396
            /* write mb type */
1397
24.4k
            PUT_BITS_UEV(ps_bitstream, 5, error_status, "mb type");
1398
1399
220k
            for(i = 0; i < 16; i += 2)
1400
195k
            {
1401
                /* sub blk idx 1 */
1402
195k
                byte = ps_mb_hdr_i4x4->au1_sub_blk_modes[i >> 1];
1403
1404
195k
                intra_pred_mode_flag = byte & 0x1;
1405
1406
                /* prev_intra4x4_pred_mode_flag */
1407
195k
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1408
195k
                         "prev_intra4x4_pred_mode_flag");
1409
1410
                /* rem_intra4x4_pred_mode */
1411
195k
                if(!intra_pred_mode_flag)
1412
71.4k
                {
1413
71.4k
                    rem_intra_mode = (byte & 0xF) >> 1;
1414
71.4k
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1415
71.4k
                             "rem_intra4x4_pred_mode");
1416
71.4k
                }
1417
1418
                /* sub blk idx 2 */
1419
195k
                byte >>= 4;
1420
1421
195k
                intra_pred_mode_flag = byte & 0x1;
1422
1423
                /* prev_intra4x4_pred_mode_flag */
1424
195k
                PUT_BITS(ps_bitstream, intra_pred_mode_flag, 1, error_status,
1425
195k
                         "prev_intra4x4_pred_mode_flag");
1426
1427
                /* rem_intra4x4_pred_mode */
1428
195k
                if(!intra_pred_mode_flag)
1429
45.4k
                {
1430
45.4k
                    rem_intra_mode = (byte & 0xF) >> 1;
1431
45.4k
                    PUT_BITS(ps_bitstream, rem_intra_mode, 3, error_status,
1432
45.4k
                             "rem_intra4x4_pred_mode");
1433
45.4k
                }
1434
195k
            }
1435
1436
            /* intra_chroma_pred_mode */
1437
24.4k
            PUT_BITS_UEV(ps_bitstream, chroma_intra_mode, error_status, "intra_chroma_pred_mode");
1438
1439
24.4k
            pu1_byte += sizeof(isvce_mb_hdr_i4x4_t);
1440
24.4k
        }
1441
207k
        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
207k
        else
1511
207k
        {
1512
207k
            isvce_mb_hdr_p16x16_t *ps_mb_hdr_p16x16 =
1513
207k
                (isvce_mb_hdr_p16x16_t *) ps_ent_ctxt->pv_mb_header_data;
1514
1515
            /* inter macro block partition cnt */
1516
207k
            const UWORD8 au1_part_cnt[] = {1, 2, 2, 4};
1517
1518
            /* mv ptr */
1519
207k
            WORD16 *pi2_mv_ptr = (WORD16 *) ps_mb_hdr_p16x16->ai2_mvd;
1520
1521
            /* number of partitions for the current mb */
1522
207k
            UWORD32 u4_part_cnt = au1_part_cnt[mb_type - 3];
1523
1524
207k
            is_inter = 1;
1525
1526
            /* write mb type */
1527
207k
            PUT_BITS_UEV(ps_bitstream, mb_type - 3, error_status, "mb type");
1528
1529
415k
            for(i = 0; i < (WORD32) u4_part_cnt; i++)
1530
207k
            {
1531
207k
                if(ps_ent_ctxt->u1_spatial_layer_id &&
1532
92.7k
                   ps_svc_slice_header->i1_adaptive_motion_prediction_flag)
1533
92.7k
                {
1534
92.7k
                    PUT_BITS(ps_bitstream, ps_mb_hdr_p16x16->u1_mvp_idx, 1, error_status,
1535
92.7k
                             "motion_prediction_flag_l0");
1536
92.7k
                }
1537
207k
            }
1538
1539
415k
            for(i = 0; i < (WORD32) u4_part_cnt; i++)
1540
207k
            {
1541
207k
                PUT_BITS_SEV(ps_bitstream, pi2_mv_ptr[i], error_status, "mv x");
1542
207k
                PUT_BITS_SEV(ps_bitstream, pi2_mv_ptr[i + 1], error_status, "mv y");
1543
207k
            }
1544
1545
207k
            pu1_byte += sizeof(isvce_mb_hdr_p16x16_t);
1546
207k
        }
1547
348k
    }
1548
12.5k
    else
1549
12.5k
    {
1550
12.5k
        pu1_byte += sizeof(isvce_mb_hdr_base_mode_t);
1551
12.5k
    }
1552
1553
360k
    if(ps_ent_ctxt->u1_spatial_layer_id &&
1554
222k
       ps_svc_slice_header->i1_adaptive_residual_prediction_flag &&
1555
222k
       !ps_ent_ctxt
1556
222k
            ->ps_svc_nalu_ext_base[1 + (ps_ent_ctxt->i4_cur_slice_idx % SVC_MAX_SLICE_HDR_CNT)]
1557
222k
            .u1_idr_flag &&
1558
222k
       (ps_mb_hdr->u1_base_mode_flag || !u1_is_intra_mb))
1559
105k
    {
1560
105k
        PUT_BITS(ps_bitstream, ps_mb_hdr->u1_residual_prediction_flag, 1, error_status,
1561
105k
                 "residual_prediction_flag");
1562
105k
    }
1563
1564
    /* coded_block_pattern */
1565
360k
    if(ps_mb_hdr->u1_base_mode_flag || (mb_type != I16x16))
1566
244k
    {
1567
244k
        PUT_BITS_UEV(ps_bitstream, gu1_cbp_map_tables[cbp][cbptable], error_status,
1568
244k
                     "coded_block_pattern");
1569
244k
    }
1570
1571
360k
    if((cbp > 0) || (mb_type == I16x16))
1572
336k
    {
1573
        /* mb_qp_delta */
1574
336k
        PUT_BITS_SEV(ps_bitstream, mb_qp_delta, error_status, "mb_qp_delta");
1575
336k
        ps_ent_ctxt->ps_mb_qp_ctxt->u1_cur_mb_qp = ps_mb_hdr->u1_mb_qp;
1576
336k
    }
1577
1578
    /* Ending bitstream offset for header in bits */
1579
360k
    bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1580
1581
360k
    ps_ent_ctxt->u4_header_bits[is_inter] += bitstream_end_offset - bitstream_start_offset;
1582
1583
    /* start bitstream offset for residue in bits */
1584
360k
    bitstream_start_offset = bitstream_end_offset;
1585
1586
    /* residual */
1587
360k
    error_status = isvce_encode_residue(ps_ent_ctxt, mb_type, cbp);
1588
1589
    /* Ending bitstream offset for residue in bits */
1590
360k
    bitstream_end_offset = isvce_get_num_bits(ps_bitstream);
1591
1592
360k
    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
360k
    ps_ent_ctxt->pv_mb_header_data = pu1_byte;
1596
1597
360k
    return error_status;
1598
360k
}
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
14.2k
{
2002
14.2k
    WORD32 i4_mb_skip_run;
2003
2004
14.2k
    bitstrm_t *ps_bitstrm = ps_entropy->ps_bitstrm;
2005
14.2k
    bitstrm_t *ps_bitstrm_after_slice_hdr = ps_entropy->ps_bitstrm_after_slice_hdr;
2006
2007
14.2k
    ps_bitstrm->i4_bits_left_in_cw = ps_bitstrm_after_slice_hdr->i4_bits_left_in_cw;
2008
14.2k
    ps_bitstrm->u4_cur_word = ps_bitstrm_after_slice_hdr->u4_cur_word;
2009
14.2k
    ps_bitstrm->u4_strm_buf_offset = ps_bitstrm_after_slice_hdr->u4_strm_buf_offset;
2010
14.2k
    ps_bitstrm->i4_zero_bytes_run = ps_bitstrm_after_slice_hdr->i4_zero_bytes_run;
2011
2012
    /* mb skip run */
2013
14.2k
    i4_mb_skip_run = ps_entropy->i4_wd_mbs * ps_entropy->i4_ht_mbs;
2014
14.2k
    PUT_BITS_UEV(ps_bitstrm, i4_mb_skip_run, ps_entropy->i4_error_code, "mb skip run");
2015
2016
    /* put rbsp trailing bits */
2017
14.2k
    ps_entropy->i4_error_code = ih264e_put_rbsp_trailing_bits(ps_bitstrm);
2018
2019
14.2k
    return ps_entropy->i4_error_code;
2020
14.2k
}
2021
#endif