Coverage Report

Created: 2026-01-09 06:18

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