FFmpeg
Loading...
Searching...
No Matches
cbs_sei.c File Reference
#include "libavutil/mem.h"
#include "cbs.h"
#include "cbs_internal.h"
#include "cbs_h264.h"
#include "cbs_h265.h"
#include "cbs_h266.h"
#include "cbs_sei.h"
#include "libavutil/refstruct.h"
#include "cbs_sei_syntax_template.c"

Go to the source code of this file.

Macros

#define HEADER(name)
 
#define CHECK(call)
 
#define FUNC_NAME2(rw, codec, name)
 
#define FUNC_NAME1(rw, codec, name)
 
#define FUNC_NAME2_EXPORT(rw, codec, name)
 
#define FUNC_NAME1_EXPORT(rw, codec, name)
 
#define FUNC_SEI(name)
 
#define FUNC_SEI_EXPORT(name)
 
#define SEI_FUNC(name, args)
 
#define SUBSCRIPTS(subs, ...)
 
#define u(width, name, range_min, range_max)
 
#define flag(name)
 
#define ue(name, range_min, range_max)
 
#define i(width, name, range_min, range_max)
 
#define ib(width, name)
 
#define se(name, range_min, range_max)
 
#define us(width, name, range_min, range_max, subs, ...)
 
#define ubs(width, name, subs, ...)
 
#define flags(name, subs, ...)
 
#define ues(name, range_min, range_max, subs, ...)
 
#define is(width, name, range_min, range_max, subs, ...)
 
#define ibs(width, name, subs, ...)
 
#define ses(name, range_min, range_max, subs, ...)
 
#define fixed(width, name, value)
 
#define READ
 
#define READWRITE   read
 
#define RWContext   GetBitContext
 
#define ub(width, name)
 
#define xu(width, name, var, range_min, range_max, subs, ...)
 
#define xue(name, var, range_min, range_max, subs, ...)
 
#define xi(width, name, var, range_min, range_max, subs, ...)
 
#define xse(name, var, range_min, range_max, subs, ...)
 
#define infer(name, value)
 
#define more_rbsp_data(var)
 
#define bit_position(rw)
 
#define byte_alignment(rw)
 
#define allocate(name, size)
 
#define FUNC(name)
 
#define WRITE
 
#define READWRITE   write
 
#define RWContext   PutBitContext
 
#define ub(width, name)
 
#define xu(width, name, var, range_min, range_max, subs, ...)
 
#define xue(name, var, range_min, range_max, subs, ...)
 
#define xi(width, name, var, range_min, range_max, subs, ...)
 
#define xse(name, var, range_min, range_max, subs, ...)
 
#define infer(name, value)
 
#define more_rbsp_data(var)
 
#define bit_position(rw)
 
#define byte_alignment(rw)
 
#define allocate(name, size)
 
#define FUNC(name)
 
#define SEI_MESSAGE_RW(codec, name)
 

Functions

static void cbs_free_user_data_registered (AVRefStructOpaque unused, void *obj)
 
static void cbs_free_user_data_unregistered (AVRefStructOpaque unused, void *obj)
 
int ff_cbs_sei_alloc_message_payload (SEIRawMessage *message, const SEIMessageTypeDescriptor *desc)
 Allocate a new payload for the given SEI message.
 
int ff_cbs_sei_list_add (SEIRawMessageList *list)
 Allocate a new empty SEI message in a message list.
 
void ff_cbs_sei_free_message_list (SEIRawMessageList *list)
 Free all SEI messages in a message list.
 
static int cbs_sei_get_unit (CodedBitstreamContext *ctx, CodedBitstreamFragment *au, int prefix, CodedBitstreamUnit **sei_unit)
 
static int cbs_sei_get_message_list (CodedBitstreamContext *ctx, CodedBitstreamUnit *unit, SEIRawMessageList **list)
 
int ff_cbs_sei_add_message (CodedBitstreamContext *ctx, CodedBitstreamFragment *au, int prefix, uint32_t payload_type, void *payload_data, void *payload_ref)
 Add an SEI message to an access unit.
 
