FFmpeg
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 FFmpeg.
9  *
10  * FFmpeg 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  * FFmpeg 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 FFmpeg; 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_ps.h"
27 #include "hevc_sei.h"
28 
30 {
31  int cIdx, i;
32  uint8_t hash_type;
33  //uint16_t picture_crc;
34  //uint32_t picture_checksum;
35  hash_type = get_bits(gb, 8);
36 
37  for (cIdx = 0; cIdx < 3/*((s->sps->chroma_format_idc == 0) ? 1 : 3)*/; cIdx++) {
38  if (hash_type == 0) {
39  s->is_md5 = 1;
40  for (i = 0; i < 16; i++)
41  s->md5[cIdx][i] = get_bits(gb, 8);
42  } else if (hash_type == 1) {
43  // picture_crc = get_bits(gb, 16);
44  skip_bits(gb, 16);
45  } else if (hash_type == 2) {
46  // picture_checksum = get_bits_long(gb, 32);
47  skip_bits(gb, 32);
48  }
49  }
50  return 0;
51 }
52 
54 {
55  int i;
56  // Mastering primaries
57  for (i = 0; i < 3; i++) {
58  s->display_primaries[i][0] = get_bits(gb, 16);
59  s->display_primaries[i][1] = get_bits(gb, 16);
60  }
61  // White point (x, y)
62  s->white_point[0] = get_bits(gb, 16);
63  s->white_point[1] = get_bits(gb, 16);
64 
65  // Max and min luminance of mastering display
66  s->max_luminance = get_bits_long(gb, 32);
67  s->min_luminance = get_bits_long(gb, 32);
68 
69  // As this SEI message comes before the first frame that references it,
70  // initialize the flag to 2 and decrement on IRAP access unit so it
71  // persists for the coded video sequence (e.g., between two IRAPs)
72  s->present = 2;
73  return 0;
74 }
75 
77 {
78  // Max and average light levels
81  // As this SEI message comes before the first frame that references it,
82  // initialize the flag to 2 and decrement on IRAP access unit so it
83  // persists for the coded video sequence (e.g., between two IRAPs)
84  s->present = 2;
85  return 0;
86 }
87 
89 {
90  get_ue_golomb_long(gb); // frame_packing_arrangement_id
91  s->present = !get_bits1(gb);
92 
93  if (s->present) {
94  s->arrangement_type = get_bits(gb, 7);
97 
98  // spatial_flipping_flag, frame0_flipped_flag, field_views_flag
99  skip_bits(gb, 3);
101  // frame0_self_contained_flag, frame1_self_contained_flag
102  skip_bits(gb, 2);
103 
104  if (!s->quincunx_subsampling && s->arrangement_type != 5)
105  skip_bits(gb, 16); // frame[01]_grid_position_[xy]
106  skip_bits(gb, 8); // frame_packing_arrangement_reserved_byte
107  skip_bits1(gb); // frame_packing_arrangement_persistence_flag
108  }
109  skip_bits1(gb); // upsampled_aspect_ratio_flag
110  return 0;
111 }
112 
114 {
115  s->present = !get_bits1(gb);
116 
117  if (s->present) {
118  s->hflip = get_bits1(gb); // hor_flip
119  s->vflip = get_bits1(gb); // ver_flip
120 
121  s->anticlockwise_rotation = get_bits(gb, 16);
122  skip_bits1(gb); // display_orientation_persistence_flag
123  }
124 
125  return 0;
126 }
127 
129  void *logctx, int size)
130 {
132  HEVCSPS *sps;
133 
135  return(AVERROR(ENOMEM));
137 
139  int pic_struct = get_bits(gb, 4);
141  if (pic_struct == 2 || pic_struct == 10 || pic_struct == 12) {
142  av_log(logctx, AV_LOG_DEBUG, "BOTTOM Field\n");
144  } else if (pic_struct == 1 || pic_struct == 9 || pic_struct == 11) {
145  av_log(logctx, AV_LOG_DEBUG, "TOP Field\n");
147  }
148  get_bits(gb, 2); // source_scan_type
149  get_bits(gb, 1); // duplicate_flag
150  skip_bits1(gb);
151  size--;
152  }
153  skip_bits_long(gb, 8 * size);
154 
155  return 0;
156 }
157 
159  int size)
160 {
161  int flag;
162  int user_data_type_code;
163  int cc_count;
164 
165  if (size < 3)
166  return AVERROR(EINVAL);
167 
168  user_data_type_code = get_bits(gb, 8);
169  if (user_data_type_code == 0x3) {
170  skip_bits(gb, 1); // reserved
171 
172  flag = get_bits(gb, 1); // process_cc_data_flag
173  if (flag) {
174  skip_bits(gb, 1);
175  cc_count = get_bits(gb, 5);
176  skip_bits(gb, 8); // reserved
177  size -= 2;
178 
179  if (cc_count && size >= cc_count * 3) {
180  const uint64_t new_size = (s->a53_caption_size + cc_count
181  * UINT64_C(3));
182  int i, ret;
183 
184  if (new_size > INT_MAX)
185  return AVERROR(EINVAL);
186 
187  /* Allow merging of the cc data from two fields. */
188  ret = av_reallocp(&s->a53_caption, new_size);
189  if (ret < 0)
190  return ret;
191 
192  for (i = 0; i < cc_count; i++) {
193  s->a53_caption[s->a53_caption_size++] = get_bits(gb, 8);
194  s->a53_caption[s->a53_caption_size++] = get_bits(gb, 8);
195  s->a53_caption[s->a53_caption_size++] = get_bits(gb, 8);
196  }
197  skip_bits(gb, 8); // marker_bits
198  }
199  }
200  } else {
201  int i;
202  for (i = 0; i < size - 1; i++)
203  skip_bits(gb, 8);
204  }
205 
206  return 0;
207 }
208 
210  int size)
211 {
212  uint32_t country_code;
213  uint32_t user_identifier;
214 
215  if (size < 7)
216  return AVERROR(EINVAL);
217  size -= 7;
218 
219  country_code = get_bits(gb, 8);
220  if (country_code == 0xFF) {
221  skip_bits(gb, 8);
222  size--;
223  }
224 
225  skip_bits(gb, 8);
226  skip_bits(gb, 8);
227 
228  user_identifier = get_bits_long(gb, 32);
229 
230  switch (user_identifier) {
231  case MKBETAG('G', 'A', '9', '4'):
233  default:
234  skip_bits_long(gb, size * 8);
235  break;
236  }
237  return 0;
238 }
239 
241 {
242  int num_sps_ids_minus1;
243  int i;
244  unsigned active_seq_parameter_set_id;
245 
246  get_bits(gb, 4); // active_video_parameter_set_id
247  get_bits(gb, 1); // self_contained_cvs_flag
248  get_bits(gb, 1); // num_sps_ids_minus1
249  num_sps_ids_minus1 = get_ue_golomb_long(gb); // num_sps_ids_minus1
250 
251  if (num_sps_ids_minus1 < 0 || num_sps_ids_minus1 > 15) {
252  av_log(logctx, AV_LOG_ERROR, "num_sps_ids_minus1 %d invalid\n", num_sps_ids_minus1);
253  return AVERROR_INVALIDDATA;
254  }
255 
256  active_seq_parameter_set_id = get_ue_golomb_long(gb);
257  if (active_seq_parameter_set_id >= HEVC_MAX_SPS_COUNT) {
258  av_log(logctx, AV_LOG_ERROR, "active_parameter_set_id %d invalid\n", active_seq_parameter_set_id);
259  return AVERROR_INVALIDDATA;
260  }
261  s->active_seq_parameter_set_id = active_seq_parameter_set_id;
262 
263  for (i = 1; i <= num_sps_ids_minus1; i++)
264  get_ue_golomb_long(gb); // active_seq_parameter_set_id[i]
265 
266  return 0;
267 }
268 
270 {
271  s->present = 1;
273  return 0;
274 }
275 
276 static int decode_nal_sei_prefix(GetBitContext *gb, void *logctx, HEVCSEI *s,
277  const HEVCParamSets *ps, int type, int size)
278 {
279  switch (type) {
280  case 256: // Mismatched value from HM 8.1
287  return decode_nal_sei_pic_timing(s, gb, ps, logctx, size);
293  return decode_nal_sei_active_parameter_sets(s, gb, logctx);
298  default:
299  av_log(logctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
300  skip_bits_long(gb, 8 * size);
301  return 0;
302  }
303 }
304 
305 static int decode_nal_sei_suffix(GetBitContext *gb, void *logctx, HEVCSEI *s,
306  int type, int size)
307 {
308  switch (type) {
311  default:
312  av_log(logctx, AV_LOG_DEBUG, "Skipped SUFFIX SEI %d\n", type);
313  skip_bits_long(gb, 8 * size);
314  return 0;
315  }
316 }
317 
318 static int decode_nal_sei_message(GetBitContext *gb, void *logctx, HEVCSEI *s,
319  const HEVCParamSets *ps, int nal_unit_type)
320 {
321  int payload_type = 0;
322  int payload_size = 0;
323  int byte = 0xFF;
324  av_log(logctx, AV_LOG_DEBUG, "Decoding SEI\n");
325 
326  while (byte == 0xFF) {
327  if (get_bits_left(gb) < 16 || payload_type > INT_MAX - 255)
328  return AVERROR_INVALIDDATA;
329  byte = get_bits(gb, 8);
330  payload_type += byte;
331  }
332  byte = 0xFF;
333  while (byte == 0xFF) {
334  if (get_bits_left(gb) < 8 + 8LL*payload_size)
335  return AVERROR_INVALIDDATA;
336  byte = get_bits(gb, 8);
337  payload_size += byte;
338  }
339  if (nal_unit_type == HEVC_NAL_SEI_PREFIX) {
340  return decode_nal_sei_prefix(gb, logctx, s, ps, payload_type, payload_size);
341  } else { /* nal_unit_type == NAL_SEI_SUFFIX */
342  return decode_nal_sei_suffix(gb, logctx, s, payload_type, payload_size);
343  }
344 }
345 
347 {
348  return get_bits_left(gb) > 0 && show_bits(gb, 8) != 0x80;
349 }
350 
352  const HEVCParamSets *ps, int type)
353 {
354  int ret;
355 
356  do {
357  ret = decode_nal_sei_message(gb, logctx, s, ps, type);
358  if (ret < 0)
359  return ret;
360  } while (more_rbsp_data(gb));
361  return 1;
362 }
363 
365 {
368 }
static int decode_nal_sei_suffix(GetBitContext *gb, void *logctx, HEVCSEI *s, int type, int size)
Definition: hevc_sei.c:305
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
int current_frame_is_frame0_flag
Definition: hevc_sei.h:72
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:291
VUI vui
Definition: hevc_ps.h:250
static int decode_nal_sei_display_orientation(HEVCSEIDisplayOrientation *s, GetBitContext *gb)
Definition: hevc_sei.c:113
GLint GLenum type
Definition: opengl_enc.c:104
uint8_t is_md5
Definition: hevc_sei.h:64
int a53_caption_size
Definition: hevc_sei.h:86
static int more_rbsp_data(GetBitContext *gb)
Definition: hevc_sei.c:346
HEVCSEIMasteringDisplay mastering_display
Definition: hevc_sei.h:115
static int decode_nal_sei_message(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int nal_unit_type)
Definition: hevc_sei.c:318
AVBufferRef * sps_list[HEVC_MAX_SPS_COUNT]
Definition: hevc_ps.h:401
HEVCSEIContentLight content_light
Definition: hevc_sei.h:116
uint8_t
static int decode_nal_sei_alternative_transfer(HEVCSEIAlternativeTransfer *s, GetBitContext *gb)
Definition: hevc_sei.c:269
int active_seq_parameter_set_id
Definition: hevc_sei.h:117
int frame_field_info_present_flag
Definition: hevc_ps.h:152
int quincunx_subsampling
Definition: hevc_sei.h:71
ptrdiff_t size
Definition: opengl_enc.c:100
static int decode_nal_sei_content_light_info(HEVCSEIContentLight *s, GetBitContext *gb)
Definition: hevc_sei.c:76
#define av_log(a,...)
static int decode_registered_user_data_closed_caption(HEVCSEIA53Caption *s, GetBitContext *gb, int size)
Definition: hevc_sei.c:158
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:849
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
int content_interpretation_type
Definition: hevc_sei.h:70
uint8_t md5[3][16]
Definition: hevc_sei.h:63
static int decode_nal_sei_active_parameter_sets(HEVCSEI *s, GetBitContext *gb, void *logctx)
Definition: hevc_sei.c:240
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:446
#define s(width, name)
Definition: cbs_vp9.c:257
if(ret)
static unsigned get_ue_golomb_long(GetBitContext *gb)
Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
Definition: golomb.h:105
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
Definition: mem.c:163
void ff_hevc_reset_sei(HEVCSEI *s)
Reset SEI values that are stored on the Context.
Definition: hevc_sei.c:364
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_WB16 unsigned int_TMPL byte
Definition: bytestream.h:87
static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCSEI *s, GetBitContext *gb, int size)
Definition: hevc_sei.c:209
uint8_t * data
The data buffer.
Definition: buffer.h:89
static int decode_nal_sei_frame_packing_arrangement(HEVCSEIFramePacking *s, GetBitContext *gb)
Definition: hevc_sei.c:88
HEVCSEIFramePacking frame_packing
Definition: hevc_sei.h:111
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:538
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:467
uint16_t max_pic_average_light_level
Definition: hevc_sei.h:101
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
HEVCSEIPictureHash picture_hash
Definition: hevc_sei.h:110
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:546
uint8_t * a53_caption
Definition: hevc_sei.h:87
static int decode_nal_sei_decoded_picture_hash(HEVCSEIPictureHash *s, GetBitContext *gb)
Definition: hevc_sei.c:29
HEVCSEIPictureTiming picture_timing
Definition: hevc_sei.h:113
static int decode_nal_sei_pic_timing(HEVCSEI *s, GetBitContext *gb, const HEVCParamSets *ps, void *logctx, int size)
Definition: hevc_sei.c:128
#define flag(name)
Definition: cbs_av1.c:553
HEVCSEIAlternativeTransfer alternative_transfer
Definition: hevc_sei.h:118
HEVCSEIDisplayOrientation display_orientation
Definition: hevc_sei.h:112
uint16_t max_content_light_level
Definition: hevc_sei.h:100
uint32_t max_luminance
Definition: hevc_sei.h:94
#define MKBETAG(a, b, c, d)
Definition: common.h:367
static int decode_nal_sei_prefix(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int type, int size)
Definition: hevc_sei.c:276
uint32_t min_luminance
Definition: hevc_sei.h:95
static int decode_nal_sei_mastering_display_info(HEVCSEIMasteringDisplay *s, GetBitContext *gb)
Definition: hevc_sei.c:53
HEVCSEIA53Caption a53_caption
Definition: hevc_sei.h:114
#define av_freep(p)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
exp golomb vlc stuff
uint16_t white_point[2]
Definition: hevc_sei.h:93
int ff_hevc_decode_nal_sei(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int type)
Definition: hevc_sei.c:351
uint16_t display_primaries[3][2]
Definition: hevc_sei.h:92