On 3/22/2025 11:25 AM, Andreas Rheinhardt wrote: > James Almer: >> This will be useful in an upcoming commit, where CBS will be utilized by >> a module outside libavcodec. >> >> Signed-off-by: James Almer <jamrial@gmail.com> >> --- >> libavcodec/cbs.c | 100 ++++++++++++++++++++++----- >> libavcodec/cbs_av1.c | 64 ++++++++++++++++- >> libavcodec/cbs_av1.h | 15 ++++ >> libavcodec/cbs_av1_syntax_template.c | 6 ++ >> libavcodec/cbs_internal.h | 48 +++++++++++++ >> 5 files changed, 212 insertions(+), 21 deletions(-) >> >> diff --git a/libavcodec/cbs.c b/libavcodec/cbs.c >> index 01dd916d81..94bf174700 100644 >> --- a/libavcodec/cbs.c >> +++ b/libavcodec/cbs.c >> @@ -18,8 +18,6 @@ >> >> #include <string.h> >> >> -#include "config.h" >> - >> #include "libavutil/avassert.h" >> #include "libavutil/buffer.h" >> #include "libavutil/common.h" >> @@ -33,55 +31,55 @@ >> >> >> static const CodedBitstreamType *const cbs_type_table[] = { >> -#if CONFIG_CBS_AV1 >> +#if CBS_AV1 >> &ff_cbs_type_av1, >> #endif >> -#if CONFIG_CBS_H264 >> +#if CBS_H264 >> &ff_cbs_type_h264, >> #endif >> -#if CONFIG_CBS_H265 >> +#if CBS_H265 >> &ff_cbs_type_h265, >> #endif >> -#if CONFIG_CBS_H266 >> +#if CBS_H266 >> &ff_cbs_type_h266, >> #endif >> -#if CONFIG_CBS_JPEG >> +#if CBS_JPEG >> &ff_cbs_type_jpeg, >> #endif >> -#if CONFIG_CBS_MPEG2 >> +#if CBS_MPEG2 >> &ff_cbs_type_mpeg2, >> #endif >> -#if CONFIG_CBS_VP8 >> +#if CBS_VP8 >> &ff_cbs_type_vp8, >> #endif >> -#if CONFIG_CBS_VP9 >> +#if CBS_VP9 >> &ff_cbs_type_vp9, >> #endif >> }; >> >> const enum AVCodecID ff_cbs_all_codec_ids[] = { >> -#if CONFIG_CBS_AV1 >> +#if CBS_AV1 >> AV_CODEC_ID_AV1, >> #endif >> -#if CONFIG_CBS_H264 >> +#if CBS_H264 >> AV_CODEC_ID_H264, >> #endif >> -#if CONFIG_CBS_H265 >> +#if CBS_H265 >> AV_CODEC_ID_H265, >> #endif >> -#if CONFIG_CBS_H266 >> +#if CBS_H266 >> AV_CODEC_ID_H266, >> #endif >> -#if CONFIG_CBS_JPEG >> +#if CBS_JPEG >> AV_CODEC_ID_MJPEG, >> #endif >> -#if CONFIG_CBS_MPEG2 >> +#if CBS_MPEG2 >> AV_CODEC_ID_MPEG2VIDEO, >> #endif >> -#if CONFIG_CBS_VP8 >> +#if CBS_VP8 >> AV_CODEC_ID_VP8, >> #endif >> -#if CONFIG_CBS_VP9 >> +#if CBS_VP9 >> AV_CODEC_ID_VP9, >> #endif >> AV_CODEC_ID_NONE >> @@ -234,6 +232,7 @@ static int cbs_read_fragment_content(CodedBitstreamContext *ctx, >> return 0; >> } >> >> +#if CBS_READ >> static int cbs_fill_fragment_data(CodedBitstreamFragment *frag, >> const uint8_t *data, size_t size) >> { >> @@ -282,37 +281,51 @@ static int cbs_read_data(CodedBitstreamContext *ctx, >> >> return cbs_read_fragment_content(ctx, frag); >> } >> +#endif >> >> int ff_cbs_read_extradata(CodedBitstreamContext *ctx, >> CodedBitstreamFragment *frag, >> const AVCodecParameters *par) >> { >> +#if CBS_READ >> return cbs_read_data(ctx, frag, NULL, >> par->extradata, >> par->extradata_size, 1); >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> int ff_cbs_read_extradata_from_codec(CodedBitstreamContext *ctx, >> CodedBitstreamFragment *frag, >> const AVCodecContext *avctx) >> { >> +#if CBS_READ >> return cbs_read_data(ctx, frag, NULL, >> avctx->extradata, >> avctx->extradata_size, 1); >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> int ff_cbs_read_packet(CodedBitstreamContext *ctx, >> CodedBitstreamFragment *frag, >> const AVPacket *pkt) >> { >> +#if CBS_READ >> return cbs_read_data(ctx, frag, pkt->buf, >> pkt->data, pkt->size, 0); >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> int ff_cbs_read_packet_side_data(CodedBitstreamContext *ctx, >> CodedBitstreamFragment *frag, >> const AVPacket *pkt) >> { >> +#if CBS_READ >> size_t side_data_size; >> const uint8_t *side_data = >> av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, >> @@ -320,16 +333,24 @@ int ff_cbs_read_packet_side_data(CodedBitstreamContext *ctx, >> >> return cbs_read_data(ctx, frag, NULL, >> side_data, side_data_size, 1); >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> int ff_cbs_read(CodedBitstreamContext *ctx, >> CodedBitstreamFragment *frag, >> const uint8_t *data, size_t size) >> { >> +#if CBS_READ >> return cbs_read_data(ctx, frag, NULL, >> data, size, 0); >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> +#if CBS_WRITE >> /** >> * Allocate a new internal data buffer of the given size in the unit. >> * >> @@ -405,10 +426,12 @@ static int cbs_write_unit_data(CodedBitstreamContext *ctx, >> >> return 0; >> } >> +#endif >> >> int ff_cbs_write_fragment_data(CodedBitstreamContext *ctx, >> CodedBitstreamFragment *frag) >> { >> +#if CBS_WRITE >> int err, i; >> >> for (i = 0; i < frag->nb_units; i++) { >> @@ -440,12 +463,16 @@ int ff_cbs_write_fragment_data(CodedBitstreamContext *ctx, >> av_assert0(frag->data && frag->data_ref); >> >> return 0; >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> int ff_cbs_write_extradata(CodedBitstreamContext *ctx, >> AVCodecParameters *par, >> CodedBitstreamFragment *frag) >> { >> +#if CBS_WRITE >> int err; >> >> err = ff_cbs_write_fragment_data(ctx, frag); >> @@ -469,12 +496,16 @@ int ff_cbs_write_extradata(CodedBitstreamContext *ctx, >> par->extradata_size = frag->data_size; >> >> return 0; >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> int ff_cbs_write_packet(CodedBitstreamContext *ctx, >> AVPacket *pkt, >> CodedBitstreamFragment *frag) >> { >> +#if CBS_WRITE >> AVBufferRef *buf; >> int err; >> >> @@ -493,16 +524,21 @@ int ff_cbs_write_packet(CodedBitstreamContext *ctx, >> pkt->size = frag->data_size; >> >> return 0; >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> >> void ff_cbs_trace_header(CodedBitstreamContext *ctx, >> const char *name) >> { >> +#if CBS_TRACE >> if (!ctx->trace_enable) >> return; >> >> av_log(ctx->log_ctx, ctx->trace_level, "%s\n", name); >> +#endif >> } >> >> void ff_cbs_trace_read_log(void *trace_context, >> @@ -510,6 +546,7 @@ void ff_cbs_trace_read_log(void *trace_context, >> const char *str, const int *subscripts, >> int64_t value) >> { >> +#if CBS_TRACE >> CodedBitstreamContext *ctx = trace_context; >> char name[256]; >> char bits[256]; >> @@ -561,6 +598,7 @@ void ff_cbs_trace_read_log(void *trace_context, >> >> av_log(ctx->log_ctx, ctx->trace_level, "%-10d %s%*s = %"PRId64"\n", >> position, name, pad, bits, value); >> +#endif >> } >> >> void ff_cbs_trace_write_log(void *trace_context, >> @@ -568,6 +606,7 @@ void ff_cbs_trace_write_log(void *trace_context, >> const char *str, const int *subscripts, >> int64_t value) >> { >> +#if CBS_TRACE >> CodedBitstreamContext *ctx = trace_context; >> >> // Ensure that the syntax element is written to the output buffer, >> @@ -591,6 +630,7 @@ void ff_cbs_trace_write_log(void *trace_context, >> skip_bits_long(&gbc, position - length); >> >> ff_cbs_trace_read_log(ctx, &gbc, length, str, subscripts, value); >> +#endif >> } >> >> static av_always_inline int cbs_read_unsigned(CodedBitstreamContext *ctx, >> @@ -633,15 +673,23 @@ int ff_cbs_read_unsigned(CodedBitstreamContext *ctx, GetBitContext *gbc, >> const int *subscripts, uint32_t *write_to, >> uint32_t range_min, uint32_t range_max) >> { >> +#if CBS_READ >> return cbs_read_unsigned(ctx, gbc, width, name, subscripts, >> write_to, range_min, range_max); >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> int ff_cbs_read_simple_unsigned(CodedBitstreamContext *ctx, GetBitContext *gbc, >> int width, const char *name, uint32_t *write_to) >> { >> +#if CBS_READ >> return cbs_read_unsigned(ctx, gbc, width, name, NULL, >> write_to, 0, UINT32_MAX); >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> int ff_cbs_write_unsigned(CodedBitstreamContext *ctx, PutBitContext *pbc, >> @@ -649,6 +697,7 @@ int ff_cbs_write_unsigned(CodedBitstreamContext *ctx, PutBitContext *pbc, >> const int *subscripts, uint32_t value, >> uint32_t range_min, uint32_t range_max) >> { >> +#if CBS_WRITE >> CBS_TRACE_WRITE_START(); >> >> av_assert0(width > 0 && width <= 32); >> @@ -671,13 +720,20 @@ int ff_cbs_write_unsigned(CodedBitstreamContext *ctx, PutBitContext *pbc, >> CBS_TRACE_WRITE_END(); >> >> return 0; >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> int ff_cbs_write_simple_unsigned(CodedBitstreamContext *ctx, PutBitContext *pbc, >> int width, const char *name, uint32_t value) >> { >> +#if CBS_WRITE >> return ff_cbs_write_unsigned(ctx, pbc, width, name, NULL, >> value, 0, MAX_UINT_BITS(width)); >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> int ff_cbs_read_signed(CodedBitstreamContext *ctx, GetBitContext *gbc, >> @@ -685,6 +741,7 @@ int ff_cbs_read_signed(CodedBitstreamContext *ctx, GetBitContext *gbc, >> const int *subscripts, int32_t *write_to, >> int32_t range_min, int32_t range_max) >> { >> +#if CBS_READ >> int32_t value; >> >> CBS_TRACE_READ_START(); >> @@ -710,6 +767,9 @@ int ff_cbs_read_signed(CodedBitstreamContext *ctx, GetBitContext *gbc, >> >> *write_to = value; >> return 0; >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> int ff_cbs_write_signed(CodedBitstreamContext *ctx, PutBitContext *pbc, >> @@ -717,6 +777,7 @@ int ff_cbs_write_signed(CodedBitstreamContext *ctx, PutBitContext *pbc, >> const int *subscripts, int32_t value, >> int32_t range_min, int32_t range_max) >> { >> +#if CBS_WRITE >> CBS_TRACE_WRITE_START(); >> >> av_assert0(width > 0 && width <= 32); >> @@ -739,6 +800,9 @@ int ff_cbs_write_signed(CodedBitstreamContext *ctx, PutBitContext *pbc, >> CBS_TRACE_WRITE_END(); >> >> return 0; >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> >> diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c >> index d7862a2e48..e0a4eba20f 100644 >> --- a/libavcodec/cbs_av1.c >> +++ b/libavcodec/cbs_av1.c >> @@ -27,6 +27,7 @@ >> #include "libavutil/refstruct.h" >> >> >> +#if CBS_READ >> 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) >> @@ -84,7 +85,9 @@ static int cbs_av1_read_uvlc(CodedBitstreamContext *ctx, GetBitContext *gbc, >> *write_to = value; >> return 0; >> } >> +#endif >> >> +#if CBS_WRITE >> static int cbs_av1_write_uvlc(CodedBitstreamContext *ctx, PutBitContext *pbc, >> const char *name, uint32_t value, >> uint32_t range_min, uint32_t range_max) >> @@ -115,7 +118,9 @@ static int cbs_av1_write_uvlc(CodedBitstreamContext *ctx, PutBitContext *pbc, >> >> return 0; >> } >> +#endif >> >> +#if CBS_READ >> static int cbs_av1_read_leb128(CodedBitstreamContext *ctx, GetBitContext *gbc, >> const char *name, uint64_t *write_to) >> { >> @@ -146,7 +151,9 @@ static int cbs_av1_read_leb128(CodedBitstreamContext *ctx, GetBitContext *gbc, >> *write_to = value; >> return 0; >> } >> +#endif >> >> +#if CBS_WRITE >> static int cbs_av1_write_leb128(CodedBitstreamContext *ctx, PutBitContext *pbc, >> const char *name, uint64_t value, int fixed_length) >> { >> @@ -182,7 +189,9 @@ static int cbs_av1_write_leb128(CodedBitstreamContext *ctx, PutBitContext *pbc, >> >> return 0; >> } >> +#endif >> >> +#if CBS_READ >> static int cbs_av1_read_ns(CodedBitstreamContext *ctx, GetBitContext *gbc, >> uint32_t n, const char *name, >> const int *subscripts, uint32_t *write_to) >> @@ -220,7 +229,9 @@ static int cbs_av1_read_ns(CodedBitstreamContext *ctx, GetBitContext *gbc, >> *write_to = value; >> return 0; >> } >> +#endif >> >> +#if CBS_WRITE >> static int cbs_av1_write_ns(CodedBitstreamContext *ctx, PutBitContext *pbc, >> uint32_t n, const char *name, >> const int *subscripts, uint32_t value) >> @@ -256,7 +267,9 @@ static int cbs_av1_write_ns(CodedBitstreamContext *ctx, PutBitContext *pbc, >> >> return 0; >> } >> +#endif >> >> +#if CBS_READ >> 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) >> @@ -284,7 +297,9 @@ static int cbs_av1_read_increment(CodedBitstreamContext *ctx, GetBitContext *gbc >> *write_to = value; >> return 0; >> } >> +#endif >> >> +#if CBS_WRITE >> static int cbs_av1_write_increment(CodedBitstreamContext *ctx, PutBitContext *pbc, >> uint32_t range_min, uint32_t range_max, >> const char *name, uint32_t value) >> @@ -315,7 +330,9 @@ static int cbs_av1_write_increment(CodedBitstreamContext *ctx, PutBitContext *pb >> >> return 0; >> } >> +#endif >> >> +#if CBS_READ >> static int cbs_av1_read_subexp(CodedBitstreamContext *ctx, GetBitContext *gbc, >> uint32_t range_max, const char *name, >> const int *subscripts, uint32_t *write_to) >> @@ -360,7 +377,9 @@ static int cbs_av1_read_subexp(CodedBitstreamContext *ctx, GetBitContext *gbc, >> *write_to = value; >> return err; >> } >> +#endif >> >> +#if CBS_WRITE >> static int cbs_av1_write_subexp(CodedBitstreamContext *ctx, PutBitContext *pbc, >> uint32_t range_max, const char *name, >> const int *subscripts, uint32_t value) >> @@ -420,6 +439,7 @@ static int cbs_av1_write_subexp(CodedBitstreamContext *ctx, PutBitContext *pbc, >> >> return err; >> } >> +#endif >> >> >> static int cbs_av1_tile_log2(int blksize, int target) >> @@ -441,7 +461,7 @@ static int cbs_av1_get_relative_dist(const AV1RawSequenceHeader *seq, >> return diff; >> } >> >> -static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc) >> +static av_unused size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc) >> { >> GetBitContext tmp = *gbc; >> size_t size = 0; >> @@ -469,6 +489,7 @@ static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc) >> >> #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL) >> >> +#if CBS_READ >> #define fc(width, name, range_min, range_max) \ >> xf(width, name, current->name, range_min, range_max, 0, ) >> #define flag(name) fb(1, name) >> @@ -584,8 +605,9 @@ static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc) >> #undef leb128 >> #undef infer >> #undef byte_alignment >> +#endif // CBS_READ >> >> - >> +#if CBS_WRITE >> #define WRITE >> #define READWRITE write >> #define RWContext PutBitContext >> @@ -668,12 +690,13 @@ static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc) >> #undef leb128 >> #undef infer >> #undef byte_alignment >> - >> +#endif // CBS_WRITE >> >> static int cbs_av1_split_fragment(CodedBitstreamContext *ctx, >> CodedBitstreamFragment *frag, >> int header) >> { >> +#if CBS_READ >> GetBitContext gbc; >> uint8_t *data; >> size_t size; >> @@ -777,6 +800,9 @@ success: >> fail: >> ctx->trace_enable = trace; >> return err; >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> static int cbs_av1_ref_tile_data(CodedBitstreamContext *ctx, >> @@ -809,6 +835,7 @@ static int cbs_av1_ref_tile_data(CodedBitstreamContext *ctx, >> static int cbs_av1_read_unit(CodedBitstreamContext *ctx, >> CodedBitstreamUnit *unit) >> { >> +#if CBS_READ >> CodedBitstreamAV1Context *priv = ctx->priv_data; >> AV1RawOBU *obu; >> GetBitContext gbc; >> @@ -931,6 +958,7 @@ static int cbs_av1_read_unit(CodedBitstreamContext *ctx, >> return err; >> } >> break; >> +#if CBS_OBU_TILE_LIST >> case AV1_OBU_TILE_LIST: >> { >> err = cbs_av1_read_tile_list_obu(ctx, &gbc, >> @@ -946,6 +974,8 @@ static int cbs_av1_read_unit(CodedBitstreamContext *ctx, >> return err; >> } >> break; >> +#endif >> +#if CBS_OBU_METADATA >> case AV1_OBU_METADATA: >> { >> err = cbs_av1_read_metadata_obu(ctx, &gbc, &obu->obu.metadata); >> @@ -953,6 +983,8 @@ static int cbs_av1_read_unit(CodedBitstreamContext *ctx, >> return err; >> } >> break; >> +#endif >> +#if CBS_OBU_PADDING >> case AV1_OBU_PADDING: >> { >> err = cbs_av1_read_padding_obu(ctx, &gbc, &obu->obu.padding); >> @@ -960,6 +992,7 @@ static int cbs_av1_read_unit(CodedBitstreamContext *ctx, >> return err; >> } >> break; >> +#endif >> default: >> return AVERROR(ENOSYS); >> } >> @@ -982,12 +1015,16 @@ static int cbs_av1_read_unit(CodedBitstreamContext *ctx, >> } >> >> return 0; >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> static int cbs_av1_write_obu(CodedBitstreamContext *ctx, >> CodedBitstreamUnit *unit, >> PutBitContext *pbc) >> { >> +#if CBS_WRITE >> CodedBitstreamAV1Context *priv = ctx->priv_data; >> AV1RawOBU *obu = unit->content; >> PutBitContext pbc_tmp; >> @@ -1087,6 +1124,7 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, >> td = &tile_group->tile_data; >> } >> break; >> +#if CBS_OBU_TILE_LIST >> case AV1_OBU_TILE_LIST: >> { >> err = cbs_av1_write_tile_list_obu(ctx, pbc, &obu->obu.tile_list); >> @@ -1096,6 +1134,8 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, >> td = &obu->obu.tile_list.tile_data; >> } >> break; >> +#endif >> +#if CBS_OBU_METADATA >> case AV1_OBU_METADATA: >> { >> err = cbs_av1_write_metadata_obu(ctx, pbc, &obu->obu.metadata); >> @@ -1103,6 +1143,8 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, >> goto error; >> } >> break; >> +#endif >> +#if CBS_OBU_PADDING >> case AV1_OBU_PADDING: >> { >> err = cbs_av1_write_padding_obu(ctx, pbc, &obu->obu.padding); >> @@ -1110,6 +1152,7 @@ static int cbs_av1_write_obu(CodedBitstreamContext *ctx, >> goto error; >> } >> break; >> +#endif >> default: >> err = AVERROR(ENOSYS); >> goto error; >> @@ -1182,11 +1225,15 @@ error: >> av_buffer_unref(&av1ctx.frame_header_ref); >> >> return err; >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> static int cbs_av1_assemble_fragment(CodedBitstreamContext *ctx, >> CodedBitstreamFragment *frag) >> { >> +#if CBS_WRITE >> size_t size, pos; >> int i; >> >> @@ -1210,6 +1257,9 @@ static int cbs_av1_assemble_fragment(CodedBitstreamContext *ctx, >> frag->data_size = size; >> >> return 0; >> +#else >> + return AVERROR(ENOSYS); >> +#endif >> } >> >> static void cbs_av1_flush(CodedBitstreamContext *ctx) >> @@ -1234,6 +1284,7 @@ static void cbs_av1_close(CodedBitstreamContext *ctx) >> av_buffer_unref(&priv->frame_header_ref); >> } >> >> +#if CBS_OBU_METADATA >> static void cbs_av1_free_metadata(AVRefStructOpaque unused, void *content) >> { >> AV1RawOBU *obu = content; >> @@ -1255,6 +1306,7 @@ static void cbs_av1_free_metadata(AVRefStructOpaque unused, void *content) >> av_buffer_unref(&md->metadata.unknown.payload_ref); >> } >> } >> +#endif >> >> static const CodedBitstreamUnitTypeDescriptor cbs_av1_unit_types[] = { >> CBS_UNIT_TYPE_POD(AV1_OBU_SEQUENCE_HEADER, AV1RawOBU), >> @@ -1284,13 +1336,19 @@ static const CodedBitstreamUnitTypeDescriptor cbs_av1_unit_types[] = { >> offsetof(AV1RawOBU, obu.frame.tile_group.tile_data.data) } >> }, >> }, >> +#if CBS_OBU_TILE_LIST >> CBS_UNIT_TYPE_INTERNAL_REF(AV1_OBU_TILE_LIST, AV1RawOBU, >> obu.tile_list.tile_data.data), >> +#endif >> +#if CBS_OBU_PADDING >> CBS_UNIT_TYPE_INTERNAL_REF(AV1_OBU_PADDING, AV1RawOBU, >> obu.padding.payload), >> +#endif >> >> +#if CBS_OBU_METADATA >> CBS_UNIT_TYPE_COMPLEX(AV1_OBU_METADATA, AV1RawOBU, >> &cbs_av1_free_metadata), >> +#endif >> >> CBS_UNIT_TYPE_END_OF_LIST >> }; >> diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h >> index 62c7720142..0c73e12c84 100644 >> --- a/libavcodec/cbs_av1.h >> +++ b/libavcodec/cbs_av1.h >> @@ -25,6 +25,15 @@ >> #include "av1.h" >> #include "cbs.h" >> >> +#ifndef CBS_OBU_METADATA >> +#define CBS_OBU_METADATA 1 >> +#endif >> +#ifndef CBS_OBU_TILE_LIST >> +#define CBS_OBU_TILE_LIST 1 >> +#endif >> +#ifndef CBS_OBU_PADDING >> +#define CBS_OBU_PADDING 1 >> +#endif >> >> typedef struct AV1RawOBUHeader { >> uint8_t obu_forbidden_bit; >> @@ -411,9 +420,15 @@ typedef struct AV1RawOBU { >> AV1RawFrameHeader frame_header; >> AV1RawFrame frame; >> AV1RawTileGroup tile_group; >> +#if CBS_OBU_TILE_LIST >> AV1RawTileList tile_list; >> +#endif >> +#if CBS_OBU_METADATA >> AV1RawMetadata metadata; >> +#endif >> +#if CBS_OBU_PADDING >> AV1RawPadding padding; >> +#endif >> } obu; >> } AV1RawOBU; >> >> diff --git a/libavcodec/cbs_av1_syntax_template.c b/libavcodec/cbs_av1_syntax_template.c >> index 62a83945ec..b594bfd22b 100644 >> --- a/libavcodec/cbs_av1_syntax_template.c >> +++ b/libavcodec/cbs_av1_syntax_template.c >> @@ -1868,6 +1868,7 @@ static int FUNC(frame_obu)(CodedBitstreamContext *ctx, RWContext *rw, >> return 0; >> } >> >> +#if CBS_OBU_TILE_LIST >> static int FUNC(tile_list_obu)(CodedBitstreamContext *ctx, RWContext *rw, >> AV1RawTileList *current) >> { >> @@ -1882,7 +1883,9 @@ static int FUNC(tile_list_obu)(CodedBitstreamContext *ctx, RWContext *rw, >> >> return 0; >> } >> +#endif >> >> +#if CBS_OBU_METADATA >> static int FUNC(metadata_hdr_cll)(CodedBitstreamContext *ctx, RWContext *rw, >> AV1RawMetadataHDRCLL *current) >> { >> @@ -2101,7 +2104,9 @@ static int FUNC(metadata_obu)(CodedBitstreamContext *ctx, RWContext *rw, >> >> return 0; >> } >> +#endif >> >> +#if CBS_OBU_PADDING >> static int FUNC(padding_obu)(CodedBitstreamContext *ctx, RWContext *rw, >> AV1RawPadding *current) >> { >> @@ -2125,3 +2130,4 @@ static int FUNC(padding_obu)(CodedBitstreamContext *ctx, RWContext *rw, >> >> return 0; >> } >> +#endif >> diff --git a/libavcodec/cbs_internal.h b/libavcodec/cbs_internal.h >> index 80cad2b162..f15ba1ab90 100644 >> --- a/libavcodec/cbs_internal.h >> +++ b/libavcodec/cbs_internal.h >> @@ -22,6 +22,8 @@ >> #include <stddef.h> >> #include <stdint.h> >> >> +#include "config.h" >> + >> #include "libavutil/log.h" >> >> #include "cbs.h" >> @@ -30,6 +32,40 @@ >> #include "put_bits.h" >> #include "libavutil/refstruct.h" >> >> +#ifndef CBS_READ >> +#define CBS_READ 1 >> +#endif >> +#ifndef CBS_WRITE >> +#define CBS_WRITE 1 >> +#endif >> +#ifndef CBS_TRACE >> +#define CBS_TRACE 1 >> +#endif >> + >> +#ifndef CBS_AV1 >> +#define CBS_AV1 CONFIG_CBS_AV1 >> +#endif >> +#ifndef CBS_H264 >> +#define CBS_H264 CONFIG_CBS_H264 >> +#endif >> +#ifndef CBS_H265 >> +#define CBS_H265 CONFIG_CBS_H265 >> +#endif >> +#ifndef CBS_H266 >> +#define CBS_H266 CONFIG_CBS_H266 >> +#endif >> +#ifndef CBS_JPEG >> +#define CBS_JPEG CONFIG_CBS_JPEG >> +#endif >> +#ifndef CBS_MPEG2 >> +#define CBS_MPEG2 CONFIG_CBS_MPEG2 >> +#endif >> +#ifndef CBS_VP8 >> +#define CBS_VP8 CONFIG_CBS_VP8 >> +#endif >> +#ifndef CBS_VP9 >> +#define CBS_VP9 CONFIG_CBS_VP9 >> +#endif >> >> enum CBSContentType { >> // Unit content may contain some references to other structures, but all >> @@ -204,6 +240,7 @@ int ff_cbs_write_signed(CodedBitstreamContext *ctx, PutBitContext *pbc, >> #define MIN_INT_BITS(length) (-(INT64_C(1) << ((length) - 1))) >> >> >> +#if CBS_TRACE >> // Start of a syntax element during read tracing. >> #define CBS_TRACE_READ_START() \ >> GetBitContext trace_start; \ >> @@ -284,6 +321,17 @@ int ff_cbs_write_signed(CodedBitstreamContext *ctx, PutBitContext *pbc, >> } \ >> } while (0) >> >> +#else // CBS_TRACE >> +#define CBS_TRACE_READ_START() do { } while (0) >> +#define CBS_TRACE_READ_END() do { } while (0) >> +#define CBS_TRACE_READ_END_NO_SUBSCRIPTS() do { } while (0) >> +#define CBS_TRACE_READ_END_VALUE_ONLY() do { } while (0) >> +#define CBS_TRACE_WRITE_START() do { } while (0) >> +#define CBS_TRACE_WRITE_END() do { } while (0) >> +#define CBS_TRACE_WRITE_END_NO_SUBSCRIPTS() do { } while (0) >> +#define CBS_TRACE_WRITE_END_VALUE_ONLY() do { } while (0) >> +#endif // CBS_TRACE >> + >> #define TYPE_LIST(...) { __VA_ARGS__ } >> #define CBS_UNIT_TYPE_POD(type_, structure) { \ >> .nb_unit_types = 1, \ > > This patch (or rather the next) breaks the fundamental rule of > duplicating object files: The object files really need to be interchangable. > (Rationale: It is possible to --enable-static and --enable-shared at the > same time and users are allowed to link a subset of libraries statically > and another subset in a dynamic manner. In such a scenario the archives > need to contain everything as if used for a dynamic build (because lavc > may be linked dynamically, so that its internal symbols aren't > available), but if linking is performed statically, then the duplicated > object files (here: lavf/cbs.o) are used everywhere. And this will cause > mayhem because your lavf versions are only stripped down.) Ok, will add a namespace macro then.