2 * This file is part of FFmpeg.
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.
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.
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
19 #ifndef AVCODEC_CBS_SEI_H
20 #define AVCODEC_CBS_SEI_H
25 #include "libavutil/buffer.h"
31 typedef struct SEIRawFillerPayload {
32 uint32_t payload_size;
33 } SEIRawFillerPayload;
35 typedef struct SEIRawUserDataRegistered {
36 uint8_t itu_t_t35_country_code;
37 uint8_t itu_t_t35_country_code_extension_byte;
39 AVBufferRef *data_ref;
41 } SEIRawUserDataRegistered;
43 typedef struct SEIRawUserDataUnregistered {
44 uint8_t uuid_iso_iec_11578[16];
46 AVBufferRef *data_ref;
48 } SEIRawUserDataUnregistered;
50 typedef struct SEIRawMasteringDisplayColourVolume {
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;
55 uint32_t max_display_mastering_luminance;
56 uint32_t min_display_mastering_luminance;
57 } SEIRawMasteringDisplayColourVolume;
59 typedef struct SEIRawContentLightLevelInfo {
60 uint16_t max_content_light_level;
61 uint16_t max_pic_average_light_level;
62 } SEIRawContentLightLevelInfo;
64 typedef struct SEIRawAlternativeTransferCharacteristics {
65 uint8_t preferred_transfer_characteristics;
66 } SEIRawAlternativeTransferCharacteristics;
68 typedef struct SEIRawMessage {
69 uint32_t payload_type;
70 uint32_t payload_size;
72 AVBufferRef *payload_ref;
73 uint8_t *extension_data;
74 AVBufferRef *extension_data_ref;
75 size_t extension_bit_length;
78 typedef struct SEIRawMessageList {
79 SEIRawMessage *messages;
81 int nb_messages_allocated;
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.
97 uint8_t extension_present;
100 struct GetBitContext;
101 struct PutBitContext;
103 typedef int (*SEIMessageReadFunction)(CodedBitstreamContext *ctx,
104 struct GetBitContext *rw,
106 SEIMessageState *sei);
108 typedef int (*SEIMessageWriteFunction)(CodedBitstreamContext *ctx,
109 struct PutBitContext *rw,
111 SEIMessageState *sei);
113 typedef struct SEIMessageTypeDescriptor {
114 // Payload type for the message. (-1 in this field ends a list.)
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.
122 // Read bitstream into SEI message.
123 SEIMessageReadFunction read;
124 // Write bitstream from SEI message.
125 SEIMessageWriteFunction write;
126 } SEIMessageTypeDescriptor;
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
135 // End-of-list sentinel element.
136 #define SEI_MESSAGE_TYPE_END { .type = -1 }
140 * Find the type descriptor for the given payload type.
142 * Returns NULL if the payload type is not known.
144 const SEIMessageTypeDescriptor *ff_cbs_sei_find_type(CodedBitstreamContext *ctx,
148 * Allocate a new payload for the given SEI message.
150 int ff_cbs_sei_alloc_message_payload(SEIRawMessage *message,
151 const SEIMessageTypeDescriptor *desc);
154 * Allocate a new empty SEI message in a message list.
156 * The new message is in place nb_messages - 1.
158 int ff_cbs_sei_list_add(SEIRawMessageList *list);
161 * Free all SEI messages in a message list.
163 void ff_cbs_sei_free_message_list(SEIRawMessageList *list);
166 * Add an SEI message to an access unit.
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.
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.
174 int ff_cbs_sei_add_message(CodedBitstreamContext *ctx,
175 CodedBitstreamFragment *au,
177 uint32_t payload_type,
179 AVBufferRef *payload_buf);
182 * Iterate over messages with the given payload type in an access unit.
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.
187 int ff_cbs_sei_find_message(CodedBitstreamContext *ctx,
188 CodedBitstreamFragment *au,
189 uint32_t payload_type,
190 SEIRawMessage **message);
193 * Delete all messages with the given payload type from an access unit.
195 void ff_cbs_sei_delete_message_type(CodedBitstreamContext *ctx,
196 CodedBitstreamFragment *au,
197 uint32_t payload_type);
199 #endif /* AVCODEC_CBS_SEI_H */