int ff_cbs_sei_find_message (CodedBitstreamContext *ctx, CodedBitstreamFragment *au, uint32_t payload_type, SEIRawMessage **iter)
 Iterate over messages with the given payload type in an access unit.
 
static void cbs_sei_delete_message (SEIRawMessageList *list, int position)
 
void ff_cbs_sei_delete_message_type (CodedBitstreamContext *ctx, CodedBitstreamFragment *au, uint32_t payload_type)
 Delete all messages with the given payload type from an access unit.
 
const SEIMessageTypeDescriptorff_cbs_sei_find_type (CodedBitstreamContext *ctx, int payload_type)
 Find the type descriptor for the given payload type.
 

Variables

static const SEIMessageTypeDescriptor cbs_sei_common_types []
 
static const SEIMessageTypeDescriptor cbs_sei_h274_types []
 

Macro Definition Documentation

◆ HEADER

#define HEADER ( name)
Value:
do { \
ff_cbs_trace_header(ctx, name); \
} while (0)
const char * name
Definition qsvenc.c:142
static AVFormatContext * ctx
Definition movenc.c:49

Definition at line 28 of file cbs_sei.c.

◆ CHECK

#define CHECK ( call)
Value:
do { \
err = (call); \
if (err < 0) \
return err; \
} while (0)

Definition at line 32 of file cbs_sei.c.

◆ FUNC_NAME2

#define FUNC_NAME2 ( rw,
codec,
name )
Value:
cbs_ ## codec ## _ ## rw ## _ ## name
#define _

Definition at line 38 of file cbs_sei.c.

◆ FUNC_NAME1

#define FUNC_NAME1 ( rw,
codec,
name )
Value:
FUNC_NAME2(rw, codec, name)
#define FUNC_NAME2(rw, codec, name)
Definition cbs_h264.c:39

Definition at line 39 of file cbs_sei.c.

◆ FUNC_NAME2_EXPORT

#define FUNC_NAME2_EXPORT ( rw,
codec,
name )
Value:
ff_cbs_ ## codec ## _ ## rw ## _ ## name

Definition at line 40 of file cbs_sei.c.

◆ FUNC_NAME1_EXPORT

#define FUNC_NAME1_EXPORT ( rw,
codec,
name )
Value:
#define FUNC_NAME2_EXPORT(rw, codec, name)
Definition cbs_h264.c:42

Definition at line 41 of file cbs_sei.c.

◆ FUNC_SEI

#define FUNC_SEI ( name)
Value:
#define FUNC_NAME1(rw, codec, name)
Definition cbs_h264.c:40
#define READWRITE
Definition cbs_h264.c:92
static int FUNC sei(CodedBitstreamContext *ctx, RWContext *rw, H264RawSEI *current)

Definition at line 42 of file cbs_sei.c.

◆ FUNC_SEI_EXPORT

#define FUNC_SEI_EXPORT ( name)
Value:
#define FUNC_NAME1_EXPORT(rw, codec, name)
Definition cbs_h264.c:43

Definition at line 43 of file cbs_sei.c.

◆ SEI_FUNC

#define SEI_FUNC ( name,
args )
Value:
static int FUNC_SEI(name) args; \
static int FUNC_SEI(name ## _internal)(CodedBitstreamContext *ctx, \
RWContext *rw, void *cur, \
{ \
return FUNC_SEI(name)(ctx, rw, cur, state); \
} \
static int FUNC_SEI(name) args
#define FUNC_SEI(name)
Definition cbs_h264.c:44
#define RWContext
Definition cbs_h264.c:93
static struct @346255127015250356166251341105367306144006377143 state
Context structure for coded bitstream operations.
Definition cbs.h:226

Definition at line 45 of file cbs_sei.c.

◆ SUBSCRIPTS

#define SUBSCRIPTS ( subs,
... )
Value:
(subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
#define NULL
Definition coverity.c:32

Definition at line 55 of file cbs_sei.c.

◆ u

#define u ( width,
name,
range_min,
range_max )
Value:
xu(width, name, current->name, range_min, range_max, 0, )
#define xu(width, name, var, range_min, range_max, subs,...)
Definition cbs_h264.c:101
static struct @111144215057303131116103221376075045141373005341 current
#define width
Definition dsp.h:89

