summaryrefslogtreecommitdiff
path: root/libavcodec/cbs_internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'libavcodec/cbs_internal.h')
-rw-r--r--libavcodec/cbs_internal.h69
1 files changed, 39 insertions, 30 deletions
diff --git a/libavcodec/cbs_internal.h b/libavcodec/cbs_internal.h
index 314d54daea..4030b76f1c 100644
--- a/libavcodec/cbs_internal.h
+++ b/libavcodec/cbs_internal.h
@@ -60,13 +60,16 @@ typedef const struct CodedBitstreamUnitTypeDescriptor {
// used instead.
int nb_unit_types;
- // Array of unit types that this entry describes.
- const CodedBitstreamUnitType unit_types[CBS_MAX_UNIT_TYPES];
-
- // Start and end of unit type range, used if nb_unit_types is
- // CBS_UNIT_TYPE_RANGE.
- const CodedBitstreamUnitType unit_type_range_start;
- const CodedBitstreamUnitType unit_type_range_end;
+ union {
+ // Array of unit types that this entry describes.
+ CodedBitstreamUnitType list[CBS_MAX_UNIT_TYPES];
+ // Start and end of unit type range, used if nb_unit_types is
+ // CBS_UNIT_TYPE_RANGE.
+ struct {
+ CodedBitstreamUnitType start;
+ CodedBitstreamUnitType end;
+ } range;
+ } unit_type;
// The type of content described.
enum CBSContentType content_type;
@@ -74,18 +77,24 @@ typedef const struct CodedBitstreamUnitTypeDescriptor {
// the decomposed content of this type of unit.
size_t content_size;
- // Number of entries in the ref_offsets array. Only used if the
- // content_type is CBS_CONTENT_TYPE_INTERNAL_REFS.
- int nb_ref_offsets;
- // The structure must contain two adjacent elements:
- // type *field;
- // AVBufferRef *field_ref;
- // where field points to something in the buffer referred to by
- // field_ref. This offset is then set to offsetof(struct, field).
- size_t ref_offsets[CBS_MAX_REF_OFFSETS];
-
- void (*content_free)(void *opaque, uint8_t *data);
- int (*content_clone)(AVBufferRef **ref, CodedBitstreamUnit *unit);
+ union {
+ struct {
+ // Number of entries in the ref_offsets array. Only nonzero
+ // if the content_type is CBS_CONTENT_TYPE_INTERNAL_REFS.
+ int nb_offsets;
+ // The structure must contain two adjacent elements:
+ // type *field;
+ // AVBufferRef *field_ref;
+ // where field points to something in the buffer referred to by
+ // field_ref. This offset is then set to offsetof(struct, field).
+ size_t offsets[CBS_MAX_REF_OFFSETS];
+ } ref;
+
+ struct {
+ void (*content_free)(void *opaque, uint8_t *data);
+ int (*content_clone)(AVBufferRef **ref, CodedBitstreamUnit *unit);
+ } complex;
+ } type;
} CodedBitstreamUnitTypeDescriptor;
typedef struct CodedBitstreamType {
@@ -184,38 +193,38 @@ int ff_cbs_write_signed(CodedBitstreamContext *ctx, PutBitContext *pbc,
#define TYPE_LIST(...) { __VA_ARGS__ }
#define CBS_UNIT_TYPE_POD(type, structure) { \
.nb_unit_types = 1, \
- .unit_types = { type }, \
+ .unit_type.list = { type }, \
.content_type = CBS_CONTENT_TYPE_POD, \
.content_size = sizeof(structure), \
}
#define CBS_UNIT_TYPES_INTERNAL_REF(types, structure, ref_field) { \
.nb_unit_types = FF_ARRAY_ELEMS((CodedBitstreamUnitType[])TYPE_LIST types), \
- .unit_types = TYPE_LIST types, \
+ .unit_type.list = TYPE_LIST types, \
.content_type = CBS_CONTENT_TYPE_INTERNAL_REFS, \
.content_size = sizeof(structure), \
- .nb_ref_offsets = 1, \
- .ref_offsets = { offsetof(structure, ref_field) }, \
+ .type.ref = { .nb_offsets = 1, \
+ .offsets = { offsetof(structure, ref_field) } }, \
}
#define CBS_UNIT_TYPE_INTERNAL_REF(type, structure, ref_field) \
CBS_UNIT_TYPES_INTERNAL_REF((type), structure, ref_field)
#define CBS_UNIT_RANGE_INTERNAL_REF(range_start, range_end, structure, ref_field) { \
- .nb_unit_types = CBS_UNIT_TYPE_RANGE, \
- .unit_type_range_start = range_start, \
- .unit_type_range_end = range_end, \
+ .nb_unit_types = CBS_UNIT_TYPE_RANGE, \
+ .unit_type.range.start = range_start, \
+ .unit_type.range.end = range_end, \
.content_type = CBS_CONTENT_TYPE_INTERNAL_REFS, \
.content_size = sizeof(structure), \
- .nb_ref_offsets = 1, \
- .ref_offsets = { offsetof(structure, ref_field) }, \
+ .type.ref = { .nb_offsets = 1, \
+ .offsets = { offsetof(structure, ref_field) } }, \
}
#define CBS_UNIT_TYPES_COMPLEX(types, structure, free_func) { \
.nb_unit_types = FF_ARRAY_ELEMS((CodedBitstreamUnitType[])TYPE_LIST types), \
- .unit_types = TYPE_LIST types, \
+ .unit_type.list = TYPE_LIST types, \
.content_type = CBS_CONTENT_TYPE_COMPLEX, \
.content_size = sizeof(structure), \
- .content_free = free_func, \
+ .type.complex = { .content_free = free_func }, \
}
#define CBS_UNIT_TYPE_COMPLEX(type, structure, free_func) \
CBS_UNIT_TYPES_COMPLEX((type), structure, free_func)