FFmpeg  4.4
cbs_sei.h
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 #ifndef AVCODEC_CBS_SEI_H
20 #define AVCODEC_CBS_SEI_H
21 
22 #include <stddef.h>
23 #include <stdint.h>
24 
25 #include "libavutil/buffer.h"
26 
27 #include "cbs.h"
28 #include "sei.h"
29 
30 
31 typedef struct SEIRawFillerPayload {
32  uint32_t payload_size;
34 
35 typedef struct SEIRawUserDataRegistered {
40  size_t data_length;
42 
47  size_t data_length;
49 
51  uint16_t display_primaries_x[3];
52  uint16_t display_primaries_y[3];
53  uint16_t white_point_x;
54  uint16_t white_point_y;
58 
63 
67 
68 typedef struct SEIRawMessage {
69  uint32_t payload_type;
70  uint32_t payload_size;
71  void *payload;
77 
78 typedef struct SEIRawMessageList {
83 
84 
85 typedef struct SEIMessageState {
86  // The type of the payload being written.
87  uint32_t payload_type;
88  // When reading, contains the size of the payload to allow finding the
89  // end of variable-length fields (such as user_data_payload_byte[]).
90  // (When writing, the size will be derived from the total number of
91  // bytes actually written.)
92  uint32_t payload_size;
93  // When writing, indicates that payload extension data is present so
94  // all extended fields must be written. May be updated by the writer
95  // to indicate that extended fields have been written, so the extension
96  // end bits must be written too.
99 
100 struct GetBitContext;
101 struct PutBitContext;
102 
104  struct GetBitContext *rw,
105  void *current,
107 
109  struct PutBitContext *rw,
110  void *current,
112 
113 typedef struct SEIMessageTypeDescriptor {
114  // Payload type for the message. (-1 in this field ends a list.)
115  int type;
116  // Valid in a prefix SEI NAL unit (always for H.264).
118  // Valid in a suffix SEI NAL unit (never for H.264).
120  // Size of the decomposed structure.
121  size_t size;
122  // Read bitstream into SEI message.
124  // Write bitstream from SEI message.
127 
128 // Macro for the read/write pair. The clumsy cast is needed because the
129 // current pointer is typed in all of the read/write functions but has to
130 // be void here to fit all cases.
131 #define SEI_MESSAGE_RW(codec, name) \
132  .read = (SEIMessageReadFunction) cbs_ ## codec ## _read_ ## name, \
133  .write = (SEIMessageWriteFunction)cbs_ ## codec ## _write_ ## name
134 
135 // End-of-list sentinel element.
136 #define SEI_MESSAGE_TYPE_END { .type = -1 }
137 
138 
139 /**
140  * Find the type descriptor for the given payload type.
141  *
142  * Returns NULL if the payload type is not known.
143  */
145  int payload_type);
146 
147 /**
148  * Allocate a new payload for the given SEI message.
149  */
152 
153 /**
154  * Allocate a new empty SEI message in a message list.
155  *
156  * The new message is in place nb_messages - 1.
157  */
159 
160 /**
161  * Free all SEI messages in a message list.
162  */
164 
165 /**
166  * Add an SEI message to an access unit.
167  *
168  * Will add to an existing SEI NAL unit, or create a new one for the
169  * message if there is no suitable existing one.
170  *
171  * Takes a new reference to payload_buf, if set. If payload_buf is
172  * NULL then the new message will not be reference counted.
173  */
176  int prefix,
177  uint32_t payload_type,
178  void *payload_data,
179  AVBufferRef *payload_buf);
180 
181 /**
182  * Iterate over messages with the given payload type in an access unit.
183  *
184  * Set message to NULL in the first call. Returns 0 while more messages
185  * are available, AVERROR(ENOENT) when all messages have been found.
186  */
189  uint32_t payload_type,
191 
192 /**
193  * Delete all messages with the given payload type from an access unit.
194  */
197  uint32_t payload_type);
198 
199 #endif /* AVCODEC_CBS_SEI_H */
uint8_t
refcounted data buffer API
static int FUNC() sei(CodedBitstreamContext *ctx, RWContext *rw, H264RawSEI *current)
int(* SEIMessageWriteFunction)(CodedBitstreamContext *ctx, struct PutBitContext *rw, void *current, SEIMessageState *sei)
Definition: cbs_sei.h:108
int(* SEIMessageReadFunction)(CodedBitstreamContext *ctx, struct GetBitContext *rw, void *current, SEIMessageState *sei)
Definition: cbs_sei.h:103
void ff_cbs_sei_free_message_list(SEIRawMessageList *list)
Free all SEI messages in a message list.
Definition: cbs_sei.c:99
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
void ff_cbs_sei_delete_message_type(CodedBitstreamContext *ctx, CodedBitstreamFragment *au, uint32_t payload_type)
Delete all messages with the given payload type from an access unit.
Definition: cbs_sei.c:350
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:1640
int ff_cbs_sei_list_add(SEIRawMessageList *list)
Allocate a new empty SEI message in a message list.
Definition: cbs_sei.c:74
int ff_cbs_sei_add_message(CodedBitstreamContext *ctx, CodedBitstreamFragment *au, int prefix, uint32_t payload_type, void *payload_data, AVBufferRef *payload_buf)
Add an SEI message to an access unit.
Definition: cbs_sei.c:247
int ff_cbs_sei_find_message(CodedBitstreamContext *ctx, CodedBitstreamFragment *au, uint32_t payload_type, SEIRawMessage **message)
Iterate over messages with the given payload type in an access unit.
Definition: cbs_sei.c:297
int
const char * desc
Definition: libsvtav1.c:79
A reference to a data buffer.
Definition: buffer.h:84
Context structure for coded bitstream operations.
Definition: cbs.h:170
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:118
uint32_t payload_size
Definition: cbs_sei.h:92
uint32_t payload_type
Definition: cbs_sei.h:87
uint8_t extension_present
Definition: cbs_sei.h:97
SEIMessageWriteFunction write
Definition: cbs_sei.h:125
SEIMessageReadFunction read
Definition: cbs_sei.h:123
uint16_t max_pic_average_light_level
Definition: cbs_sei.h:61
uint16_t max_content_light_level
Definition: cbs_sei.h:60
uint32_t payload_size
Definition: cbs_sei.h:32
int nb_messages_allocated
Definition: cbs_sei.h:81
SEIRawMessage * messages
Definition: cbs_sei.h:79
uint32_t payload_size
Definition: cbs_sei.h:70
uint8_t * extension_data
Definition: cbs_sei.h:73
uint32_t payload_type
Definition: cbs_sei.h:69
size_t extension_bit_length
Definition: cbs_sei.h:75
AVBufferRef * payload_ref
Definition: cbs_sei.h:72
void * payload
Definition: cbs_sei.h:71
AVBufferRef * extension_data_ref
Definition: cbs_sei.h:74
uint8_t itu_t_t35_country_code_extension_byte
Definition: cbs_sei.h:37
AVBufferRef * data_ref
Definition: cbs_sei.h:39
uint8_t itu_t_t35_country_code
Definition: cbs_sei.h:36
uint8_t uuid_iso_iec_11578[16]
Definition: cbs_sei.h:44
AVBufferRef * data_ref
Definition: cbs_sei.h:46
AVFormatContext * ctx
Definition: movenc.c:48