Definition at line 57 of file cbs_sei.c.

◆ flag

#define flag ( name)
Value:
ub(1, name)
#define ub(width, name)
Definition cbs_h264.c:95

Definition at line 59 of file cbs_sei.c.

◆ ue

#define ue ( name,
range_min,
range_max )
Value:
xue(name, current->name, range_min, range_max, 0, )
#define xue(name, var, range_min, range_max, subs,...)
Definition cbs_h264.c:108

Definition at line 60 of file cbs_sei.c.

◆ i

#define i ( width,
name,
range_min,
range_max )
Value:
xi(width, name, current->name, range_min, range_max, 0, )
#define xi(width, name, var, range_min, range_max, subs,...)
Definition cbs_h264.c:115

Definition at line 62 of file cbs_sei.c.

◆ ib

#define ib ( width,
name )
Value:
#define MAX_INT_BITS(length)
#define MIN_INT_BITS(length)

Definition at line 64 of file cbs_sei.c.

◆ se

#define se ( name,
range_min,
range_max )
Value:
xse(name, current->name, range_min, range_max, 0, )
#define xse(name, var, range_min, range_max, subs,...)
Definition cbs_h264.c:122

Definition at line 66 of file cbs_sei.c.

◆ us

#define us ( width,
name,
range_min,
range_max,
subs,
... )
Value:
xu(width, name, current->name, range_min, range_max, subs, __VA_ARGS__)

Definition at line 69 of file cbs_sei.c.

◆ ubs

#define ubs ( width,
name,
subs,
... )
Value:
xu(width, name, current->name, 0, MAX_UINT_BITS(width), subs, __VA_ARGS__)
#define MAX_UINT_BITS(length)

Definition at line 71 of file cbs_sei.c.

◆ flags

#define flags ( name,
subs,
... )
Value:
xu(1, name, current->name, 0, 1, subs, __VA_ARGS__)

Definition at line 73 of file cbs_sei.c.

◆ ues

#define ues ( name,
range_min,
range_max,
subs,
... )
Value:
xue(name, current->name, range_min, range_max, subs, __VA_ARGS__)

Definition at line 75 of file cbs_sei.c.

◆ is

#define is ( width,
name,
range_min,
range_max,
subs,
... )
Value:
xi(width, name, current->name, range_min, range_max, subs, __VA_ARGS__)

Definition at line 77 of file cbs_sei.c.

◆ ibs

#define ibs ( width,
name,
subs,
... )
Value:
xi(width, name, current->name, MIN_INT_BITS(width), MAX_INT_BITS(width), subs, __VA_ARGS__)

Definition at line 79 of file cbs_sei.c.

◆ ses

#define ses ( name,
range_min,
range_max,
subs,
... )
Value:
xse(name, current->name, range_min, range_max, subs, __VA_ARGS__)

Definition at line 81 of file cbs_sei.c.

◆ fixed

#define fixed ( width,
name,
value )
Value:
do { \
av_unused uint32_t fixed_value = value; \
xu(width, name, fixed_value, value, value, 0, ); \
} while (0)
double value
Definition eval.c:102
#define av_unused
Definition attributes.h:164

Definition at line 84 of file cbs_sei.c.

◆ READ

#define READ

Definition at line 90 of file cbs_sei.c.

◆ READWRITE [1/2]

#define READWRITE   read

Definition at line 91 of file cbs_sei.c.

◆ RWContext [1/2]

#define RWContext   GetBitContext

Definition at line 92 of file cbs_sei.c.

◆ ub [1/2]

#define ub ( width,
name )
Value:
do { \
uint32_t value; \
CHECK(ff_cbs_read_simple_unsigned(ctx, rw, width, #name, \
&value)); \
current->name = value; \
} while (0)

Definition at line 94 of file cbs_sei.c.

◆ xu [1/2]

#define xu ( width,
name,
var,
range_min,
range_max,
subs,
... )
Value:
do { \
uint32_t value; \
CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
SUBSCRIPTS(subs, __VA_ARGS__), \
&value, range_min, range_max)); \
var = value; \
} while (0)
#define SUBSCRIPTS(subs,...)
Definition cbs_apv.c:65

