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 "atsc_a53.h"
26 #include "golomb.h"
27 #include "hevc_ps.h"
28 #include "hevc_sei.h"
29 
31 {
32  int cIdx, i;
33  uint8_t hash_type;
34  //uint16_t picture_crc;
35  //uint32_t picture_checksum;
36  hash_type = get_bits(gb, 8);
37 
38  for (cIdx = 0; cIdx < 3/*((s->sps->chroma_format_idc == 0) ? 1 : 3)*/; cIdx++) {
39  if (hash_type == 0) {
40  s->is_md5 = 1;
41  for (i = 0; i < 16; i++)
42  s->md5[cIdx][i] = get_bits(gb, 8);
43  } else if (hash_type == 1) {
44  // picture_crc = get_bits(gb, 16);
45  skip_bits(gb, 16);
46  } else if (hash_type == 2) {
47  // picture_checksum = get_bits_long(gb, 32);
48  skip_bits(gb, 32);
49  }
50  }
51  return 0;
52 }
53 
55 {
56  int i;
57  // Mastering primaries
58  for (i = 0; i < 3; i++) {
59  s->display_primaries[i][0] = get_bits(gb, 16);
60  s->display_primaries[i][1] = get_bits(gb, 16);
61  }
62  // White point (x, y)
63  s->white_point[0] = get_bits(gb, 16);
64  s->white_point[1] = get_bits(gb, 16);
65 
66  // Max and min luminance of mastering display
67  s->max_luminance = get_bits_long(gb, 32);
68  s->min_luminance = get_bits_long(gb, 32);
69 
70  // As this SEI message comes before the first frame that references it,
71  // initialize the flag to 2 and decrement on IRAP access unit so it
72  // persists for the coded video sequence (e.g., between two IRAPs)
73  s->present = 2;
74  return 0;
75 }
76 
78 {
79  // Max and average light levels
80  s->max_content_light_level = get_bits(gb, 16);
82  // As this SEI message comes before the first frame that references it,
83  // initialize the flag to 2 and decrement on IRAP access unit so it
84  // persists for the coded video sequence (e.g., between two IRAPs)
85  s->present = 2;
86  return 0;
87 }
88 
90 {
91  get_ue_golomb_long(gb); // frame_packing_arrangement_id
92  s->present = !get_bits1(gb);
93 
94  if (s->present) {
95  s->arrangement_type = get_bits(gb, 7);
98 
99  // spatial_flipping_flag, frame0_flipped_flag, field_views_flag
100  skip_bits(gb, 3);
102  // frame0_self_contained_flag, frame1_self_contained_flag
103  skip_bits(gb, 2);
104 
105  if (!s->quincunx_subsampling && s->arrangement_type != 5)
106  skip_bits(gb, 16); // frame[01]_grid_position_[xy]
107  skip_bits(gb, 8); // frame_packing_arrangement_reserved_byte
108  skip_bits1(gb); // frame_packing_arrangement_persistence_flag
109  }
110  skip_bits1(gb); // upsampled_aspect_ratio_flag
111  return 0;
112 }
113 
115 {
116  s->present = !get_bits1(gb);
117 
118  if (s->present) {
119  s->hflip = get_bits1(gb); // hor_flip
120  s->vflip = get_bits1(gb); // ver_flip
121 
122  s->anticlockwise_rotation = get_bits(gb, 16);
123  skip_bits1(gb); // display_orientation_persistence_flag
124  }
125 
126  return 0;
127 }
128 
130  void *logctx, int size)
131 {
133  HEVCSPS *sps;
134 
136  return(AVERROR(ENOMEM));
138 
140  int pic_struct = get_bits(gb, 4);
142  if (pic_struct == 2 || pic_struct == 10 || pic_struct == 12) {
143  av_log(logctx, AV_LOG_DEBUG, "BOTTOM Field\n");
145  } else if (pic_struct == 1 || pic_struct == 9 || pic_struct == 11) {
146  av_log(logctx, AV_LOG_DEBUG, "TOP Field\n");
148  } else if (pic_struct == 7) {
149  av_log(logctx, AV_LOG_DEBUG, "Frame/Field Doubling\n");
151  } else if (pic_struct == 8) {
152  av_log(logctx, AV_LOG_DEBUG, "Frame/Field Tripling\n");
154  }
155  get_bits(gb, 2); // source_scan_type
156  get_bits(gb, 1); // duplicate_flag
157  skip_bits1(gb);
158  size--;
159  }
160  skip_bits_long(gb, 8 * size);
161 
162  return 0;
163 }
164 
166  int size)
167 {
168  int ret;
169 
170  if (size < 3)
171  return AVERROR(EINVAL);
172 
173  ret = ff_parse_a53_cc(&s->buf_ref, gb->buffer + get_bits_count(gb) / 8, size);
174 
175  if (ret < 0)
176  return ret;
177 
178  skip_bits_long(gb, size * 8);
179 
180  return 0;
181 }
182 
184  int size)
185 {
186  AVBufferRef *buf_ref, **tmp;
187 
188  if (size < 16 || size >= INT_MAX - 1)
189  return AVERROR_INVALIDDATA;
190 
191  tmp = av_realloc_array(s->buf_ref, s->nb_buf_ref + 1, sizeof(*s->buf_ref));
192  if (!tmp)
193  return AVERROR(ENOMEM);
194  s->buf_ref = tmp;
195 
196  buf_ref = av_buffer_alloc(size + 1);
197  if (!buf_ref)
198  return AVERROR(ENOMEM);
199 
200  for (int i = 0; i < size; i++)
201  buf_ref->data[i] = get_bits(gb, 8);
202  buf_ref->data[size] = 0;
203  buf_ref->size = size;
204  s->buf_ref[s->nb_buf_ref++] = buf_ref;
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 
277 {
278  s->num_clock_ts = get_bits(gb, 2);
279 
280  for (int i = 0; i < s->num_clock_ts; i++) {
281  s->clock_timestamp_flag[i] = get_bits(gb, 1);
282 
283  if (s->clock_timestamp_flag[i]) {
284  s->units_field_based_flag[i] = get_bits(gb, 1);
285  s->counting_type[i] = get_bits(gb, 5);
286  s->full_timestamp_flag[i] = get_bits(gb, 1);
287  s->discontinuity_flag[i] = get_bits(gb, 1);
288  s->cnt_dropped_flag[i] = get_bits(gb, 1);
289 
290  s->n_frames[i] = get_bits(gb, 9);
291 
292  if (s->full_timestamp_flag[i]) {
293  s->seconds_value[i] = av_clip(get_bits(gb, 6), 0, 59);
294  s->minutes_value[i] = av_clip(get_bits(gb, 6), 0, 59);
295  s->hours_value[i] = av_clip(get_bits(gb, 5), 0, 23);
296  } else {
297  s->seconds_flag[i] = get_bits(gb, 1);
298  if (s->seconds_flag[i]) {
299  s->seconds_value[i] = av_clip(get_bits(gb, 6), 0, 59);
300  s->minutes_flag[i] = get_bits(gb, 1);
301  if (s->minutes_flag[i]) {
302  s->minutes_value[i] = av_clip(get_bits(gb, 6), 0, 59);
303  s->hours_flag[i] = get_bits(gb, 1);
304  if (s->hours_flag[i]) {
305  s->hours_value[i] = av_clip(get_bits(gb, 5), 0, 23);
306  }
307  }
308  }
309  }
310 
311  s->time_offset_length[i] = get_bits(gb, 5);
312  if (s->time_offset_length[i] > 0) {
314  }
315  }
316  }
317 
318  s->present = 1;
319  return 0;
320 }
321 
322 
323 static int decode_nal_sei_prefix(GetBitContext *gb, void *logctx, HEVCSEI *s,
324  const HEVCParamSets *ps, int type, int size)
325 {
326  switch (type) {
327  case 256: // Mismatched value from HM 8.1
334  return decode_nal_sei_pic_timing(s, gb, ps, logctx, size);
340  return decode_nal_sei_active_parameter_sets(s, gb, logctx);
348  return decode_nal_sei_timecode(&s->timecode, gb);
349  default:
350  av_log(logctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
351  skip_bits_long(gb, 8 * size);
352  return 0;
353  }
354 }
355 
356 static int decode_nal_sei_suffix(GetBitContext *gb, void *logctx, HEVCSEI *s,
357  int type, int size)
358 {
359  switch (type) {
362  default:
363  av_log(logctx, AV_LOG_DEBUG, "Skipped SUFFIX SEI %d\n", type);
364  skip_bits_long(gb, 8 * size);
365  return 0;
366  }
367 }
368 
369 static int decode_nal_sei_message(GetBitContext *gb, void *logctx, HEVCSEI *s,
370  const HEVCParamSets *ps, int nal_unit_type)
371 {
372  int payload_type = 0;
373  int payload_size = 0;
374  int byte = 0xFF;
375  av_log(logctx, AV_LOG_DEBUG, "Decoding SEI\n");
376 
377  while (byte == 0xFF) {
378  if (get_bits_left(gb) < 16 || payload_type > INT_MAX - 255)
379  return AVERROR_INVALIDDATA;
380  byte = get_bits(gb, 8);
381  payload_type += byte;
382  }
383  byte = 0xFF;
384  while (byte == 0xFF) {
385  if (get_bits_left(gb) < 8 + 8LL*payload_size)
386  return AVERROR_INVALIDDATA;
387  byte = get_bits(gb, 8);
388  payload_size += byte;
389  }
390  if (nal_unit_type == HEVC_NAL_SEI_PREFIX) {
391  return decode_nal_sei_prefix(gb, logctx, s, ps, payload_type, payload_size);
392  } else { /* nal_unit_type == NAL_SEI_SUFFIX */
393  return decode_nal_sei_suffix(gb, logctx, s, payload_type, payload_size);
394  }
395 }
396 
398 {
399  return get_bits_left(gb) > 0 && show_bits(gb, 8) != 0x80;
400 }
401 
403  const HEVCParamSets *ps, int type)
404 {
405  int ret;
406 
407  do {
408  ret = decode_nal_sei_message(gb, logctx, s, ps, type);
409  if (ret < 0)
410  return ret;
411  } while (more_rbsp_data(gb));
412  return 1;
413 }
414 
416 {
418 
419  for (int i = 0; i < s->unregistered.nb_buf_ref; i++)
421  s->unregistered.nb_buf_ref = 0;
423 }
static int decode_nal_sei_suffix(GetBitContext *gb, void *logctx, HEVCSEI *s, int type, int size)
Definition: hevc_sei.c:356
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it...
Definition: buffer.c:125
int current_frame_is_frame0_flag
Definition: hevc_sei.h:77
AVBufferRef * buf_ref
Definition: hevc_sei.h:91
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:178
const uint8_t * buffer
Definition: get_bits.h:62
uint8_t hours_flag[3]
Definition: hevc_sei.h:133
static int decode_nal_sei_display_orientation(HEVCSEIDisplayOrientation *s, GetBitContext *gb)
Definition: hevc_sei.c:114
GLint GLenum type
Definition: opengl_enc.c:104
uint8_t counting_type[3]
Definition: hevc_sei.h:123
uint8_t clock_timestamp_flag[3]
Definition: hevc_sei.h:121
uint8_t is_md5
Definition: hevc_sei.h:69
uint8_t minutes_flag[3]
Definition: hevc_sei.h:132
static int more_rbsp_data(GetBitContext *gb)
Definition: hevc_sei.c:397
HEVCSEIMasteringDisplay mastering_display
Definition: hevc_sei.h:145
uint8_t seconds_flag[3]
Definition: hevc_sei.h:131
uint8_t discontinuity_flag[3]
Definition: hevc_sei.h:125
uint8_t cnt_dropped_flag[3]
Definition: hevc_sei.h:126
static int decode_nal_sei_message(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int nal_unit_type)
Definition: hevc_sei.c:369
AVBufferRef * sps_list[HEVC_MAX_SPS_COUNT]
Definition: hevc_ps.h:329
HEVCSEIContentLight content_light
Definition: hevc_sei.h:146
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:147
int frame_field_info_present_flag
Definition: hevc_ps.h:69
int ff_parse_a53_cc(AVBufferRef **pbuf, const uint8_t *data, int size)
Parse a data array for ATSC A53 Part 4 Closed Captions and store them in an AVBufferRef.
Definition: atsc_a53.c:68
HEVCSEIUnregistered unregistered
Definition: hevc_sei.h:144
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
int quincunx_subsampling
Definition: hevc_sei.h:76
ptrdiff_t size
Definition: opengl_enc.c:100
uint8_t time_offset_length[3]
Definition: hevc_sei.h:134
static int decode_nal_sei_content_light_info(HEVCSEIContentLight *s, GetBitContext *gb)
Definition: hevc_sei.c:77
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:198
uint8_t hours_value[3]
Definition: hevc_sei.h:130
uint16_t n_frames[3]
Definition: hevc_sei.h:127
#define av_log(a,...)
static int decode_registered_user_data_closed_caption(HEVCSEIA53Caption *s, GetBitContext *gb, int size)
Definition: hevc_sei.c:165
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:849
int32_t time_offset_value[3]
Definition: hevc_sei.h:135
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
int content_interpretation_type
Definition: hevc_sei.h:75
uint8_t md5[3][16]
Definition: hevc_sei.h:68
static int decode_nal_sei_active_parameter_sets(HEVCSEI *s, GetBitContext *gb, void *logctx)
Definition: hevc_sei.c:240
AVBufferRef ** buf_ref
Definition: hevc_sei.h:95
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:215
uint8_t units_field_based_flag[3]
Definition: hevc_sei.h:122
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
static int decode_nal_sei_user_data_unregistered(HEVCSEIUnregistered *s, GetBitContext *gb, int size)
Definition: hevc_sei.c:183
if(ret)
uint8_t full_timestamp_flag[3]
Definition: hevc_sei.h:124
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:106
void ff_hevc_reset_sei(HEVCSEI *s)
Reset SEI values that are stored on the Context.
Definition: hevc_sei.c:415
AVBufferRef * av_buffer_alloc(int size)
Allocate an AVBuffer of the given size using av_malloc().
Definition: buffer.c:67
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_timecode(HEVCSEITimeCode *s, GetBitContext *gb)
Definition: hevc_sei.c:276
uint8_t minutes_value[3]
Definition: hevc_sei.h:129
static int decode_nal_sei_frame_packing_arrangement(HEVCSEIFramePacking *s, GetBitContext *gb)
Definition: hevc_sei.c:89
HEVCSEIFramePacking frame_packing
Definition: hevc_sei.h:140
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:110
uint8_t num_clock_ts
Definition: hevc_sei.h:120
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
HEVCSEIPictureHash picture_hash
Definition: hevc_sei.h:139
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:546
int size
Size of data in bytes.
Definition: buffer.h:93
static int decode_nal_sei_decoded_picture_hash(HEVCSEIPictureHash *s, GetBitContext *gb)
Definition: hevc_sei.c:30
HEVCSEIPictureTiming picture_timing
Definition: hevc_sei.h:142
static int decode_nal_sei_pic_timing(HEVCSEI *s, GetBitContext *gb, const HEVCParamSets *ps, void *logctx, int size)
Definition: hevc_sei.c:129
A reference to a data buffer.
Definition: buffer.h:81
HEVCSEIAlternativeTransfer alternative_transfer
Definition: hevc_sei.h:148
HEVCSEIDisplayOrientation display_orientation
Definition: hevc_sei.h:141
uint16_t max_content_light_level
Definition: hevc_sei.h:109
#define MKBETAG(a, b, c, d)
Definition: common.h:407
static int decode_nal_sei_prefix(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int type, int size)
Definition: hevc_sei.c:323
HEVCSEITimeCode timecode
Definition: hevc_sei.h:149
uint8_t seconds_value[3]
Definition: hevc_sei.h:128
static int decode_nal_sei_mastering_display_info(HEVCSEIMasteringDisplay *s, GetBitContext *gb)
Definition: hevc_sei.c:54
HEVCSEIA53Caption a53_caption
Definition: hevc_sei.h:143
#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:102
int ff_hevc_decode_nal_sei(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int type)
Definition: hevc_sei.c:402
int i
Definition: input.c:407
uint16_t display_primaries[3][2]
Definition: hevc_sei.h:101
static uint8_t tmp[11]
Definition: aes_ctr.c:26