diff options
Diffstat (limited to 'libavcodec/cbs_internal.h')
-rw-r--r-- | libavcodec/cbs_internal.h | 69 |
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) |