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 << zeroes) + 1;
133 if (
ctx->trace_enable) {
137 for (j = 0; j < zeroes; j++)
140 for (j = 0; j < zeroes; j++)
141 bits[
i++] = (v >> (zeroes - j - 1) & 1) ?
'1' :
'0';
151 const char *
name, uint64_t *write_to)
154 int position, err,
i;
156 if (
ctx->trace_enable)
160 for (
i = 0;
i < 8;
i++) {
161 int subscript[2] = { 1,
i };
168 value |= (uint64_t)(
byte & 0x7f) << (
i * 7);
173 if (
value > UINT32_MAX)
176 if (
ctx->trace_enable)
186 int position, err,
len,
i;
191 if (
ctx->trace_enable)
194 for (
i = 0;
i <
len;
i++) {
195 int subscript[2] = { 1,
i };
197 byte =
value >> (7 *
i) & 0x7f;
207 if (
ctx->trace_enable)
214 uint32_t n,
const char *
name,
215 const int *subscripts, uint32_t *write_to)
217 uint32_t m, v, extra_bit,
value;
222 if (
ctx->trace_enable)
230 "%s: bitstream ended.\n",
name);
243 value = (v << 1) - m + extra_bit;
246 if (
ctx->trace_enable) {
249 for (
i = 0;
i <
w - 1;
i++)
250 bits[
i] = (v >>
i & 1) ?
'1' :
'0';
252 bits[
i++] = extra_bit ?
'1' :
'0';
264 uint32_t n,
const char *
name,
265 const int *subscripts, uint32_t
value)
267 uint32_t
w, m, v, extra_bit;
272 "%"PRIu32
", but must be in [0,%"PRIu32
"].\n",
277 if (
ctx->trace_enable)
290 v = m + ((
value - m) >> 1);
291 extra_bit = (
value - m) & 1;
296 if (
ctx->trace_enable) {
299 for (
i = 0;
i <
w - 1;
i++)
300 bits[
i] = (v >>
i & 1) ?
'1' :
'0';
302 bits[
i++] = extra_bit ?
'1' :
'0';
313 uint32_t range_min, uint32_t range_max,
314 const char *
name, uint32_t *write_to)
320 av_assert0(range_min <= range_max && range_max - range_min <
sizeof(
bits) - 1);
321 if (
ctx->trace_enable)
324 for (
i = 0,
value = range_min;
value < range_max;) {
327 "%s: bitstream ended.\n",
name);
339 if (
ctx->trace_enable) {
350 uint32_t range_min, uint32_t range_max,
355 av_assert0(range_min <= range_max && range_max - range_min < 32);
356 if (value < range_min || value > range_max) {
358 "%"PRIu32
", but must be in [%"PRIu32
",%"PRIu32
"].\n",
363 if (
value == range_max)
364 len = range_max - range_min;
370 if (
ctx->trace_enable) {
373 for (
i = 0;
i <
len;
i++) {
374 if (range_min +
i ==
value)
391 uint32_t range_max,
const char *
name,
392 const int *subscripts, uint32_t *write_to)
396 uint32_t max_len,
len, range_offset, range_bits;
398 if (
ctx->trace_enable)
402 max_len =
av_log2(range_max - 1) - 3;
405 "subexp_more_bits", &
len);
410 range_bits = 2 +
len;
411 range_offset = 1 << range_bits;
430 value += range_offset;
432 if (
ctx->trace_enable)
441 uint32_t range_max,
const char *
name,
442 const int *subscripts, uint32_t
value)
445 uint32_t max_len,
len, range_offset, range_bits;
447 if (
value > range_max) {
449 "%"PRIu32
", but must be in [0,%"PRIu32
"].\n",
454 if (
ctx->trace_enable)
458 max_len =
av_log2(range_max - 1) - 3;
466 len = range_bits - 2;
473 range_offset = 1 << range_bits;
477 "subexp_more_bits",
len);
484 value - range_offset,
491 "subexp_final_bits",
NULL,
492 value - range_offset);
497 if (
ctx->trace_enable)
508 for (k = 0; (blksize << k) < target; k++);
513 unsigned int a,
unsigned int b)
515 unsigned int diff, m;
536 #define HEADER(name) do { \
537 ff_cbs_trace_header(ctx, name); \
540 #define CHECK(call) do { \
546 #define FUNC_NAME(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ## name
547 #define FUNC_AV1(rw, name) FUNC_NAME(rw, av1, name)
548 #define FUNC(name) FUNC_AV1(READWRITE, name)
550 #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
552 #define fb(width, name) \
553 xf(width, name, current->name, 0, MAX_UINT_BITS(width), 0, )
554 #define fc(width, name, range_min, range_max) \
555 xf(width, name, current->name, range_min, range_max, 0, )
556 #define flag(name) fb(1, name)
557 #define su(width, name) \
558 xsu(width, name, current->name, 0, )
560 #define fbs(width, name, subs, ...) \
561 xf(width, name, current->name, 0, MAX_UINT_BITS(width), subs, __VA_ARGS__)
562 #define fcs(width, name, range_min, range_max, subs, ...) \
563 xf(width, name, current->name, range_min, range_max, subs, __VA_ARGS__)
564 #define flags(name, subs, ...) \
565 xf(1, name, current->name, 0, 1, subs, __VA_ARGS__)
566 #define sus(width, name, subs, ...) \
567 xsu(width, name, current->name, subs, __VA_ARGS__)
569 #define fixed(width, name, value) do { \
570 av_unused uint32_t fixed_value = value; \
571 xf(width, name, fixed_value, value, value, 0, ); \
576 #define READWRITE read
577 #define RWContext GetBitContext
579 #define xf(width, name, var, range_min, range_max, subs, ...) do { \
581 CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
582 SUBSCRIPTS(subs, __VA_ARGS__), \
583 &value, range_min, range_max)); \
587 #define xsu(width, name, var, subs, ...) do { \
589 CHECK(ff_cbs_read_signed(ctx, rw, width, #name, \
590 SUBSCRIPTS(subs, __VA_ARGS__), &value, \
591 MIN_INT_BITS(width), \
592 MAX_INT_BITS(width))); \
596 #define uvlc(name, range_min, range_max) do { \
598 CHECK(cbs_av1_read_uvlc(ctx, rw, #name, \
599 &value, range_min, range_max)); \
600 current->name = value; \
603 #define ns(max_value, name, subs, ...) do { \
605 CHECK(cbs_av1_read_ns(ctx, rw, max_value, #name, \
606 SUBSCRIPTS(subs, __VA_ARGS__), &value)); \
607 current->name = value; \
610 #define increment(name, min, max) do { \
612 CHECK(cbs_av1_read_increment(ctx, rw, min, max, #name, &value)); \
613 current->name = value; \
616 #define subexp(name, max, subs, ...) do { \
618 CHECK(cbs_av1_read_subexp(ctx, rw, max, #name, \
619 SUBSCRIPTS(subs, __VA_ARGS__), &value)); \
620 current->name = value; \
623 #define delta_q(name) do { \
624 uint8_t delta_coded; \
626 xf(1, name.delta_coded, delta_coded, 0, 1, 0, ); \
628 xsu(1 + 6, name.delta_q, delta_q, 0, ); \
631 current->name = delta_q; \
634 #define leb128(name) do { \
636 CHECK(cbs_av1_read_leb128(ctx, rw, #name, &value)); \
637 current->name = value; \
640 #define infer(name, value) do { \
641 current->name = value; \
644 #define byte_alignment(rw) (get_bits_count(rw) % 8)
660 #undef byte_alignment
664 #define READWRITE write
665 #define RWContext PutBitContext
667 #define xf(width, name, var, range_min, range_max, subs, ...) do { \
668 CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
669 SUBSCRIPTS(subs, __VA_ARGS__), \
670 var, range_min, range_max)); \
673 #define xsu(width, name, var, subs, ...) do { \
674 CHECK(ff_cbs_write_signed(ctx, rw, width, #name, \
675 SUBSCRIPTS(subs, __VA_ARGS__), var, \
676 MIN_INT_BITS(width), \
677 MAX_INT_BITS(width))); \
680 #define uvlc(name, range_min, range_max) do { \
681 CHECK(cbs_av1_write_uvlc(ctx, rw, #name, current->name, \
682 range_min, range_max)); \
685 #define ns(max_value, name, subs, ...) do { \
686 CHECK(cbs_av1_write_ns(ctx, rw, max_value, #name, \
687 SUBSCRIPTS(subs, __VA_ARGS__), \
691 #define increment(name, min, max) do { \
692 CHECK(cbs_av1_write_increment(ctx, rw, min, max, #name, \
696 #define subexp(name, max, subs, ...) do { \
697 CHECK(cbs_av1_write_subexp(ctx, rw, max, #name, \
698 SUBSCRIPTS(subs, __VA_ARGS__), \
702 #define delta_q(name) do { \
703 xf(1, name.delta_coded, current->name != 0, 0, 1, 0, ); \
705 xsu(1 + 6, name.delta_q, current->name, 0, ); \
708 #define leb128(name) do { \
709 CHECK(cbs_av1_write_leb128(ctx, rw, #name, current->name)); \
712 #define infer(name, value) do { \
713 if (current->name != (value)) { \
714 av_log(ctx->log_ctx, AV_LOG_ERROR, \
715 "%s does not match inferred value: " \
716 "%"PRId64", but should be %"PRId64".\n", \
717 #name, (int64_t)current->name, (int64_t)(value)); \
718 return AVERROR_INVALIDDATA; \
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);
775 if (
header.obu_has_size_field) {
786 obu_size =
size - 1 -
header.obu_extension_flag;
791 obu_length =
pos / 8 + obu_size;
793 if (
size < obu_length) {
795 "%"PRIu64
", but only %"SIZE_SPECIFIER" bytes remaining in fragment.\n",
812 ctx->trace_enable = trace;
828 switch (
md->metadata_type) {
870 "any data in tile group (%d bits read).\n",
pos);
892 int err, start_pos, end_pos;
904 err = cbs_av1_read_obu_header(
ctx, &gbc, &obu->
header);
933 int in_temporal_layer =
935 int in_spatial_layer =
937 if (!in_temporal_layer || !in_spatial_layer) {
951 err = cbs_av1_read_sequence_header_obu(
ctx, &gbc,
967 err = cbs_av1_read_temporal_delimiter_obu(
ctx, &gbc);
975 err = cbs_av1_read_frame_header_obu(
ctx, &gbc,
986 err = cbs_av1_read_tile_group_obu(
ctx, &gbc,
999 err = cbs_av1_read_frame_obu(
ctx, &gbc, &obu->
obu.
frame,
1012 err = cbs_av1_read_tile_list_obu(
ctx, &gbc,
1032 err = cbs_av1_read_padding_obu(
ctx, &gbc, &obu->
obu.
padding);
1048 int nb_bits = obu->
obu_size * 8 + start_pos - end_pos;
1053 err = cbs_av1_read_trailing_bits(
ctx, &gbc, nb_bits);
1070 int err, start_pos, end_pos, data_pos;
1077 err = cbs_av1_write_obu_header(
ctx, pbc, &obu->
header);
1096 err = cbs_av1_write_sequence_header_obu(
ctx, pbc,
1112 err = cbs_av1_write_temporal_delimiter_obu(
ctx, pbc);
1120 err = cbs_av1_write_frame_header_obu(
ctx, pbc,
1131 err = cbs_av1_write_tile_group_obu(
ctx, pbc,
1166 err = cbs_av1_write_padding_obu(
ctx, pbc, &obu->
obu.
padding);
1176 header_size = (end_pos - start_pos + 7) / 8;
1179 }
else if (header_size > 0) {
1181 err = cbs_av1_write_trailing_bits(
ctx, pbc, 8 - end_pos % 8);
1185 obu->
obu_size = header_size = (end_pos - start_pos + 7) / 8;
1211 memmove(pbc->
buf + data_pos,
1212 pbc->
buf + start_pos, header_size);
1216 memcpy(pbc->
buf + data_pos + header_size,
1217 td->data,
td->data_size);
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 minimum maximum flags name is the option name
@ 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)
static void cbs_av1_free_obu(void *opaque, uint8_t *content)
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)
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).
@ AV1_METADATA_TYPE_ITUT_T35
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)
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.
FFmpeg Automated Testing Environment ************************************Introduction Using FATE from your FFmpeg source directory Submitting the results to the FFmpeg result aggregation server Uploading new samples to the fate suite FATE makefile targets and variables Makefile targets Makefile variables Examples Introduction **************FATE is an extended regression suite on the client side and a means for results aggregation and presentation on the server side The first part of this document explains how you can use FATE from your FFmpeg source directory to test your ffmpeg binary The second part describes how you can run FATE to submit the results to FFmpeg’s FATE server In any way you can have a look at the publicly viewable FATE results by visiting this as it can be seen if some test on some platform broke with their recent contribution This usually happens on the platforms the developers could not test on The second part of this document describes how you can run FATE to submit your results to FFmpeg’s FATE server If you want to submit your results be sure to check that your combination of OS and compiler is not already listed on the above mentioned website In the third part you can find a comprehensive listing of FATE makefile targets and variables Using FATE from your FFmpeg source directory **********************************************If you want to run FATE on your machine you need to have the samples in place You can get the samples via the build target fate rsync Use this command from the top level source this will cause FATE to fail NOTE To use a custom wrapper to run the pass ‘ target exec’ to ‘configure’ or set the TARGET_EXEC Make variable Submitting the results to the FFmpeg result aggregation server ****************************************************************To submit your results to the server you should run fate through the shell script ‘tests fate sh’ from the FFmpeg sources This script needs to be invoked with a configuration file as its first argument tests fate sh path to fate_config A configuration file template with comments describing the individual configuration variables can be found at ‘doc fate_config sh template’ Create a configuration that suits your based on the configuration template The ‘slot’ configuration variable can be any string that is not yet but it is suggested that you name it adhering to the following pattern ‘ARCH OS COMPILER COMPILER VERSION’ The configuration file itself will be sourced in a shell therefore all shell features may be used This enables you to setup the environment as you need it for your build For your first test runs the ‘fate_recv’ variable should be empty or commented out This will run everything as normal except that it will omit the submission of the results to the server The following files should be present in $workdir as specified in the configuration it may help to try out the ‘ssh’ command with one or more ‘ v’ options You should get detailed output concerning your SSH configuration and the authentication process The only thing left is to automate the execution of the fate sh script and the synchronisation of the samples directory Uploading new samples to the fate suite *****************************************If you need a sample uploaded send a mail to samples request This is for developers who have an account on the fate suite server If you upload new please make sure they are as small as space on each network bandwidth and so on benefit from smaller test cases Also keep in mind older checkouts use existing sample that means in practice generally do not remove or overwrite files as it likely would break older checkouts or releases Also all needed samples for a commit should be ideally before the push If you need an account for frequently uploading samples or you wish to help others by doing that send a mail to ffmpeg devel rsync vauL Duo ug o o w
#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 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.