Coverage Report

Created: 2026-07-25 07:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/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
10.3k
{
104
10.3k
  uint32_t vlc;
105
106
10.3k
  video_parameter_set_id = vlc = reader->get_bits(4);
107
10.3k
  if (vlc >= DE265_MAX_VPS_SETS) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
108
109
10.3k
  reader->skip_bits(2);
110
10.3k
  vps_max_layers = vlc = reader->get_bits(6) +1;
111
10.3k
  if (vlc > 63) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; // vps_max_layers_minus1 (range 0...63)
112
113
10.2k
  vps_max_sub_layers = vlc = reader->get_bits(3) +1;
114
10.2k
  if (vlc >= MAX_TEMPORAL_SUBLAYERS) return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
115
116
10.1k
  vps_temporal_id_nesting_flag = reader->get_bits(1);
117
10.1k
  reader->skip_bits(16);
118
119
10.1k
  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
10.1k
  vps_sub_layer_ordering_info_present_flag = reader->get_bits(1);
127
  //assert(vps_max_sub_layers-1 < MAX_TEMPORAL_SUBLAYERS);
128
129
10.1k
  int firstLayerRead = vps_sub_layer_ordering_info_present_flag ? 0 : (vps_max_sub_layers-1);
130
131
17.3k
  for (int i=firstLayerRead;i<vps_max_sub_layers;i++) {
132
10.3k
    uint32_t v1 = reader->get_uvlc();
133
10.3k
    uint32_t v2 = reader->get_uvlc();
134
10.3k
    uint32_t v3 = reader->get_uvlc();
135
136
10.3k
    if (v1 == UVLC_ERROR || v2 == UVLC_ERROR || v3 == UVLC_ERROR) {
137
1.40k
      return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
138
1.40k
    }
139
140
8.92k
    if (v1 > 16 || v2 > v1) {
141
1.77k
      return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
142
1.77k
    }
143
144
7.14k
    layer[i].vps_max_dec_pic_buffering = v1;
145
7.14k
    layer[i].vps_max_num_reorder_pics  = v2;
146
7.14k
    layer[i].vps_max_latency_increase  = v3;
147
7.14k
  }
148
149
7.00k
  if (!vps_sub_layer_ordering_info_present_flag) {
150
2.41k
    assert(firstLayerRead < MAX_TEMPORAL_SUBLAYERS);
151
152
2.62k
    for (int i=0;i<firstLayerRead;i++) {
153
210
      layer[i].vps_max_dec_pic_buffering = layer[firstLayerRead].vps_max_dec_pic_buffering;
154
210
      layer[i].vps_max_num_reorder_pics  = layer[firstLayerRead].vps_max_num_reorder_pics;
155
210
      layer[i].vps_max_latency_increase  = layer[firstLayerRead].vps_max_latency_increase;
156
210
    }
157
2.41k
  }
158
159
160
7.00k
  vps_max_layer_id = reader->get_bits(6);
161
7.00k
  if ((vlc = reader->get_uvlc()) == UVLC_ERROR ||
162
6.92k
      vlc+1>=1024) {
163
90
    errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false);
164
90
    return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
165
90
  }
166
6.91k
  vps_num_layer_sets = vlc + 1;
167
168
6.91k
  layer_id_included_flag.resize(vps_num_layer_sets);
169
170
86.4k
  for (int i=1; i <= vps_num_layer_sets-1; i++)
171
79.5k
    {
172
79.5k
      layer_id_included_flag[i].resize(vps_max_layer_id+1);
173
174
2.28M
      for (int j=0; j <= vps_max_layer_id; j++)
175
2.20M
        {
176
2.20M
          layer_id_included_flag[i][j] = reader->get_bits(1);
177
2.20M
        }
178
79.5k
    }
179
180
6.91k
  vps_timing_info_present_flag = reader->get_bits(1);
