1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker
21*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
22*495ae853SAndroid Build Coastguard Worker /* */
23*495ae853SAndroid Build Coastguard Worker /* File Name : ih264d_vui.c */
24*495ae853SAndroid Build Coastguard Worker /* */
25*495ae853SAndroid Build Coastguard Worker /* Description : This file contains routines to parse VUI NAL's */
26*495ae853SAndroid Build Coastguard Worker /* */
27*495ae853SAndroid Build Coastguard Worker /* List of Functions : <List the functions defined in this file> */
28*495ae853SAndroid Build Coastguard Worker /* */
29*495ae853SAndroid Build Coastguard Worker /* Issues / Problems : None */
30*495ae853SAndroid Build Coastguard Worker /* */
31*495ae853SAndroid Build Coastguard Worker /* Revision History : */
32*495ae853SAndroid Build Coastguard Worker /* */
33*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
34*495ae853SAndroid Build Coastguard Worker /* 25 05 2005 NS Draft */
35*495ae853SAndroid Build Coastguard Worker /* */
36*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
37*495ae853SAndroid Build Coastguard Worker
38*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
39*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
40*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264d_vui.h"
42*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
43*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
44*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
45*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
46*495ae853SAndroid Build Coastguard Worker
47*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
48*495ae853SAndroid Build Coastguard Worker /* */
49*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_parse_hrd_parametres */
50*495ae853SAndroid Build Coastguard Worker /* */
51*495ae853SAndroid Build Coastguard Worker /* Description : This function parses hrd_t parametres */
52*495ae853SAndroid Build Coastguard Worker /* Inputs : ps_hrd pointer to HRD params */
53*495ae853SAndroid Build Coastguard Worker /* ps_bitstrm Bitstream */
54*495ae853SAndroid Build Coastguard Worker /* Globals : None */
55*495ae853SAndroid Build Coastguard Worker /* Processing : Parses HRD params */
56*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
57*495ae853SAndroid Build Coastguard Worker /* Returns : None */
58*495ae853SAndroid Build Coastguard Worker /* */
59*495ae853SAndroid Build Coastguard Worker /* Issues : None */
60*495ae853SAndroid Build Coastguard Worker /* */
61*495ae853SAndroid Build Coastguard Worker /* Revision History: */
62*495ae853SAndroid Build Coastguard Worker /* */
63*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
64*495ae853SAndroid Build Coastguard Worker /* 06 05 2002 NS Draft */
65*495ae853SAndroid Build Coastguard Worker /* */
66*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
67*495ae853SAndroid Build Coastguard Worker
ih264d_parse_hrd_parametres(hrd_t * ps_hrd,dec_bit_stream_t * ps_bitstrm)68*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_parse_hrd_parametres(hrd_t *ps_hrd,
69*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm)
70*495ae853SAndroid Build Coastguard Worker {
71*495ae853SAndroid Build Coastguard Worker UWORD8 u1_index;
72*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
73*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
74*495ae853SAndroid Build Coastguard Worker
75*495ae853SAndroid Build Coastguard Worker ps_hrd->u4_cpb_cnt = 1
76*495ae853SAndroid Build Coastguard Worker + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
77*495ae853SAndroid Build Coastguard Worker if(ps_hrd->u4_cpb_cnt > 31)
78*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SPS_PPS_T;
79*495ae853SAndroid Build Coastguard Worker ps_hrd->u1_bit_rate_scale = ih264d_get_bits_h264(ps_bitstrm, 4);
80*495ae853SAndroid Build Coastguard Worker ps_hrd->u1_cpb_size_scale = ih264d_get_bits_h264(ps_bitstrm, 4);
81*495ae853SAndroid Build Coastguard Worker
82*495ae853SAndroid Build Coastguard Worker for(u1_index = 0; u1_index < (UWORD8)ps_hrd->u4_cpb_cnt; u1_index++)
83*495ae853SAndroid Build Coastguard Worker {
84*495ae853SAndroid Build Coastguard Worker ps_hrd->u4_bit_rate[u1_index] = 1
85*495ae853SAndroid Build Coastguard Worker + ih264d_uev(pu4_bitstrm_ofst,
86*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
87*495ae853SAndroid Build Coastguard Worker ps_hrd->u4_cpb_size[u1_index] = 1
88*495ae853SAndroid Build Coastguard Worker + ih264d_uev(pu4_bitstrm_ofst,
89*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
90*495ae853SAndroid Build Coastguard Worker ps_hrd->u1_cbr_flag[u1_index] = ih264d_get_bits_h264(ps_bitstrm, 1);
91*495ae853SAndroid Build Coastguard Worker }
92*495ae853SAndroid Build Coastguard Worker
93*495ae853SAndroid Build Coastguard Worker ps_hrd->u1_initial_cpb_removal_delay = 1
94*495ae853SAndroid Build Coastguard Worker + ih264d_get_bits_h264(ps_bitstrm, 5);
95*495ae853SAndroid Build Coastguard Worker ps_hrd->u1_cpb_removal_delay_length = 1
96*495ae853SAndroid Build Coastguard Worker + ih264d_get_bits_h264(ps_bitstrm, 5);
97*495ae853SAndroid Build Coastguard Worker ps_hrd->u1_dpb_output_delay_length = 1
98*495ae853SAndroid Build Coastguard Worker + ih264d_get_bits_h264(ps_bitstrm, 5);
99*495ae853SAndroid Build Coastguard Worker ps_hrd->u1_time_offset_length = ih264d_get_bits_h264(ps_bitstrm, 5);
100*495ae853SAndroid Build Coastguard Worker
101*495ae853SAndroid Build Coastguard Worker return OK;
102*495ae853SAndroid Build Coastguard Worker }
103*495ae853SAndroid Build Coastguard Worker
104*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
105*495ae853SAndroid Build Coastguard Worker /* */
106*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_parse_vui_parametres */
107*495ae853SAndroid Build Coastguard Worker /* */
108*495ae853SAndroid Build Coastguard Worker /* Description : This function parses VUI NALs. */
109*495ae853SAndroid Build Coastguard Worker /* Inputs : ps_vu4 pointer to VUI params */
110*495ae853SAndroid Build Coastguard Worker /* ps_bitstrm Bitstream */
111*495ae853SAndroid Build Coastguard Worker /* Globals : None */
112*495ae853SAndroid Build Coastguard Worker /* Processing : Parses VUI NAL's units and stores the info */
113*495ae853SAndroid Build Coastguard Worker /* Outputs : None */
114*495ae853SAndroid Build Coastguard Worker /* Returns : None */
115*495ae853SAndroid Build Coastguard Worker /* */
116*495ae853SAndroid Build Coastguard Worker /* Issues : None */
117*495ae853SAndroid Build Coastguard Worker /* */
118*495ae853SAndroid Build Coastguard Worker /* Revision History: */
119*495ae853SAndroid Build Coastguard Worker /* */
120*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
121*495ae853SAndroid Build Coastguard Worker /* 06 05 2002 NS Draft */
122*495ae853SAndroid Build Coastguard Worker /* */
123*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
124*495ae853SAndroid Build Coastguard Worker
ih264d_parse_vui_parametres(vui_t * ps_vu4,dec_bit_stream_t * ps_bitstrm)125*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_parse_vui_parametres(vui_t *ps_vu4,
126*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm)
127*495ae853SAndroid Build Coastguard Worker {
128*495ae853SAndroid Build Coastguard Worker UWORD8 u4_bits;
129*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
130*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
131*495ae853SAndroid Build Coastguard Worker WORD32 ret;
132*495ae853SAndroid Build Coastguard Worker
133*495ae853SAndroid Build Coastguard Worker u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
134*495ae853SAndroid Build Coastguard Worker if(u4_bits)
135*495ae853SAndroid Build Coastguard Worker {
136*495ae853SAndroid Build Coastguard Worker u4_bits = ih264d_get_bits_h264(ps_bitstrm, 8);
137*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_aspect_ratio_idc = (UWORD8)u4_bits;
138*495ae853SAndroid Build Coastguard Worker if(VUI_EXTENDED_SAR == u4_bits)
139*495ae853SAndroid Build Coastguard Worker {
140*495ae853SAndroid Build Coastguard Worker ps_vu4->u2_sar_width = ih264d_get_bits_h264(ps_bitstrm, 16);
141*495ae853SAndroid Build Coastguard Worker ps_vu4->u2_sar_height = ih264d_get_bits_h264(ps_bitstrm, 16);
142*495ae853SAndroid Build Coastguard Worker }
143*495ae853SAndroid Build Coastguard Worker }
144*495ae853SAndroid Build Coastguard Worker
145*495ae853SAndroid Build Coastguard Worker u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
146*495ae853SAndroid Build Coastguard Worker if(u4_bits)
147*495ae853SAndroid Build Coastguard Worker {
148*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_overscan_appropriate_flag = ih264d_get_bits_h264(
149*495ae853SAndroid Build Coastguard Worker ps_bitstrm, 1);
150*495ae853SAndroid Build Coastguard Worker }
151*495ae853SAndroid Build Coastguard Worker u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
152*495ae853SAndroid Build Coastguard Worker /* Initialize to unspecified (5 for video_format and
153*495ae853SAndroid Build Coastguard Worker 2 for colour_primaries, tfr_chars, matrix_coeffs */
154*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_video_format = 5;
155*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_video_full_range_flag = 0;
156*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_colour_primaries = 2;
157*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_tfr_chars = 2;
158*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_matrix_coeffs = 2;
159*495ae853SAndroid Build Coastguard Worker
160*495ae853SAndroid Build Coastguard Worker if(u4_bits)
161*495ae853SAndroid Build Coastguard Worker {
162*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_video_format = ih264d_get_bits_h264(ps_bitstrm, 3);
163*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_video_full_range_flag = ih264d_get_bits_h264(ps_bitstrm,
164*495ae853SAndroid Build Coastguard Worker 1);
165*495ae853SAndroid Build Coastguard Worker u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
166*495ae853SAndroid Build Coastguard Worker if(u4_bits)
167*495ae853SAndroid Build Coastguard Worker {
168*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_colour_primaries = ih264d_get_bits_h264(ps_bitstrm,
169*495ae853SAndroid Build Coastguard Worker 8);
170*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_tfr_chars = ih264d_get_bits_h264(ps_bitstrm, 8);
171*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_matrix_coeffs = ih264d_get_bits_h264(ps_bitstrm, 8);
172*495ae853SAndroid Build Coastguard Worker }
173*495ae853SAndroid Build Coastguard Worker }
174*495ae853SAndroid Build Coastguard Worker
175*495ae853SAndroid Build Coastguard Worker u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
176*495ae853SAndroid Build Coastguard Worker if(u4_bits)
177*495ae853SAndroid Build Coastguard Worker {
178*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_cr_top_field = ih264d_uev(pu4_bitstrm_ofst,
179*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
180*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_cr_bottom_field = ih264d_uev(pu4_bitstrm_ofst,
181*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
182*495ae853SAndroid Build Coastguard Worker }
183*495ae853SAndroid Build Coastguard Worker
184*495ae853SAndroid Build Coastguard Worker u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
185*495ae853SAndroid Build Coastguard Worker if(u4_bits)
186*495ae853SAndroid Build Coastguard Worker {
187*495ae853SAndroid Build Coastguard Worker ps_vu4->u4_num_units_in_tick = ih264d_get_bits_h264(ps_bitstrm, 32);
188*495ae853SAndroid Build Coastguard Worker ps_vu4->u4_time_scale = ih264d_get_bits_h264(ps_bitstrm, 32);
189*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_fixed_frame_rate_flag = ih264d_get_bits_h264(ps_bitstrm,
190*495ae853SAndroid Build Coastguard Worker 1);
191*495ae853SAndroid Build Coastguard Worker }
192*495ae853SAndroid Build Coastguard Worker
193*495ae853SAndroid Build Coastguard Worker u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
194*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_nal_hrd_params_present = u4_bits;
195*495ae853SAndroid Build Coastguard Worker if(u4_bits)
196*495ae853SAndroid Build Coastguard Worker {
197*495ae853SAndroid Build Coastguard Worker ret = ih264d_parse_hrd_parametres(&ps_vu4->s_nal_hrd, ps_bitstrm);
198*495ae853SAndroid Build Coastguard Worker if(ret != OK)
199*495ae853SAndroid Build Coastguard Worker return ret;
200*495ae853SAndroid Build Coastguard Worker }
201*495ae853SAndroid Build Coastguard Worker u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
202*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_vcl_hrd_params_present = u4_bits;
203*495ae853SAndroid Build Coastguard Worker if(u4_bits)
204*495ae853SAndroid Build Coastguard Worker {
205*495ae853SAndroid Build Coastguard Worker ret = ih264d_parse_hrd_parametres(&ps_vu4->s_vcl_hrd, ps_bitstrm);
206*495ae853SAndroid Build Coastguard Worker if(ret != OK)
207*495ae853SAndroid Build Coastguard Worker return ret;
208*495ae853SAndroid Build Coastguard Worker }
209*495ae853SAndroid Build Coastguard Worker
210*495ae853SAndroid Build Coastguard Worker if(ps_vu4->u1_nal_hrd_params_present || u4_bits)
211*495ae853SAndroid Build Coastguard Worker {
212*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_low_delay_hrd_flag = ih264d_get_bits_h264(ps_bitstrm, 1);
213*495ae853SAndroid Build Coastguard Worker }
214*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_pic_struct_present_flag = ih264d_get_bits_h264(ps_bitstrm, 1);
215*495ae853SAndroid Build Coastguard Worker
216*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_bitstream_restriction_flag = ih264d_get_bits_h264(ps_bitstrm, 1);
217*495ae853SAndroid Build Coastguard Worker
218*495ae853SAndroid Build Coastguard Worker if(ps_vu4->u1_bitstream_restriction_flag)
219*495ae853SAndroid Build Coastguard Worker {
220*495ae853SAndroid Build Coastguard Worker ps_vu4->u1_mv_over_pic_boundaries_flag = ih264d_get_bits_h264(
221*495ae853SAndroid Build Coastguard Worker ps_bitstrm, 1);
222*495ae853SAndroid Build Coastguard Worker ps_vu4->u4_max_bytes_per_pic_denom = ih264d_uev(pu4_bitstrm_ofst,
223*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
224*495ae853SAndroid Build Coastguard Worker ps_vu4->u4_max_bits_per_mb_denom = ih264d_uev(pu4_bitstrm_ofst,
225*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
226*495ae853SAndroid Build Coastguard Worker ps_vu4->u4_log2_max_mv_length_horz = ih264d_uev(pu4_bitstrm_ofst,
227*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
228*495ae853SAndroid Build Coastguard Worker ps_vu4->u4_log2_max_mv_length_vert = ih264d_uev(pu4_bitstrm_ofst,
229*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
230*495ae853SAndroid Build Coastguard Worker ps_vu4->u4_num_reorder_frames = ih264d_uev(pu4_bitstrm_ofst,
231*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
232*495ae853SAndroid Build Coastguard Worker ps_vu4->u4_max_dec_frame_buffering = ih264d_uev(pu4_bitstrm_ofst,
233*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
234*495ae853SAndroid Build Coastguard Worker if((ps_vu4->u4_max_dec_frame_buffering > (H264_MAX_REF_PICS * 2)) ||
235*495ae853SAndroid Build Coastguard Worker (ps_vu4->u4_num_reorder_frames > ps_vu4->u4_max_dec_frame_buffering))
236*495ae853SAndroid Build Coastguard Worker {
237*495ae853SAndroid Build Coastguard Worker return ERROR_INV_SPS_PPS_T;
238*495ae853SAndroid Build Coastguard Worker }
239*495ae853SAndroid Build Coastguard Worker }
240*495ae853SAndroid Build Coastguard Worker else
241*495ae853SAndroid Build Coastguard Worker {
242*495ae853SAndroid Build Coastguard Worker /* Setting this to a large value if not present */
243*495ae853SAndroid Build Coastguard Worker ps_vu4->u4_num_reorder_frames = 64;
244*495ae853SAndroid Build Coastguard Worker ps_vu4->u4_max_dec_frame_buffering = 64;
245*495ae853SAndroid Build Coastguard Worker }
246*495ae853SAndroid Build Coastguard Worker
247*495ae853SAndroid Build Coastguard Worker return OK;
248*495ae853SAndroid Build Coastguard Worker }
249