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