FFmpeg
cbs_sei_syntax_template.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 static int FUNC(filler_payload)
22 {
23  int err, i;
24 
25  HEADER("Filler Payload");
26 
27 #ifdef READ
28  current->payload_size = state->payload_size;
29 #endif
30 
31  for (i = 0; i < current->payload_size; i++)
32  fixed(8, ff_byte, 0xff);
33 
34  return 0;
35 }
36 
37 static int FUNC(user_data_registered)
40 {
41  int err, i, j;
42 
43  HEADER("User Data Registered ITU-T T.35");
44 
45  u(8, itu_t_t35_country_code, 0x00, 0xff);
46  if (current->itu_t_t35_country_code != 0xff)
47  i = 1;
48  else {
49  u(8, itu_t_t35_country_code_extension_byte, 0x00, 0xff);
50  i = 2;
51  }
52 
53 #ifdef READ
54  if (state->payload_size < i) {
55  av_log(ctx->log_ctx, AV_LOG_ERROR,
56  "Invalid SEI user data registered payload.\n");
57  return AVERROR_INVALIDDATA;
58  }
59  current->data_length = state->payload_size - i;
60 #endif
61 
62  allocate(current->data, current->data_length);
63  for (j = 0; j < current->data_length; j++)
64  xu(8, itu_t_t35_payload_byte[], current->data[j], 0x00, 0xff, 1, i + j);
65 
66  return 0;
67 }
68 
69 static int FUNC(user_data_unregistered)
72 {
73  int err, i;
74 
75  HEADER("User Data Unregistered");
76 
77 #ifdef READ
78  if (state->payload_size < 16) {
79  av_log(ctx->log_ctx, AV_LOG_ERROR,
80  "Invalid SEI user data unregistered payload.\n");
81  return AVERROR_INVALIDDATA;
82  }
83  current->data_length = state->payload_size - 16;
84 #endif
85 
86  for (i = 0; i < 16; i++)
87  us(8, uuid_iso_iec_11578[i], 0x00, 0xff, 1, i);
88 
89  allocate(current->data, current->data_length);
90 
91  for (i = 0; i < current->data_length; i++)
92  xu(8, user_data_payload_byte[i], current->data[i], 0x00, 0xff, 1, i);
93 
94  return 0;
95 }
96 
100 {
101  int err, c;
102 
103  HEADER("Mastering Display Colour Volume");
104 
105  for (c = 0; c < 3; c++) {
106  ubs(16, display_primaries_x[c], 1, c);
107  ubs(16, display_primaries_y[c], 1, c);
108  }
109 
110  ub(16, white_point_x);
111  ub(16, white_point_y);
112 
113  ub(32, max_display_mastering_luminance);
114  ub(32, min_display_mastering_luminance);
115 
116  return 0;
117 }
118 
119 static int FUNC(content_light_level_info)
122 {
123  int err;
124 
125  HEADER("Content Light Level Information");
126 
127  ub(16, max_content_light_level);
128  ub(16, max_pic_average_light_level);
129 
130  return 0;
131 }
132 
137 {
138  int err;
139 
140  HEADER("Alternative Transfer Characteristics");
141 
142  ub(8, preferred_transfer_characteristics);
143 
144  return 0;
145 }
146 
151 {
152  static const uint16_t max_ambient_light_value = 50000;
153  int err;
154 
155  HEADER("Ambient Viewing Environment");
156 
157  u(32, ambient_illuminance, 1, MAX_UINT_BITS(32));
158  u(16, ambient_light_x, 0, max_ambient_light_value);
159  u(16, ambient_light_y, 0, max_ambient_light_value);
160 
161  return 0;
162 }
163 
165  SEIRawMessage *current)
166 {
168  int err, i;
169 
170  desc = ff_cbs_sei_find_type(ctx, current->payload_type);
171  if (desc) {
173  .payload_type = current->payload_type,
174  .payload_size = current->payload_size,
175  .extension_present = current->extension_bit_length > 0,
176  };
177  int start_position, current_position, bits_written;
178 
179 #ifdef READ
181 #endif
182 
183  start_position = bit_position(rw);
184 
185  CHECK(desc->READWRITE(ctx, rw, current->payload, &state));
186 
187  current_position = bit_position(rw);
188  bits_written = current_position - start_position;
189 
190  if (byte_alignment(rw) || state.extension_present ||
191  bits_written < 8 * current->payload_size) {
192  size_t bits_left;
193 
194 #ifdef READ
195  GetBitContext tmp = *rw;
196  int trailing_bits, trailing_zero_bits;
197 
198  bits_left = 8 * current->payload_size - bits_written;
199  if (bits_left > 8)
202  if (trailing_bits == 0) {
203  // The trailing bits must contain a bit_equal_to_one, so
204  // they can't all be zero.
205  return AVERROR_INVALIDDATA;
206  }
207  trailing_zero_bits = ff_ctz(trailing_bits);
208  current->extension_bit_length =
209  bits_left - 1 - trailing_zero_bits;
210 #endif
211 
212  if (current->extension_bit_length > 0) {
213  allocate(current->extension_data,
214  (current->extension_bit_length + 7) / 8);
215 
216  bits_left = current->extension_bit_length;
217  for (i = 0; bits_left > 0; i++) {
218  int length = FFMIN(bits_left, 8);
219  xu(length, reserved_payload_extension_data,
220  current->extension_data[i],
221  0, MAX_UINT_BITS(length), 0);
222  bits_left -= length;
223  }
224  }
225 
226  fixed(1, bit_equal_to_one, 1);
227  while (byte_alignment(rw))
228  fixed(1, bit_equal_to_zero, 0);
229  }
230 
231 #ifdef WRITE
232  current->payload_size = (put_bits_count(rw) - start_position) / 8;
233 #endif
234  } else {
235  uint8_t *data;
236 
237  allocate(current->payload, current->payload_size);
238  data = current->payload;
239 
240  for (i = 0; i < current->payload_size; i++)
241  xu(8, payload_byte[i], data[i], 0, 255, 1, i);
242  }
243 
244  return 0;
245 }
246 
248  SEIRawMessageList *current, int prefix)
249 {
251  int err, k;
252 
253 #ifdef READ
254  for (k = 0;; k++) {
255  uint32_t payload_type = 0;
256  uint32_t payload_size = 0;
257  uint32_t tmp;
258  GetBitContext payload_gbc;
259 
260  while (show_bits(rw, 8) == 0xff) {
261  fixed(8, ff_byte, 0xff);
262  payload_type += 255;
263  }
264  xu(8, last_payload_type_byte, tmp, 0, 254, 0);
265  payload_type += tmp;
266 
267  while (show_bits(rw, 8) == 0xff) {
268  fixed(8, ff_byte, 0xff);
269  payload_size += 255;
270  }
271  xu(8, last_payload_size_byte, tmp, 0, 254, 0);
272  payload_size += tmp;
273 
274  // There must be space remaining for both the payload and
275  // the trailing bits on the SEI NAL unit.
276  if (payload_size + 1 > get_bits_left(rw) / 8) {
277  av_log(ctx->log_ctx, AV_LOG_ERROR,
278  "Invalid SEI message: payload_size too large "
279  "(%"PRIu32" bytes).\n", payload_size);
280  return AVERROR_INVALIDDATA;
281  }
282  CHECK(init_get_bits(&payload_gbc, rw->buffer,
283  get_bits_count(rw) + 8 * payload_size));
284  skip_bits_long(&payload_gbc, get_bits_count(rw));
285 
286  CHECK(ff_cbs_sei_list_add(current));
287  message = &current->messages[k];
288 
289  message->payload_type = payload_type;
290  message->payload_size = payload_size;
291 
292  CHECK(FUNC(message)(ctx, &payload_gbc, message));
293 
294  skip_bits_long(rw, 8 * payload_size);
295 
297  break;
298  }
299 #else
300  for (k = 0; k < current->nb_messages; k++) {
301  PutBitContext start_state;
302  uint32_t tmp;
303  int trace, i;
304 
305  message = &current->messages[k];
306 
307  // We write the payload twice in order to find the size. Trace
308  // output is switched off for the first write.
309  trace = ctx->trace_enable;
310  ctx->trace_enable = 0;
311 
312  start_state = *rw;
313  for (i = 0; i < 2; i++) {
314  *rw = start_state;
315 
316  tmp = message->payload_type;
317  while (tmp >= 255) {
318  fixed(8, ff_byte, 0xff);
319  tmp -= 255;
320  }
321  xu(8, last_payload_type_byte, tmp, 0, 254, 0);
322 
323  tmp = message->payload_size;
324  while (tmp >= 255) {
325  fixed(8, ff_byte, 0xff);
326  tmp -= 255;
327  }
328  xu(8, last_payload_size_byte, tmp, 0, 254, 0);
329 
330  err = FUNC(message)(ctx, rw, message);
331  ctx->trace_enable = trace;
332  if (err < 0)
333  return err;
334  }
335  }
336 #endif
337 
338  return 0;
339 }
bit_position
#define bit_position(rw)
Definition: cbs_h2645.c:427
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:268
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:664
filler_payload
static int FUNC() filler_payload(CodedBitstreamContext *ctx, RWContext *rw, SEIRawFillerPayload *current, SEIMessageState *state)
Definition: cbs_sei_syntax_template.c:20
byte_alignment
#define byte_alignment(rw)
Definition: cbs_av1.c:719
SEIRawUserDataRegistered
Definition: cbs_sei.h:35
ff_ctz
#define ff_ctz
Definition: intmath.h:107
SEIRawAmbientViewingEnvironment
Definition: cbs_sei.h:68
message
Definition: api-threadmessage-test.c:46
u
#define u(width, name, range_min, range_max)
Definition: cbs_h2645.c:262
SEIRawMessage
Definition: cbs_sei.h:74
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:256
HEADER
#define HEADER(name)
Definition: cbs_av1.c:533
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
CodedBitstreamContext
Context structure for coded bitstream operations.
Definition: cbs.h:173
data
const char data[16]
Definition: mxf.c:146
SEIRawAlternativeTransferCharacteristics
Definition: cbs_sei.h:64
allocate
#define allocate(name, size)
Definition: cbs_h2645.c:430
ambient_viewing_environment
static int FUNC() ambient_viewing_environment(CodedBitstreamContext *ctx, RWContext *rw, SEIRawAmbientViewingEnvironment *current, SEIMessageState *state)
Definition: cbs_sei_syntax_template.c:148
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:493
SEIRawContentLightLevelInfo
Definition: cbs_sei.h:59
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:325
CHECK
CHECK(-1) CHECK(-2) }} }} CHECK(1) CHECK(2) }} }} } if(diff0+diff1 > 0) temp -
GetBitContext
Definition: get_bits.h:107
ub
#define ub(width, name)
Definition: cbs_h2645.c:264
SEIRawUserDataUnregistered
Definition: cbs_sei.h:43
us
#define us(width, name, range_min, range_max, subs,...)
Definition: cbs_h2645.c:276
alternative_transfer_characteristics
static int FUNC() alternative_transfer_characteristics(CodedBitstreamContext *ctx, RWContext *rw, SEIRawAlternativeTransferCharacteristics *current, SEIMessageState *state)
Definition: cbs_sei_syntax_template.c:134
mastering_display_colour_volume
static int FUNC() mastering_display_colour_volume(CodedBitstreamContext *ctx, RWContext *rw, SEIRawMasteringDisplayColourVolume *current, SEIMessageState *state)
Definition: cbs_sei_syntax_template.c:98
message_list
static int FUNC() message_list(CodedBitstreamContext *ctx, RWContext *rw, SEIRawMessageList *current, int prefix)
Definition: cbs_sei_syntax_template.c:247
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
SEIRawFillerPayload
Definition: cbs_sei.h:31
SEIRawMessageList
Definition: cbs_sei.h:84
ctx
AVFormatContext * ctx
Definition: movenc.c:48
ff_cbs_sei_alloc_message_payload
int ff_cbs_sei_alloc_message_payload(SEIRawMessage *message, const SEIMessageTypeDescriptor *desc)
Allocate a new payload for the given SEI message.
Definition: cbs_sei.c:39
MAX_UINT_BITS
#define MAX_UINT_BITS(length)
Definition: cbs_internal.h:184
PutBitContext
Definition: put_bits.h:50
GetBitContext::buffer
const uint8_t * buffer
Definition: get_bits.h:108
bits_left
#define bits_left
Definition: bitstream.h:113
SEIMessageTypeDescriptor
Definition: cbs_sei.h:119
SEIRawMasteringDisplayColourVolume
Definition: cbs_sei.h:50
user_data_unregistered
static int FUNC() user_data_unregistered(CodedBitstreamContext *ctx, RWContext *rw, SEIRawUserDataUnregistered *current, SEIMessageState *state)
Definition: cbs_sei_syntax_template.c:70
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
ff_cbs_sei_find_type
const SEIMessageTypeDescriptor * ff_cbs_sei_find_type(CodedBitstreamContext *ctx, int payload_type)
Find the type descriptor for the given payload type.
Definition: cbs_h2645.c:1616
state
static struct @346 state
ubs
#define ubs(width, name, subs,...)
Definition: cbs_h2645.c:278
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
put_bits_count
static int put_bits_count(PutBitContext *s)
Definition: put_bits.h:80
show_bits
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:361
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
SEIMessageState
Definition: cbs_sei.h:91
FUNC
#define FUNC(a)
Definition: bit_depth_template.c:104
content_light_level_info
static int FUNC() content_light_level_info(CodedBitstreamContext *ctx, RWContext *rw, SEIRawContentLightLevelInfo *current, SEIMessageState *state)
Definition: cbs_sei_syntax_template.c:120
trailing_bits
static int FUNC() trailing_bits(CodedBitstreamContext *ctx, RWContext *rw, int nb_bits)
Definition: cbs_av1_syntax_template.c:50
desc
const char * desc
Definition: libsvtav1.c:83
message
static int FUNC() message(CodedBitstreamContext *ctx, RWContext *rw, SEIRawMessage *current)
Definition: cbs_sei_syntax_template.c:164
ff_cbs_sei_list_add
int ff_cbs_sei_list_add(SEIRawMessageList *list)
Allocate a new empty SEI message in a message list.
Definition: cbs_sei.c:74
fixed
#define fixed(width, name, value)
Definition: cbs_av1.c:566
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
xu
#define xu(width, name, var, range_min, range_max, subs,...)
Definition: cbs_h2645.c:390
RWContext
#define RWContext
Definition: cbs_av1.c:662
cbs_h2645_read_more_rbsp_data
static int cbs_h2645_read_more_rbsp_data(GetBitContext *gbc)
Definition: cbs_h2645.c:335
user_data_registered
static int FUNC() user_data_registered(CodedBitstreamContext *ctx, RWContext *rw, SEIRawUserDataRegistered *current, SEIMessageState *state)
Definition: cbs_sei_syntax_template.c:38