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
79  s->max_content_light_level = get_bits(gb, 16);
80  s->max_pic_average_light_level = get_bits(gb, 16);
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);
95  s->quincunx_subsampling = get_bits1(gb);
96  s->content_interpretation_type = get_bits(gb, 6);
97 
98  // spatial_flipping_flag, frame0_flipped_flag, field_views_flag
99  skip_bits(gb, 3);
100  s->current_frame_is_frame0_flag = get_bits1(gb);
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 {
131  HEVCSEIPictureTiming *h = &s->picture_timing;
132  HEVCSPS *sps;
133 
134  if (!ps->sps_list[s->active_seq_parameter_set_id])
135  return(AVERROR(ENOMEM));
136  sps = (HEVCSPS*)ps->sps_list[s->active_seq_parameter_set_id]->data;
137 
138  if (sps->vui.frame_field_info_present_flag) {
139  int pic_struct = get_bits(gb, 4);
140  h->picture_struct = AV_PICTURE_STRUCTURE_UNKNOWN;
141  if (pic_struct == 2 || pic_struct == 10 || pic_struct == 12) {
142  av_log(logctx, AV_LOG_DEBUG, "BOTTOM Field\n");
143  h->picture_struct = AV_PICTURE_STRUCTURE_BOTTOM_FIELD;
144  } else if (pic_struct == 1 || pic_struct == 9 || pic_struct == 11) {
145  av_log(logctx, AV_LOG_DEBUG, "TOP Field\n");
146  h->picture_struct = AV_PICTURE_STRUCTURE_TOP_FIELD;
147  } else if (pic_struct == 7) {
148  av_log(logctx, AV_LOG_DEBUG, "Frame/Field Doubling\n");
149  h->picture_struct = HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING;
150  } else if (pic_struct == 8) {
151  av_log(logctx, AV_LOG_DEBUG, "Frame/Field Tripling\n");
152  h->picture_struct = HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING;
153  }
154  get_bits(gb, 2); // source_scan_type
155  get_bits(gb, 1); // duplicate_flag
156  skip_bits1(gb);
157  size--;
158  }
159  skip_bits_long(gb, 8 * size);
160 
161  return 0;
162 }
163 
165  int size)
166 {
167  int flag;
168  int user_data_type_code;
169  int cc_count;
170 
171  if (size < 3)
172  return AVERROR(EINVAL);
173 
174  user_data_type_code = get_bits(gb, 8);
175  if (user_data_type_code == 0x3) {
176  skip_bits(gb, 1); // reserved
177 
178  flag = get_bits(gb, 1); // process_cc_data_flag
179  if (flag) {
180  skip_bits(gb, 1);
181  cc_count = get_bits(gb, 5);
182  skip_bits(gb, 8); // reserved
183  size -= 2;
184 
185  if (cc_count && size >= cc_count * 3) {
186  int old_size = s->buf_ref ? s->buf_ref->size : 0;
187  const uint64_t new_size = (old_size + cc_count
188  * UINT64_C(3));
189  int i, ret;
190 
191  if (new_size > INT_MAX)
192  return AVERROR(EINVAL);
193 
194  /* Allow merging of the cc data from two fields. */
195  ret = av_buffer_realloc(&s->buf_ref, new_size);
196  if (ret < 0)
197  return ret;
198 
199  for (i = 0; i < cc_count; i++) {
200  s->buf_ref->data[old_size++] = get_bits(gb, 8);
201  s->buf_ref->data[old_size++] = get_bits(gb, 8);
202  s->buf_ref->data[old_size++] = get_bits(gb, 8);
203  }
204  skip_bits(gb, 8); // marker_bits
205  }
206  }
207  } else {
208  int i;
209  for (i = 0; i < size - 1; i++)
210  skip_bits(gb, 8);
211  }
212 
213  return 0;
214 }
215 
217  int size)
218 {
219  uint32_t country_code;
220  uint32_t user_identifier;
221 
222  if (size < 7)
223  return AVERROR(EINVAL);
224  size -= 7;
225 
226  country_code = get_bits(gb, 8);
227  if (country_code == 0xFF) {
228  skip_bits(gb, 8);
229  size--;
230  }
231 
232  skip_bits(gb, 8);
233  skip_bits(gb, 8);
234 
235  user_identifier = get_bits_long(gb, 32);
236 
237  switch (user_identifier) {
238  case MKBETAG('G', 'A', '9', '4'):
239  return decode_registered_user_data_closed_caption(&s->a53_caption, gb, size);
240  default:
241  skip_bits_long(gb, size * 8);
242  break;
243  }
244  return 0;
245 }
246 
248 {
249  int num_sps_ids_minus1;
250  int i;
251  unsigned active_seq_parameter_set_id;
252 
253  get_bits(gb, 4); // active_video_parameter_set_id
254  get_bits(gb, 1); // self_contained_cvs_flag
255  get_bits(gb, 1); // num_sps_ids_minus1
256  num_sps_ids_minus1 = get_ue_golomb_long(gb); // num_sps_ids_minus1
257 
258  if (num_sps_ids_minus1 < 0 || num_sps_ids_minus1 > 15) {
259  av_log(logctx, AV_LOG_ERROR, "num_sps_ids_minus1 %d invalid\n", num_sps_ids_minus1);
260  return AVERROR_INVALIDDATA;
261  }
262 
263  active_seq_parameter_set_id = get_ue_golomb_long(gb);
264  if (active_seq_parameter_set_id >= HEVC_MAX_SPS_COUNT) {
265  av_log(logctx, AV_LOG_ERROR, "active_parameter_set_id %d invalid\n", active_seq_parameter_set_id);
266  return AVERROR_INVALIDDATA;
267  }
268  s->active_seq_parameter_set_id = active_seq_parameter_set_id;
269 
270  for (i = 1; i <= num_sps_ids_minus1; i++)
271  get_ue_golomb_long(gb); // active_seq_parameter_set_id[i]
272 
273  return 0;
274 }
275 
277 {
278  s->present = 1;
279  s->preferred_transfer_characteristics = get_bits(gb, 8);
280  return 0;
281 }
282 
283 static int decode_nal_sei_prefix(GetBitContext *gb, void *logctx, HEVCSEI *s,
284  const HEVCParamSets *ps, int type, int size)
285 {
286  switch (type) {
287  case 256: // Mismatched value from HM 8.1
288  return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gb);
290  return decode_nal_sei_frame_packing_arrangement(&s->frame_packing, gb);
292  return decode_nal_sei_display_orientation(&s->display_orientation, gb);
294  return decode_nal_sei_pic_timing(s, gb, ps, logctx, size);
296  return decode_nal_sei_mastering_display_info(&s->mastering_display, gb);
298  return decode_nal_sei_content_light_info(&s->content_light, gb);
300  return decode_nal_sei_active_parameter_sets(s, gb, logctx);
304  return decode_nal_sei_alternative_transfer(&s->alternative_transfer, gb);
305  default:
306  av_log(logctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
307  skip_bits_long(gb, 8 * size);
308  return 0;
309  }
310 }
311 
312 static int decode_nal_sei_suffix(GetBitContext *gb, void *logctx, HEVCSEI *s,
313  int type, int size)
314 {
315  switch (type) {
317  return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gb);
318  default:
319  av_log(logctx, AV_LOG_DEBUG, "Skipped SUFFIX SEI %d\n", type);
320  skip_bits_long(gb, 8 * size);
321  return 0;
322  }
323 }
324 
325 static int decode_nal_sei_message(GetBitContext *gb, void *logctx, HEVCSEI *s,
326  const HEVCParamSets *ps, int nal_unit_type)
327 {
328  int payload_type = 0;
329  int payload_size = 0;
330  int byte = 0xFF;
331  av_log(logctx, AV_LOG_DEBUG, "Decoding SEI\n");
332 
333  while (byte == 0xFF) {
334  if (get_bits_left(gb) < 16 || payload_type > INT_MAX - 255)
335  return AVERROR_INVALIDDATA;
336  byte = get_bits(gb, 8);
337  payload_type += byte;
338  }
339  byte = 0xFF;
340  while (byte == 0xFF) {
341  if (get_bits_left(gb) < 8 + 8LL*payload_size)
342  return AVERROR_INVALIDDATA;
343  byte = get_bits(gb, 8);
344  payload_size += byte;
345  }
346  if (get_bits_left(gb) < 8LL*payload_size)
347  return AVERROR_INVALIDDATA;
348  if (nal_unit_type == HEVC_NAL_SEI_PREFIX) {
349  return decode_nal_sei_prefix(gb, logctx, s, ps, payload_type, payload_size);
350  } else { /* nal_unit_type == NAL_SEI_SUFFIX */
351  return decode_nal_sei_suffix(gb, logctx, s, payload_type, payload_size);
352  }
353 }
354 
356 {
357  return get_bits_left(gb) > 0 && show_bits(gb, 8) != 0x80;
358 }
359 
361  const HEVCParamSets *ps, int type)
362 {
363  int ret;
364 
365  do {
366  ret = decode_nal_sei_message(gb, logctx, s, ps, type);
367  if (ret < 0)
368  return ret;
369  } while (more_rbsp_data(gb));
370  return 1;
371 }
372 
374 {
375  av_buffer_unref(&s->a53_caption.buf_ref);
376 }
decode_nal_sei_frame_packing_arrangement
static int decode_nal_sei_frame_packing_arrangement(HEVCSEIFramePacking *s, GetBitContext *gb)
Definition: hevc_sei.c:88
decode_registered_user_data_closed_caption
static int decode_registered_user_data_closed_caption(HEVCSEIA53Caption *s, GetBitContext *gb, int size)
Definition: hevc_sei.c:164
HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO
@ HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO
Definition: hevc_sei.h:57
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:291
HEVCSEIAlternativeTransfer
Definition: hevc_sei.h:108
HEVC_SEI_TYPE_DISPLAY_ORIENTATION
@ HEVC_SEI_TYPE_DISPLAY_ORIENTATION
Definition: hevc_sei.h:47
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:849
AVERROR
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
av_buffer_realloc
int av_buffer_realloc(AVBufferRef **pbuf, int size)
Reallocate a given buffer.
Definition: buffer.c:169
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:89
AV_PICTURE_STRUCTURE_UNKNOWN
@ AV_PICTURE_STRUCTURE_UNKNOWN
Definition: avcodec.h:3347
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:546
HEVC_SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS
@ HEVC_SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS
Definition: hevc_sei.h:58
decode_nal_sei_mastering_display_info
static int decode_nal_sei_mastering_display_info(HEVCSEIMasteringDisplay *s, GetBitContext *gb)
Definition: hevc_sei.c:53
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:467
golomb.h
exp golomb vlc stuff
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
HEVCSEIA53Caption
Definition: hevc_sei.h:90
GetBitContext
Definition: get_bits.h:61
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
decode_nal_sei_active_parameter_sets
static int decode_nal_sei_active_parameter_sets(HEVCSEI *s, GetBitContext *gb, void *logctx)
Definition: hevc_sei.c:247
decode_nal_sei_pic_timing
static int decode_nal_sei_pic_timing(HEVCSEI *s, GetBitContext *gb, const HEVCParamSets *ps, void *logctx, int size)
Definition: hevc_sei.c:128
ff_hevc_decode_nal_sei
int ff_hevc_decode_nal_sei(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int type)
Definition: hevc_sei.c:360
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
decode_nal_sei_user_data_registered_itu_t_t35
static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCSEI *s, GetBitContext *gb, int size)
Definition: hevc_sei.c:216
decode_nal_sei_message
static int decode_nal_sei_message(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int nal_unit_type)
Definition: hevc_sei.c:325
s
#define s(width, name)
Definition: cbs_vp9.c:257
decode_nal_sei_prefix
static int decode_nal_sei_prefix(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int type, int size)
Definition: hevc_sei.c:283
HEVC_SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35
@ HEVC_SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35
Definition: hevc_sei.h:36
HEVCSEI
Definition: hevc_sei.h:113
HEVCSEIMasteringDisplay
Definition: hevc_sei.h:94
HEVCSEIPictureHash
Definition: hevc_sei.h:67
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
HEVCSEIFramePacking
Definition: hevc_sei.h:72
HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING
@ HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING
Definition: hevc_sei.h:64
if
if(ret)
Definition: filter_design.txt:179
AV_PICTURE_STRUCTURE_BOTTOM_FIELD
@ AV_PICTURE_STRUCTURE_BOTTOM_FIELD
Definition: avcodec.h:3349
decode_nal_sei_content_light_info
static int decode_nal_sei_content_light_info(HEVCSEIContentLight *s, GetBitContext *gb)
Definition: hevc_sei.c:76
av_buffer_unref
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
AV_PICTURE_STRUCTURE_TOP_FIELD
@ AV_PICTURE_STRUCTURE_TOP_FIELD
Definition: avcodec.h:3348
HEVCSEIDisplayOrientation
Definition: hevc_sei.h:80
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
byte
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:95
size
int size
Definition: twinvq_data.h:11134
MKBETAG
#define MKBETAG(a, b, c, d)
Definition: common.h:407
HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING
@ HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING
Definition: hevc_sei.h:63
skip_bits1
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:538
HEVC_SEI_TYPE_PICTURE_TIMING
@ HEVC_SEI_TYPE_PICTURE_TIMING
Definition: hevc_sei.h:33
decode_nal_sei_display_orientation
static int decode_nal_sei_display_orientation(HEVCSEIDisplayOrientation *s, GetBitContext *gb)
Definition: hevc_sei.c:113
flag
#define flag(name)
Definition: cbs_av1.c:557
more_rbsp_data
static int more_rbsp_data(GetBitContext *gb)
Definition: hevc_sei.c:355
hevc_ps.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
decode_nal_sei_suffix
static int decode_nal_sei_suffix(GetBitContext *gb, void *logctx, HEVCSEI *s, int type, int size)
Definition: hevc_sei.c:312
show_bits
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:446
HEVC_MAX_SPS_COUNT
@ HEVC_MAX_SPS_COUNT
Definition: hevc.h:112
HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO
@ HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO
Definition: hevc_sei.h:56
HEVC_SEI_TYPE_FRAME_PACKING
@ HEVC_SEI_TYPE_FRAME_PACKING
Definition: hevc_sei.h:46
uint8_t
uint8_t
Definition: audio_convert.c:194
decode_nal_sei_alternative_transfer
static int decode_nal_sei_alternative_transfer(HEVCSEIAlternativeTransfer *s, GetBitContext *gb)
Definition: hevc_sei.c:276
ret
ret
Definition: filter_design.txt:187
ff_hevc_reset_sei
void ff_hevc_reset_sei(HEVCSEI *s)
Reset SEI values that are stored on the Context.
Definition: hevc_sei.c:373
HEVC_SEI_TYPE_ACTIVE_PARAMETER_SETS
@ HEVC_SEI_TYPE_ACTIVE_PARAMETER_SETS
Definition: hevc_sei.h:49
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
HEVCParamSets::sps_list
AVBufferRef * sps_list[HEVC_MAX_SPS_COUNT]
Definition: hevc_ps.h:329
get_ue_golomb_long
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
HEVCSPS
Definition: hevc_ps.h:153
decode_nal_sei_decoded_picture_hash
static int decode_nal_sei_decoded_picture_hash(HEVCSEIPictureHash *s, GetBitContext *gb)
Definition: hevc_sei.c:29
HEVCSEIContentLight
Definition: hevc_sei.h:102
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
h
h
Definition: vp9dsp_template.c:2038
HEVC_SEI_TYPE_DECODED_PICTURE_HASH
@ HEVC_SEI_TYPE_DECODED_PICTURE_HASH
Definition: hevc_sei.h:52
HEVCSEIPictureTiming
Definition: hevc_sei.h:86
HEVC_NAL_SEI_PREFIX
@ HEVC_NAL_SEI_PREFIX
Definition: hevc.h:68
hevc_sei.h
HEVCParamSets
Definition: hevc_ps.h:327