FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
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 "bytestream.h"
26 #include "golomb.h"
27 #include "ps.h"
28 #include "sei.h"
29 
31  GetByteContext *gb)
32 {
33  int cIdx;
34  uint8_t hash_type;
35  //uint16_t picture_crc;
36  //uint32_t picture_checksum;
37  hash_type = bytestream2_get_byte(gb);
38 
39  for (cIdx = 0; cIdx < 3/*((s->sps->chroma_format_idc == 0) ? 1 : 3)*/; cIdx++) {
40  if (hash_type == 0) {
41  s->is_md5 = 1;
42  bytestream2_get_buffer(gb, s->md5[cIdx], sizeof(s->md5[cIdx]));
43  } else if (hash_type == 1) {
44  // picture_crc = get_bits(gb, 16);
45  } else if (hash_type == 2) {
46  // picture_checksum = get_bits_long(gb, 32);
47  }
48  }
49  return 0;
50 }
51 
53  const HEVCParamSets *ps, void *logctx)
54 {
55  HEVCSEIPictureTiming *h = &s->picture_timing;
56  const HEVCSPS *sps = ps->sps_list[s->active_seq_parameter_set_id];
57 
58  if (!sps)
59  return AVERROR_INVALIDDATA;
60 
61  if (sps->vui.frame_field_info_present_flag) {
62  int pic_struct = get_bits(gb, 4);
63  h->picture_struct = AV_PICTURE_STRUCTURE_UNKNOWN;
64  if (pic_struct == 2 || pic_struct == 10 || pic_struct == 12) {
65  av_log(logctx, AV_LOG_DEBUG, "BOTTOM Field\n");
66  h->picture_struct = AV_PICTURE_STRUCTURE_BOTTOM_FIELD;
67  } else if (pic_struct == 1 || pic_struct == 9 || pic_struct == 11) {
68  av_log(logctx, AV_LOG_DEBUG, "TOP Field\n");
69  h->picture_struct = AV_PICTURE_STRUCTURE_TOP_FIELD;
70  } else if (pic_struct == 7) {
71  av_log(logctx, AV_LOG_DEBUG, "Frame/Field Doubling\n");
72  h->picture_struct = HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING;
73  } else if (pic_struct == 8) {
74  av_log(logctx, AV_LOG_DEBUG, "Frame/Field Tripling\n");
75  h->picture_struct = HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING;
76  }
77  }
78 
79  return 0;
80 }
81 
83 {
84  HEVCSEIRecoveryPoint *rec = &s->recovery_point;
85  int recovery_poc_cnt = get_se_golomb(gb);
86 
87  if (recovery_poc_cnt > INT16_MAX || recovery_poc_cnt < INT16_MIN)
88  return AVERROR_INVALIDDATA;
89  rec->recovery_poc_cnt = recovery_poc_cnt;
90  rec->exact_match_flag = get_bits1(gb);
91  rec->broken_link_flag = get_bits1(gb);
92  rec->has_recovery_poc = 1;
93 
94  return 0;
95 }
96 
98 {
99  int num_sps_ids_minus1;
100  unsigned active_seq_parameter_set_id;
101 
102  get_bits(gb, 4); // active_video_parameter_set_id
103  get_bits(gb, 1); // self_contained_cvs_flag
104  get_bits(gb, 1); // num_sps_ids_minus1
105  num_sps_ids_minus1 = get_ue_golomb_long(gb); // num_sps_ids_minus1
106 
107  if (num_sps_ids_minus1 < 0 || num_sps_ids_minus1 > 15) {
108  av_log(logctx, AV_LOG_ERROR, "num_sps_ids_minus1 %d invalid\n", num_sps_ids_minus1);
109  return AVERROR_INVALIDDATA;
110  }
111 
112  active_seq_parameter_set_id = get_ue_golomb_long(gb);
113  if (active_seq_parameter_set_id >= HEVC_MAX_SPS_COUNT) {
114  av_log(logctx, AV_LOG_ERROR, "active_parameter_set_id %d invalid\n", active_seq_parameter_set_id);
115  return AVERROR_INVALIDDATA;
116  }
117  s->active_seq_parameter_set_id = active_seq_parameter_set_id;
118 
119  return 0;
120 }
121 
123 {
124  s->num_clock_ts = get_bits(gb, 2);
125 
126  for (int i = 0; i < s->num_clock_ts; i++) {
127  s->clock_timestamp_flag[i] = get_bits(gb, 1);
128 
129  if (s->clock_timestamp_flag[i]) {
130  s->units_field_based_flag[i] = get_bits(gb, 1);
131  s->counting_type[i] = get_bits(gb, 5);
132  s->full_timestamp_flag[i] = get_bits(gb, 1);
133  s->discontinuity_flag[i] = get_bits(gb, 1);
134  s->cnt_dropped_flag[i] = get_bits(gb, 1);
135 
136  s->n_frames[i] = get_bits(gb, 9);
137 
138  if (s->full_timestamp_flag[i]) {
139  s->seconds_value[i] = av_clip(get_bits(gb, 6), 0, 59);
140  s->minutes_value[i] = av_clip(get_bits(gb, 6), 0, 59);
141  s->hours_value[i] = av_clip(get_bits(gb, 5), 0, 23);
142  } else {
143  s->seconds_flag[i] = get_bits(gb, 1);
144  if (s->seconds_flag[i]) {
145  s->seconds_value[i] = av_clip(get_bits(gb, 6), 0, 59);
146  s->minutes_flag[i] = get_bits(gb, 1);
147  if (s->minutes_flag[i]) {
148  s->minutes_value[i] = av_clip(get_bits(gb, 6), 0, 59);
149  s->hours_flag[i] = get_bits(gb, 1);
150  if (s->hours_flag[i]) {
151  s->hours_value[i] = av_clip(get_bits(gb, 5), 0, 23);
152  }
153  }
154  }
155  }
156 
157  s->time_offset_length[i] = get_bits(gb, 5);
158  if (s->time_offset_length[i] > 0) {
159  s->time_offset_value[i] = get_bits_long(gb, s->time_offset_length[i]);
160  }
161  }
162  }
163 
164  s->present = 1;
165  return 0;
166 }
167 
169 {
170  s->prec_ref_display_width = get_ue_golomb(gb);
171  if (s->prec_ref_display_width > 31)
172  return AVERROR_INVALIDDATA;
173  s->ref_viewing_distance_flag = get_bits1(gb);
174  if (s->ref_viewing_distance_flag) {
175  s->prec_ref_viewing_dist = get_ue_golomb(gb);
176  if (s->prec_ref_viewing_dist > 31)
177  return AVERROR_INVALIDDATA;
178  }
179  s->num_ref_displays = get_ue_golomb(gb);
180  if (s->num_ref_displays > 31)
181  return AVERROR_INVALIDDATA;
182  s->num_ref_displays += 1;
183 
184  for (int i = 0; i < s->num_ref_displays; i++) {
185  int length;
186  s->left_view_id[i] = get_ue_golomb(gb);
187  s->right_view_id[i] = get_ue_golomb(gb);
188  s->exponent_ref_display_width[i] = get_bits(gb, 6);
189  if (s->exponent_ref_display_width[i] > 62)
190  return AVERROR_INVALIDDATA;
191  else if (!s->exponent_ref_display_width[i])
192  length = FFMAX(0, (int)s->prec_ref_display_width - 30);
193  else
194  length = FFMAX(0, (int)s->exponent_ref_display_width[i] +
195  (int)s->prec_ref_display_width - 31);
196  s->mantissa_ref_display_width[i] = get_bits_long(gb, length);
197  if (s->ref_viewing_distance_flag) {
198  s->exponent_ref_viewing_distance[i] = get_bits(gb, 6);
199  if (s->exponent_ref_viewing_distance[i] > 62)
200  return AVERROR_INVALIDDATA;
201  else if (!s->exponent_ref_viewing_distance[i])
202  length = FFMAX(0, (int)s->prec_ref_viewing_dist - 30);
203  else
204  length = FFMAX(0, (int)s->exponent_ref_viewing_distance[i] +
205  (int)s->prec_ref_viewing_dist - 31);
206  s->mantissa_ref_viewing_distance[i] = get_bits_long(gb, length);
207  }
208  s->additional_shift_present_flag[i] = get_bits1(gb);
209  if (s->additional_shift_present_flag[i]) {
210  s->num_sample_shift[i] = get_bits(gb, 10);
211  if (s->num_sample_shift[i] > 1023)
212  return AVERROR_INVALIDDATA;
213  s->num_sample_shift[i] -= 512;
214  }
215  }
216  s->three_dimensional_reference_displays_extension_flag = get_bits1(gb);
217 
218  return 0;
219 }
220 
222  void *logctx, HEVCSEI *s,
223  const HEVCParamSets *ps, int type)
224 {
225  switch (type) {
226  case 256: // Mismatched value from HM 8.1
227  return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gbyte);
228  case SEI_TYPE_PIC_TIMING:
229  return decode_nal_sei_pic_timing(s, gb, ps, logctx);
231  return decode_nal_sei_recovery_point(s, gb);
233  return decode_nal_sei_active_parameter_sets(s, gb, logctx);
234  case SEI_TYPE_TIME_CODE:
235  return decode_nal_sei_timecode(&s->timecode, gb);
237  return decode_nal_sei_3d_reference_displays_info(&s->tdrdi, gb);
238  default: {
240  gb, gbyte, logctx);
242  av_log(logctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
243  return ret;
244  }
245  }
246 }
247 
249  void *logctx, HEVCSEI *s, int type)
250 {
251  switch (type) {
253  return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gbyte);
254  default:
255  av_log(logctx, AV_LOG_DEBUG, "Skipped SUFFIX SEI %d\n", type);
256  return 0;
257  }
258 }
259 
260 static int decode_nal_sei_message(GetByteContext *gb, void *logctx, HEVCSEI *s,
261  const HEVCParamSets *ps, int nal_unit_type)
262 {
263  GetByteContext message_gbyte;
264  GetBitContext message_gb;
265  int payload_type = 0;
266  int payload_size = 0;
267  int byte = 0xFF;
268  av_unused int ret;
269  av_log(logctx, AV_LOG_DEBUG, "Decoding SEI\n");
270 
271  while (byte == 0xFF) {
272  if (bytestream2_get_bytes_left(gb) < 2 || payload_type > INT_MAX - 255)
273  return AVERROR_INVALIDDATA;
274  byte = bytestream2_get_byteu(gb);
275  payload_type += byte;
276  }
277  byte = 0xFF;
278  while (byte == 0xFF) {
279  if (bytestream2_get_bytes_left(gb) < 1 + payload_size)
280  return AVERROR_INVALIDDATA;
281  byte = bytestream2_get_byteu(gb);
282  payload_size += byte;
283  }
284  if (bytestream2_get_bytes_left(gb) < payload_size)
285  return AVERROR_INVALIDDATA;
286  bytestream2_init(&message_gbyte, gb->buffer, payload_size);
287  ret = init_get_bits8(&message_gb, gb->buffer, payload_size);
288  av_assert1(ret >= 0);
289  bytestream2_skipu(gb, payload_size);
290  if (nal_unit_type == HEVC_NAL_SEI_PREFIX) {
291  return decode_nal_sei_prefix(&message_gb, &message_gbyte,
292  logctx, s, ps, payload_type);
293  } else { /* nal_unit_type == NAL_SEI_SUFFIX */
294  return decode_nal_sei_suffix(&message_gb, &message_gbyte,
295  logctx, s, payload_type);
296  }
297 }
298 
300  const HEVCParamSets *ps, enum HEVCNALUnitType type)
301 {
302  GetByteContext gbyte;
303  int ret;
304 
305  av_assert1((get_bits_count(gb) % 8) == 0);
306  bytestream2_init(&gbyte, gb->buffer + get_bits_count(gb) / 8,
307  get_bits_left(gb) / 8);
308 
309  do {
310  ret = decode_nal_sei_message(&gbyte, logctx, s, ps, type);
311  if (ret < 0)
312  return ret;
313  } while (bytestream2_get_bytes_left(&gbyte) > 0);
314  return 1;
315 }
av_clip
#define av_clip
Definition: common.h:100
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:695
HEVCSEIRecoveryPoint::broken_link_flag
uint8_t broken_link_flag
Definition: sei.h:101
GetByteContext
Definition: bytestream.h:33
AV_PICTURE_STRUCTURE_UNKNOWN
@ AV_PICTURE_STRUCTURE_UNKNOWN
unknown
Definition: avcodec.h:2761
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:421
bytestream2_skipu
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
Definition: bytestream.h:174
decode_nal_sei_recovery_point
static int decode_nal_sei_recovery_point(HEVCSEI *s, GetBitContext *gb)
Definition: sei.c:82
decode_nal_sei_suffix
static int decode_nal_sei_suffix(GetBitContext *gb, GetByteContext *gbyte, void *logctx, HEVCSEI *s, int type)
Definition: sei.c:248
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:266
av_unused
#define av_unused
Definition: attributes.h:131
HEVCSEIRecoveryPoint::recovery_poc_cnt
int16_t recovery_poc_cnt
Definition: sei.h:99
get_ue_golomb
static int get_ue_golomb(GetBitContext *gb)
Read an unsigned Exp-Golomb code in the range 0 to 8190.
Definition: golomb.h:53
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
SEI_TYPE_THREE_DIMENSIONAL_REFERENCE_DISPLAYS_INFO
@ SEI_TYPE_THREE_DIMENSIONAL_REFERENCE_DISPLAYS_INFO
Definition: sei.h:127
ff_h2645_sei_message_decode
int ff_h2645_sei_message_decode(H2645SEI *h, enum SEIType type, enum AVCodecID codec_id, GetBitContext *gb, GetByteContext *gbyte, void *logctx)
Decode a single SEI message.
Definition: h2645_sei.c:487
decode_nal_sei_message
static int decode_nal_sei_message(GetByteContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int nal_unit_type)
Definition: sei.c:260
HEVCSEITimeCode
Definition: sei.h:62
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:335
HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING
@ HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING
Definition: sei.h:37
GetBitContext
Definition: get_bits.h:108
sei.h
decode_nal_sei_timecode
static int decode_nal_sei_timecode(HEVCSEITimeCode *s, GetBitContext *gb)
Definition: sei.c:122
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
HEVCParamSets::sps_list
const HEVCSPS * sps_list[HEVC_MAX_SPS_COUNT]
RefStruct references.
Definition: ps.h:513
HEVC_NAL_SEI_PREFIX
@ HEVC_NAL_SEI_PREFIX
Definition: hevc.h:68
HEVCSEIRecoveryPoint::exact_match_flag
uint8_t exact_match_flag
Definition: sei.h:100
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:545
HEVC_MAX_SPS_COUNT
@ HEVC_MAX_SPS_COUNT
Definition: hevc.h:115
s
#define s(width, name)
Definition: cbs_vp9.c:198
HEVCNALUnitType
HEVCNALUnitType
Table 7-1 – NAL unit type codes and NAL unit type classes in T-REC-H.265-201802.
Definition: hevc.h:28
GetByteContext::buffer
const uint8_t * buffer
Definition: bytestream.h:34
HEVCSEI
Definition: sei.h:105
HEVCSEIPictureHash
Definition: sei.h:40
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
decode_nal_sei_active_parameter_sets
static int decode_nal_sei_active_parameter_sets(HEVCSEI *s, GetBitContext *gb, void *logctx)
Definition: sei.c:97
get_se_golomb
static int get_se_golomb(GetBitContext *gb)
read signed exp golomb code.
Definition: golomb.h:239
AV_PICTURE_STRUCTURE_BOTTOM_FIELD
@ AV_PICTURE_STRUCTURE_BOTTOM_FIELD
coded as bottom field
Definition: avcodec.h:2763
GetBitContext::buffer
const uint8_t * buffer
Definition: get_bits.h:109
SEI_TYPE_TIME_CODE
@ SEI_TYPE_TIME_CODE
Definition: sei.h:95
AV_PICTURE_STRUCTURE_TOP_FIELD
@ AV_PICTURE_STRUCTURE_TOP_FIELD
coded as top field
Definition: avcodec.h:2762
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:388
bytestream2_get_buffer
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
Definition: bytestream.h:267
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:158
HEVCSEIRecoveryPoint
Definition: sei.h:98
HEVCSEITDRDI
Definition: sei.h:82
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:99
ps.h
FF_H2645_SEI_MESSAGE_UNHANDLED
@ FF_H2645_SEI_MESSAGE_UNHANDLED
Definition: h2645_sei.h:149
decode_nal_sei_pic_timing
static int decode_nal_sei_pic_timing(HEVCSEI *s, GetBitContext *gb, const HEVCParamSets *ps, void *logctx)
Definition: sei.c:52
HEVCSEIRecoveryPoint::has_recovery_poc
uint8_t has_recovery_poc
Definition: sei.h:102
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
SEI_TYPE_PIC_TIMING
@ SEI_TYPE_PIC_TIMING
Definition: sei.h:31
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:56
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:228
ret
ret
Definition: filter_design.txt:187
HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING
@ HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING
Definition: sei.h:36
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
decode_nal_sei_decoded_picture_hash
static int decode_nal_sei_decoded_picture_hash(HEVCSEIPictureHash *s, GetByteContext *gb)
Definition: sei.c:30
decode_nal_sei_3d_reference_displays_info
static int decode_nal_sei_3d_reference_displays_info(HEVCSEITDRDI *s, GetBitContext *gb)
Definition: sei.c:168
SEI_TYPE_RECOVERY_POINT
@ SEI_TYPE_RECOVERY_POINT
Definition: sei.h:36
SEI_TYPE_DECODED_PICTURE_HASH
@ SEI_TYPE_DECODED_PICTURE_HASH
Definition: sei.h:91
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:104
HEVCSPS
Definition: ps.h:255
bytestream.h
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
decode_nal_sei_prefix
static int decode_nal_sei_prefix(GetBitContext *gb, GetByteContext *gbyte, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int type)
Definition: sei.c:221
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
h
h
Definition: vp9dsp_template.c:2070
HEVCSEIPictureTiming
Definition: sei.h:53
SEI_TYPE_ACTIVE_PARAMETER_SETS
@ SEI_TYPE_ACTIVE_PARAMETER_SETS
Definition: sei.h:87
ff_hevc_decode_nal_sei
int ff_hevc_decode_nal_sei(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, enum HEVCNALUnitType type)
Definition: sei.c:299
HEVCParamSets
Definition: ps.h:511