Libav
hevc_sei.c
Go to the documentation of this file.
1 /*
2  * HEVC Supplementary Enhancement Information messages
3  *
4  * Copyright (C) 2012 - 2013 Guillaume Martres
5  * Copyright (C) 2012 - 2013 Gildas Cocherel
6  * Copyright (C) 2013 Vittorio Giovara
7  *
8  * This file is part of Libav.
9  *
10  * Libav is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * Libav is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with Libav; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23  */
24 
25 #include "golomb.h"
26 #include "hevc.h"
27 
29 {
30  int cIdx, i;
31  GetBitContext *gb = &s->HEVClc.gb;
32  uint8_t hash_type = get_bits(gb, 8);
33 
34  for (cIdx = 0; cIdx < 3; cIdx++) {
35  if (hash_type == 0) {
36  s->is_md5 = 1;
37  for (i = 0; i < 16; i++)
38  s->md5[cIdx][i] = get_bits(gb, 8);
39  } else if (hash_type == 1) {
40  // picture_crc = get_bits(gb, 16);
41  skip_bits(gb, 16);
42  } else if (hash_type == 2) {
43  // picture_checksum = get_bits(gb, 32);
44  skip_bits(gb, 32);
45  }
46  }
47 }
48 
50 {
51  GetBitContext *gb = &s->HEVClc.gb;
52 
53  get_ue_golomb(gb); // frame_packing_arrangement_id
55 
60 
61  // the following skips spatial_flipping_flag frame0_flipped_flag
62  // field_views_flag current_frame_is_frame0_flag
63  // frame0_self_contained_flag frame1_self_contained_flag
64  skip_bits(gb, 6);
65 
67  skip_bits(gb, 16); // frame[01]_grid_position_[xy]
68  skip_bits(gb, 8); // frame_packing_arrangement_reserved_byte
69  skip_bits1(gb); // frame_packing_arrangement_persistance_flag
70  }
71  skip_bits1(gb); // upsampled_aspect_ratio_flag
72 }
73 
75 {
76  GetBitContext *gb = &s->HEVClc.gb;
77 
78  int payload_type = 0;
79  int payload_size = 0;
80  int byte = 0xFF;
81  av_log(s->avctx, AV_LOG_DEBUG, "Decoding SEI\n");
82 
83  while (byte == 0xFF) {
84  byte = get_bits(gb, 8);
85  payload_type += byte;
86  }
87  byte = 0xFF;
88  while (byte == 0xFF) {
89  byte = get_bits(gb, 8);
90  payload_size += byte;
91  }
92  if (s->nal_unit_type == NAL_SEI_PREFIX) {
93  if (payload_type == 256)
95  else if (payload_type == 45)
97  else {
98  av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", payload_type);
99  skip_bits(gb, 8 * payload_size);
100  }
101  } else { /* nal_unit_type == NAL_SEI_SUFFIX */
102  if (payload_type == 132)
104  else {
105  av_log(s->avctx, AV_LOG_DEBUG, "Skipped SUFFIX SEI %d\n", payload_type);
106  skip_bits(gb, 8 * payload_size);
107  }
108  }
109  return 0;
110 }
111 
113 {
114  return get_bits_left(gb) > 0 && show_bits(gb, 8) != 0x80;
115 }
116 
118 {
119  do {
121  } while (more_rbsp_data(&s->HEVClc.gb));
122  return 0;
123 }