Go to the documentation of this file.
30 const char *
name, uint32_t *write_to,
31 uint32_t range_min, uint32_t range_max)
33 uint32_t zeroes, bits_value,
value;
36 if (
ctx->trace_enable)
43 "%s: bitstream ended.\n",
name);
57 "%s: bitstream ended.\n",
name);
62 value = bits_value + (UINT32_C(1) << zeroes) - 1;
65 if (
ctx->trace_enable) {
71 k =
FFMIN(zeroes - 32, 32);
72 for (
i = 0;
i < k;
i++)
82 for (
i = 0;
i < zeroes;
i++)
87 for (j = 0; j < zeroes; j++)
88 bits[
i++] = (bits_value >> (zeroes - j - 1) & 1) ?
'1' :
'0';
96 if (value < range_min || value > range_max) {
98 "%"PRIu32
", but must be in [%"PRIu32
",%"PRIu32
"].\n",
109 uint32_t range_min, uint32_t range_max)
112 int position, zeroes;
114 if (value < range_min || value > range_max) {
116 "%"PRIu32
", but must be in [%"PRIu32
",%"PRIu32
"].\n",
121 if (
ctx->trace_enable)
125 v =
value - (1
U << zeroes) + 1;
130 if (
ctx->trace_enable) {
134 for (j = 0; j < zeroes; j++)
137 for (j = 0; j < zeroes; j++)
138 bits[
i++] = (v >> (zeroes - j - 1) & 1) ?
'1' :
'0';
148 const char *
name, uint64_t *write_to)
151 int position, err,
i;
153 if (
ctx->trace_enable)
157 for (
i = 0;
i < 8;
i++) {
158 int subscript[2] = { 1,
i };
165 value |= (uint64_t)(
byte & 0x7f) << (
i * 7);
170 if (
value > UINT32_MAX)
173 if (
ctx->trace_enable)
183 int position, err,
len,
i;
188 if (
ctx->trace_enable)
191 for (
i = 0;
i <
len;
i++) {
192 int subscript[2] = { 1,
i };
194 byte =
value >> (7 *
i) & 0x7f;
204 if (
ctx->trace_enable)
211 uint32_t n,
const char *
name,
212 const int *subscripts, uint32_t *write_to)
214 uint32_t m, v, extra_bit,
value;
219 if (
ctx->trace_enable)
227 "%s: bitstream ended.\n",
name);
240 value = (v << 1) - m + extra_bit;
243 if (
ctx->trace_enable) {
246 for (
i = 0;
i <
w - 1;
i++)
247 bits[
i] = (v >>
i & 1) ?
'1' :
'0';
249 bits[
i++] = extra_bit ?
'1' :
'0';
261 uint32_t n,
const char *
name,
262 const int *subscripts, uint32_t
value)
264 uint32_t
w, m, v, extra_bit;
269 "%"PRIu32
", but must be in [0,%"PRIu32
"].\n",
274 if (
ctx->trace_enable)
287 v = m + ((
value - m) >> 1);
288 extra_bit = (
value - m) & 1;
293 if (
ctx->trace_enable) {
296 for (
i = 0;
i <
w - 1;
i++)
297 bits[
i] = (v >>
i & 1) ?
'1' :
'0';
299 bits[
i++] = extra_bit ?
'1' :
'0';
310 uint32_t range_min, uint32_t range_max,
311 const char *
name, uint32_t *write_to)
317 av_assert0(range_min <= range_max && range_max - range_min <
sizeof(
bits) - 1);
318 if (
ctx->trace_enable)
321 for (
i = 0,
value = range_min;
value < range_max;) {
324 "%s: bitstream ended.\n",
name);
336 if (
ctx->trace_enable) {
347 uint32_t range_min, uint32_t range_max,
352 av_assert0(range_min <= range_max && range_max - range_min < 32);
353 if (value < range_min || value > range_max) {
355 "%"PRIu32
", but must be in [%"PRIu32
",%"PRIu32
"].\n",
360 if (
value == range_max)
361 len = range_max - range_min;
367 if (
ctx->trace_enable) {
370 for (
i = 0;
i <
len;
i++) {
371 if (range_min +
i ==
value)
388 uint32_t range_max,
const char *
name,
389 const int *subscripts, uint32_t *write_to)
393 uint32_t max_len,
len, range_offset, range_bits;
395 if (
ctx->trace_enable)
399 max_len =
av_log2(range_max - 1) - 3;
402 "subexp_more_bits", &
len);
407 range_bits = 2 +
len;
408 range_offset = 1 << range_bits;
427 value += range_offset;
429 if (
ctx->trace_enable)
438 uint32_t range_max,
const char *
name,
439 const int *subscripts, uint32_t
value)
442 uint32_t max_len,
len, range_offset, range_bits;
444 if (
value > range_max) {
446 "%"PRIu32
", but must be in [0,%"PRIu32
"].\n",
451 if (
ctx->trace_enable)
455 max_len =
av_log2(range_max - 1) - 3;
463 len = range_bits - 2;
470 range_offset = 1 << range_bits;
474 "subexp_more_bits",
len);
481 value - range_offset,
488 "subexp_final_bits",
NULL,
489 value - range_offset);
494 if (
ctx->trace_enable)
505 for (k = 0; (blksize << k) < target; k++);
510 unsigned int a,
unsigned int b)
512 unsigned int diff, m;
533 #define HEADER(name) do { \
534 ff_cbs_trace_header(ctx, name); \
537 #define CHECK(call) do { \
543 #define FUNC_NAME(rw, codec, name) cbs_ ## codec ## _ ## rw ## _ ## name
544 #define FUNC_AV1(rw, name) FUNC_NAME(rw, av1, name)
545 #define FUNC(name) FUNC_AV1(READWRITE, name)
547 #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
549 #define fb(width, name) \
550 xf(width, name, current->name, 0, MAX_UINT_BITS(width), 0, )
551 #define fc(width, name, range_min, range_max) \
552 xf(width, name, current->name, range_min, range_max, 0, )
553 #define flag(name) fb(1, name)
554 #define su(width, name) \
555 xsu(width, name, current->name, 0, )
557 #define fbs(width, name, subs, ...) \
558 xf(width, name, current->name, 0, MAX_UINT_BITS(width), subs, __VA_ARGS__)
559 #define fcs(width, name, range_min, range_max, subs, ...) \
560 xf(width, name, current->name, range_min, range_max, subs, __VA_ARGS__)
561 #define flags(name, subs, ...) \
562 xf(1, name, current->name, 0, 1, subs, __VA_ARGS__)
563 #define sus(width, name, subs, ...) \
564 xsu(width, name, current->name, subs, __VA_ARGS__)
566 #define fixed(width, name, value) do { \
567 av_unused uint32_t fixed_value = value; \
568 xf(width, name, fixed_value, value, value, 0, ); \
573 #define READWRITE read
574 #define RWContext GetBitContext
576 #define xf(width, name, var, range_min, range_max, subs, ...) do { \
578 CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
579 SUBSCRIPTS(subs, __VA_ARGS__), \
580 &value, range_min, range_max)); \
584 #define xsu(width, name, var, subs, ...) do { \
586 CHECK(ff_cbs_read_signed(ctx, rw, width, #name, \
587 SUBSCRIPTS(subs, __VA_ARGS__), &value, \
588 MIN_INT_BITS(width), \
589 MAX_INT_BITS(width))); \
593 #define uvlc(name, range_min, range_max) do { \
595 CHECK(cbs_av1_read_uvlc(ctx, rw, #name, \
596 &value, range_min, range_max)); \
597 current->name = value; \
600 #define ns(max_value, name, subs, ...) do { \
602 CHECK(cbs_av1_read_ns(ctx, rw, max_value, #name, \
603 SUBSCRIPTS(subs, __VA_ARGS__), &value)); \
604 current->name = value; \
607 #define increment(name, min, max) do { \
609 CHECK(cbs_av1_read_increment(ctx, rw, min, max, #name, &value)); \
610 current->name = value; \
613 #define subexp(name, max, subs, ...) do { \
615 CHECK(cbs_av1_read_subexp(ctx, rw, max, #name, \
616 SUBSCRIPTS(subs, __VA_ARGS__), &value)); \
617 current->name = value; \
620 #define delta_q(name) do { \
621 uint8_t delta_coded; \
623 xf(1, name.delta_coded, delta_coded, 0, 1, 0, ); \
625 xsu(1 + 6, name.delta_q, delta_q, 0, ); \
628 current->name = delta_q; \
631 #define leb128(name) do { \
633 CHECK(cbs_av1_read_leb128(ctx, rw, #name, &value)); \
634 current->name = value; \
637 #define infer(name, value) do { \
638 current->name = value; \
641 #define byte_alignment(rw) (get_bits_count(rw) % 8)
657 #undef byte_alignment
661 #define READWRITE write
662 #define RWContext PutBitContext
664 #define xf(width, name, var, range_min, range_max, subs, ...) do { \
665 CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
666 SUBSCRIPTS(subs, __VA_ARGS__), \
667 var, range_min, range_max)); \
670 #define xsu(width, name, var, subs, ...) do { \
671 CHECK(ff_cbs_write_signed(ctx, rw, width, #name, \
672 SUBSCRIPTS(subs, __VA_ARGS__), var, \
673 MIN_INT_BITS(width), \
674 MAX_INT_BITS(width))); \
677 #define uvlc(name, range_min, range_max) do { \
678 CHECK(cbs_av1_write_uvlc(ctx, rw, #name, current->name, \
679 range_min, range_max)); \
682 #define ns(max_value, name, subs, ...) do { \
683 CHECK(cbs_av1_write_ns(ctx, rw, max_value, #name, \
684 SUBSCRIPTS(subs, __VA_ARGS__), \
688 #define increment(name, min, max) do { \
689 CHECK(cbs_av1_write_increment(ctx, rw, min, max, #name, \
693 #define subexp(name, max, subs, ...) do { \
694 CHECK(cbs_av1_write_subexp(ctx, rw, max, #name, \
695 SUBSCRIPTS(subs, __VA_ARGS__), \
699 #define delta_q(name) do { \
700 xf(1, name.delta_coded, current->name != 0, 0, 1, 0, ); \
702 xsu(1 + 6, name.delta_q, current->name, 0, ); \
705 #define leb128(name) do { \
706 CHECK(cbs_av1_write_leb128(ctx, rw, #name, current->name)); \
709 #define infer(name, value) do { \
710 if (current->name != (value)) { \
711 av_log(ctx->log_ctx, AV_LOG_ERROR, \
712 "%s does not match inferred value: " \
713 "%"PRId64", but should be %"PRId64".\n", \
714 #name, (int64_t)current->name, (int64_t)(value)); \
715 return AVERROR_INVALIDDATA; \
719 #define byte_alignment(rw) (put_bits_count(rw) % 8)
735 #undef byte_alignment
749 trace =
ctx->trace_enable;
750 ctx->trace_enable = 0;
755 if (INT_MAX / 8 <
size) {
765 int config_record_version =
data[0] & 0x7f;
767 if (config_record_version != 1) {
769 "Unknown version %d of AV1CodecConfigurationRecord "
771 config_record_version);
779 "Undersized AV1CodecConfigurationRecord v%d found!\n",
780 config_record_version);
801 err = cbs_av1_read_obu_header(
ctx, &gbc, &
header);
805 if (
header.obu_has_size_field) {
816 obu_size =
size - 1 -
header.obu_extension_flag;
821 obu_length =
pos / 8 + obu_size;
823 if (
size < obu_length) {
825 "%"PRIu64
", but only %"SIZE_SPECIFIER" bytes remaining in fragment.\n",
843 ctx->trace_enable = trace;
857 "any data in tile group (%d bits read).\n",
pos);
879 int err, start_pos, end_pos;
890 err = cbs_av1_read_obu_header(
ctx, &gbc, &obu->
header);
916 int in_temporal_layer =
918 int in_spatial_layer =
920 if (!in_temporal_layer || !in_spatial_layer) {
929 err = cbs_av1_read_sequence_header_obu(
ctx, &gbc,
939 "Must not be higher than %u.\n",
957 err = cbs_av1_read_temporal_delimiter_obu(
ctx, &gbc);
965 err = cbs_av1_read_frame_header_obu(
ctx, &gbc,
976 err = cbs_av1_read_tile_group_obu(
ctx, &gbc,
989 err = cbs_av1_read_frame_obu(
ctx, &gbc, &obu->
obu.
frame,
1002 err = cbs_av1_read_tile_list_obu(
ctx, &gbc,
1022 err = cbs_av1_read_padding_obu(
ctx, &gbc, &obu->
obu.
padding);
1038 int nb_bits = obu->
obu_size * 8 + start_pos - end_pos;
1043 err = cbs_av1_read_trailing_bits(
ctx, &gbc, nb_bits);
1060 int err, start_pos, end_pos, data_pos;
1067 err = cbs_av1_write_obu_header(
ctx, pbc, &obu->
header);
1084 err = cbs_av1_write_sequence_header_obu(
ctx, pbc,
1104 err = cbs_av1_write_temporal_delimiter_obu(
ctx, pbc);
1112 err = cbs_av1_write_frame_header_obu(
ctx, pbc,
1123 err = cbs_av1_write_tile_group_obu(
ctx, pbc,
1158 err = cbs_av1_write_padding_obu(
ctx, pbc, &obu->
obu.
padding);
1168 header_size = (end_pos - start_pos + 7) / 8;
1171 }
else if (header_size > 0) {
1173 err = cbs_av1_write_trailing_bits(
ctx, pbc, 8 - end_pos % 8);
1177 obu->
obu_size = header_size = (end_pos - start_pos + 7) / 8;
1203 memmove(pbc->
buf + data_pos,
1204 pbc->
buf + start_pos, header_size);
1208 memcpy(pbc->
buf + data_pos + header_size,
1209 td->data,
td->data_size);
1256 memset(priv->
ref, 0,
sizeof(priv->
ref));
1278 switch (
md->metadata_type) {
1307 #define OFFSET(x) offsetof(CodedBitstreamAV1Context, x)
1309 {
"operating_point",
"Set operating point to select layers to parse from a scalable bitstream",
#define AV_LOG_WARNING
Something somehow does not look correct.
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
#define CBS_UNIT_TYPE_COMPLEX(type, structure, free_func)
@ AV1_OBU_REDUNDANT_FRAME_HEADER
static const AVClass cbs_av1_class
static const CodedBitstreamUnitTypeDescriptor cbs_av1_unit_types[]
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)
static void cbs_av1_free_metadata(void *unit, uint8_t *content)
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)
int ff_cbs_alloc_unit_content2(CodedBitstreamContext *ctx, CodedBitstreamUnit *unit)
Allocate a new internal content buffer matching the type of the unit.
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.
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
@ AV1_OBU_TEMPORAL_DELIMITER
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
@ AV1_MAX_OPERATING_POINTS
Coded bitstream unit structure.
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.
#define CBS_UNIT_TYPE_INTERNAL_REF(type, structure, ref_field)
AV1ReferenceFrameState ref[AV1_NUM_REF_FRAMES]
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.
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.
#define CBS_UNIT_TYPE_POD(type, structure)
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)
#define LIBAVUTIL_VERSION_INT
Describe the class of an AVClass context structure.
static void flush(AVCodecContext *avctx)
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 const AVOption cbs_av1_options[]
const char * av_default_item_name(void *ptr)
Return the context name.
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 int cbs_av1_write_subexp(CodedBitstreamContext *ctx, PutBitContext *pbc, uint32_t range_max, const char *name, const int *subscripts, uint32_t value)
static void cbs_av1_flush(CodedBitstreamContext *ctx)
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
const CodedBitstreamUnitTypeDescriptor * unit_types
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
int ff_cbs_insert_unit_data(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.
AVBufferRef * sequence_header_ref
AVBufferRef * av_buffer_alloc(size_t size)
Allocate an AVBuffer of the given size using av_malloc().
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_make_unit_refcounted(CodedBitstreamContext *ctx, CodedBitstreamUnit *unit)
Make the content of a unit refcounted.
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
#define CBS_UNIT_TYPE_END_OF_LIST
AVBufferRef * content_ref
If content is reference counted, a reference to the buffer containing content.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define AV_INPUT_BUFFER_PADDING_SIZE
static int cbs_av1_get_relative_dist(const AV1RawSequenceHeader *seq, unsigned int a, unsigned int b)
AV1RawSequenceHeader * sequence_header
static void skip_put_bytes(PutBitContext *s, int n)
Skip the given number of bytes.
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 int cbs_av1_write_ns(CodedBitstreamContext *ctx, PutBitContext *pbc, uint32_t n, const char *name, const int *subscripts, uint32_t value)
static int FUNC() sequence_header(CodedBitstreamContext *ctx, RWContext *rw, MPEG2RawSequenceHeader *current)
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.
int nb_units
Number of units in this fragment.