xref: /aosp_15_r20/external/libhevc/decoder/ihevcd_parse_headers.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
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 /**
19*c83a76b0SSuyog Pawar *******************************************************************************
20*c83a76b0SSuyog Pawar * @file
21*c83a76b0SSuyog Pawar *  ihevcd_parse_headers.c
22*c83a76b0SSuyog Pawar *
23*c83a76b0SSuyog Pawar * @brief
24*c83a76b0SSuyog Pawar *  Contains functions for parsing headers
25*c83a76b0SSuyog Pawar *
26*c83a76b0SSuyog Pawar * @author
27*c83a76b0SSuyog Pawar *  Harish
28*c83a76b0SSuyog Pawar *
29*c83a76b0SSuyog Pawar * @par List of Functions:
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * @remarks
32*c83a76b0SSuyog Pawar *  None
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar *******************************************************************************
35*c83a76b0SSuyog Pawar */
36*c83a76b0SSuyog Pawar 
37*c83a76b0SSuyog Pawar /*****************************************************************************/
38*c83a76b0SSuyog Pawar /* File Includes                                                             */
39*c83a76b0SSuyog Pawar /*****************************************************************************/
40*c83a76b0SSuyog Pawar #include <stdio.h>
41*c83a76b0SSuyog Pawar #include <stddef.h>
42*c83a76b0SSuyog Pawar #include <stdlib.h>
43*c83a76b0SSuyog Pawar #include <string.h>
44*c83a76b0SSuyog Pawar #include <assert.h>
45*c83a76b0SSuyog Pawar #include <limits.h>
46*c83a76b0SSuyog Pawar #include <stdint.h>
47*c83a76b0SSuyog Pawar 
48*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
49*c83a76b0SSuyog Pawar #include "iv.h"
50*c83a76b0SSuyog Pawar #include "ivd.h"
51*c83a76b0SSuyog Pawar #include "ihevcd_cxa.h"
52*c83a76b0SSuyog Pawar 
53*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
54*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
55*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
56*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
57*c83a76b0SSuyog Pawar #include "ihevc_buf_mgr.h"
58*c83a76b0SSuyog Pawar #include "ihevc_dpb_mgr.h"
59*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
60*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
61*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
62*c83a76b0SSuyog Pawar #include "ihevc_common_tables.h"
63*c83a76b0SSuyog Pawar #include "ihevc_quant_tables.h"
64*c83a76b0SSuyog Pawar 
65*c83a76b0SSuyog Pawar #include "ihevcd_trace.h"
66*c83a76b0SSuyog Pawar #include "ihevcd_defs.h"
67*c83a76b0SSuyog Pawar #include "ihevcd_function_selector.h"
68*c83a76b0SSuyog Pawar #include "ihevcd_structs.h"
69*c83a76b0SSuyog Pawar #include "ihevcd_error.h"
70*c83a76b0SSuyog Pawar #include "ihevcd_debug.h"
71*c83a76b0SSuyog Pawar #include "ihevcd_nal.h"
72*c83a76b0SSuyog Pawar #include "ihevcd_bitstream.h"
73*c83a76b0SSuyog Pawar #include "ihevcd_parse_headers.h"
74*c83a76b0SSuyog Pawar #include "ihevcd_ref_list.h"
75*c83a76b0SSuyog Pawar 
76*c83a76b0SSuyog Pawar #define COPY_DEFAULT_SCALING_LIST(pi2_scaling_mat)                                                                                      \
77*c83a76b0SSuyog Pawar {                                                                                                                                       \
78*c83a76b0SSuyog Pawar     WORD32 scaling_mat_offset[]={0, 16, 32, 48, 64, 80, 96, 160, 224, 288, 352, 416, 480, 736, 992, 1248, 1504, 1760, 2016, 3040};      \
79*c83a76b0SSuyog Pawar                                                                                                                                         \
80*c83a76b0SSuyog Pawar     /* scaling matrix for 4x4 */                                                                                                        \
81*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat, gi2_flat_scale_mat_32x32, 6*16*sizeof(WORD16));                                                             \
82*c83a76b0SSuyog Pawar /* scaling matrix for 8x8 */                                                                                                            \
83*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[6], gi2_intra_default_scale_mat_8x8, 64*sizeof(WORD16));                                \
84*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[7], gi2_intra_default_scale_mat_8x8, 64*sizeof(WORD16));                                \
85*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[8], gi2_intra_default_scale_mat_8x8, 64*sizeof(WORD16));                                \
86*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[9], gi2_inter_default_scale_mat_8x8, 64*sizeof(WORD16));                                \
87*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[10], gi2_inter_default_scale_mat_8x8, 64*sizeof(WORD16));                               \
88*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[11], gi2_inter_default_scale_mat_8x8, 64*sizeof(WORD16));                               \
89*c83a76b0SSuyog Pawar     /* scaling matrix for 16x16 */                                                                                                      \
90*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[12], gi2_intra_default_scale_mat_16x16, 256*sizeof(WORD16));                            \
91*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[13], gi2_intra_default_scale_mat_16x16, 256*sizeof(WORD16));                            \
92*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[14], gi2_intra_default_scale_mat_16x16, 256*sizeof(WORD16));                            \
93*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[15], gi2_inter_default_scale_mat_16x16, 256*sizeof(WORD16));                            \
94*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[16], gi2_inter_default_scale_mat_16x16, 256*sizeof(WORD16));                            \
95*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[17], gi2_inter_default_scale_mat_16x16, 256*sizeof(WORD16));                            \
96*c83a76b0SSuyog Pawar     /* scaling matrix for 32x32 */                                                                                                      \
97*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[18], gi2_intra_default_scale_mat_32x32, 1024*sizeof(WORD16));                           \
98*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[19], gi2_inter_default_scale_mat_32x32, 1024*sizeof(WORD16));                           \
99*c83a76b0SSuyog Pawar }
100*c83a76b0SSuyog Pawar 
101*c83a76b0SSuyog Pawar #define COPY_FLAT_SCALING_LIST(pi2_scaling_mat)                                                                                         \
102*c83a76b0SSuyog Pawar {                                                                                                                                       \
103*c83a76b0SSuyog Pawar     WORD32 scaling_mat_offset[]={0, 16, 32, 48, 64, 80, 96, 160, 224, 288, 352, 416, 480, 736, 992, 1248, 1504, 1760, 2016, 3040};      \
104*c83a76b0SSuyog Pawar                                                                                                                                         \
105*c83a76b0SSuyog Pawar     /* scaling matrix for 4x4 */                                                                                                        \
106*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat, gi2_flat_scale_mat_32x32, 6*16*sizeof(WORD16));                                                             \
107*c83a76b0SSuyog Pawar     /* scaling matrix for 8x8 */                                                                                                        \
108*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[6], gi2_flat_scale_mat_32x32, 6*64*sizeof(WORD16));                                     \
109*c83a76b0SSuyog Pawar     /* scaling matrix for 16x16 */                                                                                                      \
110*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[12], gi2_flat_scale_mat_32x32, 3*256*sizeof(WORD16));                                   \
111*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[15], gi2_flat_scale_mat_32x32, 3*256*sizeof(WORD16));                                   \
112*c83a76b0SSuyog Pawar     /* scaling matrix for 32x32 */                                                                                                      \
113*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[18], gi2_flat_scale_mat_32x32, 1024*sizeof(WORD16));                                    \
114*c83a76b0SSuyog Pawar     memcpy(pi2_scaling_mat + scaling_mat_offset[19], gi2_flat_scale_mat_32x32, 1024*sizeof(WORD16));                                    \
115*c83a76b0SSuyog Pawar }
116*c83a76b0SSuyog Pawar 
117*c83a76b0SSuyog Pawar /* Function declarations */
118*c83a76b0SSuyog Pawar 
119*c83a76b0SSuyog Pawar /**
120*c83a76b0SSuyog Pawar *******************************************************************************
121*c83a76b0SSuyog Pawar *
122*c83a76b0SSuyog Pawar * @brief
123*c83a76b0SSuyog Pawar *  Parses Prediction weight table syntax
124*c83a76b0SSuyog Pawar *
125*c83a76b0SSuyog Pawar * @par Description:
126*c83a76b0SSuyog Pawar *  Parse Prediction weight table syntax as per Section: 7.3.8.4
127*c83a76b0SSuyog Pawar *
128*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
129*c83a76b0SSuyog Pawar *  Pointer to bitstream context
130*c83a76b0SSuyog Pawar *
131*c83a76b0SSuyog Pawar * @param[in] ps_sps
132*c83a76b0SSuyog Pawar *  Current SPS
133*c83a76b0SSuyog Pawar *
134*c83a76b0SSuyog Pawar * @param[in] ps_pps
135*c83a76b0SSuyog Pawar *  Current PPS
136*c83a76b0SSuyog Pawar *
137*c83a76b0SSuyog Pawar * @param[in] ps_slice_hdr
138*c83a76b0SSuyog Pawar *  Current Slice header
139*c83a76b0SSuyog Pawar *
140*c83a76b0SSuyog Pawar * @returns  Error code from IHEVCD_ERROR_T
141*c83a76b0SSuyog Pawar *
142*c83a76b0SSuyog Pawar * @remarks
143*c83a76b0SSuyog Pawar *
144*c83a76b0SSuyog Pawar *
145*c83a76b0SSuyog Pawar *******************************************************************************
146*c83a76b0SSuyog Pawar */
147*c83a76b0SSuyog Pawar 
ihevcd_parse_pred_wt_ofst(bitstrm_t * ps_bitstrm,sps_t * ps_sps,pps_t * ps_pps,slice_header_t * ps_slice_hdr)148*c83a76b0SSuyog Pawar WORD32 ihevcd_parse_pred_wt_ofst(bitstrm_t *ps_bitstrm,
149*c83a76b0SSuyog Pawar                                  sps_t *ps_sps,
150*c83a76b0SSuyog Pawar                                  pps_t *ps_pps,
151*c83a76b0SSuyog Pawar                                  slice_header_t *ps_slice_hdr)
152*c83a76b0SSuyog Pawar {
153*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
154*c83a76b0SSuyog Pawar     WORD32 value;
155*c83a76b0SSuyog Pawar     UWORD32 u4_value;
156*c83a76b0SSuyog Pawar     WORD32 i;
157*c83a76b0SSuyog Pawar 
158*c83a76b0SSuyog Pawar     pred_wt_ofst_t *ps_wt_ofst = &ps_slice_hdr->s_wt_ofst;
159*c83a76b0SSuyog Pawar     UNUSED(ps_pps);
160*c83a76b0SSuyog Pawar 
161*c83a76b0SSuyog Pawar     UEV_PARSE("luma_log2_weight_denom", u4_value, ps_bitstrm);
162*c83a76b0SSuyog Pawar     if(u4_value > 7)
163*c83a76b0SSuyog Pawar     {
164*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
165*c83a76b0SSuyog Pawar     }
166*c83a76b0SSuyog Pawar     ps_wt_ofst->i1_luma_log2_weight_denom = u4_value;
167*c83a76b0SSuyog Pawar 
168*c83a76b0SSuyog Pawar     if(ps_sps->i1_chroma_format_idc != 0)
169*c83a76b0SSuyog Pawar     {
170*c83a76b0SSuyog Pawar         SEV_PARSE("delta_chroma_log2_weight_denom", value, ps_bitstrm);
171*c83a76b0SSuyog Pawar         if((value < -7) || (value > 7))
172*c83a76b0SSuyog Pawar         {
173*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
174*c83a76b0SSuyog Pawar         }
175*c83a76b0SSuyog Pawar 
176*c83a76b0SSuyog Pawar         if(((ps_wt_ofst->i1_luma_log2_weight_denom + value) < 0) ||
177*c83a76b0SSuyog Pawar                 ((ps_wt_ofst->i1_luma_log2_weight_denom + value) > 7))
178*c83a76b0SSuyog Pawar         {
179*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
180*c83a76b0SSuyog Pawar         }
181*c83a76b0SSuyog Pawar         ps_wt_ofst->i1_chroma_log2_weight_denom = ps_wt_ofst->i1_luma_log2_weight_denom + value;
182*c83a76b0SSuyog Pawar     }
183*c83a76b0SSuyog Pawar 
184*c83a76b0SSuyog Pawar     for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l0_active; i++)
185*c83a76b0SSuyog Pawar     {
186*c83a76b0SSuyog Pawar         BITS_PARSE("luma_weight_l0_flag[ i ]", value, ps_bitstrm, 1);
187*c83a76b0SSuyog Pawar         ps_wt_ofst->i1_luma_weight_l0_flag[i] = value;
188*c83a76b0SSuyog Pawar     }
189*c83a76b0SSuyog Pawar 
190*c83a76b0SSuyog Pawar 
191*c83a76b0SSuyog Pawar 
192*c83a76b0SSuyog Pawar     if(ps_sps->i1_chroma_format_idc != 0)
193*c83a76b0SSuyog Pawar     {
194*c83a76b0SSuyog Pawar         for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l0_active; i++)
195*c83a76b0SSuyog Pawar         {
196*c83a76b0SSuyog Pawar             BITS_PARSE("chroma_weight_l0_flag[ i ]", value, ps_bitstrm, 1);
197*c83a76b0SSuyog Pawar             ps_wt_ofst->i1_chroma_weight_l0_flag[i] = value;
198*c83a76b0SSuyog Pawar         }
199*c83a76b0SSuyog Pawar     }
200*c83a76b0SSuyog Pawar     else
201*c83a76b0SSuyog Pawar     {
202*c83a76b0SSuyog Pawar         for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l0_active; i++)
203*c83a76b0SSuyog Pawar         {
204*c83a76b0SSuyog Pawar             ps_wt_ofst->i1_chroma_weight_l0_flag[i] = 0;
205*c83a76b0SSuyog Pawar         }
206*c83a76b0SSuyog Pawar     }
207*c83a76b0SSuyog Pawar 
208*c83a76b0SSuyog Pawar 
209*c83a76b0SSuyog Pawar     for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l0_active; i++)
210*c83a76b0SSuyog Pawar     {
211*c83a76b0SSuyog Pawar         if(ps_wt_ofst->i1_luma_weight_l0_flag[i])
212*c83a76b0SSuyog Pawar         {
213*c83a76b0SSuyog Pawar             SEV_PARSE("delta_luma_weight_l0[ i ]", value, ps_bitstrm);
214*c83a76b0SSuyog Pawar             if( value < -128 || value > 127 )
215*c83a76b0SSuyog Pawar             {
216*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
217*c83a76b0SSuyog Pawar             }
218*c83a76b0SSuyog Pawar 
219*c83a76b0SSuyog Pawar             ps_wt_ofst->i2_luma_weight_l0[i] = (1 << ps_wt_ofst->i1_luma_log2_weight_denom) + value;
220*c83a76b0SSuyog Pawar 
221*c83a76b0SSuyog Pawar             SEV_PARSE("luma_offset_l0[ i ]", value, ps_bitstrm);
222*c83a76b0SSuyog Pawar             if( value < -128 || value > 127 )
223*c83a76b0SSuyog Pawar             {
224*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
225*c83a76b0SSuyog Pawar             }
226*c83a76b0SSuyog Pawar             ps_wt_ofst->i2_luma_offset_l0[i] = value;
227*c83a76b0SSuyog Pawar 
228*c83a76b0SSuyog Pawar         }
229*c83a76b0SSuyog Pawar         else
230*c83a76b0SSuyog Pawar         {
231*c83a76b0SSuyog Pawar             ps_wt_ofst->i2_luma_weight_l0[i] = (1 << ps_wt_ofst->i1_luma_log2_weight_denom);
232*c83a76b0SSuyog Pawar             ps_wt_ofst->i2_luma_offset_l0[i] = 0;
233*c83a76b0SSuyog Pawar         }
234*c83a76b0SSuyog Pawar         if(ps_wt_ofst->i1_chroma_weight_l0_flag[i])
235*c83a76b0SSuyog Pawar         {
236*c83a76b0SSuyog Pawar             WORD32 ofst;
237*c83a76b0SSuyog Pawar             WORD32 shift = (1 << (BIT_DEPTH_CHROMA - 1));
238*c83a76b0SSuyog Pawar             SEV_PARSE("delta_chroma_weight_l0[ i ][ j ]", value, ps_bitstrm);
239*c83a76b0SSuyog Pawar             if(value < -128 || value > 127)
240*c83a76b0SSuyog Pawar             {
241*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
242*c83a76b0SSuyog Pawar             }
243*c83a76b0SSuyog Pawar             ps_wt_ofst->i2_chroma_weight_l0_cb[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom) + value;
244*c83a76b0SSuyog Pawar 
245*c83a76b0SSuyog Pawar 
246*c83a76b0SSuyog Pawar             SEV_PARSE("delta_chroma_offset_l0[ i ][ j ]", value, ps_bitstrm);
247*c83a76b0SSuyog Pawar             if( value < -512 || value > 511 )
248*c83a76b0SSuyog Pawar             {
249*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
250*c83a76b0SSuyog Pawar             }
251*c83a76b0SSuyog Pawar             ofst = ((shift * ps_wt_ofst->i2_chroma_weight_l0_cb[i]) >> ps_wt_ofst->i1_chroma_log2_weight_denom);
252*c83a76b0SSuyog Pawar             ofst = value - ofst + shift;
253*c83a76b0SSuyog Pawar 
254*c83a76b0SSuyog Pawar             ps_wt_ofst->i2_chroma_offset_l0_cb[i] = CLIP_S8(ofst);
255*c83a76b0SSuyog Pawar 
256*c83a76b0SSuyog Pawar             SEV_PARSE("delta_chroma_weight_l0[ i ][ j ]", value, ps_bitstrm);
257*c83a76b0SSuyog Pawar             if(value < -128 || value > 127)
258*c83a76b0SSuyog Pawar             {
259*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
260*c83a76b0SSuyog Pawar             }
261*c83a76b0SSuyog Pawar             ps_wt_ofst->i2_chroma_weight_l0_cr[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom) + value;
262*c83a76b0SSuyog Pawar 
263*c83a76b0SSuyog Pawar 
264*c83a76b0SSuyog Pawar             SEV_PARSE("delta_chroma_offset_l0[ i ][ j ]", value, ps_bitstrm);
265*c83a76b0SSuyog Pawar             if( value < -512 || value > 511 )
266*c83a76b0SSuyog Pawar             {
267*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
268*c83a76b0SSuyog Pawar             }
269*c83a76b0SSuyog Pawar             ofst = ((shift * ps_wt_ofst->i2_chroma_weight_l0_cr[i]) >> ps_wt_ofst->i1_chroma_log2_weight_denom);
270*c83a76b0SSuyog Pawar             ofst = value - ofst + shift;
271*c83a76b0SSuyog Pawar 
272*c83a76b0SSuyog Pawar             ps_wt_ofst->i2_chroma_offset_l0_cr[i] = CLIP_S8(ofst);
273*c83a76b0SSuyog Pawar 
274*c83a76b0SSuyog Pawar         }
275*c83a76b0SSuyog Pawar         else
276*c83a76b0SSuyog Pawar         {
277*c83a76b0SSuyog Pawar             ps_wt_ofst->i2_chroma_weight_l0_cb[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom);
278*c83a76b0SSuyog Pawar             ps_wt_ofst->i2_chroma_weight_l0_cr[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom);
279*c83a76b0SSuyog Pawar 
280*c83a76b0SSuyog Pawar             ps_wt_ofst->i2_chroma_offset_l0_cb[i] = 0;
281*c83a76b0SSuyog Pawar             ps_wt_ofst->i2_chroma_offset_l0_cr[i] = 0;
282*c83a76b0SSuyog Pawar         }
283*c83a76b0SSuyog Pawar     }
284*c83a76b0SSuyog Pawar     if(BSLICE == ps_slice_hdr->i1_slice_type)
285*c83a76b0SSuyog Pawar     {
286*c83a76b0SSuyog Pawar         for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l1_active; i++)
287*c83a76b0SSuyog Pawar         {
288*c83a76b0SSuyog Pawar             BITS_PARSE("luma_weight_l1_flag[ i ]", value, ps_bitstrm, 1);
289*c83a76b0SSuyog Pawar             ps_wt_ofst->i1_luma_weight_l1_flag[i] = value;
290*c83a76b0SSuyog Pawar         }
291*c83a76b0SSuyog Pawar 
292*c83a76b0SSuyog Pawar         if(ps_sps->i1_chroma_format_idc != 0)
293*c83a76b0SSuyog Pawar         {
294*c83a76b0SSuyog Pawar             for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l1_active; i++)
295*c83a76b0SSuyog Pawar             {
296*c83a76b0SSuyog Pawar                 BITS_PARSE("chroma_weight_l1_flag[ i ]", value, ps_bitstrm, 1);
297*c83a76b0SSuyog Pawar                 ps_wt_ofst->i1_chroma_weight_l1_flag[i] = value;
298*c83a76b0SSuyog Pawar             }
299*c83a76b0SSuyog Pawar         }
300*c83a76b0SSuyog Pawar         else
301*c83a76b0SSuyog Pawar         {
302*c83a76b0SSuyog Pawar             for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l1_active; i++)
303*c83a76b0SSuyog Pawar             {
304*c83a76b0SSuyog Pawar                 ps_wt_ofst->i1_chroma_weight_l1_flag[i] = 0;
305*c83a76b0SSuyog Pawar             }
306*c83a76b0SSuyog Pawar         }
307*c83a76b0SSuyog Pawar 
308*c83a76b0SSuyog Pawar         for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l1_active; i++)
309*c83a76b0SSuyog Pawar         {
310*c83a76b0SSuyog Pawar             if(ps_wt_ofst->i1_luma_weight_l1_flag[i])
311*c83a76b0SSuyog Pawar             {
312*c83a76b0SSuyog Pawar                 SEV_PARSE("delta_luma_weight_l1[ i ]", value, ps_bitstrm);
313*c83a76b0SSuyog Pawar                 if( value < -128 || value > 127 )
314*c83a76b0SSuyog Pawar                 {
315*c83a76b0SSuyog Pawar                     return IHEVCD_INVALID_PARAMETER;
316*c83a76b0SSuyog Pawar                 }
317*c83a76b0SSuyog Pawar 
318*c83a76b0SSuyog Pawar                 ps_wt_ofst->i2_luma_weight_l1[i] = (1 << ps_wt_ofst->i1_luma_log2_weight_denom) + value;
319*c83a76b0SSuyog Pawar 
320*c83a76b0SSuyog Pawar                 SEV_PARSE("luma_offset_l1[ i ]", value, ps_bitstrm);
321*c83a76b0SSuyog Pawar                 if( value < -128 || value > 127 )
322*c83a76b0SSuyog Pawar                 {
323*c83a76b0SSuyog Pawar                     return IHEVCD_INVALID_PARAMETER;
324*c83a76b0SSuyog Pawar                 }
325*c83a76b0SSuyog Pawar                 ps_wt_ofst->i2_luma_offset_l1[i] = value;
326*c83a76b0SSuyog Pawar 
327*c83a76b0SSuyog Pawar             }
328*c83a76b0SSuyog Pawar             else
329*c83a76b0SSuyog Pawar             {
330*c83a76b0SSuyog Pawar                 ps_wt_ofst->i2_luma_weight_l1[i] = (1 << ps_wt_ofst->i1_luma_log2_weight_denom);
331*c83a76b0SSuyog Pawar                 ps_wt_ofst->i2_luma_offset_l1[i] = 0;
332*c83a76b0SSuyog Pawar             }
333*c83a76b0SSuyog Pawar 
334*c83a76b0SSuyog Pawar             if(ps_wt_ofst->i1_chroma_weight_l1_flag[i])
335*c83a76b0SSuyog Pawar             {
336*c83a76b0SSuyog Pawar                 WORD32 ofst;
337*c83a76b0SSuyog Pawar                 WORD32 shift = (1 << (BIT_DEPTH_CHROMA - 1));
338*c83a76b0SSuyog Pawar                 SEV_PARSE("delta_chroma_weight_l1[ i ][ j ]", value, ps_bitstrm);
339*c83a76b0SSuyog Pawar                 if(value < -128 || value > 127)
340*c83a76b0SSuyog Pawar                 {
341*c83a76b0SSuyog Pawar                     return IHEVCD_INVALID_PARAMETER;
342*c83a76b0SSuyog Pawar                 }
343*c83a76b0SSuyog Pawar                 ps_wt_ofst->i2_chroma_weight_l1_cb[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom) + value;;
344*c83a76b0SSuyog Pawar 
345*c83a76b0SSuyog Pawar 
346*c83a76b0SSuyog Pawar                 SEV_PARSE("delta_chroma_offset_l1[ i ][ j ]", value, ps_bitstrm);
347*c83a76b0SSuyog Pawar                 if( value < -512 || value > 511 )
348*c83a76b0SSuyog Pawar                 {
349*c83a76b0SSuyog Pawar                     return IHEVCD_INVALID_PARAMETER;
350*c83a76b0SSuyog Pawar                 }
351*c83a76b0SSuyog Pawar                 ofst = ((shift * ps_wt_ofst->i2_chroma_weight_l1_cb[i]) >> ps_wt_ofst->i1_chroma_log2_weight_denom);
352*c83a76b0SSuyog Pawar                 ofst = value - ofst + shift;
353*c83a76b0SSuyog Pawar 
354*c83a76b0SSuyog Pawar                 ps_wt_ofst->i2_chroma_offset_l1_cb[i] = CLIP_S8(ofst);;
355*c83a76b0SSuyog Pawar 
356*c83a76b0SSuyog Pawar                 SEV_PARSE("delta_chroma_weight_l1[ i ][ j ]", value, ps_bitstrm);
357*c83a76b0SSuyog Pawar                 if(value < -128 || value > 127)
358*c83a76b0SSuyog Pawar                 {
359*c83a76b0SSuyog Pawar                     return IHEVCD_INVALID_PARAMETER;
360*c83a76b0SSuyog Pawar                 }
361*c83a76b0SSuyog Pawar                 ps_wt_ofst->i2_chroma_weight_l1_cr[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom) + value;
362*c83a76b0SSuyog Pawar 
363*c83a76b0SSuyog Pawar 
364*c83a76b0SSuyog Pawar                 SEV_PARSE("delta_chroma_offset_l1[ i ][ j ]", value, ps_bitstrm);
365*c83a76b0SSuyog Pawar                 if( value < -512 || value > 511 )
366*c83a76b0SSuyog Pawar                 {
367*c83a76b0SSuyog Pawar                     return IHEVCD_INVALID_PARAMETER;
368*c83a76b0SSuyog Pawar                 }
369*c83a76b0SSuyog Pawar                 ofst = ((shift * ps_wt_ofst->i2_chroma_weight_l1_cr[i]) >> ps_wt_ofst->i1_chroma_log2_weight_denom);
370*c83a76b0SSuyog Pawar                 ofst = value - ofst + shift;
371*c83a76b0SSuyog Pawar 
372*c83a76b0SSuyog Pawar                 ps_wt_ofst->i2_chroma_offset_l1_cr[i] = CLIP_S8(ofst);;
373*c83a76b0SSuyog Pawar 
374*c83a76b0SSuyog Pawar             }
375*c83a76b0SSuyog Pawar             else
376*c83a76b0SSuyog Pawar             {
377*c83a76b0SSuyog Pawar                 ps_wt_ofst->i2_chroma_weight_l1_cb[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom);
378*c83a76b0SSuyog Pawar                 ps_wt_ofst->i2_chroma_weight_l1_cr[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom);
379*c83a76b0SSuyog Pawar 
380*c83a76b0SSuyog Pawar                 ps_wt_ofst->i2_chroma_offset_l1_cb[i] = 0;
381*c83a76b0SSuyog Pawar                 ps_wt_ofst->i2_chroma_offset_l1_cr[i] = 0;
382*c83a76b0SSuyog Pawar 
383*c83a76b0SSuyog Pawar             }
384*c83a76b0SSuyog Pawar         }
385*c83a76b0SSuyog Pawar     }
386*c83a76b0SSuyog Pawar     return ret;
387*c83a76b0SSuyog Pawar }
388*c83a76b0SSuyog Pawar 
389*c83a76b0SSuyog Pawar /**
390*c83a76b0SSuyog Pawar *******************************************************************************
391*c83a76b0SSuyog Pawar *
392*c83a76b0SSuyog Pawar * @brief
393*c83a76b0SSuyog Pawar *  Parses short term reference picture set
394*c83a76b0SSuyog Pawar *
395*c83a76b0SSuyog Pawar * @par   Description
396*c83a76b0SSuyog Pawar *  Parses short term reference picture set as per section 7.3.8.2.
397*c83a76b0SSuyog Pawar * Can be called by either SPS or Slice header parsing modules.
398*c83a76b0SSuyog Pawar *
399*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
400*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
401*c83a76b0SSuyog Pawar *
402*c83a76b0SSuyog Pawar * @param[out] ps_stref_picset_base
403*c83a76b0SSuyog Pawar *  Pointer to first short term ref pic set structure
404*c83a76b0SSuyog Pawar *
405*c83a76b0SSuyog Pawar * @param[in] num_short_term_ref_pic_sets
406*c83a76b0SSuyog Pawar *  Number of short term reference pic sets
407*c83a76b0SSuyog Pawar *
408*c83a76b0SSuyog Pawar * @param[in] idx
409*c83a76b0SSuyog Pawar *  Current short term ref pic set id
410*c83a76b0SSuyog Pawar *
411*c83a76b0SSuyog Pawar * @returns Error code from IHEVCD_ERROR_T
412*c83a76b0SSuyog Pawar *
413*c83a76b0SSuyog Pawar * @remarks
414*c83a76b0SSuyog Pawar *
415*c83a76b0SSuyog Pawar *******************************************************************************
416*c83a76b0SSuyog Pawar */
ihevcd_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,stref_picset_t * ps_stref_picset)417*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_short_term_ref_pic_set(bitstrm_t *ps_bitstrm,
418*c83a76b0SSuyog Pawar                                              stref_picset_t *ps_stref_picset_base,
419*c83a76b0SSuyog Pawar                                              WORD32 num_short_term_ref_pic_sets,
420*c83a76b0SSuyog Pawar                                              WORD32 idx,
421*c83a76b0SSuyog Pawar                                              stref_picset_t *ps_stref_picset)
422*c83a76b0SSuyog Pawar {
423*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
424*c83a76b0SSuyog Pawar     UWORD32 value;
425*c83a76b0SSuyog Pawar     stref_picset_t *ps_stref_picset_ref;
426*c83a76b0SSuyog Pawar     WORD32 delta_idx, delta_rps;
427*c83a76b0SSuyog Pawar     WORD32 r_idx;
428*c83a76b0SSuyog Pawar     WORD32 i;
429*c83a76b0SSuyog Pawar     WORD32 j, k, temp;
430*c83a76b0SSuyog Pawar     if(idx > 0)
431*c83a76b0SSuyog Pawar     {
432*c83a76b0SSuyog Pawar         BITS_PARSE("inter_ref_pic_set_prediction_flag", value, ps_bitstrm, 1);
433*c83a76b0SSuyog Pawar         ps_stref_picset->i1_inter_ref_pic_set_prediction_flag = value;
434*c83a76b0SSuyog Pawar     }
435*c83a76b0SSuyog Pawar     else
436*c83a76b0SSuyog Pawar         ps_stref_picset->i1_inter_ref_pic_set_prediction_flag = 0;
437*c83a76b0SSuyog Pawar 
438*c83a76b0SSuyog Pawar     if(ps_stref_picset->i1_inter_ref_pic_set_prediction_flag)
439*c83a76b0SSuyog Pawar     {
440*c83a76b0SSuyog Pawar         WORD32 delta_rps_sign;
441*c83a76b0SSuyog Pawar         WORD32 abs_delta_rps;
442*c83a76b0SSuyog Pawar         WORD32 num_neg_pics = 0;
443*c83a76b0SSuyog Pawar         WORD32 num_pos_pics = 0;
444*c83a76b0SSuyog Pawar         WORD32 num_pics = 0;
445*c83a76b0SSuyog Pawar 
446*c83a76b0SSuyog Pawar         if(idx == num_short_term_ref_pic_sets)
447*c83a76b0SSuyog Pawar         {
448*c83a76b0SSuyog Pawar             UEV_PARSE("delta_idx_minus1", value, ps_bitstrm);
449*c83a76b0SSuyog Pawar             if(value > num_short_term_ref_pic_sets - 1)
450*c83a76b0SSuyog Pawar             {
451*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
452*c83a76b0SSuyog Pawar             }
453*c83a76b0SSuyog Pawar             delta_idx = value + 1;
454*c83a76b0SSuyog Pawar         }
455*c83a76b0SSuyog Pawar         else
456*c83a76b0SSuyog Pawar         {
457*c83a76b0SSuyog Pawar             delta_idx = 1;
458*c83a76b0SSuyog Pawar         }
459*c83a76b0SSuyog Pawar         r_idx = idx - delta_idx;
460*c83a76b0SSuyog Pawar         r_idx = CLIP3(r_idx, 0, idx - 1);
461*c83a76b0SSuyog Pawar 
462*c83a76b0SSuyog Pawar         ps_stref_picset_ref = ps_stref_picset_base + r_idx;
463*c83a76b0SSuyog Pawar 
464*c83a76b0SSuyog Pawar         BITS_PARSE("delta_rps_sign", value, ps_bitstrm, 1);
465*c83a76b0SSuyog Pawar         delta_rps_sign = value;
466*c83a76b0SSuyog Pawar 
467*c83a76b0SSuyog Pawar         UEV_PARSE("abs_delta_rps_minus1", value, ps_bitstrm);
468*c83a76b0SSuyog Pawar         if(value > 32767)
469*c83a76b0SSuyog Pawar         {
470*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
471*c83a76b0SSuyog Pawar         }
472*c83a76b0SSuyog Pawar         abs_delta_rps = value + 1;
473*c83a76b0SSuyog Pawar 
474*c83a76b0SSuyog Pawar         delta_rps = (1 - 2 * delta_rps_sign) * (abs_delta_rps);
475*c83a76b0SSuyog Pawar 
476*c83a76b0SSuyog Pawar 
477*c83a76b0SSuyog Pawar 
478*c83a76b0SSuyog Pawar         for(i = 0; i <= ps_stref_picset_ref->i1_num_delta_pocs; i++)
479*c83a76b0SSuyog Pawar         {
480*c83a76b0SSuyog Pawar             WORD32 ref_idc;
481*c83a76b0SSuyog Pawar 
482*c83a76b0SSuyog Pawar             /*****************************************************************/
483*c83a76b0SSuyog Pawar             /* ref_idc is parsed as below                                    */
484*c83a76b0SSuyog Pawar             /* bits "1" ref_idc 1                                            */
485*c83a76b0SSuyog Pawar             /* bits "01" ref_idc 2                                           */
486*c83a76b0SSuyog Pawar             /* bits "00" ref_idc 0                                           */
487*c83a76b0SSuyog Pawar             /*****************************************************************/
488*c83a76b0SSuyog Pawar             BITS_PARSE("used_by_curr_pic_flag", value, ps_bitstrm, 1);
489*c83a76b0SSuyog Pawar             ref_idc = value;
490*c83a76b0SSuyog Pawar             ps_stref_picset->ai1_used[num_pics] = value;
491*c83a76b0SSuyog Pawar             /* If ref_idc is zero check for next bit */
492*c83a76b0SSuyog Pawar             if(0 == ref_idc)
493*c83a76b0SSuyog Pawar             {
494*c83a76b0SSuyog Pawar                 BITS_PARSE("use_delta_flag", value, ps_bitstrm, 1);
495*c83a76b0SSuyog Pawar                 ref_idc = value << 1;
496*c83a76b0SSuyog Pawar             }
497*c83a76b0SSuyog Pawar             if((ref_idc == 1) || (ref_idc == 2))
498*c83a76b0SSuyog Pawar             {
499*c83a76b0SSuyog Pawar                 WORD32 delta_poc;
500*c83a76b0SSuyog Pawar                 delta_poc = delta_rps;
501*c83a76b0SSuyog Pawar                 delta_poc +=
502*c83a76b0SSuyog Pawar                                 ((i < ps_stref_picset_ref->i1_num_delta_pocs) ?
503*c83a76b0SSuyog Pawar                                 ps_stref_picset_ref->ai2_delta_poc[i] :
504*c83a76b0SSuyog Pawar                                 0);
505*c83a76b0SSuyog Pawar 
506*c83a76b0SSuyog Pawar                 ps_stref_picset->ai2_delta_poc[num_pics] = delta_poc;
507*c83a76b0SSuyog Pawar 
508*c83a76b0SSuyog Pawar                 if(delta_poc < 0)
509*c83a76b0SSuyog Pawar                 {
510*c83a76b0SSuyog Pawar                     num_neg_pics++;
511*c83a76b0SSuyog Pawar                 }
512*c83a76b0SSuyog Pawar                 else
513*c83a76b0SSuyog Pawar                 {
514*c83a76b0SSuyog Pawar                     num_pos_pics++;
515*c83a76b0SSuyog Pawar                 }
516*c83a76b0SSuyog Pawar                 num_pics++;
517*c83a76b0SSuyog Pawar             }
518*c83a76b0SSuyog Pawar             ps_stref_picset->ai1_ref_idc[i] = ref_idc;
519*c83a76b0SSuyog Pawar         }
520*c83a76b0SSuyog Pawar 
521*c83a76b0SSuyog Pawar         num_neg_pics = CLIP3(num_neg_pics, 0, MAX_DPB_SIZE - 1);
522*c83a76b0SSuyog Pawar         num_pos_pics = CLIP3(num_pos_pics, 0, (MAX_DPB_SIZE - 1 - num_neg_pics));
523*c83a76b0SSuyog Pawar         num_pics = num_neg_pics + num_pos_pics;
524*c83a76b0SSuyog Pawar 
525*c83a76b0SSuyog Pawar         ps_stref_picset->i1_num_ref_idc =
526*c83a76b0SSuyog Pawar                         ps_stref_picset_ref->i1_num_delta_pocs + 1;
527*c83a76b0SSuyog Pawar         ps_stref_picset->i1_num_delta_pocs = num_pics;
528*c83a76b0SSuyog Pawar         ps_stref_picset->i1_num_pos_pics = num_pos_pics;
529*c83a76b0SSuyog Pawar         ps_stref_picset->i1_num_neg_pics = num_neg_pics;
530*c83a76b0SSuyog Pawar 
531*c83a76b0SSuyog Pawar 
532*c83a76b0SSuyog Pawar         for(j = 1; j < num_pics; j++)
533*c83a76b0SSuyog Pawar         {
534*c83a76b0SSuyog Pawar             WORD32 delta_poc = ps_stref_picset->ai2_delta_poc[j];
535*c83a76b0SSuyog Pawar             WORD8 i1_used = ps_stref_picset->ai1_used[j];
536*c83a76b0SSuyog Pawar             for(k = j - 1; k >= 0; k--)
537*c83a76b0SSuyog Pawar             {
538*c83a76b0SSuyog Pawar                 temp = ps_stref_picset->ai2_delta_poc[k];
539*c83a76b0SSuyog Pawar                 if(delta_poc < temp)
540*c83a76b0SSuyog Pawar                 {
541*c83a76b0SSuyog Pawar                     ps_stref_picset->ai2_delta_poc[k + 1] = temp;
542*c83a76b0SSuyog Pawar                     ps_stref_picset->ai1_used[k + 1] = ps_stref_picset->ai1_used[k];
543*c83a76b0SSuyog Pawar                     ps_stref_picset->ai2_delta_poc[k] = delta_poc;
544*c83a76b0SSuyog Pawar                     ps_stref_picset->ai1_used[k] = i1_used;
545*c83a76b0SSuyog Pawar                 }
546*c83a76b0SSuyog Pawar             }
547*c83a76b0SSuyog Pawar         }
548*c83a76b0SSuyog Pawar         // flip the negative values to largest first
549*c83a76b0SSuyog Pawar         for(j = 0, k = num_neg_pics - 1; j < num_neg_pics >> 1; j++, k--)
550*c83a76b0SSuyog Pawar         {
551*c83a76b0SSuyog Pawar             WORD32 delta_poc = ps_stref_picset->ai2_delta_poc[j];
552*c83a76b0SSuyog Pawar             WORD8 i1_used = ps_stref_picset->ai1_used[j];
553*c83a76b0SSuyog Pawar             ps_stref_picset->ai2_delta_poc[j] = ps_stref_picset->ai2_delta_poc[k];
554*c83a76b0SSuyog Pawar             ps_stref_picset->ai1_used[j] = ps_stref_picset->ai1_used[k];
555*c83a76b0SSuyog Pawar             ps_stref_picset->ai2_delta_poc[k] = delta_poc;
556*c83a76b0SSuyog Pawar             ps_stref_picset->ai1_used[k] = i1_used;
557*c83a76b0SSuyog Pawar         }
558*c83a76b0SSuyog Pawar 
559*c83a76b0SSuyog Pawar     }
560*c83a76b0SSuyog Pawar     else
561*c83a76b0SSuyog Pawar     {
562*c83a76b0SSuyog Pawar         WORD32 prev_poc = 0;
563*c83a76b0SSuyog Pawar         WORD32 poc;
564*c83a76b0SSuyog Pawar 
565*c83a76b0SSuyog Pawar         UEV_PARSE("num_negative_pics", value, ps_bitstrm);
566*c83a76b0SSuyog Pawar         if(value > MAX_DPB_SIZE - 1)
567*c83a76b0SSuyog Pawar         {
568*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
569*c83a76b0SSuyog Pawar         }
570*c83a76b0SSuyog Pawar         ps_stref_picset->i1_num_neg_pics = value;
571*c83a76b0SSuyog Pawar 
572*c83a76b0SSuyog Pawar         UEV_PARSE("num_positive_pics", value, ps_bitstrm);
573*c83a76b0SSuyog Pawar         if(value > (MAX_DPB_SIZE - 1 - ps_stref_picset->i1_num_neg_pics))
574*c83a76b0SSuyog Pawar         {
575*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
576*c83a76b0SSuyog Pawar         }
577*c83a76b0SSuyog Pawar         ps_stref_picset->i1_num_pos_pics = value;
578*c83a76b0SSuyog Pawar 
579*c83a76b0SSuyog Pawar         ps_stref_picset->i1_num_delta_pocs =
580*c83a76b0SSuyog Pawar                         ps_stref_picset->i1_num_neg_pics +
581*c83a76b0SSuyog Pawar                         ps_stref_picset->i1_num_pos_pics;
582*c83a76b0SSuyog Pawar 
583*c83a76b0SSuyog Pawar 
584*c83a76b0SSuyog Pawar         for(i = 0; i < ps_stref_picset->i1_num_neg_pics; i++)
585*c83a76b0SSuyog Pawar         {
586*c83a76b0SSuyog Pawar             UEV_PARSE("delta_poc_s0_minus1", value, ps_bitstrm);
587*c83a76b0SSuyog Pawar             if(value > 32767)
588*c83a76b0SSuyog Pawar             {
589*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
590*c83a76b0SSuyog Pawar             }
591*c83a76b0SSuyog Pawar             poc = prev_poc - ((WORD32)(value + 1));
592*c83a76b0SSuyog Pawar             prev_poc = poc;
593*c83a76b0SSuyog Pawar             ps_stref_picset->ai2_delta_poc[i] = poc;
594*c83a76b0SSuyog Pawar 
595*c83a76b0SSuyog Pawar             BITS_PARSE("used_by_curr_pic_s0_flag", value, ps_bitstrm, 1);
596*c83a76b0SSuyog Pawar             ps_stref_picset->ai1_used[i] = value;
597*c83a76b0SSuyog Pawar 
598*c83a76b0SSuyog Pawar         }
599*c83a76b0SSuyog Pawar         prev_poc = 0;
600*c83a76b0SSuyog Pawar         for(i = ps_stref_picset->i1_num_neg_pics;
601*c83a76b0SSuyog Pawar                         i < ps_stref_picset->i1_num_delta_pocs;
602*c83a76b0SSuyog Pawar                         i++)
603*c83a76b0SSuyog Pawar         {
604*c83a76b0SSuyog Pawar             UEV_PARSE("delta_poc_s1_minus1", value, ps_bitstrm);
605*c83a76b0SSuyog Pawar             if(value > 32767)
606*c83a76b0SSuyog Pawar             {
607*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
608*c83a76b0SSuyog Pawar             }
609*c83a76b0SSuyog Pawar             poc = prev_poc + (value + 1);
610*c83a76b0SSuyog Pawar             prev_poc = poc;
611*c83a76b0SSuyog Pawar             ps_stref_picset->ai2_delta_poc[i] = poc;
612*c83a76b0SSuyog Pawar 
613*c83a76b0SSuyog Pawar             BITS_PARSE("used_by_curr_pic_s1_flag", value, ps_bitstrm, 1);
614*c83a76b0SSuyog Pawar             ps_stref_picset->ai1_used[i] = value;
615*c83a76b0SSuyog Pawar 
616*c83a76b0SSuyog Pawar         }
617*c83a76b0SSuyog Pawar 
618*c83a76b0SSuyog Pawar     }
619*c83a76b0SSuyog Pawar 
620*c83a76b0SSuyog Pawar     return ret;
621*c83a76b0SSuyog Pawar }
622*c83a76b0SSuyog Pawar 
623*c83a76b0SSuyog Pawar 
ihevcd_parse_sub_layer_hrd_parameters(bitstrm_t * ps_bitstrm,sub_lyr_hrd_params_t * ps_sub_layer_hrd_params,WORD32 cpb_cnt,WORD32 sub_pic_cpb_params_present_flag)624*c83a76b0SSuyog Pawar static WORD32 ihevcd_parse_sub_layer_hrd_parameters(bitstrm_t *ps_bitstrm,
625*c83a76b0SSuyog Pawar                                                     sub_lyr_hrd_params_t *ps_sub_layer_hrd_params,
626*c83a76b0SSuyog Pawar                                                     WORD32 cpb_cnt,
627*c83a76b0SSuyog Pawar                                                     WORD32 sub_pic_cpb_params_present_flag)
628*c83a76b0SSuyog Pawar {
629*c83a76b0SSuyog Pawar     WORD32 ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
630*c83a76b0SSuyog Pawar     WORD32 i;
631*c83a76b0SSuyog Pawar 
632*c83a76b0SSuyog Pawar     for(i = 0; i <= cpb_cnt; i++)
633*c83a76b0SSuyog Pawar     {
634*c83a76b0SSuyog Pawar         UEV_PARSE("bit_rate_value_minus1[ i ]", ps_sub_layer_hrd_params->au4_bit_rate_value_minus1[i], ps_bitstrm);
635*c83a76b0SSuyog Pawar         if(ps_sub_layer_hrd_params->au4_bit_rate_value_minus1[i] > UINT_MAX - 1)
636*c83a76b0SSuyog Pawar         {
637*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
638*c83a76b0SSuyog Pawar         }
639*c83a76b0SSuyog Pawar         UEV_PARSE("cpb_size_value_minus1[ i ]", ps_sub_layer_hrd_params->au4_cpb_size_value_minus1[i], ps_bitstrm);
640*c83a76b0SSuyog Pawar         if(ps_sub_layer_hrd_params->au4_cpb_size_value_minus1[i] > UINT_MAX - 1)
641*c83a76b0SSuyog Pawar         {
642*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
643*c83a76b0SSuyog Pawar         }
644*c83a76b0SSuyog Pawar         if(sub_pic_cpb_params_present_flag)
645*c83a76b0SSuyog Pawar         {
646*c83a76b0SSuyog Pawar             UEV_PARSE("cpb_size_du_value_minus1[ i ]", ps_sub_layer_hrd_params->au4_cpb_size_du_value_minus1[i], ps_bitstrm);
647*c83a76b0SSuyog Pawar             if(ps_sub_layer_hrd_params->au4_cpb_size_du_value_minus1[i] > UINT_MAX - 1)
648*c83a76b0SSuyog Pawar             {
649*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
650*c83a76b0SSuyog Pawar             }
651*c83a76b0SSuyog Pawar             UEV_PARSE("bit_rate_du_value_minus1[ i ]", ps_sub_layer_hrd_params->au4_bit_rate_du_value_minus1[i], ps_bitstrm);
652*c83a76b0SSuyog Pawar             if(ps_sub_layer_hrd_params->au4_bit_rate_du_value_minus1[i] > UINT_MAX - 1)
653*c83a76b0SSuyog Pawar             {
654*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
655*c83a76b0SSuyog Pawar             }
656*c83a76b0SSuyog Pawar         }
657*c83a76b0SSuyog Pawar         BITS_PARSE("cbr_flag[ i ]", ps_sub_layer_hrd_params->au1_cbr_flag[i], ps_bitstrm, 1);
658*c83a76b0SSuyog Pawar     }
659*c83a76b0SSuyog Pawar 
660*c83a76b0SSuyog Pawar     return ret;
661*c83a76b0SSuyog Pawar }
662*c83a76b0SSuyog Pawar 
663*c83a76b0SSuyog Pawar 
ihevcd_parse_hrd_parameters(bitstrm_t * ps_bitstrm,hrd_params_t * ps_hrd,WORD32 common_info_present_flag,WORD32 max_num_sub_layers_minus1)664*c83a76b0SSuyog Pawar static WORD32 ihevcd_parse_hrd_parameters(bitstrm_t *ps_bitstrm,
665*c83a76b0SSuyog Pawar                                           hrd_params_t *ps_hrd,
666*c83a76b0SSuyog Pawar                                           WORD32 common_info_present_flag,
667*c83a76b0SSuyog Pawar                                           WORD32 max_num_sub_layers_minus1)
668*c83a76b0SSuyog Pawar {
669*c83a76b0SSuyog Pawar     WORD32 ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
670*c83a76b0SSuyog Pawar     WORD32 i;
671*c83a76b0SSuyog Pawar 
672*c83a76b0SSuyog Pawar     ps_hrd->u1_nal_hrd_parameters_present_flag = 0;
673*c83a76b0SSuyog Pawar     ps_hrd->u1_vcl_hrd_parameters_present_flag = 0;
674*c83a76b0SSuyog Pawar 
675*c83a76b0SSuyog Pawar     ps_hrd->u1_sub_pic_cpb_params_present_flag = 0;
676*c83a76b0SSuyog Pawar 
677*c83a76b0SSuyog Pawar     ps_hrd->u1_tick_divisor_minus2 = 0;
678*c83a76b0SSuyog Pawar     ps_hrd->u1_du_cpb_removal_delay_increment_length_minus1 = 0;
679*c83a76b0SSuyog Pawar     ps_hrd->u1_sub_pic_cpb_params_in_pic_timing_sei_flag = 0;
680*c83a76b0SSuyog Pawar     ps_hrd->u1_dpb_output_delay_du_length_minus1 = 0;
681*c83a76b0SSuyog Pawar 
682*c83a76b0SSuyog Pawar     ps_hrd->u4_bit_rate_scale = 0;
683*c83a76b0SSuyog Pawar     ps_hrd->u4_cpb_size_scale = 0;
684*c83a76b0SSuyog Pawar     ps_hrd->u4_cpb_size_du_scale = 0;
685*c83a76b0SSuyog Pawar 
686*c83a76b0SSuyog Pawar     ps_hrd->u1_initial_cpb_removal_delay_length_minus1 = 23;
687*c83a76b0SSuyog Pawar     ps_hrd->u1_au_cpb_removal_delay_length_minus1 = 23;
688*c83a76b0SSuyog Pawar     ps_hrd->u1_dpb_output_delay_length_minus1 = 23;
689*c83a76b0SSuyog Pawar 
690*c83a76b0SSuyog Pawar     if(common_info_present_flag)
691*c83a76b0SSuyog Pawar     {
692*c83a76b0SSuyog Pawar         BITS_PARSE("nal_hrd_parameters_present_flag", ps_hrd->u1_nal_hrd_parameters_present_flag, ps_bitstrm, 1);
693*c83a76b0SSuyog Pawar         BITS_PARSE("vcl_hrd_parameters_present_flag", ps_hrd->u1_vcl_hrd_parameters_present_flag, ps_bitstrm, 1);
694*c83a76b0SSuyog Pawar 
695*c83a76b0SSuyog Pawar         if(ps_hrd->u1_nal_hrd_parameters_present_flag  ||  ps_hrd->u1_vcl_hrd_parameters_present_flag)
696*c83a76b0SSuyog Pawar         {
697*c83a76b0SSuyog Pawar             BITS_PARSE("sub_pic_cpb_params_present_flag", ps_hrd->u1_sub_pic_cpb_params_present_flag, ps_bitstrm, 1);
698*c83a76b0SSuyog Pawar             if(ps_hrd->u1_sub_pic_cpb_params_present_flag)
699*c83a76b0SSuyog Pawar             {
700*c83a76b0SSuyog Pawar                 BITS_PARSE("tick_divisor_minus2", ps_hrd->u1_tick_divisor_minus2, ps_bitstrm, 8);
701*c83a76b0SSuyog Pawar                 BITS_PARSE("du_cpb_removal_delay_increment_length_minus1", ps_hrd->u1_du_cpb_removal_delay_increment_length_minus1, ps_bitstrm, 5);
702*c83a76b0SSuyog Pawar                 BITS_PARSE("sub_pic_cpb_params_in_pic_timing_sei_flag", ps_hrd->u1_sub_pic_cpb_params_in_pic_timing_sei_flag, ps_bitstrm, 1);
703*c83a76b0SSuyog Pawar                 BITS_PARSE("dpb_output_delay_du_length_minus1", ps_hrd->u1_dpb_output_delay_du_length_minus1, ps_bitstrm, 5);
704*c83a76b0SSuyog Pawar             }
705*c83a76b0SSuyog Pawar 
706*c83a76b0SSuyog Pawar             BITS_PARSE("bit_rate_scale", ps_hrd->u4_bit_rate_scale, ps_bitstrm, 4);
707*c83a76b0SSuyog Pawar             BITS_PARSE("cpb_size_scale", ps_hrd->u4_cpb_size_scale, ps_bitstrm, 4);
708*c83a76b0SSuyog Pawar             if(ps_hrd->u1_sub_pic_cpb_params_present_flag)
709*c83a76b0SSuyog Pawar                 BITS_PARSE("cpb_size_du_scale", ps_hrd->u4_cpb_size_du_scale, ps_bitstrm, 4);
710*c83a76b0SSuyog Pawar 
711*c83a76b0SSuyog Pawar             BITS_PARSE("initial_cpb_removal_delay_length_minus1", ps_hrd->u1_initial_cpb_removal_delay_length_minus1, ps_bitstrm, 5);
712*c83a76b0SSuyog Pawar             BITS_PARSE("au_cpb_removal_delay_length_minus1", ps_hrd->u1_au_cpb_removal_delay_length_minus1, ps_bitstrm, 5);
713*c83a76b0SSuyog Pawar             BITS_PARSE("dpb_output_delay_length_minus1", ps_hrd->u1_dpb_output_delay_length_minus1, ps_bitstrm, 5);
714*c83a76b0SSuyog Pawar         }
715*c83a76b0SSuyog Pawar     }
716*c83a76b0SSuyog Pawar 
717*c83a76b0SSuyog Pawar 
718*c83a76b0SSuyog Pawar     for(i = 0; i <= max_num_sub_layers_minus1; i++)
719*c83a76b0SSuyog Pawar     {
720*c83a76b0SSuyog Pawar         BITS_PARSE("fixed_pic_rate_general_flag[ i ]", ps_hrd->au1_fixed_pic_rate_general_flag[i], ps_bitstrm, 1);
721*c83a76b0SSuyog Pawar 
722*c83a76b0SSuyog Pawar         ps_hrd->au1_fixed_pic_rate_within_cvs_flag[i] = 1;
723*c83a76b0SSuyog Pawar         ps_hrd->au2_elemental_duration_in_tc_minus1[i] = 0;
724*c83a76b0SSuyog Pawar         ps_hrd->au1_low_delay_hrd_flag[i] = 0;
725*c83a76b0SSuyog Pawar         ps_hrd->au1_cpb_cnt_minus1[i] = 0;
726*c83a76b0SSuyog Pawar 
727*c83a76b0SSuyog Pawar         if(!ps_hrd->au1_fixed_pic_rate_general_flag[i])
728*c83a76b0SSuyog Pawar             BITS_PARSE("fixed_pic_rate_within_cvs_flag[ i ]", ps_hrd->au1_fixed_pic_rate_within_cvs_flag[i], ps_bitstrm, 1);
729*c83a76b0SSuyog Pawar 
730*c83a76b0SSuyog Pawar         if(ps_hrd->au1_fixed_pic_rate_within_cvs_flag[i])
731*c83a76b0SSuyog Pawar         {
732*c83a76b0SSuyog Pawar             UEV_PARSE("elemental_duration_in_tc_minus1[ i ]", ps_hrd->au2_elemental_duration_in_tc_minus1[i], ps_bitstrm);
733*c83a76b0SSuyog Pawar             if(ps_hrd->au2_elemental_duration_in_tc_minus1[i] > 2047)
734*c83a76b0SSuyog Pawar             {
735*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
736*c83a76b0SSuyog Pawar             }
737*c83a76b0SSuyog Pawar         }
738*c83a76b0SSuyog Pawar         else
739*c83a76b0SSuyog Pawar         {
740*c83a76b0SSuyog Pawar             BITS_PARSE("low_delay_hrd_flag[ i ]", ps_hrd->au1_low_delay_hrd_flag[i], ps_bitstrm, 1);
741*c83a76b0SSuyog Pawar         }
742*c83a76b0SSuyog Pawar 
743*c83a76b0SSuyog Pawar         if(!ps_hrd->au1_low_delay_hrd_flag[i])
744*c83a76b0SSuyog Pawar         {
745*c83a76b0SSuyog Pawar             UEV_PARSE("cpb_cnt_minus1[ i ]", ps_hrd->au1_cpb_cnt_minus1[i], ps_bitstrm);
746*c83a76b0SSuyog Pawar             if(ps_hrd->au1_cpb_cnt_minus1[i] > (MAX_CPB_CNT - 1))
747*c83a76b0SSuyog Pawar             {
748*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
749*c83a76b0SSuyog Pawar             }
750*c83a76b0SSuyog Pawar         }
751*c83a76b0SSuyog Pawar 
752*c83a76b0SSuyog Pawar         if(ps_hrd->u1_nal_hrd_parameters_present_flag)
753*c83a76b0SSuyog Pawar             ihevcd_parse_sub_layer_hrd_parameters(ps_bitstrm,
754*c83a76b0SSuyog Pawar                                                   &ps_hrd->as_sub_layer_hrd_params[i],
755*c83a76b0SSuyog Pawar                                                   ps_hrd->au1_cpb_cnt_minus1[i],
756*c83a76b0SSuyog Pawar                                                   ps_hrd->u1_sub_pic_cpb_params_present_flag);
757*c83a76b0SSuyog Pawar 
758*c83a76b0SSuyog Pawar         if(ps_hrd->u1_vcl_hrd_parameters_present_flag)
759*c83a76b0SSuyog Pawar             ihevcd_parse_sub_layer_hrd_parameters(ps_bitstrm,
760*c83a76b0SSuyog Pawar                                                   &ps_hrd->as_sub_layer_hrd_params[i],
761*c83a76b0SSuyog Pawar                                                   ps_hrd->au1_cpb_cnt_minus1[i],
762*c83a76b0SSuyog Pawar                                                   ps_hrd->u1_sub_pic_cpb_params_present_flag);
763*c83a76b0SSuyog Pawar     }
764*c83a76b0SSuyog Pawar 
765*c83a76b0SSuyog Pawar     return ret;
766*c83a76b0SSuyog Pawar }
767*c83a76b0SSuyog Pawar 
768*c83a76b0SSuyog Pawar 
ihevcd_parse_vui_parameters(bitstrm_t * ps_bitstrm,vui_t * ps_vui,WORD32 sps_max_sub_layers_minus1)769*c83a76b0SSuyog Pawar static WORD32 ihevcd_parse_vui_parameters(bitstrm_t *ps_bitstrm,
770*c83a76b0SSuyog Pawar                                           vui_t *ps_vui,
771*c83a76b0SSuyog Pawar                                           WORD32 sps_max_sub_layers_minus1)
772*c83a76b0SSuyog Pawar {
773*c83a76b0SSuyog Pawar     WORD32 ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
774*c83a76b0SSuyog Pawar     UWORD16 u2_sar_width = 0;
775*c83a76b0SSuyog Pawar     UWORD16 u2_sar_height = 0;
776*c83a76b0SSuyog Pawar 
777*c83a76b0SSuyog Pawar     BITS_PARSE("aspect_ratio_info_present_flag", ps_vui->u1_aspect_ratio_info_present_flag, ps_bitstrm, 1);
778*c83a76b0SSuyog Pawar 
779*c83a76b0SSuyog Pawar     ps_vui->u1_aspect_ratio_idc = SAR_UNUSED;
780*c83a76b0SSuyog Pawar     u2_sar_width = 0;
781*c83a76b0SSuyog Pawar     u2_sar_height = 0;
782*c83a76b0SSuyog Pawar     if(ps_vui->u1_aspect_ratio_info_present_flag)
783*c83a76b0SSuyog Pawar     {
784*c83a76b0SSuyog Pawar         BITS_PARSE("aspect_ratio_idc", ps_vui->u1_aspect_ratio_idc, ps_bitstrm, 8);
785*c83a76b0SSuyog Pawar         switch(ps_vui->u1_aspect_ratio_idc)
786*c83a76b0SSuyog Pawar         {
787*c83a76b0SSuyog Pawar             case SAR_1_1:
788*c83a76b0SSuyog Pawar                 u2_sar_width = 1;
789*c83a76b0SSuyog Pawar                 u2_sar_height = 1;
790*c83a76b0SSuyog Pawar                 break;
791*c83a76b0SSuyog Pawar             case SAR_12_11:
792*c83a76b0SSuyog Pawar                 u2_sar_width = 12;
793*c83a76b0SSuyog Pawar                 u2_sar_height = 11;
794*c83a76b0SSuyog Pawar                 break;
795*c83a76b0SSuyog Pawar             case SAR_10_11:
796*c83a76b0SSuyog Pawar                 u2_sar_width = 10;
797*c83a76b0SSuyog Pawar                 u2_sar_height = 11;
798*c83a76b0SSuyog Pawar                 break;
799*c83a76b0SSuyog Pawar             case SAR_16_11:
800*c83a76b0SSuyog Pawar                 u2_sar_width = 16;
801*c83a76b0SSuyog Pawar                 u2_sar_height = 11;
802*c83a76b0SSuyog Pawar                 break;
803*c83a76b0SSuyog Pawar             case SAR_40_33:
804*c83a76b0SSuyog Pawar                 u2_sar_width = 40;
805*c83a76b0SSuyog Pawar                 u2_sar_height = 33;
806*c83a76b0SSuyog Pawar                 break;
807*c83a76b0SSuyog Pawar             case SAR_24_11:
808*c83a76b0SSuyog Pawar                 u2_sar_width = 24;
809*c83a76b0SSuyog Pawar                 u2_sar_height = 11;
810*c83a76b0SSuyog Pawar                 break;
811*c83a76b0SSuyog Pawar             case SAR_20_11:
812*c83a76b0SSuyog Pawar                 u2_sar_width = 20;
813*c83a76b0SSuyog Pawar                 u2_sar_height = 11;
814*c83a76b0SSuyog Pawar                 break;
815*c83a76b0SSuyog Pawar             case SAR_32_11:
816*c83a76b0SSuyog Pawar                 u2_sar_width = 32;
817*c83a76b0SSuyog Pawar                 u2_sar_height = 11;
818*c83a76b0SSuyog Pawar                 break;
819*c83a76b0SSuyog Pawar             case SAR_80_33:
820*c83a76b0SSuyog Pawar                 u2_sar_width = 80;
821*c83a76b0SSuyog Pawar                 u2_sar_height = 33;
822*c83a76b0SSuyog Pawar                 break;
823*c83a76b0SSuyog Pawar             case SAR_18_11:
824*c83a76b0SSuyog Pawar                 u2_sar_width = 18;
825*c83a76b0SSuyog Pawar                 u2_sar_height = 11;
826*c83a76b0SSuyog Pawar                 break;
827*c83a76b0SSuyog Pawar             case SAR_15_11:
828*c83a76b0SSuyog Pawar                 u2_sar_width = 15;
829*c83a76b0SSuyog Pawar                 u2_sar_height = 11;
830*c83a76b0SSuyog Pawar                 break;
831*c83a76b0SSuyog Pawar             case SAR_64_33:
832*c83a76b0SSuyog Pawar                 u2_sar_width = 64;
833*c83a76b0SSuyog Pawar                 u2_sar_height = 33;
834*c83a76b0SSuyog Pawar                 break;
835*c83a76b0SSuyog Pawar             case SAR_160_99:
836*c83a76b0SSuyog Pawar                 u2_sar_width = 160;
837*c83a76b0SSuyog Pawar                 u2_sar_height = 99;
838*c83a76b0SSuyog Pawar                 break;
839*c83a76b0SSuyog Pawar             case SAR_4_3:
840*c83a76b0SSuyog Pawar                 u2_sar_width = 4;
841*c83a76b0SSuyog Pawar                 u2_sar_height = 3;
842*c83a76b0SSuyog Pawar                 break;
843*c83a76b0SSuyog Pawar             case SAR_3_2:
844*c83a76b0SSuyog Pawar                 u2_sar_width = 3;
845*c83a76b0SSuyog Pawar                 u2_sar_height = 2;
846*c83a76b0SSuyog Pawar                 break;
847*c83a76b0SSuyog Pawar             case SAR_2_1:
848*c83a76b0SSuyog Pawar                 u2_sar_width = 2;
849*c83a76b0SSuyog Pawar                 u2_sar_height = 1;
850*c83a76b0SSuyog Pawar                 break;
851*c83a76b0SSuyog Pawar             case EXTENDED_SAR:
852*c83a76b0SSuyog Pawar                 BITS_PARSE("sar_width", u2_sar_width, ps_bitstrm, 16);
853*c83a76b0SSuyog Pawar                 BITS_PARSE("sar_height", u2_sar_height, ps_bitstrm, 16);
854*c83a76b0SSuyog Pawar                 break;
855*c83a76b0SSuyog Pawar             default:
856*c83a76b0SSuyog Pawar                 u2_sar_width = 0;
857*c83a76b0SSuyog Pawar                 u2_sar_height = 0;
858*c83a76b0SSuyog Pawar                 break;
859*c83a76b0SSuyog Pawar         }
860*c83a76b0SSuyog Pawar     }
861*c83a76b0SSuyog Pawar 
862*c83a76b0SSuyog Pawar     ps_vui->u2_sar_width    = u2_sar_width;
863*c83a76b0SSuyog Pawar     ps_vui->u2_sar_height   = u2_sar_height;
864*c83a76b0SSuyog Pawar 
865*c83a76b0SSuyog Pawar     BITS_PARSE("overscan_info_present_flag", ps_vui->u1_overscan_info_present_flag, ps_bitstrm, 1);
866*c83a76b0SSuyog Pawar     ps_vui->u1_overscan_appropriate_flag = 0;
867*c83a76b0SSuyog Pawar     if(ps_vui->u1_overscan_info_present_flag)
868*c83a76b0SSuyog Pawar         BITS_PARSE("overscan_appropriate_flag", ps_vui->u1_overscan_appropriate_flag, ps_bitstrm, 1);
869*c83a76b0SSuyog Pawar 
870*c83a76b0SSuyog Pawar     BITS_PARSE("video_signal_type_present_flag", ps_vui->u1_video_signal_type_present_flag, ps_bitstrm, 1);
871*c83a76b0SSuyog Pawar     ps_vui->u1_video_format = VID_FMT_UNSPECIFIED;
872*c83a76b0SSuyog Pawar     ps_vui->u1_video_full_range_flag = 0;
873*c83a76b0SSuyog Pawar     ps_vui->u1_colour_description_present_flag = 0;
874*c83a76b0SSuyog Pawar     ps_vui->u1_colour_primaries = 2;
875*c83a76b0SSuyog Pawar     ps_vui->u1_transfer_characteristics = 2;
876*c83a76b0SSuyog Pawar     ps_vui->u1_matrix_coefficients = 2;
877*c83a76b0SSuyog Pawar 
878*c83a76b0SSuyog Pawar     if(ps_vui->u1_video_signal_type_present_flag)
879*c83a76b0SSuyog Pawar     {
880*c83a76b0SSuyog Pawar         BITS_PARSE("video_format", ps_vui->u1_video_format, ps_bitstrm, 3);
881*c83a76b0SSuyog Pawar         BITS_PARSE("video_full_range_flag", ps_vui->u1_video_full_range_flag, ps_bitstrm, 1);
882*c83a76b0SSuyog Pawar         BITS_PARSE("colour_description_present_flag", ps_vui->u1_colour_description_present_flag, ps_bitstrm, 1);
883*c83a76b0SSuyog Pawar         if(ps_vui->u1_colour_description_present_flag)
884*c83a76b0SSuyog Pawar         {
885*c83a76b0SSuyog Pawar             BITS_PARSE("colour_primaries", ps_vui->u1_colour_primaries, ps_bitstrm, 8);
886*c83a76b0SSuyog Pawar             BITS_PARSE("transfer_characteristics", ps_vui->u1_transfer_characteristics, ps_bitstrm, 8);
887*c83a76b0SSuyog Pawar             BITS_PARSE("matrix_coeffs", ps_vui->u1_matrix_coefficients, ps_bitstrm, 8);
888*c83a76b0SSuyog Pawar         }
889*c83a76b0SSuyog Pawar     }
890*c83a76b0SSuyog Pawar 
891*c83a76b0SSuyog Pawar     BITS_PARSE("chroma_loc_info_present_flag", ps_vui->u1_chroma_loc_info_present_flag, ps_bitstrm, 1);
892*c83a76b0SSuyog Pawar     ps_vui->u1_chroma_sample_loc_type_top_field = 0;
893*c83a76b0SSuyog Pawar     ps_vui->u1_chroma_sample_loc_type_bottom_field = 0;
894*c83a76b0SSuyog Pawar     if(ps_vui->u1_chroma_loc_info_present_flag)
895*c83a76b0SSuyog Pawar     {
896*c83a76b0SSuyog Pawar         UEV_PARSE("chroma_sample_loc_type_top_field", ps_vui->u1_chroma_sample_loc_type_top_field, ps_bitstrm);
897*c83a76b0SSuyog Pawar         if(ps_vui->u1_chroma_sample_loc_type_top_field > CHROMA_FMT_IDC_YUV444_PLANES + 1)
898*c83a76b0SSuyog Pawar         {
899*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
900*c83a76b0SSuyog Pawar         }
901*c83a76b0SSuyog Pawar         UEV_PARSE("chroma_sample_loc_type_bottom_field", ps_vui->u1_chroma_sample_loc_type_bottom_field, ps_bitstrm);
902*c83a76b0SSuyog Pawar         if(ps_vui->u1_chroma_sample_loc_type_bottom_field > CHROMA_FMT_IDC_YUV444_PLANES + 1)
903*c83a76b0SSuyog Pawar         {
904*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
905*c83a76b0SSuyog Pawar         }
906*c83a76b0SSuyog Pawar     }
907*c83a76b0SSuyog Pawar 
908*c83a76b0SSuyog Pawar     BITS_PARSE("neutral_chroma_indication_flag", ps_vui->u1_neutral_chroma_indication_flag, ps_bitstrm, 1);
909*c83a76b0SSuyog Pawar     BITS_PARSE("field_seq_flag", ps_vui->u1_field_seq_flag, ps_bitstrm, 1);
910*c83a76b0SSuyog Pawar     BITS_PARSE("frame_field_info_present_flag", ps_vui->u1_frame_field_info_present_flag, ps_bitstrm, 1);
911*c83a76b0SSuyog Pawar     BITS_PARSE("default_display_window_flag", ps_vui->u1_default_display_window_flag, ps_bitstrm, 1);
912*c83a76b0SSuyog Pawar     ps_vui->u4_def_disp_win_left_offset = 0;
913*c83a76b0SSuyog Pawar     ps_vui->u4_def_disp_win_right_offset = 0;
914*c83a76b0SSuyog Pawar     ps_vui->u4_def_disp_win_top_offset = 0;
915*c83a76b0SSuyog Pawar     ps_vui->u4_def_disp_win_bottom_offset = 0;
916*c83a76b0SSuyog Pawar     if(ps_vui->u1_default_display_window_flag)
917*c83a76b0SSuyog Pawar     {
918*c83a76b0SSuyog Pawar         UEV_PARSE("def_disp_win_left_offset", ps_vui->u4_def_disp_win_left_offset, ps_bitstrm);
919*c83a76b0SSuyog Pawar         UEV_PARSE("def_disp_win_right_offset", ps_vui->u4_def_disp_win_right_offset, ps_bitstrm);
920*c83a76b0SSuyog Pawar         UEV_PARSE("def_disp_win_top_offset", ps_vui->u4_def_disp_win_top_offset, ps_bitstrm);
921*c83a76b0SSuyog Pawar         UEV_PARSE("def_disp_win_bottom_offset", ps_vui->u4_def_disp_win_bottom_offset, ps_bitstrm);
922*c83a76b0SSuyog Pawar     }
923*c83a76b0SSuyog Pawar 
924*c83a76b0SSuyog Pawar     BITS_PARSE("vui_timing_info_present_flag", ps_vui->u1_vui_timing_info_present_flag, ps_bitstrm, 1);
925*c83a76b0SSuyog Pawar     if(ps_vui->u1_vui_timing_info_present_flag)
926*c83a76b0SSuyog Pawar     {
927*c83a76b0SSuyog Pawar         BITS_PARSE("vui_num_units_in_tick", ps_vui->u4_vui_num_units_in_tick, ps_bitstrm, 32);
928*c83a76b0SSuyog Pawar         BITS_PARSE("vui_time_scale", ps_vui->u4_vui_time_scale, ps_bitstrm, 32);
929*c83a76b0SSuyog Pawar         BITS_PARSE("vui_poc_proportional_to_timing_flag", ps_vui->u1_poc_proportional_to_timing_flag, ps_bitstrm, 1);
930*c83a76b0SSuyog Pawar         if(ps_vui->u1_poc_proportional_to_timing_flag)
931*c83a76b0SSuyog Pawar         {
932*c83a76b0SSuyog Pawar             UEV_PARSE("vui_num_ticks_poc_diff_one_minus1", ps_vui->u4_num_ticks_poc_diff_one_minus1, ps_bitstrm);
933*c83a76b0SSuyog Pawar             if(ps_vui->u4_num_ticks_poc_diff_one_minus1 > UINT_MAX - 1)
934*c83a76b0SSuyog Pawar             {
935*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
936*c83a76b0SSuyog Pawar             }
937*c83a76b0SSuyog Pawar         }
938*c83a76b0SSuyog Pawar         BITS_PARSE("vui_hrd_parameters_present_flag", ps_vui->u1_vui_hrd_parameters_present_flag, ps_bitstrm, 1);
939*c83a76b0SSuyog Pawar         if(ps_vui->u1_vui_hrd_parameters_present_flag)
940*c83a76b0SSuyog Pawar         {
941*c83a76b0SSuyog Pawar             ret = ihevcd_parse_hrd_parameters(ps_bitstrm, &ps_vui->s_vui_hrd_parameters, 1, sps_max_sub_layers_minus1);
942*c83a76b0SSuyog Pawar             RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
943*c83a76b0SSuyog Pawar         }
944*c83a76b0SSuyog Pawar     }
945*c83a76b0SSuyog Pawar 
946*c83a76b0SSuyog Pawar     BITS_PARSE("bitstream_restriction_flag", ps_vui->u1_bitstream_restriction_flag, ps_bitstrm, 1);
947*c83a76b0SSuyog Pawar     ps_vui->u1_tiles_fixed_structure_flag = 0;
948*c83a76b0SSuyog Pawar     ps_vui->u1_motion_vectors_over_pic_boundaries_flag = 1;
949*c83a76b0SSuyog Pawar     ps_vui->u1_restricted_ref_pic_lists_flag = 0;
950*c83a76b0SSuyog Pawar     ps_vui->u4_min_spatial_segmentation_idc = 0;
951*c83a76b0SSuyog Pawar     ps_vui->u1_max_bytes_per_pic_denom = 2;
952*c83a76b0SSuyog Pawar     ps_vui->u1_max_bits_per_mincu_denom = 1;
953*c83a76b0SSuyog Pawar     ps_vui->u1_log2_max_mv_length_horizontal = 15;
954*c83a76b0SSuyog Pawar     ps_vui->u1_log2_max_mv_length_vertical = 15;
955*c83a76b0SSuyog Pawar     if(ps_vui->u1_bitstream_restriction_flag)
956*c83a76b0SSuyog Pawar     {
957*c83a76b0SSuyog Pawar         BITS_PARSE("tiles_fixed_structure_flag", ps_vui->u1_tiles_fixed_structure_flag, ps_bitstrm, 1);
958*c83a76b0SSuyog Pawar         BITS_PARSE("motion_vectors_over_pic_boundaries_flag", ps_vui->u1_motion_vectors_over_pic_boundaries_flag, ps_bitstrm, 1);
959*c83a76b0SSuyog Pawar         BITS_PARSE("restricted_ref_pic_lists_flag", ps_vui->u1_restricted_ref_pic_lists_flag, ps_bitstrm, 1);
960*c83a76b0SSuyog Pawar 
961*c83a76b0SSuyog Pawar         UEV_PARSE("min_spatial_segmentation_idc", ps_vui->u4_min_spatial_segmentation_idc, ps_bitstrm);
962*c83a76b0SSuyog Pawar         if(ps_vui->u4_min_spatial_segmentation_idc > 4095)
963*c83a76b0SSuyog Pawar         {
964*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
965*c83a76b0SSuyog Pawar         }
966*c83a76b0SSuyog Pawar         UEV_PARSE("max_bytes_per_pic_denom", ps_vui->u1_max_bytes_per_pic_denom, ps_bitstrm);
967*c83a76b0SSuyog Pawar         if(ps_vui->u1_max_bytes_per_pic_denom > 16)
968*c83a76b0SSuyog Pawar         {
969*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
970*c83a76b0SSuyog Pawar         }
971*c83a76b0SSuyog Pawar         UEV_PARSE("max_bits_per_min_cu_denom", ps_vui->u1_max_bits_per_mincu_denom, ps_bitstrm);
972*c83a76b0SSuyog Pawar         if(ps_vui->u1_max_bits_per_mincu_denom > 16)
973*c83a76b0SSuyog Pawar         {
974*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
975*c83a76b0SSuyog Pawar         }
976*c83a76b0SSuyog Pawar         UEV_PARSE("log2_max_mv_length_horizontal", ps_vui->u1_log2_max_mv_length_horizontal, ps_bitstrm);
977*c83a76b0SSuyog Pawar         if(ps_vui->u1_max_bits_per_mincu_denom > 16)
978*c83a76b0SSuyog Pawar         {
979*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
980*c83a76b0SSuyog Pawar         }
981*c83a76b0SSuyog Pawar         UEV_PARSE("log2_max_mv_length_vertical", ps_vui->u1_log2_max_mv_length_vertical, ps_bitstrm);
982*c83a76b0SSuyog Pawar         if(ps_vui->u1_max_bits_per_mincu_denom > 15)
983*c83a76b0SSuyog Pawar         {
984*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
985*c83a76b0SSuyog Pawar         }
986*c83a76b0SSuyog Pawar     }
987*c83a76b0SSuyog Pawar 
988*c83a76b0SSuyog Pawar     return ret;
989*c83a76b0SSuyog Pawar }
990*c83a76b0SSuyog Pawar 
991*c83a76b0SSuyog Pawar /**
992*c83a76b0SSuyog Pawar *******************************************************************************
993*c83a76b0SSuyog Pawar *
994*c83a76b0SSuyog Pawar * @brief
995*c83a76b0SSuyog Pawar *  Parses profile tier and level info for either general layer of sub_layer
996*c83a76b0SSuyog Pawar *
997*c83a76b0SSuyog Pawar * @par   Description
998*c83a76b0SSuyog Pawar *  Parses profile tier and level info for either general layer of sub_layer
999*c83a76b0SSuyog Pawar * as per section 7.3.3
1000*c83a76b0SSuyog Pawar *
1001*c83a76b0SSuyog Pawar * Since the same function is called for parsing general_profile and
1002*c83a76b0SSuyog Pawar * sub_layer_profile etc, variables do not specify whether the syntax is
1003*c83a76b0SSuyog Pawar * for general or sub_layer. Similarly trace functions also do not differentiate
1004*c83a76b0SSuyog Pawar *
1005*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
1006*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
1007*c83a76b0SSuyog Pawar *
1008*c83a76b0SSuyog Pawar * @param[out] ps_ptl
1009*c83a76b0SSuyog Pawar *  Pointer to profile, tier level structure
1010*c83a76b0SSuyog Pawar *
1011*c83a76b0SSuyog Pawar * @returns Error code from IHEVCD_ERROR_T
1012*c83a76b0SSuyog Pawar *
1013*c83a76b0SSuyog Pawar * @remarks
1014*c83a76b0SSuyog Pawar *
1015*c83a76b0SSuyog Pawar *******************************************************************************
1016*c83a76b0SSuyog Pawar */
1017*c83a76b0SSuyog Pawar 
ihevcd_parse_profile_tier_level_layer(bitstrm_t * ps_bitstrm,profile_tier_lvl_t * ps_ptl)1018*c83a76b0SSuyog Pawar static IHEVCD_ERROR_T ihevcd_parse_profile_tier_level_layer(bitstrm_t *ps_bitstrm,
1019*c83a76b0SSuyog Pawar                                                             profile_tier_lvl_t *ps_ptl)
1020*c83a76b0SSuyog Pawar {
1021*c83a76b0SSuyog Pawar     WORD32 value;
1022*c83a76b0SSuyog Pawar     WORD32 i;
1023*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
1024*c83a76b0SSuyog Pawar 
1025*c83a76b0SSuyog Pawar     BITS_PARSE("XXX_profile_space[]", value, ps_bitstrm, 2);
1026*c83a76b0SSuyog Pawar     ps_ptl->i1_profile_space = value;
1027*c83a76b0SSuyog Pawar 
1028*c83a76b0SSuyog Pawar     BITS_PARSE("XXX_tier_flag[]", value, ps_bitstrm, 1);
1029*c83a76b0SSuyog Pawar     ps_ptl->i1_tier_flag = value;
1030*c83a76b0SSuyog Pawar 
1031*c83a76b0SSuyog Pawar     BITS_PARSE("XXX_profile_idc[]", value, ps_bitstrm, 5);
1032*c83a76b0SSuyog Pawar     ps_ptl->i1_profile_idc = value;
1033*c83a76b0SSuyog Pawar 
1034*c83a76b0SSuyog Pawar     for(i = 0; i < MAX_PROFILE_COMPATBLTY; i++)
1035*c83a76b0SSuyog Pawar     {
1036*c83a76b0SSuyog Pawar         BITS_PARSE("XXX_profile_compatibility_flag[][j]", value, ps_bitstrm, 1);
1037*c83a76b0SSuyog Pawar         ps_ptl->ai1_profile_compatibility_flag[i] = value;
1038*c83a76b0SSuyog Pawar     }
1039*c83a76b0SSuyog Pawar 
1040*c83a76b0SSuyog Pawar     BITS_PARSE("general_progressive_source_flag", value, ps_bitstrm, 1);
1041*c83a76b0SSuyog Pawar     ps_ptl->i1_general_progressive_source_flag = value;
1042*c83a76b0SSuyog Pawar 
1043*c83a76b0SSuyog Pawar     BITS_PARSE("general_interlaced_source_flag", value, ps_bitstrm, 1);
1044*c83a76b0SSuyog Pawar     ps_ptl->i1_general_interlaced_source_flag = value;
1045*c83a76b0SSuyog Pawar 
1046*c83a76b0SSuyog Pawar     BITS_PARSE("general_non_packed_constraint_flag", value, ps_bitstrm, 1);
1047*c83a76b0SSuyog Pawar     ps_ptl->i1_general_non_packed_constraint_flag = value;
1048*c83a76b0SSuyog Pawar 
1049*c83a76b0SSuyog Pawar     BITS_PARSE("general_frame_only_constraint_flag", value, ps_bitstrm, 1);
1050*c83a76b0SSuyog Pawar     ps_ptl->i1_frame_only_constraint_flag = value;
1051*c83a76b0SSuyog Pawar 
1052*c83a76b0SSuyog Pawar     BITS_PARSE("XXX_reserved_zero_44bits[0..15]", value, ps_bitstrm, 16);
1053*c83a76b0SSuyog Pawar 
1054*c83a76b0SSuyog Pawar     BITS_PARSE("XXX_reserved_zero_44bits[16..31]", value, ps_bitstrm, 16);
1055*c83a76b0SSuyog Pawar 
1056*c83a76b0SSuyog Pawar     BITS_PARSE("XXX_reserved_zero_44bits[32..43]", value, ps_bitstrm, 12);
1057*c83a76b0SSuyog Pawar     return ret;
1058*c83a76b0SSuyog Pawar }
1059*c83a76b0SSuyog Pawar 
1060*c83a76b0SSuyog Pawar 
1061*c83a76b0SSuyog Pawar /**
1062*c83a76b0SSuyog Pawar *******************************************************************************
1063*c83a76b0SSuyog Pawar *
1064*c83a76b0SSuyog Pawar * @brief
1065*c83a76b0SSuyog Pawar *  Parses profile tier and level info
1066*c83a76b0SSuyog Pawar *
1067*c83a76b0SSuyog Pawar * @par   Description
1068*c83a76b0SSuyog Pawar *  Parses profile tier and level info as per section 7.3.3
1069*c83a76b0SSuyog Pawar * Called during VPS and SPS parsing
1070*c83a76b0SSuyog Pawar * calls ihevcd_parse_profile_tier_level() for general layer and each sub_layers
1071*c83a76b0SSuyog Pawar *
1072*c83a76b0SSuyog Pawar * @param[in] ps_bitstrm
1073*c83a76b0SSuyog Pawar *  Pointer to bitstream structure
1074*c83a76b0SSuyog Pawar *
1075*c83a76b0SSuyog Pawar * @param[out] ps_ptl
1076*c83a76b0SSuyog Pawar *  Pointer to structure that contains profile, tier level for each layers
1077*c83a76b0SSuyog Pawar *
1078*c83a76b0SSuyog Pawar * @param[in] profile_present
1079*c83a76b0SSuyog Pawar *  Flag to indicate if profile data is present
1080*c83a76b0SSuyog Pawar *
1081*c83a76b0SSuyog Pawar * @param[in] max_num_sub_layers
1082*c83a76b0SSuyog Pawar *  Number of sub layers present
1083*c83a76b0SSuyog Pawar *
1084*c83a76b0SSuyog Pawar * @returns Error code from IHEVCD_ERROR_T
1085*c83a76b0SSuyog Pawar *
1086*c83a76b0SSuyog Pawar * @remarks
1087*c83a76b0SSuyog Pawar *
1088*c83a76b0SSuyog Pawar *******************************************************************************
1089*c83a76b0SSuyog Pawar */
1090*c83a76b0SSuyog Pawar 
ihevcd_profile_tier_level(bitstrm_t * ps_bitstrm,profile_tier_lvl_info_t * ps_ptl,WORD32 profile_present,WORD32 max_num_sub_layers)1091*c83a76b0SSuyog Pawar static IHEVCD_ERROR_T ihevcd_profile_tier_level(bitstrm_t *ps_bitstrm,
1092*c83a76b0SSuyog Pawar                                                 profile_tier_lvl_info_t *ps_ptl,
1093*c83a76b0SSuyog Pawar                                                 WORD32 profile_present,
1094*c83a76b0SSuyog Pawar                                                 WORD32 max_num_sub_layers)
1095*c83a76b0SSuyog Pawar {
1096*c83a76b0SSuyog Pawar     WORD32 value;
1097*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
1098*c83a76b0SSuyog Pawar     WORD32 i;
1099*c83a76b0SSuyog Pawar 
1100*c83a76b0SSuyog Pawar     if(profile_present)
1101*c83a76b0SSuyog Pawar     {
1102*c83a76b0SSuyog Pawar         ret = ihevcd_parse_profile_tier_level_layer(ps_bitstrm, &ps_ptl->s_ptl_gen);
1103*c83a76b0SSuyog Pawar         if((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret)
1104*c83a76b0SSuyog Pawar         {
1105*c83a76b0SSuyog Pawar             return ret;
1106*c83a76b0SSuyog Pawar         }
1107*c83a76b0SSuyog Pawar     }
1108*c83a76b0SSuyog Pawar 
1109*c83a76b0SSuyog Pawar     BITS_PARSE("general_level_idc", value, ps_bitstrm, 8);
1110*c83a76b0SSuyog Pawar     ps_ptl->s_ptl_gen.u1_level_idc = value;
1111*c83a76b0SSuyog Pawar 
1112*c83a76b0SSuyog Pawar 
1113*c83a76b0SSuyog Pawar     for(i = 0; i < max_num_sub_layers; i++)
1114*c83a76b0SSuyog Pawar     {
1115*c83a76b0SSuyog Pawar         BITS_PARSE("sub_layer_profile_present_flag[i]", value, ps_bitstrm, 1);
1116*c83a76b0SSuyog Pawar         ps_ptl->ai1_sub_layer_profile_present_flag[i] = value;
1117*c83a76b0SSuyog Pawar 
1118*c83a76b0SSuyog Pawar         BITS_PARSE("sub_layer_level_present_flag[i]", value, ps_bitstrm, 1);
1119*c83a76b0SSuyog Pawar         ps_ptl->ai1_sub_layer_level_present_flag[i] = value;
1120*c83a76b0SSuyog Pawar     }
1121*c83a76b0SSuyog Pawar 
1122*c83a76b0SSuyog Pawar     if(max_num_sub_layers > 0)
1123*c83a76b0SSuyog Pawar     {
1124*c83a76b0SSuyog Pawar         for(i = max_num_sub_layers; i < 8; i++)
1125*c83a76b0SSuyog Pawar         {
1126*c83a76b0SSuyog Pawar             BITS_PARSE("reserved_zero_2bits", value, ps_bitstrm, 2);
1127*c83a76b0SSuyog Pawar         }
1128*c83a76b0SSuyog Pawar     }
1129*c83a76b0SSuyog Pawar 
1130*c83a76b0SSuyog Pawar     for(i = 0; i < max_num_sub_layers; i++)
1131*c83a76b0SSuyog Pawar     {
1132*c83a76b0SSuyog Pawar         if(ps_ptl->ai1_sub_layer_profile_present_flag[i])
1133*c83a76b0SSuyog Pawar         {
1134*c83a76b0SSuyog Pawar             ret = ihevcd_parse_profile_tier_level_layer(ps_bitstrm,
1135*c83a76b0SSuyog Pawar                                                         &ps_ptl->as_ptl_sub[i]);
1136*c83a76b0SSuyog Pawar         }
1137*c83a76b0SSuyog Pawar         if(ps_ptl->ai1_sub_layer_level_present_flag[i])
1138*c83a76b0SSuyog Pawar         {
1139*c83a76b0SSuyog Pawar             BITS_PARSE("sub_layer_level_idc[i]", value, ps_bitstrm, 8);
1140*c83a76b0SSuyog Pawar             ps_ptl->as_ptl_sub[i].u1_level_idc = value;
1141*c83a76b0SSuyog Pawar 
1142*c83a76b0SSuyog Pawar         }
1143*c83a76b0SSuyog Pawar     }
1144*c83a76b0SSuyog Pawar 
1145*c83a76b0SSuyog Pawar 
1146*c83a76b0SSuyog Pawar 
1147*c83a76b0SSuyog Pawar     return ret;
1148*c83a76b0SSuyog Pawar }
1149*c83a76b0SSuyog Pawar 
1150*c83a76b0SSuyog Pawar /**
1151*c83a76b0SSuyog Pawar *******************************************************************************
1152*c83a76b0SSuyog Pawar *
1153*c83a76b0SSuyog Pawar * @brief
1154*c83a76b0SSuyog Pawar *  Parses Scaling List Data syntax
1155*c83a76b0SSuyog Pawar *
1156*c83a76b0SSuyog Pawar * @par Description:
1157*c83a76b0SSuyog Pawar *  Parses Scaling List Data syntax as per Section: 7.3.6
1158*c83a76b0SSuyog Pawar *
1159*c83a76b0SSuyog Pawar * @param[in] ps_codec
1160*c83a76b0SSuyog Pawar *  Pointer to codec context
1161*c83a76b0SSuyog Pawar *
1162*c83a76b0SSuyog Pawar * @returns  Error code from IHEVCD_ERROR_T
1163*c83a76b0SSuyog Pawar *
1164*c83a76b0SSuyog Pawar * @remarks
1165*c83a76b0SSuyog Pawar *
1166*c83a76b0SSuyog Pawar *
1167*c83a76b0SSuyog Pawar *******************************************************************************
1168*c83a76b0SSuyog Pawar */
ihevcd_scaling_list_data(codec_t * ps_codec,WORD16 * pi2_scaling_mat)1169*c83a76b0SSuyog Pawar IHEVCD_ERROR_T  ihevcd_scaling_list_data(codec_t *ps_codec, WORD16 *pi2_scaling_mat)
1170*c83a76b0SSuyog Pawar {
1171*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
1172*c83a76b0SSuyog Pawar     WORD32 size_id;
1173*c83a76b0SSuyog Pawar     WORD32 matrix_id;
1174*c83a76b0SSuyog Pawar     WORD32 value, dc_value = 0;
1175*c83a76b0SSuyog Pawar     UWORD32 u4_value;
1176*c83a76b0SSuyog Pawar     WORD32 next_coef;
1177*c83a76b0SSuyog Pawar     WORD32 coef_num;
1178*c83a76b0SSuyog Pawar     WORD32 i, j, offset;
1179*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
1180*c83a76b0SSuyog Pawar     WORD16 *pi2_scaling_mat_offset;
1181*c83a76b0SSuyog Pawar     WORD32 scaling_mat_offset[] = { 0, 16, 32, 48, 64, 80, 96, 160, 224, 288, 352, 416, 480, 736, 992, 1248, 1504, 1760, 2016, 3040 };
1182*c83a76b0SSuyog Pawar     UWORD8 *scan_table;
1183*c83a76b0SSuyog Pawar 
1184*c83a76b0SSuyog Pawar     for(size_id = 0; size_id < 4; size_id++)
1185*c83a76b0SSuyog Pawar     {
1186*c83a76b0SSuyog Pawar         for(matrix_id = 0; matrix_id < ((size_id == 3) ? 2 : 6); matrix_id++)
1187*c83a76b0SSuyog Pawar         {
1188*c83a76b0SSuyog Pawar             WORD32 scaling_list_pred_mode_flag;
1189*c83a76b0SSuyog Pawar             WORD32 scaling_list_delta_coef;
1190*c83a76b0SSuyog Pawar             BITS_PARSE("scaling_list_pred_mode_flag", scaling_list_pred_mode_flag, ps_bitstrm, 1);
1191*c83a76b0SSuyog Pawar 
1192*c83a76b0SSuyog Pawar             offset = size_id * 6 + matrix_id;
1193*c83a76b0SSuyog Pawar             pi2_scaling_mat_offset = pi2_scaling_mat + scaling_mat_offset[offset];
1194*c83a76b0SSuyog Pawar 
1195*c83a76b0SSuyog Pawar             if(!scaling_list_pred_mode_flag)
1196*c83a76b0SSuyog Pawar             {
1197*c83a76b0SSuyog Pawar                 WORD32 num_elements;
1198*c83a76b0SSuyog Pawar                 UEV_PARSE("scaling_list_pred_matrix_id_delta", u4_value,
1199*c83a76b0SSuyog Pawar                           ps_bitstrm);
1200*c83a76b0SSuyog Pawar                 if(u4_value > matrix_id)
1201*c83a76b0SSuyog Pawar                 {
1202*c83a76b0SSuyog Pawar                     return IHEVCD_INVALID_PARAMETER;
1203*c83a76b0SSuyog Pawar                 }
1204*c83a76b0SSuyog Pawar 
1205*c83a76b0SSuyog Pawar                 num_elements = (1 << (4 + (size_id << 1)));
1206*c83a76b0SSuyog Pawar                 if(0 != u4_value)
1207*c83a76b0SSuyog Pawar                     memmove(pi2_scaling_mat_offset, pi2_scaling_mat_offset - u4_value * num_elements, num_elements * sizeof(WORD16));
1208*c83a76b0SSuyog Pawar             }
1209*c83a76b0SSuyog Pawar             else
1210*c83a76b0SSuyog Pawar             {
1211*c83a76b0SSuyog Pawar                 next_coef = 8;
1212*c83a76b0SSuyog Pawar                 coef_num = MIN(64, (1 << (4 + (size_id << 1))));
1213*c83a76b0SSuyog Pawar 
1214*c83a76b0SSuyog Pawar                 if(size_id > 1)
1215*c83a76b0SSuyog Pawar                 {
1216*c83a76b0SSuyog Pawar                     SEV_PARSE("scaling_list_dc_coef_minus8", value,
1217*c83a76b0SSuyog Pawar                               ps_bitstrm);
1218*c83a76b0SSuyog Pawar                     if(value < -7 || value > 247)
1219*c83a76b0SSuyog Pawar                     {
1220*c83a76b0SSuyog Pawar                         return IHEVCD_INVALID_PARAMETER;
1221*c83a76b0SSuyog Pawar                     }
1222*c83a76b0SSuyog Pawar                     next_coef = value + 8;
1223*c83a76b0SSuyog Pawar                     dc_value = next_coef;
1224*c83a76b0SSuyog Pawar                 }
1225*c83a76b0SSuyog Pawar                 if(size_id < 2)
1226*c83a76b0SSuyog Pawar                 {
1227*c83a76b0SSuyog Pawar                     scan_table = (UWORD8 *)gapv_ihevc_invscan[size_id + 1];
1228*c83a76b0SSuyog Pawar 
1229*c83a76b0SSuyog Pawar                     for(i = 0; i < coef_num; i++)
1230*c83a76b0SSuyog Pawar                     {
1231*c83a76b0SSuyog Pawar                         SEV_PARSE("scaling_list_delta_coef",
1232*c83a76b0SSuyog Pawar                                   scaling_list_delta_coef, ps_bitstrm);
1233*c83a76b0SSuyog Pawar                         if((scaling_list_delta_coef < -256) || (scaling_list_delta_coef > 255))
1234*c83a76b0SSuyog Pawar                         {
1235*c83a76b0SSuyog Pawar                             return IHEVCD_INVALID_PARAMETER;
1236*c83a76b0SSuyog Pawar                         }
1237*c83a76b0SSuyog Pawar                         next_coef = (next_coef + scaling_list_delta_coef + 256)
1238*c83a76b0SSuyog Pawar                                         % 256;
1239*c83a76b0SSuyog Pawar                         pi2_scaling_mat_offset[scan_table[i]] = next_coef;
1240*c83a76b0SSuyog Pawar                     }
1241*c83a76b0SSuyog Pawar                 }
1242*c83a76b0SSuyog Pawar                 else if(size_id == 2)
1243*c83a76b0SSuyog Pawar                 {
1244*c83a76b0SSuyog Pawar                     scan_table = (UWORD8 *)gapv_ihevc_invscan[2];
1245*c83a76b0SSuyog Pawar 
1246*c83a76b0SSuyog Pawar                     for(i = 0; i < coef_num; i++)
1247*c83a76b0SSuyog Pawar                     {
1248*c83a76b0SSuyog Pawar                         SEV_PARSE("scaling_list_delta_coef",
1249*c83a76b0SSuyog Pawar                                   scaling_list_delta_coef, ps_bitstrm);
1250*c83a76b0SSuyog Pawar                         if((scaling_list_delta_coef < -256) || (scaling_list_delta_coef > 255))
1251*c83a76b0SSuyog Pawar                         {
1252*c83a76b0SSuyog Pawar                             return IHEVCD_INVALID_PARAMETER;
1253*c83a76b0SSuyog Pawar                         }
1254*c83a76b0SSuyog Pawar                         next_coef = (next_coef + scaling_list_delta_coef + 256)
1255*c83a76b0SSuyog Pawar                                         % 256;
1256*c83a76b0SSuyog Pawar 
1257*c83a76b0SSuyog Pawar                         offset = scan_table[i];
1258*c83a76b0SSuyog Pawar                         offset = (offset >> 3) * 16 * 2 + (offset & 0x7) * 2;
1259*c83a76b0SSuyog Pawar                         pi2_scaling_mat_offset[offset] = next_coef;
1260*c83a76b0SSuyog Pawar                         pi2_scaling_mat_offset[offset + 1] = next_coef;
1261*c83a76b0SSuyog Pawar                         pi2_scaling_mat_offset[offset + 16] = next_coef;
1262*c83a76b0SSuyog Pawar                         pi2_scaling_mat_offset[offset + 16 + 1] = next_coef;
1263*c83a76b0SSuyog Pawar                     }
1264*c83a76b0SSuyog Pawar                     pi2_scaling_mat_offset[0] = dc_value;
1265*c83a76b0SSuyog Pawar                 }
1266*c83a76b0SSuyog Pawar                 else
1267*c83a76b0SSuyog Pawar                 {
1268*c83a76b0SSuyog Pawar                     scan_table = (UWORD8 *)gapv_ihevc_invscan[2];
1269*c83a76b0SSuyog Pawar 
1270*c83a76b0SSuyog Pawar                     for(i = 0; i < coef_num; i++)
1271*c83a76b0SSuyog Pawar                     {
1272*c83a76b0SSuyog Pawar                         SEV_PARSE("scaling_list_delta_coef",
1273*c83a76b0SSuyog Pawar                                   scaling_list_delta_coef, ps_bitstrm);
1274*c83a76b0SSuyog Pawar                         if((scaling_list_delta_coef < -256) || (scaling_list_delta_coef > 255))
1275*c83a76b0SSuyog Pawar                         {
1276*c83a76b0SSuyog Pawar                             return IHEVCD_INVALID_PARAMETER;
1277*c83a76b0SSuyog Pawar                         }
1278*c83a76b0SSuyog Pawar                         next_coef = (next_coef + scaling_list_delta_coef + 256)
1279*c83a76b0SSuyog Pawar                                         % 256;
1280*c83a76b0SSuyog Pawar 
1281*c83a76b0SSuyog Pawar                         offset = scan_table[i];
1282*c83a76b0SSuyog Pawar                         offset = (offset >> 3) * 32 * 4 + (offset & 0x7) * 4;
1283*c83a76b0SSuyog Pawar 
1284*c83a76b0SSuyog Pawar                         for(j = 0; j < 4; j++)
1285*c83a76b0SSuyog Pawar                         {
1286*c83a76b0SSuyog Pawar                             pi2_scaling_mat_offset[offset + j * 32] = next_coef;
1287*c83a76b0SSuyog Pawar                             pi2_scaling_mat_offset[offset + 1 + j * 32] = next_coef;
1288*c83a76b0SSuyog Pawar                             pi2_scaling_mat_offset[offset + 2 + j * 32] = next_coef;
1289*c83a76b0SSuyog Pawar                             pi2_scaling_mat_offset[offset + 3 + j * 32] = next_coef;
1290*c83a76b0SSuyog Pawar                         }
1291*c83a76b0SSuyog Pawar                         pi2_scaling_mat_offset[0] = dc_value;
1292*c83a76b0SSuyog Pawar                     }
1293*c83a76b0SSuyog Pawar                 }
1294*c83a76b0SSuyog Pawar             }
1295*c83a76b0SSuyog Pawar         }
1296*c83a76b0SSuyog Pawar     }
1297*c83a76b0SSuyog Pawar 
1298*c83a76b0SSuyog Pawar     return ret;
1299*c83a76b0SSuyog Pawar }
1300*c83a76b0SSuyog Pawar 
1301*c83a76b0SSuyog Pawar /**
1302*c83a76b0SSuyog Pawar *******************************************************************************
1303*c83a76b0SSuyog Pawar *
1304*c83a76b0SSuyog Pawar * @brief
1305*c83a76b0SSuyog Pawar *  Parses VPS (Video Parameter Set)
1306*c83a76b0SSuyog Pawar *
1307*c83a76b0SSuyog Pawar * @par Description:
1308*c83a76b0SSuyog Pawar *  Parse Video Parameter Set as per Section 7.3.2.1
1309*c83a76b0SSuyog Pawar * update vps structure corresponding to vps ID
1310*c83a76b0SSuyog Pawar * Till parsing VPS id, the elements are stored in local variables and are copied
1311*c83a76b0SSuyog Pawar * later
1312*c83a76b0SSuyog Pawar *
1313*c83a76b0SSuyog Pawar * @param[in] ps_codec
1314*c83a76b0SSuyog Pawar *  Pointer to codec context.
1315*c83a76b0SSuyog Pawar *
1316*c83a76b0SSuyog Pawar * @returns Error code from IHEVCD_ERROR_T
1317*c83a76b0SSuyog Pawar *
1318*c83a76b0SSuyog Pawar * @remarks
1319*c83a76b0SSuyog Pawar *
1320*c83a76b0SSuyog Pawar *
1321*c83a76b0SSuyog Pawar *******************************************************************************
1322*c83a76b0SSuyog Pawar */
ihevcd_parse_vps(codec_t * ps_codec)1323*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_vps(codec_t *ps_codec)
1324*c83a76b0SSuyog Pawar {
1325*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
1326*c83a76b0SSuyog Pawar     WORD32 i;
1327*c83a76b0SSuyog Pawar     UWORD32 value;
1328*c83a76b0SSuyog Pawar     WORD32 vps_id;
1329*c83a76b0SSuyog Pawar     vps_t *ps_vps;
1330*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
1331*c83a76b0SSuyog Pawar     BITS_PARSE("vps_video_parameter_set_id", value, ps_bitstrm, 4);
1332*c83a76b0SSuyog Pawar     vps_id = value;
1333*c83a76b0SSuyog Pawar 
1334*c83a76b0SSuyog Pawar     if(vps_id >= MAX_VPS_CNT)
1335*c83a76b0SSuyog Pawar     {
1336*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_error_code = IHEVCD_UNSUPPORTED_VPS_ID;
1337*c83a76b0SSuyog Pawar         return IHEVCD_UNSUPPORTED_VPS_ID;
1338*c83a76b0SSuyog Pawar     }
1339*c83a76b0SSuyog Pawar 
1340*c83a76b0SSuyog Pawar 
1341*c83a76b0SSuyog Pawar     ps_vps = (ps_codec->s_parse.ps_vps_base + vps_id);
1342*c83a76b0SSuyog Pawar 
1343*c83a76b0SSuyog Pawar     ps_vps->i1_vps_id = vps_id;
1344*c83a76b0SSuyog Pawar 
1345*c83a76b0SSuyog Pawar     BITS_PARSE("vps_reserved_three_2bits", value, ps_bitstrm, 2);
1346*c83a76b0SSuyog Pawar     ASSERT(value == 3);
1347*c83a76b0SSuyog Pawar 
1348*c83a76b0SSuyog Pawar     BITS_PARSE("vps_max_layers_minus1", value, ps_bitstrm, 6);
1349*c83a76b0SSuyog Pawar     //ps_vps->i1_vps_max_layers = value + 1;
1350*c83a76b0SSuyog Pawar 
1351*c83a76b0SSuyog Pawar 
1352*c83a76b0SSuyog Pawar 
1353*c83a76b0SSuyog Pawar     BITS_PARSE("vps_max_sub_layers_minus1", value, ps_bitstrm, 3);
1354*c83a76b0SSuyog Pawar     if(value > SPS_MAX_SUB_LAYERS - 1)
1355*c83a76b0SSuyog Pawar     {
1356*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1357*c83a76b0SSuyog Pawar     }
1358*c83a76b0SSuyog Pawar     ps_vps->i1_vps_max_sub_layers = value + 1;
1359*c83a76b0SSuyog Pawar 
1360*c83a76b0SSuyog Pawar     ASSERT(ps_vps->i1_vps_max_sub_layers < VPS_MAX_SUB_LAYERS);
1361*c83a76b0SSuyog Pawar 
1362*c83a76b0SSuyog Pawar     BITS_PARSE("vps_temporal_id_nesting_flag", value, ps_bitstrm, 1);
1363*c83a76b0SSuyog Pawar     ps_vps->i1_vps_temporal_id_nesting_flag = value;
1364*c83a76b0SSuyog Pawar 
1365*c83a76b0SSuyog Pawar     BITS_PARSE("vps_reserved_ffff_16bits", value, ps_bitstrm, 16);
1366*c83a76b0SSuyog Pawar     ASSERT(value == 0xFFFF);
1367*c83a76b0SSuyog Pawar     // profile_and_level( 1, vps_max_sub_layers_minus1 )
1368*c83a76b0SSuyog Pawar     ret = ihevcd_profile_tier_level(ps_bitstrm, &(ps_vps->s_ptl),
1369*c83a76b0SSuyog Pawar                                     1, (ps_vps->i1_vps_max_sub_layers - 1));
1370*c83a76b0SSuyog Pawar 
1371*c83a76b0SSuyog Pawar     BITS_PARSE("vps_sub_layer_ordering_info_present_flag", value, ps_bitstrm, 1);
1372*c83a76b0SSuyog Pawar     ps_vps->i1_sub_layer_ordering_info_present_flag = value;
1373*c83a76b0SSuyog Pawar     i = (ps_vps->i1_sub_layer_ordering_info_present_flag ?
1374*c83a76b0SSuyog Pawar                     0 : (ps_vps->i1_vps_max_sub_layers - 1));
1375*c83a76b0SSuyog Pawar     for(; i < ps_vps->i1_vps_max_sub_layers; i++)
1376*c83a76b0SSuyog Pawar     {
1377*c83a76b0SSuyog Pawar         UEV_PARSE("vps_max_dec_pic_buffering[i]", value, ps_bitstrm);
1378*c83a76b0SSuyog Pawar         if(value > MAX_DPB_SIZE)
1379*c83a76b0SSuyog Pawar         {
1380*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1381*c83a76b0SSuyog Pawar         }
1382*c83a76b0SSuyog Pawar         ps_vps->ai1_vps_max_dec_pic_buffering[i] = value;
1383*c83a76b0SSuyog Pawar 
1384*c83a76b0SSuyog Pawar         /* vps_num_reorder_pics (no max) used in print in order to match with HM */
1385*c83a76b0SSuyog Pawar         UEV_PARSE("vps_num_reorder_pics[i]", value, ps_bitstrm);
1386*c83a76b0SSuyog Pawar         if(value >= ps_vps->ai1_vps_max_dec_pic_buffering[i])
1387*c83a76b0SSuyog Pawar         {
1388*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1389*c83a76b0SSuyog Pawar         }
1390*c83a76b0SSuyog Pawar         ps_vps->ai1_vps_max_num_reorder_pics[i] = value;
1391*c83a76b0SSuyog Pawar 
1392*c83a76b0SSuyog Pawar         UEV_PARSE("vps_max_latency_increase[i]", value, ps_bitstrm);
1393*c83a76b0SSuyog Pawar         if(value > UINT_MAX - 2)
1394*c83a76b0SSuyog Pawar         {
1395*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1396*c83a76b0SSuyog Pawar         }
1397*c83a76b0SSuyog Pawar         ps_vps->ai1_vps_max_latency_increase[i] = value;
1398*c83a76b0SSuyog Pawar     }
1399*c83a76b0SSuyog Pawar 
1400*c83a76b0SSuyog Pawar 
1401*c83a76b0SSuyog Pawar 
1402*c83a76b0SSuyog Pawar     BITS_PARSE("vps_max_layer_id", value, ps_bitstrm, 6);
1403*c83a76b0SSuyog Pawar     //ps_vps->i1_vps_max_layer_id  = value;
1404*c83a76b0SSuyog Pawar 
1405*c83a76b0SSuyog Pawar     UEV_PARSE("vps_num_layer_sets_minus1", value, ps_bitstrm);
1406*c83a76b0SSuyog Pawar     if(value > 1023)
1407*c83a76b0SSuyog Pawar     {
1408*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1409*c83a76b0SSuyog Pawar     }
1410*c83a76b0SSuyog Pawar     //ps_vps->i1_vps_num_layer_sets  = value + 1;
1411*c83a76b0SSuyog Pawar 
1412*c83a76b0SSuyog Pawar     BITS_PARSE("vps_timing_info_present_flag", value, ps_bitstrm, 1);
1413*c83a76b0SSuyog Pawar     //ps_vps->i1_vps_timing_info_present_flag  = value;
1414*c83a76b0SSuyog Pawar 
1415*c83a76b0SSuyog Pawar 
1416*c83a76b0SSuyog Pawar 
1417*c83a76b0SSuyog Pawar     return ret;
1418*c83a76b0SSuyog Pawar }
1419*c83a76b0SSuyog Pawar 
1420*c83a76b0SSuyog Pawar /**
1421*c83a76b0SSuyog Pawar *******************************************************************************
1422*c83a76b0SSuyog Pawar *
1423*c83a76b0SSuyog Pawar * @brief
1424*c83a76b0SSuyog Pawar *  Parses SPS (Sequence Parameter Set)
1425*c83a76b0SSuyog Pawar * sequence_parameter_set_rbsp()
1426*c83a76b0SSuyog Pawar *
1427*c83a76b0SSuyog Pawar * @par Description:
1428*c83a76b0SSuyog Pawar *  Parse Sequence Parameter Set as per section  Section: 7.3.2.2
1429*c83a76b0SSuyog Pawar * The sps is written to a temporary buffer and copied later to the
1430*c83a76b0SSuyog Pawar * appropriate location
1431*c83a76b0SSuyog Pawar *
1432*c83a76b0SSuyog Pawar * @param[in] ps_codec
1433*c83a76b0SSuyog Pawar *  Pointer to codec context
1434*c83a76b0SSuyog Pawar *
1435*c83a76b0SSuyog Pawar * @returns Error code from IHEVCD_ERROR_T
1436*c83a76b0SSuyog Pawar *
1437*c83a76b0SSuyog Pawar * @remarks
1438*c83a76b0SSuyog Pawar *
1439*c83a76b0SSuyog Pawar *
1440*c83a76b0SSuyog Pawar *******************************************************************************
1441*c83a76b0SSuyog Pawar */
ihevcd_parse_sps(codec_t * ps_codec)1442*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec)
1443*c83a76b0SSuyog Pawar {
1444*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
1445*c83a76b0SSuyog Pawar     UWORD32 value;
1446*c83a76b0SSuyog Pawar 
1447*c83a76b0SSuyog Pawar     WORD32 i;
1448*c83a76b0SSuyog Pawar     WORD32 vps_id;
1449*c83a76b0SSuyog Pawar     WORD32 sps_max_sub_layers;
1450*c83a76b0SSuyog Pawar     WORD32 sps_id;
1451*c83a76b0SSuyog Pawar     WORD32 sps_temporal_id_nesting_flag;
1452*c83a76b0SSuyog Pawar     sps_t *ps_sps;
1453*c83a76b0SSuyog Pawar     profile_tier_lvl_info_t s_ptl;
1454*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
1455*c83a76b0SSuyog Pawar     WORD32 ctb_log2_size_y = 0;
1456*c83a76b0SSuyog Pawar 
1457*c83a76b0SSuyog Pawar 
1458*c83a76b0SSuyog Pawar     BITS_PARSE("video_parameter_set_id", value, ps_bitstrm, 4);
1459*c83a76b0SSuyog Pawar     if(value > MAX_VPS_CNT - 1)
1460*c83a76b0SSuyog Pawar     {
1461*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1462*c83a76b0SSuyog Pawar     }
1463*c83a76b0SSuyog Pawar     vps_id = value;
1464*c83a76b0SSuyog Pawar 
1465*c83a76b0SSuyog Pawar     BITS_PARSE("sps_max_sub_layers_minus1", value, ps_bitstrm, 3);
1466*c83a76b0SSuyog Pawar     if(value > SPS_MAX_SUB_LAYERS - 1)
1467*c83a76b0SSuyog Pawar     {
1468*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1469*c83a76b0SSuyog Pawar     }
1470*c83a76b0SSuyog Pawar     sps_max_sub_layers = value + 1;
1471*c83a76b0SSuyog Pawar 
1472*c83a76b0SSuyog Pawar     BITS_PARSE("sps_temporal_id_nesting_flag", value, ps_bitstrm, 1);
1473*c83a76b0SSuyog Pawar     sps_temporal_id_nesting_flag = value;
1474*c83a76b0SSuyog Pawar 
1475*c83a76b0SSuyog Pawar     //profile_and_level( 1, sps_max_sub_layers_minus1 )
1476*c83a76b0SSuyog Pawar     ret = ihevcd_profile_tier_level(ps_bitstrm, &(s_ptl), 1,
1477*c83a76b0SSuyog Pawar                                     (sps_max_sub_layers - 1));
1478*c83a76b0SSuyog Pawar 
1479*c83a76b0SSuyog Pawar     UEV_PARSE("seq_parameter_set_id", value, ps_bitstrm);
1480*c83a76b0SSuyog Pawar     sps_id = value;
1481*c83a76b0SSuyog Pawar     if((sps_id >= MAX_SPS_CNT) || (sps_id < 0))
1482*c83a76b0SSuyog Pawar     {
1483*c83a76b0SSuyog Pawar         if(ps_codec->i4_sps_done)
1484*c83a76b0SSuyog Pawar             return IHEVCD_UNSUPPORTED_SPS_ID;
1485*c83a76b0SSuyog Pawar         else
1486*c83a76b0SSuyog Pawar             sps_id = 0;
1487*c83a76b0SSuyog Pawar     }
1488*c83a76b0SSuyog Pawar 
1489*c83a76b0SSuyog Pawar 
1490*c83a76b0SSuyog Pawar     ps_sps = (ps_codec->s_parse.ps_sps_base + MAX_SPS_CNT - 1);
1491*c83a76b0SSuyog Pawar     /* Reset SPS to zero */
1492*c83a76b0SSuyog Pawar     {
1493*c83a76b0SSuyog Pawar         WORD16 *pi2_scaling_mat = ps_sps->pi2_scaling_mat;
1494*c83a76b0SSuyog Pawar         memset(ps_sps, 0, sizeof(sps_t));
1495*c83a76b0SSuyog Pawar         ps_sps->pi2_scaling_mat = pi2_scaling_mat;
1496*c83a76b0SSuyog Pawar     }
1497*c83a76b0SSuyog Pawar     ps_sps->i1_sps_id = sps_id;
1498*c83a76b0SSuyog Pawar     ps_sps->i1_vps_id = vps_id;
1499*c83a76b0SSuyog Pawar     ps_sps->i1_sps_max_sub_layers = sps_max_sub_layers;
1500*c83a76b0SSuyog Pawar     ps_sps->i1_sps_temporal_id_nesting_flag = sps_temporal_id_nesting_flag;
1501*c83a76b0SSuyog Pawar 
1502*c83a76b0SSuyog Pawar     memcpy(&ps_sps->s_ptl, &s_ptl, sizeof(profile_tier_lvl_info_t));
1503*c83a76b0SSuyog Pawar 
1504*c83a76b0SSuyog Pawar     UEV_PARSE("chroma_format_idc", value, ps_bitstrm);
1505*c83a76b0SSuyog Pawar     if(value > 3)
1506*c83a76b0SSuyog Pawar     {
1507*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1508*c83a76b0SSuyog Pawar     }
1509*c83a76b0SSuyog Pawar     ps_sps->i1_chroma_format_idc = value;
1510*c83a76b0SSuyog Pawar 
1511*c83a76b0SSuyog Pawar     if(ps_sps->i1_chroma_format_idc != CHROMA_FMT_IDC_YUV420)
1512*c83a76b0SSuyog Pawar     {
1513*c83a76b0SSuyog Pawar         ps_codec->s_parse.i4_error_code = IHEVCD_UNSUPPORTED_CHROMA_FMT_IDC;
1514*c83a76b0SSuyog Pawar         return (IHEVCD_ERROR_T)IHEVCD_UNSUPPORTED_CHROMA_FMT_IDC;
1515*c83a76b0SSuyog Pawar     }
1516*c83a76b0SSuyog Pawar 
1517*c83a76b0SSuyog Pawar     if(CHROMA_FMT_IDC_YUV444_PLANES == ps_sps->i1_chroma_format_idc)
1518*c83a76b0SSuyog Pawar     {
1519*c83a76b0SSuyog Pawar         BITS_PARSE("separate_colour_plane_flag", value, ps_bitstrm, 1);
1520*c83a76b0SSuyog Pawar         ps_sps->i1_separate_colour_plane_flag = value;
1521*c83a76b0SSuyog Pawar     }
1522*c83a76b0SSuyog Pawar     else
1523*c83a76b0SSuyog Pawar     {
1524*c83a76b0SSuyog Pawar         ps_sps->i1_separate_colour_plane_flag = 0;
1525*c83a76b0SSuyog Pawar     }
1526*c83a76b0SSuyog Pawar 
1527*c83a76b0SSuyog Pawar     UEV_PARSE("pic_width_in_luma_samples", value, ps_bitstrm);
1528*c83a76b0SSuyog Pawar     if(value > INT16_MAX)
1529*c83a76b0SSuyog Pawar     {
1530*c83a76b0SSuyog Pawar         return (IHEVCD_ERROR_T)IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
1531*c83a76b0SSuyog Pawar     }
1532*c83a76b0SSuyog Pawar     ps_sps->i2_pic_width_in_luma_samples = value;
1533*c83a76b0SSuyog Pawar 
1534*c83a76b0SSuyog Pawar     UEV_PARSE("pic_height_in_luma_samples", value, ps_bitstrm);
1535*c83a76b0SSuyog Pawar     if(value > INT16_MAX)
1536*c83a76b0SSuyog Pawar     {
1537*c83a76b0SSuyog Pawar         return (IHEVCD_ERROR_T)IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
1538*c83a76b0SSuyog Pawar     }
1539*c83a76b0SSuyog Pawar     ps_sps->i2_pic_height_in_luma_samples = value;
1540*c83a76b0SSuyog Pawar 
1541*c83a76b0SSuyog Pawar     if((0 >= ps_sps->i2_pic_width_in_luma_samples) || (0 >= ps_sps->i2_pic_height_in_luma_samples))
1542*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1543*c83a76b0SSuyog Pawar 
1544*c83a76b0SSuyog Pawar     BITS_PARSE("pic_cropping_flag", value, ps_bitstrm, 1);
1545*c83a76b0SSuyog Pawar     ps_sps->i1_pic_cropping_flag = value;
1546*c83a76b0SSuyog Pawar 
1547*c83a76b0SSuyog Pawar     if(ps_sps->i1_pic_cropping_flag)
1548*c83a76b0SSuyog Pawar     {
1549*c83a76b0SSuyog Pawar 
1550*c83a76b0SSuyog Pawar         UEV_PARSE("pic_crop_left_offset", value, ps_bitstrm);
1551*c83a76b0SSuyog Pawar         if (value >= ps_sps->i2_pic_width_in_luma_samples)
1552*c83a76b0SSuyog Pawar         {
1553*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1554*c83a76b0SSuyog Pawar         }
1555*c83a76b0SSuyog Pawar         ps_sps->i2_pic_crop_left_offset = value;
1556*c83a76b0SSuyog Pawar 
1557*c83a76b0SSuyog Pawar         UEV_PARSE("pic_crop_right_offset", value, ps_bitstrm);
1558*c83a76b0SSuyog Pawar         if (value >= ps_sps->i2_pic_width_in_luma_samples)
1559*c83a76b0SSuyog Pawar         {
1560*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1561*c83a76b0SSuyog Pawar         }
1562*c83a76b0SSuyog Pawar         ps_sps->i2_pic_crop_right_offset = value;
1563*c83a76b0SSuyog Pawar 
1564*c83a76b0SSuyog Pawar         UEV_PARSE("pic_crop_top_offset", value, ps_bitstrm);
1565*c83a76b0SSuyog Pawar         if (value >= ps_sps->i2_pic_height_in_luma_samples)
1566*c83a76b0SSuyog Pawar         {
1567*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1568*c83a76b0SSuyog Pawar         }
1569*c83a76b0SSuyog Pawar         ps_sps->i2_pic_crop_top_offset = value;
1570*c83a76b0SSuyog Pawar 
1571*c83a76b0SSuyog Pawar         UEV_PARSE("pic_crop_bottom_offset", value, ps_bitstrm);
1572*c83a76b0SSuyog Pawar         if (value >= ps_sps->i2_pic_height_in_luma_samples)
1573*c83a76b0SSuyog Pawar         {
1574*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1575*c83a76b0SSuyog Pawar         }
1576*c83a76b0SSuyog Pawar         ps_sps->i2_pic_crop_bottom_offset = value;
1577*c83a76b0SSuyog Pawar     }
1578*c83a76b0SSuyog Pawar     else
1579*c83a76b0SSuyog Pawar     {
1580*c83a76b0SSuyog Pawar         ps_sps->i2_pic_crop_left_offset = 0;
1581*c83a76b0SSuyog Pawar         ps_sps->i2_pic_crop_right_offset = 0;
1582*c83a76b0SSuyog Pawar         ps_sps->i2_pic_crop_top_offset = 0;
1583*c83a76b0SSuyog Pawar         ps_sps->i2_pic_crop_bottom_offset = 0;
1584*c83a76b0SSuyog Pawar     }
1585*c83a76b0SSuyog Pawar 
1586*c83a76b0SSuyog Pawar 
1587*c83a76b0SSuyog Pawar     UEV_PARSE("bit_depth_luma_minus8", value, ps_bitstrm);
1588*c83a76b0SSuyog Pawar     if(0 != value)
1589*c83a76b0SSuyog Pawar         return IHEVCD_UNSUPPORTED_BIT_DEPTH;
1590*c83a76b0SSuyog Pawar 
1591*c83a76b0SSuyog Pawar     UEV_PARSE("bit_depth_chroma_minus8", value, ps_bitstrm);
1592*c83a76b0SSuyog Pawar     if(0 != value)
1593*c83a76b0SSuyog Pawar         return IHEVCD_UNSUPPORTED_BIT_DEPTH;
1594*c83a76b0SSuyog Pawar 
1595*c83a76b0SSuyog Pawar     UEV_PARSE("log2_max_pic_order_cnt_lsb_minus4", value, ps_bitstrm);
1596*c83a76b0SSuyog Pawar     if(value > 12)
1597*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1598*c83a76b0SSuyog Pawar     ps_sps->i1_log2_max_pic_order_cnt_lsb = value + 4;
1599*c83a76b0SSuyog Pawar 
1600*c83a76b0SSuyog Pawar     BITS_PARSE("sps_sub_layer_ordering_info_present_flag", value, ps_bitstrm, 1);
1601*c83a76b0SSuyog Pawar 
1602*c83a76b0SSuyog Pawar     ps_sps->i1_sps_sub_layer_ordering_info_present_flag = value;
1603*c83a76b0SSuyog Pawar 
1604*c83a76b0SSuyog Pawar 
1605*c83a76b0SSuyog Pawar     i = (ps_sps->i1_sps_sub_layer_ordering_info_present_flag ? 0 : (ps_sps->i1_sps_max_sub_layers - 1));
1606*c83a76b0SSuyog Pawar     for(; i < ps_sps->i1_sps_max_sub_layers; i++)
1607*c83a76b0SSuyog Pawar     {
1608*c83a76b0SSuyog Pawar         UEV_PARSE("max_dec_pic_buffering", value, ps_bitstrm);
1609*c83a76b0SSuyog Pawar         if(value > (MAX_DPB_SIZE - 1))
1610*c83a76b0SSuyog Pawar         {
1611*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1612*c83a76b0SSuyog Pawar         }
1613*c83a76b0SSuyog Pawar         ps_sps->ai1_sps_max_dec_pic_buffering[i] = value + 1;
1614*c83a76b0SSuyog Pawar 
1615*c83a76b0SSuyog Pawar         UEV_PARSE("num_reorder_pics", value, ps_bitstrm);
1616*c83a76b0SSuyog Pawar         if(value >= ps_sps->ai1_sps_max_dec_pic_buffering[i])
1617*c83a76b0SSuyog Pawar         {
1618*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1619*c83a76b0SSuyog Pawar         }
1620*c83a76b0SSuyog Pawar         ps_sps->ai1_sps_max_num_reorder_pics[i] = value;
1621*c83a76b0SSuyog Pawar 
1622*c83a76b0SSuyog Pawar         UEV_PARSE("max_latency_increase", value, ps_bitstrm);
1623*c83a76b0SSuyog Pawar         if(value > UINT_MAX - 2)
1624*c83a76b0SSuyog Pawar         {
1625*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1626*c83a76b0SSuyog Pawar         }
1627*c83a76b0SSuyog Pawar         ps_sps->ai1_sps_max_latency_increase[i] = value;
1628*c83a76b0SSuyog Pawar     }
1629*c83a76b0SSuyog Pawar 
1630*c83a76b0SSuyog Pawar     /* Check if sps_max_dec_pic_buffering or sps_max_num_reorder_pics
1631*c83a76b0SSuyog Pawar        has changed */
1632*c83a76b0SSuyog Pawar     if(0 != ps_codec->u4_allocate_dynamic_done)
1633*c83a76b0SSuyog Pawar     {
1634*c83a76b0SSuyog Pawar         sps_t *ps_sps_old = ps_codec->s_parse.ps_sps;
1635*c83a76b0SSuyog Pawar         if(ps_sps_old->ai1_sps_max_dec_pic_buffering[ps_sps_old->i1_sps_max_sub_layers - 1] !=
1636*c83a76b0SSuyog Pawar                     ps_sps->ai1_sps_max_dec_pic_buffering[ps_sps->i1_sps_max_sub_layers - 1])
1637*c83a76b0SSuyog Pawar         {
1638*c83a76b0SSuyog Pawar             if(0 == ps_codec->i4_first_pic_done)
1639*c83a76b0SSuyog Pawar             {
1640*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
1641*c83a76b0SSuyog Pawar             }
1642*c83a76b0SSuyog Pawar             ps_codec->i4_reset_flag = 1;
1643*c83a76b0SSuyog Pawar             return (IHEVCD_ERROR_T)IVD_RES_CHANGED;
1644*c83a76b0SSuyog Pawar         }
1645*c83a76b0SSuyog Pawar 
1646*c83a76b0SSuyog Pawar         if(ps_sps_old->ai1_sps_max_num_reorder_pics[ps_sps_old->i1_sps_max_sub_layers - 1] !=
1647*c83a76b0SSuyog Pawar                     ps_sps->ai1_sps_max_num_reorder_pics[ps_sps->i1_sps_max_sub_layers - 1])
1648*c83a76b0SSuyog Pawar         {
1649*c83a76b0SSuyog Pawar             if(0 == ps_codec->i4_first_pic_done)
1650*c83a76b0SSuyog Pawar             {
1651*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
1652*c83a76b0SSuyog Pawar             }
1653*c83a76b0SSuyog Pawar             ps_codec->i4_reset_flag = 1;
1654*c83a76b0SSuyog Pawar             return (IHEVCD_ERROR_T)IVD_RES_CHANGED;
1655*c83a76b0SSuyog Pawar         }
1656*c83a76b0SSuyog Pawar     }
1657*c83a76b0SSuyog Pawar 
1658*c83a76b0SSuyog Pawar     UEV_PARSE("log2_min_coding_block_size_minus3", value, ps_bitstrm);
1659*c83a76b0SSuyog Pawar     if(value > (LOG2_MAX_CU_SIZE - 3))
1660*c83a76b0SSuyog Pawar     {
1661*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1662*c83a76b0SSuyog Pawar     }
1663*c83a76b0SSuyog Pawar     ps_sps->i1_log2_min_coding_block_size = value + 3;
1664*c83a76b0SSuyog Pawar     if((ps_sps->i2_pic_width_in_luma_samples % (1 << ps_sps->i1_log2_min_coding_block_size) != 0) ||
1665*c83a76b0SSuyog Pawar                     (ps_sps->i2_pic_height_in_luma_samples % (1 << ps_sps->i1_log2_min_coding_block_size) != 0))
1666*c83a76b0SSuyog Pawar     {
1667*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1668*c83a76b0SSuyog Pawar     }
1669*c83a76b0SSuyog Pawar 
1670*c83a76b0SSuyog Pawar     UEV_PARSE("log2_diff_max_min_coding_block_size", value, ps_bitstrm);
1671*c83a76b0SSuyog Pawar     if(value > (LOG2_MAX_CU_SIZE - ps_sps->i1_log2_min_coding_block_size))
1672*c83a76b0SSuyog Pawar     {
1673*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1674*c83a76b0SSuyog Pawar     }
1675*c83a76b0SSuyog Pawar     ps_sps->i1_log2_diff_max_min_coding_block_size = value;
1676*c83a76b0SSuyog Pawar 
1677*c83a76b0SSuyog Pawar     ctb_log2_size_y = ps_sps->i1_log2_min_coding_block_size + ps_sps->i1_log2_diff_max_min_coding_block_size;
1678*c83a76b0SSuyog Pawar 
1679*c83a76b0SSuyog Pawar     if((ctb_log2_size_y < LOG2_MIN_CTB_SIZE) || (ctb_log2_size_y > LOG2_MAX_CTB_SIZE))
1680*c83a76b0SSuyog Pawar     {
1681*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1682*c83a76b0SSuyog Pawar     }
1683*c83a76b0SSuyog Pawar     /* Check if CTB size is different in case of multiple SPS with same ID */
1684*c83a76b0SSuyog Pawar     {
1685*c83a76b0SSuyog Pawar         sps_t *ps_sps_old = (ps_codec->s_parse.ps_sps_base + sps_id);
1686*c83a76b0SSuyog Pawar         if(ps_sps_old->i1_sps_valid && ps_sps_old->i1_log2_ctb_size != ctb_log2_size_y)
1687*c83a76b0SSuyog Pawar         {
1688*c83a76b0SSuyog Pawar             if(0 == ps_codec->i4_first_pic_done)
1689*c83a76b0SSuyog Pawar             {
1690*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
1691*c83a76b0SSuyog Pawar             }
1692*c83a76b0SSuyog Pawar             ps_codec->i4_reset_flag = 1;
1693*c83a76b0SSuyog Pawar             return (IHEVCD_ERROR_T)IVD_RES_CHANGED;
1694*c83a76b0SSuyog Pawar         }
1695*c83a76b0SSuyog Pawar     }
1696*c83a76b0SSuyog Pawar     ps_sps->i1_log2_ctb_size = ctb_log2_size_y;
1697*c83a76b0SSuyog Pawar 
1698*c83a76b0SSuyog Pawar     UEV_PARSE("log2_min_transform_block_size_minus2", value, ps_bitstrm);
1699*c83a76b0SSuyog Pawar     if(value > (LOG2_MAX_TU_SIZE - 2))
1700*c83a76b0SSuyog Pawar     {
1701*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1702*c83a76b0SSuyog Pawar     }
1703*c83a76b0SSuyog Pawar     ps_sps->i1_log2_min_transform_block_size = value + 2;
1704*c83a76b0SSuyog Pawar     if(ps_sps->i1_log2_min_transform_block_size >= ps_sps->i1_log2_min_coding_block_size)
1705*c83a76b0SSuyog Pawar     {
1706*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1707*c83a76b0SSuyog Pawar     }
1708*c83a76b0SSuyog Pawar 
1709*c83a76b0SSuyog Pawar     UEV_PARSE("log2_diff_max_min_transform_block_size", value, ps_bitstrm);
1710*c83a76b0SSuyog Pawar     if(value > (LOG2_MAX_TU_SIZE - ps_sps->i1_log2_min_transform_block_size))
1711*c83a76b0SSuyog Pawar     {
1712*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1713*c83a76b0SSuyog Pawar     }
1714*c83a76b0SSuyog Pawar     ps_sps->i1_log2_diff_max_min_transform_block_size = value;
1715*c83a76b0SSuyog Pawar 
1716*c83a76b0SSuyog Pawar     ps_sps->i1_log2_max_transform_block_size = ps_sps->i1_log2_min_transform_block_size +
1717*c83a76b0SSuyog Pawar                     ps_sps->i1_log2_diff_max_min_transform_block_size;
1718*c83a76b0SSuyog Pawar 
1719*c83a76b0SSuyog Pawar     if(ps_sps->i1_log2_max_transform_block_size > ps_sps->i1_log2_ctb_size)
1720*c83a76b0SSuyog Pawar     {
1721*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1722*c83a76b0SSuyog Pawar     }
1723*c83a76b0SSuyog Pawar 
1724*c83a76b0SSuyog Pawar     ps_sps->i1_log2_min_pcm_coding_block_size = 0;
1725*c83a76b0SSuyog Pawar     ps_sps->i1_log2_diff_max_min_pcm_coding_block_size = 0;
1726*c83a76b0SSuyog Pawar 
1727*c83a76b0SSuyog Pawar     UEV_PARSE("max_transform_hierarchy_depth_inter", value, ps_bitstrm);
1728*c83a76b0SSuyog Pawar     if(value > (ps_sps->i1_log2_ctb_size - ps_sps->i1_log2_min_transform_block_size))
1729*c83a76b0SSuyog Pawar     {
1730*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1731*c83a76b0SSuyog Pawar     }
1732*c83a76b0SSuyog Pawar     ps_sps->i1_max_transform_hierarchy_depth_inter = value;
1733*c83a76b0SSuyog Pawar 
1734*c83a76b0SSuyog Pawar     UEV_PARSE("max_transform_hierarchy_depth_intra", value, ps_bitstrm);
1735*c83a76b0SSuyog Pawar     if(value > (ps_sps->i1_log2_ctb_size - ps_sps->i1_log2_min_transform_block_size))
1736*c83a76b0SSuyog Pawar     {
1737*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1738*c83a76b0SSuyog Pawar     }
1739*c83a76b0SSuyog Pawar     ps_sps->i1_max_transform_hierarchy_depth_intra = value;
1740*c83a76b0SSuyog Pawar 
1741*c83a76b0SSuyog Pawar     /* String has a d (enabled) in order to match with HM */
1742*c83a76b0SSuyog Pawar     BITS_PARSE("scaling_list_enabled_flag", value, ps_bitstrm, 1);
1743*c83a76b0SSuyog Pawar     ps_sps->i1_scaling_list_enable_flag = value;
1744*c83a76b0SSuyog Pawar 
1745*c83a76b0SSuyog Pawar     if(ps_sps->i1_scaling_list_enable_flag)
1746*c83a76b0SSuyog Pawar     {
1747*c83a76b0SSuyog Pawar         COPY_DEFAULT_SCALING_LIST(ps_sps->pi2_scaling_mat);
1748*c83a76b0SSuyog Pawar         BITS_PARSE("sps_scaling_list_data_present_flag", value, ps_bitstrm, 1);
1749*c83a76b0SSuyog Pawar         ps_sps->i1_sps_scaling_list_data_present_flag = value;
1750*c83a76b0SSuyog Pawar 
1751*c83a76b0SSuyog Pawar         if(ps_sps->i1_sps_scaling_list_data_present_flag)
1752*c83a76b0SSuyog Pawar             ihevcd_scaling_list_data(ps_codec, ps_sps->pi2_scaling_mat);
1753*c83a76b0SSuyog Pawar     }
1754*c83a76b0SSuyog Pawar     else
1755*c83a76b0SSuyog Pawar     {
1756*c83a76b0SSuyog Pawar         COPY_FLAT_SCALING_LIST(ps_sps->pi2_scaling_mat);
1757*c83a76b0SSuyog Pawar     }
1758*c83a76b0SSuyog Pawar     /* String is asymmetric_motion_partitions_enabled_flag instead of amp_enabled_flag in order to match with HM */
1759*c83a76b0SSuyog Pawar     BITS_PARSE("asymmetric_motion_partitions_enabled_flag", value, ps_bitstrm, 1);
1760*c83a76b0SSuyog Pawar     ps_sps->i1_amp_enabled_flag = value;
1761*c83a76b0SSuyog Pawar 
1762*c83a76b0SSuyog Pawar     BITS_PARSE("sample_adaptive_offset_enabled_flag", value, ps_bitstrm, 1);
1763*c83a76b0SSuyog Pawar     ps_sps->i1_sample_adaptive_offset_enabled_flag = value;
1764*c83a76b0SSuyog Pawar 
1765*c83a76b0SSuyog Pawar     BITS_PARSE("pcm_enabled_flag", value, ps_bitstrm, 1);
1766*c83a76b0SSuyog Pawar     ps_sps->i1_pcm_enabled_flag = value;
1767*c83a76b0SSuyog Pawar 
1768*c83a76b0SSuyog Pawar     if(ps_sps->i1_pcm_enabled_flag)
1769*c83a76b0SSuyog Pawar     {
1770*c83a76b0SSuyog Pawar         BITS_PARSE("pcm_sample_bit_depth_luma", value, ps_bitstrm, 4);
1771*c83a76b0SSuyog Pawar         ps_sps->i1_pcm_sample_bit_depth_luma = value + 1;
1772*c83a76b0SSuyog Pawar 
1773*c83a76b0SSuyog Pawar         BITS_PARSE("pcm_sample_bit_depth_chroma", value, ps_bitstrm, 4);
1774*c83a76b0SSuyog Pawar         ps_sps->i1_pcm_sample_bit_depth_chroma = value + 1;
1775*c83a76b0SSuyog Pawar 
1776*c83a76b0SSuyog Pawar         UEV_PARSE("log2_min_pcm_coding_block_size_minus3", value, ps_bitstrm);
1777*c83a76b0SSuyog Pawar         if(value < (ps_sps->i1_log2_min_coding_block_size - 3) || value > (MIN(ctb_log2_size_y, 5) - 3))
1778*c83a76b0SSuyog Pawar         {
1779*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1780*c83a76b0SSuyog Pawar         }
1781*c83a76b0SSuyog Pawar         ps_sps->i1_log2_min_pcm_coding_block_size = value + 3;
1782*c83a76b0SSuyog Pawar 
1783*c83a76b0SSuyog Pawar         UEV_PARSE("log2_diff_max_min_pcm_coding_block_size", value, ps_bitstrm);
1784*c83a76b0SSuyog Pawar         if(value > MIN(ctb_log2_size_y, 5) - ps_sps->i1_log2_min_pcm_coding_block_size)
1785*c83a76b0SSuyog Pawar         {
1786*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1787*c83a76b0SSuyog Pawar         }
1788*c83a76b0SSuyog Pawar         ps_sps->i1_log2_diff_max_min_pcm_coding_block_size = value;
1789*c83a76b0SSuyog Pawar         BITS_PARSE("pcm_loop_filter_disable_flag", value, ps_bitstrm, 1);
1790*c83a76b0SSuyog Pawar         ps_sps->i1_pcm_loop_filter_disable_flag = value;
1791*c83a76b0SSuyog Pawar 
1792*c83a76b0SSuyog Pawar     }
1793*c83a76b0SSuyog Pawar     UEV_PARSE("num_short_term_ref_pic_sets", value, ps_bitstrm);
1794*c83a76b0SSuyog Pawar     if(value > MAX_STREF_PICS_SPS)
1795*c83a76b0SSuyog Pawar     {
1796*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1797*c83a76b0SSuyog Pawar     }
1798*c83a76b0SSuyog Pawar     ps_sps->i1_num_short_term_ref_pic_sets = value;
1799*c83a76b0SSuyog Pawar 
1800*c83a76b0SSuyog Pawar     for(i = 0; i < ps_sps->i1_num_short_term_ref_pic_sets; i++)
1801*c83a76b0SSuyog Pawar     {
1802*c83a76b0SSuyog Pawar         ret = ihevcd_short_term_ref_pic_set(ps_bitstrm, &ps_sps->as_stref_picset[0], ps_sps->i1_num_short_term_ref_pic_sets, i, &ps_sps->as_stref_picset[i]);
1803*c83a76b0SSuyog Pawar         if (ret != IHEVCD_SUCCESS)
1804*c83a76b0SSuyog Pawar         {
1805*c83a76b0SSuyog Pawar             return ret;
1806*c83a76b0SSuyog Pawar         }
1807*c83a76b0SSuyog Pawar     }
1808*c83a76b0SSuyog Pawar 
1809*c83a76b0SSuyog Pawar     BITS_PARSE("long_term_ref_pics_present_flag", value, ps_bitstrm, 1);
1810*c83a76b0SSuyog Pawar     ps_sps->i1_long_term_ref_pics_present_flag = value;
1811*c83a76b0SSuyog Pawar 
1812*c83a76b0SSuyog Pawar     if(ps_sps->i1_long_term_ref_pics_present_flag)
1813*c83a76b0SSuyog Pawar     {
1814*c83a76b0SSuyog Pawar         UEV_PARSE("num_long_term_ref_pics_sps", value, ps_bitstrm);
1815*c83a76b0SSuyog Pawar         if(value > MAX_LTREF_PICS_SPS)
1816*c83a76b0SSuyog Pawar         {
1817*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1818*c83a76b0SSuyog Pawar         }
1819*c83a76b0SSuyog Pawar         ps_sps->i1_num_long_term_ref_pics_sps = value;
1820*c83a76b0SSuyog Pawar 
1821*c83a76b0SSuyog Pawar         for(i = 0; i < ps_sps->i1_num_long_term_ref_pics_sps; i++)
1822*c83a76b0SSuyog Pawar         {
1823*c83a76b0SSuyog Pawar             BITS_PARSE("lt_ref_pic_poc_lsb_sps[ i ]", value, ps_bitstrm, ps_sps->i1_log2_max_pic_order_cnt_lsb);
1824*c83a76b0SSuyog Pawar             ps_sps->au2_lt_ref_pic_poc_lsb_sps[i] = value;
1825*c83a76b0SSuyog Pawar 
1826*c83a76b0SSuyog Pawar             BITS_PARSE("used_by_curr_pic_lt_sps_flag[ i ]", value, ps_bitstrm, 1);
1827*c83a76b0SSuyog Pawar             ps_sps->ai1_used_by_curr_pic_lt_sps_flag[i] = value;
1828*c83a76b0SSuyog Pawar         }
1829*c83a76b0SSuyog Pawar     }
1830*c83a76b0SSuyog Pawar 
1831*c83a76b0SSuyog Pawar     BITS_PARSE("sps_temporal_mvp_enable_flag", value, ps_bitstrm, 1);
1832*c83a76b0SSuyog Pawar     ps_sps->i1_sps_temporal_mvp_enable_flag = value;
1833*c83a76b0SSuyog Pawar 
1834*c83a76b0SSuyog Pawar     /* Print matches HM 8-2 */
1835*c83a76b0SSuyog Pawar     BITS_PARSE("sps_strong_intra_smoothing_enable_flag", value, ps_bitstrm, 1);
1836*c83a76b0SSuyog Pawar     ps_sps->i1_strong_intra_smoothing_enable_flag = value;
1837*c83a76b0SSuyog Pawar 
1838*c83a76b0SSuyog Pawar     BITS_PARSE("vui_parameters_present_flag", value, ps_bitstrm, 1);
1839*c83a76b0SSuyog Pawar     ps_sps->i1_vui_parameters_present_flag = value;
1840*c83a76b0SSuyog Pawar 
1841*c83a76b0SSuyog Pawar     if(ps_sps->i1_vui_parameters_present_flag)
1842*c83a76b0SSuyog Pawar     {
1843*c83a76b0SSuyog Pawar         ret = ihevcd_parse_vui_parameters(ps_bitstrm,
1844*c83a76b0SSuyog Pawar                                           &ps_sps->s_vui_parameters,
1845*c83a76b0SSuyog Pawar                                           ps_sps->i1_sps_max_sub_layers - 1);
1846*c83a76b0SSuyog Pawar         RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
1847*c83a76b0SSuyog Pawar 
1848*c83a76b0SSuyog Pawar         if (0 != ps_codec->u4_allocate_dynamic_done) {
1849*c83a76b0SSuyog Pawar 
1850*c83a76b0SSuyog Pawar             vui_t *ps_vui = &ps_sps->s_vui_parameters;
1851*c83a76b0SSuyog Pawar             sps_t *ps_sps_old = ps_codec->s_parse.ps_sps;
1852*c83a76b0SSuyog Pawar             vui_t *ps_vui_old = &ps_sps_old->s_vui_parameters;
1853*c83a76b0SSuyog Pawar 
1854*c83a76b0SSuyog Pawar             if (ps_vui->u1_video_full_range_flag != ps_vui_old->u1_video_full_range_flag ||
1855*c83a76b0SSuyog Pawar                 ps_vui->u1_colour_primaries != ps_vui_old->u1_colour_primaries ||
1856*c83a76b0SSuyog Pawar                 ps_vui->u1_transfer_characteristics != ps_vui_old->u1_transfer_characteristics ||
1857*c83a76b0SSuyog Pawar                 ps_vui->u1_matrix_coefficients != ps_vui_old->u1_matrix_coefficients) {
1858*c83a76b0SSuyog Pawar                 ps_codec->i4_reset_flag = 1;
1859*c83a76b0SSuyog Pawar                 return (IHEVCD_ERROR_T)IVD_RES_CHANGED;
1860*c83a76b0SSuyog Pawar             }
1861*c83a76b0SSuyog Pawar         }
1862*c83a76b0SSuyog Pawar     }
1863*c83a76b0SSuyog Pawar 
1864*c83a76b0SSuyog Pawar     BITS_PARSE("sps_extension_flag", value, ps_bitstrm, 1);
1865*c83a76b0SSuyog Pawar 
1866*c83a76b0SSuyog Pawar     if((UWORD8 *)ps_bitstrm->pu4_buf > ps_bitstrm->pu1_buf_max)
1867*c83a76b0SSuyog Pawar     {
1868*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
1869*c83a76b0SSuyog Pawar     }
1870*c83a76b0SSuyog Pawar 
1871*c83a76b0SSuyog Pawar     {
1872*c83a76b0SSuyog Pawar         WORD32 numerator;
1873*c83a76b0SSuyog Pawar         WORD32 ceil_offset;
1874*c83a76b0SSuyog Pawar 
1875*c83a76b0SSuyog Pawar         ceil_offset = (1 << ps_sps->i1_log2_ctb_size) - 1;
1876*c83a76b0SSuyog Pawar         numerator = ps_sps->i2_pic_width_in_luma_samples;
1877*c83a76b0SSuyog Pawar 
1878*c83a76b0SSuyog Pawar         ps_sps->i2_pic_wd_in_ctb = ((numerator + ceil_offset) /
1879*c83a76b0SSuyog Pawar                         (1 << ps_sps->i1_log2_ctb_size));
1880*c83a76b0SSuyog Pawar 
1881*c83a76b0SSuyog Pawar         numerator = ps_sps->i2_pic_height_in_luma_samples;
1882*c83a76b0SSuyog Pawar         ps_sps->i2_pic_ht_in_ctb = ((numerator + ceil_offset) /
1883*c83a76b0SSuyog Pawar                         (1 << ps_sps->i1_log2_ctb_size));
1884*c83a76b0SSuyog Pawar 
1885*c83a76b0SSuyog Pawar         ps_sps->i4_pic_size_in_ctb = ps_sps->i2_pic_ht_in_ctb *
1886*c83a76b0SSuyog Pawar                         ps_sps->i2_pic_wd_in_ctb;
1887*c83a76b0SSuyog Pawar 
1888*c83a76b0SSuyog Pawar         if(0 == ps_codec->i4_sps_done)
1889*c83a76b0SSuyog Pawar             ps_codec->s_parse.i4_next_ctb_indx = ps_sps->i4_pic_size_in_ctb;
1890*c83a76b0SSuyog Pawar 
1891*c83a76b0SSuyog Pawar         numerator = ps_sps->i2_pic_width_in_luma_samples;
1892*c83a76b0SSuyog Pawar         ps_sps->i2_pic_wd_in_min_cb = numerator  /
1893*c83a76b0SSuyog Pawar                         (1 << ps_sps->i1_log2_min_coding_block_size);
1894*c83a76b0SSuyog Pawar 
1895*c83a76b0SSuyog Pawar         numerator = ps_sps->i2_pic_height_in_luma_samples;
1896*c83a76b0SSuyog Pawar         ps_sps->i2_pic_ht_in_min_cb = numerator  /
1897*c83a76b0SSuyog Pawar                         (1 << ps_sps->i1_log2_min_coding_block_size);
1898*c83a76b0SSuyog Pawar     }
1899*c83a76b0SSuyog Pawar     if((0 != ps_codec->u4_allocate_dynamic_done) &&
1900*c83a76b0SSuyog Pawar                     ((ps_codec->i4_wd != ps_sps->i2_pic_width_in_luma_samples) ||
1901*c83a76b0SSuyog Pawar                     (ps_codec->i4_ht != ps_sps->i2_pic_height_in_luma_samples)))
1902*c83a76b0SSuyog Pawar     {
1903*c83a76b0SSuyog Pawar         if(0 == ps_codec->i4_first_pic_done)
1904*c83a76b0SSuyog Pawar         {
1905*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1906*c83a76b0SSuyog Pawar         }
1907*c83a76b0SSuyog Pawar         ps_codec->i4_reset_flag = 1;
1908*c83a76b0SSuyog Pawar         return (IHEVCD_ERROR_T)IVD_RES_CHANGED;
1909*c83a76b0SSuyog Pawar     }
1910*c83a76b0SSuyog Pawar 
1911*c83a76b0SSuyog Pawar     // Ensure both i2_pic_width_in_luma_samples and i2_pic_height_in_luma_samples do
1912*c83a76b0SSuyog Pawar     // not exceed MAX_WD and their product doesn't exceed MAX_WD * MAX_HT
1913*c83a76b0SSuyog Pawar     if((ps_sps->i2_pic_width_in_luma_samples > MAX_WD) ||
1914*c83a76b0SSuyog Pawar                     (ps_sps->i2_pic_height_in_luma_samples > MAX_WD) ||
1915*c83a76b0SSuyog Pawar                     ((ps_sps->i2_pic_width_in_luma_samples * ps_sps->i2_pic_height_in_luma_samples) >
1916*c83a76b0SSuyog Pawar                     (MAX_WD * MAX_HT)))
1917*c83a76b0SSuyog Pawar     {
1918*c83a76b0SSuyog Pawar         return (IHEVCD_ERROR_T)IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
1919*c83a76b0SSuyog Pawar     }
1920*c83a76b0SSuyog Pawar 
1921*c83a76b0SSuyog Pawar     /* Update display width and display height */
1922*c83a76b0SSuyog Pawar     {
1923*c83a76b0SSuyog Pawar         WORD32 disp_wd, disp_ht;
1924*c83a76b0SSuyog Pawar         WORD32 crop_unit_x, crop_unit_y;
1925*c83a76b0SSuyog Pawar         crop_unit_x = 1;
1926*c83a76b0SSuyog Pawar         crop_unit_y = 1;
1927*c83a76b0SSuyog Pawar 
1928*c83a76b0SSuyog Pawar         if(CHROMA_FMT_IDC_YUV420 == ps_sps->i1_chroma_format_idc)
1929*c83a76b0SSuyog Pawar         {
1930*c83a76b0SSuyog Pawar             crop_unit_x = 2;
1931*c83a76b0SSuyog Pawar             crop_unit_y = 2;
1932*c83a76b0SSuyog Pawar         }
1933*c83a76b0SSuyog Pawar 
1934*c83a76b0SSuyog Pawar         disp_wd = ps_sps->i2_pic_width_in_luma_samples;
1935*c83a76b0SSuyog Pawar         disp_wd -= ps_sps->i2_pic_crop_left_offset * crop_unit_x;
1936*c83a76b0SSuyog Pawar         disp_wd -= ps_sps->i2_pic_crop_right_offset * crop_unit_x;
1937*c83a76b0SSuyog Pawar 
1938*c83a76b0SSuyog Pawar 
1939*c83a76b0SSuyog Pawar         disp_ht = ps_sps->i2_pic_height_in_luma_samples;
1940*c83a76b0SSuyog Pawar         disp_ht -= ps_sps->i2_pic_crop_top_offset * crop_unit_y;
1941*c83a76b0SSuyog Pawar         disp_ht -= ps_sps->i2_pic_crop_bottom_offset * crop_unit_y;
1942*c83a76b0SSuyog Pawar 
1943*c83a76b0SSuyog Pawar         if((0 >= disp_wd) || (0 >= disp_ht))
1944*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
1945*c83a76b0SSuyog Pawar 
1946*c83a76b0SSuyog Pawar         if((0 != ps_codec->u4_allocate_dynamic_done) &&
1947*c83a76b0SSuyog Pawar                             ((ps_codec->i4_disp_wd != disp_wd) ||
1948*c83a76b0SSuyog Pawar                             (ps_codec->i4_disp_ht != disp_ht)))
1949*c83a76b0SSuyog Pawar         {
1950*c83a76b0SSuyog Pawar             if(0 == ps_codec->i4_first_pic_done)
1951*c83a76b0SSuyog Pawar             {
1952*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
1953*c83a76b0SSuyog Pawar             }
1954*c83a76b0SSuyog Pawar             ps_codec->i4_reset_flag = 1;
1955*c83a76b0SSuyog Pawar             return (IHEVCD_ERROR_T)IVD_RES_CHANGED;
1956*c83a76b0SSuyog Pawar         }
1957*c83a76b0SSuyog Pawar 
1958*c83a76b0SSuyog Pawar         ps_codec->i4_disp_wd = disp_wd;
1959*c83a76b0SSuyog Pawar         ps_codec->i4_disp_ht = disp_ht;
1960*c83a76b0SSuyog Pawar 
1961*c83a76b0SSuyog Pawar 
1962*c83a76b0SSuyog Pawar         ps_codec->i4_wd = ps_sps->i2_pic_width_in_luma_samples;
1963*c83a76b0SSuyog Pawar         ps_codec->i4_ht = ps_sps->i2_pic_height_in_luma_samples;
1964*c83a76b0SSuyog Pawar         ps_codec->u4_num_8x8_blks = ALIGN64(ps_codec->i4_wd) * ALIGN64(ps_codec->i4_ht) >> 6;
1965*c83a76b0SSuyog Pawar 
1966*c83a76b0SSuyog Pawar         {
1967*c83a76b0SSuyog Pawar             WORD32 ref_strd;
1968*c83a76b0SSuyog Pawar             ref_strd = ALIGN32(ps_sps->i2_pic_width_in_luma_samples + PAD_WD);
1969*c83a76b0SSuyog Pawar             if(ps_codec->i4_strd < ref_strd)
1970*c83a76b0SSuyog Pawar             {
1971*c83a76b0SSuyog Pawar                 ps_codec->i4_strd = ref_strd;
1972*c83a76b0SSuyog Pawar             }
1973*c83a76b0SSuyog Pawar         }
1974*c83a76b0SSuyog Pawar 
1975*c83a76b0SSuyog Pawar         if(0 == ps_codec->i4_share_disp_buf)
1976*c83a76b0SSuyog Pawar         {
1977*c83a76b0SSuyog Pawar             if(ps_codec->i4_disp_strd < ps_codec->i4_disp_wd)
1978*c83a76b0SSuyog Pawar             {
1979*c83a76b0SSuyog Pawar                 ps_codec->i4_disp_strd = ps_codec->i4_disp_wd;
1980*c83a76b0SSuyog Pawar             }
1981*c83a76b0SSuyog Pawar         }
1982*c83a76b0SSuyog Pawar         else
1983*c83a76b0SSuyog Pawar         {
1984*c83a76b0SSuyog Pawar             if(ps_codec->i4_disp_strd < ps_codec->i4_strd)
1985*c83a76b0SSuyog Pawar             {
1986*c83a76b0SSuyog Pawar                 ps_codec->i4_disp_strd = ps_codec->i4_strd;
1987*c83a76b0SSuyog Pawar             }
1988*c83a76b0SSuyog Pawar         }
1989*c83a76b0SSuyog Pawar     }
1990*c83a76b0SSuyog Pawar 
1991*c83a76b0SSuyog Pawar     /* This is used only during initialization to get reorder count etc */
1992*c83a76b0SSuyog Pawar     ps_codec->i4_sps_id = sps_id;
1993*c83a76b0SSuyog Pawar 
1994*c83a76b0SSuyog Pawar     ps_codec->i4_sps_done = 1;
1995*c83a76b0SSuyog Pawar     return ret;
1996*c83a76b0SSuyog Pawar }
1997*c83a76b0SSuyog Pawar 
1998*c83a76b0SSuyog Pawar 
ihevcd_unmark_pps(codec_t * ps_codec,WORD32 sps_id)1999*c83a76b0SSuyog Pawar void ihevcd_unmark_pps(codec_t *ps_codec, WORD32 sps_id)
2000*c83a76b0SSuyog Pawar {
2001*c83a76b0SSuyog Pawar     WORD32 pps_id = 0;
2002*c83a76b0SSuyog Pawar     pps_t *ps_pps = ps_codec->ps_pps_base;
2003*c83a76b0SSuyog Pawar 
2004*c83a76b0SSuyog Pawar     for(pps_id = 0; pps_id < MAX_PPS_CNT - 1; pps_id++, ps_pps++)
2005*c83a76b0SSuyog Pawar     {
2006*c83a76b0SSuyog Pawar         if((ps_pps->i1_pps_valid) &&
2007*c83a76b0SSuyog Pawar                         (ps_pps->i1_sps_id == sps_id))
2008*c83a76b0SSuyog Pawar             ps_pps->i1_pps_valid = 0;
2009*c83a76b0SSuyog Pawar     }
2010*c83a76b0SSuyog Pawar }
2011*c83a76b0SSuyog Pawar 
2012*c83a76b0SSuyog Pawar 
ihevcd_copy_sps(codec_t * ps_codec,WORD32 sps_id,WORD32 sps_id_ref)2013*c83a76b0SSuyog Pawar void ihevcd_copy_sps(codec_t *ps_codec, WORD32 sps_id, WORD32 sps_id_ref)
2014*c83a76b0SSuyog Pawar {
2015*c83a76b0SSuyog Pawar     sps_t *ps_sps, *ps_sps_ref;
2016*c83a76b0SSuyog Pawar     WORD16 *pi2_scaling_mat_backup;
2017*c83a76b0SSuyog Pawar     WORD32 scaling_mat_size;
2018*c83a76b0SSuyog Pawar 
2019*c83a76b0SSuyog Pawar     SCALING_MAT_SIZE(scaling_mat_size);
2020*c83a76b0SSuyog Pawar     ps_sps_ref = ps_codec->ps_sps_base + sps_id_ref;
2021*c83a76b0SSuyog Pawar     ps_sps = ps_codec->ps_sps_base + sps_id;
2022*c83a76b0SSuyog Pawar 
2023*c83a76b0SSuyog Pawar     if(ps_sps->i1_sps_valid)
2024*c83a76b0SSuyog Pawar     {
2025*c83a76b0SSuyog Pawar         if((ps_sps->i1_log2_ctb_size != ps_sps_ref->i1_log2_ctb_size) ||
2026*c83a76b0SSuyog Pawar                         (ps_sps->i2_pic_wd_in_ctb != ps_sps_ref->i2_pic_wd_in_ctb) ||
2027*c83a76b0SSuyog Pawar                         (ps_sps->i2_pic_ht_in_ctb != ps_sps_ref->i2_pic_ht_in_ctb))
2028*c83a76b0SSuyog Pawar         {
2029*c83a76b0SSuyog Pawar             ihevcd_unmark_pps(ps_codec, sps_id);
2030*c83a76b0SSuyog Pawar         }
2031*c83a76b0SSuyog Pawar     }
2032*c83a76b0SSuyog Pawar 
2033*c83a76b0SSuyog Pawar     pi2_scaling_mat_backup = ps_sps->pi2_scaling_mat;
2034*c83a76b0SSuyog Pawar 
2035*c83a76b0SSuyog Pawar     memcpy(ps_sps, ps_sps_ref, sizeof(sps_t));
2036*c83a76b0SSuyog Pawar     ps_sps->pi2_scaling_mat = pi2_scaling_mat_backup;
2037*c83a76b0SSuyog Pawar     memcpy(ps_sps->pi2_scaling_mat, ps_sps_ref->pi2_scaling_mat, scaling_mat_size * sizeof(WORD16));
2038*c83a76b0SSuyog Pawar     ps_sps->i1_sps_valid = 1;
2039*c83a76b0SSuyog Pawar 
2040*c83a76b0SSuyog Pawar     ps_codec->s_parse.ps_sps = ps_sps;
2041*c83a76b0SSuyog Pawar }
2042*c83a76b0SSuyog Pawar 
2043*c83a76b0SSuyog Pawar 
2044*c83a76b0SSuyog Pawar /**
2045*c83a76b0SSuyog Pawar *******************************************************************************
2046*c83a76b0SSuyog Pawar *
2047*c83a76b0SSuyog Pawar * @brief
2048*c83a76b0SSuyog Pawar *  Parses PPS (Picture Parameter Set)
2049*c83a76b0SSuyog Pawar *
2050*c83a76b0SSuyog Pawar * @par Description:
2051*c83a76b0SSuyog Pawar *  Parse Picture Parameter Set as per section  Section: 7.3.2.3
2052*c83a76b0SSuyog Pawar * The pps is written to a temporary buffer and copied later to the
2053*c83a76b0SSuyog Pawar * appropriate location
2054*c83a76b0SSuyog Pawar *
2055*c83a76b0SSuyog Pawar * @param[in] ps_codec
2056*c83a76b0SSuyog Pawar *  Pointer to codec context
2057*c83a76b0SSuyog Pawar *
2058*c83a76b0SSuyog Pawar * @returns Error code from IHEVCD_ERROR_T
2059*c83a76b0SSuyog Pawar *
2060*c83a76b0SSuyog Pawar * @remarks
2061*c83a76b0SSuyog Pawar *
2062*c83a76b0SSuyog Pawar *
2063*c83a76b0SSuyog Pawar *******************************************************************************
2064*c83a76b0SSuyog Pawar */
ihevcd_parse_pps(codec_t * ps_codec)2065*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_pps(codec_t *ps_codec)
2066*c83a76b0SSuyog Pawar {
2067*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
2068*c83a76b0SSuyog Pawar     UWORD32 value;
2069*c83a76b0SSuyog Pawar     WORD32 i4_value;
2070*c83a76b0SSuyog Pawar     WORD32 pps_id;
2071*c83a76b0SSuyog Pawar 
2072*c83a76b0SSuyog Pawar     pps_t *ps_pps;
2073*c83a76b0SSuyog Pawar     sps_t *ps_sps;
2074*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm;
2075*c83a76b0SSuyog Pawar 
2076*c83a76b0SSuyog Pawar 
2077*c83a76b0SSuyog Pawar     if(0 == ps_codec->i4_sps_done)
2078*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_HEADER;
2079*c83a76b0SSuyog Pawar 
2080*c83a76b0SSuyog Pawar     UEV_PARSE("pic_parameter_set_id", value, ps_bitstrm);
2081*c83a76b0SSuyog Pawar 
2082*c83a76b0SSuyog Pawar     pps_id = value;
2083*c83a76b0SSuyog Pawar     if((pps_id >= MAX_PPS_CNT) || (pps_id < 0))
2084*c83a76b0SSuyog Pawar     {
2085*c83a76b0SSuyog Pawar         if(ps_codec->i4_pps_done)
2086*c83a76b0SSuyog Pawar             return IHEVCD_UNSUPPORTED_PPS_ID;
2087*c83a76b0SSuyog Pawar         else
2088*c83a76b0SSuyog Pawar             pps_id = 0;
2089*c83a76b0SSuyog Pawar     }
2090*c83a76b0SSuyog Pawar 
2091*c83a76b0SSuyog Pawar 
2092*c83a76b0SSuyog Pawar     ps_pps = (ps_codec->s_parse.ps_pps_base + MAX_PPS_CNT - 1);
2093*c83a76b0SSuyog Pawar 
2094*c83a76b0SSuyog Pawar     ps_pps->i1_pps_id = pps_id;
2095*c83a76b0SSuyog Pawar 
2096*c83a76b0SSuyog Pawar     UEV_PARSE("seq_parameter_set_id", value, ps_bitstrm);
2097*c83a76b0SSuyog Pawar     if(value > MAX_SPS_CNT - 2)
2098*c83a76b0SSuyog Pawar     {
2099*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
2100*c83a76b0SSuyog Pawar     }
2101*c83a76b0SSuyog Pawar     ps_pps->i1_sps_id = value;
2102*c83a76b0SSuyog Pawar 
2103*c83a76b0SSuyog Pawar     ps_sps = (ps_codec->s_parse.ps_sps_base + ps_pps->i1_sps_id);
2104*c83a76b0SSuyog Pawar 
2105*c83a76b0SSuyog Pawar     /* If the SPS that is being referred to has not been parsed,
2106*c83a76b0SSuyog Pawar      * copy an existing SPS to the current location */
2107*c83a76b0SSuyog Pawar     if(0 == ps_sps->i1_sps_valid)
2108*c83a76b0SSuyog Pawar     {
2109*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_HEADER;
2110*c83a76b0SSuyog Pawar 
2111*c83a76b0SSuyog Pawar /*
2112*c83a76b0SSuyog Pawar         sps_t *ps_sps_ref = ps_codec->ps_sps_base;
2113*c83a76b0SSuyog Pawar         while(0 == ps_sps_ref->i1_sps_valid)
2114*c83a76b0SSuyog Pawar             ps_sps_ref++;
2115*c83a76b0SSuyog Pawar         ihevcd_copy_sps(ps_codec, ps_pps->i1_sps_id, ps_sps_ref->i1_sps_id);
2116*c83a76b0SSuyog Pawar */
2117*c83a76b0SSuyog Pawar     }
2118*c83a76b0SSuyog Pawar 
2119*c83a76b0SSuyog Pawar     BITS_PARSE("dependent_slices_enabled_flag", value, ps_bitstrm, 1);
2120*c83a76b0SSuyog Pawar     ps_pps->i1_dependent_slice_enabled_flag = value;
2121*c83a76b0SSuyog Pawar 
2122*c83a76b0SSuyog Pawar     BITS_PARSE("output_flag_present_flag", value, ps_bitstrm, 1);
2123*c83a76b0SSuyog Pawar     ps_pps->i1_output_flag_present_flag = value;
2124*c83a76b0SSuyog Pawar 
2125*c83a76b0SSuyog Pawar     BITS_PARSE("num_extra_slice_header_bits", value, ps_bitstrm, 3);
2126*c83a76b0SSuyog Pawar     ps_pps->i1_num_extra_slice_header_bits = value;
2127*c83a76b0SSuyog Pawar 
2128*c83a76b0SSuyog Pawar 
2129*c83a76b0SSuyog Pawar     BITS_PARSE("sign_data_hiding_flag", value, ps_bitstrm, 1);
2130*c83a76b0SSuyog Pawar     ps_pps->i1_sign_data_hiding_flag = value;
2131*c83a76b0SSuyog Pawar 
2132*c83a76b0SSuyog Pawar     BITS_PARSE("cabac_init_present_flag", value, ps_bitstrm, 1);
2133*c83a76b0SSuyog Pawar     ps_pps->i1_cabac_init_present_flag = value;
2134*c83a76b0SSuyog Pawar 
2135*c83a76b0SSuyog Pawar     UEV_PARSE("num_ref_idx_l0_default_active_minus1", value, ps_bitstrm);
2136*c83a76b0SSuyog Pawar     if(value > MAX_DPB_SIZE - 2)
2137*c83a76b0SSuyog Pawar     {
2138*c83a76b0SSuyog Pawar          return IHEVCD_INVALID_PARAMETER;
2139*c83a76b0SSuyog Pawar     }
2140*c83a76b0SSuyog Pawar     ps_pps->i1_num_ref_idx_l0_default_active = value + 1;
2141*c83a76b0SSuyog Pawar 
2142*c83a76b0SSuyog Pawar     UEV_PARSE("num_ref_idx_l1_default_active_minus1", value, ps_bitstrm);
2143*c83a76b0SSuyog Pawar     if(value > MAX_DPB_SIZE - 2)
2144*c83a76b0SSuyog Pawar     {
2145*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
2146*c83a76b0SSuyog Pawar     }
2147*c83a76b0SSuyog Pawar     ps_pps->i1_num_ref_idx_l1_default_active = value + 1;
2148*c83a76b0SSuyog Pawar 
2149*c83a76b0SSuyog Pawar     SEV_PARSE("pic_init_qp_minus26", i4_value, ps_bitstrm);
2150*c83a76b0SSuyog Pawar     if(i4_value < -26 || i4_value > 25)
2151*c83a76b0SSuyog Pawar     {
2152*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
2153*c83a76b0SSuyog Pawar     }
2154*c83a76b0SSuyog Pawar     ps_pps->i1_pic_init_qp = i4_value + 26;
2155*c83a76b0SSuyog Pawar 
2156*c83a76b0SSuyog Pawar     BITS_PARSE("constrained_intra_pred_flag", value, ps_bitstrm, 1);
2157*c83a76b0SSuyog Pawar     ps_pps->i1_constrained_intra_pred_flag = value;
2158*c83a76b0SSuyog Pawar 
2159*c83a76b0SSuyog Pawar     BITS_PARSE("transform_skip_enabled_flag", value, ps_bitstrm, 1);
2160*c83a76b0SSuyog Pawar     ps_pps->i1_transform_skip_enabled_flag = value;
2161*c83a76b0SSuyog Pawar 
2162*c83a76b0SSuyog Pawar     BITS_PARSE("cu_qp_delta_enabled_flag", value, ps_bitstrm, 1);
2163*c83a76b0SSuyog Pawar     ps_pps->i1_cu_qp_delta_enabled_flag = value;
2164*c83a76b0SSuyog Pawar 
2165*c83a76b0SSuyog Pawar     if(ps_pps->i1_cu_qp_delta_enabled_flag)
2166*c83a76b0SSuyog Pawar     {
2167*c83a76b0SSuyog Pawar         UEV_PARSE("diff_cu_qp_delta_depth", value, ps_bitstrm);
2168*c83a76b0SSuyog Pawar         if(value > ps_sps->i1_log2_diff_max_min_coding_block_size)
2169*c83a76b0SSuyog Pawar         {
2170*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_PARAMETER;
2171*c83a76b0SSuyog Pawar         }
2172*c83a76b0SSuyog Pawar         ps_pps->i1_diff_cu_qp_delta_depth = value;
2173*c83a76b0SSuyog Pawar     }
2174*c83a76b0SSuyog Pawar     else
2175*c83a76b0SSuyog Pawar     {
2176*c83a76b0SSuyog Pawar         ps_pps->i1_diff_cu_qp_delta_depth = 0;
2177*c83a76b0SSuyog Pawar     }
2178*c83a76b0SSuyog Pawar     ps_pps->i1_log2_min_cu_qp_delta_size = ps_sps->i1_log2_ctb_size - ps_pps->i1_diff_cu_qp_delta_depth;
2179*c83a76b0SSuyog Pawar     /* Print different */
2180*c83a76b0SSuyog Pawar     SEV_PARSE("cb_qp_offset", i4_value, ps_bitstrm);
2181*c83a76b0SSuyog Pawar     if(i4_value < -12 || i4_value > 12)
2182*c83a76b0SSuyog Pawar     {
2183*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
2184*c83a76b0SSuyog Pawar     }
2185*c83a76b0SSuyog Pawar     ps_pps->i1_pic_cb_qp_offset = i4_value;
2186*c83a76b0SSuyog Pawar 
2187*c83a76b0SSuyog Pawar     /* Print different */
2188*c83a76b0SSuyog Pawar     SEV_PARSE("cr_qp_offset", i4_value, ps_bitstrm);
2189*c83a76b0SSuyog Pawar     if(i4_value < -12 || i4_value > 12)
2190*c83a76b0SSuyog Pawar     {
2191*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
2192*c83a76b0SSuyog Pawar     }
2193*c83a76b0SSuyog Pawar     ps_pps->i1_pic_cr_qp_offset = i4_value;
2194*c83a76b0SSuyog Pawar 
2195*c83a76b0SSuyog Pawar     /* Print different */
2196*c83a76b0SSuyog Pawar     BITS_PARSE("slicelevel_chroma_qp_flag", value, ps_bitstrm, 1);
2197*c83a76b0SSuyog Pawar     ps_pps->i1_pic_slice_level_chroma_qp_offsets_present_flag = value;
2198*c83a76b0SSuyog Pawar 
2199*c83a76b0SSuyog Pawar     BITS_PARSE("weighted_pred_flag", value, ps_bitstrm, 1);
2200*c83a76b0SSuyog Pawar     ps_pps->i1_weighted_pred_flag = value;
2201*c83a76b0SSuyog Pawar 
2202*c83a76b0SSuyog Pawar     BITS_PARSE("weighted_bipred_flag", value, ps_bitstrm, 1);
2203*c83a76b0SSuyog Pawar     ps_pps->i1_weighted_bipred_flag = value;
2204*c83a76b0SSuyog Pawar 
2205*c83a76b0SSuyog Pawar     BITS_PARSE("transquant_bypass_enable_flag", value, ps_bitstrm, 1);
2206*c83a76b0SSuyog Pawar     ps_pps->i1_transquant_bypass_enable_flag = value;
2207*c83a76b0SSuyog Pawar 
2208*c83a76b0SSuyog Pawar     BITS_PARSE("tiles_enabled_flag", value, ps_bitstrm, 1);
2209*c83a76b0SSuyog Pawar     ps_pps->i1_tiles_enabled_flag = value;
2210*c83a76b0SSuyog Pawar 
2211*c83a76b0SSuyog Pawar     /* When tiles are enabled and width or height is >= 4096,
2212*c83a76b0SSuyog Pawar      * CTB Size should at least be 32 while if width or height is >= 8192,
2213*c83a76b0SSuyog Pawar      * CTB Size should at least be 64 and so on. 16x16 CTBs can result
2214*c83a76b0SSuyog Pawar      * in tile position greater than 255 for 4096 while 32x32 CTBs can result
2215*c83a76b0SSuyog Pawar      * in tile position greater than 255 for 8192,
2216*c83a76b0SSuyog Pawar      * which decoder does not support.
2217*c83a76b0SSuyog Pawar      */
2218*c83a76b0SSuyog Pawar     if (ps_pps->i1_tiles_enabled_flag)
2219*c83a76b0SSuyog Pawar     {
2220*c83a76b0SSuyog Pawar         if((ps_sps->i1_log2_ctb_size == 4) &&
2221*c83a76b0SSuyog Pawar             ((ps_sps->i2_pic_width_in_luma_samples >= 4096) ||
2222*c83a76b0SSuyog Pawar             (ps_sps->i2_pic_height_in_luma_samples >= 4096)))
2223*c83a76b0SSuyog Pawar         {
2224*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_HEADER;
2225*c83a76b0SSuyog Pawar         }
2226*c83a76b0SSuyog Pawar         if((ps_sps->i1_log2_ctb_size == 5) &&
2227*c83a76b0SSuyog Pawar             ((ps_sps->i2_pic_width_in_luma_samples >= 8192) ||
2228*c83a76b0SSuyog Pawar             (ps_sps->i2_pic_height_in_luma_samples >= 8192)))
2229*c83a76b0SSuyog Pawar         {
2230*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_HEADER;
2231*c83a76b0SSuyog Pawar         }
2232*c83a76b0SSuyog Pawar         if((ps_sps->i1_log2_ctb_size == 6) &&
2233*c83a76b0SSuyog Pawar             ((ps_sps->i2_pic_width_in_luma_samples >= 16384) ||
2234*c83a76b0SSuyog Pawar             (ps_sps->i2_pic_height_in_luma_samples >= 16384)))
2235*c83a76b0SSuyog Pawar         {
2236*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_HEADER;
2237*c83a76b0SSuyog Pawar         }
2238*c83a76b0SSuyog Pawar     }
2239*c83a76b0SSuyog Pawar 
2240*c83a76b0SSuyog Pawar     BITS_PARSE("entropy_coding_sync_enabled_flag", value, ps_bitstrm, 1);
2241*c83a76b0SSuyog Pawar     ps_pps->i1_entropy_coding_sync_enabled_flag = value;
2242*c83a76b0SSuyog Pawar 
2243*c83a76b0SSuyog Pawar     ps_pps->i1_loop_filter_across_tiles_enabled_flag = 0;
2244*c83a76b0SSuyog Pawar     if(ps_pps->i1_tiles_enabled_flag)
2245*c83a76b0SSuyog Pawar     {
2246*c83a76b0SSuyog Pawar         WORD32 wd = ALIGN64(ps_codec->i4_wd);
2247*c83a76b0SSuyog Pawar         WORD32 ht = ALIGN64(ps_codec->i4_ht);
2248*c83a76b0SSuyog Pawar 
2249*c83a76b0SSuyog Pawar         WORD32 max_tile_cols = (wd + MIN_TILE_WD - 1) / MIN_TILE_WD;
2250*c83a76b0SSuyog Pawar         WORD32 max_tile_rows = (ht + MIN_TILE_HT - 1) / MIN_TILE_HT;
2251*c83a76b0SSuyog Pawar 
2252*c83a76b0SSuyog Pawar         UEV_PARSE("num_tile_columns_minus1", value, ps_bitstrm);
2253*c83a76b0SSuyog Pawar         ps_pps->i1_num_tile_columns = value + 1;
2254*c83a76b0SSuyog Pawar 
2255*c83a76b0SSuyog Pawar         UEV_PARSE("num_tile_rows_minus1", value, ps_bitstrm);
2256*c83a76b0SSuyog Pawar         ps_pps->i1_num_tile_rows = value + 1;
2257*c83a76b0SSuyog Pawar 
2258*c83a76b0SSuyog Pawar         if((ps_pps->i1_num_tile_columns < 1) ||
2259*c83a76b0SSuyog Pawar                         (ps_pps->i1_num_tile_columns > max_tile_cols) ||
2260*c83a76b0SSuyog Pawar                         (ps_pps->i1_num_tile_rows < 1) ||
2261*c83a76b0SSuyog Pawar                         (ps_pps->i1_num_tile_rows > max_tile_rows))
2262*c83a76b0SSuyog Pawar             return IHEVCD_INVALID_HEADER;
2263*c83a76b0SSuyog Pawar 
2264*c83a76b0SSuyog Pawar         BITS_PARSE("uniform_spacing_flag", value, ps_bitstrm, 1);
2265*c83a76b0SSuyog Pawar         ps_pps->i1_uniform_spacing_flag = value;
2266*c83a76b0SSuyog Pawar 
2267*c83a76b0SSuyog Pawar 
2268*c83a76b0SSuyog Pawar         {
2269*c83a76b0SSuyog Pawar 
2270*c83a76b0SSuyog Pawar             UWORD32 start;
2271*c83a76b0SSuyog Pawar             WORD32 i, j;
2272*c83a76b0SSuyog Pawar 
2273*c83a76b0SSuyog Pawar 
2274*c83a76b0SSuyog Pawar             start = 0;
2275*c83a76b0SSuyog Pawar             for(i = 0; i < ps_pps->i1_num_tile_columns; i++)
2276*c83a76b0SSuyog Pawar             {
2277*c83a76b0SSuyog Pawar                 tile_t *ps_tile;
2278*c83a76b0SSuyog Pawar                 if(!ps_pps->i1_uniform_spacing_flag)
2279*c83a76b0SSuyog Pawar                 {
2280*c83a76b0SSuyog Pawar                     if(i < (ps_pps->i1_num_tile_columns - 1))
2281*c83a76b0SSuyog Pawar                     {
2282*c83a76b0SSuyog Pawar                         UEV_PARSE("column_width_minus1[ i ]", value, ps_bitstrm);
2283*c83a76b0SSuyog Pawar                         value += 1;
2284*c83a76b0SSuyog Pawar                         if (value >= ps_sps->i2_pic_wd_in_ctb - start)
2285*c83a76b0SSuyog Pawar                         {
2286*c83a76b0SSuyog Pawar                             return IHEVCD_INVALID_HEADER;
2287*c83a76b0SSuyog Pawar                         }
2288*c83a76b0SSuyog Pawar                     }
2289*c83a76b0SSuyog Pawar                     else
2290*c83a76b0SSuyog Pawar                     {
2291*c83a76b0SSuyog Pawar                         value = ps_sps->i2_pic_wd_in_ctb - start;
2292*c83a76b0SSuyog Pawar                     }
2293*c83a76b0SSuyog Pawar                 }
2294*c83a76b0SSuyog Pawar                 else
2295*c83a76b0SSuyog Pawar                 {
2296*c83a76b0SSuyog Pawar                     value = ((i + 1) * ps_sps->i2_pic_wd_in_ctb) / ps_pps->i1_num_tile_columns -
2297*c83a76b0SSuyog Pawar                                     (i * ps_sps->i2_pic_wd_in_ctb) / ps_pps->i1_num_tile_columns;
2298*c83a76b0SSuyog Pawar                 }
2299*c83a76b0SSuyog Pawar 
2300*c83a76b0SSuyog Pawar                 for(j = 0; j < ps_pps->i1_num_tile_rows; j++)
2301*c83a76b0SSuyog Pawar                 {
2302*c83a76b0SSuyog Pawar                     ps_tile = ps_pps->ps_tile + j * ps_pps->i1_num_tile_columns + i;
2303*c83a76b0SSuyog Pawar                     ps_tile->u1_pos_x = start;
2304*c83a76b0SSuyog Pawar                     ps_tile->u2_wd = value;
2305*c83a76b0SSuyog Pawar                 }
2306*c83a76b0SSuyog Pawar                 start += value;
2307*c83a76b0SSuyog Pawar 
2308*c83a76b0SSuyog Pawar                 if((start > ps_sps->i2_pic_wd_in_ctb) ||
2309*c83a76b0SSuyog Pawar                                 (value == 0))
2310*c83a76b0SSuyog Pawar                     return IHEVCD_INVALID_HEADER;
2311*c83a76b0SSuyog Pawar             }
2312*c83a76b0SSuyog Pawar 
2313*c83a76b0SSuyog Pawar             start = 0;
2314*c83a76b0SSuyog Pawar             for(i = 0; i < (ps_pps->i1_num_tile_rows); i++)
2315*c83a76b0SSuyog Pawar             {
2316*c83a76b0SSuyog Pawar                 tile_t *ps_tile;
2317*c83a76b0SSuyog Pawar                 if(!ps_pps->i1_uniform_spacing_flag)
2318*c83a76b0SSuyog Pawar                 {
2319*c83a76b0SSuyog Pawar                     if(i < (ps_pps->i1_num_tile_rows - 1))
2320*c83a76b0SSuyog Pawar                     {
2321*c83a76b0SSuyog Pawar 
2322*c83a76b0SSuyog Pawar                         UEV_PARSE("row_height_minus1[ i ]", value, ps_bitstrm);
2323*c83a76b0SSuyog Pawar                         value += 1;
2324*c83a76b0SSuyog Pawar                         if (value >= ps_sps->i2_pic_ht_in_ctb - start)
2325*c83a76b0SSuyog Pawar                         {
2326*c83a76b0SSuyog Pawar                             return IHEVCD_INVALID_HEADER;
2327*c83a76b0SSuyog Pawar                         }
2328*c83a76b0SSuyog Pawar                     }
2329*c83a76b0SSuyog Pawar                     else
2330*c83a76b0SSuyog Pawar                     {
2331*c83a76b0SSuyog Pawar                         value = ps_sps->i2_pic_ht_in_ctb - start;
2332*c83a76b0SSuyog Pawar                     }
2333*c83a76b0SSuyog Pawar                 }
2334*c83a76b0SSuyog Pawar                 else
2335*c83a76b0SSuyog Pawar                 {
2336*c83a76b0SSuyog Pawar                     value = ((i + 1) * ps_sps->i2_pic_ht_in_ctb) / ps_pps->i1_num_tile_rows -
2337*c83a76b0SSuyog Pawar                                     (i * ps_sps->i2_pic_ht_in_ctb) / ps_pps->i1_num_tile_rows;
2338*c83a76b0SSuyog Pawar                 }
2339*c83a76b0SSuyog Pawar 
2340*c83a76b0SSuyog Pawar                 for(j = 0; j < ps_pps->i1_num_tile_columns; j++)
2341*c83a76b0SSuyog Pawar                 {
2342*c83a76b0SSuyog Pawar                     ps_tile = ps_pps->ps_tile + i * ps_pps->i1_num_tile_columns + j;
2343*c83a76b0SSuyog Pawar                     ps_tile->u1_pos_y = start;
2344*c83a76b0SSuyog Pawar                     ps_tile->u2_ht = value;
2345*c83a76b0SSuyog Pawar                 }
2346*c83a76b0SSuyog Pawar                 start += value;
2347*c83a76b0SSuyog Pawar 
2348*c83a76b0SSuyog Pawar                 if((start > ps_sps->i2_pic_ht_in_ctb) ||
2349*c83a76b0SSuyog Pawar                                 (value == 0))
2350*c83a76b0SSuyog Pawar                     return IHEVCD_INVALID_HEADER;
2351*c83a76b0SSuyog Pawar             }
2352*c83a76b0SSuyog Pawar         }
2353*c83a76b0SSuyog Pawar 
2354*c83a76b0SSuyog Pawar 
2355*c83a76b0SSuyog Pawar         BITS_PARSE("loop_filter_across_tiles_enabled_flag", value, ps_bitstrm, 1);
2356*c83a76b0SSuyog Pawar         ps_pps->i1_loop_filter_across_tiles_enabled_flag = value;
2357*c83a76b0SSuyog Pawar 
2358*c83a76b0SSuyog Pawar     }
2359*c83a76b0SSuyog Pawar     else
2360*c83a76b0SSuyog Pawar     {
2361*c83a76b0SSuyog Pawar         /* If tiles are not present, set first tile in each PPS to have tile
2362*c83a76b0SSuyog Pawar         width and height equal to picture width and height */
2363*c83a76b0SSuyog Pawar         ps_pps->i1_num_tile_columns = 1;
2364*c83a76b0SSuyog Pawar         ps_pps->i1_num_tile_rows = 1;
2365*c83a76b0SSuyog Pawar         ps_pps->i1_uniform_spacing_flag = 1;
2366*c83a76b0SSuyog Pawar 
2367*c83a76b0SSuyog Pawar         ps_pps->ps_tile->u1_pos_x = 0;
2368*c83a76b0SSuyog Pawar         ps_pps->ps_tile->u1_pos_y = 0;
2369*c83a76b0SSuyog Pawar         ps_pps->ps_tile->u2_wd = ps_sps->i2_pic_wd_in_ctb;
2370*c83a76b0SSuyog Pawar         ps_pps->ps_tile->u2_ht = ps_sps->i2_pic_ht_in_ctb;
2371*c83a76b0SSuyog Pawar     }
2372*c83a76b0SSuyog Pawar 
2373*c83a76b0SSuyog Pawar     BITS_PARSE("loop_filter_across_slices_enabled_flag", value, ps_bitstrm, 1);
2374*c83a76b0SSuyog Pawar     ps_pps->i1_loop_filter_across_slices_enabled_flag = value;
2375*c83a76b0SSuyog Pawar 
2376*c83a76b0SSuyog Pawar     BITS_PARSE("deblocking_filter_control_present_flag", value, ps_bitstrm, 1);
2377*c83a76b0SSuyog Pawar     ps_pps->i1_deblocking_filter_control_present_flag = value;
2378*c83a76b0SSuyog Pawar 
2379*c83a76b0SSuyog Pawar     /* Default values */
2380*c83a76b0SSuyog Pawar     ps_pps->i1_pic_disable_deblocking_filter_flag = 0;
2381*c83a76b0SSuyog Pawar     ps_pps->i1_deblocking_filter_override_enabled_flag = 0;
2382*c83a76b0SSuyog Pawar     ps_pps->i1_beta_offset_div2 = 0;
2383*c83a76b0SSuyog Pawar     ps_pps->i1_tc_offset_div2 = 0;
2384*c83a76b0SSuyog Pawar 
2385*c83a76b0SSuyog Pawar     if(ps_pps->i1_deblocking_filter_control_present_flag)
2386*c83a76b0SSuyog Pawar     {
2387*c83a76b0SSuyog Pawar 
2388*c83a76b0SSuyog Pawar         BITS_PARSE("deblocking_filter_override_enabled_flag", value, ps_bitstrm, 1);
2389*c83a76b0SSuyog Pawar         ps_pps->i1_deblocking_filter_override_enabled_flag = value;
2390*c83a76b0SSuyog Pawar 
2391*c83a76b0SSuyog Pawar         BITS_PARSE("pic_disable_deblocking_filter_flag", value, ps_bitstrm, 1);
2392*c83a76b0SSuyog Pawar         ps_pps->i1_pic_disable_deblocking_filter_flag = value;
2393*c83a76b0SSuyog Pawar 
2394*c83a76b0SSuyog Pawar         if(!ps_pps->i1_pic_disable_deblocking_filter_flag)
2395*c83a76b0SSuyog Pawar         {
2396*c83a76b0SSuyog Pawar 
2397*c83a76b0SSuyog Pawar             SEV_PARSE("pps_beta_offset_div2", i4_value, ps_bitstrm);
2398*c83a76b0SSuyog Pawar             if(i4_value < -6 || i4_value > 6)
2399*c83a76b0SSuyog Pawar             {
2400*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
2401*c83a76b0SSuyog Pawar             }
2402*c83a76b0SSuyog Pawar             ps_pps->i1_beta_offset_div2 = i4_value;
2403*c83a76b0SSuyog Pawar 
2404*c83a76b0SSuyog Pawar             SEV_PARSE("pps_tc_offset_div2", i4_value, ps_bitstrm);
2405*c83a76b0SSuyog Pawar             if(i4_value < -6 || i4_value > 6)
2406*c83a76b0SSuyog Pawar             {
2407*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
2408*c83a76b0SSuyog Pawar             }
2409*c83a76b0SSuyog Pawar             ps_pps->i1_tc_offset_div2 = i4_value;
2410*c83a76b0SSuyog Pawar 
2411*c83a76b0SSuyog Pawar         }
2412*c83a76b0SSuyog Pawar     }
2413*c83a76b0SSuyog Pawar 
2414*c83a76b0SSuyog Pawar     BITS_PARSE("pps_scaling_list_data_present_flag", value, ps_bitstrm, 1);
2415*c83a76b0SSuyog Pawar     ps_pps->i1_pps_scaling_list_data_present_flag = value;
2416*c83a76b0SSuyog Pawar 
2417*c83a76b0SSuyog Pawar     if(ps_pps->i1_pps_scaling_list_data_present_flag)
2418*c83a76b0SSuyog Pawar     {
2419*c83a76b0SSuyog Pawar         COPY_DEFAULT_SCALING_LIST(ps_pps->pi2_scaling_mat);
2420*c83a76b0SSuyog Pawar         ihevcd_scaling_list_data(ps_codec, ps_pps->pi2_scaling_mat);
2421*c83a76b0SSuyog Pawar     }
2422*c83a76b0SSuyog Pawar 
2423*c83a76b0SSuyog Pawar     BITS_PARSE("lists_modification_present_flag", value, ps_bitstrm, 1);
2424*c83a76b0SSuyog Pawar     ps_pps->i1_lists_modification_present_flag = value;
2425*c83a76b0SSuyog Pawar     UEV_PARSE("log2_parallel_merge_level_minus2", value, ps_bitstrm);
2426*c83a76b0SSuyog Pawar     if(value > (ps_sps->i1_log2_min_coding_block_size + ps_sps->i1_log2_diff_max_min_coding_block_size))
2427*c83a76b0SSuyog Pawar     {
2428*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
2429*c83a76b0SSuyog Pawar     }
2430*c83a76b0SSuyog Pawar     ps_pps->i1_log2_parallel_merge_level = value + 2;
2431*c83a76b0SSuyog Pawar 
2432*c83a76b0SSuyog Pawar     BITS_PARSE("slice_header_extension_present_flag", value, ps_bitstrm, 1);
2433*c83a76b0SSuyog Pawar     ps_pps->i1_slice_header_extension_present_flag = value;
2434*c83a76b0SSuyog Pawar     /* Not present in HM */
2435*c83a76b0SSuyog Pawar     BITS_PARSE("pps_extension_flag", value, ps_bitstrm, 1);
2436*c83a76b0SSuyog Pawar 
2437*c83a76b0SSuyog Pawar     if((UWORD8 *)ps_bitstrm->pu4_buf > ps_bitstrm->pu1_buf_max)
2438*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
2439*c83a76b0SSuyog Pawar 
2440*c83a76b0SSuyog Pawar     ps_codec->i4_pps_done = 1;
2441*c83a76b0SSuyog Pawar     return ret;
2442*c83a76b0SSuyog Pawar }
2443*c83a76b0SSuyog Pawar 
2444*c83a76b0SSuyog Pawar 
ihevcd_copy_pps(codec_t * ps_codec,WORD32 pps_id,WORD32 pps_id_ref)2445*c83a76b0SSuyog Pawar void ihevcd_copy_pps(codec_t *ps_codec, WORD32 pps_id, WORD32 pps_id_ref)
2446*c83a76b0SSuyog Pawar {
2447*c83a76b0SSuyog Pawar     pps_t *ps_pps, *ps_pps_ref;
2448*c83a76b0SSuyog Pawar     WORD16 *pi2_scaling_mat_backup;
2449*c83a76b0SSuyog Pawar     WORD32 scaling_mat_size;
2450*c83a76b0SSuyog Pawar     tile_t *ps_tile_backup;
2451*c83a76b0SSuyog Pawar     WORD32 max_tile_cols, max_tile_rows;
2452*c83a76b0SSuyog Pawar     WORD32 wd, ht;
2453*c83a76b0SSuyog Pawar     wd = ALIGN64(ps_codec->i4_wd);
2454*c83a76b0SSuyog Pawar     ht = ALIGN64(ps_codec->i4_ht);
2455*c83a76b0SSuyog Pawar 
2456*c83a76b0SSuyog Pawar     SCALING_MAT_SIZE(scaling_mat_size);
2457*c83a76b0SSuyog Pawar     max_tile_cols = (wd + MIN_TILE_WD - 1) / MIN_TILE_WD;
2458*c83a76b0SSuyog Pawar     max_tile_rows = (ht + MIN_TILE_HT - 1) / MIN_TILE_HT;
2459*c83a76b0SSuyog Pawar 
2460*c83a76b0SSuyog Pawar     ps_pps_ref = ps_codec->ps_pps_base + pps_id_ref;
2461*c83a76b0SSuyog Pawar     ps_pps = ps_codec->ps_pps_base + pps_id;
2462*c83a76b0SSuyog Pawar 
2463*c83a76b0SSuyog Pawar     pi2_scaling_mat_backup = ps_pps->pi2_scaling_mat;
2464*c83a76b0SSuyog Pawar     ps_tile_backup = ps_pps->ps_tile;
2465*c83a76b0SSuyog Pawar 
2466*c83a76b0SSuyog Pawar     memcpy(ps_pps, ps_pps_ref, sizeof(pps_t));
2467*c83a76b0SSuyog Pawar     ps_pps->pi2_scaling_mat = pi2_scaling_mat_backup;
2468*c83a76b0SSuyog Pawar     ps_pps->ps_tile = ps_tile_backup;
2469*c83a76b0SSuyog Pawar     memcpy(ps_pps->pi2_scaling_mat, ps_pps_ref->pi2_scaling_mat, scaling_mat_size * sizeof(WORD16));
2470*c83a76b0SSuyog Pawar     memcpy(ps_pps->ps_tile, ps_pps_ref->ps_tile, max_tile_cols * max_tile_rows * sizeof(tile_t));
2471*c83a76b0SSuyog Pawar 
2472*c83a76b0SSuyog Pawar     ps_pps->i1_pps_valid = 1;
2473*c83a76b0SSuyog Pawar 
2474*c83a76b0SSuyog Pawar     ps_codec->s_parse.ps_pps = ps_pps;
2475*c83a76b0SSuyog Pawar }
2476*c83a76b0SSuyog Pawar 
2477*c83a76b0SSuyog Pawar 
2478*c83a76b0SSuyog Pawar #ifndef DISABLE_SEI
ihevcd_parse_buffering_period_sei(codec_t * ps_codec,sps_t * ps_sps)2479*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_buffering_period_sei(codec_t *ps_codec,
2480*c83a76b0SSuyog Pawar                                                  sps_t *ps_sps)
2481*c83a76b0SSuyog Pawar {
2482*c83a76b0SSuyog Pawar     parse_ctxt_t *ps_parse = &ps_codec->s_parse;
2483*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm;
2484*c83a76b0SSuyog Pawar     UWORD32 value;
2485*c83a76b0SSuyog Pawar     vui_t *ps_vui;
2486*c83a76b0SSuyog Pawar     buf_period_sei_params_t *ps_buf_period_sei_params;
2487*c83a76b0SSuyog Pawar     UWORD32 i;
2488*c83a76b0SSuyog Pawar     hrd_params_t *ps_vui_hdr;
2489*c83a76b0SSuyog Pawar     UWORD32 u4_cpb_cnt;
2490*c83a76b0SSuyog Pawar 
2491*c83a76b0SSuyog Pawar     ps_vui = &ps_sps->s_vui_parameters;
2492*c83a76b0SSuyog Pawar     ps_vui_hdr = &ps_vui->s_vui_hrd_parameters;
2493*c83a76b0SSuyog Pawar 
2494*c83a76b0SSuyog Pawar     ps_buf_period_sei_params = &ps_parse->s_sei_params.s_buf_period_sei_params;
2495*c83a76b0SSuyog Pawar 
2496*c83a76b0SSuyog Pawar     ps_parse->s_sei_params.i1_buf_period_params_present_flag = 1;
2497*c83a76b0SSuyog Pawar 
2498*c83a76b0SSuyog Pawar     UEV_PARSE("bp_seq_parameter_set_id", value, ps_bitstrm);
2499*c83a76b0SSuyog Pawar     if(value > MAX_SPS_CNT - 2)
2500*c83a76b0SSuyog Pawar     {
2501*c83a76b0SSuyog Pawar         return IHEVCD_INVALID_PARAMETER;
2502*c83a76b0SSuyog Pawar     }
2503*c83a76b0SSuyog Pawar     ps_buf_period_sei_params->u1_bp_seq_parameter_set_id = value;
2504*c83a76b0SSuyog Pawar 
2505*c83a76b0SSuyog Pawar     if(!ps_vui_hdr->u1_sub_pic_cpb_params_present_flag)
2506*c83a76b0SSuyog Pawar     {
2507*c83a76b0SSuyog Pawar         BITS_PARSE("irap_cpb_params_present_flag", value, ps_bitstrm, 1);
2508*c83a76b0SSuyog Pawar         ps_buf_period_sei_params->u1_rap_cpb_params_present_flag = value;
2509*c83a76b0SSuyog Pawar     }
2510*c83a76b0SSuyog Pawar 
2511*c83a76b0SSuyog Pawar     if(ps_buf_period_sei_params->u1_rap_cpb_params_present_flag)
2512*c83a76b0SSuyog Pawar     {
2513*c83a76b0SSuyog Pawar         BITS_PARSE("cpb_delay_offset",
2514*c83a76b0SSuyog Pawar                    value,
2515*c83a76b0SSuyog Pawar                    ps_bitstrm,
2516*c83a76b0SSuyog Pawar                    (ps_vui_hdr->u1_au_cpb_removal_delay_length_minus1
2517*c83a76b0SSuyog Pawar                                    + 1));
2518*c83a76b0SSuyog Pawar         ps_buf_period_sei_params->u4_cpb_delay_offset = value;
2519*c83a76b0SSuyog Pawar 
2520*c83a76b0SSuyog Pawar         BITS_PARSE("dpb_delay_offset",
2521*c83a76b0SSuyog Pawar                    value,
2522*c83a76b0SSuyog Pawar                    ps_bitstrm,
2523*c83a76b0SSuyog Pawar                    (ps_vui_hdr->u1_dpb_output_delay_length_minus1
2524*c83a76b0SSuyog Pawar                                    + 1));
2525*c83a76b0SSuyog Pawar         ps_buf_period_sei_params->u4_dpb_delay_offset = value;
2526*c83a76b0SSuyog Pawar     }
2527*c83a76b0SSuyog Pawar     else
2528*c83a76b0SSuyog Pawar     {
2529*c83a76b0SSuyog Pawar         ps_buf_period_sei_params->u4_cpb_delay_offset = 0;
2530*c83a76b0SSuyog Pawar         ps_buf_period_sei_params->u4_dpb_delay_offset = 0;
2531*c83a76b0SSuyog Pawar     }
2532*c83a76b0SSuyog Pawar 
2533*c83a76b0SSuyog Pawar     BITS_PARSE("concatenation_flag", value, ps_bitstrm, 1);
2534*c83a76b0SSuyog Pawar     ps_buf_period_sei_params->u1_concatenation_flag = value;
2535*c83a76b0SSuyog Pawar 
2536*c83a76b0SSuyog Pawar     BITS_PARSE("au_cpb_removal_delay_delta_minus1",
2537*c83a76b0SSuyog Pawar                value,
2538*c83a76b0SSuyog Pawar                ps_bitstrm,
2539*c83a76b0SSuyog Pawar                (ps_vui_hdr->u1_au_cpb_removal_delay_length_minus1
2540*c83a76b0SSuyog Pawar                                + 1));
2541*c83a76b0SSuyog Pawar     ps_buf_period_sei_params->u4_au_cpb_removal_delay_delta_minus1 = value;
2542*c83a76b0SSuyog Pawar 
2543*c83a76b0SSuyog Pawar     if(ps_vui_hdr->u1_nal_hrd_parameters_present_flag)
2544*c83a76b0SSuyog Pawar     {
2545*c83a76b0SSuyog Pawar         u4_cpb_cnt = ps_vui_hdr->au1_cpb_cnt_minus1[0];
2546*c83a76b0SSuyog Pawar 
2547*c83a76b0SSuyog Pawar         for(i = 0; i <= u4_cpb_cnt; i++)
2548*c83a76b0SSuyog Pawar         {
2549*c83a76b0SSuyog Pawar             BITS_PARSE("nal_initial_cpb_removal_delay[i]",
2550*c83a76b0SSuyog Pawar                        value,
2551*c83a76b0SSuyog Pawar                        ps_bitstrm,
2552*c83a76b0SSuyog Pawar                        (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1
2553*c83a76b0SSuyog Pawar                                        + 1));
2554*c83a76b0SSuyog Pawar             ps_buf_period_sei_params->au4_nal_initial_cpb_removal_delay[i] =
2555*c83a76b0SSuyog Pawar                             value;
2556*c83a76b0SSuyog Pawar 
2557*c83a76b0SSuyog Pawar             BITS_PARSE("nal_initial_cpb_removal_delay_offset",
2558*c83a76b0SSuyog Pawar                        value,
2559*c83a76b0SSuyog Pawar                        ps_bitstrm,
2560*c83a76b0SSuyog Pawar                        (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1
2561*c83a76b0SSuyog Pawar                                        + 1));
2562*c83a76b0SSuyog Pawar             ps_buf_period_sei_params->au4_nal_initial_cpb_removal_delay_offset[i] =
2563*c83a76b0SSuyog Pawar                             value;
2564*c83a76b0SSuyog Pawar 
2565*c83a76b0SSuyog Pawar             if(ps_vui_hdr->u1_sub_pic_cpb_params_present_flag
2566*c83a76b0SSuyog Pawar                             || ps_buf_period_sei_params->u1_rap_cpb_params_present_flag)
2567*c83a76b0SSuyog Pawar             {
2568*c83a76b0SSuyog Pawar                 BITS_PARSE("nal_initial_alt_cpb_removal_delay[i]",
2569*c83a76b0SSuyog Pawar                            value,
2570*c83a76b0SSuyog Pawar                            ps_bitstrm,
2571*c83a76b0SSuyog Pawar                            (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1
2572*c83a76b0SSuyog Pawar                                            + 1));
2573*c83a76b0SSuyog Pawar                 ps_buf_period_sei_params->au4_nal_initial_alt_cpb_removal_delay[i] =
2574*c83a76b0SSuyog Pawar                                 value;
2575*c83a76b0SSuyog Pawar 
2576*c83a76b0SSuyog Pawar                 BITS_PARSE("nal_initial_alt_cpb_removal_delay_offset",
2577*c83a76b0SSuyog Pawar                            value,
2578*c83a76b0SSuyog Pawar                            ps_bitstrm,
2579*c83a76b0SSuyog Pawar                            (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1
2580*c83a76b0SSuyog Pawar                                            + 1));
2581*c83a76b0SSuyog Pawar                 ps_buf_period_sei_params->au4_nal_initial_alt_cpb_removal_delay_offset[i] =
2582*c83a76b0SSuyog Pawar                                 value;
2583*c83a76b0SSuyog Pawar             }
2584*c83a76b0SSuyog Pawar         }
2585*c83a76b0SSuyog Pawar     }
2586*c83a76b0SSuyog Pawar 
2587*c83a76b0SSuyog Pawar     if(ps_vui_hdr->u1_vcl_hrd_parameters_present_flag)
2588*c83a76b0SSuyog Pawar     {
2589*c83a76b0SSuyog Pawar         u4_cpb_cnt = ps_vui_hdr->au1_cpb_cnt_minus1[0];
2590*c83a76b0SSuyog Pawar 
2591*c83a76b0SSuyog Pawar         for(i = 0; i <= u4_cpb_cnt; i++)
2592*c83a76b0SSuyog Pawar         {
2593*c83a76b0SSuyog Pawar             BITS_PARSE("vcl_initial_cpb_removal_delay[i]",
2594*c83a76b0SSuyog Pawar                        value,
2595*c83a76b0SSuyog Pawar                        ps_bitstrm,
2596*c83a76b0SSuyog Pawar                        (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1
2597*c83a76b0SSuyog Pawar                                        + 1));
2598*c83a76b0SSuyog Pawar             ps_buf_period_sei_params->au4_vcl_initial_cpb_removal_delay[i] =
2599*c83a76b0SSuyog Pawar                             value;
2600*c83a76b0SSuyog Pawar 
2601*c83a76b0SSuyog Pawar             BITS_PARSE("vcl_initial_cpb_removal_delay_offset",
2602*c83a76b0SSuyog Pawar                        value,
2603*c83a76b0SSuyog Pawar                        ps_bitstrm,
2604*c83a76b0SSuyog Pawar                        (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1
2605*c83a76b0SSuyog Pawar                                        + 1));
2606*c83a76b0SSuyog Pawar             ps_buf_period_sei_params->au4_vcl_initial_cpb_removal_delay_offset[i] =
2607*c83a76b0SSuyog Pawar                             value;
2608*c83a76b0SSuyog Pawar 
2609*c83a76b0SSuyog Pawar             if(ps_vui_hdr->u1_sub_pic_cpb_params_present_flag
2610*c83a76b0SSuyog Pawar                             || ps_buf_period_sei_params->u1_rap_cpb_params_present_flag)
2611*c83a76b0SSuyog Pawar             {
2612*c83a76b0SSuyog Pawar                 BITS_PARSE("vcl_initial_alt_cpb_removal_delay[i]",
2613*c83a76b0SSuyog Pawar                            value,
2614*c83a76b0SSuyog Pawar                            ps_bitstrm,
2615*c83a76b0SSuyog Pawar                            (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1
2616*c83a76b0SSuyog Pawar                                            + 1));
2617*c83a76b0SSuyog Pawar                 ps_buf_period_sei_params->au4_vcl_initial_alt_cpb_removal_delay[i] =
2618*c83a76b0SSuyog Pawar                                 value;
2619*c83a76b0SSuyog Pawar 
2620*c83a76b0SSuyog Pawar                 BITS_PARSE("vcl_initial_alt_cpb_removal_delay_offset",
2621*c83a76b0SSuyog Pawar                            value,
2622*c83a76b0SSuyog Pawar                            ps_bitstrm,
2623*c83a76b0SSuyog Pawar                            (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1
2624*c83a76b0SSuyog Pawar                                            + 1));
2625*c83a76b0SSuyog Pawar                 ps_buf_period_sei_params->au4_vcl_initial_alt_cpb_removal_delay_offset[i] =
2626*c83a76b0SSuyog Pawar                                 value;
2627*c83a76b0SSuyog Pawar             }
2628*c83a76b0SSuyog Pawar         }
2629*c83a76b0SSuyog Pawar     }
2630*c83a76b0SSuyog Pawar 
2631*c83a76b0SSuyog Pawar     return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
2632*c83a76b0SSuyog Pawar }
2633*c83a76b0SSuyog Pawar 
ihevcd_parse_pic_timing_sei(codec_t * ps_codec,sps_t * ps_sps)2634*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_pic_timing_sei(codec_t *ps_codec, sps_t *ps_sps)
2635*c83a76b0SSuyog Pawar {
2636*c83a76b0SSuyog Pawar     parse_ctxt_t *ps_parse = &ps_codec->s_parse;
2637*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm;
2638*c83a76b0SSuyog Pawar     UWORD32 value;
2639*c83a76b0SSuyog Pawar     vui_t *ps_vui;
2640*c83a76b0SSuyog Pawar     UWORD32 i;
2641*c83a76b0SSuyog Pawar     hrd_params_t *ps_vui_hdr;
2642*c83a76b0SSuyog Pawar     UWORD32 u4_cpb_dpb_delays_present_flag = 0;
2643*c83a76b0SSuyog Pawar     pic_timing_sei_params_t *ps_pic_timing;
2644*c83a76b0SSuyog Pawar 
2645*c83a76b0SSuyog Pawar     ps_pic_timing = &ps_parse->s_sei_params.s_pic_timing_sei_params;
2646*c83a76b0SSuyog Pawar     ps_vui = &ps_sps->s_vui_parameters;
2647*c83a76b0SSuyog Pawar     ps_vui_hdr = &ps_vui->s_vui_hrd_parameters;
2648*c83a76b0SSuyog Pawar     ps_parse->s_sei_params.i1_pic_timing_params_present_flag = 1;
2649*c83a76b0SSuyog Pawar     if(ps_vui->u1_frame_field_info_present_flag)
2650*c83a76b0SSuyog Pawar     {
2651*c83a76b0SSuyog Pawar         BITS_PARSE("pic_struct", value, ps_bitstrm, 4);
2652*c83a76b0SSuyog Pawar         ps_pic_timing->u4_pic_struct = value;
2653*c83a76b0SSuyog Pawar 
2654*c83a76b0SSuyog Pawar         BITS_PARSE("source_scan_type", value, ps_bitstrm, 2);
2655*c83a76b0SSuyog Pawar         ps_pic_timing->u4_source_scan_type = value;
2656*c83a76b0SSuyog Pawar 
2657*c83a76b0SSuyog Pawar         BITS_PARSE("duplicate_flag", value, ps_bitstrm, 1);
2658*c83a76b0SSuyog Pawar         ps_pic_timing->u1_duplicate_flag = value;
2659*c83a76b0SSuyog Pawar     }
2660*c83a76b0SSuyog Pawar 
2661*c83a76b0SSuyog Pawar     if(ps_vui_hdr->u1_nal_hrd_parameters_present_flag
2662*c83a76b0SSuyog Pawar                     || ps_vui_hdr->u1_vcl_hrd_parameters_present_flag)
2663*c83a76b0SSuyog Pawar     {
2664*c83a76b0SSuyog Pawar         u4_cpb_dpb_delays_present_flag = 1;
2665*c83a76b0SSuyog Pawar     }
2666*c83a76b0SSuyog Pawar     else
2667*c83a76b0SSuyog Pawar     {
2668*c83a76b0SSuyog Pawar         u4_cpb_dpb_delays_present_flag = 0;
2669*c83a76b0SSuyog Pawar     }
2670*c83a76b0SSuyog Pawar 
2671*c83a76b0SSuyog Pawar     if(u4_cpb_dpb_delays_present_flag)
2672*c83a76b0SSuyog Pawar     {
2673*c83a76b0SSuyog Pawar         BITS_PARSE("au_cpb_removal_delay_minus1", value, ps_bitstrm,
2674*c83a76b0SSuyog Pawar                    (ps_vui_hdr->u1_au_cpb_removal_delay_length_minus1 + 1));
2675*c83a76b0SSuyog Pawar         ps_pic_timing->u4_au_cpb_removal_delay_minus1 = value;
2676*c83a76b0SSuyog Pawar 
2677*c83a76b0SSuyog Pawar         BITS_PARSE("pic_dpb_output_delay", value, ps_bitstrm,
2678*c83a76b0SSuyog Pawar                    (ps_vui_hdr->u1_dpb_output_delay_length_minus1 + 1));
2679*c83a76b0SSuyog Pawar         ps_pic_timing->u4_pic_dpb_output_delay = value;
2680*c83a76b0SSuyog Pawar 
2681*c83a76b0SSuyog Pawar         if(ps_vui_hdr->u1_sub_pic_cpb_params_present_flag)
2682*c83a76b0SSuyog Pawar         {
2683*c83a76b0SSuyog Pawar             BITS_PARSE("pic_dpb_output_du_delay", value, ps_bitstrm,
2684*c83a76b0SSuyog Pawar                        (ps_vui_hdr->u1_dpb_output_delay_du_length_minus1 + 1));
2685*c83a76b0SSuyog Pawar             ps_pic_timing->u4_pic_dpb_output_du_delay = value;
2686*c83a76b0SSuyog Pawar         }
2687*c83a76b0SSuyog Pawar 
2688*c83a76b0SSuyog Pawar         if(ps_vui_hdr->u1_sub_pic_cpb_params_present_flag
2689*c83a76b0SSuyog Pawar                         && ps_vui_hdr->u1_sub_pic_cpb_params_in_pic_timing_sei_flag)
2690*c83a76b0SSuyog Pawar         {
2691*c83a76b0SSuyog Pawar             UWORD32 num_units_minus1;
2692*c83a76b0SSuyog Pawar             UWORD32 array_size;
2693*c83a76b0SSuyog Pawar 
2694*c83a76b0SSuyog Pawar             UEV_PARSE("num_decoding_units_minus1", value, ps_bitstrm);
2695*c83a76b0SSuyog Pawar             if(value > (ps_sps->i4_pic_size_in_ctb -1))
2696*c83a76b0SSuyog Pawar             {
2697*c83a76b0SSuyog Pawar                 return IHEVCD_INVALID_PARAMETER;
2698*c83a76b0SSuyog Pawar             }
2699*c83a76b0SSuyog Pawar             ps_pic_timing->u4_num_decoding_units_minus1 = value;
2700*c83a76b0SSuyog Pawar 
2701*c83a76b0SSuyog Pawar             num_units_minus1 = ps_pic_timing->u4_num_decoding_units_minus1;
2702*c83a76b0SSuyog Pawar             array_size = (sizeof(ps_pic_timing->au4_num_nalus_in_du_minus1)
2703*c83a76b0SSuyog Pawar                        / sizeof(ps_pic_timing->au4_num_nalus_in_du_minus1[0]));
2704*c83a76b0SSuyog Pawar             num_units_minus1 = CLIP3(num_units_minus1, 0,(array_size - 1));
2705*c83a76b0SSuyog Pawar             ps_pic_timing->u4_num_decoding_units_minus1 = num_units_minus1;
2706*c83a76b0SSuyog Pawar 
2707*c83a76b0SSuyog Pawar             BITS_PARSE("du_common_cpb_removal_delay_flag", value, ps_bitstrm, 1);
2708*c83a76b0SSuyog Pawar             ps_pic_timing->u1_du_common_cpb_removal_delay_flag = value;
2709*c83a76b0SSuyog Pawar 
2710*c83a76b0SSuyog Pawar             if(ps_pic_timing->u1_du_common_cpb_removal_delay_flag)
2711*c83a76b0SSuyog Pawar             {
2712*c83a76b0SSuyog Pawar                 BITS_PARSE("du_common_cpb_removal_delay_increment_minus1",
2713*c83a76b0SSuyog Pawar                            value,
2714*c83a76b0SSuyog Pawar                            ps_bitstrm,
2715*c83a76b0SSuyog Pawar                            (ps_vui_hdr->u1_du_cpb_removal_delay_increment_length_minus1
2716*c83a76b0SSuyog Pawar                                            + 1));
2717*c83a76b0SSuyog Pawar                 ps_pic_timing->u4_du_common_cpb_removal_delay_increment_minus1 =
2718*c83a76b0SSuyog Pawar                                 value;
2719*c83a76b0SSuyog Pawar             }
2720*c83a76b0SSuyog Pawar 
2721*c83a76b0SSuyog Pawar             for(i = 0; i <= ps_pic_timing->u4_num_decoding_units_minus1; i++)
2722*c83a76b0SSuyog Pawar             {
2723*c83a76b0SSuyog Pawar                 UEV_PARSE("num_nalus_in_du_minus1", value, ps_bitstrm);
2724*c83a76b0SSuyog Pawar                 if(value > (ps_sps->i4_pic_size_in_ctb -1))
2725*c83a76b0SSuyog Pawar                 {
2726*c83a76b0SSuyog Pawar                     return IHEVCD_INVALID_PARAMETER;
2727*c83a76b0SSuyog Pawar                 }
2728*c83a76b0SSuyog Pawar                 ps_pic_timing->au4_num_nalus_in_du_minus1[i] = value;
2729*c83a76b0SSuyog Pawar 
2730*c83a76b0SSuyog Pawar                 if((!ps_pic_timing->u1_du_common_cpb_removal_delay_flag)
2731*c83a76b0SSuyog Pawar                                 && (i < ps_pic_timing->u4_num_decoding_units_minus1))
2732*c83a76b0SSuyog Pawar                 {
2733*c83a76b0SSuyog Pawar                     BITS_PARSE("du_common_cpb_removal_delay_increment_minus1",
2734*c83a76b0SSuyog Pawar                                value,
2735*c83a76b0SSuyog Pawar                                ps_bitstrm,
2736*c83a76b0SSuyog Pawar                                (ps_vui_hdr->u1_du_cpb_removal_delay_increment_length_minus1
2737*c83a76b0SSuyog Pawar                                                + 1));
2738*c83a76b0SSuyog Pawar                     ps_pic_timing->au4_du_cpb_removal_delay_increment_minus1[i] =
2739*c83a76b0SSuyog Pawar                                     value;
2740*c83a76b0SSuyog Pawar                 }
2741*c83a76b0SSuyog Pawar             }
2742*c83a76b0SSuyog Pawar         }
2743*c83a76b0SSuyog Pawar     }
2744*c83a76b0SSuyog Pawar 
2745*c83a76b0SSuyog Pawar     return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
2746*c83a76b0SSuyog Pawar }
2747*c83a76b0SSuyog Pawar 
ihevcd_parse_time_code_sei(codec_t * ps_codec)2748*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_time_code_sei(codec_t *ps_codec)
2749*c83a76b0SSuyog Pawar {
2750*c83a76b0SSuyog Pawar     parse_ctxt_t *ps_parse = &ps_codec->s_parse;
2751*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm;
2752*c83a76b0SSuyog Pawar     UWORD32 value;
2753*c83a76b0SSuyog Pawar     time_code_t *ps_time_code;
2754*c83a76b0SSuyog Pawar     WORD32 i;
2755*c83a76b0SSuyog Pawar 
2756*c83a76b0SSuyog Pawar     ps_parse->s_sei_params.i1_time_code_present_flag = 1;
2757*c83a76b0SSuyog Pawar     ps_time_code = &ps_parse->s_sei_params.s_time_code;
2758*c83a76b0SSuyog Pawar 
2759*c83a76b0SSuyog Pawar     BITS_PARSE("num_clock_ts", value, ps_bitstrm, 2);
2760*c83a76b0SSuyog Pawar     ps_time_code->u1_num_clock_ts = value;
2761*c83a76b0SSuyog Pawar 
2762*c83a76b0SSuyog Pawar     for(i = 0; i < ps_time_code->u1_num_clock_ts; i++)
2763*c83a76b0SSuyog Pawar     {
2764*c83a76b0SSuyog Pawar         BITS_PARSE("clock_timestamp_flag[i]", value, ps_bitstrm, 1);
2765*c83a76b0SSuyog Pawar         ps_time_code->au1_clock_timestamp_flag[i] = value;
2766*c83a76b0SSuyog Pawar 
2767*c83a76b0SSuyog Pawar         if(ps_time_code->au1_clock_timestamp_flag[i])
2768*c83a76b0SSuyog Pawar         {
2769*c83a76b0SSuyog Pawar             BITS_PARSE("units_field_based_flag[i]", value, ps_bitstrm, 1);
2770*c83a76b0SSuyog Pawar             ps_time_code->au1_units_field_based_flag[i] = value;
2771*c83a76b0SSuyog Pawar 
2772*c83a76b0SSuyog Pawar             BITS_PARSE("counting_type[i]", value, ps_bitstrm, 5);
2773*c83a76b0SSuyog Pawar             ps_time_code->au1_counting_type[i] = value;
2774*c83a76b0SSuyog Pawar 
2775*c83a76b0SSuyog Pawar             BITS_PARSE("full_timestamp_flag[i]", value, ps_bitstrm, 1);
2776*c83a76b0SSuyog Pawar             ps_time_code->au1_full_timestamp_flag[i] = value;
2777*c83a76b0SSuyog Pawar 
2778*c83a76b0SSuyog Pawar             BITS_PARSE("discontinuity_flag[i]", value, ps_bitstrm, 1);
2779*c83a76b0SSuyog Pawar             ps_time_code->au1_discontinuity_flag[i] = value;
2780*c83a76b0SSuyog Pawar 
2781*c83a76b0SSuyog Pawar             BITS_PARSE("cnt_dropped_flag[i]", value, ps_bitstrm, 1);
2782*c83a76b0SSuyog Pawar             ps_time_code->au1_cnt_dropped_flag[i] = value;
2783*c83a76b0SSuyog Pawar 
2784*c83a76b0SSuyog Pawar             BITS_PARSE("n_frames[i]", value, ps_bitstrm, 9);
2785*c83a76b0SSuyog Pawar             ps_time_code->au2_n_frames[i] = value;
2786*c83a76b0SSuyog Pawar 
2787*c83a76b0SSuyog Pawar             if(ps_time_code->au1_full_timestamp_flag[i])
2788*c83a76b0SSuyog Pawar             {
2789*c83a76b0SSuyog Pawar                 BITS_PARSE("seconds_value[i]", value, ps_bitstrm, 6);
2790*c83a76b0SSuyog Pawar                 ps_time_code->au1_seconds_value[i] = value;
2791*c83a76b0SSuyog Pawar 
2792*c83a76b0SSuyog Pawar                 BITS_PARSE("minutes_value[i]", value, ps_bitstrm, 6);
2793*c83a76b0SSuyog Pawar                 ps_time_code->au1_minutes_value[i] = value;
2794*c83a76b0SSuyog Pawar 
2795*c83a76b0SSuyog Pawar                 BITS_PARSE("hours_value[i]", value, ps_bitstrm, 5);
2796*c83a76b0SSuyog Pawar                 ps_time_code->au1_hours_value[i] = value;
2797*c83a76b0SSuyog Pawar             }
2798*c83a76b0SSuyog Pawar             else
2799*c83a76b0SSuyog Pawar             {
2800*c83a76b0SSuyog Pawar                 BITS_PARSE("seconds_flag[i]", value, ps_bitstrm, 1);
2801*c83a76b0SSuyog Pawar                 ps_time_code->au1_seconds_flag[i] = value;
2802*c83a76b0SSuyog Pawar 
2803*c83a76b0SSuyog Pawar                 if(ps_time_code->au1_seconds_flag[i])
2804*c83a76b0SSuyog Pawar                 {
2805*c83a76b0SSuyog Pawar                     BITS_PARSE("seconds_value[i]", value, ps_bitstrm, 6);
2806*c83a76b0SSuyog Pawar                     ps_time_code->au1_seconds_value[i] = value;
2807*c83a76b0SSuyog Pawar 
2808*c83a76b0SSuyog Pawar                     BITS_PARSE("minutes_flag[i]", value, ps_bitstrm, 1);
2809*c83a76b0SSuyog Pawar                     ps_time_code->au1_minutes_flag[i] = value;
2810*c83a76b0SSuyog Pawar 
2811*c83a76b0SSuyog Pawar                     if(ps_time_code->au1_minutes_flag[i])
2812*c83a76b0SSuyog Pawar                     {
2813*c83a76b0SSuyog Pawar                         BITS_PARSE("minutes_value[i]", value, ps_bitstrm, 6);
2814*c83a76b0SSuyog Pawar                         ps_time_code->au1_minutes_value[i] = value;
2815*c83a76b0SSuyog Pawar 
2816*c83a76b0SSuyog Pawar                         BITS_PARSE("hours_flag[i]", value, ps_bitstrm, 1);
2817*c83a76b0SSuyog Pawar                         ps_time_code->au1_hours_flag[i] = value;
2818*c83a76b0SSuyog Pawar 
2819*c83a76b0SSuyog Pawar                         if(ps_time_code->au1_hours_flag[i])
2820*c83a76b0SSuyog Pawar                         {
2821*c83a76b0SSuyog Pawar                             BITS_PARSE("hours_value[i]", value, ps_bitstrm, 5);
2822*c83a76b0SSuyog Pawar                             ps_time_code->au1_hours_value[i] = value;
2823*c83a76b0SSuyog Pawar                         }
2824*c83a76b0SSuyog Pawar                     }
2825*c83a76b0SSuyog Pawar                 }
2826*c83a76b0SSuyog Pawar             }
2827*c83a76b0SSuyog Pawar 
2828*c83a76b0SSuyog Pawar             BITS_PARSE("time_offset_length[i]", value, ps_bitstrm, 5);
2829*c83a76b0SSuyog Pawar             ps_time_code->au1_time_offset_length[i] = value;
2830*c83a76b0SSuyog Pawar 
2831*c83a76b0SSuyog Pawar             if(ps_time_code->au1_time_offset_length[i] > 0)
2832*c83a76b0SSuyog Pawar             {
2833*c83a76b0SSuyog Pawar                 BITS_PARSE("time_offset_value[i]", value, ps_bitstrm,
2834*c83a76b0SSuyog Pawar                            ps_time_code->au1_time_offset_length[i]);
2835*c83a76b0SSuyog Pawar                 ps_time_code->au1_time_offset_value[i] = value;
2836*c83a76b0SSuyog Pawar             }
2837*c83a76b0SSuyog Pawar             else
2838*c83a76b0SSuyog Pawar             {
2839*c83a76b0SSuyog Pawar                 ps_time_code->au1_time_offset_value[i] = 0;
2840*c83a76b0SSuyog Pawar             }
2841*c83a76b0SSuyog Pawar         }
2842*c83a76b0SSuyog Pawar     }
2843*c83a76b0SSuyog Pawar 
2844*c83a76b0SSuyog Pawar     return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
2845*c83a76b0SSuyog Pawar }
2846*c83a76b0SSuyog Pawar 
ihevcd_parse_mastering_disp_params_sei(codec_t * ps_codec)2847*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_mastering_disp_params_sei(codec_t *ps_codec)
2848*c83a76b0SSuyog Pawar {
2849*c83a76b0SSuyog Pawar     parse_ctxt_t *ps_parse = &ps_codec->s_parse;
2850*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm;
2851*c83a76b0SSuyog Pawar     UWORD32 value;
2852*c83a76b0SSuyog Pawar     mastering_dis_col_vol_sei_params_t *ps_mastering_dis_col_vol;
2853*c83a76b0SSuyog Pawar     WORD32 i;
2854*c83a76b0SSuyog Pawar 
2855*c83a76b0SSuyog Pawar     ps_parse->s_sei_params.i4_sei_mastering_disp_colour_vol_params_present_flags = 1;
2856*c83a76b0SSuyog Pawar 
2857*c83a76b0SSuyog Pawar     ps_mastering_dis_col_vol = &ps_parse->s_sei_params.s_mastering_dis_col_vol_sei_params;
2858*c83a76b0SSuyog Pawar 
2859*c83a76b0SSuyog Pawar     for(i = 0; i < 3; i++)
2860*c83a76b0SSuyog Pawar     {
2861*c83a76b0SSuyog Pawar         BITS_PARSE("display_primaries_x[c]", value, ps_bitstrm, 16);
2862*c83a76b0SSuyog Pawar         ps_mastering_dis_col_vol->au2_display_primaries_x[i] = value;
2863*c83a76b0SSuyog Pawar 
2864*c83a76b0SSuyog Pawar         BITS_PARSE("display_primaries_y[c]", value, ps_bitstrm, 16);
2865*c83a76b0SSuyog Pawar         ps_mastering_dis_col_vol->au2_display_primaries_y[i] = value;
2866*c83a76b0SSuyog Pawar     }
2867*c83a76b0SSuyog Pawar 
2868*c83a76b0SSuyog Pawar     BITS_PARSE("white_point_x", value, ps_bitstrm, 16);
2869*c83a76b0SSuyog Pawar     ps_mastering_dis_col_vol->u2_white_point_x = value;
2870*c83a76b0SSuyog Pawar 
2871*c83a76b0SSuyog Pawar     BITS_PARSE("white_point_y", value, ps_bitstrm, 16);
2872*c83a76b0SSuyog Pawar     ps_mastering_dis_col_vol->u2_white_point_y = value;
2873*c83a76b0SSuyog Pawar 
2874*c83a76b0SSuyog Pawar     BITS_PARSE("max_display_mastering_luminance", value, ps_bitstrm, 32);
2875*c83a76b0SSuyog Pawar     ps_mastering_dis_col_vol->u4_max_display_mastering_luminance = value;
2876*c83a76b0SSuyog Pawar 
2877*c83a76b0SSuyog Pawar     BITS_PARSE("min_display_mastering_luminance", value, ps_bitstrm, 32);
2878*c83a76b0SSuyog Pawar     ps_mastering_dis_col_vol->u4_min_display_mastering_luminance = value;
2879*c83a76b0SSuyog Pawar 
2880*c83a76b0SSuyog Pawar     return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
2881*c83a76b0SSuyog Pawar }
2882*c83a76b0SSuyog Pawar 
ihevcd_parse_user_data_registered_itu_t_t35(codec_t * ps_codec,UWORD32 u4_payload_size)2883*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_user_data_registered_itu_t_t35(codec_t *ps_codec,
2884*c83a76b0SSuyog Pawar                                                            UWORD32 u4_payload_size)
2885*c83a76b0SSuyog Pawar {
2886*c83a76b0SSuyog Pawar     parse_ctxt_t *ps_parse = &ps_codec->s_parse;
2887*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm;
2888*c83a76b0SSuyog Pawar     UWORD32 value;
2889*c83a76b0SSuyog Pawar     user_data_registered_itu_t_t35_t *ps_user_data_registered_itu_t_t35;
2890*c83a76b0SSuyog Pawar     UWORD32 i;
2891*c83a76b0SSuyog Pawar     UWORD32 j = 0;
2892*c83a76b0SSuyog Pawar 
2893*c83a76b0SSuyog Pawar     ps_parse->s_sei_params.i1_user_data_registered_present_flag = 1;
2894*c83a76b0SSuyog Pawar     ps_user_data_registered_itu_t_t35 =
2895*c83a76b0SSuyog Pawar                     &ps_parse->s_sei_params.as_user_data_registered_itu_t_t35[ps_parse->s_sei_params.i4_sei_user_data_cnt];
2896*c83a76b0SSuyog Pawar     ps_parse->s_sei_params.i4_sei_user_data_cnt++;
2897*c83a76b0SSuyog Pawar 
2898*c83a76b0SSuyog Pawar     ps_user_data_registered_itu_t_t35->i4_payload_size = u4_payload_size;
2899*c83a76b0SSuyog Pawar 
2900*c83a76b0SSuyog Pawar     if(u4_payload_size > MAX_USERDATA_PAYLOAD)
2901*c83a76b0SSuyog Pawar     {
2902*c83a76b0SSuyog Pawar         u4_payload_size = MAX_USERDATA_PAYLOAD;
2903*c83a76b0SSuyog Pawar     }
2904*c83a76b0SSuyog Pawar 
2905*c83a76b0SSuyog Pawar     ps_user_data_registered_itu_t_t35->i4_valid_payload_size = u4_payload_size;
2906*c83a76b0SSuyog Pawar 
2907*c83a76b0SSuyog Pawar     BITS_PARSE("itu_t_t35_country_code", value, ps_bitstrm, 8);
2908*c83a76b0SSuyog Pawar     ps_user_data_registered_itu_t_t35->u1_itu_t_t35_country_code = value;
2909*c83a76b0SSuyog Pawar 
2910*c83a76b0SSuyog Pawar     if(0xFF != ps_user_data_registered_itu_t_t35->u1_itu_t_t35_country_code)
2911*c83a76b0SSuyog Pawar     {
2912*c83a76b0SSuyog Pawar         i = 1;
2913*c83a76b0SSuyog Pawar     }
2914*c83a76b0SSuyog Pawar     else
2915*c83a76b0SSuyog Pawar     {
2916*c83a76b0SSuyog Pawar         BITS_PARSE("itu_t_t35_country_code_extension_byte", value, ps_bitstrm,
2917*c83a76b0SSuyog Pawar                    8);
2918*c83a76b0SSuyog Pawar         ps_user_data_registered_itu_t_t35->u1_itu_t_t35_country_code_extension_byte =
2919*c83a76b0SSuyog Pawar                         value;
2920*c83a76b0SSuyog Pawar 
2921*c83a76b0SSuyog Pawar         i = 2;
2922*c83a76b0SSuyog Pawar     }
2923*c83a76b0SSuyog Pawar 
2924*c83a76b0SSuyog Pawar     do
2925*c83a76b0SSuyog Pawar     {
2926*c83a76b0SSuyog Pawar         BITS_PARSE("itu_t_t35_payload_byte", value, ps_bitstrm, 8);
2927*c83a76b0SSuyog Pawar         ps_user_data_registered_itu_t_t35->u1_itu_t_t35_payload_byte[j++] =
2928*c83a76b0SSuyog Pawar                         value;
2929*c83a76b0SSuyog Pawar 
2930*c83a76b0SSuyog Pawar         i++;
2931*c83a76b0SSuyog Pawar     }while(i < u4_payload_size);
2932*c83a76b0SSuyog Pawar 
2933*c83a76b0SSuyog Pawar     return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
2934*c83a76b0SSuyog Pawar }
2935*c83a76b0SSuyog Pawar 
ihevcd_parse_sei_payload(codec_t * ps_codec,UWORD32 u4_payload_type,UWORD32 u4_payload_size,WORD8 i1_nal_type)2936*c83a76b0SSuyog Pawar void ihevcd_parse_sei_payload(codec_t *ps_codec,
2937*c83a76b0SSuyog Pawar                               UWORD32 u4_payload_type,
2938*c83a76b0SSuyog Pawar                               UWORD32 u4_payload_size,
2939*c83a76b0SSuyog Pawar                               WORD8 i1_nal_type)
2940*c83a76b0SSuyog Pawar {
2941*c83a76b0SSuyog Pawar     parse_ctxt_t *ps_parse = &ps_codec->s_parse;
2942*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm;
2943*c83a76b0SSuyog Pawar     WORD32 payload_bits_remaining = 0;
2944*c83a76b0SSuyog Pawar     sps_t *ps_sps;
2945*c83a76b0SSuyog Pawar 
2946*c83a76b0SSuyog Pawar     UWORD32 i;
2947*c83a76b0SSuyog Pawar 
2948*c83a76b0SSuyog Pawar     for(i = 0; i < MAX_SPS_CNT; i++)
2949*c83a76b0SSuyog Pawar     {
2950*c83a76b0SSuyog Pawar         ps_sps = ps_codec->ps_sps_base + i;
2951*c83a76b0SSuyog Pawar         if(ps_sps->i1_sps_valid)
2952*c83a76b0SSuyog Pawar         {
2953*c83a76b0SSuyog Pawar             break;
2954*c83a76b0SSuyog Pawar         }
2955*c83a76b0SSuyog Pawar     }
2956*c83a76b0SSuyog Pawar     if(!ps_sps->i1_sps_valid)
2957*c83a76b0SSuyog Pawar     {
2958*c83a76b0SSuyog Pawar         return;
2959*c83a76b0SSuyog Pawar     }
2960*c83a76b0SSuyog Pawar 
2961*c83a76b0SSuyog Pawar     if(NAL_PREFIX_SEI == i1_nal_type)
2962*c83a76b0SSuyog Pawar     {
2963*c83a76b0SSuyog Pawar         switch(u4_payload_type)
2964*c83a76b0SSuyog Pawar         {
2965*c83a76b0SSuyog Pawar             case SEI_BUFFERING_PERIOD:
2966*c83a76b0SSuyog Pawar                 ps_parse->s_sei_params.i1_sei_parameters_present_flag = 1;
2967*c83a76b0SSuyog Pawar                 ihevcd_parse_buffering_period_sei(ps_codec, ps_sps);
2968*c83a76b0SSuyog Pawar                 break;
2969*c83a76b0SSuyog Pawar 
2970*c83a76b0SSuyog Pawar             case SEI_PICTURE_TIMING:
2971*c83a76b0SSuyog Pawar                 ps_parse->s_sei_params.i1_sei_parameters_present_flag = 1;
2972*c83a76b0SSuyog Pawar                 ihevcd_parse_pic_timing_sei(ps_codec, ps_sps);
2973*c83a76b0SSuyog Pawar                 break;
2974*c83a76b0SSuyog Pawar 
2975*c83a76b0SSuyog Pawar             case SEI_TIME_CODE:
2976*c83a76b0SSuyog Pawar                 ps_parse->s_sei_params.i1_sei_parameters_present_flag = 1;
2977*c83a76b0SSuyog Pawar                 ihevcd_parse_time_code_sei(ps_codec);
2978*c83a76b0SSuyog Pawar                 break;
2979*c83a76b0SSuyog Pawar 
2980*c83a76b0SSuyog Pawar             case SEI_MASTERING_DISPLAY_COLOUR_VOLUME:
2981*c83a76b0SSuyog Pawar                 ps_parse->s_sei_params.i4_sei_mastering_disp_colour_vol_params_present_flags = 1;
2982*c83a76b0SSuyog Pawar                 ihevcd_parse_mastering_disp_params_sei(ps_codec);
2983*c83a76b0SSuyog Pawar                 break;
2984*c83a76b0SSuyog Pawar 
2985*c83a76b0SSuyog Pawar             case SEI_USER_DATA_REGISTERED_ITU_T_T35:
2986*c83a76b0SSuyog Pawar                 ps_parse->s_sei_params.i1_sei_parameters_present_flag = 1;
2987*c83a76b0SSuyog Pawar                 if(ps_parse->s_sei_params.i4_sei_user_data_cnt >= USER_DATA_MAX)
2988*c83a76b0SSuyog Pawar                 {
2989*c83a76b0SSuyog Pawar                     for(i = 0; i < u4_payload_size / 4; i++)
2990*c83a76b0SSuyog Pawar                     {
2991*c83a76b0SSuyog Pawar                         ihevcd_bits_flush(ps_bitstrm, 4 * 8);
2992*c83a76b0SSuyog Pawar                     }
2993*c83a76b0SSuyog Pawar 
2994*c83a76b0SSuyog Pawar                     ihevcd_bits_flush(ps_bitstrm, (u4_payload_size - i * 4) * 8);
2995*c83a76b0SSuyog Pawar                 }
2996*c83a76b0SSuyog Pawar                 else
2997*c83a76b0SSuyog Pawar                 {
2998*c83a76b0SSuyog Pawar                     ihevcd_parse_user_data_registered_itu_t_t35(ps_codec,
2999*c83a76b0SSuyog Pawar                                                                 u4_payload_size);
3000*c83a76b0SSuyog Pawar                 }
3001*c83a76b0SSuyog Pawar                 break;
3002*c83a76b0SSuyog Pawar 
3003*c83a76b0SSuyog Pawar             default:
3004*c83a76b0SSuyog Pawar                 for(i = 0; i < u4_payload_size; i++)
3005*c83a76b0SSuyog Pawar                 {
3006*c83a76b0SSuyog Pawar                     ihevcd_bits_flush(ps_bitstrm, 8);
3007*c83a76b0SSuyog Pawar                 }
3008*c83a76b0SSuyog Pawar                 break;
3009*c83a76b0SSuyog Pawar         }
3010*c83a76b0SSuyog Pawar     }
3011*c83a76b0SSuyog Pawar     else /* NAL_SUFFIX_SEI */
3012*c83a76b0SSuyog Pawar     {
3013*c83a76b0SSuyog Pawar         switch(u4_payload_type)
3014*c83a76b0SSuyog Pawar         {
3015*c83a76b0SSuyog Pawar             case SEI_USER_DATA_REGISTERED_ITU_T_T35:
3016*c83a76b0SSuyog Pawar                 ps_parse->s_sei_params.i1_sei_parameters_present_flag = 1;
3017*c83a76b0SSuyog Pawar                 if(ps_parse->s_sei_params.i4_sei_user_data_cnt >= USER_DATA_MAX)
3018*c83a76b0SSuyog Pawar                 {
3019*c83a76b0SSuyog Pawar                     for(i = 0; i < u4_payload_size / 4; i++)
3020*c83a76b0SSuyog Pawar                     {
3021*c83a76b0SSuyog Pawar                         ihevcd_bits_flush(ps_bitstrm, 4 * 8);
3022*c83a76b0SSuyog Pawar                     }
3023*c83a76b0SSuyog Pawar 
3024*c83a76b0SSuyog Pawar                     ihevcd_bits_flush(ps_bitstrm, (u4_payload_size - i * 4) * 8);
3025*c83a76b0SSuyog Pawar                 }
3026*c83a76b0SSuyog Pawar                 else
3027*c83a76b0SSuyog Pawar                 {
3028*c83a76b0SSuyog Pawar                     ihevcd_parse_user_data_registered_itu_t_t35(ps_codec,
3029*c83a76b0SSuyog Pawar                                                                 u4_payload_size);
3030*c83a76b0SSuyog Pawar                 }
3031*c83a76b0SSuyog Pawar                 break;
3032*c83a76b0SSuyog Pawar 
3033*c83a76b0SSuyog Pawar             default:
3034*c83a76b0SSuyog Pawar                 for(i = 0; i < u4_payload_size; i++)
3035*c83a76b0SSuyog Pawar                 {
3036*c83a76b0SSuyog Pawar                     ihevcd_bits_flush(ps_bitstrm, 8);
3037*c83a76b0SSuyog Pawar                 }
3038*c83a76b0SSuyog Pawar                 break;
3039*c83a76b0SSuyog Pawar         }
3040*c83a76b0SSuyog Pawar     }
3041*c83a76b0SSuyog Pawar 
3042*c83a76b0SSuyog Pawar     /**
3043*c83a76b0SSuyog Pawar      * By definition the underlying bitstream terminates in a byte-aligned manner.
3044*c83a76b0SSuyog Pawar      * 1. Extract all bar the last MIN(bitsremaining,nine) bits as reserved_payload_extension_data
3045*c83a76b0SSuyog Pawar      * 2. Examine the final 8 bits to determine the payload_bit_equal_to_one marker
3046*c83a76b0SSuyog Pawar      * 3. Extract the remainingreserved_payload_extension_data bits.
3047*c83a76b0SSuyog Pawar      *
3048*c83a76b0SSuyog Pawar      * If there are fewer than 9 bits available, extract them.
3049*c83a76b0SSuyog Pawar      */
3050*c83a76b0SSuyog Pawar 
3051*c83a76b0SSuyog Pawar     payload_bits_remaining = ihevcd_bits_num_bits_remaining(ps_bitstrm);
3052*c83a76b0SSuyog Pawar     if(payload_bits_remaining) /* more_data_in_payload() */
3053*c83a76b0SSuyog Pawar     {
3054*c83a76b0SSuyog Pawar         WORD32 final_bits;
3055*c83a76b0SSuyog Pawar         WORD32 final_payload_bits = 0;
3056*c83a76b0SSuyog Pawar         WORD32 mask = 0xFF;
3057*c83a76b0SSuyog Pawar         UWORD32 u4_dummy;
3058*c83a76b0SSuyog Pawar         UWORD32 u4_reserved_payload_extension_data;
3059*c83a76b0SSuyog Pawar         UNUSED(u4_dummy);
3060*c83a76b0SSuyog Pawar         UNUSED(u4_reserved_payload_extension_data);
3061*c83a76b0SSuyog Pawar 
3062*c83a76b0SSuyog Pawar         while(payload_bits_remaining > 9)
3063*c83a76b0SSuyog Pawar         {
3064*c83a76b0SSuyog Pawar             BITS_PARSE("reserved_payload_extension_data",
3065*c83a76b0SSuyog Pawar                        u4_reserved_payload_extension_data, ps_bitstrm, 1);
3066*c83a76b0SSuyog Pawar             payload_bits_remaining--;
3067*c83a76b0SSuyog Pawar         }
3068*c83a76b0SSuyog Pawar 
3069*c83a76b0SSuyog Pawar         final_bits = ihevcd_bits_nxt(ps_bitstrm, payload_bits_remaining);
3070*c83a76b0SSuyog Pawar 
3071*c83a76b0SSuyog Pawar         while(final_bits & (mask >> final_payload_bits))
3072*c83a76b0SSuyog Pawar         {
3073*c83a76b0SSuyog Pawar             final_payload_bits++;
3074*c83a76b0SSuyog Pawar             continue;
3075*c83a76b0SSuyog Pawar         }
3076*c83a76b0SSuyog Pawar 
3077*c83a76b0SSuyog Pawar         while(payload_bits_remaining > (9 - final_payload_bits))
3078*c83a76b0SSuyog Pawar         {
3079*c83a76b0SSuyog Pawar             BITS_PARSE("reserved_payload_extension_data",
3080*c83a76b0SSuyog Pawar                        u4_reserved_payload_extension_data, ps_bitstrm, 1);
3081*c83a76b0SSuyog Pawar             payload_bits_remaining--;
3082*c83a76b0SSuyog Pawar         }
3083*c83a76b0SSuyog Pawar 
3084*c83a76b0SSuyog Pawar         BITS_PARSE("payload_bit_equal_to_one", u4_dummy, ps_bitstrm, 1);
3085*c83a76b0SSuyog Pawar         payload_bits_remaining--;
3086*c83a76b0SSuyog Pawar         while(payload_bits_remaining)
3087*c83a76b0SSuyog Pawar         {
3088*c83a76b0SSuyog Pawar             BITS_PARSE("payload_bit_equal_to_zero", u4_dummy, ps_bitstrm, 1);
3089*c83a76b0SSuyog Pawar             payload_bits_remaining--;
3090*c83a76b0SSuyog Pawar         }
3091*c83a76b0SSuyog Pawar     }
3092*c83a76b0SSuyog Pawar 
3093*c83a76b0SSuyog Pawar     return;
3094*c83a76b0SSuyog Pawar }
3095*c83a76b0SSuyog Pawar 
ihevcd_read_rbsp_trailing_bits(codec_t * ps_codec,UWORD32 u4_bits_left)3096*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_read_rbsp_trailing_bits(codec_t *ps_codec,
3097*c83a76b0SSuyog Pawar                                               UWORD32 u4_bits_left)
3098*c83a76b0SSuyog Pawar {
3099*c83a76b0SSuyog Pawar     parse_ctxt_t *ps_parse = &ps_codec->s_parse;
3100*c83a76b0SSuyog Pawar     UWORD32 value;
3101*c83a76b0SSuyog Pawar     WORD32 cnt = 0;
3102*c83a76b0SSuyog Pawar     BITS_PARSE("rbsp_stop_one_bit", value, &ps_parse->s_bitstrm, 1);
3103*c83a76b0SSuyog Pawar     u4_bits_left--;
3104*c83a76b0SSuyog Pawar     if(value != 1)
3105*c83a76b0SSuyog Pawar     {
3106*c83a76b0SSuyog Pawar         return (IHEVCD_ERROR_T)IHEVCD_FAIL;
3107*c83a76b0SSuyog Pawar     }
3108*c83a76b0SSuyog Pawar     while(u4_bits_left)
3109*c83a76b0SSuyog Pawar     {
3110*c83a76b0SSuyog Pawar         BITS_PARSE("rbsp_alignment_zero_bit", value, &ps_parse->s_bitstrm, 1);
3111*c83a76b0SSuyog Pawar         u4_bits_left--;
3112*c83a76b0SSuyog Pawar         cnt++;
3113*c83a76b0SSuyog Pawar     }
3114*c83a76b0SSuyog Pawar     ASSERT(cnt < 8);
3115*c83a76b0SSuyog Pawar 
3116*c83a76b0SSuyog Pawar     return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
3117*c83a76b0SSuyog Pawar }
3118*c83a76b0SSuyog Pawar /**
3119*c83a76b0SSuyog Pawar *******************************************************************************
3120*c83a76b0SSuyog Pawar *
3121*c83a76b0SSuyog Pawar * @brief
3122*c83a76b0SSuyog Pawar *  Parses SEI (Supplemental Enhancement Information)
3123*c83a76b0SSuyog Pawar *
3124*c83a76b0SSuyog Pawar * @par Description:
3125*c83a76b0SSuyog Pawar *  Parses SEI (Supplemental Enhancement Information) as per Section: 7.3.7
3126*c83a76b0SSuyog Pawar *
3127*c83a76b0SSuyog Pawar * @param[in] ps_codec
3128*c83a76b0SSuyog Pawar *  Pointer to codec context
3129*c83a76b0SSuyog Pawar *
3130*c83a76b0SSuyog Pawar * @returns Error code from IHEVCD_ERROR_T
3131*c83a76b0SSuyog Pawar *
3132*c83a76b0SSuyog Pawar * @remarks
3133*c83a76b0SSuyog Pawar *
3134*c83a76b0SSuyog Pawar *
3135*c83a76b0SSuyog Pawar *******************************************************************************
3136*c83a76b0SSuyog Pawar */
ihevcd_parse_sei(codec_t * ps_codec,nal_header_t * ps_nal)3137*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_sei(codec_t *ps_codec, nal_header_t *ps_nal)
3138*c83a76b0SSuyog Pawar {
3139*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
3140*c83a76b0SSuyog Pawar     parse_ctxt_t *ps_parse = &ps_codec->s_parse;
3141*c83a76b0SSuyog Pawar     UWORD32 u4_payload_type = 0, u4_last_payload_type_byte = 0;
3142*c83a76b0SSuyog Pawar     UWORD32 u4_payload_size = 0, u4_last_payload_size_byte = 0;
3143*c83a76b0SSuyog Pawar     UWORD32 value;
3144*c83a76b0SSuyog Pawar     bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm;
3145*c83a76b0SSuyog Pawar     UWORD32 u4_bits_left;
3146*c83a76b0SSuyog Pawar 
3147*c83a76b0SSuyog Pawar     u4_bits_left = ihevcd_bits_num_bits_remaining(ps_bitstrm);
3148*c83a76b0SSuyog Pawar 
3149*c83a76b0SSuyog Pawar     while(u4_bits_left > 8)
3150*c83a76b0SSuyog Pawar     {
3151*c83a76b0SSuyog Pawar         while(ihevcd_bits_nxt(ps_bitstrm, 8) == 0xFF)
3152*c83a76b0SSuyog Pawar         {
3153*c83a76b0SSuyog Pawar             ihevcd_bits_flush(ps_bitstrm, 8); /* equal to 0xFF */
3154*c83a76b0SSuyog Pawar             u4_payload_type += 255;
3155*c83a76b0SSuyog Pawar         }
3156*c83a76b0SSuyog Pawar 
3157*c83a76b0SSuyog Pawar         BITS_PARSE("last_payload_type_byte", value, ps_bitstrm, 8);
3158*c83a76b0SSuyog Pawar         u4_last_payload_type_byte = value;
3159*c83a76b0SSuyog Pawar 
3160*c83a76b0SSuyog Pawar         u4_payload_type += u4_last_payload_type_byte;
3161*c83a76b0SSuyog Pawar 
3162*c83a76b0SSuyog Pawar         while(ihevcd_bits_nxt(ps_bitstrm, 8) == 0xFF)
3163*c83a76b0SSuyog Pawar         {
3164*c83a76b0SSuyog Pawar             ihevcd_bits_flush(ps_bitstrm, 8); /* equal to 0xFF */
3165*c83a76b0SSuyog Pawar             u4_payload_size += 255;
3166*c83a76b0SSuyog Pawar         }
3167*c83a76b0SSuyog Pawar 
3168*c83a76b0SSuyog Pawar         BITS_PARSE("last_payload_size_byte", value, ps_bitstrm, 8);
3169*c83a76b0SSuyog Pawar         u4_last_payload_size_byte = value;
3170*c83a76b0SSuyog Pawar 
3171*c83a76b0SSuyog Pawar         u4_payload_size += u4_last_payload_size_byte;
3172*c83a76b0SSuyog Pawar         u4_bits_left = ihevcd_bits_num_bits_remaining(ps_bitstrm);
3173*c83a76b0SSuyog Pawar         u4_payload_size = MIN(u4_payload_size, u4_bits_left / 8);
3174*c83a76b0SSuyog Pawar         ihevcd_parse_sei_payload(ps_codec, u4_payload_type, u4_payload_size,
3175*c83a76b0SSuyog Pawar                                  ps_nal->i1_nal_unit_type);
3176*c83a76b0SSuyog Pawar 
3177*c83a76b0SSuyog Pawar         /* Calculate the bits left in the current payload */
3178*c83a76b0SSuyog Pawar         u4_bits_left = ihevcd_bits_num_bits_remaining(ps_bitstrm);
3179*c83a76b0SSuyog Pawar     }
3180*c83a76b0SSuyog Pawar 
3181*c83a76b0SSuyog Pawar     // read rbsp_trailing_bits
3182*c83a76b0SSuyog Pawar     if(u4_bits_left)
3183*c83a76b0SSuyog Pawar     {
3184*c83a76b0SSuyog Pawar         ihevcd_read_rbsp_trailing_bits(ps_codec, u4_bits_left);
3185*c83a76b0SSuyog Pawar     }
3186*c83a76b0SSuyog Pawar 
3187*c83a76b0SSuyog Pawar     return ret;
3188*c83a76b0SSuyog Pawar }
3189*c83a76b0SSuyog Pawar #endif
3190*c83a76b0SSuyog Pawar 
3191*c83a76b0SSuyog Pawar /**
3192*c83a76b0SSuyog Pawar *******************************************************************************
3193*c83a76b0SSuyog Pawar *
3194*c83a76b0SSuyog Pawar * @brief
3195*c83a76b0SSuyog Pawar *  Parses Access unit delimiter
3196*c83a76b0SSuyog Pawar *
3197*c83a76b0SSuyog Pawar * @par Description:
3198*c83a76b0SSuyog Pawar *  Parses Access unit delimiter as per section  Section: 7.3.2.5
3199*c83a76b0SSuyog Pawar *
3200*c83a76b0SSuyog Pawar * @param[in] ps_codec
3201*c83a76b0SSuyog Pawar *  Pointer to codec context
3202*c83a76b0SSuyog Pawar *
3203*c83a76b0SSuyog Pawar * @returns Error code from IHEVCD_ERROR_T
3204*c83a76b0SSuyog Pawar *
3205*c83a76b0SSuyog Pawar * @remarks
3206*c83a76b0SSuyog Pawar *
3207*c83a76b0SSuyog Pawar *
3208*c83a76b0SSuyog Pawar *******************************************************************************
3209*c83a76b0SSuyog Pawar */
ihevcd_parse_aud(codec_t * ps_codec)3210*c83a76b0SSuyog Pawar WORD32 ihevcd_parse_aud(codec_t *ps_codec)
3211*c83a76b0SSuyog Pawar {
3212*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
3213*c83a76b0SSuyog Pawar     UNUSED(ps_codec);
3214*c83a76b0SSuyog Pawar     return ret;
3215*c83a76b0SSuyog Pawar }
3216*c83a76b0SSuyog Pawar 
ihevcd_extend_sign_bit(WORD32 value,WORD32 num_bits)3217*c83a76b0SSuyog Pawar WORD32 ihevcd_extend_sign_bit(WORD32 value, WORD32 num_bits)
3218*c83a76b0SSuyog Pawar {
3219*c83a76b0SSuyog Pawar     WORD32 ret_value = value;
3220*c83a76b0SSuyog Pawar     if(value >> (num_bits - 1))
3221*c83a76b0SSuyog Pawar     {
3222*c83a76b0SSuyog Pawar         ret_value |= (0xFFFFFFFF << num_bits);
3223*c83a76b0SSuyog Pawar     }
3224*c83a76b0SSuyog Pawar     return ret_value;
3225*c83a76b0SSuyog Pawar }
3226*c83a76b0SSuyog Pawar 
3227*c83a76b0SSuyog Pawar /**
3228*c83a76b0SSuyog Pawar *******************************************************************************
3229*c83a76b0SSuyog Pawar *
3230*c83a76b0SSuyog Pawar * @brief
3231*c83a76b0SSuyog Pawar *  Calculate POC of the current slice
3232*c83a76b0SSuyog Pawar *
3233*c83a76b0SSuyog Pawar * @par Description:
3234*c83a76b0SSuyog Pawar *  Calculates the current POC using the previous POC lsb and previous POC msb
3235*c83a76b0SSuyog Pawar *
3236*c83a76b0SSuyog Pawar * @param[in] ps_codec
3237*c83a76b0SSuyog Pawar *  Pointer to codec context
3238*c83a76b0SSuyog Pawar *
3239*c83a76b0SSuyog Pawar * @param[in] i1_pic_order_cnt_lsb
3240*c83a76b0SSuyog Pawar *  Current POC lsb
3241*c83a76b0SSuyog Pawar *
3242*c83a76b0SSuyog Pawar * @returns  Current absolute POC
3243*c83a76b0SSuyog Pawar *
3244*c83a76b0SSuyog Pawar * @remarks
3245*c83a76b0SSuyog Pawar *
3246*c83a76b0SSuyog Pawar *
3247*c83a76b0SSuyog Pawar *******************************************************************************
3248*c83a76b0SSuyog Pawar */
3249*c83a76b0SSuyog Pawar 
ihevcd_calc_poc(codec_t * ps_codec,nal_header_t * ps_nal,WORD8 i1_log2_max_poc_lsb,WORD32 i2_poc_lsb)3250*c83a76b0SSuyog Pawar WORD32 ihevcd_calc_poc(codec_t *ps_codec, nal_header_t *ps_nal, WORD8 i1_log2_max_poc_lsb, WORD32 i2_poc_lsb)
3251*c83a76b0SSuyog Pawar {
3252*c83a76b0SSuyog Pawar     WORD32 i4_abs_poc, i4_poc_msb;
3253*c83a76b0SSuyog Pawar     WORD32 max_poc_lsb;
3254*c83a76b0SSuyog Pawar     WORD8 i1_nal_unit_type = ps_nal->i1_nal_unit_type;
3255*c83a76b0SSuyog Pawar     max_poc_lsb = (1 << i1_log2_max_poc_lsb);
3256*c83a76b0SSuyog Pawar 
3257*c83a76b0SSuyog Pawar     if((!ps_codec->i4_first_pic_done) && (!ps_codec->i4_pic_present))
3258*c83a76b0SSuyog Pawar         ps_codec->i4_prev_poc_msb = -2 * max_poc_lsb;
3259*c83a76b0SSuyog Pawar 
3260*c83a76b0SSuyog Pawar     if(NAL_IDR_N_LP == i1_nal_unit_type
3261*c83a76b0SSuyog Pawar                     || NAL_IDR_W_LP == i1_nal_unit_type
3262*c83a76b0SSuyog Pawar                     || NAL_BLA_N_LP == i1_nal_unit_type
3263*c83a76b0SSuyog Pawar                     || NAL_BLA_W_DLP == i1_nal_unit_type
3264*c83a76b0SSuyog Pawar                     || NAL_BLA_W_LP == i1_nal_unit_type
3265*c83a76b0SSuyog Pawar                     || (NAL_CRA == i1_nal_unit_type && !ps_codec->i4_first_pic_done))
3266*c83a76b0SSuyog Pawar     {
3267*c83a76b0SSuyog Pawar         i4_poc_msb = ps_codec->i4_prev_poc_msb + 2 * max_poc_lsb;
3268*c83a76b0SSuyog Pawar         ps_codec->i4_prev_poc_lsb = 0;
3269*c83a76b0SSuyog Pawar         ps_codec->i4_max_prev_poc_lsb = 0;
3270*c83a76b0SSuyog Pawar //        ps_codec->i4_prev_poc_msb = 0;
3271*c83a76b0SSuyog Pawar     }
3272*c83a76b0SSuyog Pawar     else
3273*c83a76b0SSuyog Pawar     {
3274*c83a76b0SSuyog Pawar 
3275*c83a76b0SSuyog Pawar         if((i2_poc_lsb < ps_codec->i4_prev_poc_lsb)
3276*c83a76b0SSuyog Pawar                         && ((ps_codec->i4_prev_poc_lsb - i2_poc_lsb) >= max_poc_lsb / 2))
3277*c83a76b0SSuyog Pawar         {
3278*c83a76b0SSuyog Pawar             i4_poc_msb = ps_codec->i4_prev_poc_msb + max_poc_lsb;
3279*c83a76b0SSuyog Pawar         }
3280*c83a76b0SSuyog Pawar         else if((i2_poc_lsb > ps_codec->i4_prev_poc_lsb)
3281*c83a76b0SSuyog Pawar                         && ((i2_poc_lsb - ps_codec->i4_prev_poc_lsb) > max_poc_lsb / 2))
3282*c83a76b0SSuyog Pawar         {
3283*c83a76b0SSuyog Pawar             i4_poc_msb = ps_codec->i4_prev_poc_msb - max_poc_lsb;
3284*c83a76b0SSuyog Pawar         }
3285*c83a76b0SSuyog Pawar         else
3286*c83a76b0SSuyog Pawar         {
3287*c83a76b0SSuyog Pawar             i4_poc_msb = ps_codec->i4_prev_poc_msb;
3288*c83a76b0SSuyog Pawar         }
3289*c83a76b0SSuyog Pawar 
3290*c83a76b0SSuyog Pawar 
3291*c83a76b0SSuyog Pawar     }
3292*c83a76b0SSuyog Pawar 
3293*c83a76b0SSuyog Pawar     i4_abs_poc = i4_poc_msb + i2_poc_lsb;
3294*c83a76b0SSuyog Pawar     ps_codec->i4_max_prev_poc_lsb = MAX(ps_codec->i4_max_prev_poc_lsb, i2_poc_lsb);
3295*c83a76b0SSuyog Pawar 
3296*c83a76b0SSuyog Pawar     {
3297*c83a76b0SSuyog Pawar         WORD32 is_reference_nal = ((i1_nal_unit_type <= NAL_RSV_VCL_R15) && (i1_nal_unit_type % 2 != 0)) || ((i1_nal_unit_type >= NAL_BLA_W_LP) && (i1_nal_unit_type <= NAL_RSV_RAP_VCL23));
3298*c83a76b0SSuyog Pawar         WORD32 update_prev_poc = ((is_reference_nal) && ((i1_nal_unit_type < NAL_RADL_N) || (i1_nal_unit_type > NAL_RASL_R)));
3299*c83a76b0SSuyog Pawar 
3300*c83a76b0SSuyog Pawar         if((0 == ps_nal->i1_nuh_temporal_id) &&
3301*c83a76b0SSuyog Pawar                         (update_prev_poc))
3302*c83a76b0SSuyog Pawar         {
3303*c83a76b0SSuyog Pawar             ps_codec->i4_prev_poc_lsb = i2_poc_lsb;
3304*c83a76b0SSuyog Pawar             ps_codec->i4_prev_poc_msb = i4_poc_msb;
3305*c83a76b0SSuyog Pawar         }
3306*c83a76b0SSuyog Pawar     }
3307*c83a76b0SSuyog Pawar 
3308*c83a76b0SSuyog Pawar     return i4_abs_poc;
3309*c83a76b0SSuyog Pawar }
3310*c83a76b0SSuyog Pawar 
3311*c83a76b0SSuyog Pawar 
ihevcd_copy_slice_hdr(codec_t * ps_codec,WORD32 slice_idx,WORD32 slice_idx_ref)3312*c83a76b0SSuyog Pawar void ihevcd_copy_slice_hdr(codec_t *ps_codec, WORD32 slice_idx, WORD32 slice_idx_ref)
3313*c83a76b0SSuyog Pawar {
3314*c83a76b0SSuyog Pawar     slice_header_t *ps_slice_hdr, *ps_slice_hdr_ref;
3315*c83a76b0SSuyog Pawar     WORD32 *pu4_entry_offset_backup;
3316*c83a76b0SSuyog Pawar 
3317*c83a76b0SSuyog Pawar     ps_slice_hdr = ps_codec->s_parse.ps_slice_hdr_base + slice_idx;
3318*c83a76b0SSuyog Pawar     ps_slice_hdr_ref = ps_codec->s_parse.ps_slice_hdr_base + slice_idx_ref;
3319*c83a76b0SSuyog Pawar 
3320*c83a76b0SSuyog Pawar     pu4_entry_offset_backup = ps_slice_hdr->pu4_entry_point_offset;
3321*c83a76b0SSuyog Pawar     memcpy(ps_slice_hdr, ps_slice_hdr_ref, sizeof(slice_header_t));
3322*c83a76b0SSuyog Pawar     ps_slice_hdr->pu4_entry_point_offset = pu4_entry_offset_backup;
3323*c83a76b0SSuyog Pawar }
3324*c83a76b0SSuyog Pawar 
3325*c83a76b0SSuyog Pawar 
3326*c83a76b0SSuyog Pawar 
3327