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 <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.)

Ok, will add a namespace macro then.

Attachment: OpenPGP_signature.asc
Description: OpenPGP digital signature

_______________________________________________
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".

Reply via email to