/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 = true; |
31 | |
|
32 | 0 | profile_space = 0; |
33 | 0 | tier_flag = false; |
34 | 0 | profile_idc = profile; |
35 | |
|
36 | 0 | for (int i=0;i<32;i++) { |
37 | 0 | profile_compatibility_flag[i]=false; |
38 | 0 | } |
39 | |
|
40 | 0 | switch (profile) { |
41 | 0 | case Profile_Main: |
42 | 0 | profile_compatibility_flag[Profile_Main]=true; |
43 | 0 | profile_compatibility_flag[Profile_Main10]=true; |
44 | 0 | break; |
45 | 0 | case Profile_Main10: |
46 | 0 | profile_compatibility_flag[Profile_Main10]=true; |
47 | 0 | break; |
48 | 0 | default: |
49 | 0 | assert(0); |
50 | 0 | } |
51 | | |
52 | 0 | progressive_source_flag = false; |
53 | 0 | interlaced_source_flag = false; |
54 | 0 | non_packed_constraint_flag = false; |
55 | 0 | frame_only_constraint_flag = false; |
56 | | |
57 | | |
58 | | // --- level --- |
59 | |
|
60 | 0 | level_present_flag = true; |
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 | uint32_t vlc; |
105 | |
|
106 | 0 | video_parameter_set_id = vlc = reader->get_bits(4); |
107 | 0 | if (vlc >= DE265_MAX_VPS_SETS) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
108 | | |
109 | 0 | reader->skip_bits(2); |
110 | 0 | vps_max_layers = vlc = reader->get_bits(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 = reader->get_bits(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 = reader->get_bits(1); |
117 | 0 | reader->skip_bits(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 = reader->get_bits(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 | uint32_t v1 = reader->get_uvlc(); |
133 | 0 | uint32_t v2 = reader->get_uvlc(); |
134 | 0 | uint32_t v3 = reader->get_uvlc(); |
135 | |
|
136 | 0 | if (v1 == UVLC_ERROR || v2 == UVLC_ERROR || v3 == UVLC_ERROR) { |
137 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
138 | 0 | } |
139 | | |
140 | 0 | if (v1 > 16 || v2 > v1) { |
141 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
142 | 0 | } |
143 | | |
144 | 0 | layer[i].vps_max_dec_pic_buffering = v1; |
145 | 0 | layer[i].vps_max_num_reorder_pics = v2; |
146 | 0 | layer[i].vps_max_latency_increase = v3; |
147 | 0 | } |
148 | | |
149 | 0 | if (!vps_sub_layer_ordering_info_present_flag) { |
150 | 0 | assert(firstLayerRead < MAX_TEMPORAL_SUBLAYERS); |
151 | | |
152 | 0 | for (int i=0;i<firstLayerRead;i++) { |
153 | 0 | layer[i].vps_max_dec_pic_buffering = layer[firstLayerRead].vps_max_dec_pic_buffering; |
154 | 0 | layer[i].vps_max_num_reorder_pics = layer[firstLayerRead].vps_max_num_reorder_pics; |
155 | 0 | layer[i].vps_max_latency_increase = layer[firstLayerRead].vps_max_latency_increase; |
156 | 0 | } |
157 | 0 | } |
158 | | |
159 | | |
160 | 0 | vps_max_layer_id = reader->get_bits(6); |
161 | 0 | if ((vlc = reader->get_uvlc()) == UVLC_ERROR || |
162 | 0 | vlc+1>=1024) { |
163 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
164 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
165 | 0 | } |
166 | 0 | vps_num_layer_sets = vlc + 1; |
167 | |
|
168 | 0 | layer_id_included_flag.resize(vps_num_layer_sets); |
169 | |
|
170 | 0 | for (int i=1; i <= vps_num_layer_sets-1; i++) |
171 | 0 | { |
172 | 0 | layer_id_included_flag[i].resize(vps_max_layer_id+1); |
173 | |
|
174 | 0 | for (int j=0; j <= vps_max_layer_id; j++) |
175 | 0 | { |
176 | 0 | layer_id_included_flag[i][j] = reader->get_bits(1); |
177 | 0 | } |
178 | 0 | } |
179 | |
|
180 | 0 | vps_timing_info_present_flag = reader->get_bits(1); |
181 | |
|
182 | 0 | if (vps_timing_info_present_flag) { |
183 | 0 | vps_num_units_in_tick = reader->get_bits(32); |
184 | 0 | vps_time_scale = reader->get_bits(32); |
185 | 0 | vps_poc_proportional_to_timing_flag = reader->get_bits(1); |
186 | |
|
187 | 0 | if (vps_poc_proportional_to_timing_flag) { |
188 | 0 | vlc = reader->get_uvlc(); |
189 | 0 | if (vlc == UVLC_ERROR) { |
190 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
191 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
192 | 0 | } |
193 | 0 | vps_num_ticks_poc_diff_one = vlc + 1; |
194 | |
|
195 | 0 | vlc = reader->get_uvlc(); |
196 | |
|
197 | 0 | if (vlc == UVLC_ERROR || vlc > vps_num_layer_sets) { |
198 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
199 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
200 | 0 | } |
201 | 0 | vps_num_hrd_parameters = vlc; |
202 | |
|
203 | 0 | hrd_layer_set_idx .resize(vps_num_hrd_parameters); |
204 | 0 | cprms_present_flag.resize(vps_num_hrd_parameters); |
205 | |
|
206 | 0 | for (int i=0; i<vps_num_hrd_parameters; i++) { |
207 | 0 | vlc = reader->get_uvlc(); |
208 | 0 | if (vlc == UVLC_ERROR || vlc > 1023) { |
209 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
210 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
211 | 0 | } |
212 | 0 | hrd_layer_set_idx[i] = vlc; |
213 | |
|
214 | 0 | if (i > 0) { |
215 | 0 | cprms_present_flag[i] = reader->get_bits(1); |
216 | 0 | } |
217 | | |
218 | | //hrd_parameters(cprms_present_flag[i], vps_max_sub_layers_minus1) |
219 | |
|
220 | 0 | return DE265_OK; // TODO: decode hrd_parameters() |
221 | 0 | } |
222 | 0 | } |
223 | 0 | } |
224 | | |
225 | 0 | vps_extension_flag = reader->get_bits(1); |
226 | |
|
227 | 0 | if (vps_extension_flag) { |
228 | | /* |
229 | | while( more_rbsp_data() ) |
230 | | vps_extension_data_flag u(1) |
231 | | rbsp_trailing_bits() |
232 | | */ |
233 | 0 | } |
234 | |
|
235 | 0 | return DE265_OK; |
236 | 0 | } |
237 | | |
238 | | |
239 | | de265_error video_parameter_set::write(error_queue* errqueue, CABAC_encoder& out) const |
240 | 0 | { |
241 | 0 | if (video_parameter_set_id >= DE265_MAX_VPS_SETS) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
242 | 0 | out.write_bits(video_parameter_set_id,4); |
243 | |
|
244 | 0 | out.write_bits(0x3,2); |
245 | 0 | out.write_bits(vps_max_layers-1,6); |
246 | |
|
247 | 0 | if (vps_max_sub_layers >= MAX_TEMPORAL_SUBLAYERS) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
248 | 0 | out.write_bits(vps_max_sub_layers-1,3); |
249 | |
|
250 | 0 | out.write_bit(vps_temporal_id_nesting_flag); |
251 | 0 | out.write_bits(0xFFFF, 16); |
252 | |
|
253 | 0 | profile_tier_level_.write(out, vps_max_sub_layers); |
254 | | |
255 | | /* |
256 | | read_bit_rate_pic_rate_info(reader, &bit_rate_pic_rate_info, |
257 | | 0, vps_max_sub_layers-1); |
258 | | */ |
259 | |
|
260 | 0 | out.write_bit(vps_sub_layer_ordering_info_present_flag); |
261 | | //assert(vps_max_sub_layers-1 < MAX_TEMPORAL_SUBLAYERS); |
262 | |
|
263 | 0 | int firstLayerRead = vps_sub_layer_ordering_info_present_flag ? 0 : (vps_max_sub_layers-1); |
264 | |
|
265 | 0 | for (int i=firstLayerRead;i<vps_max_sub_layers;i++) { |
266 | 0 | out.write_uvlc(layer[i].vps_max_dec_pic_buffering); |
267 | 0 | out.write_uvlc(layer[i].vps_max_num_reorder_pics); |
268 | 0 | out.write_uvlc(layer[i].vps_max_latency_increase); |
269 | 0 | } |
270 | |
|
271 | 0 | if (vps_num_layer_sets>=1024) { |
272 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
273 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
274 | 0 | } |
275 | | |
276 | 0 | out.write_bits(vps_max_layer_id,6); |
277 | 0 | out.write_uvlc(vps_num_layer_sets-1); |
278 | |
|
279 | 0 | for (int i=1; i <= vps_num_layer_sets-1; i++) |
280 | 0 | for (int j=0; j <= vps_max_layer_id; j++) |
281 | 0 | { |
282 | 0 | out.write_bit(layer_id_included_flag[i][j]); |
283 | 0 | } |
284 | |
|
285 | 0 | out.write_bit(vps_timing_info_present_flag); |
286 | |
|
287 | 0 | if (vps_timing_info_present_flag) { |
288 | 0 | out.write_bits(vps_num_units_in_tick,32); |
289 | 0 | out.write_bits(vps_time_scale ,32); |
290 | 0 | out.write_bit (vps_poc_proportional_to_timing_flag); |
291 | |
|
292 | 0 | if (vps_poc_proportional_to_timing_flag) { |
293 | 0 | out.write_uvlc(vps_num_ticks_poc_diff_one-1); |
294 | 0 | out.write_uvlc(vps_num_hrd_parameters); |
295 | |
|
296 | 0 | for (int i=0; i<vps_num_hrd_parameters; i++) { |
297 | 0 | out.write_uvlc(hrd_layer_set_idx[i]); |
298 | |
|
299 | 0 | if (i > 0) { |
300 | 0 | out.write_bit(cprms_present_flag[i]); |
301 | 0 | } |
302 | | |
303 | | //hrd_parameters(cprms_present_flag[i], vps_max_sub_layers_minus1) |
304 | |
|
305 | 0 | return DE265_OK; // TODO: decode hrd_parameters() |
306 | 0 | } |
307 | 0 | } |
308 | 0 | } |
309 | | |
310 | 0 | out.write_bit(vps_extension_flag); |
311 | |
|
312 | 0 | if (vps_extension_flag) { |
313 | | /* |
314 | | while( more_rbsp_data() ) |
315 | | vps_extension_data_flag u(1) |
316 | | rbsp_trailing_bits() |
317 | | */ |
318 | 0 | } |
319 | |
|
320 | 0 | return DE265_OK; |
321 | 0 | } |
322 | | |
323 | | |
324 | | void profile_data::read(bitreader* reader) |
325 | 0 | { |
326 | 0 | if (profile_present_flag) { |
327 | 0 | profile_space = reader->get_bits(2); |
328 | 0 | tier_flag = reader->get_bits(1); |
329 | 0 | profile_idc = (enum profile_idc)reader->get_bits(5); |
330 | |
|
331 | 0 | for (int i=0; i<32; i++) { |
332 | 0 | profile_compatibility_flag[i] = reader->get_bits(1); |
333 | 0 | } |
334 | |
|
335 | 0 | progressive_source_flag = reader->get_bits(1); |
336 | 0 | interlaced_source_flag = reader->get_bits(1); |
337 | 0 | non_packed_constraint_flag = reader->get_bits(1); |
338 | 0 | frame_only_constraint_flag = reader->get_bits(1); |
339 | 0 | reader->skip_bits(44); |
340 | 0 | } |
341 | |
|
342 | 0 | if (level_present_flag) { |
343 | 0 | level_idc = reader->get_bits(8); |
344 | 0 | } |
345 | 0 | } |
346 | | |
347 | | |
348 | | void profile_tier_level::read(bitreader* reader, |
349 | | int max_sub_layers) |
350 | 0 | { |
351 | | // --- read the general profile --- |
352 | |
|
353 | 0 | general.profile_present_flag = true; |
354 | 0 | general.level_present_flag = true; |
355 | 0 | general.read(reader); |
356 | | |
357 | | |
358 | | // --- read the profile/levels of the sub-layers --- |
359 | |
|
360 | 0 | for (int i=0; i<max_sub_layers-1; i++) |
361 | 0 | { |
362 | 0 | sub_layer[i].profile_present_flag = reader->get_bits(1); |
363 | 0 | sub_layer[i].level_present_flag = reader->get_bits(1); |
364 | 0 | } |
365 | |
|
366 | 0 | if (max_sub_layers > 1) |
367 | 0 | { |
368 | 0 | for (int i=max_sub_layers-1; i<8; i++) |
369 | 0 | { |
370 | 0 | reader->skip_bits(2); |
371 | 0 | } |
372 | 0 | } |
373 | |
|
374 | 0 | for (int i=0; i<max_sub_layers-1; i++) |
375 | 0 | { |
376 | 0 | sub_layer[i].read(reader); |
377 | 0 | } |
378 | 0 | } |
379 | | |
380 | | |
381 | | void profile_data::write(CABAC_encoder& out) const |
382 | 0 | { |
383 | 0 | if (profile_present_flag) |
384 | 0 | { |
385 | 0 | out.write_bits(profile_space,2); |
386 | 0 | out.write_bit (tier_flag); |
387 | 0 | out.write_bits(profile_idc,5); |
388 | |
|
389 | 0 | for (int j=0; j<32; j++) |
390 | 0 | { |
391 | 0 | out.write_bit(profile_compatibility_flag[j]); |
392 | 0 | } |
393 | |
|
394 | 0 | out.write_bit(progressive_source_flag); |
395 | 0 | out.write_bit(interlaced_source_flag); |
396 | 0 | out.write_bit(non_packed_constraint_flag); |
397 | 0 | out.write_bit(frame_only_constraint_flag); |
398 | 0 | out.skip_bits(44); |
399 | 0 | } |
400 | |
|
401 | 0 | if (level_present_flag) |
402 | 0 | { |
403 | 0 | out.write_bits(level_idc,8); |
404 | 0 | } |
405 | 0 | } |
406 | | |
407 | | void profile_tier_level::write(CABAC_encoder& out, int max_sub_layers) const |
408 | 0 | { |
409 | 0 | assert(general.profile_present_flag); |
410 | 0 | assert(general.level_present_flag); |
411 | | |
412 | 0 | general.write(out); |
413 | |
|
414 | 0 | for (int i=0; i<max_sub_layers-1; i++) |
415 | 0 | { |
416 | 0 | out.write_bit(sub_layer[i].profile_present_flag); |
417 | 0 | out.write_bit(sub_layer[i].level_present_flag); |
418 | 0 | } |
419 | |
|
420 | 0 | if (max_sub_layers > 1) |
421 | 0 | { |
422 | 0 | for (int i=max_sub_layers-1; i<8; i++) |
423 | 0 | { |
424 | 0 | out.skip_bits(2); |
425 | 0 | } |
426 | 0 | } |
427 | |
|
428 | 0 | for (int i=0; i<max_sub_layers-1; i++) |
429 | 0 | { |
430 | 0 | sub_layer[i].write(out); |
431 | 0 | } |
432 | 0 | } |
433 | | |
434 | | |
435 | | /* |
436 | | void read_bit_rate_pic_rate_info(bitreader* reader, |
437 | | struct bit_rate_pic_rate_info* hdr, |
438 | | int TempLevelLow, |
439 | | int TempLevelHigh) |
440 | | { |
441 | | for (int i=TempLevelLow; i<=TempLevelHigh; i++) { |
442 | | |
443 | | hdr->bit_rate_info_present_flag[i] = reader->get_bits(1); |
444 | | hdr->pic_rate_info_present_flag[i] = reader->get_bits(1); |
445 | | |
446 | | if (hdr->bit_rate_info_present_flag[i]) { |
447 | | hdr->avg_bit_rate[i] = reader->get_bits(16); |
448 | | hdr->max_bit_rate[i] = reader->get_bits(16); |
449 | | } |
450 | | |
451 | | if (hdr->pic_rate_info_present_flag[i]) { |
452 | | hdr->constant_pic_rate_idc[i] = reader->get_bits(2); |
453 | | hdr->avg_pic_rate[i] = reader->get_bits(16); |
454 | | } |
455 | | } |
456 | | } |
457 | | */ |
458 | | |
459 | | |
460 | | |
461 | 0 | #define LOG0(t) log2fh(fh, t) |
462 | 0 | #define LOG1(t,d) log2fh(fh, t,d) |
463 | 0 | #define LOG2(t,d1,d2) log2fh(fh, t,d1,d2) |
464 | 0 | #define LOG3(t,d1,d2,d3) log2fh(fh, t,d1,d2,d3) |
465 | | |
466 | | void video_parameter_set::dump(int fd) const |
467 | 0 | { |
468 | 0 | FILE* fh; |
469 | 0 | if (fd==1) fh=stdout; |
470 | 0 | else if (fd==2) fh=stderr; |
471 | 0 | else { return; } |
472 | | |
473 | 0 | LOG0("----------------- VPS -----------------\n"); |
474 | 0 | LOG1("video_parameter_set_id : %d\n", video_parameter_set_id); |
475 | 0 | LOG1("vps_max_layers : %d\n", vps_max_layers); |
476 | 0 | LOG1("vps_max_sub_layers : %d\n", vps_max_sub_layers); |
477 | 0 | LOG1("vps_temporal_id_nesting_flag : %d\n", vps_temporal_id_nesting_flag); |
478 | |
|
479 | 0 | profile_tier_level_.dump(vps_max_sub_layers, fh); |
480 | | //dump_bit_rate_pic_rate_info(&bit_rate_pic_rate_info, 0, vps_max_sub_layers-1); |
481 | |
|
482 | 0 | LOG1("vps_sub_layer_ordering_info_present_flag : %d\n", |
483 | 0 | vps_sub_layer_ordering_info_present_flag); |
484 | |
|
485 | 0 | if (vps_sub_layer_ordering_info_present_flag) { |
486 | 0 | for (int i=0;i<vps_max_sub_layers;i++) { |
487 | 0 | LOG2("layer %d: vps_max_dec_pic_buffering = %d\n",i,layer[i].vps_max_dec_pic_buffering); |
488 | 0 | LOG1(" vps_max_num_reorder_pics = %d\n",layer[i].vps_max_num_reorder_pics); |
489 | 0 | LOG1(" vps_max_latency_increase = %d\n",layer[i].vps_max_latency_increase); |
490 | 0 | } |
491 | 0 | } |
492 | 0 | else { |
493 | 0 | LOG1("layer (all): vps_max_dec_pic_buffering = %d\n",layer[0].vps_max_dec_pic_buffering); |
494 | 0 | LOG1(" vps_max_num_reorder_pics = %d\n",layer[0].vps_max_num_reorder_pics); |
495 | 0 | LOG1(" vps_max_latency_increase = %d\n",layer[0].vps_max_latency_increase); |
496 | 0 | } |
497 | | |
498 | |
|
499 | 0 | LOG1("vps_max_layer_id = %d\n", vps_max_layer_id); |
500 | 0 | LOG1("vps_num_layer_sets = %d\n", vps_num_layer_sets); |
501 | |
|
502 | 0 | for (int i=1; i <= vps_num_layer_sets-1; i++) |
503 | 0 | for (int j=0; j <= vps_max_layer_id; j++) |
504 | 0 | { |
505 | 0 | LOG3("layer_id_included_flag[%d][%d] = %d\n",i,j, |
506 | 0 | int(layer_id_included_flag[i][j])); |
507 | 0 | } |
508 | |
|
509 | 0 | LOG1("vps_timing_info_present_flag = %d\n", |
510 | 0 | vps_timing_info_present_flag); |
511 | |
|
512 | 0 | if (vps_timing_info_present_flag) { |
513 | 0 | LOG1("vps_num_units_in_tick = %d\n", vps_num_units_in_tick); |
514 | 0 | LOG1("vps_time_scale = %d\n", vps_time_scale); |
515 | 0 | LOG1("vps_poc_proportional_to_timing_flag = %d\n", vps_poc_proportional_to_timing_flag); |
516 | |
|
517 | 0 | if (vps_poc_proportional_to_timing_flag) { |
518 | 0 | LOG1("vps_num_ticks_poc_diff_one = %d\n", vps_num_ticks_poc_diff_one); |
519 | 0 | LOG1("vps_num_hrd_parameters = %d\n", vps_num_hrd_parameters); |
520 | |
|
521 | 0 | for (int i=0; i<vps_num_hrd_parameters; i++) { |
522 | 0 | LOG2("hrd_layer_set_idx[%d] = %d\n", i, hrd_layer_set_idx[i]); |
523 | |
|
524 | 0 | if (i > 0) { |
525 | 0 | LOG2("cprms_present_flag[%d] = %d\n", i, cprms_present_flag[i]); |
526 | 0 | } |
527 | | |
528 | | //hrd_parameters(cprms_present_flag[i], vps_max_sub_layers_minus1) |
529 | |
|
530 | 0 | return; // TODO: decode hrd_parameters() |
531 | 0 | } |
532 | 0 | } |
533 | 0 | } |
534 | | |
535 | 0 | LOG1("vps_extension_flag = %d\n", vps_extension_flag); |
536 | 0 | } |
537 | | |
538 | | |
539 | | static const char* profile_name(profile_idc p) |
540 | 0 | { |
541 | 0 | switch (p) { |
542 | 0 | case Profile_Main: return "Main"; |
543 | 0 | case Profile_Main10: return "Main10"; |
544 | 0 | case Profile_MainStillPicture: return "MainStillPicture"; |
545 | 0 | case Profile_FormatRangeExtensions: return "FormatRangeExtensions"; |
546 | 0 | default: |
547 | 0 | return "(unknown)"; |
548 | 0 | } |
549 | 0 | } |
550 | | |
551 | | |
552 | | void profile_data::dump(bool general, FILE* fh) const |
553 | 0 | { |
554 | 0 | const char* prefix = (general ? "general" : "sub_layer"); |
555 | |
|
556 | 0 | if (profile_present_flag) { |
557 | 0 | LOG2(" %s_profile_space : %d\n", prefix,profile_space); |
558 | 0 | LOG2(" %s_tier_flag : %d\n", prefix,tier_flag); |
559 | 0 | LOG2(" %s_profile_idc : %s\n", prefix, profile_name(profile_idc)); |
560 | |
|
561 | 0 | LOG1(" %s_profile_compatibility_flags: ", prefix); |
562 | 0 | for (int i=0; i<32; i++) { |
563 | 0 | if (i) LOG0("*,"); |
564 | 0 | LOG1("*%d",profile_compatibility_flag[i]); |
565 | 0 | } |
566 | 0 | LOG0("*\n"); |
567 | 0 | LOG2(" %s_progressive_source_flag : %d\n",prefix,progressive_source_flag); |
568 | 0 | LOG2(" %s_interlaced_source_flag : %d\n",prefix,interlaced_source_flag); |
569 | 0 | LOG2(" %s_non_packed_constraint_flag : %d\n",prefix,non_packed_constraint_flag); |
570 | 0 | LOG2(" %s_frame_only_constraint_flag : %d\n",prefix,frame_only_constraint_flag); |
571 | 0 | } |
572 | |
|
573 | 0 | if (level_present_flag) { |
574 | 0 | LOG3(" %s_level_idc : %d (%4.2f)\n", prefix,level_idc, level_idc/30.0f); |
575 | 0 | } |
576 | 0 | } |
577 | | |
578 | | |
579 | | void profile_tier_level::dump(int max_sub_layers, FILE* fh) const |
580 | 0 | { |
581 | 0 | general.dump(true, fh); |
582 | |
|
583 | 0 | for (int i=0; i<max_sub_layers-1; i++) |
584 | 0 | { |
585 | 0 | LOG1(" Profile/Tier/Level [Layer %d]\n",i); |
586 | 0 | sub_layer[i].dump(false, fh); |
587 | 0 | } |
588 | 0 | } |
589 | | |
590 | | #undef LOG0 |
591 | | #undef LOG1 |
592 | | #undef LOG2 |
593 | | #undef LOG3 |
594 | | |
595 | | |
596 | | /* |
597 | | void dump_bit_rate_pic_rate_info(struct bit_rate_pic_rate_info* hdr, |
598 | | int TempLevelLow, |
599 | | int TempLevelHigh) |
600 | | { |
601 | | for (int i=TempLevelLow; i<=TempLevelHigh; i++) { |
602 | | |
603 | | LOG(" Bitrate [Layer %d]\n", i); |
604 | | |
605 | | if (hdr->bit_rate_info_present_flag[i]) { |
606 | | LOG(" avg_bit_rate : %d\n", hdr->avg_bit_rate[i]); |
607 | | LOG(" max_bit_rate : %d\n", hdr->max_bit_rate[i]); |
608 | | } |
609 | | |
610 | | if (hdr->pic_rate_info_present_flag[i]) { |
611 | | LOG(" constant_pic_rate_idc : %d\n", hdr->constant_pic_rate_idc[i]); |
612 | | LOG(" avg_pic_rate[i] : %d\n", hdr->avg_pic_rate[i]); |
613 | | } |
614 | | } |
615 | | } |
616 | | */ |