Home | History | Annotate | Download | only in encoder
      1 /******************************************************************************
      2  *
      3  * Copyright (C) 2018 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 ihevce_encode_header.c
     24 *
     25 * @brief
     26 *   This file contains function definitions related to header encoding
     27 *
     28 * @author
     29 *   Ittiam
     30 *
     31 * List of Functions
     32 *   ihevce_generate_nal_unit_header
     33 *   ihevce_generate_when_profile_present
     34 *   ihevce_generate_profile_tier_level
     35 *   ihevce_short_term_ref_pic_set
     36 *   ihevce_generate_bit_rate_pic_rate_info
     37 *   ihevce_generate_aud
     38 *   ihevce_generate_eos
     39 *   ihevce_generate_vps
     40 *   ihevce_generate_sps
     41 *   ihevce_generate_pps
     42 *   ihevce_generate_slice_header
     43 *   ihevce_populate_vps
     44 *   ihevce_populate_sps
     45 *   ihevce_populate_pps
     46 *   ihevce_populate_slice_header
     47 *   ihevce_insert_entry_offset_slice_header
     48 *
     49 ******************************************************************************
     50 */
     51 
     52 /*****************************************************************************/
     53 /* File Includes                                                             */
     54 /*****************************************************************************/
     55 /* System include files */
     56 #include <stdio.h>
     57 #include <string.h>
     58 #include <stdlib.h>
     59 #include <assert.h>
     60 #include <stdarg.h>
     61 #include <math.h>
     62 
     63 /* User include files */
     64 #include "ihevc_typedefs.h"
     65 #include "itt_video_api.h"
     66 #include "ihevce_api.h"
     67 
     68 #include "rc_cntrl_param.h"
     69 #include "rc_frame_info_collector.h"
     70 #include "rc_look_ahead_params.h"
     71 
     72 #include "ihevc_defs.h"
     73 #include "ihevc_macros.h"
     74 #include "ihevc_debug.h"
     75 #include "ihevc_structs.h"
     76 #include "ihevc_platform_macros.h"
     77 #include "ihevc_deblk.h"
     78 #include "ihevc_itrans_recon.h"
     79 #include "ihevc_chroma_itrans_recon.h"
     80 #include "ihevc_chroma_intra_pred.h"
     81 #include "ihevc_intra_pred.h"
     82 #include "ihevc_inter_pred.h"
     83 #include "ihevc_mem_fns.h"
     84 #include "ihevc_padding.h"
     85 #include "ihevc_weighted_pred.h"
     86 #include "ihevc_sao.h"
     87 #include "ihevc_resi_trans.h"
     88 #include "ihevc_quant_iquant_ssd.h"
     89 #include "ihevc_cabac_tables.h"
     90 #include "ihevc_trans_tables.h"
     91 #include "ihevc_trans_macros.h"
     92 
     93 #include "ihevce_defs.h"
     94 #include "ihevce_lap_enc_structs.h"
     95 #include "ihevce_multi_thrd_structs.h"
     96 #include "ihevce_multi_thrd_funcs.h"
     97 #include "ihevce_me_common_defs.h"
     98 #include "ihevce_had_satd.h"
     99 #include "ihevce_error_codes.h"
    100 #include "ihevce_error_checks.h"
    101 #include "ihevce_bitstream.h"
    102 #include "ihevce_cabac.h"
    103 #include "ihevce_rdoq_macros.h"
    104 #include "ihevce_function_selector.h"
    105 #include "ihevce_enc_structs.h"
    106 #include "ihevce_global_tables.h"
    107 #include "ihevce_encode_header.h"
    108 #include "ihevce_encode_header_sei_vui.h"
    109 #include "ihevce_trace.h"
    110 
    111 /*****************************************************************************/
    112 /* Constant Macros                                                           */
    113 /*****************************************************************************/
    114 #define CU_LEVEL_QP_LIMIT_8x8 3
    115 #define CU_LEVEL_QP_LIMIT_16x16 2
    116 #define CU_LEVEL_QP_LIMIT_32x32 1
    117 
    118 /*****************************************************************************/
    119 /* Function Definitions                                                      */
    120 /*****************************************************************************/
    121 
    122 /**
    123 ******************************************************************************
    124 *
    125 *  @brief Generate nal unit header in the stream as per section 7.3.1.2
    126 *
    127 *  @par   Description
    128 *  Inserts the nal type and temporal id plus 1 as per section 7.3.1.2 Nal unit
    129 *  header syntax
    130 *
    131 *  @param[inout]   ps_bitstrm
    132 *  pointer to bitstream context (handle)
    133 *
    134 *  @param[in]   nal_unit_type
    135 *  nal type to be inserted
    136 *
    137 *  @param[in]   temporal id
    138 *  temporal id to be inserted
    139 *
    140 *  @return      success or failure error code
    141 *
    142 ******************************************************************************
    143 */
    144 WORD32 ihevce_generate_nal_unit_header(
    145     bitstrm_t *ps_bitstrm, WORD32 nal_unit_type, WORD32 nuh_temporal_id)
    146 {
    147     WORD32 return_status = IHEVCE_SUCCESS;
    148 
    149     /* sanity checks */
    150     ASSERT((nal_unit_type >= 0) && (nal_unit_type < 64));
    151     ASSERT((nuh_temporal_id >= 0) && (nuh_temporal_id < 7));
    152 
    153     /* forbidden_zero_bit + nal_unit_type */
    154     PUT_BITS(
    155         ps_bitstrm,
    156         nal_unit_type,
    157         (1 + 6), /*extra 1 is for forbidden zero bit */
    158         return_status);
    159 
    160     /* nuh_reserved_zero_6bits */
    161     PUT_BITS(ps_bitstrm, 0, 6, return_status);
    162 
    163     /* nuh_temporal_id_plus1 */
    164     PUT_BITS(ps_bitstrm, (nuh_temporal_id + 1), 3, return_status);
    165 
    166     return (return_status);
    167 }
    168 
    169 /**
    170 ******************************************************************************
    171 *
    172 *  @brief Generates fields related to Profile, Tier and Level data.
    173 *
    174 *  @par   Description
    175 *  Generates fields related to Profile, Tier and Level data.
    176 *  Called when profile_present flag is 1
    177 *
    178 *  @param[in]   ps_bitstrm
    179 *  pointer to bitstream context (handle)
    180 *
    181 *  @param[in]   ps_ptl
    182 *  pointer to structure containing Profile, Tier and Level data data
    183 *
    184 *  @return      success or failure error code
    185 *
    186 ******************************************************************************
    187 */
    188 static WORD32
    189     ihevce_generate_when_profile_present(bitstrm_t *ps_bitstrm, profile_tier_lvl_t *ps_ptl)
    190 {
    191     WORD32 return_status = IHEVCE_SUCCESS;
    192     WORD32 i;
    193 
    194     /* XXX_profile_space[] */
    195     PUT_BITS(ps_bitstrm, ps_ptl->i1_profile_space, 2, return_status);
    196     ENTROPY_TRACE("XXX_profile_space[]", ps_ptl->i1_profile_space);
    197 
    198     /* XXX_tier_flag[] */
    199     PUT_BITS(ps_bitstrm, ps_ptl->i1_tier_flag, 1, return_status);
    200     ENTROPY_TRACE("XXX_tier_flag[]", ps_ptl->i1_tier_flag);
    201 
    202     /* XXX_profile_idc[] */
    203     PUT_BITS(ps_bitstrm, ps_ptl->i1_profile_idc, 5, return_status);
    204     ENTROPY_TRACE("XXX_profile_idc[]", ps_ptl->i1_profile_idc);
    205 
    206     for(i = 0; i < MAX_PROFILE_COMPATBLTY; i++)
    207     {
    208         /* XXX_profile_compatibility_flag[][j] */
    209         PUT_BITS(ps_bitstrm, ps_ptl->ai1_profile_compatibility_flag[i], 1, return_status);
    210         ENTROPY_TRACE(
    211             "XXX_profile_compatibility_flag[][j]", ps_ptl->ai1_profile_compatibility_flag[i]);
    212     }
    213 
    214     /* XXX_progressive_source_flag[] */
    215     PUT_BITS(ps_bitstrm, ps_ptl->i1_general_progressive_source_flag, 1, return_status);
    216     ENTROPY_TRACE("XXX_progressive_source_flag[]", ps_ptl->i1_general_progressive_source_flag);
    217 
    218     /* XXX_interlaced_source_flag[] */
    219     PUT_BITS(ps_bitstrm, ps_ptl->i1_general_interlaced_source_flag, 1, return_status);
    220     ENTROPY_TRACE("XXX_interlaced_source_flag[]", ps_ptl->i1_general_interlaced_source_flag);
    221 
    222     /* XXX_non_packed_constraint_flag[] */
    223     PUT_BITS(ps_bitstrm, ps_ptl->i1_general_non_packed_constraint_flag, 1, return_status);
    224     ENTROPY_TRACE(
    225         "XXX_non_packed_constraint_flag[]", ps_ptl->i1_general_non_packed_constraint_flag);
    226 
    227     /* XXX_frame_only_constraint_flag[] */
    228     PUT_BITS(ps_bitstrm, ps_ptl->i1_frame_only_constraint_flag, 1, return_status);
    229     ENTROPY_TRACE("XXX_frame_only_constraint_flag[]", ps_ptl->i1_frame_only_constraint_flag);
    230 
    231     /* XXX_general_max_12bit_constraint_flag[] */
    232     PUT_BITS(ps_bitstrm, ps_ptl->i1_general_max_12bit_constraint_flag, 1, return_status);
    233     ENTROPY_TRACE(
    234         "XXX_general_max_12bit_constraint_flag[]", ps_ptl->i1_general_max_12bit_constraint_flag);
    235 
    236     /* XXX_general_max_10bit_constraint_flag[] */
    237     PUT_BITS(ps_bitstrm, ps_ptl->i1_general_max_10bit_constraint_flag, 1, return_status);
    238     ENTROPY_TRACE(
    239         "XXX_general_max_10bit_constraint_flag[]", ps_ptl->i1_general_max_10bit_constraint_flag);
    240 
    241     /* XXX_general_max_8bit_constraint_flag[] */
    242     PUT_BITS(ps_bitstrm, ps_ptl->i1_general_max_8bit_constraint_flag, 1, return_status);
    243     ENTROPY_TRACE(
    244         "XXX_general_max_8bit_constraint_flag[]", ps_ptl->i1_general_max_8bit_constraint_flag);
    245 
    246     /* XXX_general_max_422chroma_constraint_flag[] */
    247     PUT_BITS(ps_bitstrm, ps_ptl->i1_general_max_422chroma_constraint_flag, 1, return_status);
    248     ENTROPY_TRACE(
    249         "XXX_general_max_422chroma_constraint_flag[]",
    250         ps_ptl->i1_general_max_422chroma_constraint_flag);
    251 
    252     /* XXX_general_max_420chroma_constraint_flag[] */
    253     PUT_BITS(ps_bitstrm, ps_ptl->i1_general_max_420chroma_constraint_flag, 1, return_status);
    254     ENTROPY_TRACE(
    255         "XXX_general_max_420chroma_constraint_flag[]",
    256         ps_ptl->i1_general_max_420chroma_constraint_flag);
    257 
    258     /* XXX_general_max_monochrome_constraint_flag[] */
    259     PUT_BITS(ps_bitstrm, ps_ptl->i1_general_max_monochrome_constraint_flag, 1, return_status);
    260     ENTROPY_TRACE(
    261         "XXX_general_max_monochrome_constraint_flag[]",
    262         ps_ptl->i1_general_max_monochrome_constraint_flag);
    263 
    264     /* XXX_general_intra_constraint_flag[] */
    265     PUT_BITS(ps_bitstrm, ps_ptl->i1_general_intra_constraint_flag, 1, return_status);
    266     ENTROPY_TRACE("XXX_general_intra_constraint_flag[]", ps_ptl->i1_general_intra_constraint_flag);
    267 
    268     /* XXX_general_one_picture_only_constraint_flag[] */
    269     PUT_BITS(ps_bitstrm, ps_ptl->i1_general_one_picture_only_constraint_flag, 1, return_status);
    270     ENTROPY_TRACE(
    271         "XXX_general_one_picture_only_constraint_flag[]",
    272         ps_ptl->i1_general_one_picture_only_constraint_flag);
    273 
    274     /* XXX_general_lower_bit_rate_constraint_flag[] */
    275     PUT_BITS(ps_bitstrm, ps_ptl->i1_general_lower_bit_rate_constraint_flag, 1, return_status);
    276     ENTROPY_TRACE(
    277         "XXX_general_lower_bit_rate_constraint_flag[]",
    278         ps_ptl->i1_general_lower_bit_rate_constraint_flag);
    279 
    280     /* XXX_reserved_zero_35bits[] */
    281     PUT_BITS(ps_bitstrm, 0, 16, return_status);
    282     PUT_BITS(ps_bitstrm, 0, 16, return_status);
    283     PUT_BITS(ps_bitstrm, 0, 3, return_status);
    284     ENTROPY_TRACE("XXX_reserved_zero_35bits[]", 0);
    285 
    286     return return_status;
    287 }
    288 
    289 /**
    290 ******************************************************************************
    291 *
    292 *  @brief Generates Profile, Tier and Level data
    293 *
    294 *  @par   Description
    295 *  Generates Profile, Tier and Level data as per Section 7.3.3
    296 *
    297 *  @param[in]   ps_bitstrm
    298 *  pointer to bitstream context (handle)
    299 *
    300 *  @param[in]   ps_ptl
    301 *  pointer to structure containing Profile, Tier and Level data data
    302 *
    303 *  @param[in]   i1_profile_present_flag
    304 *  flag that indicates whether profile-related data is present
    305 *
    306 *  @param[in]   i1_vps_max_sub_layers_minus1
    307 *  (Maximum number of sub_layers present) minus 1
    308 *
    309 *  @return      success or failure error code
    310 *
    311 ******************************************************************************
    312 */
    313 static WORD32 ihevce_generate_profile_tier_level(
    314     bitstrm_t *ps_bitstrm,
    315     profile_tier_lvl_info_t *ps_ptl,
    316     WORD8 i1_profile_present_flag,
    317     WORD8 i1_max_sub_layers_minus1)
    318 {
    319     WORD32 i;
    320     WORD32 return_status = IHEVCE_SUCCESS;
    321 
    322     if(i1_profile_present_flag)
    323     {
    324         ihevce_generate_when_profile_present(ps_bitstrm, &ps_ptl->s_ptl_gen);
    325     }
    326 
    327     /* general_level_idc */
    328     PUT_BITS(ps_bitstrm, ps_ptl->s_ptl_gen.u1_level_idc, 8, return_status);
    329     ENTROPY_TRACE("general_level_idc", ps_ptl->s_ptl_gen.u1_level_idc);
    330 
    331     for(i = 0; i < i1_max_sub_layers_minus1; i++)
    332     {
    333         /* sub_layer_profile_present_flag[i] */
    334         PUT_BITS(ps_bitstrm, ps_ptl->ai1_sub_layer_profile_present_flag[i], 1, return_status);
    335         ENTROPY_TRACE(
    336             "sub_layer_profile_present_flag[i]", ps_ptl->ai1_sub_layer_profile_present_flag[i]);
    337 
    338         /* sub_layer_level_present_flag[i] */
    339         PUT_BITS(ps_bitstrm, ps_ptl->ai1_sub_layer_level_present_flag[i], 1, return_status);
    340         ENTROPY_TRACE(
    341             "sub_layer_level_present_flag[i]", ps_ptl->ai1_sub_layer_level_present_flag[i]);
    342     }
    343 
    344     if(i1_max_sub_layers_minus1 > 0)
    345     {
    346         for(i = i1_max_sub_layers_minus1; i < 8; i++)
    347         {
    348             /* reserved_zero_2bits[i] */
    349             PUT_BITS(ps_bitstrm, 0, 2, return_status);
    350             ENTROPY_TRACE("reserved_zero_2bits[i]", 0);
    351         }
    352     }
    353 
    354     for(i = 0; i < i1_max_sub_layers_minus1; i++)
    355     {
    356         if(ps_ptl->ai1_sub_layer_profile_present_flag[i])
    357         {
    358             ihevce_generate_when_profile_present(ps_bitstrm, &ps_ptl->as_ptl_sub[i]);
    359         }
    360 
    361         if(ps_ptl->ai1_sub_layer_level_present_flag[i])  //TEMPORALA_SCALABILITY CHANGES BUG_FIX
    362         {
    363             /* sub_layer_level_idc[i] */
    364             PUT_BITS(ps_bitstrm, ps_ptl->as_ptl_sub[i].u1_level_idc, 8, return_status);
    365             ENTROPY_TRACE("sub_layer_level_idc[i]", ps_ptl->as_ptl_sub[i].u1_level_idc);
    366         }
    367     }
    368 
    369     return return_status;
    370 }
    371 
    372 /**
    373 *******************************************************************************
    374 *
    375 * @brief
    376 *  Generates short term reference picture set
    377 *
    378 * @par   Description
    379 *  Generates short term reference picture set as per section 7.3.5.2.
    380 *  Can be called by either SPS or Slice header parsing modules.
    381 *
    382 * @param[in] ps_bitstrm
    383 *  Pointer to bitstream structure
    384 *
    385 * @param[out] ps_stref_picset_base
    386 *  Pointer to first short term ref pic set structure
    387 *
    388 * @param[in] num_short_term_ref_pic_sets
    389 *  Number of short term reference pic sets
    390 *
    391 * @param[in] idx
    392 *  Current short term ref pic set id
    393 *
    394 * @returns Error code from WORD32
    395 *
    396 *
    397 *******************************************************************************
    398 */
    399 static WORD32 ihevce_short_term_ref_pic_set(
    400     bitstrm_t *ps_bitstrm,
    401     stref_picset_t *ps_stref_picset_base,
    402     WORD32 num_short_term_ref_pic_sets,
    403     WORD32 idx,
    404     WORD32 *pi4_NumPocTotalCurr)
    405 {
    406     WORD32 i;
    407     WORD32 return_status = IHEVCE_SUCCESS;
    408     stref_picset_t *ps_stref_picset = ps_stref_picset_base + idx;
    409 
    410     (void)num_short_term_ref_pic_sets;
    411     if(idx > 0)
    412     {
    413         /* inter_ref_pic_set_prediction_flag */
    414         PUT_BITS(
    415             ps_bitstrm, ps_stref_picset->i1_inter_ref_pic_set_prediction_flag, 1, return_status);
    416         ENTROPY_TRACE(
    417             "inter_ref_pic_set_prediction_flag",
    418             ps_stref_picset->i1_inter_ref_pic_set_prediction_flag);
    419     }
    420 
    421     /* This flag is assumed to be 0 for now */
    422     ASSERT(0 == ps_stref_picset->i1_inter_ref_pic_set_prediction_flag);
    423 
    424     /* num_negative_pics */
    425     PUT_BITS_UEV(ps_bitstrm, ps_stref_picset->i1_num_neg_pics, return_status);
    426     ENTROPY_TRACE("num_negative_pics", ps_stref_picset->i1_num_neg_pics);
    427 
    428     /* num_positive_pics */
    429     PUT_BITS_UEV(ps_bitstrm, ps_stref_picset->i1_num_pos_pics, return_status);
    430     ENTROPY_TRACE("num_positive_pics", ps_stref_picset->i1_num_pos_pics);
    431 
    432     for(i = 0; i < ps_stref_picset->i1_num_neg_pics; i++)
    433     {
    434         /* delta_poc_s0_minus1 */
    435         PUT_BITS_UEV(ps_bitstrm, ps_stref_picset->ai2_delta_poc[i] - 1, return_status);
    436         ENTROPY_TRACE("delta_poc_s0_minus1", ps_stref_picset->ai2_delta_poc[i] - 1);
    437 
    438         /* used_by_curr_pic_s0_flag */
    439         PUT_BITS(ps_bitstrm, ps_stref_picset->ai1_used[i], 1, return_status);
    440         ENTROPY_TRACE("used_by_curr_pic_s0_flag", ps_stref_picset->ai1_used[i]);
    441         /*get the num pocs used for cur pic*/
    442         if(ps_stref_picset->ai1_used[i])
    443         {
    444             *pi4_NumPocTotalCurr += 1;
    445         }
    446     }
    447 
    448     for(; i < (ps_stref_picset->i1_num_pos_pics + ps_stref_picset->i1_num_neg_pics); i++)
    449     {
    450         /* delta_poc_s1_minus1 */
    451         PUT_BITS_UEV(ps_bitstrm, ps_stref_picset->ai2_delta_poc[i] - 1, return_status);
    452         ENTROPY_TRACE("delta_poc_s1_minus1", ps_stref_picset->ai2_delta_poc[i] - 1);
    453 
    454         /* used_by_curr_pic_s1_flag */
    455         PUT_BITS(ps_bitstrm, ps_stref_picset->ai1_used[i], 1, return_status);
    456         ENTROPY_TRACE("used_by_curr_pic_s1_flag", ps_stref_picset->ai1_used[i]);
    457         /*get the num pocs used for cur pic*/
    458         if(ps_stref_picset->ai1_used[i])
    459         {
    460             *pi4_NumPocTotalCurr += 1;
    461         }
    462     }
    463 
    464     return return_status;
    465 }
    466 
    467 /**
    468 ******************************************************************************
    469 *
    470 *  @brief Generates ref pic list modification
    471 *
    472 *  @par   Description
    473 *  Generate ref pic list modification syntax as per Section 7.3.6.2
    474 *
    475 *  @param[in]   ps_bitstrm
    476 *  pointer to bitstream context (handle)
    477 *
    478 *  @param[in]   ps_slice_hdr
    479 *  pointer to structure containing slice header
    480 *
    481 *  @return      success or failure error code
    482 *
    483 ******************************************************************************
    484 */
    485 static WORD32 ref_pic_list_modification(
    486     bitstrm_t *ps_bitstrm, slice_header_t *ps_slice_hdr, WORD32 i4_NumPocTotalCurr)
    487 {
    488     WORD32 return_status = IHEVCE_SUCCESS;
    489     WORD32 i;
    490 
    491     /* ref_pic_list_modification_flag_l0 */
    492     PUT_BITS(
    493         ps_bitstrm, ps_slice_hdr->s_rplm.i1_ref_pic_list_modification_flag_l0, 1, return_status);
    494     ENTROPY_TRACE(
    495         "ref_pic_list_modification_flag_l0",
    496         ps_slice_hdr->s_rplm.i1_ref_pic_list_modification_flag_l0);
    497 
    498     if(ps_slice_hdr->s_rplm.i1_ref_pic_list_modification_flag_l0)
    499     {
    500         for(i = 0; i <= (ps_slice_hdr->i1_num_ref_idx_l0_active - 1); i++)
    501         {
    502             WORD32 num_bits = 32 - CLZ(i4_NumPocTotalCurr - 1);
    503 
    504             /* list_entry_l0[ i ] */
    505             PUT_BITS(ps_bitstrm, ps_slice_hdr->s_rplm.i1_list_entry_l0[i], num_bits, return_status);
    506             ENTROPY_TRACE("list_entry_l0", ps_slice_hdr->s_rplm.i1_list_entry_l0[i]);
    507         }
    508     }
    509 
    510     if((BSLICE == ps_slice_hdr->i1_slice_type))
    511     {
    512         /* ref_pic_list_modification_flag_l1 */
    513         PUT_BITS(
    514             ps_bitstrm, ps_slice_hdr->s_rplm.i1_ref_pic_list_modification_flag_l1, 1, return_status);
    515         ENTROPY_TRACE(
    516             "ref_pic_list_modification_flag_l1",
    517             ps_slice_hdr->s_rplm.i1_ref_pic_list_modification_flag_l1);
    518 
    519         if(ps_slice_hdr->s_rplm.i1_ref_pic_list_modification_flag_l1)
    520         {
    521             for(i = 0; i <= (ps_slice_hdr->i1_num_ref_idx_l1_active - 1); i++)
    522             {
    523                 WORD32 num_bits = 32 - CLZ(i4_NumPocTotalCurr - 1);
    524 
    525                 /* list_entry_l1[ i ] */
    526                 PUT_BITS(
    527                     ps_bitstrm, ps_slice_hdr->s_rplm.i1_list_entry_l1[i], num_bits, return_status);
    528                 ENTROPY_TRACE("list_entry_l1", ps_slice_hdr->s_rplm.i1_list_entry_l1[i]);
    529             }
    530         }
    531     } /*end of B slice check*/
    532 
    533     return return_status;
    534 }
    535 
    536 /**
    537 ******************************************************************************
    538 *
    539 *  @brief Generates Pred Weight Table
    540 *
    541 *  @par   Description
    542 *  Generate Pred Weight Table as per Section 7.3.5.4
    543 *
    544 *  @param[in]   ps_bitstrm
    545 *  pointer to bitstream context (handle)
    546 *
    547 *  @param[in]   ps_sps
    548 *  pointer to structure containing SPS data
    549 *
    550 *  @param[in]   ps_pps
    551 *  pointer to structure containing PPS data
    552 *
    553 *  @param[in]   ps_slice_hdr
    554 *  pointer to structure containing slice header
    555 *
    556 *  @return      success or failure error code
    557 *
    558 ******************************************************************************
    559 */
    560 static WORD32 ihevce_generate_pred_weight_table(
    561     bitstrm_t *ps_bitstrm, sps_t *ps_sps, pps_t *ps_pps, slice_header_t *ps_slice_hdr)
    562 {
    563     WORD32 i;
    564     WORD32 delta_luma_weight;
    565     WORD32 delta_chroma_weight;
    566     WORD32 return_status = IHEVCE_SUCCESS;
    567     pred_wt_ofst_t *ps_wt_ofst = &ps_slice_hdr->s_wt_ofst;
    568     UWORD32 u4_luma_log2_weight_denom = ps_wt_ofst->i1_luma_log2_weight_denom;
    569     WORD32 chroma_log2_weight_denom = (ps_wt_ofst->i1_chroma_log2_weight_denom);
    570     WORD32 i4_wght_count = 0;
    571 
    572     (void)ps_pps;
    573     /* luma_log2_weight_denom */
    574     PUT_BITS_UEV(ps_bitstrm, u4_luma_log2_weight_denom, return_status);
    575     ENTROPY_TRACE("luma_log2_weight_denom", u4_luma_log2_weight_denom);
    576 
    577     if(ps_sps->i1_chroma_format_idc != 0)
    578     {
    579         /* delta_chroma_log2_weight_denom */
    580         PUT_BITS_SEV(
    581             ps_bitstrm, chroma_log2_weight_denom - u4_luma_log2_weight_denom, return_status);
    582         ENTROPY_TRACE(
    583             "delta_chroma_log2_weight_denom", chroma_log2_weight_denom - u4_luma_log2_weight_denom);
    584     }
    585 
    586     for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l0_active; i++)
    587     {
    588         /* luma_weight_l0_flag[ i ] */
    589         PUT_BITS(ps_bitstrm, ps_wt_ofst->i1_luma_weight_l0_flag[i], 1, return_status);
    590         i4_wght_count += ps_wt_ofst->i1_luma_weight_l0_flag[i];
    591         assert(i4_wght_count <= 24);
    592         ENTROPY_TRACE("luma_weight_l0_flag[ i ]", ps_wt_ofst->i1_luma_weight_l0_flag[i]);
    593     }
    594 
    595     if(ps_sps->i1_chroma_format_idc != 0)
    596     {
    597         for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l0_active; i++)
    598         {
    599             /* chroma_weight_l0_flag[ i ] */
    600             PUT_BITS(ps_bitstrm, ps_wt_ofst->i1_chroma_weight_l0_flag[i], 1, return_status);
    601             i4_wght_count += 2 * ps_wt_ofst->i1_chroma_weight_l0_flag[i];
    602             assert(i4_wght_count <= 24);
    603             ENTROPY_TRACE("chroma_weight_l0_flag[ i ]", ps_wt_ofst->i1_chroma_weight_l0_flag[i]);
    604         }
    605     }
    606 
    607     delta_luma_weight = (1 << u4_luma_log2_weight_denom);
    608     delta_chroma_weight = (1 << chroma_log2_weight_denom);
    609 
    610     for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l0_active; i++)
    611     {
    612         if(ps_wt_ofst->i1_luma_weight_l0_flag[i])
    613         {
    614             /* delta_luma_weight_l0[ i ] */
    615             PUT_BITS_SEV(
    616                 ps_bitstrm, ps_wt_ofst->i2_luma_weight_l0[i] - delta_luma_weight, return_status);
    617             ENTROPY_TRACE(
    618                 "delta_luma_weight_l0[ i ]", ps_wt_ofst->i2_luma_weight_l0[i] - delta_luma_weight);
    619 
    620             /* luma_offset_l0[ i ] */
    621             PUT_BITS_SEV(ps_bitstrm, ps_wt_ofst->i2_luma_offset_l0[i], return_status);
    622             ENTROPY_TRACE("luma_offset_l0[ i ]", ps_wt_ofst->i2_luma_offset_l0[i]);
    623         }
    624 
    625         if(ps_wt_ofst->i1_chroma_weight_l0_flag[i])
    626         {
    627             WORD32 shift = (1 << (BIT_DEPTH_CHROMA - 1));
    628             WORD32 delta_chroma_weight_l0[2];
    629             WORD32 delta_chroma_offset_l0[2];
    630 
    631             delta_chroma_weight_l0[0] = ps_wt_ofst->i2_chroma_weight_l0_cb[i] - delta_chroma_weight;
    632             delta_chroma_weight_l0[1] = ps_wt_ofst->i2_chroma_weight_l0_cr[i] - delta_chroma_weight;
    633 
    634             delta_chroma_offset_l0[0] =
    635                 ps_wt_ofst->i2_chroma_offset_l0_cb[i] +
    636                 ((shift * ps_wt_ofst->i2_chroma_weight_l0_cb[i]) >> chroma_log2_weight_denom) -
    637                 shift;
    638             delta_chroma_offset_l0[1] =
    639                 ps_wt_ofst->i2_chroma_offset_l0_cr[i] +
    640                 ((shift * ps_wt_ofst->i2_chroma_weight_l0_cr[i]) >> chroma_log2_weight_denom) -
    641                 shift;
    642 
    643             /* delta_chroma_weight_l0[ i ][j] */
    644             PUT_BITS_SEV(ps_bitstrm, delta_chroma_weight_l0[0], return_status);
    645             ENTROPY_TRACE("delta_chroma_weight_l0[ i ]", delta_chroma_weight_l0[0]);
    646 
    647             /* delta_chroma_offset_l0[ i ][j] */
    648             PUT_BITS_SEV(ps_bitstrm, delta_chroma_offset_l0[0], return_status);
    649             ENTROPY_TRACE("delta_chroma_offset_l0[ i ]", delta_chroma_offset_l0[0]);
    650 
    651             /* delta_chroma_weight_l0[ i ][j] */
    652             PUT_BITS_SEV(ps_bitstrm, delta_chroma_weight_l0[1], return_status);
    653             ENTROPY_TRACE("delta_chroma_weight_l0[ i ]", delta_chroma_weight_l0[1]);
    654 
    655             /* delta_chroma_offset_l0[ i ][j] */
    656             PUT_BITS_SEV(ps_bitstrm, delta_chroma_offset_l0[1], return_status);
    657             ENTROPY_TRACE("delta_chroma_offset_l0[ i ]", delta_chroma_offset_l0[1]);
    658         }
    659     }
    660 
    661     if(BSLICE == ps_slice_hdr->i1_slice_type)
    662     {
    663         for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l1_active; i++)
    664         {
    665             /* luma_weight_l1_flag[ i ] */
    666             PUT_BITS(ps_bitstrm, ps_wt_ofst->i1_luma_weight_l1_flag[i], 1, return_status);
    667             i4_wght_count += ps_wt_ofst->i1_luma_weight_l1_flag[i];
    668             assert(i4_wght_count <= 24);
    669             ENTROPY_TRACE("luma_weight_l1_flag[ i ]", ps_wt_ofst->i1_luma_weight_l1_flag[i]);
    670         }
    671 
    672         if(ps_sps->i1_chroma_format_idc != 0)
    673         {
    674             for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l1_active; i++)
    675             {
    676                 /* chroma_weight_l1_flag[ i ] */
    677                 PUT_BITS(ps_bitstrm, ps_wt_ofst->i1_chroma_weight_l1_flag[i], 1, return_status);
    678                 i4_wght_count += ps_wt_ofst->i1_chroma_weight_l1_flag[i];
    679                 assert(i4_wght_count <= 24);
    680                 ENTROPY_TRACE(
    681                     "chroma_weight_l1_flag[ i ]", ps_wt_ofst->i1_chroma_weight_l1_flag[i]);
    682             }
    683         }
    684 
    685         for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l1_active; i++)
    686         {
    687             if(ps_wt_ofst->i1_luma_weight_l1_flag[i])
    688             {
    689                 /* delta_luma_weight_l1[ i ] */
    690                 PUT_BITS_SEV(
    691                     ps_bitstrm,
    692                     ps_wt_ofst->i2_luma_weight_l1[i] - delta_luma_weight,
    693                     return_status);
    694                 ENTROPY_TRACE(
    695                     "delta_luma_weight_l1[ i ]",
    696                     ps_wt_ofst->i2_luma_weight_l1[i] - delta_luma_weight);
    697 
    698                 /* luma_offset_l1[ i ] */
    699                 PUT_BITS_SEV(ps_bitstrm, ps_wt_ofst->i2_luma_offset_l1[i], return_status);
    700                 ENTROPY_TRACE("luma_offset_l1[ i ]", ps_wt_ofst->i2_luma_offset_l1[i]);
    701             }
    702 
    703             if(ps_wt_ofst->i1_chroma_weight_l1_flag[i])
    704             {
    705                 WORD32 shift = (1 << (BIT_DEPTH_CHROMA - 1));
    706                 WORD32 delta_chroma_weight_l1[2];
    707                 WORD32 delta_chroma_offset_l1[2];
    708 
    709                 delta_chroma_weight_l1[0] =
    710                     ps_wt_ofst->i2_chroma_weight_l1_cb[i] - delta_chroma_weight;
    711                 delta_chroma_weight_l1[1] =
    712                     ps_wt_ofst->i2_chroma_weight_l1_cr[i] - delta_chroma_weight;
    713 
    714                 delta_chroma_offset_l1[0] =
    715                     ps_wt_ofst->i2_chroma_offset_l1_cb[i] +
    716                     ((shift * ps_wt_ofst->i2_chroma_weight_l1_cb[i]) >> chroma_log2_weight_denom) -
    717                     shift;
    718                 delta_chroma_offset_l1[1] =
    719                     ps_wt_ofst->i2_chroma_offset_l1_cr[i] +
    720                     ((shift * ps_wt_ofst->i2_chroma_weight_l1_cr[i]) >> chroma_log2_weight_denom) -
    721                     shift;
    722 
    723                 /* delta_chroma_weight_l1[ i ][j] */
    724                 PUT_BITS_SEV(ps_bitstrm, delta_chroma_weight_l1[0], return_status);
    725                 ENTROPY_TRACE("delta_chroma_weight_l1[ i ]", delta_chroma_weight_l1[0]);
    726 
    727                 /* delta_chroma_offset_l1[ i ][j] */
    728                 PUT_BITS_SEV(ps_bitstrm, delta_chroma_offset_l1[0], return_status);
    729                 ENTROPY_TRACE("delta_chroma_offset_l1[ i ]", delta_chroma_offset_l1[0]);
    730 
    731                 /* delta_chroma_weight_l1[ i ][j] */
    732                 PUT_BITS_SEV(ps_bitstrm, delta_chroma_weight_l1[1], return_status);
    733                 ENTROPY_TRACE("delta_chroma_weight_l1[ i ]", delta_chroma_weight_l1[1]);
    734 
    735                 /* delta_chroma_offset_l1[ i ][j] */
    736                 PUT_BITS_SEV(ps_bitstrm, delta_chroma_offset_l1[1], return_status);
    737                 ENTROPY_TRACE("delta_chroma_offset_l1[ i ]", delta_chroma_offset_l1[1]);
    738             }
    739         }
    740     }
    741 
    742     return return_status;
    743 }
    744 
    745 /**
    746 ******************************************************************************
    747 *
    748 *  @brief Generates AUD (Access Unit Delimiter)
    749 *
    750 *  @par   Description
    751 *  Generate Access Unit Delimiter as per Section 7.3.2.5
    752 *
    753 *  @param[in]   ps_bitstrm
    754 *  pointer to bitstream context (handle)
    755 *
    756 *  @param[in]   pic_type
    757 *  picture type
    758 *
    759 *  @return      success or failure error code
    760 *
    761 ******************************************************************************
    762 */
    763 WORD32 ihevce_generate_aud(bitstrm_t *ps_bitstrm, WORD32 pic_type)
    764 {
    765     WORD32 return_status = IHEVCE_SUCCESS;
    766 
    767     /* Insert the NAL start code */
    768     return_status = ihevce_put_nal_start_code_prefix(ps_bitstrm, 1);
    769 
    770     /* Insert Nal Unit Header */
    771     return_status |= ihevce_generate_nal_unit_header(ps_bitstrm, NAL_AUD, 0);
    772 
    773     /* pic_type */
    774     PUT_BITS(ps_bitstrm, pic_type, 3, return_status);
    775     ENTROPY_TRACE("pic type", pic_type);
    776 
    777     ihevce_put_rbsp_trailing_bits(ps_bitstrm);
    778 
    779     return return_status;
    780 }
    781 
    782 /**
    783 ******************************************************************************
    784 *
    785 *  @brief Generates EOS (End of Sequence)
    786 *
    787 *  @par   Description
    788 *  Generate End of sequence as per Section 7.3.2.6
    789 *
    790 *  @param[in]   ps_bitstrm
    791 *  pointer to bitstream context (handle)
    792 *
    793 *  @return      success or failure error code
    794 *
    795 ******************************************************************************
    796 */
    797 WORD32 ihevce_generate_eos(bitstrm_t *ps_bitstrm)
    798 {
    799     WORD32 return_status = IHEVCE_SUCCESS;
    800 
    801     /* Insert the NAL start code */
    802     return_status = ihevce_put_nal_start_code_prefix(ps_bitstrm, 1);
    803 
    804     /* Insert Nal Unit Header */
    805     return_status |= ihevce_generate_nal_unit_header(ps_bitstrm, NAL_EOS, 0);
    806 
    807     ihevce_put_rbsp_trailing_bits(ps_bitstrm);
    808 
    809     return return_status;
    810 }
    811 
    812 /**
    813 ******************************************************************************
    814 *
    815 *  @brief Generates VPS (Video Parameter Set)
    816 *
    817 *  @par   Description
    818 *  Generate Video Parameter Set as per Section 7.3.2.1
    819 *
    820 *  @param[in]   ps_bitstrm
    821 *  pointer to bitstream context (handle)
    822 *
    823 *  @param[in]   ps_vps
    824 *  pointer to structure containing VPS data
    825 *
    826 *  @return      success or failure error code
    827 *
    828 ******************************************************************************
    829 */
    830 WORD32 ihevce_generate_vps(bitstrm_t *ps_bitstrm, vps_t *ps_vps)
    831 {
    832     WORD32 i;
    833     WORD8 i1_vps_max_sub_layers_minus1 = ps_vps->i1_vps_max_sub_layers - 1;
    834     WORD32 return_status = IHEVCE_SUCCESS;
    835 
    836     /* Insert Start Code */
    837     ihevce_put_nal_start_code_prefix(ps_bitstrm, 1);
    838 
    839     /* Insert Nal Unit Header */
    840     ihevce_generate_nal_unit_header(ps_bitstrm, NAL_VPS, 0);
    841 
    842     /* video_parameter_set_id */
    843     PUT_BITS(ps_bitstrm, ps_vps->i1_vps_id, 4, return_status);
    844     ENTROPY_TRACE("video_parameter_set_id", ps_vps->i1_vps_id);
    845 
    846     /* vps_reserved_three_2bits */
    847     PUT_BITS(ps_bitstrm, 3, 2, return_status);
    848     ENTROPY_TRACE("vps_reserved_three_2bits", 3);
    849 
    850     /* vps_max_layers_minus1  */
    851     PUT_BITS(ps_bitstrm, 0, 6, return_status);
    852     ENTROPY_TRACE("vps_max_layers_minus1 ", 3);
    853 
    854     /* vps_max_sub_layers_minus1 */
    855     PUT_BITS(ps_bitstrm, i1_vps_max_sub_layers_minus1, 3, return_status);
    856     ENTROPY_TRACE("vps_max_sub_layers_minus1", i1_vps_max_sub_layers_minus1);
    857 
    858     /* vps_temporal_id_nesting_flag */
    859     PUT_BITS(ps_bitstrm, ps_vps->i1_vps_temporal_id_nesting_flag, 1, return_status);
    860     ENTROPY_TRACE("vps_temporal_id_nesting_flag", ps_vps->i1_vps_temporal_id_nesting_flag);
    861 
    862     /* vps_reserved_0xffff_16bits */
    863     PUT_BITS(ps_bitstrm, 0xffff, 16, return_status);
    864     ENTROPY_TRACE("vps_reserved_0xffff_16bits", 0xffff);
    865 
    866     /* profile-tier and level info */
    867     ihevce_generate_profile_tier_level(ps_bitstrm, &ps_vps->s_ptl, 1, i1_vps_max_sub_layers_minus1);
    868 
    869     /* vps_sub_layer_ordering_info_present_flag */
    870     PUT_BITS(ps_bitstrm, ps_vps->i1_sub_layer_ordering_info_present_flag, 1, return_status);
    871     ENTROPY_TRACE(
    872         "vps_sub_layer_ordering_info_present_flag",
    873         ps_vps->i1_sub_layer_ordering_info_present_flag);
    874 
    875     i = ps_vps->i1_sub_layer_ordering_info_present_flag ? 0 : i1_vps_max_sub_layers_minus1;
    876 
    877     for(; i <= i1_vps_max_sub_layers_minus1; i++)
    878     {
    879         /* vps_max_dec_pic_buffering[i] */
    880         PUT_BITS_UEV(ps_bitstrm, ps_vps->ai1_vps_max_dec_pic_buffering[i], return_status);
    881         ENTROPY_TRACE(
    882             "vps_max_dec_pic_buffering_minus1[i]", ps_vps->ai1_vps_max_dec_pic_buffering[i]);
    883 
    884         /* vps_num_reorder_pics[i] */
    885         PUT_BITS_UEV(ps_bitstrm, ps_vps->ai1_vps_max_num_reorder_pics[i], return_status);
    886         ENTROPY_TRACE("ai1_vps_max_num_reorder_pics[i]", ps_vps->ai1_vps_max_num_reorder_pics[i]);
    887 
    888         /* vps_max_latency_increase[i] */
    889         PUT_BITS_UEV(ps_bitstrm, ps_vps->ai1_vps_max_latency_increase[i], return_status);
    890         ENTROPY_TRACE("ai1_vps_max_latency_increase[i]", ps_vps->ai1_vps_max_latency_increase[i]);
    891     }
    892 
    893     /* vps_max_layer_id */
    894     PUT_BITS(ps_bitstrm, ps_vps->i1_vps_max_nuh_reserved_zero_layer_id, 6, return_status);
    895     ENTROPY_TRACE("vps_max_layer_id", ps_vps->i1_vps_max_nuh_reserved_zero_layer_id);
    896 
    897     /* vps_num_layer_sets_minus1 */
    898     PUT_BITS_UEV(ps_bitstrm, 0, return_status);
    899     ENTROPY_TRACE("vps_num_layer_sets_minus1", 0);
    900 
    901     /* vps_timing_info_present_flag */
    902     PUT_BITS(ps_bitstrm, 0, 1, return_status);
    903     ENTROPY_TRACE("vps_timing_info_present_flag", 0);
    904 
    905     /* vps_extension_flag */
    906     PUT_BITS(ps_bitstrm, 0, 1, return_status);
    907     ENTROPY_TRACE("vps_extension_flag", 0);
    908 
    909     /* rbsp trailing bits */
    910     ihevce_put_rbsp_trailing_bits(ps_bitstrm);
    911 
    912     return return_status;
    913 }
    914 
    915 /**
    916 ******************************************************************************
    917 *
    918 *  @brief Generates SPS (Video Parameter Set)
    919 *
    920 *  @par   Description
    921 *  Parse Video Parameter Set as per Section 7.3.2.2
    922 *
    923 *  @param[in]   ps_bitstrm
    924 *  pointer to bitstream context (handle)
    925 *
    926 *  @param[in]   ps_sps
    927 *  pointer to structure containing SPS data
    928 *
    929 *  @return      success or failure error code
    930 *
    931 ******************************************************************************
    932 */
    933 WORD32 ihevce_generate_sps(bitstrm_t *ps_bitstrm, sps_t *ps_sps)
    934 {
    935     WORD32 i;
    936     WORD32 return_status = IHEVCE_SUCCESS;
    937     WORD8 i1_max_sub_layers_minus1 = ps_sps->i1_sps_max_sub_layers - 1;
    938 
    939     UWORD32 u4_log2_max_pic_order_cnt_lsb = (UWORD32)(ps_sps->i1_log2_max_pic_order_cnt_lsb);
    940 
    941     UWORD32 u4_log2_min_coding_block_size_minus3 =
    942         (UWORD32)(ps_sps->i1_log2_min_coding_block_size) - 3;
    943 
    944     UWORD32 u4_log2_diff_max_min_coding_block_size =
    945         (UWORD32)(ps_sps->i1_log2_diff_max_min_coding_block_size);
    946 
    947     UWORD32 u4_log2_min_transform_block_size_minus2 =
    948         (UWORD32)(ps_sps->i1_log2_min_transform_block_size) - 2;
    949 
    950     UWORD32 u4_log2_diff_max_min_transform_block_size =
    951         (UWORD32)(ps_sps->i1_log2_diff_max_min_transform_block_size);
    952 
    953     /* Insert Start Code */
    954     return_status = ihevce_put_nal_start_code_prefix(ps_bitstrm, 1);
    955 
    956     /* Insert Nal Unit Header */
    957     return_status |= ihevce_generate_nal_unit_header(ps_bitstrm, NAL_SPS, 0);
    958 
    959     /* video_parameter_set_id */
    960     PUT_BITS(ps_bitstrm, ps_sps->i1_vps_id, 4, return_status);
    961     ENTROPY_TRACE("video_parameter_set_id", ps_sps->i1_vps_id);
    962 
    963     /* sps_max_sub_layers_minus1 */
    964     PUT_BITS(ps_bitstrm, i1_max_sub_layers_minus1, 3, return_status);
    965     ENTROPY_TRACE("sps_max_sub_layers_minus1", i1_max_sub_layers_minus1);
    966 
    967     /* sps_temporal_id_nesting_flag */
    968     PUT_BITS(ps_bitstrm, ps_sps->i1_sps_temporal_id_nesting_flag, 1, return_status);
    969     ENTROPY_TRACE("sps_temporal_id_nesting_flag", ps_sps->i1_sps_temporal_id_nesting_flag);
    970 
    971     /* profile-tier and level info */
    972     ihevce_generate_profile_tier_level(ps_bitstrm, &ps_sps->s_ptl, 1, i1_max_sub_layers_minus1);
    973 
    974     /* seq_parameter_set_id */
    975     PUT_BITS_UEV(ps_bitstrm, ps_sps->i1_sps_id, return_status);
    976     ENTROPY_TRACE("seq_parameter_set_id", ps_sps->i1_sps_id);
    977 
    978     /* chroma_format_idc */
    979     PUT_BITS_UEV(ps_bitstrm, ps_sps->i1_chroma_format_idc, return_status);
    980     ENTROPY_TRACE("chroma_format_idc", ps_sps->i1_chroma_format_idc);
    981 
    982     if(CHROMA_FMT_IDC_YUV444 == ps_sps->i1_chroma_format_idc)
    983     {
    984         /* separate_colour_plane_flag */
    985         PUT_BITS(ps_bitstrm, 1, 1, return_status);
    986         ENTROPY_TRACE("separate_colour_plane_flag", 1);
    987     }
    988 
    989     /* pic_width_in_luma_samples */
    990     PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_pic_width_in_luma_samples, return_status);
    991     ENTROPY_TRACE("pic_width_in_luma_samples", ps_sps->i2_pic_width_in_luma_samples);
    992 
    993     /* pic_height_in_luma_samples */
    994     PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_pic_height_in_luma_samples, return_status);
    995     ENTROPY_TRACE("pic_height_in_luma_samples", ps_sps->i2_pic_height_in_luma_samples);
    996 
    997     /* pic_cropping_flag */
    998     PUT_BITS(ps_bitstrm, ps_sps->i1_pic_cropping_flag, 1, return_status);
    999     ENTROPY_TRACE("pic_cropping_flag", ps_sps->i1_pic_cropping_flag);
   1000 
   1001     if(ps_sps->i1_pic_cropping_flag)
   1002     {
   1003         /* pic_crop_left_offset */
   1004         PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_pic_crop_left_offset, return_status);
   1005         ENTROPY_TRACE("pic_crop_left_offset", ps_sps->i2_pic_crop_left_offset);
   1006 
   1007         /* pic_crop_right_offset */
   1008         PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_pic_crop_right_offset, return_status);
   1009         ENTROPY_TRACE("pic_crop_right_offset", ps_sps->i2_pic_crop_right_offset);
   1010 
   1011         /* pic_crop_top_offset */
   1012         PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_pic_crop_top_offset, return_status);
   1013         ENTROPY_TRACE("pic_crop_top_offset", ps_sps->i2_pic_crop_top_offset);
   1014 
   1015         /* pic_crop_bottom_offset */
   1016         PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_pic_crop_bottom_offset, return_status);
   1017         ENTROPY_TRACE("pic_crop_bottom_offset", ps_sps->i2_pic_crop_bottom_offset);
   1018     }
   1019 
   1020     /* bit_depth_luma_minus8 */
   1021     PUT_BITS_UEV(ps_bitstrm, ps_sps->i1_bit_depth_luma_minus8, return_status);
   1022     ENTROPY_TRACE("bit_depth_luma_minus8", ps_sps->i1_bit_depth_luma_minus8);
   1023 
   1024     /* bit_depth_chroma_minus8 */
   1025     PUT_BITS_UEV(ps_bitstrm, ps_sps->i1_bit_depth_chroma_minus8, return_status);
   1026     ENTROPY_TRACE("i1_bit_depth_chroma_minus8", ps_sps->i1_bit_depth_chroma_minus8);
   1027 
   1028     /* log2_max_pic_order_cnt_lsb_minus4 */
   1029     PUT_BITS_UEV(ps_bitstrm, u4_log2_max_pic_order_cnt_lsb - 4, return_status);
   1030     ENTROPY_TRACE("log2_max_pic_order_cnt_lsb_minus4", u4_log2_max_pic_order_cnt_lsb - 4);
   1031 
   1032     /* sps_sub_layer_ordering_info_present_flag */
   1033     PUT_BITS(ps_bitstrm, ps_sps->i1_sps_sub_layer_ordering_info_present_flag, 1, return_status);
   1034     ENTROPY_TRACE(
   1035         "sps_sub_layer_ordering_info_present_flag",
   1036         ps_sps->i1_sps_sub_layer_ordering_info_present_flag);
   1037 
   1038     i = ps_sps->i1_sps_sub_layer_ordering_info_present_flag ? 0 : i1_max_sub_layers_minus1;
   1039 
   1040     for(; i <= i1_max_sub_layers_minus1; i++)
   1041     {
   1042         /* max_dec_pic_buffering */
   1043         PUT_BITS_UEV(ps_bitstrm, ps_sps->ai1_sps_max_dec_pic_buffering[i], return_status);
   1044         ENTROPY_TRACE("max_dec_pic_buffering_minus1", ps_sps->ai1_sps_max_dec_pic_buffering[i]);
   1045 
   1046         /* num_reorder_pics */
   1047         PUT_BITS_UEV(ps_bitstrm, ps_sps->ai1_sps_max_num_reorder_pics[i], return_status);
   1048         ENTROPY_TRACE("num_reorder_pics", ps_sps->ai1_sps_max_num_reorder_pics[i]);
   1049 
   1050         /* max_latency_increase */
   1051         PUT_BITS_UEV(ps_bitstrm, ps_sps->ai1_sps_max_latency_increase[i], return_status);
   1052         ENTROPY_TRACE("max_latency_increase", ps_sps->ai1_sps_max_latency_increase[i]);
   1053     }
   1054 
   1055     /* log2_min_coding_block_size_minus3 */
   1056     PUT_BITS_UEV(ps_bitstrm, u4_log2_min_coding_block_size_minus3, return_status);
   1057     ENTROPY_TRACE("log2_min_coding_block_size_minus3", u4_log2_min_coding_block_size_minus3);
   1058 
   1059     /* log2_diff_max_min_coding_block_size */
   1060     PUT_BITS_UEV(ps_bitstrm, u4_log2_diff_max_min_coding_block_size, return_status);
   1061     ENTROPY_TRACE("log2_diff_max_min_coding_block_size", u4_log2_diff_max_min_coding_block_size);
   1062 
   1063     /* log2_min_transform_block_size_minus2 */
   1064     PUT_BITS_UEV(ps_bitstrm, u4_log2_min_transform_block_size_minus2, return_status);
   1065     ENTROPY_TRACE("log2_min_transform_block_size_minus2", u4_log2_min_transform_block_size_minus2);
   1066 
   1067     /* log2_diff_max_min_transform_block_size */
   1068     PUT_BITS_UEV(ps_bitstrm, u4_log2_diff_max_min_transform_block_size, return_status);
   1069     ENTROPY_TRACE(
   1070         "log2_diff_max_min_transform_block_size", u4_log2_diff_max_min_transform_block_size);
   1071 
   1072     /* max_transform_hierarchy_depth_inter */
   1073     PUT_BITS_UEV(ps_bitstrm, ps_sps->i1_max_transform_hierarchy_depth_inter, return_status);
   1074     ENTROPY_TRACE(
   1075         "max_transform_hierarchy_depth_inter", ps_sps->i1_max_transform_hierarchy_depth_inter);
   1076 
   1077     /* max_transform_hierarchy_depth_intra */
   1078     PUT_BITS_UEV(ps_bitstrm, ps_sps->i1_max_transform_hierarchy_depth_intra, return_status);
   1079     ENTROPY_TRACE(
   1080         "max_transform_hierarchy_depth_intra", ps_sps->i1_max_transform_hierarchy_depth_intra);
   1081 
   1082     /* scaling_list_enabled_flag */
   1083     PUT_BITS(ps_bitstrm, ps_sps->i1_scaling_list_enable_flag, 1, return_status);
   1084     ENTROPY_TRACE("scaling_list_enabled_flag", ps_sps->i1_scaling_list_enable_flag);
   1085 
   1086     if(ps_sps->i1_scaling_list_enable_flag)
   1087     {
   1088         /* sps_scaling_list_data_present_flag */
   1089         PUT_BITS(ps_bitstrm, ps_sps->i1_sps_scaling_list_data_present_flag, 1, return_status);
   1090         ENTROPY_TRACE(
   1091             "sps_scaling_list_data_present_flag", ps_sps->i1_sps_scaling_list_data_present_flag);
   1092 
   1093 #if 0 /* TODO: Will be enabled once scaling list support is added */
   1094         if(ps_sps->i1_sps_scaling_list_data_present_flag)
   1095         {
   1096             //TODO
   1097             ihevce_generate_scaling_list_data(ps_bitstrm);
   1098         }
   1099 #endif
   1100     }
   1101 
   1102     /* asymmetric_motion_partitions_enabled_flag */
   1103     PUT_BITS(ps_bitstrm, ps_sps->i1_amp_enabled_flag, 1, return_status);
   1104     ENTROPY_TRACE("asymmetric_motion_partitions_enabled_flag", ps_sps->i1_amp_enabled_flag);
   1105 
   1106     /* sample_adaptive_offset_enabled_flag */
   1107     PUT_BITS(ps_bitstrm, ps_sps->i1_sample_adaptive_offset_enabled_flag, 1, return_status);
   1108     ENTROPY_TRACE(
   1109         "sample_adaptive_offset_enabled_flag", ps_sps->i1_sample_adaptive_offset_enabled_flag);
   1110 
   1111     /* pcm_enabled_flag */
   1112     PUT_BITS(ps_bitstrm, ps_sps->i1_pcm_enabled_flag, 1, return_status);
   1113     ENTROPY_TRACE("pcm_enabled_flag", ps_sps->i1_pcm_enabled_flag);
   1114     if(ps_sps->i1_pcm_enabled_flag)
   1115     {
   1116         UWORD32 u4_log2_min_pcm_coding_block_size = (ps_sps->i1_log2_min_pcm_coding_block_size);
   1117         UWORD32 u4_log2_diff_max_min_pcm_coding_block_size =
   1118             (ps_sps->i1_log2_diff_max_min_pcm_coding_block_size);
   1119 
   1120         /* pcm_sample_bit_depth_luma_minus1 */
   1121         PUT_BITS(ps_bitstrm, ps_sps->i1_pcm_sample_bit_depth_luma - 1, 4, return_status);
   1122         ENTROPY_TRACE("pcm_sample_bit_depth_luma", ps_sps->i1_pcm_sample_bit_depth_luma - 1);
   1123 
   1124         /* pcm_sample_bit_depth_chroma_minus1 */
   1125         PUT_BITS(ps_bitstrm, ps_sps->i1_pcm_sample_bit_depth_chroma - 1, 4, return_status);
   1126         ENTROPY_TRACE("pcm_sample_bit_depth_chroma", ps_sps->i1_pcm_sample_bit_depth_chroma - 1);
   1127 
   1128         /* log2_min_pcm_coding_block_size_minus3 */
   1129         PUT_BITS_UEV(ps_bitstrm, u4_log2_min_pcm_coding_block_size - 3, return_status);
   1130         ENTROPY_TRACE(
   1131             "log2_min_pcm_coding_block_size_minus3", u4_log2_min_pcm_coding_block_size - 3);
   1132 
   1133         /* log2_diff_max_min_pcm_coding_block_size */
   1134         PUT_BITS_UEV(ps_bitstrm, u4_log2_diff_max_min_pcm_coding_block_size, return_status);
   1135         ENTROPY_TRACE(
   1136             "log2_diff_max_min_pcm_coding_block_size", u4_log2_diff_max_min_pcm_coding_block_size);
   1137 
   1138         /* pcm_loop_filter_disable_flag */
   1139         PUT_BITS(ps_bitstrm, ps_sps->i1_pcm_loop_filter_disable_flag, 1, return_status);
   1140         ENTROPY_TRACE("pcm_loop_filter_disable_flag", ps_sps->i1_pcm_loop_filter_disable_flag);
   1141     }
   1142 
   1143     /* num_short_term_ref_pic_sets */
   1144     PUT_BITS_UEV(ps_bitstrm, ps_sps->i1_num_short_term_ref_pic_sets, return_status);
   1145     ENTROPY_TRACE("num_short_term_ref_pic_sets", ps_sps->i1_num_short_term_ref_pic_sets);
   1146 
   1147     for(i = 0; i < ps_sps->i1_num_short_term_ref_pic_sets; i++)
   1148     {
   1149         WORD32 i4_NumPocTotalCurr = 0;
   1150         ihevce_short_term_ref_pic_set(
   1151             ps_bitstrm,
   1152             &ps_sps->as_stref_picset[0],
   1153             ps_sps->i1_num_short_term_ref_pic_sets,
   1154             i,
   1155             &i4_NumPocTotalCurr);
   1156     }
   1157 
   1158     /* long_term_ref_pics_present_flag */
   1159     PUT_BITS(ps_bitstrm, ps_sps->i1_long_term_ref_pics_present_flag, 1, return_status);
   1160     ENTROPY_TRACE("long_term_ref_pics_present_flag", ps_sps->i1_long_term_ref_pics_present_flag);
   1161 
   1162     if(ps_sps->i1_long_term_ref_pics_present_flag)
   1163     {
   1164         /* num_long_term_ref_pics_sps */
   1165         PUT_BITS_UEV(ps_bitstrm, ps_sps->i1_num_long_term_ref_pics_sps, return_status);
   1166         ENTROPY_TRACE("num_long_term_ref_pics_sps", ps_sps->i1_num_long_term_ref_pics_sps);
   1167 
   1168         for(i = 0; i < ps_sps->i1_num_long_term_ref_pics_sps; i++)
   1169         {
   1170             /* lt_ref_pic_poc_lsb_sps[i] */
   1171             PUT_BITS(
   1172                 ps_bitstrm,
   1173                 ps_sps->au2_lt_ref_pic_poc_lsb_sps[i],
   1174                 u4_log2_max_pic_order_cnt_lsb,
   1175                 return_status);
   1176             ENTROPY_TRACE("lt_ref_pic_poc_lsb_sps[i]", ps_sps->au2_lt_ref_pic_poc_lsb_sps[i]);
   1177 
   1178             /* used_by_curr_pic_lt_sps_flag[i] */
   1179             PUT_BITS(ps_bitstrm, ps_sps->ai1_used_by_curr_pic_lt_sps_flag[i], 1, return_status);
   1180             ENTROPY_TRACE(
   1181                 "used_by_curr_pic_lt_sps_flag[i]", ps_sps->ai1_used_by_curr_pic_lt_sps_flag[i]);
   1182         }
   1183     }
   1184 
   1185     /* sps_temporal_mvp_enable_flag */
   1186     PUT_BITS(ps_bitstrm, ps_sps->i1_sps_temporal_mvp_enable_flag, 1, return_status);
   1187     ENTROPY_TRACE("sps_temporal_mvp_enable_flag", ps_sps->i1_sps_temporal_mvp_enable_flag);
   1188 
   1189 #if !HM_8DOT1_SYNTAX
   1190     /* strong_intra_smoothing_enable_flag */
   1191     PUT_BITS(ps_bitstrm, ps_sps->i1_strong_intra_smoothing_enable_flag, 1, return_status);
   1192     ENTROPY_TRACE(
   1193         "sps_strong_intra_smoothing_enable_flag", ps_sps->i1_strong_intra_smoothing_enable_flag);
   1194 #endif
   1195 
   1196     /* vui_parameters_present_flag */
   1197     PUT_BITS(ps_bitstrm, ps_sps->i1_vui_parameters_present_flag, 1, return_status);
   1198     ENTROPY_TRACE("vui_parameters_present_flag", ps_sps->i1_vui_parameters_present_flag);
   1199 
   1200     ENTROPY_TRACE("----------- vui_parameters -----------", 0);
   1201 
   1202     if(ps_sps->i1_vui_parameters_present_flag)
   1203     {
   1204         /* Add vui parameters to the bitstream */
   1205         ihevce_generate_vui(ps_bitstrm, ps_sps, ps_sps->s_vui_parameters);
   1206     }
   1207 
   1208     /* sps_extension_flag */
   1209     PUT_BITS(ps_bitstrm, 0, 1, return_status);
   1210     ENTROPY_TRACE("sps_extension_flag", 0);
   1211 
   1212     /* rbsp trailing bits */
   1213     ihevce_put_rbsp_trailing_bits(ps_bitstrm);
   1214 
   1215     return return_status;
   1216 }
   1217 
   1218 /**
   1219 ******************************************************************************
   1220 *
   1221 *  @brief Generates PPS (Picture Parameter Set)
   1222 *
   1223 *  @par   Description
   1224 *  Generate Picture Parameter Set as per Section 7.3.2.3
   1225 *
   1226 *  @param[in]   ps_bitstrm
   1227 *  pointer to bitstream context (handle)
   1228 *
   1229 *  @param[in]   ps_pps
   1230 *  pointer to structure containing PPS data
   1231 *
   1232 *  @return      success or failure error code
   1233 *
   1234 ******************************************************************************
   1235 */
   1236 WORD32 ihevce_generate_pps(bitstrm_t *ps_bitstrm, pps_t *ps_pps)
   1237 {
   1238     WORD32 i;
   1239     WORD32 return_status = IHEVCE_SUCCESS;
   1240 
   1241     /* Insert the NAL start code */
   1242     return_status = ihevce_put_nal_start_code_prefix(ps_bitstrm, 1);
   1243 
   1244     /* Insert Nal Unit Header */
   1245     return_status |= ihevce_generate_nal_unit_header(ps_bitstrm, NAL_PPS, 0);
   1246 
   1247     /* pic_parameter_set_id */
   1248     PUT_BITS_UEV(ps_bitstrm, ps_pps->i1_pps_id, return_status);
   1249     ENTROPY_TRACE("pic_parameter_set_id", ps_pps->i1_pps_id);
   1250 
   1251     /* seq_parameter_set_id */
   1252     PUT_BITS_UEV(ps_bitstrm, ps_pps->i1_sps_id, return_status);
   1253     ENTROPY_TRACE("seq_parameter_set_id", ps_pps->i1_sps_id);
   1254 
   1255     /* dependent_slices_enabled_flag */
   1256     PUT_BITS(ps_bitstrm, ps_pps->i1_dependent_slice_enabled_flag, 1, return_status);
   1257     ENTROPY_TRACE("dependent_slices_enabled_flag", ps_pps->i1_dependent_slice_enabled_flag);
   1258 
   1259     /* output_flag_present_flag */
   1260     PUT_BITS(ps_bitstrm, ps_pps->i1_output_flag_present_flag, 1, return_status);
   1261     ENTROPY_TRACE("output_flag_present_flag", ps_pps->i1_output_flag_present_flag);
   1262 
   1263     /* num_extra_slice_header_bits */
   1264     PUT_BITS(ps_bitstrm, ps_pps->i1_num_extra_slice_header_bits, 3, return_status);
   1265     ENTROPY_TRACE("num_extra_slice_header_bits", ps_pps->i1_num_extra_slice_header_bits);
   1266 
   1267     /* sign_data_hiding_flag */
   1268     PUT_BITS(ps_bitstrm, ps_pps->i1_sign_data_hiding_flag, 1, return_status);
   1269     ENTROPY_TRACE("sign_data_hiding_flag", ps_pps->i1_sign_data_hiding_flag);
   1270 
   1271     /* cabac_init_present_flag */
   1272     PUT_BITS(ps_bitstrm, ps_pps->i1_cabac_init_present_flag, 1, return_status);
   1273     ENTROPY_TRACE("cabac_init_present_flag", ps_pps->i1_cabac_init_present_flag);
   1274 
   1275     /* num_ref_idx_l0_default_active_minus1 */
   1276     PUT_BITS_UEV(ps_bitstrm, ps_pps->i1_num_ref_idx_l0_default_active - 1, return_status);
   1277     ENTROPY_TRACE(
   1278         "num_ref_idx_l0_default_active_minus1", ps_pps->i1_num_ref_idx_l0_default_active - 1);
   1279 
   1280     /* num_ref_idx_l1_default_active_minus1 */
   1281     PUT_BITS_UEV(ps_bitstrm, ps_pps->i1_num_ref_idx_l1_default_active - 1, return_status);
   1282     ENTROPY_TRACE(
   1283         "num_ref_idx_l1_default_active_minus1", ps_pps->i1_num_ref_idx_l1_default_active - 1);
   1284 
   1285     /* pic_init_qp_minus26 */
   1286     PUT_BITS_SEV(ps_bitstrm, ps_pps->i1_pic_init_qp - 26, return_status);
   1287     ENTROPY_TRACE("pic_init_qp_minus26", ps_pps->i1_pic_init_qp - 26);
   1288 
   1289     /* constrained_intra_pred_flag */
   1290     PUT_BITS(ps_bitstrm, ps_pps->i1_constrained_intra_pred_flag, 1, return_status);
   1291     ENTROPY_TRACE("constrained_intra_pred_flag", ps_pps->i1_constrained_intra_pred_flag);
   1292 
   1293     /* transform_skip_enabled_flag */
   1294     PUT_BITS(ps_bitstrm, ps_pps->i1_transform_skip_enabled_flag, 1, return_status);
   1295     ENTROPY_TRACE("transform_skip_enabled_flag", ps_pps->i1_transform_skip_enabled_flag);
   1296 
   1297     /* cu_qp_delta_enabled_flag */
   1298     PUT_BITS(ps_bitstrm, ps_pps->i1_cu_qp_delta_enabled_flag, 1, return_status);
   1299     ENTROPY_TRACE("cu_qp_delta_enabled_flag", ps_pps->i1_cu_qp_delta_enabled_flag);
   1300 
   1301     if(ps_pps->i1_cu_qp_delta_enabled_flag)
   1302     {
   1303         /* diff_cu_qp_delta_depth */
   1304         PUT_BITS_UEV(ps_bitstrm, ps_pps->i1_diff_cu_qp_delta_depth, return_status);
   1305         ENTROPY_TRACE("diff_cu_qp_delta_depth", ps_pps->i1_diff_cu_qp_delta_depth);
   1306     }
   1307 
   1308     /* cb_qp_offset */
   1309     PUT_BITS_SEV(ps_bitstrm, ps_pps->i1_pic_cb_qp_offset, return_status);
   1310     ENTROPY_TRACE("cb_qp_offset", ps_pps->i1_pic_cb_qp_offset);
   1311 
   1312     /* cr_qp_offset */
   1313     PUT_BITS_SEV(ps_bitstrm, ps_pps->i1_pic_cr_qp_offset, return_status);
   1314     ENTROPY_TRACE("cr_qp_offset", ps_pps->i1_pic_cr_qp_offset);
   1315 
   1316     /* slicelevel_chroma_qp_flag */
   1317     PUT_BITS(
   1318         ps_bitstrm, ps_pps->i1_pic_slice_level_chroma_qp_offsets_present_flag, 1, return_status);
   1319     ENTROPY_TRACE(
   1320         "slicelevel_chroma_qp_flag", ps_pps->i1_pic_slice_level_chroma_qp_offsets_present_flag);
   1321 
   1322     /* weighted_pred_flag */
   1323     PUT_BITS(ps_bitstrm, ps_pps->i1_weighted_pred_flag, 1, return_status);
   1324     ENTROPY_TRACE("weighted_pred_flag", ps_pps->i1_weighted_pred_flag);
   1325 
   1326     /* weighted_bipred_flag */
   1327     PUT_BITS(ps_bitstrm, ps_pps->i1_weighted_bipred_flag, 1, return_status);
   1328     ENTROPY_TRACE("weighted_bipred_flag", ps_pps->i1_weighted_bipred_flag);
   1329 
   1330     /* transquant_bypass_enable_flag */
   1331     PUT_BITS(ps_bitstrm, ps_pps->i1_transquant_bypass_enable_flag, 1, return_status);
   1332     ENTROPY_TRACE("transquant_bypass_enable_flag", ps_pps->i1_transquant_bypass_enable_flag);
   1333 
   1334     /* tiles_enabled_flag */
   1335     PUT_BITS(ps_bitstrm, ps_pps->i1_tiles_enabled_flag, 1, return_status);
   1336     ENTROPY_TRACE("tiles_enabled_flag", ps_pps->i1_tiles_enabled_flag);
   1337 
   1338     /* entropy_coding_sync_enabled_flag */
   1339     PUT_BITS(ps_bitstrm, ps_pps->i1_entropy_coding_sync_enabled_flag, 1, return_status);
   1340     ENTROPY_TRACE("entropy_coding_sync_enabled_flag", ps_pps->i1_entropy_coding_sync_enabled_flag);
   1341 
   1342     if(ps_pps->i1_tiles_enabled_flag)
   1343     {
   1344         /* num_tile_columns_minus1 */
   1345         PUT_BITS_UEV(ps_bitstrm, ps_pps->i1_num_tile_columns - 1, return_status);
   1346         ENTROPY_TRACE("num_tile_columns_minus1", ps_pps->i1_num_tile_columns - 1);
   1347 
   1348         /* num_tile_rows_minus1 */
   1349         PUT_BITS_UEV(ps_bitstrm, ps_pps->i1_num_tile_rows - 1, return_status);
   1350         ENTROPY_TRACE("num_tile_rows_minus1", ps_pps->i1_num_tile_rows - 1);
   1351 
   1352         /* uniform_spacing_flag */
   1353         PUT_BITS(ps_bitstrm, ps_pps->i1_uniform_spacing_flag, 1, return_status);
   1354         ENTROPY_TRACE("uniform_spacing_flag", ps_pps->i1_uniform_spacing_flag);
   1355 
   1356         if(!ps_pps->i1_uniform_spacing_flag)
   1357         {
   1358             for(i = 0; i < ps_pps->i1_num_tile_columns - 1; i++)
   1359             {
   1360                 /* column_width_minus1[i] */
   1361                 PUT_BITS_UEV(ps_bitstrm, ps_pps->ps_tile[i].u2_wd - 1, return_status);
   1362                 ENTROPY_TRACE("column_width_minus1[i]", ps_pps->ps_tile[i].u2_wd - 1);
   1363             }
   1364             for(i = 0; i < ps_pps->i1_num_tile_rows - 1; i++)
   1365             {
   1366                 /* row_height_minus1[i] */
   1367                 PUT_BITS_UEV(ps_bitstrm, ps_pps->ps_tile[i].u2_ht - 1, return_status);
   1368                 ENTROPY_TRACE("row_height_minus1[i]", ps_pps->ps_tile[i].u2_ht - 1);
   1369             }
   1370         }
   1371 
   1372         /* loop_filter_across_tiles_enabled_flag */
   1373         PUT_BITS(ps_bitstrm, ps_pps->i1_loop_filter_across_tiles_enabled_flag, 1, return_status);
   1374         ENTROPY_TRACE(
   1375             "loop_filter_across_tiles_enabled_flag",
   1376             ps_pps->i1_loop_filter_across_tiles_enabled_flag);
   1377     }
   1378 
   1379     /* loop_filter_across_slices_enabled_flag */
   1380     PUT_BITS(ps_bitstrm, ps_pps->i1_loop_filter_across_slices_enabled_flag, 1, return_status);
   1381     ENTROPY_TRACE(
   1382         "loop_filter_across_slices_enabled_flag",
   1383         ps_pps->i1_loop_filter_across_slices_enabled_flag);
   1384 
   1385     /* deblocking_filter_control_present_flag */
   1386     PUT_BITS(ps_bitstrm, ps_pps->i1_deblocking_filter_control_present_flag, 1, return_status);
   1387     ENTROPY_TRACE(
   1388         "deblocking_filter_control_present_flag",
   1389         ps_pps->i1_deblocking_filter_control_present_flag);
   1390 
   1391     if(ps_pps->i1_deblocking_filter_control_present_flag)
   1392     {
   1393         /* deblocking_filter_override_enabled_flag */
   1394         PUT_BITS(ps_bitstrm, ps_pps->i1_deblocking_filter_override_enabled_flag, 1, return_status);
   1395         ENTROPY_TRACE(
   1396             "deblocking_filter_override_enabled_flag",
   1397             ps_pps->i1_deblocking_filter_override_enabled_flag);
   1398 
   1399         /* pic_disable_deblocking_filter_flag */
   1400         PUT_BITS(ps_bitstrm, ps_pps->i1_pic_disable_deblocking_filter_flag, 1, return_status);
   1401         ENTROPY_TRACE(
   1402             "pic_disable_deblocking_filter_flag", ps_pps->i1_pic_disable_deblocking_filter_flag);
   1403 
   1404         if(!ps_pps->i1_pic_disable_deblocking_filter_flag)
   1405         {
   1406             /* beta_offset_div2 */
   1407             PUT_BITS_SEV(ps_bitstrm, ps_pps->i1_beta_offset_div2 >> 1, return_status);
   1408             ENTROPY_TRACE("beta_offset_div2", ps_pps->i1_beta_offset_div2 >> 1);
   1409 
   1410             /* tc_offset_div2 */
   1411             PUT_BITS_SEV(ps_bitstrm, ps_pps->i1_tc_offset_div2 >> 1, return_status);
   1412             ENTROPY_TRACE("tc_offset_div2", ps_pps->i1_tc_offset_div2 >> 1);
   1413         }
   1414     }
   1415 
   1416     /* pps_scaling_list_data_present_flag */
   1417     PUT_BITS(ps_bitstrm, ps_pps->i1_pps_scaling_list_data_present_flag, 1, return_status);
   1418     ENTROPY_TRACE(
   1419         "pps_scaling_list_data_present_flag", ps_pps->i1_pps_scaling_list_data_present_flag);
   1420 
   1421 #if 0 /* TODO: Will be enabled once scaling list support is added */
   1422     if(ps_pps->i1_pps_scaling_list_data_present_flag )
   1423     {
   1424         //TODO
   1425         ihevce_scaling_list_data();
   1426     }
   1427 #endif
   1428 
   1429     /* lists_modification_present_flag */
   1430     PUT_BITS(ps_bitstrm, ps_pps->i1_lists_modification_present_flag, 1, return_status);
   1431     ENTROPY_TRACE("lists_modification_present_flag", ps_pps->i1_lists_modification_present_flag);
   1432 
   1433     {
   1434         UWORD32 u4_log2_parallel_merge_level_minus2 = ps_pps->i1_log2_parallel_merge_level;
   1435 
   1436         u4_log2_parallel_merge_level_minus2 -= 2;
   1437 
   1438         /* log2_parallel_merge_level_minus2 */
   1439         PUT_BITS_UEV(ps_bitstrm, u4_log2_parallel_merge_level_minus2, return_status);
   1440         ENTROPY_TRACE("log2_parallel_merge_level_minus2", u4_log2_parallel_merge_level_minus2);
   1441     }
   1442 
   1443     /* slice_header_extension_present_flag */
   1444     PUT_BITS(ps_bitstrm, ps_pps->i1_slice_header_extension_present_flag, 1, return_status);
   1445     ENTROPY_TRACE(
   1446         "slice_header_extension_present_flag", ps_pps->i1_slice_header_extension_present_flag);
   1447 
   1448     /* pps_extension_flag */
   1449     PUT_BITS(ps_bitstrm, 0, 1, return_status);
   1450     ENTROPY_TRACE("pps_extension_flag", 0);
   1451 
   1452     ihevce_put_rbsp_trailing_bits(ps_bitstrm);
   1453 
   1454     return return_status;
   1455 }
   1456 
   1457 /**
   1458 ******************************************************************************
   1459 *
   1460 *  @brief Generates Slice Header
   1461 *
   1462 *  @par   Description
   1463 *  Generate Slice Header as per Section 7.3.5.1
   1464 *
   1465 *  @param[inout]   ps_bitstrm
   1466 *  pointer to bitstream context for generating slice header
   1467 *
   1468 *  @param[in]   i1_nal_unit_type
   1469 *  nal unit type
   1470 *
   1471 *  @param[in]   ps_slice_hdr
   1472 *  pointer to slice header params
   1473 *
   1474 *  @param[in]   ps_pps
   1475 *  pointer to pps params referred by slice
   1476 *
   1477 *  @param[in]   ps_sps
   1478 *  pointer to sps params referred by slice
   1479 *
   1480 *  @return      success or failure error code
   1481 *
   1482 ******************************************************************************
   1483 */
   1484 WORD32 ihevce_generate_slice_header(
   1485     bitstrm_t *ps_bitstrm,
   1486     WORD8 i1_nal_unit_type,
   1487     slice_header_t *ps_slice_hdr,
   1488     pps_t *ps_pps,
   1489     sps_t *ps_sps,
   1490     bitstrm_t *ps_dup_bit_strm_ent_offset,
   1491     UWORD32 *pu4_first_slice_start_offset,
   1492     ihevce_tile_params_t *ps_tile_params,
   1493     WORD32 i4_next_slice_seg_x,
   1494     WORD32 i4_next_slice_seg_y)
   1495 {
   1496     WORD32 i;
   1497     WORD32 return_status = IHEVCE_SUCCESS;
   1498 
   1499     WORD32 RapPicFlag = (i1_nal_unit_type >= NAL_BLA_W_LP) &&
   1500                         (i1_nal_unit_type <= NAL_RSV_RAP_VCL23);
   1501     WORD32 idr_pic_flag = (NAL_IDR_W_LP == i1_nal_unit_type) || (NAL_IDR_N_LP == i1_nal_unit_type);
   1502 
   1503     WORD32 disable_deblocking_filter_flag;
   1504 
   1505     WORD32 i4_NumPocTotalCurr = 0;
   1506     /* Initialize the pic width and pic height from sps parameters */
   1507     WORD32 pic_width = ps_sps->i2_pic_width_in_luma_samples;
   1508     WORD32 pic_height = ps_sps->i2_pic_height_in_luma_samples;
   1509 
   1510     /* Initialize the CTB size from sps parameters */
   1511     WORD32 log2_ctb_size =
   1512         ps_sps->i1_log2_min_coding_block_size + ps_sps->i1_log2_diff_max_min_coding_block_size;
   1513     WORD32 ctb_size = (1 << log2_ctb_size);
   1514 
   1515     /* Update ps_slice_hdr->i2_slice_address based on tile position in frame */
   1516     WORD32 num_ctb_in_row = (pic_width + ctb_size - 1) >> log2_ctb_size;
   1517 
   1518     /* Overwrite i2_slice_address here as pre-enc didn't had tile structure
   1519     available in it's scope. Otherwise i2_slice_address would be set in
   1520     populate_slice_header() itself */
   1521     if(1 == ps_tile_params->i4_tiles_enabled_flag)
   1522     {
   1523         ps_slice_hdr->i2_slice_address =
   1524             ps_tile_params->i4_first_ctb_y * num_ctb_in_row + ps_tile_params->i4_first_ctb_x;
   1525     }
   1526     else
   1527     {
   1528         ps_slice_hdr->i2_slice_address = i4_next_slice_seg_x + i4_next_slice_seg_y * num_ctb_in_row;
   1529     }
   1530 
   1531     /* Overwrite i1_first_slice_in_pic_flag here as pre-enc didn't had tile structure
   1532     available in it's scope. Otherwise i1_first_slice_in_pic_flag would be set in
   1533     populate_slice_header() itself */
   1534     ps_slice_hdr->i1_first_slice_in_pic_flag = (ps_slice_hdr->i2_slice_address == 0);
   1535 
   1536     /* Currently if dependent slices are enabled, then all slices
   1537     after first slice of picture, are made dependent slices */
   1538     if((1 == ps_pps->i1_dependent_slice_enabled_flag) &&
   1539        (0 == ps_slice_hdr->i1_first_slice_in_pic_flag))
   1540     {
   1541         ps_slice_hdr->i1_dependent_slice_flag = 1;
   1542     }
   1543     else
   1544     {
   1545         ps_slice_hdr->i1_dependent_slice_flag = 0;
   1546     }
   1547 
   1548     /* Insert start code */
   1549     return_status |= ihevce_put_nal_start_code_prefix(ps_bitstrm, 1);
   1550 
   1551     /* Insert Nal Unit Header */
   1552     return_status |= ihevce_generate_nal_unit_header(
   1553         ps_bitstrm,
   1554         i1_nal_unit_type,
   1555         ps_slice_hdr->u4_nuh_temporal_id);  //TEMPORALA_SCALABILITY CHANGES
   1556 
   1557     /* first_slice_in_pic_flag */
   1558     PUT_BITS(ps_bitstrm, ps_slice_hdr->i1_first_slice_in_pic_flag, 1, return_status);
   1559     ENTROPY_TRACE("first_slice_in_pic_flag", ps_slice_hdr->i1_first_slice_in_pic_flag);
   1560 
   1561     if(RapPicFlag)
   1562     {
   1563         /* no_output_of_prior_pics_flag */
   1564         PUT_BITS(ps_bitstrm, ps_slice_hdr->i1_no_output_of_prior_pics_flag, 1, return_status);
   1565         ENTROPY_TRACE(
   1566             "no_output_of_prior_pics_flag", ps_slice_hdr->i1_no_output_of_prior_pics_flag);
   1567     }
   1568 
   1569     /* pic_parameter_set_id */
   1570     PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_pps_id, return_status);
   1571     ENTROPY_TRACE("pic_parameter_set_id", ps_slice_hdr->i1_pps_id);
   1572 
   1573     /* If ps_pps->i1_dependent_slice_enabled_flag is enabled and
   1574     curent slice is not the first slice of picture then put
   1575     i1_dependent_slice_flag into the bitstream */
   1576     if((ps_pps->i1_dependent_slice_enabled_flag) && (!ps_slice_hdr->i1_first_slice_in_pic_flag))
   1577     {
   1578         /* dependent_slice_flag */
   1579         PUT_BITS(ps_bitstrm, ps_slice_hdr->i1_dependent_slice_flag, 1, return_status);
   1580         ENTROPY_TRACE("dependent_slice_flag", ps_slice_hdr->i1_dependent_slice_flag);
   1581     }
   1582 
   1583     if(!ps_slice_hdr->i1_first_slice_in_pic_flag)
   1584     {
   1585         WORD32 num_bits;
   1586         WORD32 num_ctb_in_pic;
   1587 
   1588         /* ctbs in frame ceiled for width / height not multiple of ctb size */
   1589         num_ctb_in_pic = ((pic_width + (ctb_size - 1)) >> log2_ctb_size) *
   1590                          ((pic_height + (ctb_size - 1)) >> log2_ctb_size);
   1591 
   1592         /* Use CLZ to compute Ceil( Log2( PicSizeInCtbsY ) ) */
   1593         num_bits = 32 - CLZ(num_ctb_in_pic - 1);
   1594 
   1595         /* slice_address */
   1596         PUT_BITS(ps_bitstrm, ps_slice_hdr->i2_slice_address, num_bits, return_status);
   1597         ENTROPY_TRACE("slice_address", ps_slice_hdr->i2_slice_address);
   1598     }
   1599 
   1600     if(!ps_slice_hdr->i1_dependent_slice_flag)
   1601     {
   1602         for(i = 0; i < ps_pps->i1_num_extra_slice_header_bits; i++)
   1603         {
   1604             /* slice_reserved_undetermined_flag */
   1605             PUT_BITS(ps_bitstrm, 0, 1, return_status);
   1606             ENTROPY_TRACE("slice_reserved_undetermined_flag", 0);
   1607         }
   1608         /* slice_type */
   1609         PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_slice_type, return_status);
   1610         ENTROPY_TRACE("slice_type", ps_slice_hdr->i1_slice_type);
   1611 
   1612         if(ps_pps->i1_output_flag_present_flag)
   1613         {
   1614             /* pic_output_flag */
   1615             PUT_BITS(ps_bitstrm, ps_slice_hdr->i1_pic_output_flag, 1, return_status);
   1616             ENTROPY_TRACE("pic_output_flag", ps_slice_hdr->i1_pic_output_flag);
   1617         }
   1618 
   1619         if(!idr_pic_flag)
   1620         {
   1621             /* pic_order_cnt_lsb */
   1622             PUT_BITS(
   1623                 ps_bitstrm,
   1624                 ps_slice_hdr->i4_pic_order_cnt_lsb,
   1625                 ps_sps->i1_log2_max_pic_order_cnt_lsb,
   1626                 return_status);
   1627             ENTROPY_TRACE("pic_order_cnt_lsb", ps_slice_hdr->i4_pic_order_cnt_lsb);
   1628 
   1629             /* short_term_ref_pic_set_sps_flag */
   1630             PUT_BITS(
   1631                 ps_bitstrm, ps_slice_hdr->i1_short_term_ref_pic_set_sps_flag, 1, return_status);
   1632             ENTROPY_TRACE(
   1633                 "short_term_ref_pic_set_sps_flag",
   1634                 ps_slice_hdr->i1_short_term_ref_pic_set_sps_flag);
   1635 
   1636             if(!ps_slice_hdr->i1_short_term_ref_pic_set_sps_flag)
   1637             {
   1638                 ihevce_short_term_ref_pic_set(
   1639                     ps_bitstrm, &ps_slice_hdr->s_stref_picset, 1, 0, &i4_NumPocTotalCurr);
   1640             }
   1641             else
   1642             {
   1643                 WORD32 num_bits = 32 - CLZ(ps_sps->i1_num_short_term_ref_pic_sets);
   1644 
   1645                 /* short_term_ref_pic_set_idx */
   1646                 PUT_BITS(
   1647                     ps_bitstrm,
   1648                     ps_slice_hdr->i1_short_term_ref_pic_set_idx,
   1649                     num_bits,
   1650                     return_status);
   1651                 ENTROPY_TRACE(
   1652                     "short_term_ref_pic_set_idx", ps_slice_hdr->i1_short_term_ref_pic_set_idx);
   1653             }
   1654 
   1655             if(ps_sps->i1_long_term_ref_pics_present_flag)
   1656             {
   1657                 if(ps_sps->i1_num_long_term_ref_pics_sps > 0)
   1658                 {
   1659                     /* num_long_term_sps */
   1660                     PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_num_long_term_sps, return_status);
   1661                     ENTROPY_TRACE("num_long_term_sps", ps_slice_hdr->i1_num_long_term_sps);
   1662                 }
   1663 
   1664                 /* num_long_term_pics */
   1665                 PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_num_long_term_pics, return_status);
   1666                 ENTROPY_TRACE("num_long_term_pics", ps_slice_hdr->i1_num_long_term_pics);
   1667 
   1668                 for(i = 0;
   1669                     i < (ps_slice_hdr->i1_num_long_term_sps + ps_slice_hdr->i1_num_long_term_pics);
   1670                     i++)
   1671                 {
   1672                     if(i < ps_slice_hdr->i1_num_long_term_sps)
   1673                     {
   1674                         /* Use CLZ to compute Ceil( Log2
   1675                         ( num_long_term_ref_pics_sps ) ) */
   1676                         WORD32 num_bits = 32 - CLZ(ps_sps->i1_num_long_term_ref_pics_sps);
   1677 
   1678                         /* lt_idx_sps[i] */
   1679                         PUT_BITS(
   1680                             ps_bitstrm, ps_slice_hdr->ai1_lt_idx_sps[i], num_bits, return_status);
   1681                         ENTROPY_TRACE("lt_idx_sps[i]", ps_slice_hdr->ai1_lt_idx_sps[i]);
   1682                     }
   1683                     else
   1684                     {
   1685                         /* poc_lsb_lt[i] */
   1686                         PUT_BITS(
   1687                             ps_bitstrm,
   1688                             ps_slice_hdr->ai4_poc_lsb_lt[i],
   1689                             ps_sps->i1_log2_max_pic_order_cnt_lsb,
   1690                             return_status);
   1691                         ENTROPY_TRACE("poc_lsb_lt[i]", ps_slice_hdr->ai4_poc_lsb_lt[i]);
   1692 
   1693                         /* used_by_curr_pic_lt_flag[i] */
   1694                         PUT_BITS(
   1695                             ps_bitstrm,
   1696                             ps_slice_hdr->ai1_used_by_curr_pic_lt_flag[i],
   1697                             1,
   1698                             return_status);
   1699                         ENTROPY_TRACE(
   1700                             "used_by_curr_pic_lt_flag[i]",
   1701                             ps_slice_hdr->ai1_used_by_curr_pic_lt_flag[i]);
   1702                     }
   1703 
   1704                     /* delta_poc_msb_present_flag[i] */
   1705                     PUT_BITS(
   1706                         ps_bitstrm,
   1707                         ps_slice_hdr->ai1_delta_poc_msb_present_flag[i],
   1708                         1,
   1709                         return_status);
   1710                     ENTROPY_TRACE(
   1711                         "delta_poc_msb_present_flag[i]",
   1712                         ps_slice_hdr->ai1_delta_poc_msb_present_flag[i]);
   1713 
   1714                     if(ps_slice_hdr->ai1_delta_poc_msb_present_flag[i])
   1715                     {
   1716                         /* delata_poc_msb_cycle_lt[i] */
   1717                         PUT_BITS_UEV(
   1718                             ps_bitstrm, ps_slice_hdr->ai1_delta_poc_msb_cycle_lt[i], return_status);
   1719                         ENTROPY_TRACE(
   1720                             "delata_poc_msb_cycle_lt", ps_slice_hdr->ai1_delta_poc_msb_cycle_lt[i]);
   1721                     }
   1722                 }
   1723             }
   1724 
   1725             if(ps_sps->i1_sps_temporal_mvp_enable_flag)
   1726             {
   1727                 /* slice_temporal_mvp_enable_flag */
   1728                 PUT_BITS(
   1729                     ps_bitstrm, ps_slice_hdr->i1_slice_temporal_mvp_enable_flag, 1, return_status);
   1730                 ENTROPY_TRACE(
   1731                     "slice_temporal_mvp_enable_flag",
   1732                     ps_slice_hdr->i1_slice_temporal_mvp_enable_flag);
   1733             }
   1734         }
   1735 
   1736         if(ps_sps->i1_sample_adaptive_offset_enabled_flag)
   1737         {
   1738             /* slice_sao_luma_flag */
   1739             PUT_BITS(ps_bitstrm, ps_slice_hdr->i1_slice_sao_luma_flag, 1, return_status);
   1740             ENTROPY_TRACE("slice_sao_luma_flag", ps_slice_hdr->i1_slice_sao_luma_flag);
   1741 
   1742             /* slice_sao_chroma_flag */
   1743             PUT_BITS(ps_bitstrm, ps_slice_hdr->i1_slice_sao_chroma_flag, 1, return_status);
   1744             ENTROPY_TRACE("slice_sao_chroma_flag", ps_slice_hdr->i1_slice_sao_chroma_flag);
   1745         }
   1746         if((PSLICE == ps_slice_hdr->i1_slice_type) || (BSLICE == ps_slice_hdr->i1_slice_type))
   1747         {
   1748             /* num_ref_idx_active_override_flag */
   1749             PUT_BITS(
   1750                 ps_bitstrm, ps_slice_hdr->i1_num_ref_idx_active_override_flag, 1, return_status);
   1751             ENTROPY_TRACE(
   1752                 "num_ref_idx_active_override_flag",
   1753                 ps_slice_hdr->i1_num_ref_idx_active_override_flag);
   1754 
   1755             if(ps_slice_hdr->i1_num_ref_idx_active_override_flag)
   1756             {
   1757                 /* i1_num_ref_idx_l0_active_minus1 */
   1758                 PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_num_ref_idx_l0_active - 1, return_status);
   1759                 ENTROPY_TRACE(
   1760                     "i1_num_ref_idx_l0_active_minus1", ps_slice_hdr->i1_num_ref_idx_l0_active - 1);
   1761 
   1762                 if(BSLICE == ps_slice_hdr->i1_slice_type)
   1763                 {
   1764                     /* i1_num_ref_idx_l1_active */
   1765                     PUT_BITS_UEV(
   1766                         ps_bitstrm, ps_slice_hdr->i1_num_ref_idx_l1_active - 1, return_status);
   1767                     ENTROPY_TRACE(
   1768                         "i1_num_ref_idx_l1_active", ps_slice_hdr->i1_num_ref_idx_l1_active - 1);
   1769                 }
   1770             }
   1771 
   1772             if(ps_pps->i1_lists_modification_present_flag && i4_NumPocTotalCurr > 1)
   1773             {
   1774                 ref_pic_list_modification(ps_bitstrm, ps_slice_hdr, i4_NumPocTotalCurr);
   1775             }
   1776 
   1777             if(BSLICE == ps_slice_hdr->i1_slice_type)
   1778             {
   1779                 /* mvd_l1_zero_flag */
   1780                 PUT_BITS(ps_bitstrm, ps_slice_hdr->i1_mvd_l1_zero_flag, 1, return_status);
   1781                 ENTROPY_TRACE("mvd_l1_zero_flag", ps_slice_hdr->i1_mvd_l1_zero_flag);
   1782             }
   1783 
   1784             if(ps_pps->i1_cabac_init_present_flag)
   1785             {
   1786                 /* cabac_init_flag */
   1787                 PUT_BITS(ps_bitstrm, ps_slice_hdr->i1_cabac_init_flag, 1, return_status);
   1788                 ENTROPY_TRACE("cabac_init_flag", ps_slice_hdr->i1_cabac_init_flag);
   1789             }
   1790 
   1791             if(ps_slice_hdr->i1_slice_temporal_mvp_enable_flag)
   1792             {
   1793                 if(BSLICE == ps_slice_hdr->i1_slice_type)
   1794                 {
   1795                     /* collocated_from_l0_flag */
   1796                     PUT_BITS(
   1797                         ps_bitstrm, ps_slice_hdr->i1_collocated_from_l0_flag, 1, return_status);
   1798                     ENTROPY_TRACE(
   1799                         "collocated_from_l0_flag", ps_slice_hdr->i1_collocated_from_l0_flag);
   1800                 }
   1801                 if((ps_slice_hdr->i1_collocated_from_l0_flag &&
   1802                     (ps_slice_hdr->i1_num_ref_idx_l0_active > 1)) ||
   1803                    (!ps_slice_hdr->i1_collocated_from_l0_flag &&
   1804                     (ps_slice_hdr->i1_num_ref_idx_l1_active > 1)))
   1805                 {
   1806                     /* collocated_ref_idx */
   1807                     PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_collocated_ref_idx, return_status);
   1808                     ENTROPY_TRACE("collocated_ref_idx", ps_slice_hdr->i1_collocated_ref_idx);
   1809                 }
   1810             }
   1811 
   1812             if((ps_pps->i1_weighted_pred_flag && (PSLICE == ps_slice_hdr->i1_slice_type)) ||
   1813                (ps_pps->i1_weighted_bipred_flag && (BSLICE == ps_slice_hdr->i1_slice_type)))
   1814             {
   1815                 ihevce_generate_pred_weight_table(ps_bitstrm, ps_sps, ps_pps, ps_slice_hdr);
   1816             }
   1817 
   1818 #if !HM_8DOT1_SYNTAX
   1819             /* five_minus_max_num_merge_cand */
   1820             PUT_BITS_UEV(ps_bitstrm, 5 - ps_slice_hdr->i1_max_num_merge_cand, return_status);
   1821             ENTROPY_TRACE("five_minus_max_num_merge_cand", 5 - ps_slice_hdr->i1_max_num_merge_cand);
   1822 #endif
   1823         }
   1824 #if HM_8DOT1_SYNTAX
   1825         /* five_minus_max_num_merge_cand */
   1826         PUT_BITS_UEV(ps_bitstrm, 5 - ps_slice_hdr->i1_max_num_merge_cand, return_status);
   1827         ENTROPY_TRACE("five_minus_max_num_merge_cand", 5 - ps_slice_hdr->i1_max_num_merge_cand);
   1828 #endif
   1829 
   1830         /* slice_qp_delta */
   1831         PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->i1_slice_qp_delta, return_status);
   1832         ENTROPY_TRACE("slice_qp_delta", ps_slice_hdr->i1_slice_qp_delta);
   1833 
   1834         if(ps_pps->i1_pic_slice_level_chroma_qp_offsets_present_flag)
   1835         {
   1836             /* slice_cb_qp_offset */
   1837             PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->i1_slice_cb_qp_offset, return_status);
   1838             ENTROPY_TRACE("slice_cb_qp_offset", ps_slice_hdr->i1_slice_cb_qp_offset);
   1839 
   1840             /* slice_cr_qp_offset */
   1841             PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->i1_slice_cr_qp_offset, return_status);
   1842             ENTROPY_TRACE("slice_cr_qp_offset", ps_slice_hdr->i1_slice_cr_qp_offset);
   1843         }
   1844 
   1845         if(ps_pps->i1_deblocking_filter_control_present_flag)
   1846         {
   1847             if(ps_pps->i1_deblocking_filter_override_enabled_flag)
   1848             {
   1849                 /* deblocking_filter_override_flag */
   1850                 PUT_BITS(
   1851                     ps_bitstrm, ps_slice_hdr->i1_deblocking_filter_override_flag, 1, return_status);
   1852                 ENTROPY_TRACE(
   1853                     "deblocking_filter_override_flag",
   1854                     ps_slice_hdr->i1_deblocking_filter_override_flag);
   1855             }
   1856 
   1857             if(ps_slice_hdr->i1_deblocking_filter_override_flag)
   1858             {
   1859                 /* slice_disable_deblocking_filter_flag */
   1860                 PUT_BITS(
   1861                     ps_bitstrm,
   1862                     ps_slice_hdr->i1_slice_disable_deblocking_filter_flag,
   1863                     1,
   1864                     return_status);
   1865                 ENTROPY_TRACE(
   1866                     "slice_disable_deblocking_filter_flag",
   1867                     ps_slice_hdr->i1_slice_disable_deblocking_filter_flag);
   1868 
   1869                 if(!ps_slice_hdr->i1_slice_disable_deblocking_filter_flag)
   1870                 {
   1871                     /* beta_offset_div2 */
   1872                     PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->i1_beta_offset_div2 >> 1, return_status);
   1873                     ENTROPY_TRACE("beta_offset_div2", ps_slice_hdr->i1_beta_offset_div2 >> 1);
   1874 
   1875                     /* tc_offset_div2 */
   1876                     PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->i1_tc_offset_div2 >> 1, return_status);
   1877                     ENTROPY_TRACE("tc_offset_div2", ps_slice_hdr->i1_tc_offset_div2 >> 1);
   1878                 }
   1879             }
   1880         }
   1881 
   1882         disable_deblocking_filter_flag = ps_slice_hdr->i1_slice_disable_deblocking_filter_flag |
   1883                                          ps_pps->i1_pic_disable_deblocking_filter_flag;
   1884 
   1885         if(ps_pps->i1_loop_filter_across_slices_enabled_flag &&
   1886            (ps_slice_hdr->i1_slice_sao_luma_flag || ps_slice_hdr->i1_slice_sao_chroma_flag ||
   1887             !disable_deblocking_filter_flag))
   1888         {
   1889             /* slice_loop_filter_across_slices_enabled_flag */
   1890             PUT_BITS(
   1891                 ps_bitstrm,
   1892                 ps_slice_hdr->i1_slice_loop_filter_across_slices_enabled_flag,
   1893                 1,
   1894                 return_status);
   1895             ENTROPY_TRACE(
   1896                 "slice_loop_filter_across_slices_enabled_flag",
   1897                 ps_slice_hdr->i1_slice_loop_filter_across_slices_enabled_flag);
   1898         }
   1899     }
   1900 
   1901     if((ps_pps->i1_tiles_enabled_flag) || (ps_pps->i1_entropy_coding_sync_enabled_flag))
   1902     {
   1903         /* num_entry_point_offsets */
   1904         PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i4_num_entry_point_offsets, return_status);
   1905         ENTROPY_TRACE("num_entry_point_offsets", ps_slice_hdr->i4_num_entry_point_offsets);
   1906 
   1907         /*copy the bitstream state at this stage, later once all the offset are known the duplicated state is used to write offset in bitstream*/
   1908         memcpy(ps_dup_bit_strm_ent_offset, ps_bitstrm, sizeof(bitstrm_t));
   1909 
   1910         if(ps_slice_hdr->i4_num_entry_point_offsets > 0)
   1911         {
   1912             /* offset_len_minus1 */
   1913             PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_offset_len - 1, return_status);
   1914             ENTROPY_TRACE("offset_len_minus1", ps_slice_hdr->i1_offset_len - 1);
   1915 
   1916             /*check the bitstream offset here, the first offset will be fixed here based on num_entry_offset and maximum possible emulaiton prevention bytes*/
   1917             /*This offset is used to generate bitstream, In the end of frame processing actual offset are updated and if there was no emulation bits the extra bytes
   1918             shall be filled with 0xFF so that decoder discards it as part of slice header extension*/
   1919 
   1920             /*assume one byte of emulation preention for every offset we signal*/
   1921             /*considering emulation prevention bytes and assuming incomplete word(4 bytes) that is yet to filled and offset length(4 bytes) that will be calc
   1922             based on max offset length after frame is encoded*/
   1923             pu4_first_slice_start_offset[0] =
   1924                 ps_bitstrm->u4_strm_buf_offset +
   1925                 ((ps_slice_hdr->i4_num_entry_point_offsets * ps_slice_hdr->i1_offset_len) >> 3) +
   1926                 ps_slice_hdr->i4_num_entry_point_offsets + 4 + 4;
   1927 
   1928             ps_slice_hdr->pu4_entry_point_offset[0] = (*pu4_first_slice_start_offset);
   1929 
   1930             for(i = 0; i < ps_slice_hdr->i4_num_entry_point_offsets; i++)
   1931             {
   1932                 /* entry_point_offset[i] */
   1933                 PUT_BITS(
   1934                     ps_bitstrm,
   1935                     ps_slice_hdr->pu4_entry_point_offset[i],
   1936                     ps_slice_hdr->i1_offset_len,
   1937                     return_status);
   1938                 ENTROPY_TRACE("entry_point_offset[i]", ps_slice_hdr->pu4_entry_point_offset[i]);
   1939             }
   1940         }
   1941     }
   1942 
   1943     if(ps_pps->i1_slice_header_extension_present_flag)
   1944     {
   1945         /* slice_header_extension_length */
   1946         PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i2_slice_header_extension_length, return_status);
   1947         ENTROPY_TRACE(
   1948             "slice_header_extension_length", ps_slice_hdr->i2_slice_header_extension_length);
   1949 
   1950         for(i = 0; i < ps_slice_hdr->i2_slice_header_extension_length; i++)
   1951         {
   1952             /* slice_header_extension_data_byte[i] */
   1953             PUT_BITS(ps_bitstrm, 0, 8, return_status);
   1954             ENTROPY_TRACE("slice_header_extension_data_byte[i]", 0);
   1955         }
   1956     }
   1957 
   1958     BYTE_ALIGNMENT(ps_bitstrm);
   1959 
   1960     return return_status;
   1961 }
   1962 
   1963 /**
   1964 ******************************************************************************
   1965 *
   1966 *  @brief Populates vps structure
   1967 *
   1968 *  @par   Description
   1969 *  All the parameters in vps are currently hard coded
   1970 *
   1971 *  @param[out]  ps_vps
   1972 *  pointer to vps params that needs to be populated
   1973 *
   1974 *  @param[in]   ps_src_params
   1975 *  pointer to source config params; resolution, frame rate etc
   1976 *
   1977 *  @param[in]   ps_out_strm_params
   1978 *  pointer to output stream config params
   1979 *
   1980 *  @param[in]   ps_coding_params
   1981 *  pointer to coding params; to enable/disable various toolsets in pps
   1982 *
   1983 *  @param[in]   ps_config_prms
   1984 *  pointer to configuration params like bitrate, HRD buffer sizes, cu, tu sizes
   1985 *
   1986 *
   1987 *  @return      success or failure error code
   1988 *
   1989 ******************************************************************************
   1990 */
   1991 WORD32 ihevce_populate_vps(
   1992     enc_ctxt_t *ps_enc_ctxt,
   1993     vps_t *ps_vps,
   1994     ihevce_src_params_t *ps_src_params,
   1995     ihevce_out_strm_params_t *ps_out_strm_params,
   1996     ihevce_coding_params_t *ps_coding_params,
   1997     ihevce_config_prms_t *ps_config_prms,
   1998     ihevce_static_cfg_params_t *ps_stat_cfg_prms,
   1999     WORD32 i4_resolution_id)
   2000 {
   2001     WORD8 *pi1_profile_compatiblity_flags;
   2002     WORD32 i;
   2003     WORD32 i4_field_pic = ps_src_params->i4_field_pic;
   2004     WORD32 i4_codec_level_index;
   2005     ps_vps->i1_vps_id = DEFAULT_VPS_ID;
   2006 
   2007     (void)ps_config_prms;
   2008     /* default sub layers is 1 */
   2009     ps_vps->i1_vps_max_sub_layers = 1;
   2010     if(1 == ps_stat_cfg_prms->s_tgt_lyr_prms.i4_enable_temporal_scalability)
   2011     {
   2012         ps_vps->i1_vps_max_sub_layers = 2;
   2013     }
   2014 
   2015     for(i = 0; i < ps_vps->i1_vps_max_sub_layers; i++)
   2016     {
   2017         /* currently bit rate and pic rate signalling is disabled */
   2018         ps_vps->ai1_bit_rate_info_present_flag[i] = 0;
   2019         ps_vps->ai1_pic_rate_info_present_flag[i] = 0;
   2020 
   2021         if(ps_vps->ai1_bit_rate_info_present_flag[i])
   2022         {
   2023             /* TODO: Add support for bitrate and max bitrate */
   2024             ps_vps->au2_avg_bit_rate[i] = 0;
   2025             ps_vps->au2_max_bit_rate[i] = 0;
   2026         }
   2027 
   2028         if(ps_vps->ai1_pic_rate_info_present_flag[i])
   2029         {
   2030             /* TODO: Add support for pic rate idc and avg pic rate */
   2031         }
   2032     }
   2033 
   2034     /* default sub layer ordering info present flag */
   2035     ps_vps->i1_sub_layer_ordering_info_present_flag = VPS_SUB_LAYER_ORDERING_INFO_ABSENT;
   2036 
   2037     /* hrd and temporal id nesting not supported for now */
   2038     ps_vps->i1_vps_num_hrd_parameters = 0;
   2039 
   2040     if(ps_vps->i1_vps_max_sub_layers == 1)
   2041     {
   2042         ps_vps->i1_vps_temporal_id_nesting_flag = 1;
   2043     }
   2044     else
   2045     {
   2046         ps_vps->i1_vps_temporal_id_nesting_flag = 0;
   2047     }
   2048 
   2049     /* populate the general profile, tier and level information */
   2050     ps_vps->s_ptl.s_ptl_gen.i1_profile_space = 0;  // BLU_RAY specific change is default
   2051 
   2052     /* set the profile according to user input */
   2053     ps_vps->s_ptl.s_ptl_gen.i1_profile_idc = ps_out_strm_params->i4_codec_profile;
   2054 
   2055     /***************************************************************/
   2056     /* set the profile compatibility flag for current profile to 1 */
   2057     /* the rest of the flags are set to 0                          */
   2058     /***************************************************************/
   2059     pi1_profile_compatiblity_flags = &ps_vps->s_ptl.s_ptl_gen.ai1_profile_compatibility_flag[0];
   2060 
   2061     for(i = 0; i < ps_vps->i1_vps_max_sub_layers; i++)  //TEMPORALA_SCALABILITY CHANGES
   2062     {
   2063         ps_vps->ai1_vps_max_dec_pic_buffering[i] =
   2064             ps_coding_params->i4_max_reference_frames + (2 << i4_field_pic) - 1;
   2065 
   2066         ps_vps->ai1_vps_max_num_reorder_pics[i] = ps_coding_params->i4_max_temporal_layers
   2067                                                   << i4_field_pic;
   2068 
   2069         ps_vps->ai1_vps_max_latency_increase[i] = 0;
   2070 
   2071         ps_vps->s_ptl.ai1_sub_layer_level_present_flag[i] = 1;  //TEMPORALA_SCALABILITY CHANGES
   2072 
   2073         ps_vps->s_ptl.ai1_sub_layer_profile_present_flag[i] = 0;  //TEMPORALA_SCALABILITY CHANGES
   2074 
   2075         ps_vps->s_ptl.as_ptl_sub[i].i1_profile_space = 0;  // BLU_RAY specific change is default
   2076 
   2077         ps_vps->s_ptl.as_ptl_sub[i].i1_profile_idc = ps_out_strm_params->i4_codec_profile;
   2078 
   2079         memset(
   2080             ps_vps->s_ptl.as_ptl_sub[i].ai1_profile_compatibility_flag,
   2081             0,
   2082             MAX_PROFILE_COMPATBLTY * sizeof(WORD8));
   2083 
   2084         ps_vps->s_ptl.as_ptl_sub[i]
   2085             .ai1_profile_compatibility_flag[ps_out_strm_params->i4_codec_profile] = 1;
   2086 
   2087         ps_vps->s_ptl.as_ptl_sub[i].u1_level_idc =
   2088             ps_stat_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_codec_level;
   2089 
   2090         if(0 == i)  // Only one level temporal scalability suport has been added.
   2091         {
   2092             i4_codec_level_index = ihevce_get_level_index(
   2093                 ps_stat_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_codec_level);
   2094 
   2095             if(i4_codec_level_index)
   2096                 i4_codec_level_index -= 1;
   2097 
   2098             ps_vps->s_ptl.as_ptl_sub[i].u1_level_idc =
   2099                 (WORD32)g_as_level_data[i4_codec_level_index].e_level;
   2100         }
   2101 
   2102         ps_vps->s_ptl.as_ptl_sub[i].i1_tier_flag = ps_out_strm_params->i4_codec_tier;
   2103 
   2104         if(ps_src_params->i4_field_pic == IV_PROGRESSIVE)
   2105         {
   2106             ps_vps->s_ptl.as_ptl_sub[i].i1_general_progressive_source_flag = 1;
   2107 
   2108             ps_vps->s_ptl.as_ptl_sub[i].i1_general_interlaced_source_flag = 0;
   2109         }
   2110         else if(ps_src_params->i4_field_pic == IV_INTERLACED)
   2111         {
   2112             ps_vps->s_ptl.as_ptl_sub[i].i1_general_progressive_source_flag = 0;
   2113 
   2114             ps_vps->s_ptl.as_ptl_sub[i].i1_general_interlaced_source_flag = 1;
   2115         }
   2116         else if(ps_src_params->i4_field_pic == IV_CONTENTTYPE_NA)
   2117         {
   2118             ps_vps->s_ptl.as_ptl_sub[i].i1_general_progressive_source_flag = 0;
   2119 
   2120             ps_vps->s_ptl.as_ptl_sub[i].i1_general_interlaced_source_flag = 0;
   2121         }
   2122 
   2123         ps_vps->s_ptl.as_ptl_sub[i].i1_general_non_packed_constraint_flag =
   2124             DEFAULT_NON_PACKED_CONSTRAINT_FLAG;
   2125 
   2126         if(ps_enc_ctxt->i4_blu_ray_spec == 1)
   2127         {
   2128             ps_vps->s_ptl.as_ptl_sub[i].i1_frame_only_constraint_flag = 1;
   2129         }
   2130         else
   2131         {
   2132             ps_vps->s_ptl.as_ptl_sub[i].i1_frame_only_constraint_flag =
   2133                 DEFAULT_FRAME_ONLY_CONSTRAINT_FLAG;
   2134         }
   2135     }
   2136 
   2137     memset(pi1_profile_compatiblity_flags, 0, MAX_PROFILE_COMPATBLTY);
   2138     pi1_profile_compatiblity_flags[ps_out_strm_params->i4_codec_profile] = 1;
   2139 
   2140     /* set the level idc according to user input */
   2141     ps_vps->s_ptl.s_ptl_gen.u1_level_idc =
   2142         ps_stat_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_codec_level;
   2143 
   2144     ps_vps->s_ptl.s_ptl_gen.i1_tier_flag = ps_out_strm_params->i4_codec_tier;
   2145 
   2146     if(ps_src_params->i4_field_pic == IV_PROGRESSIVE)
   2147     {
   2148         ps_vps->s_ptl.s_ptl_gen.i1_general_progressive_source_flag = 1;
   2149 
   2150         ps_vps->s_ptl.s_ptl_gen.i1_general_interlaced_source_flag = 0;
   2151     }
   2152     else if(ps_src_params->i4_field_pic == IV_INTERLACED)
   2153     {
   2154         ps_vps->s_ptl.s_ptl_gen.i1_general_progressive_source_flag = 0;
   2155 
   2156         ps_vps->s_ptl.s_ptl_gen.i1_general_interlaced_source_flag = 1;
   2157     }
   2158     else if(ps_src_params->i4_field_pic == IV_CONTENTTYPE_NA)
   2159     {
   2160         ps_vps->s_ptl.s_ptl_gen.i1_general_progressive_source_flag = 0;
   2161 
   2162         ps_vps->s_ptl.s_ptl_gen.i1_general_interlaced_source_flag = 0;
   2163     }
   2164 
   2165     ps_vps->s_ptl.s_ptl_gen.i1_general_non_packed_constraint_flag =
   2166         DEFAULT_NON_PACKED_CONSTRAINT_FLAG;
   2167 
   2168     if(ps_enc_ctxt->i4_blu_ray_spec == 1)
   2169     {
   2170         ps_vps->s_ptl.s_ptl_gen.i1_frame_only_constraint_flag = 1;
   2171     }
   2172     else
   2173     {
   2174         ps_vps->s_ptl.s_ptl_gen.i1_frame_only_constraint_flag = DEFAULT_FRAME_ONLY_CONSTRAINT_FLAG;
   2175     }
   2176     if((ps_out_strm_params->i4_codec_profile == 4) &&
   2177        (ps_src_params->i4_chr_format == IV_YUV_420SP_UV))
   2178     {
   2179         ps_vps->s_ptl.s_ptl_gen.i1_general_max_12bit_constraint_flag = 1;
   2180 
   2181         ps_vps->s_ptl.s_ptl_gen.i1_general_max_10bit_constraint_flag = 0;
   2182 
   2183         ps_vps->s_ptl.s_ptl_gen.i1_general_max_8bit_constraint_flag = 0;
   2184 
   2185         ps_vps->s_ptl.s_ptl_gen.i1_general_max_422chroma_constraint_flag = 1;
   2186 
   2187         ps_vps->s_ptl.s_ptl_gen.i1_general_max_420chroma_constraint_flag = 1;
   2188 
   2189         ps_vps->s_ptl.s_ptl_gen.i1_general_max_monochrome_constraint_flag = 0;
   2190 
   2191         ps_vps->s_ptl.s_ptl_gen.i1_general_intra_constraint_flag = 0;
   2192 
   2193         ps_vps->s_ptl.s_ptl_gen.i1_general_one_picture_only_constraint_flag = 0;
   2194 
   2195         ps_vps->s_ptl.s_ptl_gen.i1_general_lower_bit_rate_constraint_flag = 1;
   2196     }
   2197     else if(
   2198         (ps_out_strm_params->i4_codec_profile == 4) &&
   2199         (ps_src_params->i4_chr_format == IV_YUV_422SP_UV))
   2200     {
   2201         ps_vps->s_ptl.s_ptl_gen.i1_general_max_12bit_constraint_flag = 1;
   2202 
   2203         ps_vps->s_ptl.s_ptl_gen.i1_general_max_10bit_constraint_flag = 0;
   2204 
   2205         ps_vps->s_ptl.s_ptl_gen.i1_general_max_8bit_constraint_flag = 0;
   2206 
   2207         ps_vps->s_ptl.s_ptl_gen.i1_general_max_422chroma_constraint_flag = 1;
   2208 
   2209         ps_vps->s_ptl.s_ptl_gen.i1_general_max_420chroma_constraint_flag = 0;
   2210 
   2211         ps_vps->s_ptl.s_ptl_gen.i1_general_max_monochrome_constraint_flag = 0;
   2212 
   2213         ps_vps->s_ptl.s_ptl_gen.i1_general_intra_constraint_flag = 0;
   2214 
   2215         ps_vps->s_ptl.s_ptl_gen.i1_general_one_picture_only_constraint_flag = 0;
   2216 
   2217         ps_vps->s_ptl.s_ptl_gen.i1_general_lower_bit_rate_constraint_flag = 1;
   2218     }
   2219     else
   2220     {
   2221         ps_vps->s_ptl.s_ptl_gen.i1_general_max_12bit_constraint_flag = 0;
   2222 
   2223         ps_vps->s_ptl.s_ptl_gen.i1_general_max_10bit_constraint_flag = 0;
   2224 
   2225         ps_vps->s_ptl.s_ptl_gen.i1_general_max_8bit_constraint_flag = 0;
   2226 
   2227         ps_vps->s_ptl.s_ptl_gen.i1_general_max_422chroma_constraint_flag = 0;
   2228 
   2229         ps_vps->s_ptl.s_ptl_gen.i1_general_max_420chroma_constraint_flag = 0;
   2230 
   2231         ps_vps->s_ptl.s_ptl_gen.i1_general_max_monochrome_constraint_flag = 0;
   2232 
   2233         ps_vps->s_ptl.s_ptl_gen.i1_general_intra_constraint_flag = 0;
   2234 
   2235         ps_vps->s_ptl.s_ptl_gen.i1_general_one_picture_only_constraint_flag = 0;
   2236 
   2237         ps_vps->s_ptl.s_ptl_gen.i1_general_lower_bit_rate_constraint_flag = 0;
   2238     }
   2239 
   2240     ps_vps->i1_vps_max_nuh_reserved_zero_layer_id = 0;
   2241 
   2242     return IHEVCE_SUCCESS;
   2243 }
   2244 
   2245 /**
   2246 ******************************************************************************
   2247 *
   2248 *  @brief Populates sps structure
   2249 *
   2250 *  @par   Description
   2251 *  Populates sps structure for its use in header generation
   2252 *
   2253 *  @param[out]  ps_sps
   2254 *  pointer to sps params that needs to be populated
   2255 *
   2256 *  @param[in]   ps_vps
   2257 *  pointer to vps params referred by the sps
   2258 *
   2259 *  @param[in]   ps_src_params
   2260 *  pointer to source config params; resolution, frame rate etc
   2261 *
   2262 *  @param[in]   ps_out_strm_params
   2263 *  pointer to output stream config params
   2264 *
   2265 *  @param[in]   ps_coding_params
   2266 *  pointer to coding params; to enable/disable various toolsets in pps
   2267 *
   2268 *  @param[in]   ps_config_prms
   2269 *  pointer to configuration params like bitrate, HRD buffer sizes, cu, tu sizes
   2270 *
   2271 *  @return      success or failure error code
   2272 *
   2273 ******************************************************************************
   2274 */
   2275 WORD32 ihevce_populate_sps(
   2276     enc_ctxt_t *ps_enc_ctxt,
   2277     sps_t *ps_sps,
   2278     vps_t *ps_vps,
   2279     ihevce_src_params_t *ps_src_params,
   2280     ihevce_out_strm_params_t *ps_out_strm_params,
   2281     ihevce_coding_params_t *ps_coding_params,
   2282     ihevce_config_prms_t *ps_config_prms,
   2283     frm_ctb_ctxt_t *ps_frm_ctb_prms,
   2284     ihevce_static_cfg_params_t *ps_stat_cfg_prms,
   2285     WORD32 i4_resolution_id)
   2286 {
   2287     WORD32 i;
   2288     WORD32 i4_field_pic = ps_src_params->i4_field_pic;
   2289     WORD32 i4_quality_preset =
   2290         ps_stat_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset;
   2291     WORD32 i4_codec_level_index;
   2292 
   2293     if(i4_quality_preset == IHEVCE_QUALITY_P7)
   2294     {
   2295         i4_quality_preset = IHEVCE_QUALITY_P6;
   2296     }
   2297 
   2298     ps_sps->i1_sps_id = DEFAULT_SPS_ID;
   2299 
   2300     if(1 == ps_stat_cfg_prms->s_tgt_lyr_prms.i4_mres_single_out)
   2301     {
   2302         ps_sps->i1_sps_id = i4_resolution_id;
   2303     }
   2304 
   2305     ps_sps->i1_vps_id = ps_vps->i1_vps_id;
   2306 
   2307     ps_sps->i2_pic_height_in_luma_samples = ps_frm_ctb_prms->i4_cu_aligned_pic_ht;
   2308 
   2309     ps_sps->i2_pic_width_in_luma_samples = ps_frm_ctb_prms->i4_cu_aligned_pic_wd;
   2310 
   2311     ps_sps->i1_amp_enabled_flag = AMP_ENABLED;
   2312 
   2313     ps_sps->i1_chroma_format_idc = (ps_src_params->i4_chr_format == IV_YUV_422SP_UV) ? 2 : 1;
   2314 
   2315     ps_sps->i1_separate_colour_plane_flag = 0;
   2316 
   2317     ps_sps->i1_bit_depth_luma_minus8 = ps_stat_cfg_prms->s_tgt_lyr_prms.i4_internal_bit_depth - 8;
   2318 
   2319     ps_sps->i1_bit_depth_chroma_minus8 = ps_stat_cfg_prms->s_tgt_lyr_prms.i4_internal_bit_depth - 8;
   2320 
   2321     ps_sps->i1_log2_min_coding_block_size = ps_config_prms->i4_min_log2_cu_size;
   2322 
   2323     ps_sps->i1_log2_diff_max_min_coding_block_size =
   2324         ps_config_prms->i4_max_log2_cu_size - ps_config_prms->i4_min_log2_cu_size;
   2325 
   2326     ps_sps->i1_log2_ctb_size =
   2327         ps_sps->i1_log2_min_coding_block_size + ps_sps->i1_log2_diff_max_min_coding_block_size;
   2328 
   2329     ps_sps->i1_log2_diff_max_min_transform_block_size =
   2330         ps_config_prms->i4_max_log2_tu_size - ps_config_prms->i4_min_log2_tu_size;
   2331 
   2332     ps_sps->i1_log2_min_transform_block_size = ps_config_prms->i4_min_log2_tu_size;
   2333 
   2334     ps_sps->i1_long_term_ref_pics_present_flag = LONG_TERM_REF_PICS_ABSENT;
   2335 
   2336     ps_sps->i1_max_transform_hierarchy_depth_inter = ps_config_prms->i4_max_tr_tree_depth_nI;
   2337 
   2338     ps_sps->i1_max_transform_hierarchy_depth_intra = ps_config_prms->i4_max_tr_tree_depth_I;
   2339 
   2340     ps_sps->i1_pcm_enabled_flag = PCM_DISABLED;
   2341 
   2342     ps_sps->i1_pcm_loop_filter_disable_flag = PCM_LOOP_FILTER_DISABLED;
   2343 
   2344     ps_sps->i1_pic_cropping_flag = !!ps_coding_params->i4_cropping_mode;
   2345 
   2346     if(i4_quality_preset < IHEVCE_QUALITY_P4)
   2347     {
   2348         /*** Enable SAO for PQ,HQ,MS presets **/
   2349         ps_sps->i1_sample_adaptive_offset_enabled_flag = SAO_ENABLED;
   2350     }
   2351     else
   2352     {
   2353         ps_sps->i1_sample_adaptive_offset_enabled_flag = SAO_DISABLED;
   2354     }
   2355 #if DISABLE_SAO
   2356     ps_sps->i1_sample_adaptive_offset_enabled_flag = SAO_DISABLED;
   2357 #endif
   2358 
   2359     if(ps_coding_params->i4_use_default_sc_mtx == 1)
   2360     {
   2361         ps_sps->i1_scaling_list_enable_flag = SCALING_LIST_ENABLED;
   2362     }
   2363     else
   2364     {
   2365         ps_sps->i1_scaling_list_enable_flag = SCALING_LIST_DISABLED;
   2366     }
   2367 
   2368     ps_sps->i1_sps_max_sub_layers = DEFAULT_SPS_MAX_SUB_LAYERS;
   2369 
   2370     if(1 == ps_stat_cfg_prms->s_tgt_lyr_prms.i4_enable_temporal_scalability)
   2371     {
   2372         ps_sps->i1_sps_max_sub_layers = DEFAULT_SPS_MAX_SUB_LAYERS + 1;
   2373     }
   2374 
   2375     ps_sps->i1_sps_sub_layer_ordering_info_present_flag = SPS_SUB_LAYER_ORDERING_INFO_ABSENT;
   2376 
   2377     ps_sps->i1_sps_scaling_list_data_present_flag = SCALING_LIST_DATA_ABSENT;
   2378 
   2379     if(ps_sps->i1_sps_max_sub_layers == 1)
   2380     {
   2381         ps_sps->i1_sps_temporal_id_nesting_flag = 1;  //NO_SPS_TEMPORAL_ID_NESTING_DONE;
   2382     }
   2383     else
   2384     {
   2385         ps_sps->i1_sps_temporal_id_nesting_flag = 0;  //NO_SPS_TEMPORAL_ID_NESTING_DONE;
   2386     }
   2387 
   2388     /* short term and long term ref pic set not signalled in sps */
   2389     ps_sps->i1_num_short_term_ref_pic_sets = 0;
   2390     ps_sps->i1_long_term_ref_pics_present_flag = 0;
   2391 
   2392     ps_sps->i1_num_long_term_ref_pics_sps = 0;
   2393     ps_sps->i1_sps_temporal_mvp_enable_flag = !DISABLE_TMVP;
   2394 
   2395     ps_sps->i1_strong_intra_smoothing_enable_flag = STRONG_INTRA_SMOOTHING_FLAG_ENABLE;
   2396 
   2397     ps_sps->i1_vui_parameters_present_flag = ps_out_strm_params->i4_vui_enable;
   2398 
   2399     /*required in generation of slice header*/
   2400     ps_sps->i2_pic_ht_in_ctb = ps_frm_ctb_prms->i4_num_ctbs_vert;
   2401 
   2402     ps_sps->i2_pic_wd_in_ctb = ps_frm_ctb_prms->i4_num_ctbs_horz;
   2403 
   2404     ps_sps->i1_log2_max_pic_order_cnt_lsb = DEFAULT_LOG2_MAX_POC_LSB;
   2405 
   2406     if(ps_sps->i1_pic_cropping_flag)
   2407     {
   2408         WORD32 num_rows_to_pad_bottom =
   2409             ps_sps->i2_pic_height_in_luma_samples - ps_stat_cfg_prms->s_src_prms.i4_orig_height;
   2410         WORD32 num_rows_to_pad_right =
   2411             ps_sps->i2_pic_width_in_luma_samples - ps_stat_cfg_prms->s_src_prms.i4_orig_width;
   2412 
   2413         ps_sps->i2_pic_crop_top_offset = DEFAULT_PIC_CROP_TOP_OFFSET;
   2414 
   2415         ps_sps->i2_pic_crop_left_offset = DEFAULT_PIC_CROP_LEFT_OFFSET;
   2416 
   2417         /* picture offsets should be signalled in terms of chroma unit */
   2418         ps_sps->i2_pic_crop_bottom_offset = num_rows_to_pad_bottom >> 1;
   2419 
   2420         /* picture offsets should be signalled in terms of chroma unit */
   2421         ps_sps->i2_pic_crop_right_offset = num_rows_to_pad_right >> 1;
   2422     }
   2423 
   2424     for(i = 0; i < (ps_sps->i1_sps_max_sub_layers); i++)
   2425     {
   2426         ps_sps->ai1_sps_max_dec_pic_buffering[i] =
   2427             ps_coding_params->i4_max_reference_frames + (2 << i4_field_pic) - 1;
   2428 
   2429         ps_sps->ai1_sps_max_num_reorder_pics[i] = ps_coding_params->i4_max_temporal_layers
   2430                                                   << i4_field_pic;
   2431 
   2432         ps_sps->ai1_sps_max_latency_increase[i] = 0;
   2433 
   2434         ps_sps->s_ptl.ai1_sub_layer_level_present_flag[i] = 1;  //TEMPORALA_SCALABILITY CHANGES
   2435 
   2436         ps_sps->s_ptl.ai1_sub_layer_profile_present_flag[i] = 0;  //TEMPORALA_SCALABILITY CHANGES
   2437 
   2438         ps_sps->s_ptl.as_ptl_sub[i].i1_profile_space = 0;  // BLU_RAY specific change is default
   2439 
   2440         ps_sps->s_ptl.as_ptl_sub[i].i1_profile_idc = ps_out_strm_params->i4_codec_profile;
   2441 
   2442         memset(
   2443             ps_sps->s_ptl.as_ptl_sub[i].ai1_profile_compatibility_flag,
   2444             0,
   2445             MAX_PROFILE_COMPATBLTY * sizeof(WORD8));
   2446 
   2447         ps_sps->s_ptl.as_ptl_sub[i]
   2448             .ai1_profile_compatibility_flag[ps_out_strm_params->i4_codec_profile] = 1;
   2449 
   2450         ps_sps->s_ptl.as_ptl_sub[i].u1_level_idc =
   2451             ps_stat_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_codec_level;
   2452 
   2453         if(0 == i)  // Only one level temporal scalability suport has been added.
   2454         {
   2455             i4_codec_level_index = ihevce_get_level_index(
   2456                 ps_stat_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_codec_level);
   2457 
   2458             if(i4_codec_level_index)
   2459                 i4_codec_level_index -= 1;
   2460 
   2461             ps_sps->s_ptl.as_ptl_sub[i].u1_level_idc =
   2462                 (WORD32)g_as_level_data[i4_codec_level_index].e_level;
   2463         }
   2464         ps_sps->s_ptl.as_ptl_sub[i].i1_tier_flag = ps_out_strm_params->i4_codec_tier;
   2465 
   2466         if(ps_src_params->i4_field_pic == IV_PROGRESSIVE)
   2467         {
   2468             ps_sps->s_ptl.as_ptl_sub[i].i1_general_progressive_source_flag = 1;
   2469 
   2470             ps_sps->s_ptl.as_ptl_sub[i].i1_general_interlaced_source_flag = 0;
   2471         }
   2472         else if(ps_src_params->i4_field_pic == IV_INTERLACED)
   2473         {
   2474             ps_sps->s_ptl.as_ptl_sub[i].i1_general_progressive_source_flag = 0;
   2475 
   2476             ps_sps->s_ptl.as_ptl_sub[i].i1_general_interlaced_source_flag = 1;
   2477         }
   2478         else if(ps_src_params->i4_field_pic == IV_CONTENTTYPE_NA)
   2479         {
   2480             ps_sps->s_ptl.as_ptl_sub[i].i1_general_progressive_source_flag = 0;
   2481 
   2482             ps_sps->s_ptl.as_ptl_sub[i].i1_general_interlaced_source_flag = 0;
   2483         }
   2484 
   2485         ps_sps->s_ptl.as_ptl_sub[i].i1_general_non_packed_constraint_flag =
   2486             DEFAULT_NON_PACKED_CONSTRAINT_FLAG;
   2487 
   2488         if(ps_enc_ctxt->i4_blu_ray_spec == 1)
   2489         {
   2490             ps_sps->s_ptl.as_ptl_sub[i].i1_frame_only_constraint_flag = 1;
   2491         }
   2492         else
   2493         {
   2494             ps_sps->s_ptl.as_ptl_sub[i].i1_frame_only_constraint_flag =
   2495                 DEFAULT_FRAME_ONLY_CONSTRAINT_FLAG;
   2496         }
   2497         if((ps_out_strm_params->i4_codec_profile == 4) && (ps_sps->i1_chroma_format_idc == 1))
   2498         {
   2499             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_12bit_constraint_flag = 1;
   2500 
   2501             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_10bit_constraint_flag = 0;
   2502 
   2503             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_8bit_constraint_flag = 0;
   2504 
   2505             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_422chroma_constraint_flag = 1;
   2506 
   2507             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_420chroma_constraint_flag = 1;
   2508 
   2509             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_monochrome_constraint_flag = 0;
   2510 
   2511             ps_sps->s_ptl.as_ptl_sub[i].i1_general_intra_constraint_flag = 0;
   2512 
   2513             ps_sps->s_ptl.as_ptl_sub[i].i1_general_one_picture_only_constraint_flag = 0;
   2514 
   2515             ps_sps->s_ptl.as_ptl_sub[i].i1_general_lower_bit_rate_constraint_flag = 1;
   2516         }
   2517         else if((ps_out_strm_params->i4_codec_profile == 4) && (ps_sps->i1_chroma_format_idc == 2))
   2518         {
   2519             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_12bit_constraint_flag = 1;
   2520 
   2521             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_10bit_constraint_flag = 0;
   2522 
   2523             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_8bit_constraint_flag = 0;
   2524 
   2525             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_422chroma_constraint_flag = 1;
   2526 
   2527             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_420chroma_constraint_flag = 0;
   2528 
   2529             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_monochrome_constraint_flag = 0;
   2530 
   2531             ps_sps->s_ptl.as_ptl_sub[i].i1_general_intra_constraint_flag = 0;
   2532 
   2533             ps_sps->s_ptl.as_ptl_sub[i].i1_general_one_picture_only_constraint_flag = 0;
   2534 
   2535             ps_sps->s_ptl.as_ptl_sub[i].i1_general_lower_bit_rate_constraint_flag = 1;
   2536         }
   2537         else
   2538         {
   2539             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_12bit_constraint_flag = 0;
   2540 
   2541             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_10bit_constraint_flag = 0;
   2542 
   2543             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_8bit_constraint_flag = 0;
   2544 
   2545             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_422chroma_constraint_flag = 0;
   2546 
   2547             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_420chroma_constraint_flag = 0;
   2548 
   2549             ps_sps->s_ptl.as_ptl_sub[i].i1_general_max_monochrome_constraint_flag = 0;
   2550 
   2551             ps_sps->s_ptl.as_ptl_sub[i].i1_general_intra_constraint_flag = 0;
   2552 
   2553             ps_sps->s_ptl.as_ptl_sub[i].i1_general_one_picture_only_constraint_flag = 0;
   2554 
   2555             ps_sps->s_ptl.as_ptl_sub[i].i1_general_lower_bit_rate_constraint_flag = 0;
   2556         }
   2557     }
   2558 
   2559     memset(
   2560         ps_sps->s_ptl.s_ptl_gen.ai1_profile_compatibility_flag,
   2561         0,
   2562         MAX_PROFILE_COMPATBLTY * sizeof(WORD8));
   2563 
   2564     /* populate the general profile, tier and level information */
   2565     ps_sps->s_ptl.s_ptl_gen.i1_profile_space = 0;  // BLU_RAY specific change is default
   2566 
   2567     ps_sps->s_ptl.s_ptl_gen.i1_profile_idc = ps_out_strm_params->i4_codec_profile;
   2568 
   2569     ps_sps->s_ptl.s_ptl_gen.ai1_profile_compatibility_flag[ps_out_strm_params->i4_codec_profile] =
   2570         1;
   2571 
   2572     ps_sps->s_ptl.s_ptl_gen.u1_level_idc =
   2573         ps_stat_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_codec_level;
   2574 
   2575     ps_sps->s_ptl.s_ptl_gen.i1_tier_flag = ps_out_strm_params->i4_codec_tier;
   2576 
   2577     if(ps_src_params->i4_field_pic == IV_PROGRESSIVE)
   2578     {
   2579         ps_sps->s_ptl.s_ptl_gen.i1_general_progressive_source_flag = 1;
   2580 
   2581         ps_sps->s_ptl.s_ptl_gen.i1_general_interlaced_source_flag = 0;
   2582     }
   2583     else if(ps_src_params->i4_field_pic == IV_INTERLACED)
   2584     {
   2585         ps_sps->s_ptl.s_ptl_gen.i1_general_progressive_source_flag = 0;
   2586 
   2587         ps_sps->s_ptl.s_ptl_gen.i1_general_interlaced_source_flag = 1;
   2588     }
   2589     else if(ps_src_params->i4_field_pic == IV_CONTENTTYPE_NA)
   2590     {
   2591         ps_sps->s_ptl.s_ptl_gen.i1_general_progressive_source_flag = 0;
   2592 
   2593         ps_sps->s_ptl.s_ptl_gen.i1_general_interlaced_source_flag = 0;
   2594     }
   2595 
   2596     ps_sps->s_ptl.s_ptl_gen.i1_general_non_packed_constraint_flag =
   2597         DEFAULT_NON_PACKED_CONSTRAINT_FLAG;
   2598 
   2599     if(ps_enc_ctxt->i4_blu_ray_spec == 1)
   2600     {
   2601         ps_sps->s_ptl.s_ptl_gen.i1_frame_only_constraint_flag = 1;
   2602     }
   2603     else
   2604     {
   2605         ps_sps->s_ptl.s_ptl_gen.i1_frame_only_constraint_flag = DEFAULT_FRAME_ONLY_CONSTRAINT_FLAG;
   2606     }
   2607     if((ps_out_strm_params->i4_codec_profile == 4) && (ps_sps->i1_chroma_format_idc == 1))
   2608     {
   2609         ps_sps->s_ptl.s_ptl_gen.i1_general_max_12bit_constraint_flag = 1;
   2610 
   2611         ps_sps->s_ptl.s_ptl_gen.i1_general_max_10bit_constraint_flag = 0;
   2612 
   2613         ps_sps->s_ptl.s_ptl_gen.i1_general_max_8bit_constraint_flag = 0;
   2614 
   2615         ps_sps->s_ptl.s_ptl_gen.i1_general_max_422chroma_constraint_flag = 1;
   2616 
   2617         ps_sps->s_ptl.s_ptl_gen.i1_general_max_420chroma_constraint_flag = 1;
   2618 
   2619         ps_sps->s_ptl.s_ptl_gen.i1_general_max_monochrome_constraint_flag = 0;
   2620 
   2621         ps_sps->s_ptl.s_ptl_gen.i1_general_intra_constraint_flag = 0;
   2622 
   2623         ps_sps->s_ptl.s_ptl_gen.i1_general_one_picture_only_constraint_flag = 0;
   2624 
   2625         ps_sps->s_ptl.s_ptl_gen.i1_general_lower_bit_rate_constraint_flag = 1;
   2626     }
   2627     else if((ps_out_strm_params->i4_codec_profile == 4) && (ps_sps->i1_chroma_format_idc == 2))
   2628     {
   2629         ps_sps->s_ptl.s_ptl_gen.i1_general_max_12bit_constraint_flag = 1;
   2630 
   2631         ps_sps->s_ptl.s_ptl_gen.i1_general_max_10bit_constraint_flag = 0;
   2632 
   2633         ps_sps->s_ptl.s_ptl_gen.i1_general_max_8bit_constraint_flag = 0;
   2634 
   2635         ps_sps->s_ptl.s_ptl_gen.i1_general_max_422chroma_constraint_flag = 1;
   2636 
   2637         ps_sps->s_ptl.s_ptl_gen.i1_general_max_420chroma_constraint_flag = 0;
   2638 
   2639         ps_sps->s_ptl.s_ptl_gen.i1_general_max_monochrome_constraint_flag = 0;
   2640 
   2641         ps_sps->s_ptl.s_ptl_gen.i1_general_intra_constraint_flag = 0;
   2642 
   2643         ps_sps->s_ptl.s_ptl_gen.i1_general_one_picture_only_constraint_flag = 0;
   2644 
   2645         ps_sps->s_ptl.s_ptl_gen.i1_general_lower_bit_rate_constraint_flag = 1;
   2646     }
   2647     else
   2648     {
   2649         ps_sps->s_ptl.s_ptl_gen.i1_general_max_12bit_constraint_flag = 0;
   2650 
   2651         ps_sps->s_ptl.s_ptl_gen.i1_general_max_10bit_constraint_flag = 0;
   2652 
   2653         ps_sps->s_ptl.s_ptl_gen.i1_general_max_8bit_constraint_flag = 0;
   2654 
   2655         ps_sps->s_ptl.s_ptl_gen.i1_general_max_422chroma_constraint_flag = 0;
   2656 
   2657         ps_sps->s_ptl.s_ptl_gen.i1_general_max_420chroma_constraint_flag = 0;
   2658 
   2659         ps_sps->s_ptl.s_ptl_gen.i1_general_max_monochrome_constraint_flag = 0;
   2660 
   2661         ps_sps->s_ptl.s_ptl_gen.i1_general_intra_constraint_flag = 0;
   2662 
   2663         ps_sps->s_ptl.s_ptl_gen.i1_general_one_picture_only_constraint_flag = 0;
   2664 
   2665         ps_sps->s_ptl.s_ptl_gen.i1_general_lower_bit_rate_constraint_flag = 0;
   2666     }
   2667 
   2668     return IHEVCE_SUCCESS;
   2669 }
   2670 
   2671 /**
   2672 ******************************************************************************
   2673 *
   2674 *  @brief Populates pps structure based on input cofiguration params
   2675 *
   2676 *  @par   Description
   2677 *  Populates pps structure for its use in header generation
   2678 *
   2679 *  @param[out]  ps_pps
   2680 *  pointer to pps params structure which needs to be populated
   2681 *
   2682 *  @param[in]   ps_sps
   2683 *  pointer to sps params refered by the pps
   2684 *
   2685 *  @param[in]   ps_src_params
   2686 *  pointer to source config params; resolution, frame rate etc
   2687 *
   2688 *  @param[in]   ps_out_strm_params
   2689 *  pointer to output stream config params
   2690 *
   2691 *  @param[in]   ps_coding_params
   2692 *  pointer to coding params; to enable/disable various toolsets in pps
   2693 *
   2694 *  @param[in]   ps_config_prms
   2695 *  pointer to configuration params like bitrate, HRD buffer sizes, cu, tu sizes
   2696 *
   2697 *  @return      success or failure error code
   2698 *
   2699 ******************************************************************************
   2700 */
   2701 WORD32 ihevce_populate_pps(
   2702     pps_t *ps_pps,
   2703     sps_t *ps_sps,
   2704     ihevce_src_params_t *ps_src_params,
   2705     ihevce_out_strm_params_t *ps_out_strm_params,
   2706     ihevce_coding_params_t *ps_coding_params,
   2707     ihevce_config_prms_t *ps_config_prms,
   2708     ihevce_static_cfg_params_t *ps_stat_cfg_prms,
   2709     WORD32 i4_bitrate_instance_id,
   2710     WORD32 i4_resolution_id,
   2711     ihevce_tile_params_t *ps_tile_params_base,
   2712     WORD32 *pi4_column_width_array,
   2713     WORD32 *pi4_row_height_array)
   2714 {
   2715     (void)ps_src_params;
   2716     (void)ps_out_strm_params;
   2717 
   2718     ps_pps->i1_beta_offset_div2 = DEFAULT_BETA_OFFSET;
   2719 
   2720     ps_pps->i1_cabac_init_present_flag = CABAC_INIT_ABSENT;
   2721 
   2722     ps_pps->i1_constrained_intra_pred_flag = CONSTR_IPRED_DISABLED;
   2723     /*delta qp can be disabled for constant qp mode to save on qp signalling bits*/
   2724     ps_pps->i1_cu_qp_delta_enabled_flag = ps_config_prms->i4_cu_level_rc;
   2725 
   2726     ps_pps->i1_deblocking_filter_control_present_flag = DEBLOCKING_FILTER_CONTROL_PRESENT;
   2727 
   2728     ps_pps->i1_deblocking_filter_override_enabled_flag = DEBLOCKING_FILTER_OVERRIDE_DISABLED;
   2729 
   2730     ps_pps->i1_pic_disable_deblocking_filter_flag = ps_coding_params->i4_deblocking_type;
   2731 
   2732     if(0 != ps_stat_cfg_prms->s_slice_params.i4_slice_segment_mode)
   2733     {
   2734         ps_pps->i1_dependent_slice_enabled_flag = DEPENDENT_SLICE_ENABLED;
   2735     }
   2736     else
   2737     {
   2738         ps_pps->i1_dependent_slice_enabled_flag = DEPENDENT_SLICE_DISABLED;
   2739     }
   2740 
   2741     /* Assign the diff_cu_qp_delta_depth with 3,2,1 for making
   2742     CU_LEVEL_QP_MODULATION limited to 8x8, 16x16, 32x32 respectively : Lokesh */
   2743     ps_pps->i1_diff_cu_qp_delta_depth = CU_LEVEL_QP_LIMIT_8x8;
   2744 
   2745     if(1 == ps_coding_params->i4_enable_entropy_sync)
   2746     {
   2747         ps_pps->i1_entropy_coding_sync_enabled_flag = ENTROPY_CODING_SYNC_ENABLED;
   2748     }
   2749     else
   2750     {
   2751         ps_pps->i1_entropy_coding_sync_enabled_flag = ENTROPY_CODING_SYNC_DISABLED;
   2752     }
   2753 
   2754     ps_pps->i1_entropy_slice_enabled_flag = ENTROPY_SLICE_DISABLED;
   2755 
   2756     ps_pps->i1_lists_modification_present_flag = ps_coding_params->i4_weighted_pred_enable;
   2757 
   2758     ps_pps->i1_log2_parallel_merge_level = DEFAULT_PARALLEL_MERGE_LEVEL;
   2759 
   2760     ps_pps->i1_num_extra_slice_header_bits = 0;
   2761 
   2762     /* SAO_note_01: Currently SAO is implemented is such a way that the
   2763     loop-filter has to be enabled across syntatical-tiles and slices.
   2764     Search for <SAO_note_01> in workspace to know more */
   2765     ps_pps->i1_loop_filter_across_slices_enabled_flag = LF_ACROSS_SLICES_ENABLED;
   2766 
   2767     ps_pps->i1_num_ref_idx_l0_default_active = DEFAULT_NUM_REF_IDX_L0_DEFAULT_ACTIVE;
   2768 
   2769     ps_pps->i1_num_ref_idx_l1_default_active = DEFAULT_NUM_REF_IDX_L1_DEFAULT_ACTIVE;
   2770 
   2771     if(0 == ps_tile_params_base->i4_tiles_enabled_flag)
   2772     {
   2773         ps_pps->i1_num_tile_columns = NUM_TILES_COLS;
   2774 
   2775         ps_pps->i1_num_tile_rows = NUM_TILES_ROWS;
   2776 
   2777         ps_pps->i1_tiles_enabled_flag = TILES_DISABLED;
   2778 
   2779         ps_pps->i1_uniform_spacing_flag = SPACING_IS_UNIFORM;
   2780     }
   2781     else
   2782     {
   2783         ps_pps->i1_num_tile_columns = ps_tile_params_base->i4_num_tile_cols;
   2784 
   2785         ps_pps->i1_num_tile_rows = ps_tile_params_base->i4_num_tile_rows;
   2786 
   2787         ps_pps->i1_tiles_enabled_flag = TILES_ENABLED;
   2788 
   2789         ps_pps->i1_uniform_spacing_flag = ps_tile_params_base->i4_uniform_spacing_flag;
   2790 
   2791         if(SPACING_IS_NONUNIFORM == ps_pps->i1_uniform_spacing_flag)
   2792         {
   2793             WORD32 i4_i;
   2794             for(i4_i = 0; i4_i < ps_tile_params_base->i4_num_tile_cols; i4_i++)
   2795             {
   2796                 ps_pps->ps_tile[i4_i].u2_wd = pi4_column_width_array[i4_i] >>
   2797                                               ps_config_prms->i4_max_log2_cu_size;
   2798             }
   2799             for(i4_i = 0; i4_i < ps_tile_params_base->i4_num_tile_rows; i4_i++)
   2800             {
   2801                 ps_pps->ps_tile[i4_i].u2_ht = pi4_row_height_array[i4_i] >>
   2802                                               ps_config_prms->i4_max_log2_cu_size;
   2803             }
   2804         }
   2805     }
   2806 
   2807     /* SAO_note_01: Currently SAO is implemented is such a way that the
   2808     loop-filter has to be enabled across syntatical-tiles and slices.
   2809     Search for <SAO_note_01> in workspace to know more */
   2810     if(0 == ps_tile_params_base->i4_tiles_enabled_flag)
   2811     {
   2812         ps_pps->i1_loop_filter_across_tiles_enabled_flag = 1;
   2813     }
   2814     else
   2815     {
   2816         ps_pps->i1_loop_filter_across_tiles_enabled_flag = 0;
   2817     }
   2818 
   2819     ps_pps->i1_output_flag_present_flag = OUTPUT_FLAG_ABSENT;
   2820 
   2821     ps_pps->i1_pic_cb_qp_offset = DEFAULT_PIC_CB_QP_OFFSET;
   2822 
   2823     ps_pps->i1_pic_cr_qp_offset = DEFAULT_PIC_CR_QP_OFFSET;
   2824 
   2825     /*init qp is different for each bit-rate instance */
   2826     ps_pps->i1_pic_init_qp = CLIP3(
   2827         ps_stat_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
   2828             .ai4_frame_qp[i4_bitrate_instance_id],
   2829         ps_config_prms->i4_min_frame_qp,
   2830         ps_config_prms->i4_max_frame_qp);
   2831 
   2832     /* enable chroma QP offset only if stasino or psy rd is present */
   2833     if(((ps_coding_params->i4_vqet & (1 << BITPOS_IN_VQ_TOGGLE_FOR_CONTROL_TOGGLER)) &&
   2834         ((ps_coding_params->i4_vqet & (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_NOISE_PRESERVATION)) ||
   2835          (ps_coding_params->i4_vqet & (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_PSYRDOPT_1)) ||
   2836          (ps_coding_params->i4_vqet & (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_PSYRDOPT_2)) ||
   2837          (ps_coding_params->i4_vqet & (1 << BITPOS_IN_VQ_TOGGLE_FOR_ENABLING_PSYRDOPT_3)))))
   2838     {
   2839         ps_pps->i1_pic_slice_level_chroma_qp_offsets_present_flag =
   2840             SLICE_LEVEL_CHROMA_QP_OFFSETS_PRESENT;
   2841     }
   2842     else
   2843     {
   2844         ps_pps->i1_pic_slice_level_chroma_qp_offsets_present_flag =
   2845             SLICE_LEVEL_CHROMA_QP_OFFSETS_ABSENT;
   2846     }
   2847 
   2848     ps_pps->i1_pps_id = DEFAULT_PPS_ID;
   2849 
   2850     if(1 == ps_stat_cfg_prms->s_tgt_lyr_prms.i4_mres_single_out)
   2851     {
   2852         ps_pps->i1_pps_id = i4_resolution_id;
   2853     }
   2854 
   2855     ps_pps->i1_pps_scaling_list_data_present_flag = SCALING_LIST_DATA_ABSENT;
   2856 
   2857     if(ps_stat_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset <
   2858        IHEVCE_QUALITY_P3)
   2859     {
   2860         ps_pps->i1_sign_data_hiding_flag = SIGN_DATA_HIDDEN;
   2861     }
   2862     else if(
   2863         ps_stat_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset ==
   2864         IHEVCE_QUALITY_P3)
   2865     {
   2866         ps_pps->i1_sign_data_hiding_flag = SIGN_DATA_UNHIDDEN;
   2867     }
   2868     else
   2869     {
   2870         ps_pps->i1_sign_data_hiding_flag = SIGN_DATA_UNHIDDEN;
   2871     }
   2872 
   2873 #if DISABLE_SBH
   2874     ps_pps->i1_sign_data_hiding_flag = SIGN_DATA_UNHIDDEN;
   2875 #endif
   2876 
   2877     ps_pps->i1_slice_extension_present_flag = SLICE_EXTENSION_ABSENT;
   2878 
   2879     ps_pps->i1_slice_header_extension_present_flag = SLICE_HEADER_EXTENSION_ABSENT;
   2880 
   2881     ps_pps->i1_sps_id = ps_sps->i1_sps_id;
   2882 
   2883     ps_pps->i1_tc_offset_div2 = DEFAULT_TC_OFFSET;
   2884 
   2885     ps_pps->i1_transform_skip_enabled_flag = TRANSFORM_SKIP_DISABLED;
   2886 
   2887     ps_pps->i1_transquant_bypass_enable_flag = TRANSFORM_BYPASS_DISABLED;
   2888 
   2889     ps_pps->i1_weighted_bipred_flag = ps_coding_params->i4_weighted_pred_enable;
   2890 
   2891     ps_pps->i1_weighted_pred_flag = ps_coding_params->i4_weighted_pred_enable;
   2892 
   2893     return IHEVCE_SUCCESS;
   2894 }
   2895 
   2896 /**
   2897 ******************************************************************************
   2898 *
   2899 *  @brief Populates slice header structure
   2900 *
   2901 *  @par   Description
   2902 *  Populates slice header structure for its use in header generation
   2903 *
   2904 *  @param[out]  ps_slice_hdr
   2905 *  pointer to slice header structure that needs to be populated
   2906 *
   2907 *  @param[in]  ps_pps
   2908 *  pointer to pps params structure refered by the slice
   2909 *
   2910 *  @param[in]   ps_sps
   2911 *  pointer to sps params refered by the pps
   2912 *
   2913 *  @param[in]   nal_unit_type
   2914 *  nal unit type for current slice
   2915 *
   2916 *  @param[in]   slice_type
   2917 *  current slice type
   2918 *
   2919 *  @param[in]   ctb_x
   2920 *  x offset of first ctb in current slice (ctb units)
   2921 *
   2922 *  @param[in]   ctb_y
   2923 *  y offset of first ctb in current slice (ctb units)
   2924 *
   2925 *  @param[in]   poc
   2926 *  pic order count for current slice (shall be 0 for IDR pics)
   2927 *
   2928 *  @param[in]   cur_slice_qp
   2929 *  qp for the current slice
   2930 *
   2931 *  @return      success or failure error code
   2932 *
   2933 ******************************************************************************
   2934 */
   2935 WORD32 ihevce_populate_slice_header(
   2936     slice_header_t *ps_slice_hdr,
   2937     pps_t *ps_pps,
   2938     sps_t *ps_sps,
   2939     WORD32 nal_unit_type,
   2940     WORD32 slice_type,
   2941     WORD32 ctb_x,
   2942     WORD32 ctb_y,
   2943     WORD32 poc,
   2944     WORD32 cur_slice_qp,
   2945     WORD32 max_merge_candidates,
   2946     WORD32 i4_rc_pass_num,
   2947     WORD32 i4_quality_preset,
   2948     WORD32 stasino_enabled)
   2949 {
   2950     WORD32 i;
   2951     WORD32 return_status = IHEVCE_SUCCESS;
   2952     WORD32 RapPicFlag = (nal_unit_type >= NAL_BLA_W_LP) && (nal_unit_type <= NAL_RSV_RAP_VCL23);
   2953 
   2954     WORD32 idr_pic_flag = (NAL_IDR_W_LP == nal_unit_type) || (NAL_IDR_N_LP == nal_unit_type);
   2955 
   2956     WORD32 disable_deblocking_filter_flag;
   2957 
   2958     (void)ctb_x;
   2959     (void)ctb_y;
   2960     /* first_slice_in_pic_flag  */
   2961     if(i4_quality_preset == IHEVCE_QUALITY_P7)
   2962     {
   2963         i4_quality_preset = IHEVCE_QUALITY_P6;
   2964     }
   2965 
   2966     if(RapPicFlag)
   2967     {
   2968         /* no_output_of_prior_pics_flag */ /* TODO:revisit this */
   2969         ps_slice_hdr->i1_no_output_of_prior_pics_flag = 0;  //BLU_RAY specific already done
   2970     }
   2971 
   2972     /* pic_parameter_set_id */
   2973     ps_slice_hdr->i1_pps_id = ps_pps->i1_pps_id;
   2974 
   2975     {
   2976         /* This i1_dependent_slice_flag will further be updated in generate_slice_header() function */
   2977         ps_slice_hdr->i1_dependent_slice_flag = 0;
   2978     }
   2979 
   2980     if(!ps_slice_hdr->i1_dependent_slice_flag)
   2981     {
   2982         /* slice_type */
   2983         ps_slice_hdr->i1_slice_type = (WORD8)slice_type;
   2984 
   2985         if(ps_pps->i1_output_flag_present_flag)
   2986         {
   2987             /* pic_output_flag */ /* TODO:revisit this */
   2988             ps_slice_hdr->i1_pic_output_flag = 0;
   2989         }
   2990 
   2991         /* separate colour plane flag not supported in this encoder */
   2992         ASSERT(0 == ps_sps->i1_separate_colour_plane_flag);
   2993 
   2994         if(!idr_pic_flag)
   2995         {
   2996             WORD32 log2_max_poc_lsb = ps_sps->i1_log2_max_pic_order_cnt_lsb;
   2997 
   2998             /* pic_order_cnt_lsb */
   2999             ps_slice_hdr->i4_pic_order_cnt_lsb = poc & ((1 << log2_max_poc_lsb) - 1);
   3000 
   3001             /* short_term_ref_pic_set_sps_flag */
   3002             /* TODO : revisit this */
   3003             ps_slice_hdr->i1_short_term_ref_pic_set_sps_flag = 0;
   3004 
   3005             if(!ps_slice_hdr->i1_short_term_ref_pic_set_sps_flag)
   3006             {
   3007                 /* TODO: To populate short term ref pic set for this slice   */
   3008             }
   3009 
   3010             /* long term ref pic flag not supported */
   3011             ASSERT(0 == ps_sps->i1_long_term_ref_pics_present_flag);
   3012             if(ps_sps->i1_long_term_ref_pics_present_flag)
   3013             {
   3014                 /* TODO : not supported */
   3015             }
   3016         }
   3017 
   3018         //ASSERT(0 == ps_sps->i1_sample_adaptive_offset_enabled_flag);
   3019         if(ps_sps->i1_sample_adaptive_offset_enabled_flag)
   3020         {
   3021             /* slice_sao_luma_flag */
   3022             ps_slice_hdr->i1_slice_sao_luma_flag = 1;
   3023             ps_slice_hdr->i1_slice_sao_chroma_flag = 1;
   3024         }
   3025 
   3026 #if DISABLE_LUMA_SAO
   3027         ps_slice_hdr->i1_slice_sao_luma_flag = 0;
   3028 #endif
   3029 
   3030 #if DISABLE_CHROMA_SAO
   3031         ps_slice_hdr->i1_slice_sao_chroma_flag = 0;
   3032 #endif
   3033         if((PSLICE == ps_slice_hdr->i1_slice_type) || (BSLICE == ps_slice_hdr->i1_slice_type))
   3034         {
   3035             /* TODO: currently temporal mvp disabled, need to enable later */
   3036             if(1 == ps_sps->i1_sps_temporal_mvp_enable_flag)
   3037             {
   3038                 ps_slice_hdr->i1_slice_temporal_mvp_enable_flag = 1;
   3039             }
   3040             else
   3041             {
   3042                 ps_slice_hdr->i1_slice_temporal_mvp_enable_flag = 0;
   3043             }
   3044 
   3045             /* num_ref_idx_active_override_flag */
   3046             ps_slice_hdr->i1_num_ref_idx_active_override_flag = 0;
   3047 
   3048             if(ps_slice_hdr->i1_num_ref_idx_active_override_flag)
   3049             {
   3050                 /* TODO revisit this*/
   3051                 /* i1_num_ref_idx_l0_active_minus1 */
   3052                 ps_slice_hdr->i1_num_ref_idx_l0_active = 1;
   3053 
   3054                 if(BSLICE == ps_slice_hdr->i1_slice_type)
   3055                 {
   3056                     /* i1_num_ref_idx_l1_active */
   3057                     /* TODO revisit this*/
   3058                     ps_slice_hdr->i1_num_ref_idx_l1_active = 1;
   3059                 }
   3060             }
   3061 
   3062             if(BSLICE == ps_slice_hdr->i1_slice_type)
   3063             {
   3064                 /* mvd_l1_zero_flag */
   3065                 ps_slice_hdr->i1_mvd_l1_zero_flag = 0;
   3066             }
   3067 
   3068             {
   3069                 /* cabac_init_flag curently set to 0 */
   3070                 ps_slice_hdr->i1_cabac_init_flag = ps_pps->i1_cabac_init_present_flag ? 1 : 0;
   3071             }
   3072 
   3073             if(ps_slice_hdr->i1_slice_temporal_mvp_enable_flag)
   3074             {
   3075                 if(BSLICE == ps_slice_hdr->i1_slice_type)
   3076                 {
   3077                     /* collocated_from_l0_flag */
   3078                     ps_slice_hdr->i1_collocated_from_l0_flag = 0;
   3079                 }
   3080                 else if(PSLICE == ps_slice_hdr->i1_slice_type)
   3081                 {
   3082                     ps_slice_hdr->i1_collocated_from_l0_flag = 1;
   3083                 }
   3084 
   3085                 if((ps_slice_hdr->i1_collocated_from_l0_flag &&
   3086                     (ps_slice_hdr->i1_num_ref_idx_l0_active > 1)) ||
   3087                    (!ps_slice_hdr->i1_collocated_from_l0_flag &&
   3088                     (ps_slice_hdr->i1_num_ref_idx_l1_active > 1)))
   3089                 {
   3090                     /* collocated_ref_idx */
   3091                     /* TODO revisit this*/
   3092                     ps_slice_hdr->i1_collocated_ref_idx = 0;
   3093                     //ps_slice_hdr->i1_num_ref_idx_l1_active - 1;
   3094                 }
   3095             }
   3096         }
   3097         ps_slice_hdr->i1_max_num_merge_cand = max_merge_candidates;
   3098 
   3099         /* TODO : revisit this */
   3100         ps_slice_hdr->i1_slice_qp_delta = (WORD8)cur_slice_qp - ps_pps->i1_pic_init_qp;
   3101 
   3102         if(!ps_pps->i1_pic_slice_level_chroma_qp_offsets_present_flag || !stasino_enabled)
   3103         {
   3104             /* slice_cb_qp_offset */
   3105             ps_slice_hdr->i1_slice_cb_qp_offset = 0;
   3106 
   3107             /* slice_cr_qp_offset */
   3108             ps_slice_hdr->i1_slice_cr_qp_offset = 0;
   3109         }
   3110         else /* only noisy regions have lower Chroma QP rating */
   3111         {
   3112             ps_slice_hdr->i1_slice_cb_qp_offset = -2;
   3113             ps_slice_hdr->i1_slice_cr_qp_offset = -2;
   3114         }
   3115 
   3116         if(ps_pps->i1_deblocking_filter_control_present_flag)
   3117         {
   3118             ps_slice_hdr->i1_deblocking_filter_override_flag = 0;
   3119 
   3120             if(ps_pps->i1_deblocking_filter_override_enabled_flag)
   3121             {
   3122                 /* deblocking_filter_override_flag */
   3123                 ps_slice_hdr->i1_deblocking_filter_override_flag = 0;
   3124             }
   3125 
   3126             if(ps_slice_hdr->i1_deblocking_filter_override_flag)
   3127             {
   3128                 /* slice_disable_deblocking_filter_flag */
   3129                 ps_slice_hdr->i1_slice_disable_deblocking_filter_flag = DISABLE_DEBLOCKING_FLAG;
   3130 
   3131                 if(!ps_slice_hdr->i1_slice_disable_deblocking_filter_flag)
   3132                 {
   3133                     /* beta_offset_div2 */
   3134                     ps_slice_hdr->i1_beta_offset_div2 = 0;
   3135 
   3136                     /* tc_offset_div2 */
   3137                     ps_slice_hdr->i1_tc_offset_div2 = 0;
   3138                 }
   3139             }
   3140         }
   3141 
   3142         disable_deblocking_filter_flag = ps_slice_hdr->i1_slice_disable_deblocking_filter_flag |
   3143                                          ps_pps->i1_pic_disable_deblocking_filter_flag;
   3144 
   3145         if(ps_pps->i1_loop_filter_across_slices_enabled_flag &&
   3146            (ps_slice_hdr->i1_slice_sao_luma_flag || ps_slice_hdr->i1_slice_sao_chroma_flag ||
   3147             !disable_deblocking_filter_flag))
   3148         {
   3149             /* slice_loop_filter_across_slices_enabled_flag */
   3150             ps_slice_hdr->i1_slice_loop_filter_across_slices_enabled_flag = 1;
   3151         }
   3152     }
   3153 
   3154     if(1 == ps_pps->i1_entropy_coding_sync_enabled_flag)
   3155     {
   3156         /* num_entry_point_offsets, same as NUM of ctb rows to enable entropy sync at start of every CTB */
   3157         ps_slice_hdr->i4_num_entry_point_offsets = ps_sps->i2_pic_ht_in_ctb - 1;
   3158 
   3159         if(ps_slice_hdr->i4_num_entry_point_offsets > 0)
   3160         {
   3161             /* generate offset_len here */
   3162             /* fixing the offset lenght assuming 4kx2k is log2(w * h / num_ctb_row) = 20*/
   3163             ps_slice_hdr->i1_offset_len = 24;
   3164         }
   3165     }
   3166     else
   3167     {
   3168         ps_slice_hdr->i4_num_entry_point_offsets = 0;
   3169         ps_slice_hdr->i1_offset_len = 0;
   3170     }
   3171 
   3172     /* slice_header_extension_present_flag not supported */
   3173     //if(ps_pps->i1_slice_header_extension_present_flag)
   3174     {
   3175         /* slice_header_extension_length */
   3176         ps_slice_hdr->i2_slice_header_extension_length = 0;
   3177 
   3178         for(i = 0; i < ps_slice_hdr->i2_slice_header_extension_length; i++)
   3179         {
   3180             /* slice_header_extension_data_byte[i] */
   3181         }
   3182     }
   3183 
   3184     /* TODO : hard coding ref pix set for now                           */
   3185     /* Need to update this once the ref pics are known from lap output  */
   3186 
   3187     /*  NOTE                                                            */
   3188     /* inter ref pic prediction is too much of logic for few bit savings*/
   3189     /* at slice header level this is not supported by the encoder       */
   3190     ps_slice_hdr->s_stref_picset.i1_inter_ref_pic_set_prediction_flag = 0;
   3191 
   3192     /* hardcoding 1 ref pic for now ..... will be updated base on lap output */
   3193     ps_slice_hdr->s_stref_picset.i1_num_delta_pocs = 1;
   3194     ps_slice_hdr->s_stref_picset.i1_num_neg_pics = 1;
   3195     ps_slice_hdr->s_stref_picset.i1_num_pos_pics = 0;
   3196 
   3197     memset(
   3198         ps_slice_hdr->s_stref_picset.ai2_delta_poc,
   3199         0,
   3200         MAX_DPB_SIZE * sizeof(*ps_slice_hdr->s_stref_picset.ai2_delta_poc));
   3201     ps_slice_hdr->s_stref_picset.ai2_delta_poc[0] = 1;
   3202 
   3203     return return_status;
   3204 }
   3205 
   3206 /**
   3207 ******************************************************************************
   3208 *
   3209 *  @brief Insert entry point offset
   3210 *
   3211 *  @par   Description
   3212 *  Insert entry point offset in slice header after frame processing is done 7.3.5.1
   3213 *
   3214 *  @param[inout]   ps_bitstrm
   3215 *  pointer to bitstream context for generating slice header
   3216 *
   3217 *  @param[in]   i1_nal_unit_type
   3218 *  nal unit type
   3219 *
   3220 *  @param[in]   ps_slice_hdr
   3221 *  pointer to slice header params
   3222 *
   3223 *  @param[in]   ps_pps
   3224 *  pointer to pps params referred by slice
   3225 *
   3226 *  @param[in]   ps_sps
   3227 *  pointer to sps params referred by slice
   3228 *
   3229 *  @return      success or failure error code
   3230 *
   3231 ******************************************************************************
   3232 */
   3233 WORD32 ihevce_insert_entry_offset_slice_header(
   3234     bitstrm_t *ps_bitstrm,
   3235     slice_header_t *ps_slice_hdr,
   3236     pps_t *ps_pps,
   3237     UWORD32 u4_first_slice_start_offset)
   3238 {
   3239     WORD32 i;
   3240     WORD32 return_status = IHEVCE_SUCCESS;
   3241     UWORD32 max_offset = 0, offset_len = 0, num_bytes_shift = 0;
   3242     /*entire slice data has to be shifted*/
   3243     num_bytes_shift =
   3244         ps_slice_hdr->pu4_entry_point_offset[ps_slice_hdr->i4_num_entry_point_offsets + 1] -
   3245         ps_slice_hdr->pu4_entry_point_offset[0];
   3246     /*generate relative offset*/
   3247     for(i = 0; i < ps_slice_hdr->i4_num_entry_point_offsets; i++)
   3248     {
   3249         ps_slice_hdr->pu4_entry_point_offset[i] =
   3250             ps_slice_hdr->pu4_entry_point_offset[i + 1] - ps_slice_hdr->pu4_entry_point_offset[i];
   3251         if(ps_slice_hdr->pu4_entry_point_offset[i] > (WORD32)max_offset)
   3252         {
   3253             max_offset = ps_slice_hdr->pu4_entry_point_offset[i];
   3254         }
   3255     }
   3256     while(1)
   3257     {
   3258         if(max_offset & 0x80000000)
   3259         {
   3260             break;
   3261         }
   3262         max_offset <<= 1;
   3263         offset_len++;
   3264     }
   3265     offset_len = 32 - offset_len;
   3266     ps_slice_hdr->i1_offset_len = offset_len;
   3267 
   3268     if(ps_slice_hdr->i4_num_entry_point_offsets > 0)
   3269     {
   3270         /* offset_len_minus1 */
   3271         PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_offset_len - 1, return_status);
   3272         ENTROPY_TRACE("offset_len_minus1", ps_slice_hdr->i1_offset_len - 1);
   3273     }
   3274 
   3275     for(i = 0; i < ps_slice_hdr->i4_num_entry_point_offsets; i++)
   3276     {
   3277         /* entry_point_offset[i] */
   3278         /* entry point offset minus1 is indicated in 10.0 */
   3279         PUT_BITS(
   3280             ps_bitstrm,
   3281             ps_slice_hdr->pu4_entry_point_offset[i] - 1,
   3282             ps_slice_hdr->i1_offset_len,
   3283             return_status);
   3284         ENTROPY_TRACE("entry_point_offset[i]", ps_slice_hdr->pu4_entry_point_offset[i]);
   3285     }
   3286 
   3287     if(ps_pps->i1_slice_header_extension_present_flag)
   3288     {
   3289         /* slice_header_extension_length */
   3290         PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i2_slice_header_extension_length, return_status);
   3291         ENTROPY_TRACE(
   3292             "slice_header_extension_length", ps_slice_hdr->i2_slice_header_extension_length);
   3293         /*calculate slice header extension length to fill in the gap*/
   3294 
   3295         for(i = 0; i < ps_slice_hdr->i2_slice_header_extension_length; i++)
   3296         {
   3297             /* slice_header_extension_data_byte[i] */
   3298             PUT_BITS(ps_bitstrm, 0xFF, 8, return_status);
   3299             ENTROPY_TRACE("slice_header_extension_data_byte[i]", 0);
   3300         }
   3301     }
   3302 
   3303     BYTE_ALIGNMENT(ps_bitstrm);
   3304 
   3305     ASSERT(num_bytes_shift > 0);
   3306     /* copy the bitstream to point where header data has ended*/
   3307     memmove(
   3308         (UWORD8 *)(ps_bitstrm->pu1_strm_buffer + ps_bitstrm->u4_strm_buf_offset),
   3309         (UWORD8 *)(ps_bitstrm->pu1_strm_buffer + u4_first_slice_start_offset),
   3310         num_bytes_shift);
   3311 
   3312     /*send feedback of actual bytes generated*/
   3313     ps_bitstrm->u4_strm_buf_offset += num_bytes_shift;
   3314 
   3315     //ASSERT(ps_bitstrm->u4_strm_buf_offset == u4_first_slice_start_offset);
   3316     return return_status;
   3317 }
   3318