mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-26 10:20:52 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			200 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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 */
 | 
