]> git.sesse.net Git - ffmpeg/blob - libavcodec/cbs_sei.h
x86/tx_float: Fixes compilation with old yasm
[ffmpeg] / libavcodec / cbs_sei.h
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;
33 } SEIRawFillerPayload;
34
35 typedef struct SEIRawUserDataRegistered {
36     uint8_t      itu_t_t35_country_code;
37     uint8_t      itu_t_t35_country_code_extension_byte;
38     uint8_t     *data;
39     AVBufferRef *data_ref;
40     size_t       data_length;
41 } SEIRawUserDataRegistered;
42
43 typedef struct SEIRawUserDataUnregistered {
44     uint8_t      uuid_iso_iec_11578[16];
45     uint8_t     *data;
46     AVBufferRef *data_ref;
47     size_t       data_length;
48 } SEIRawUserDataUnregistered;
49
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;
58
59 typedef struct SEIRawContentLightLevelInfo {
60     uint16_t max_content_light_level;
61     uint16_t max_pic_average_light_level;
62 } SEIRawContentLightLevelInfo;
63
64 typedef struct SEIRawAlternativeTransferCharacteristics {
65     uint8_t preferred_transfer_characteristics;
66 } SEIRawAlternativeTransferCharacteristics;
67
68 typedef struct SEIRawMessage {
69     uint32_t     payload_type;
70     uint32_t     payload_size;
71     void        *payload;
72     AVBufferRef *payload_ref;
73     uint8_t     *extension_data;
74     AVBufferRef *extension_data_ref;
75     size_t       extension_bit_length;
76 } SEIRawMessage;
77
78 typedef struct SEIRawMessageList {
79     SEIRawMessage *messages;
80     int         nb_messages;
81     int         nb_messages_allocated;
82 } 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.
97     uint8_t  extension_present;
98 } SEIMessageState;
99
100 struct GetBitContext;
101 struct PutBitContext;
102
103 typedef int (*SEIMessageReadFunction)(CodedBitstreamContext *ctx,
104                                       struct GetBitContext *rw,
105                                       void *current,
106                                       SEIMessageState *sei);
107
108 typedef int (*SEIMessageWriteFunction)(CodedBitstreamContext *ctx,
109                                        struct PutBitContext *rw,
110                                        void *current,
111                                        SEIMessageState *sei);
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).
117     uint8_t prefix;
118     // Valid in a suffix SEI NAL unit (never for H.264).
119     uint8_t suffix;
120     // Size of the decomposed structure.
121     size_t  size;
122     // Read bitstream into SEI message.
123     SEIMessageReadFunction  read;
124     // Write bitstream from SEI message.
125     SEIMessageWriteFunction write;
126 } SEIMessageTypeDescriptor;
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  */
144 const SEIMessageTypeDescriptor *ff_cbs_sei_find_type(CodedBitstreamContext *ctx,
145                                                      int payload_type);
146
147 /**
148  * Allocate a new payload for the given SEI message.
149  */
150 int ff_cbs_sei_alloc_message_payload(SEIRawMessage *message,
151                                      const SEIMessageTypeDescriptor *desc);
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  */
158 int ff_cbs_sei_list_add(SEIRawMessageList *list);
159
160 /**
161  * Free all SEI messages in a message list.
162  */
163 void ff_cbs_sei_free_message_list(SEIRawMessageList *list);
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  */
174 int ff_cbs_sei_add_message(CodedBitstreamContext *ctx,
175                            CodedBitstreamFragment *au,
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  */
187 int ff_cbs_sei_find_message(CodedBitstreamContext *ctx,
188                             CodedBitstreamFragment *au,
189                             uint32_t payload_type,
190                             SEIRawMessage **message);
191
192 /**
193  * Delete all messages with the given payload type from an access unit.
194  */
195 void ff_cbs_sei_delete_message_type(CodedBitstreamContext *ctx,
196                                     CodedBitstreamFragment *au,
197                                     uint32_t payload_type);
198
199 #endif /* AVCODEC_CBS_SEI_H */