Definition at line 100 of file cbs_sei.c.

◆ xue [1/2]

#define xue ( name,
var,
range_min,
range_max,
subs,
... )
Value:
do { \
uint32_t value; \
SUBSCRIPTS(subs, __VA_ARGS__), \
&value, range_min, range_max)); \
var = value; \
} while (0)
int ff_cbs_read_ue_golomb(CodedBitstreamContext *ctx, GetBitContext *gbc, const char *name, const int *subscripts, uint32_t *write_to, uint32_t range_min, uint32_t range_max)
Definition cbs_h2645.c:41

Definition at line 107 of file cbs_sei.c.

◆ xi [1/2]

#define xi ( width,
name,
var,
range_min,
range_max,
subs,
... )
Value:
do { \
CHECK(ff_cbs_read_signed(ctx, rw, width, #name, \
SUBSCRIPTS(subs, __VA_ARGS__), \
&value, range_min, range_max)); \
var = value; \
} while (0)
int32_t

Definition at line 114 of file cbs_sei.c.

◆ xse [1/2]

#define xse ( name,
var,
range_min,
range_max,
subs,
... )
Value:
do { \
SUBSCRIPTS(subs, __VA_ARGS__), \
&value, range_min, range_max)); \
var = value; \
} while (0)
int ff_cbs_read_se_golomb(CodedBitstreamContext *ctx, GetBitContext *gbc, const char *name, const int *subscripts, int32_t *write_to, int32_t range_min, int32_t range_max)
Definition cbs_h2645.c:90

Definition at line 121 of file cbs_sei.c.

◆ infer [1/2]

#define infer ( name,
value )
Value:
do { \
current->name = value; \
} while (0)

Definition at line 130 of file cbs_sei.c.

◆ more_rbsp_data [1/2]

#define more_rbsp_data ( var)
Value:
int ff_cbs_h2645_read_more_rbsp_data(GetBitContext *gbc)
Definition cbs_h2645.c:217

Definition at line 134 of file cbs_sei.c.

◆ bit_position [1/2]

#define bit_position ( rw)
Value:
static int get_bits_count(const GetBitContext *s)
Definition get_bits.h:254

Definition at line 136 of file cbs_sei.c.

◆ byte_alignment [1/2]

#define byte_alignment ( rw)
Value:
(get_bits_count(rw) % 8)

Definition at line 137 of file cbs_sei.c.

◆ allocate [1/2]

#define allocate ( name,
size )
Value:
do { \
if (!name) \
return AVERROR(ENOMEM); \
} while (0)
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
#define AVERROR(e)
Definition error.h:45
static void * av_refstruct_allocz(size_t size)
Equivalent to av_refstruct_alloc_ext(size, 0, NULL, NULL)
Definition refstruct.h:105
int size

Definition at line 141 of file cbs_sei.c.

◆ FUNC [1/2]

#define FUNC ( name)
Value:
#define FUNC_SEI_EXPORT(name)
Definition cbs_sei.c:43

Definition at line 148 of file cbs_sei.c.

◆ WRITE

#define WRITE

Definition at line 167 of file cbs_sei.c.

◆ READWRITE [2/2]

#define READWRITE   write

Definition at line 91 of file cbs_sei.c.

◆ RWContext [2/2]

#define RWContext   PutBitContext

Definition at line 92 of file cbs_sei.c.

◆ ub [2/2]

#define ub ( width,
name )
Value:
do { \
uint32_t value = current->name; \
CHECK(ff_cbs_write_simple_unsigned(ctx, rw, width, #name, \
value)); \
} while (0)

Definition at line 94 of file cbs_sei.c.

◆ xu [2/2]

#define xu ( width,
name,
var,
range_min,
range_max,
subs,
... )
Value:
do { \
uint32_t value = var; \
CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
SUBSCRIPTS(subs, __VA_ARGS__), \
value, range_min, range_max)); \
} while (0)

Definition at line 100 of file cbs_sei.c.

◆ xue [2/2]