181
182
6.91k
  if (vps_timing_info_present_flag) {
183
217
    vps_num_units_in_tick = reader->get_bits(32);
184
217
    vps_time_scale        = reader->get_bits(32);
185
217
    vps_poc_proportional_to_timing_flag = reader->get_bits(1);
186
187
217
    if (vps_poc_proportional_to_timing_flag) {
188
17
      vlc = reader->get_uvlc();
189
17
      if (vlc == UVLC_ERROR) {
190
1
        errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false);
191
1
        return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
192
1
      }
193
16
      vps_num_ticks_poc_diff_one = vlc + 1;
194
195
16
      vlc = reader->get_uvlc();
196
197
16
      if (vlc == UVLC_ERROR || vlc > vps_num_layer_sets) {
198
6
        errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false);
199
6
        return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
200
6
      }
201
10
      vps_num_hrd_parameters = vlc;
202
203
10
      hrd_layer_set_idx .resize(vps_num_hrd_parameters);
204
10
      cprms_present_flag.resize(vps_num_hrd_parameters);
205
206
10
      for (int i=0; i<vps_num_hrd_parameters; i++) {
207
4
        vlc = reader->get_uvlc();
208
4
        if (vlc == UVLC_ERROR || vlc > 1023) {
209
2
          errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false);
210
2
          return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE;
211
2
        }
212
2
        hrd_layer_set_idx[i] = vlc;
213
214
2
        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
2
        return DE265_OK; // TODO: decode hrd_parameters()
221
4
      }
222
10
    }
223
217
  }
224
225
6.90k
  vps_extension_flag = reader->get_bits(1);
226
227
6.90k
  if (vps_extension_flag) {
228
    /*
229
      while( more_rbsp_data() )
230
      vps_extension_data_flag u(1)
231
      rbsp_trailing_bits()
232
    */
233
84
  }
234
235
6.90k
  return DE265_OK;
236
6.91k
}
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
25.7k
{
326
25.7k
  if (profile_present_flag) {
327
24.5k
    profile_space = reader->get_bits(2);
328
24.5k
    tier_flag = reader->get_bits(1);
329
24.5k
    profile_idc = (enum profile_idc)reader->get_bits(5);
330
331
811k
    for (int i=0; i<32; i++) {
332
786k
      profile_compatibility_flag[i] = reader->get_bits(1);
333
786k
    }
334
335
24.5k
    progressive_source_flag = reader->get_bits(1);
336
24.5k
    interlaced_source_flag  = reader->get_bits(1);
337
24.5k
    non_packed_constraint_flag = reader->get_bits(1);
338
24.5k
    frame_only_constraint_flag = reader->get_bits(1);
339
24.5k
    reader->skip_bits(44);
340
24.5k
  }
341
342
25.7k
  if (level_present_flag) {
343
24.4k
    level_idc = reader->get_bits(8);
344
24.4k
  }
345
25.7k
}
346
347
348
void profile_tier_level::read(bitreader* reader,
349
                              int max_sub_layers)
350
23.9k
{
351
  // --- read the general profile ---
352
353
23.9k
  general.profile_present_flag = true;
354
23.9k
  general.level_present_flag = true;
355
23.9k
  general.read(reader);
356
357
358
  // --- read the profile/levels of the sub-layers ---
359
360
25.7k
  for (int i=0; i<max_sub_layers-1; i++)
361
1.80k
    {
362
1.80k
      sub_layer[i].profile_present_flag = reader->get_bits(1);
363
1.80k
      sub_layer[i].level_present_flag   = reader->get_bits(1);
364
1.80k
    }
365
366
23.9k
  if (max_sub_layers > 1)
367
668
    {
368
4.20k
      for (int i=max_sub_layers-1; i<8; i++)
369
3.53k
        {
370
3.53k
          reader->skip_bits(2);
371
3.53k
        }
372
668
    }
373
374
25.7k
  for (int i=0; i<max_sub_layers-1; i++)
375
1.80k
    {
376
1.80k
      sub_layer[i].read(reader);
377
1.80k
    }
378
23.9k
}
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
*/