|
|
@@ -25,11 +25,72 @@
|
|
|
#include "put_bits.h"
|
|
|
|
|
|
|
|
|
+enum CBSContentType {
|
|
|
+ // Unit content is a simple structure.
|
|
|
+ CBS_CONTENT_TYPE_POD,
|
|
|
+ // Unit content contains some references to other structures, but all
|
|
|
+ // managed via buffer reference counting. The descriptor defines the
|
|
|
+ // structure offsets of every buffer reference.
|
|
|
+ CBS_CONTENT_TYPE_INTERNAL_REFS,
|
|
|
+ // Unit content is something more complex. The descriptor defines
|
|
|
+ // special functions to manage the content.
|
|
|
+ CBS_CONTENT_TYPE_COMPLEX,
|
|
|
+};
|
|
|
+
|
|
|
+enum {
|
|
|
+ // Maximum number of unit types described by the same unit type
|
|
|
+ // descriptor.
|
|
|
+ CBS_MAX_UNIT_TYPES = 3,
|
|
|
+ // Maximum number of reference buffer offsets in any one unit.
|
|
|
+ CBS_MAX_REF_OFFSETS = 2,
|
|
|
+ // Special value used in a unit type descriptor to indicate that it
|
|
|
+ // applies to a large range of types rather than a set of discrete
|
|
|
+ // values.
|
|
|
+ CBS_UNIT_TYPE_RANGE = -1,
|
|
|
+};
|
|
|
+
|
|
|
+typedef const struct CodedBitstreamUnitTypeDescriptor {
|
|
|
+ // Number of entries in the unit_types array, or the special value
|
|
|
+ // CBS_UNIT_TYPE_RANGE to indicate that the range fields should be
|
|
|
+ // 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;
|
|
|
+
|
|
|
+ // The type of content described.
|
|
|
+ enum CBSContentType content_type;
|
|
|
+ // The size of the structure which should be allocated to contain
|
|
|
+ // 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);
|
|
|
+} CodedBitstreamUnitTypeDescriptor;
|
|
|
+
|
|
|
typedef struct CodedBitstreamType {
|
|
|
enum AVCodecID codec_id;
|
|
|
|
|
|
size_t priv_data_size;
|
|
|
|
|
|
+ // List of unit type descriptors for this codec.
|
|
|
+ // Terminated by a descriptor with nb_unit_types equal to zero.
|
|
|
+ const CodedBitstreamUnitTypeDescriptor *unit_types;
|
|
|
+
|
|
|
// Split frag->data into coded bitstream units, creating the
|
|
|
// frag->units array. Fill data but not content on each unit.
|
|
|
// The header argument should be set if the fragment came from
|