Go to the documentation of this file.
   29                              const char *
name, uint32_t *write_to,
 
   30                              uint32_t range_min, uint32_t range_max)
 
   32     uint32_t zeroes, bits_value, 
value;
 
   35     if (
ctx->trace_enable)
 
   42                    "%s: bitstream ended.\n", 
name);
 
   56                    "%s: bitstream ended.\n", 
name);
 
   61         value = bits_value + (UINT32_C(1) << zeroes) - 1;
 
   64     if (
ctx->trace_enable) {
 
   70                 k = 
FFMIN(zeroes - 32, 32);
 
   71                 for (
i = 0; 
i < k; 
i++)
 
   81         for (
i = 0; 
i < zeroes; 
i++)
 
   86             for (j = 0; j < zeroes; j++)
 
   87                 bits[
i++] = (bits_value >> (zeroes - j - 1) & 1) ? 
'1' : 
'0';
 
   95     if (value < range_min || value > range_max) {
 
   97                "%"PRIu32
", but must be in [%"PRIu32
",%"PRIu32
"].\n",
 
  108                               uint32_t range_min, uint32_t range_max)
 
  111     int position, zeroes;
 
  113     if (value < range_min || value > range_max) {
 
  115                "%"PRIu32
", but must be in [%"PRIu32
",%"PRIu32
"].\n",
 
  120     if (
ctx->trace_enable)
 
  128         v = 
value - (1
U << zeroes) + 1;
 
  134     if (
ctx->trace_enable) {
 
  138         for (j = 0; j < zeroes; j++)
 
  141         for (j = 0; j < zeroes; j++)
 
  142             bits[
i++] = (v >> (zeroes - j - 1) & 1) ? 
'1' : 
'0';
 
  152                                const char *
name, uint64_t *write_to)
 
  155     int position, err, 
i;
 
  157     if (
ctx->trace_enable)
 
  161     for (
i = 0; 
i < 8; 
i++) {
 
  162         int subscript[2] = { 1, 
i };
 
  169         value |= (uint64_t)(
byte & 0x7f) << (
i * 7);
 
  174     if (
value > UINT32_MAX)
 
  177     if (
ctx->trace_enable)
 
  187     int position, err, 
len, 
i;
 
  192     if (
ctx->trace_enable)
 
  195     for (
i = 0; 
i < 
len; 
i++) {
 
  196         int subscript[2] = { 1, 
i };
 
  198         byte = 
value >> (7 * 
i) & 0x7f;
 
  208     if (
ctx->trace_enable)
 
  215                            uint32_t 
n, 
const char *
name,
 
  216                            const int *subscripts, uint32_t *write_to)
 
  218     uint32_t 
w, m, v, extra_bit, 
value;
 
  223     if (
ctx->trace_enable)
 
  231                "%s: bitstream ended.\n", 
name);
 
  244         value = (v << 1) - m + extra_bit;
 
  247     if (
ctx->trace_enable) {
 
  250         for (
i = 0; 
i < 
w - 1; 
i++)
 
  251             bits[
i] = (v >> 
i & 1) ? 
'1' : 
'0';
 
  253             bits[
i++] = extra_bit ? 
'1' : 
'0';
 
  265                             uint32_t 
n, 
const char *
name,
 
  266                             const int *subscripts, uint32_t 
value)
 
  268     uint32_t 
w, m, v, extra_bit;
 
  273                "%"PRIu32
", but must be in [0,%"PRIu32
"].\n",
 
  278     if (
ctx->trace_enable)
 
  291         v = m + ((
value - m) >> 1);
 
  292         extra_bit = (
value - m) & 1;
 
  297     if (
ctx->trace_enable) {
 
  300         for (
i = 0; 
i < 
w - 1; 
i++)
 
  301             bits[
i] = (v >> 
i & 1) ? 
'1' : 
'0';
 
  303             bits[
i++] = extra_bit ? 
'1' : 
'0';
 
  314                                   uint32_t range_min, uint32_t range_max,
 
  315                                   const char *
name, uint32_t *write_to)
 
  321     av_assert0(range_min <= range_max && range_max - range_min < 
sizeof(
bits) - 1);
 
  322     if (
ctx->trace_enable)
 
  325     for (
i = 0, 
value = range_min; 
value < range_max;) {
 
  328                    "%s: bitstream ended.\n", 
name);
 
  340     if (
ctx->trace_enable) {
 
  351                                    uint32_t range_min, uint32_t range_max,
 
  356     av_assert0(range_min <= range_max && range_max - range_min < 32);
 
  357     if (value < range_min || value > range_max) {
 
  359                "%"PRIu32
", but must be in [%"PRIu32
",%"PRIu32
"].\n",
 
  364     if (
value == range_max)
 
  365         len = range_max - range_min;
 
  371     if (
ctx->trace_enable) {
 
  374         for (
i = 0; 
i < 
len; 
i++) {
 
  375             if (range_min + 
i == 
value)
 
  392                                uint32_t range_max, 
const char *
name,
 
  393                                const int *subscripts, uint32_t *write_to)
 
  397     uint32_t max_len, 
len, range_offset, range_bits;
 
  399     if (
ctx->trace_enable)
 
  403     max_len = 
av_log2(range_max - 1) - 3;
 
  406                                  "subexp_more_bits", &
len);
 
  411         range_bits   = 2 + 
len;
 
  412         range_offset = 1 << range_bits;
 
  431     value += range_offset;
 
  433     if (
ctx->trace_enable)
 
  442                                 uint32_t range_max, 
const char *
name,
 
  443                                 const int *subscripts, uint32_t 
value)
 
  446     uint32_t max_len, 
len, range_offset, range_bits;
 
  448     if (
value > range_max) {
 
  450                "%"PRIu32
", but must be in [0,%"PRIu32
"].\n",
 
  455     if (
ctx->trace_enable)
 
  459     max_len = 
av_log2(range_max - 1) - 3;
 
  467         len = range_bits - 2;
 
  474         range_offset = 1 << range_bits;
 
  478                                   "subexp_more_bits", 
len);
 
  485                                     value - range_offset,
 
  492                                "subexp_final_bits", 
NULL,
 
  493                                value - range_offset);
 
  498     if (
ctx->trace_enable)
 
  509     for (k = 0; (blksize << k) < target; k++);
 
  514                                      unsigned int a, 
unsigned int b)
 
  516     unsigned int diff, m;
 
  537 #define HEADER(name) do { \ 
  538         ff_cbs_trace_header(ctx, name); \ 
  541 #define CHECK(call) do { \ 
  547 #define FUNC_NAME(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ## name 
  548 #define FUNC_AV1(rw, name) FUNC_NAME(rw, av1, name) 
  549 #define FUNC(name) FUNC_AV1(READWRITE, name) 
  551 #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL) 
  553 #define fb(width, name) \ 
  554         xf(width, name, current->name, 0, MAX_UINT_BITS(width), 0) 
  555 #define fc(width, name, range_min, range_max) \ 
  556         xf(width, name, current->name, range_min, range_max, 0) 
  557 #define flag(name) fb(1, name) 
  558 #define su(width, name) \ 
  559         xsu(width, name, current->name, 0) 
  561 #define fbs(width, name, subs, ...) \ 
  562         xf(width, name, current->name, 0, MAX_UINT_BITS(width), subs, __VA_ARGS__) 
  563 #define fcs(width, name, range_min, range_max, subs, ...) \ 
  564         xf(width, name, current->name, range_min, range_max, subs, __VA_ARGS__) 
  565 #define flags(name, subs, ...) \ 
  566         xf(1, name, current->name, 0, 1, subs, __VA_ARGS__) 
  567 #define sus(width, name, subs, ...) \ 
  568         xsu(width, name, current->name, subs, __VA_ARGS__) 
  570 #define fixed(width, name, value) do { \ 
  571         av_unused uint32_t fixed_value = value; \ 
  572         xf(width, name, fixed_value, value, value, 0); \ 
  577 #define READWRITE read 
  578 #define RWContext GetBitContext 
  580 #define xf(width, name, var, range_min, range_max, subs, ...) do { \ 
  582         CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \ 
  583                                    SUBSCRIPTS(subs, __VA_ARGS__), \ 
  584                                    &value, range_min, range_max)); \ 
  588 #define xsu(width, name, var, subs, ...) do { \ 
  590         CHECK(ff_cbs_read_signed(ctx, rw, width, #name, \ 
  591                                  SUBSCRIPTS(subs, __VA_ARGS__), &value, \ 
  592                                  MIN_INT_BITS(width), \ 
  593                                  MAX_INT_BITS(width))); \ 
  597 #define uvlc(name, range_min, range_max) do { \ 
  599         CHECK(cbs_av1_read_uvlc(ctx, rw, #name, \ 
  600                                 &value, range_min, range_max)); \ 
  601         current->name = value; \ 
  604 #define ns(max_value, name, subs, ...) do { \ 
  606         CHECK(cbs_av1_read_ns(ctx, rw, max_value, #name, \ 
  607                               SUBSCRIPTS(subs, __VA_ARGS__), &value)); \ 
  608         current->name = value; \ 
  611 #define increment(name, min, max) do { \ 
  613         CHECK(cbs_av1_read_increment(ctx, rw, min, max, #name, &value)); \ 
  614         current->name = value; \ 
  617 #define subexp(name, max, subs, ...) do { \ 
  619         CHECK(cbs_av1_read_subexp(ctx, rw, max, #name, \ 
  620                                   SUBSCRIPTS(subs, __VA_ARGS__), &value)); \ 
  621         current->name = value; \ 
  624 #define delta_q(name) do { \ 
  625         uint8_t delta_coded; \ 
  627         xf(1, name.delta_coded, delta_coded, 0, 1, 0); \ 
  629             xsu(1 + 6, name.delta_q, delta_q, 0); \ 
  632         current->name = delta_q; \ 
  635 #define leb128(name) do { \ 
  637         CHECK(cbs_av1_read_leb128(ctx, rw, #name, &value)); \ 
  638         current->name = value; \ 
  641 #define infer(name, value) do { \ 
  642         current->name = value; \ 
  645 #define byte_alignment(rw) (get_bits_count(rw) % 8) 
  661 #undef byte_alignment 
  665 #define READWRITE write 
  666 #define RWContext PutBitContext 
  668 #define xf(width, name, var, range_min, range_max, subs, ...) do { \ 
  669         CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \ 
  670                                     SUBSCRIPTS(subs, __VA_ARGS__), \ 
  671                                     var, range_min, range_max)); \ 
  674 #define xsu(width, name, var, subs, ...) do { \ 
  675         CHECK(ff_cbs_write_signed(ctx, rw, width, #name, \ 
  676                                   SUBSCRIPTS(subs, __VA_ARGS__), var, \ 
  677                                   MIN_INT_BITS(width), \ 
  678                                   MAX_INT_BITS(width))); \ 
  681 #define uvlc(name, range_min, range_max) do { \ 
  682         CHECK(cbs_av1_write_uvlc(ctx, rw, #name, current->name, \ 
  683                                  range_min, range_max)); \ 
  686 #define ns(max_value, name, subs, ...) do { \ 
  687         CHECK(cbs_av1_write_ns(ctx, rw, max_value, #name, \ 
  688                                SUBSCRIPTS(subs, __VA_ARGS__), \ 
  692 #define increment(name, min, max) do { \ 
  693         CHECK(cbs_av1_write_increment(ctx, rw, min, max, #name, \ 
  697 #define subexp(name, max, subs, ...) do { \ 
  698         CHECK(cbs_av1_write_subexp(ctx, rw, max, #name, \ 
  699                                    SUBSCRIPTS(subs, __VA_ARGS__), \ 
  703 #define delta_q(name) do { \ 
  704         xf(1, name.delta_coded, current->name != 0, 0, 1, 0); \ 
  706             xsu(1 + 6, name.delta_q, current->name, 0); \ 
  709 #define leb128(name) do { \ 
  710         CHECK(cbs_av1_write_leb128(ctx, rw, #name, current->name)); \ 
  713 #define infer(name, value) do { \ 
  714         if (current->name != (value)) { \ 
  715             av_log(ctx->log_ctx, AV_LOG_WARNING, "Warning: " \ 
  716                    "%s does not match inferred value: " \ 
  717                    "%"PRId64", but should be %"PRId64".\n", \ 
  718                    #name, (int64_t)current->name, (int64_t)(value)); \ 
  722 #define byte_alignment(rw) (put_bits_count(rw) % 8) 
  738 #undef byte_alignment 
  752     trace = 
ctx->trace_enable;
 
  753     ctx->trace_enable = 0;
 
  758     if (INT_MAX / 8 < 
size) {
 
  771         err = cbs_av1_read_obu_header(
ctx, &gbc, &
header);
 
  782         if (
header.obu_has_size_field) {
 
  787             obu_size = 
size - 1 - 
header.obu_extension_flag;
 
  792         obu_length = pos / 8 + obu_size;
 
  794         if (
size < obu_length) {
 
  796                    "%"PRIu64
", but only %"SIZE_SPECIFIER" bytes remaining in fragment.\n",
 
  813     ctx->trace_enable = trace;
 
  829     switch (
md->metadata_type) {
 
  871                "any data in tile group (%d bits read).\n", pos);
 
  881     td->data      = unit->
data      + pos / 8;
 
  893     int err, start_pos, end_pos;
 
  905     err = cbs_av1_read_obu_header(
ctx, &gbc, &obu->
header);
 
  934             int in_temporal_layer =
 
  936             int in_spatial_layer  =
 
  938             if (!in_temporal_layer || !in_spatial_layer) {
 
  952             err = cbs_av1_read_sequence_header_obu(
ctx, &gbc,
 
  968             err = cbs_av1_read_temporal_delimiter_obu(
ctx, &gbc);
 
  976             err = cbs_av1_read_frame_header_obu(
ctx, &gbc,
 
  987             err = cbs_av1_read_tile_group_obu(
ctx, &gbc,
 
 1000             err = cbs_av1_read_frame_obu(
ctx, &gbc, &obu->
obu.
frame,
 
 1013             err = cbs_av1_read_tile_list_obu(
ctx, &gbc,
 
 1033             err = cbs_av1_read_padding_obu(
ctx, &gbc, &obu->
obu.
padding);
 
 1049         int nb_bits = obu->
obu_size * 8 + start_pos - end_pos;
 
 1054         err = cbs_av1_read_trailing_bits(
ctx, &gbc, nb_bits);
 
 1071     int err, start_pos, end_pos, data_pos;
 
 1078     err = cbs_av1_write_obu_header(
ctx, pbc, &obu->
header);
 
 1097             err = cbs_av1_write_sequence_header_obu(
ctx, pbc,
 
 1113             err = cbs_av1_write_temporal_delimiter_obu(
ctx, pbc);
 
 1121             err = cbs_av1_write_frame_header_obu(
ctx, pbc,
 
 1132             err = cbs_av1_write_tile_group_obu(
ctx, pbc,
 
 1167             err = cbs_av1_write_padding_obu(
ctx, pbc, &obu->
obu.
padding);
 
 1177     header_size = (end_pos - start_pos + 7) / 8;
 
 1180     } 
else if (header_size > 0) {
 
 1182         err = cbs_av1_write_trailing_bits(
ctx, pbc, 8 - end_pos % 8);
 
 1186         obu->
obu_size = header_size = (end_pos - start_pos + 7) / 8;
 
 1212         memmove(pbc->
buf + data_pos,
 
 1213                 pbc->
buf + start_pos, header_size);
 
 1217             memcpy(pbc->
buf + data_pos + header_size,
 
 1218                    td->data, 
td->data_size);
 
  
@ AV1_OBU_REDUNDANT_FRAME_HEADER
AVBufferRef * av_buffer_alloc(int size)
Allocate an AVBuffer of the given size using av_malloc().
static int get_bits_left(GetBitContext *gb)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static void av_unused put_bits32(PutBitContext *s, uint32_t value)
Write exactly 32 bits into a bitstream.
static int cbs_av1_write_increment(CodedBitstreamContext *ctx, PutBitContext *pbc, uint32_t range_min, uint32_t range_max, const char *name, uint32_t value)
void(* close)(CodedBitstreamContext *ctx)
uint8_t * data
The data buffer.
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
void * content
Pointer to the decomposed form of this unit.
static int get_bits_count(const GetBitContext *s)
AV1ReferenceFrameState read_ref[AV1_NUM_REF_FRAMES]
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
static int cbs_av1_read_increment(CodedBitstreamContext *ctx, GetBitContext *gbc, uint32_t range_min, uint32_t range_max, const char *name, uint32_t *write_to)
Context structure for coded bitstream operations.
AVBufferRef * frame_header_ref
static int cbs_av1_read_leb128(CodedBitstreamContext *ctx, GetBitContext *gbc, const char *name, uint64_t *write_to)
static int cbs_av1_read_ns(CodedBitstreamContext *ctx, GetBitContext *gbc, uint32_t n, const char *name, const int *subscripts, uint32_t *write_to)
CodedBitstreamUnitType type
Codec-specific type of this unit.
@ AV1_OBU_TEMPORAL_DELIMITER
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Coded bitstream unit structure.
static void cbs_av1_free_tile_data(AV1RawTileData *td)
static int cbs_av1_read_subexp(CodedBitstreamContext *ctx, GetBitContext *gbc, uint32_t range_max, const char *name, const int *subscripts, uint32_t *write_to)
int ff_cbs_write_unsigned(CodedBitstreamContext *ctx, PutBitContext *pbc, int width, const char *name, const int *subscripts, uint32_t value, uint32_t range_min, uint32_t range_max)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static int put_bits_left(PutBitContext *s)
static void cbs_av1_close(CodedBitstreamContext *ctx)
const CodedBitstreamType ff_cbs_type_av1
uint8_t * data
Pointer to the directly-parsable bitstream form of this unit.
int ff_cbs_insert_unit_data(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, int position, CodedBitstreamUnitType type, uint8_t *data, size_t data_size, AVBufferRef *data_buf)
Insert a new unit into a fragment with the given data bitstream.
static int cbs_av1_write_obu(CodedBitstreamContext *ctx, CodedBitstreamUnit *unit, PutBitContext *pbc)
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int cbs_av1_read_uvlc(CodedBitstreamContext *ctx, GetBitContext *gbc, const char *name, uint32_t *write_to, uint32_t range_min, uint32_t range_max)
Coded bitstream fragment structure, combining one or more units.
static int cbs_av1_write_leb128(CodedBitstreamContext *ctx, PutBitContext *pbc, const char *name, uint64_t value)
size_t data_size
The number of bytes in the bitstream.
static int cbs_av1_ref_tile_data(CodedBitstreamContext *ctx, CodedBitstreamUnit *unit, GetBitContext *gbc, AV1RawTileData *td)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static int cbs_av1_split_fragment(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, int header)
static int cbs_av1_write_uvlc(CodedBitstreamContext *ctx, PutBitContext *pbc, const char *name, uint32_t value, uint32_t range_min, uint32_t range_max)
#define MAX_UINT_BITS(length)
int(* read_unit)(CodedBitstreamContext *ctx, CodedBitstreamUnit *unit)
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
static int cbs_av1_read_unit(CodedBitstreamContext *ctx, CodedBitstreamUnit *unit)
@ AV1_METADATA_TYPE_ITUT_T35
static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc)
static unsigned int get_bits1(GetBitContext *s)
size_t data_size
The number of bytes in the bitstream (including any padding bits in the final byte).
static void cbs_av1_free_padding(AV1RawPadding *pd)
static int cbs_av1_write_subexp(CodedBitstreamContext *ctx, PutBitContext *pbc, uint32_t range_max, const char *name, const int *subscripts, uint32_t value)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_WB16 unsigned int_TMPL byte
AV1RawSequenceHeader sequence_header
uint8_t * data
Pointer to the bitstream form of this fragment.
@ AV1_OBU_SEQUENCE_HEADER
static const uint8_t header[24]
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
AVBufferRef * sequence_header_ref
AV1RawFrameHeader frame_header
void ff_cbs_trace_syntax_element(CodedBitstreamContext *ctx, int position, const char *str, const int *subscripts, const char *bits, int64_t value)
static int cbs_av1_assemble_fragment(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag)
static int cbs_av1_tile_log2(int blksize, int target)
AVBufferRef * data_ref
A reference to the buffer containing data.
#define i(width, name, range_min, range_max)
int(* write_unit)(CodedBitstreamContext *ctx, CodedBitstreamUnit *unit, PutBitContext *pbc)
static int put_bits_count(PutBitContext *s)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
int ff_cbs_read_unsigned(CodedBitstreamContext *ctx, GetBitContext *gbc, int width, const char *name, const int *subscripts, uint32_t *write_to, uint32_t range_min, uint32_t range_max)
AV1RawTileGroup tile_group
AVBufferRef * content_ref
If content is reference counted, a reference to the buffer containing content.
#define AV_INPUT_BUFFER_PADDING_SIZE
static int cbs_av1_get_relative_dist(const AV1RawSequenceHeader *seq, unsigned int a, unsigned int b)
AV1ReferenceFrameState * ref
AV1RawSequenceHeader * sequence_header
int ff_cbs_alloc_unit_content(CodedBitstreamContext *ctx, CodedBitstreamUnit *unit, size_t size, void(*free)(void *opaque, uint8_t *data))
AVBufferRef * payload_ref
static void skip_put_bytes(PutBitContext *s, int n)
Skip the given number of bytes.
AVBufferRef * av_buffer_ref(AVBufferRef *buf)
Create a new reference to an AVBuffer.
AV1RawTileGroup tile_group
static void cbs_av1_free_obu(void *unit, uint8_t *content)
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
static av_always_inline int diff(const uint32_t a, const uint32_t b)
static void cbs_av1_free_metadata(AV1RawMetadata *md)
static int cbs_av1_write_ns(CodedBitstreamContext *ctx, PutBitContext *pbc, uint32_t n, const char *name, const int *subscripts, uint32_t value)
int(* assemble_fragment)(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
AVBufferRef * data_ref
A reference to the buffer containing data.
int(* split_fragment)(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, int header)
void * priv_data
Format private data.
AV1ReferenceFrameState write_ref[AV1_NUM_REF_FRAMES]
int nb_units
Number of units in this fragment.