/work/libde265/libde265/vps.cc
Line | Count | Source |
1 | | /* |
2 | | * H.265 video codec. |
3 | | * Copyright (c) 2013-2014 struktur AG, Dirk Farin <farin@struktur.de> |
4 | | * |
5 | | * This file is part of libde265. |
6 | | * |
7 | | * libde265 is free software: you can redistribute it and/or modify |
8 | | * it under the terms of the GNU Lesser General Public License as |
9 | | * published by the Free Software Foundation, either version 3 of |
10 | | * the License, or (at your option) any later version. |
11 | | * |
12 | | * libde265 is distributed in the hope that it will be useful, |
13 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | | * GNU Lesser General Public License for more details. |
16 | | * |
17 | | * You should have received a copy of the GNU Lesser General Public License |
18 | | * along with libde265. If not, see <http://www.gnu.org/licenses/>. |
19 | | */ |
20 | | |
21 | | #include "vps.h" |
22 | | #include "util.h" |
23 | | #include "decctx.h" |
24 | | |
25 | | #include <assert.h> |
26 | | |
27 | | |
28 | | void profile_data::set_defaults(enum profile_idc profile, int level_major, int level_minor) |
29 | 0 | { |
30 | 0 | profile_present_flag = 1; |
31 | |
|
32 | 0 | profile_space = 0; |
33 | 0 | tier_flag = 0; |
34 | 0 | profile_idc = profile; |
35 | |
|
36 | 0 | for (int i=0;i<32;i++) { |
37 | 0 | profile_compatibility_flag[i]=0; |
38 | 0 | } |
39 | |
|
40 | 0 | switch (profile) { |
41 | 0 | case Profile_Main: |
42 | 0 | profile_compatibility_flag[Profile_Main]=1; |
43 | 0 | profile_compatibility_flag[Profile_Main10]=1; |
44 | 0 | break; |
45 | 0 | case Profile_Main10: |
46 | 0 | profile_compatibility_flag[Profile_Main10]=1; |
47 | 0 | break; |
48 | 0 | default: |
49 | 0 | assert(0); |
50 | 0 | } |
51 | | |
52 | 0 | progressive_source_flag = 0; |
53 | 0 | interlaced_source_flag = 0; |
54 | 0 | non_packed_constraint_flag = 0; |
55 | 0 | frame_only_constraint_flag = 0; |
56 | | |
57 | | |
58 | | // --- level --- |
59 | |
|
60 | 0 | level_present_flag = 1; |
61 | 0 | level_idc = level_major*30 + level_minor*3; |
62 | 0 | } |
63 | | |
64 | | |
65 | | void video_parameter_set::set_defaults(enum profile_idc profile, int level_major, int level_minor) |
66 | 0 | { |
67 | 0 | video_parameter_set_id = 0; |
68 | 0 | vps_max_layers = 1; // always =1 in current version of standard |
69 | 0 | vps_max_sub_layers = 1; // temporal sub-layers |
70 | 0 | vps_temporal_id_nesting_flag = 1; |
71 | |
|
72 | 0 | profile_tier_level_.general.set_defaults(profile,level_major,level_minor); |
73 | |
|
74 | 0 | vps_sub_layer_ordering_info_present_flag = 0; |
75 | 0 | layer[0].vps_max_dec_pic_buffering = 1; |
76 | 0 | layer[0].vps_max_num_reorder_pics = 0; |
77 | 0 | layer[0].vps_max_latency_increase = 0; |
78 | |
|
79 | 0 | vps_max_layer_id = 0; |
80 | 0 | vps_num_layer_sets = 1; |
81 | |
|
82 | 0 | layer_id_included_flag.resize(vps_num_layer_sets); |
83 | | |
84 | | |
85 | | // --- timing info --- |
86 | |
|
87 | 0 | vps_timing_info_present_flag = 0; |
88 | 0 | vps_num_units_in_tick = 0; |
89 | 0 | vps_time_scale = 0; |
90 | 0 | vps_poc_proportional_to_timing_flag = 0; |
91 | |
|
92 | 0 | vps_num_ticks_poc_diff_one = 0; |
93 | 0 | vps_num_hrd_parameters = 0; |
94 | | |
95 | | |
96 | | // --- vps extension --- |
97 | |
|
98 | 0 | vps_extension_flag = 0; |
99 | 0 | } |
100 | | |
101 | | |
102 | | de265_error video_parameter_set::read(error_queue* errqueue, bitreader* reader) |
103 | 0 | { |
104 | 0 | int vlc; |
105 | |
|
106 | 0 | video_parameter_set_id = vlc = get_bits(reader, 4); |
107 | 0 | if (vlc >= DE265_MAX_VPS_SETS) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
108 | | |
109 | 0 | skip_bits(reader, 2); |
110 | 0 | vps_max_layers = vlc = get_bits(reader,6) +1; |
111 | 0 | if (vlc > 63) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; // vps_max_layers_minus1 (range 0...63) |
112 | | |
113 | 0 | vps_max_sub_layers = vlc = get_bits(reader,3) +1; |
114 | 0 | if (vlc >= MAX_TEMPORAL_SUBLAYERS) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
115 | | |
116 | 0 | vps_temporal_id_nesting_flag = get_bits(reader,1); |
117 | 0 | skip_bits(reader, 16); |
118 | |
|
119 | 0 | profile_tier_level_.read(reader, vps_max_sub_layers); |
120 | | |
121 | | /* |
122 | | read_bit_rate_pic_rate_info(reader, &bit_rate_pic_rate_info, |
123 | | 0, vps_max_sub_layers-1); |
124 | | */ |
125 | |
|
126 | 0 | vps_sub_layer_ordering_info_present_flag = get_bits(reader,1); |
127 | | //assert(vps_max_sub_layers-1 < MAX_TEMPORAL_SUBLAYERS); |
128 | |
|
129 | 0 | int firstLayerRead = vps_sub_layer_ordering_info_present_flag ? 0 : (vps_max_sub_layers-1); |
130 | |
|
131 | 0 | for (int i=firstLayerRead;i<vps_max_sub_layers;i++) { |
132 | 0 | layer[i].vps_max_dec_pic_buffering = get_uvlc(reader); |
133 | 0 | layer[i].vps_max_num_reorder_pics = get_uvlc(reader); |
134 | 0 | layer[i].vps_max_latency_increase = get_uvlc(reader); |
135 | |
|
136 | 0 | if (layer[i].vps_max_dec_pic_buffering == UVLC_ERROR || |
137 | 0 | layer[i].vps_max_num_reorder_pics == UVLC_ERROR || |
138 | 0 | layer[i].vps_max_latency_increase == UVLC_ERROR) { |
139 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
140 | 0 | } |
141 | 0 | } |
142 | | |
143 | 0 | if (!vps_sub_layer_ordering_info_present_flag) { |
144 | 0 | assert(firstLayerRead < MAX_TEMPORAL_SUBLAYERS); |
145 | | |
146 | 0 | for (int i=0;i<firstLayerRead;i++) { |
147 | 0 | layer[i].vps_max_dec_pic_buffering = layer[firstLayerRead].vps_max_dec_pic_buffering; |
148 | 0 | layer[i].vps_max_num_reorder_pics = layer[firstLayerRead].vps_max_num_reorder_pics; |
149 | 0 | layer[i].vps_max_latency_increase = layer[firstLayerRead].vps_max_latency_increase; |
150 | 0 | } |
151 | 0 | } |
152 | | |
153 | | |
154 | 0 | vps_max_layer_id = get_bits(reader,6); |
155 | 0 | vps_num_layer_sets = get_uvlc(reader); |
156 | |
|
157 | 0 | if (vps_num_layer_sets+1<0 || |
158 | 0 | vps_num_layer_sets+1>=1024 || |
159 | 0 | vps_num_layer_sets == UVLC_ERROR) { |
160 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
161 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
162 | 0 | } |
163 | 0 | vps_num_layer_sets += 1; |
164 | |
|
165 | 0 | layer_id_included_flag.resize(vps_num_layer_sets); |
166 | |
|
167 | 0 | for (int i=1; i <= vps_num_layer_sets-1; i++) |
168 | 0 | { |
169 | 0 | layer_id_included_flag[i].resize(vps_max_layer_id+1); |
170 | |
|
171 | 0 | for (int j=0; j <= vps_max_layer_id; j++) |
172 | 0 | { |
173 | 0 | layer_id_included_flag[i][j] = get_bits(reader,1); |
174 | 0 | } |
175 | 0 | } |
176 | |
|
177 | 0 | vps_timing_info_present_flag = get_bits(reader,1); |
178 | |
|
179 | 0 | if (vps_timing_info_present_flag) { |
180 | 0 | vps_num_units_in_tick = get_bits(reader,32); |
181 | 0 | vps_time_scale = get_bits(reader,32); |
182 | 0 | vps_poc_proportional_to_timing_flag = get_bits(reader,1); |
183 | |
|
184 | 0 | if (vps_poc_proportional_to_timing_flag) { |
185 | 0 | vps_num_ticks_poc_diff_one = get_uvlc(reader)+1; |
186 | 0 | vps_num_hrd_parameters = get_uvlc(reader); |
187 | |
|
188 | 0 | if (vps_num_hrd_parameters >= 1024 || vps_num_hrd_parameters < 0) { |
189 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
190 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
191 | 0 | } |
192 | | |
193 | 0 | hrd_layer_set_idx .resize(vps_num_hrd_parameters); |
194 | 0 | cprms_present_flag.resize(vps_num_hrd_parameters); |
195 | |
|
196 | 0 | for (int i=0; i<vps_num_hrd_parameters; i++) { |
197 | 0 | hrd_layer_set_idx[i] = get_uvlc(reader); |
198 | |
|
199 | 0 | if (i > 0) { |
200 | 0 | cprms_present_flag[i] = get_bits(reader,1); |
201 | 0 | } |
202 | | |
203 | | //hrd_parameters(cprms_present_flag[i], vps_max_sub_layers_minus1) |
204 | |
|
205 | 0 | return DE265_OK; // TODO: decode hrd_parameters() |
206 | 0 | } |
207 | 0 | } |
208 | 0 | } |
209 | | |
210 | 0 | vps_extension_flag = get_bits(reader,1); |
211 | |
|
212 | 0 | if (vps_extension_flag) { |
213 | | /* |
214 | | while( more_rbsp_data() ) |
215 | | vps_extension_data_flag u(1) |
216 | | rbsp_trailing_bits() |
217 | | */ |
218 | 0 | } |
219 | |
|
220 | 0 | return DE265_OK; |
221 | 0 | } |
222 | | |
223 | | |
224 | | de265_error video_parameter_set::write(error_queue* errqueue, CABAC_encoder& out) const |
225 | 0 | { |
226 | 0 | if (video_parameter_set_id >= DE265_MAX_VPS_SETS) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
227 | 0 | out.write_bits(video_parameter_set_id,4); |
228 | |
|
229 | 0 | out.write_bits(0x3,2); |
230 | 0 | out.write_bits(vps_max_layers-1,6); |
231 | |
|
232 | 0 | if (vps_max_sub_layers >= MAX_TEMPORAL_SUBLAYERS) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
233 | 0 | out.write_bits(vps_max_sub_layers-1,3); |
234 | |
|
235 | 0 | out.write_bit(vps_temporal_id_nesting_flag); |
236 | 0 | out.write_bits(0xFFFF, 16); |
237 | |
|
238 | 0 | profile_tier_level_.write(out, vps_max_sub_layers); |
239 | | |
240 | | /* |
241 | | read_bit_rate_pic_rate_info(reader, &bit_rate_pic_rate_info, |
242 | | 0, vps_max_sub_layers-1); |
243 | | */ |
244 | |
|
245 | 0 | out.write_bit(vps_sub_layer_ordering_info_present_flag); |
246 | | //assert(vps_max_sub_layers-1 < MAX_TEMPORAL_SUBLAYERS); |
247 | |
|
248 | 0 | int firstLayerRead = vps_sub_layer_ordering_info_present_flag ? 0 : (vps_max_sub_layers-1); |
249 | |
|
250 | 0 | for (int i=firstLayerRead;i<vps_max_sub_layers;i++) { |
251 | 0 | out.write_uvlc(layer[i].vps_max_dec_pic_buffering); |
252 | 0 | out.write_uvlc(layer[i].vps_max_num_reorder_pics); |
253 | 0 | out.write_uvlc(layer[i].vps_max_latency_increase); |
254 | 0 | } |
255 | |
|
256 | 0 | if (vps_num_layer_sets<0 || |
257 | 0 | vps_num_layer_sets>=1024) { |
258 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
259 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
260 | 0 | } |
261 | | |
262 | 0 | out.write_bits(vps_max_layer_id,6); |
263 | 0 | out.write_uvlc(vps_num_layer_sets-1); |
264 | |
|
265 | 0 | for (int i=1; i <= vps_num_layer_sets-1; i++) |
266 | 0 | for (int j=0; j <= vps_max_layer_id; j++) |
267 | 0 | { |
268 | 0 | out.write_bit(layer_id_included_flag[i][j]); |
269 | 0 | } |
270 | |
|
271 | 0 | out.write_bit(vps_timing_info_present_flag); |
272 | |
|
273 | 0 | if (vps_timing_info_present_flag) { |
274 | 0 | out.write_bits(vps_num_units_in_tick,32); |
275 | 0 | out.write_bits(vps_time_scale ,32); |
276 | 0 | out.write_bit (vps_poc_proportional_to_timing_flag); |
277 | |
|
278 | 0 | if (vps_poc_proportional_to_timing_flag) { |
279 | 0 | out.write_uvlc(vps_num_ticks_poc_diff_one-1); |
280 | 0 | out.write_uvlc(vps_num_hrd_parameters); |
281 | |
|
282 | 0 | for (int i=0; i<vps_num_hrd_parameters; i++) { |
283 | 0 | out.write_uvlc(hrd_layer_set_idx[i]); |
284 | |
|
285 | 0 | if (i > 0) { |
286 | 0 | out.write_bit(cprms_present_flag[i]); |
287 | 0 | } |
288 | | |
289 | | //hrd_parameters(cprms_present_flag[i], vps_max_sub_layers_minus1) |
290 | |
|
291 | 0 | return DE265_OK; // TODO: decode hrd_parameters() |
292 | 0 | } |
293 | 0 | } |
294 | 0 | } |
295 | | |
296 | 0 | out.write_bit(vps_extension_flag); |
297 | |
|
298 | 0 | if (vps_extension_flag) { |
299 | | /* |
300 | | while( more_rbsp_data() ) |
301 | | vps_extension_data_flag u(1) |
302 | | rbsp_trailing_bits() |
303 | | */ |
304 | 0 | } |
305 | |
|
306 | 0 | return DE265_OK; |
307 | 0 | } |
308 | | |
309 | | |
310 | | void profile_data::read(bitreader* reader) |
311 | 0 | { |
312 | 0 | if (profile_present_flag) { |
313 | 0 | profile_space = get_bits(reader,2); |
314 | 0 | tier_flag = get_bits(reader,1); |
315 | 0 | profile_idc = (enum profile_idc)get_bits(reader,5); |
316 | |
|
317 | 0 | for (int i=0; i<32; i++) { |
318 | 0 | profile_compatibility_flag[i] = get_bits(reader,1); |
319 | 0 | } |
320 | |
|
321 | 0 | progressive_source_flag = get_bits(reader,1); |
322 | 0 | interlaced_source_flag = get_bits(reader,1); |
323 | 0 | non_packed_constraint_flag = get_bits(reader,1); |
324 | 0 | frame_only_constraint_flag = get_bits(reader,1); |
325 | 0 | skip_bits(reader,44); |
326 | 0 | } |
327 | |
|
328 | 0 | if (level_present_flag) { |
329 | 0 | level_idc = get_bits(reader,8); |
330 | 0 | } |
331 | 0 | } |
332 | | |
333 | | |
334 | | void profile_tier_level::read(bitreader* reader, |
335 | | int max_sub_layers) |
336 | 0 | { |
337 | | // --- read the general profile --- |
338 | |
|
339 | 0 | general.profile_present_flag = true; |
340 | 0 | general.level_present_flag = true; |
341 | 0 | general.read(reader); |
342 | | |
343 | | |
344 | | // --- read the profile/levels of the sub-layers --- |
345 | |
|
346 | 0 | for (int i=0; i<max_sub_layers-1; i++) |
347 | 0 | { |
348 | 0 | sub_layer[i].profile_present_flag = get_bits(reader,1); |
349 | 0 | sub_layer[i].level_present_flag = get_bits(reader,1); |
350 | 0 | } |
351 | |
|
352 | 0 | if (max_sub_layers > 1) |
353 | 0 | { |
354 | 0 | for (int i=max_sub_layers-1; i<8; i++) |
355 | 0 | { |
356 | 0 | skip_bits(reader,2); |
357 | 0 | } |
358 | 0 | } |
359 | |
|
360 | 0 | for (int i=0; i<max_sub_layers-1; i++) |
361 | 0 | { |
362 | 0 | sub_layer[i].read(reader); |
363 | 0 | } |
364 | 0 | } |
365 | | |
366 | | |
367 | | void profile_data::write(CABAC_encoder& out) const |
368 | 0 | { |
369 | 0 | if (profile_present_flag) |
370 | 0 | { |
371 | 0 | out.write_bits(profile_space,2); |
372 | 0 | out.write_bit (tier_flag); |
373 | 0 | out.write_bits(profile_idc,5); |
374 | |
|
375 | 0 | for (int j=0; j<32; j++) |
376 | 0 | { |
377 | 0 | out.write_bit(profile_compatibility_flag[j]); |
378 | 0 | } |
379 | |
|
380 | 0 | out.write_bit(progressive_source_flag); |
381 | 0 | out.write_bit(interlaced_source_flag); |
382 | 0 | out.write_bit(non_packed_constraint_flag); |
383 | 0 | out.write_bit(frame_only_constraint_flag); |
384 | 0 | out.skip_bits(44); |
385 | 0 | } |
386 | |
|
387 | 0 | if (level_present_flag) |
388 | 0 | { |
389 | 0 | out.write_bits(level_idc,8); |
390 | 0 | } |
391 | 0 | } |
392 | | |
393 | | void profile_tier_level::write(CABAC_encoder& out, int max_sub_layers) const |
394 | 0 | { |
395 | 0 | assert(general.profile_present_flag==true); |
396 | 0 | assert(general.level_present_flag==true); |
397 | | |
398 | 0 | general.write(out); |
399 | |
|
400 | 0 | for (int i=0; i<max_sub_layers-1; i++) |
401 | 0 | { |
402 | 0 | out.write_bit(sub_layer[i].profile_present_flag); |
403 | 0 | out.write_bit(sub_layer[i].level_present_flag); |
404 | 0 | } |
405 | |
|
406 | 0 | if (max_sub_layers > 1) |
407 | 0 | { |
408 | 0 | for (int i=max_sub_layers-1; i<8; i++) |
409 | 0 | { |
410 | 0 | out.skip_bits(2); |
411 | 0 | } |
412 | 0 | } |
413 | |
|
414 | 0 | for (int i=0; i<max_sub_layers-1; i++) |
415 | 0 | { |
416 | 0 | sub_layer[i].write(out); |
417 | 0 | } |
418 | 0 | } |
419 | | |
420 | | |
421 | | /* |
422 | | void read_bit_rate_pic_rate_info(bitreader* reader, |
423 | | struct bit_rate_pic_rate_info* hdr, |
424 | | int TempLevelLow, |
425 | | int TempLevelHigh) |
426 | | { |
427 | | for (int i=TempLevelLow; i<=TempLevelHigh; i++) { |
428 | | |
429 | | hdr->bit_rate_info_present_flag[i] = get_bits(reader,1); |
430 | | hdr->pic_rate_info_present_flag[i] = get_bits(reader,1); |
431 | | |
432 | | if (hdr->bit_rate_info_present_flag[i]) { |
433 | | hdr->avg_bit_rate[i] = get_bits(reader,16); |
434 | | hdr->max_bit_rate[i] = get_bits(reader,16); |
435 | | } |
436 | | |
437 | | if (hdr->pic_rate_info_present_flag[i]) { |
438 | | hdr->constant_pic_rate_idc[i] = get_bits(reader,2); |
439 | | hdr->avg_pic_rate[i] = get_bits(reader,16); |
440 | | } |
441 | | } |
442 | | } |
443 | | */ |
444 | | |
445 | | |
446 | | |
447 | 0 | #define LOG0(t) log2fh(fh, t) |
448 | 0 | #define LOG1(t,d) log2fh(fh, t,d) |
449 | 0 | #define LOG2(t,d1,d2) log2fh(fh, t,d1,d2) |
450 | 0 | #define LOG3(t,d1,d2,d3) log2fh(fh, t,d1,d2,d3) |
451 | | |
452 | | void video_parameter_set::dump(int fd) const |
453 | 0 | { |
454 | 0 | FILE* fh; |
455 | 0 | if (fd==1) fh=stdout; |
456 | 0 | else if (fd==2) fh=stderr; |
457 | 0 | else { return; } |
458 | | |
459 | 0 | LOG0("----------------- VPS -----------------\n"); |
460 | 0 | LOG1("video_parameter_set_id : %d\n", video_parameter_set_id); |
461 | 0 | LOG1("vps_max_layers : %d\n", vps_max_layers); |
462 | 0 | LOG1("vps_max_sub_layers : %d\n", vps_max_sub_layers); |
463 | 0 | LOG1("vps_temporal_id_nesting_flag : %d\n", vps_temporal_id_nesting_flag); |
464 | |
|
465 | 0 | profile_tier_level_.dump(vps_max_sub_layers, fh); |
466 | | //dump_bit_rate_pic_rate_info(&bit_rate_pic_rate_info, 0, vps_max_sub_layers-1); |
467 | |
|
468 | 0 | LOG1("vps_sub_layer_ordering_info_present_flag : %d\n", |
469 | 0 | vps_sub_layer_ordering_info_present_flag); |
470 | |
|
471 | 0 | if (vps_sub_layer_ordering_info_present_flag) { |
472 | 0 | for (int i=0;i<vps_max_sub_layers;i++) { |
473 | 0 | LOG2("layer %d: vps_max_dec_pic_buffering = %d\n",i,layer[i].vps_max_dec_pic_buffering); |
474 | 0 | LOG1(" vps_max_num_reorder_pics = %d\n",layer[i].vps_max_num_reorder_pics); |
475 | 0 | LOG1(" vps_max_latency_increase = %d\n",layer[i].vps_max_latency_increase); |
476 | 0 | } |
477 | 0 | } |
478 | 0 | else { |
479 | 0 | LOG1("layer (all): vps_max_dec_pic_buffering = %d\n",layer[0].vps_max_dec_pic_buffering); |
480 | 0 | LOG1(" vps_max_num_reorder_pics = %d\n",layer[0].vps_max_num_reorder_pics); |
481 | 0 | LOG1(" vps_max_latency_increase = %d\n",layer[0].vps_max_latency_increase); |
482 | 0 | } |
483 | | |
484 | |
|
485 | 0 | LOG1("vps_max_layer_id = %d\n", vps_max_layer_id); |
486 | 0 | LOG1("vps_num_layer_sets = %d\n", vps_num_layer_sets); |
487 | |
|
488 | 0 | for (int i=1; i <= vps_num_layer_sets-1; i++) |
489 | 0 | for (int j=0; j <= vps_max_layer_id; j++) |
490 | 0 | { |
491 | 0 | LOG3("layer_id_included_flag[%d][%d] = %d\n",i,j, |
492 | 0 | int(layer_id_included_flag[i][j])); |
493 | 0 | } |
494 | |
|
495 | 0 | LOG1("vps_timing_info_present_flag = %d\n", |
496 | 0 | vps_timing_info_present_flag); |
497 | |
|
498 | 0 | if (vps_timing_info_present_flag) { |
499 | 0 | LOG1("vps_num_units_in_tick = %d\n", vps_num_units_in_tick); |
500 | 0 | LOG1("vps_time_scale = %d\n", vps_time_scale); |
501 | 0 | LOG1("vps_poc_proportional_to_timing_flag = %d\n", vps_poc_proportional_to_timing_flag); |
502 | |
|
503 | 0 | if (vps_poc_proportional_to_timing_flag) { |
504 | 0 | LOG1("vps_num_ticks_poc_diff_one = %d\n", vps_num_ticks_poc_diff_one); |
505 | 0 | LOG1("vps_num_hrd_parameters = %d\n", vps_num_hrd_parameters); |
506 | |
|
507 | 0 | for (int i=0; i<vps_num_hrd_parameters; i++) { |
508 | 0 | LOG2("hrd_layer_set_idx[%d] = %d\n", i, hrd_layer_set_idx[i]); |
509 | |
|
510 | 0 | if (i > 0) { |
511 | 0 | LOG2("cprms_present_flag[%d] = %d\n", i, cprms_present_flag[i]); |
512 | 0 | } |
513 | | |
514 | | //hrd_parameters(cprms_present_flag[i], vps_max_sub_layers_minus1) |
515 | |
|
516 | 0 | return; // TODO: decode hrd_parameters() |
517 | 0 | } |
518 | 0 | } |
519 | 0 | } |
520 | | |
521 | 0 | LOG1("vps_extension_flag = %d\n", vps_extension_flag); |
522 | 0 | } |
523 | | |
524 | | |
525 | | static const char* profile_name(profile_idc p) |
526 | 0 | { |
527 | 0 | switch (p) { |
528 | 0 | case Profile_Main: return "Main"; |
529 | 0 | case Profile_Main10: return "Main10"; |
530 | 0 | case Profile_MainStillPicture: return "MainStillPicture"; |
531 | 0 | case Profile_FormatRangeExtensions: return "FormatRangeExtensions"; |
532 | 0 | default: |
533 | 0 | return "(unknown)"; |
534 | 0 | } |
535 | 0 | } |
536 | | |
537 | | |
538 | | void profile_data::dump(bool general, FILE* fh) const |
539 | 0 | { |
540 | 0 | const char* prefix = (general ? "general" : "sub_layer"); |
541 | |
|
542 | 0 | if (profile_present_flag) { |
543 | 0 | LOG2(" %s_profile_space : %d\n", prefix,profile_space); |
544 | 0 | LOG2(" %s_tier_flag : %d\n", prefix,tier_flag); |
545 | 0 | LOG2(" %s_profile_idc : %s\n", prefix, profile_name(profile_idc)); |
546 | |
|
547 | 0 | LOG1(" %s_profile_compatibility_flags: ", prefix); |
548 | 0 | for (int i=0; i<32; i++) { |
549 | 0 | if (i) LOG0("*,"); |
550 | 0 | LOG1("*%d",profile_compatibility_flag[i]); |
551 | 0 | } |
552 | 0 | LOG0("*\n"); |
553 | 0 | LOG2(" %s_progressive_source_flag : %d\n",prefix,progressive_source_flag); |
554 | 0 | LOG2(" %s_interlaced_source_flag : %d\n",prefix,interlaced_source_flag); |
555 | 0 | LOG2(" %s_non_packed_constraint_flag : %d\n",prefix,non_packed_constraint_flag); |
556 | 0 | LOG2(" %s_frame_only_constraint_flag : %d\n",prefix,frame_only_constraint_flag); |
557 | 0 | } |
558 | |
|
559 | 0 | if (level_present_flag) { |
560 | 0 | LOG3(" %s_level_idc : %d (%4.2f)\n", prefix,level_idc, level_idc/30.0f); |
561 | 0 | } |
562 | 0 | } |
563 | | |
564 | | |
565 | | void profile_tier_level::dump(int max_sub_layers, FILE* fh) const |
566 | 0 | { |
567 | 0 | general.dump(true, fh); |
568 | |
|
569 | 0 | for (int i=0; i<max_sub_layers-1; i++) |
570 | 0 | { |
571 | 0 | LOG1(" Profile/Tier/Level [Layer %d]\n",i); |
572 | 0 | sub_layer[i].dump(false, fh); |
573 | 0 | } |
574 | 0 | } |
575 | | |
576 | | #undef LOG0 |
577 | | #undef LOG1 |
578 | | #undef LOG2 |
579 | | #undef LOG3 |
580 | | |
581 | | |
582 | | /* |
583 | | void dump_bit_rate_pic_rate_info(struct bit_rate_pic_rate_info* hdr, |
584 | | int TempLevelLow, |
585 | | int TempLevelHigh) |
586 | | { |
587 | | for (int i=TempLevelLow; i<=TempLevelHigh; i++) { |
588 | | |
589 | | LOG(" Bitrate [Layer %d]\n", i); |
590 | | |
591 | | if (hdr->bit_rate_info_present_flag[i]) { |
592 | | LOG(" avg_bit_rate : %d\n", hdr->avg_bit_rate[i]); |
593 | | LOG(" max_bit_rate : %d\n", hdr->max_bit_rate[i]); |
594 | | } |
595 | | |
596 | | if (hdr->pic_rate_info_present_flag[i]) { |
597 | | LOG(" constant_pic_rate_idc : %d\n", hdr->constant_pic_rate_idc[i]); |
598 | | LOG(" avg_pic_rate[i] : %d\n", hdr->avg_pic_rate[i]); |
599 | | } |
600 | | } |
601 | | } |
602 | | */ |