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 */ 200