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 <jamr...@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.) - Andreas _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".