| /* |
| * This file is part of FFmpeg. |
| * |
| * FFmpeg is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * FFmpeg is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with FFmpeg; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| #ifndef AVCODEC_CBS_SEI_H |
| #define AVCODEC_CBS_SEI_H |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include "libavutil/buffer.h" |
| |
| #include "cbs.h" |
| #include "sei.h" |
| |
| |
| typedef struct SEIRawFillerPayload { |
| uint32_t payload_size; |
| } SEIRawFillerPayload; |
| |
| typedef struct SEIRawUserDataRegistered { |
| uint8_t itu_t_t35_country_code; |
| uint8_t itu_t_t35_country_code_extension_byte; |
| uint8_t *data; |
| AVBufferRef *data_ref; |
| size_t data_length; |
| } SEIRawUserDataRegistered; |
| |
| typedef struct SEIRawUserDataUnregistered { |
| uint8_t uuid_iso_iec_11578[16]; |
| uint8_t *data; |
| AVBufferRef *data_ref; |
| size_t data_length; |
| } SEIRawUserDataUnregistered; |
| |
| typedef struct SEIRawMasteringDisplayColourVolume { |
| uint16_t display_primaries_x[3]; |
| uint16_t display_primaries_y[3]; |
| uint16_t white_point_x; |
| uint16_t white_point_y; |
| uint32_t max_display_mastering_luminance; |
| uint32_t min_display_mastering_luminance; |
| } SEIRawMasteringDisplayColourVolume; |
| |
| typedef struct SEIRawContentLightLevelInfo { |
| uint16_t max_content_light_level; |
| uint16_t max_pic_average_light_level; |
| } SEIRawContentLightLevelInfo; |
| |
| typedef struct SEIRawAlternativeTransferCharacteristics { |
| uint8_t preferred_transfer_characteristics; |
| } SEIRawAlternativeTransferCharacteristics; |
| |
| typedef struct SEIRawMessage { |
| uint32_t payload_type; |
| uint32_t payload_size; |
| void *payload; |
| AVBufferRef *payload_ref; |
| uint8_t *extension_data; |
| AVBufferRef *extension_data_ref; |
| size_t extension_bit_length; |
| } SEIRawMessage; |
| |
| typedef struct SEIRawMessageList { |
| SEIRawMessage *messages; |
| int nb_messages; |
| int nb_messages_allocated; |
| } SEIRawMessageList; |
| |
| |
| typedef struct SEIMessageState { |
| // The type of the payload being written. |
| uint32_t payload_type; |
| // When reading, contains the size of the payload to allow finding the |
| // end of variable-length fields (such as user_data_payload_byte[]). |
| // (When writing, the size will be derived from the total number of |
| // bytes actually written.) |
| uint32_t payload_size; |
| // When writing, indicates that payload extension data is present so |
| // all extended fields must be written. May be updated by the writer |
| // to indicate that extended fields have been written, so the extension |
| // end bits must be written too. |
| uint8_t extension_present; |
| } SEIMessageState; |
| |
| struct GetBitContext; |
| struct PutBitContext; |
| |
| typedef int (*SEIMessageReadFunction)(CodedBitstreamContext *ctx, |
| struct GetBitContext *rw, |
| void *current, |
| SEIMessageState *sei); |
| |
| typedef int (*SEIMessageWriteFunction)(CodedBitstreamContext *ctx, |
| struct PutBitContext *rw, |
| void *current, |
| SEIMessageState *sei); |
| |
| typedef struct SEIMessageTypeDescriptor { |
| // Payload type for the message. (-1 in this field ends a list.) |
| int type; |
| // Valid in a prefix SEI NAL unit (always for H.264). |
| uint8_t prefix; |
| // Valid in a suffix SEI NAL unit (never for H.264). |
| uint8_t suffix; |
| // Size of the decomposed structure. |
| size_t size; |
| // Read bitstream into SEI message. |
| SEIMessageReadFunction read; |
| // Write bitstream from SEI message. |
| SEIMessageWriteFunction write; |
| } SEIMessageTypeDescriptor; |
| |
| // Macro for the read/write pair. The clumsy cast is needed because the |
| // current pointer is typed in all of the read/write functions but has to |
| // be void here to fit all cases. |
| #define SEI_MESSAGE_RW(codec, name) \ |
| .read = (SEIMessageReadFunction) cbs_ ## codec ## _read_ ## name, \ |
| .write = (SEIMessageWriteFunction)cbs_ ## codec ## _write_ ## name |
| |
| // End-of-list sentinel element. |
| #define SEI_MESSAGE_TYPE_END { .type = -1 } |
| |
| |
| /** |
| * Find the type descriptor for the given payload type. |
| * |
| * Returns NULL if the payload type is not known. |
| */ |
| const SEIMessageTypeDescriptor *ff_cbs_sei_find_type(CodedBitstreamContext *ctx, |
| int payload_type); |
| |
| /** |
| * Allocate a new payload for the given SEI message. |
| */ |
| int ff_cbs_sei_alloc_message_payload(SEIRawMessage *message, |
| const SEIMessageTypeDescriptor *desc); |
| |
| /** |
| * Allocate a new empty SEI message in a message list. |
| * |
| * The new message is in place nb_messages - 1. |
| */ |
| int ff_cbs_sei_list_add(SEIRawMessageList *list); |
| |
| /** |
| * Free all SEI messages in a message list. |
| */ |
| void ff_cbs_sei_free_message_list(SEIRawMessageList *list); |
| |
| /** |
| * Add an SEI message to an access unit. |
| * |
| * Will add to an existing SEI NAL unit, or create a new one for the |
| * message if there is no suitable existing one. |
| * |
| * Takes a new reference to payload_buf, if set. If payload_buf is |
| * NULL then the new message will not be reference counted. |
| */ |
| int ff_cbs_sei_add_message(CodedBitstreamContext *ctx, |
| CodedBitstreamFragment *au, |
| int prefix, |
| uint32_t payload_type, |
| void *payload_data, |
| AVBufferRef *payload_buf); |
| |
| /** |
| * Iterate over messages with the given payload type in an access unit. |
| * |
| * Set message to NULL in the first call. Returns 0 while more messages |
| * are available, AVERROR(ENOENT) when all messages have been found. |
| */ |
| int ff_cbs_sei_find_message(CodedBitstreamContext *ctx, |
| CodedBitstreamFragment *au, |
| uint32_t payload_type, |
| SEIRawMessage **message); |
| |
| /** |
| * Delete all messages with the given payload type from an access unit. |
| */ |
| void ff_cbs_sei_delete_message_type(CodedBitstreamContext *ctx, |
| CodedBitstreamFragment *au, |
| uint32_t payload_type); |
| |
| #endif /* AVCODEC_CBS_SEI_H */ |