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