#define xue ( name,
var,
range_min,
range_max,
subs,
... )
Value:
do { \
uint32_t value = var; \
SUBSCRIPTS(subs, __VA_ARGS__), \
value, range_min, range_max)); \
} while (0)
int ff_cbs_write_ue_golomb(CodedBitstreamContext *ctx, PutBitContext *pbc, const char *name, const int *subscripts, uint32_t value, uint32_t range_min, uint32_t range_max)
Definition cbs_h2645.c:145

Definition at line 107 of file cbs_sei.c.

◆ xi [2/2]

#define xi ( width,
name,
var,
range_min,
range_max,
subs,
... )
Value:
do { \
int32_t value = var; \
CHECK(ff_cbs_write_signed(ctx, rw, width, #name, \
SUBSCRIPTS(subs, __VA_ARGS__), \
value, range_min, range_max)); \
} while (0)

Definition at line 114 of file cbs_sei.c.

◆ xse [2/2]

#define xse ( name,
var,
range_min,
range_max,
subs,
... )
Value:
do { \
int32_t value = var; \
SUBSCRIPTS(subs, __VA_ARGS__), \
value, range_min, range_max)); \
} while (0)
int ff_cbs_write_se_golomb(CodedBitstreamContext *ctx, PutBitContext *pbc, const char *name, const int *subscripts, int32_t value, int32_t range_min, int32_t range_max)
Definition cbs_h2645.c:177

Definition at line 121 of file cbs_sei.c.

◆ infer [2/2]

#define infer ( name,
value )
Value:
do { \
if (current->name != (value)) { \
av_log(ctx->log_ctx, AV_LOG_ERROR, \
"%s does not match inferred value: " \
"%"PRId64", but should be %"PRId64".\n", \
#name, (int64_t)current->name, (int64_t)(value)); \
} \
} while (0)
long long int64_t
Definition coverity.c:34
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210

Definition at line 130 of file cbs_sei.c.

◆ more_rbsp_data [2/2]

#define more_rbsp_data ( var)
Value:
(var)

Definition at line 134 of file cbs_sei.c.

◆ bit_position [2/2]

#define bit_position ( rw)
Value:
static int put_bits_count(PutBitContext *s)
Definition put_bits.h:90

Definition at line 136 of file cbs_sei.c.

◆ byte_alignment [2/2]

#define byte_alignment ( rw)
Value:
(put_bits_count(rw) % 8)

Definition at line 137 of file cbs_sei.c.

◆ allocate [2/2]

#define allocate ( name,
size )
Value:
do { \
if (!name) { \
av_log(ctx->log_ctx, AV_LOG_ERROR, "%s must be set " \
"for writing.\n", #name); \
} \
} while (0)

Definition at line 141 of file cbs_sei.c.

◆ FUNC [2/2]

#define FUNC ( name)
Value:

Definition at line 148 of file cbs_sei.c.

◆ SEI_MESSAGE_RW

#define SEI_MESSAGE_RW ( codec,
name )
Value:
.read = cbs_ ## codec ## _read_ ## name ## _internal, \
.write = cbs_ ## codec ## _write_ ## name ## _internal

Definition at line 589 of file cbs_sei.c.

Function Documentation

◆ cbs_free_user_data_registered()

static void cbs_free_user_data_registered ( AVRefStructOpaque unused,
void * obj )
static

Definition at line 228 of file cbs_sei.c.

Referenced by ff_cbs_sei_alloc_message_payload().

◆ cbs_free_user_data_unregistered()

static void cbs_free_user_data_unregistered ( AVRefStructOpaque unused,
void * obj )
static

Definition at line 234 of file cbs_sei.c.

Referenced by ff_cbs_sei_alloc_message_payload().

◆ ff_cbs_sei_alloc_message_payload()

int ff_cbs_sei_alloc_message_payload ( SEIRawMessage * message,
const SEIMessageTypeDescriptor * desc )

Allocate a new payload for the given SEI message.

Definition at line 240 of file cbs_sei.c.

Referenced by message().

◆ ff_cbs_sei_list_add()

int ff_cbs_sei_list_add ( SEIRawMessageList * list)

Allocate a new empty SEI message in a message list.

The new message is in place nb_messages - 1.

