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.