Definition at line 266 of file cbs_sei.c.

Referenced by ff_cbs_sei_add_message(), and message_list().

◆ ff_cbs_sei_free_message_list()

void ff_cbs_sei_free_message_list ( SEIRawMessageList * list)

Free all SEI messages in a message list.

Definition at line 291 of file cbs_sei.c.

Referenced by cbs_h264_free_sei(), cbs_h265_free_sei(), and cbs_h266_free_sei().

◆ cbs_sei_get_unit()

static int cbs_sei_get_unit ( CodedBitstreamContext * ctx,
CodedBitstreamFragment * au,
int prefix,
CodedBitstreamUnit ** sei_unit )
static

Definition at line 301 of file cbs_sei.c.

Referenced by ff_cbs_sei_add_message().

◆ cbs_sei_get_message_list()

static int cbs_sei_get_message_list ( CodedBitstreamContext * ctx,
CodedBitstreamUnit * unit,
SEIRawMessageList ** list )
static

◆ ff_cbs_sei_add_message()

int ff_cbs_sei_add_message ( CodedBitstreamContext * ctx,
CodedBitstreamFragment * au,
int prefix,
uint32_t payload_type,
void * payload_data,
void * payload_ref )

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.

If set, payload_ref must be a RefStruct reference backing payload_data. This function creates a new reference to payload_ref in this case. If payload_ref is NULL, the new message will not be reference counted.

Definition at line 467 of file cbs_sei.c.

Referenced by h264_metadata_handle_display_orientation(), h264_metadata_update_fragment(), vaapi_encode_h264_write_extra_header(), vaapi_encode_h265_write_extra_header(), write_extra_headers(), and write_extra_headers().

◆ ff_cbs_sei_find_message()

int ff_cbs_sei_find_message ( CodedBitstreamContext * ctx,
CodedBitstreamFragment * au,
uint32_t payload_type,
SEIRawMessage ** message )

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.

Definition at line 514 of file cbs_sei.c.

Referenced by h264_metadata_handle_display_orientation().

◆ cbs_sei_delete_message()

static void cbs_sei_delete_message ( SEIRawMessageList * list,
int position )
static

Definition at line 547 of file cbs_sei.c.

Referenced by ff_cbs_sei_delete_message_type().

◆ ff_cbs_sei_delete_message_type()

void ff_cbs_sei_delete_message_type ( CodedBitstreamContext * ctx,
CodedBitstreamFragment * au,
uint32_t payload_type )

Delete all messages with the given payload type from an access unit.

Definition at line 567 of file cbs_sei.c.

Referenced by h264_metadata_handle_display_orientation(), and h264_metadata_update_fragment().

◆ ff_cbs_sei_find_type()

const SEIMessageTypeDescriptor * ff_cbs_sei_find_type ( CodedBitstreamContext * ctx,
int payload_type )

Find the type descriptor for the given payload type.

Returns NULL if the payload type is not known.

Definition at line 673 of file cbs_sei.c.

Referenced by ff_cbs_sei_add_message(), and message().

Variable Documentation

◆ cbs_sei_common_types

const SEIMessageTypeDescriptor cbs_sei_common_types[]
static

Definition at line 593 of file cbs_sei.c.

Referenced by ff_cbs_sei_find_type().

◆ cbs_sei_h274_types

const SEIMessageTypeDescriptor cbs_sei_h274_types[]
static
Initial value:
= {
{
1, 0,
SEI_MESSAGE_RW(sei, film_grain_characteristics),
},
{
1, 0,
},
{
1, 0,
sizeof(SEIRawFrameFieldInformation),
},
}
#define SEI_MESSAGE_RW(codec, name)
Definition cbs_h264.c:740
#define SEI_MESSAGE_TYPE_END
Definition cbs_sei.h:202
@ SEI_TYPE_DISPLAY_ORIENTATION
Definition sei.h:77
@ SEI_TYPE_FRAME_FIELD_INFO
Definition sei.h:126
@ SEI_TYPE_FILM_GRAIN_CHARACTERISTICS
Definition sei.h:49

Definition at line 651 of file cbs_sei.c.

Referenced by ff_cbs_sei_find_type().