diff mbox series

[FFmpeg-devel,4/7] avformat/aviobuf: Add ffio_init_(read|write)_context()

Message ID AS8P250MB0744B1FD1243225E08BC5CE68FEBA@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM
State Accepted
Headers show
Series [FFmpeg-devel] avformat/avformat: Avoid including codec.h, frame.h | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Andreas Rheinhardt Sept. 2, 2023, 4:21 p.m. UTC
Most users of ffio_init_context() simply want to wrap
a buffer into an AVIOContext; they do not provide
function pointers at all.

Therefore this commit adds shortcuts for these two common
operations. This also allows to accept const data when reading
(i.e. the const is now cast away at a central place in
ffio_init_read_context() instead of at several callers).
This also allows to constify the data in ff_text_init_buf().

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavformat/aacdec.c        |  2 +-
 libavformat/asfenc.c        |  6 ++----
 libavformat/av1.c           |  2 +-
 libavformat/av1dec.c        |  3 +--
 libavformat/avio_internal.h |  9 +++++++++
 libavformat/aviobuf.c       | 10 ++++++++++
 libavformat/hls.c           |  2 +-
 libavformat/id3v2.c         |  5 ++---
 libavformat/matroskadec.c   | 12 +++++-------
 libavformat/mmst.c          |  4 ++--
 libavformat/mov.c           |  2 +-
 libavformat/mpegts.c        | 18 +++++++-----------
 libavformat/mpjpegdec.c     |  2 +-
 libavformat/oggenc.c        |  2 +-
 libavformat/rdt.c           |  5 ++---
 libavformat/rtpdec_asf.c    |  2 +-
 libavformat/rtpdec_qt.c     |  2 +-
 libavformat/rtsp.c          |  2 +-
 libavformat/sapdec.c        |  3 +--
 libavformat/subtitles.c     |  4 ++--
 libavformat/subtitles.h     |  2 +-
 libavformat/vividas.c       | 10 ++++++----
 22 files changed, 59 insertions(+), 50 deletions(-)
diff mbox series

Patch

diff --git a/libavformat/aacdec.c b/libavformat/aacdec.c
index a476640904..41c9a36239 100644
--- a/libavformat/aacdec.c
+++ b/libavformat/aacdec.c
@@ -146,7 +146,7 @@  static int handle_id3(AVFormatContext *s, AVPacket *pkt)
         return ret;
     }
 
-    ffio_init_context(&pb, pkt->data, pkt->size, 0, NULL, NULL, NULL, NULL);
+    ffio_init_read_context(&pb, pkt->data, pkt->size);
     ff_id3v2_read_dict(&pb.pub, &metadata, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
     if ((ret = ff_id3v2_parse_priv_dict(&metadata, id3v2_extra_meta)) < 0)
         goto error;
diff --git a/libavformat/asfenc.c b/libavformat/asfenc.c
index 244c7e7a27..2f2d9b1bab 100644
--- a/libavformat/asfenc.c
+++ b/libavformat/asfenc.c
@@ -773,8 +773,7 @@  static int asf_write_header(AVFormatContext *s)
     asf->packet_nb_payloads     = 0;
     asf->packet_timestamp_start = -1;
     asf->packet_timestamp_end   = -1;
-    ffio_init_context(&asf->pb, asf->packet_buf, s->packet_size, 1,
-                      NULL, NULL, NULL, NULL);
+    ffio_init_write_context(&asf->pb, asf->packet_buf, s->packet_size);
 
     if (s->avoid_negative_ts < 0)
         s->avoid_negative_ts = 1;
@@ -866,8 +865,7 @@  static void flush_packet(AVFormatContext *s)
     asf->packet_nb_payloads     = 0;
     asf->packet_timestamp_start = -1;
     asf->packet_timestamp_end   = -1;
-    ffio_init_context(&asf->pb, asf->packet_buf, s->packet_size, 1,
-                      NULL, NULL, NULL, NULL);
+    ffio_init_write_context(&asf->pb, asf->packet_buf, s->packet_size);
 }
 
 static void put_payload_header(AVFormatContext *s, ASFStream *stream,
diff --git a/libavformat/av1.c b/libavformat/av1.c
index 4455ec0504..cb86e66d09 100644
--- a/libavformat/av1.c
+++ b/libavformat/av1.c
@@ -107,7 +107,7 @@  int ff_av1_filter_obus_buf(const uint8_t *in, uint8_t **out,
     if (!buf)
         return AVERROR(ENOMEM);
 
-    ffio_init_context(&pb, buf, len, 1, NULL, NULL, NULL, NULL);
+    ffio_init_write_context(&pb, buf, len);
 
     ret = av1_filter_obus(&pb.pub, in, *size, NULL);
     av_assert1(ret == len);
diff --git a/libavformat/av1dec.c b/libavformat/av1dec.c
index 2883b320a1..8a06445958 100644
--- a/libavformat/av1dec.c
+++ b/libavformat/av1dec.c
@@ -167,8 +167,7 @@  static int annexb_probe(const AVProbeData *p)
     int seq = 0;
     int ret, type, cnt = 0;
 
-    ffio_init_context(&ctx, p->buf, p->buf_size, 0,
-                      NULL, NULL, NULL, NULL);
+    ffio_init_read_context(&ctx, p->buf, p->buf_size);
 
     ret = leb(pb, &temporal_unit_size, 1);
     if (ret < 0)
diff --git a/libavformat/avio_internal.h b/libavformat/avio_internal.h
index 1f5e3d474b..57796ade03 100644
--- a/libavformat/avio_internal.h
+++ b/libavformat/avio_internal.h
@@ -93,6 +93,15 @@  void ffio_init_context(FFIOContext *s,
                   int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
                   int64_t (*seek)(void *opaque, int64_t offset, int whence));
 
+/**
+ * Wrap a buffer in an AVIOContext for reading.
+ */
+void ffio_init_read_context(FFIOContext *s, const uint8_t *buffer, int buffer_size);
+
+/**
+ * Wrap a buffer in an AVIOContext for writing.
+ */
+void ffio_init_write_context(FFIOContext *s, uint8_t *buffer, int buffer_size);
 
 /**
  * Read size bytes from AVIOContext, returning a pointer.
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 4ad734a3c3..029a9e966b 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -127,6 +127,16 @@  void ffio_init_context(FFIOContext *ctx,
     ctx->short_seek_get      = NULL;
 }
 
+void ffio_init_read_context(FFIOContext *s, const uint8_t *buffer, int buffer_size)
+{
+    ffio_init_context(s, (unsigned char*)buffer, buffer_size, 0, NULL, NULL, NULL, NULL);
+}
+
+void ffio_init_write_context(FFIOContext *s, uint8_t *buffer, int buffer_size)
+{
+    ffio_init_context(s, buffer, buffer_size, 1, NULL, NULL, NULL, NULL);
+}
+
 AVIOContext *avio_alloc_context(
                   unsigned char *buffer,
                   int buffer_size,
diff --git a/libavformat/hls.c b/libavformat/hls.c
index c625e30291..276e4ee333 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -1265,7 +1265,7 @@  static void intercept_id3(struct playlist *pls, uint8_t *buf,
     if (pls->id3_buf) {
         /* Now parse all the ID3 tags */
         FFIOContext id3ioctx;
-        ffio_init_context(&id3ioctx, pls->id3_buf, id3_buf_pos, 0, NULL, NULL, NULL, NULL);
+        ffio_init_read_context(&id3ioctx, pls->id3_buf, id3_buf_pos);
         handle_id3(&id3ioctx.pub, pls);
     }
 
diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c
index 69193933e0..d83716dcf4 100644
--- a/libavformat/id3v2.c
+++ b/libavformat/id3v2.c
@@ -1001,8 +1001,7 @@  static void id3v2_parse(AVIOContext *pb, AVDictionary **metadata,
                         t++;
                 }
 
-                ffio_init_context(&pb_local, buffer, b - buffer, 0, NULL, NULL, NULL,
-                                  NULL);
+                ffio_init_read_context(&pb_local, buffer, b - buffer);
                 tlen = b - buffer;
                 pbx  = &pb_local.pub; // read from sync buffer
             }
@@ -1038,7 +1037,7 @@  static void id3v2_parse(AVIOContext *pb, AVDictionary **metadata,
                         av_log(s, AV_LOG_ERROR, "Failed to uncompress tag: %d\n", err);
                         goto seek;
                     }
-                    ffio_init_context(&pb_local, uncompressed_buffer, dlen, 0, NULL, NULL, NULL, NULL);
+                    ffio_init_read_context(&pb_local, uncompressed_buffer, dlen);
                     tlen = dlen;
                     pbx = &pb_local.pub; // read from sync buffer
                 }
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index b5333c4692..b8506925af 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2676,9 +2676,8 @@  static int matroska_parse_tracks(AVFormatContext *s)
                    track->codec_priv.size >= 14         &&
                    track->codec_priv.data) {
             int ret;
-            ffio_init_context(&b, track->codec_priv.data,
-                              track->codec_priv.size,
-                              0, NULL, NULL, NULL, NULL);
+            ffio_init_read_context(&b, track->codec_priv.data,
+                                   track->codec_priv.size);
             ret = ff_get_wav_header(s, &b.pub, st->codecpar,
                                     track->codec_priv.size, 0);
             if (ret < 0)
@@ -2723,9 +2722,8 @@  static int matroska_parse_tracks(AVFormatContext *s)
                        "mov FourCC not found %s.\n", av_fourcc2str(fourcc));
             if (track->codec_priv.size >= 86) {
                 bit_depth = AV_RB16(track->codec_priv.data + 82);
-                ffio_init_context(&b, track->codec_priv.data,
-                                  track->codec_priv.size,
-                                  0, NULL, NULL, NULL, NULL);
+                ffio_init_read_context(&b, track->codec_priv.data,
+                                       track->codec_priv.size);
                 if (ff_get_qtpalette(codec_id, &b.pub, track->palette)) {
                     bit_depth &= 0x1F;
                     track->has_palette = 1;
@@ -3915,7 +3913,7 @@  static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf
 
     av_assert1(buf);
 
-    ffio_init_context(&pb, data, size, 0, NULL, NULL, NULL, NULL);
+    ffio_init_read_context(&pb, data, size);
 
     if ((n = ebml_read_num(matroska, &pb.pub, 8, &num, 1)) < 0)
         return n;
diff --git a/libavformat/mmst.c b/libavformat/mmst.c
index 20b04b12aa..d7f71304e5 100644
--- a/libavformat/mmst.c
+++ b/libavformat/mmst.c
@@ -157,8 +157,8 @@  static int mms_put_utf16(MMSContext *mms, const uint8_t *src)
     FFIOContext bic;
     int size = mms->write_out_ptr - mms->out_buffer;
     int len;
-    ffio_init_context(&bic, mms->write_out_ptr,
-            sizeof(mms->out_buffer) - size, 1, NULL, NULL, NULL, NULL);
+    ffio_init_write_context(&bic, mms->write_out_ptr,
+                            sizeof(mms->out_buffer) - size);
 
     len = avio_put_str16le(&bic.pub, src);
     if (len < 0)
diff --git a/libavformat/mov.c b/libavformat/mov.c
index be9975f297..aa1d9e4ccc 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -5727,7 +5727,7 @@  static int mov_read_cmov(MOVContext *c, AVIOContext *pb, MOVAtom atom)
     ret = AVERROR_INVALIDDATA;
     if (uncompress (moov_data, (uLongf *) &moov_len, (const Bytef *)cmov_data, cmov_len) != Z_OK)
         goto free_and_return;
-    ffio_init_context(&ctx, moov_data, moov_len, 0, NULL, NULL, NULL, NULL);
+    ffio_init_read_context(&ctx, moov_data, moov_len);
     ctx.pub.seekable = AVIO_SEEKABLE_NORMAL;
     atom.type = MKTAG('m','o','o','v');
     atom.size = moov_len;
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 8fd1524a8a..d825bf0b5d 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -1471,8 +1471,7 @@  static int init_MP4DescrParseContext(MP4DescrParseContext *d, AVFormatContext *s
     if (size > (1 << 30))
         return AVERROR_INVALIDDATA;
 
-    ffio_init_context(&d->pb, (unsigned char *)buf, size,
-                      0, NULL, NULL, NULL, NULL);
+    ffio_init_read_context(&d->pb, buf, size);
 
     d->s               = s;
     d->level           = 0;
@@ -1743,9 +1742,8 @@  static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section,
 
             pes->sl = mp4_descr[i].sl;
 
-            ffio_init_context(&pb, mp4_descr[i].dec_config_descr,
-                              mp4_descr[i].dec_config_descr_len, 0,
-                              NULL, NULL, NULL, NULL);
+            ffio_init_read_context(&pb, mp4_descr[i].dec_config_descr,
+                                   mp4_descr[i].dec_config_descr_len);
             ff_mp4_read_dec_config_descr(s, st, &pb.pub);
             if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
                 st->codecpar->extradata_size > 0)
@@ -1853,9 +1851,8 @@  int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
             if (mp4_descr[i].dec_config_descr_len &&
                 mp4_descr[i].es_id == desc_es_id) {
                 FFIOContext pb;
-                ffio_init_context(&pb, mp4_descr[i].dec_config_descr,
-                                  mp4_descr[i].dec_config_descr_len, 0,
-                                  NULL, NULL, NULL, NULL);
+                ffio_init_read_context(&pb, mp4_descr[i].dec_config_descr,
+                                       mp4_descr[i].dec_config_descr_len);
                 ff_mp4_read_dec_config_descr(fc, st, &pb.pub);
                 if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
                     st->codecpar->extradata_size > 0) {
@@ -1875,9 +1872,8 @@  int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
              sti->request_probe > 0) &&
             mp4_descr->dec_config_descr_len && mp4_descr->es_id == pid) {
             FFIOContext pb;
-            ffio_init_context(&pb, mp4_descr->dec_config_descr,
-                              mp4_descr->dec_config_descr_len, 0,
-                              NULL, NULL, NULL, NULL);
+            ffio_init_read_context(&pb, mp4_descr->dec_config_descr,
+                                   mp4_descr->dec_config_descr_len);
             ff_mp4_read_dec_config_descr(fc, st, &pb.pub);
             if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
                 st->codecpar->extradata_size > 0) {
diff --git a/libavformat/mpjpegdec.c b/libavformat/mpjpegdec.c
index 559a375d8d..f1d2d34689 100644
--- a/libavformat/mpjpegdec.c
+++ b/libavformat/mpjpegdec.c
@@ -120,7 +120,7 @@  static int mpjpeg_read_probe(const AVProbeData *p)
     if (p->buf_size < 2 || p->buf[0] != '-' || p->buf[1] != '-')
         return 0;
 
-    ffio_init_context(&pb, p->buf, p->buf_size, 0, NULL, NULL, NULL, NULL);
+    ffio_init_read_context(&pb, p->buf, p->buf_size);
 
     ret = (parse_multipart_header(&pb.pub, &size, "--", NULL) >= 0) ? AVPROBE_SCORE_MAX : 0;
 
diff --git a/libavformat/oggenc.c b/libavformat/oggenc.c
index 2e582d0754..c669aea25a 100644
--- a/libavformat/oggenc.c
+++ b/libavformat/oggenc.c
@@ -292,7 +292,7 @@  static uint8_t *ogg_write_vorbiscomment(int64_t offset, int bitexact,
     if (!p)
         return NULL;
 
-    ffio_init_context(&pb, p + offset, size - offset, 1, NULL, NULL, NULL, NULL);
+    ffio_init_write_context(&pb, p + offset, size - offset);
     ff_vorbiscomment_write(&pb.pub, *m, vendor, chapters, nb_chapters);
     if (framing_bit)
         avio_w8(&pb.pub, 1);
diff --git a/libavformat/rdt.c b/libavformat/rdt.c
index 2fa3c2d266..b9b02a371f 100644
--- a/libavformat/rdt.c
+++ b/libavformat/rdt.c
@@ -152,8 +152,7 @@  rdt_load_mdpr (PayloadContext *rdt, AVStream *st, int rule_nr)
      */
     if (!rdt->mlti_data)
         return -1;
-    ffio_init_context(&pb0, rdt->mlti_data, rdt->mlti_data_size, 0,
-                  NULL, NULL, NULL, NULL);
+    ffio_init_read_context(&pb0, rdt->mlti_data, rdt->mlti_data_size);
     tag = avio_rl32(pb);
     if (tag == MKTAG('M', 'L', 'T', 'I')) {
         int num, chunk_nr;
@@ -302,7 +301,7 @@  rdt_parse_packet (AVFormatContext *ctx, PayloadContext *rdt, AVStream *st,
         FFIOContext pb;
         int pos, rmflags;
 
-        ffio_init_context(&pb, (uint8_t *)buf, len, 0, NULL, NULL, NULL, NULL);
+        ffio_init_read_context(&pb, buf, len);
         rmflags = (flags & RTP_FLAG_KEY) ? 2 : 0;
         res = ff_rm_parse_packet(rdt->rmctx, &pb.pub, st, rdt->rmst[st->index],
                                  len, pkt, &seq, rmflags, *timestamp);
diff --git a/libavformat/rtpdec_asf.c b/libavformat/rtpdec_asf.c
index 72ead6975a..20ca8295f9 100644
--- a/libavformat/rtpdec_asf.c
+++ b/libavformat/rtpdec_asf.c
@@ -210,7 +210,7 @@  static int asfrtp_parse_packet(AVFormatContext *s, PayloadContext *asf,
 
         av_freep(&asf->buf);
 
-        ffio_init_context(pb0, (uint8_t *)buf, len, 0, NULL, NULL, NULL, NULL);
+        ffio_init_read_context(pb0, buf, len);
 
         while (avio_tell(pb) + 4 < len) {
             int start_off = avio_tell(pb);
diff --git a/libavformat/rtpdec_qt.c b/libavformat/rtpdec_qt.c
index 495a3ec14e..b71055f8b8 100644
--- a/libavformat/rtpdec_qt.c
+++ b/libavformat/rtpdec_qt.c
@@ -85,7 +85,7 @@  static int qt_rtp_parse_packet(AVFormatContext *s, PayloadContext *qt,
     ret = init_get_bits(&gb, buf, len << 3);
     if (ret < 0)
         return ret;
-    ffio_init_context(&pb0, (uint8_t*)buf, len, 0, NULL, NULL, NULL, NULL);
+    ffio_init_read_context(&pb0, buf, len);
 
     if (len < 4)
         return AVERROR_INVALIDDATA;
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index cfafb4be80..c4f78f97b0 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -2610,7 +2610,7 @@  static int rtp_read_header(AVFormatContext *s)
         goto fail_nobuf;
     avcodec_parameters_free(&par);
 
-    ffio_init_context(&pb, sdp.str, sdp.len, 0, NULL, NULL, NULL, NULL);
+    ffio_init_read_context(&pb, sdp.str, sdp.len);
     s->pb = &pb.pub;
 
     /* if sdp_read_header() fails then following ff_network_close() cancels out */
diff --git a/libavformat/sapdec.c b/libavformat/sapdec.c
index fd0e662433..59141448f4 100644
--- a/libavformat/sapdec.c
+++ b/libavformat/sapdec.c
@@ -148,8 +148,7 @@  static int sap_read_header(AVFormatContext *s)
     }
 
     av_log(s, AV_LOG_VERBOSE, "SDP:\n%s\n", sap->sdp);
-    ffio_init_context(&sap->sdp_pb, sap->sdp, strlen(sap->sdp), 0, NULL, NULL,
-                  NULL, NULL);
+    ffio_init_read_context(&sap->sdp_pb, sap->sdp, strlen(sap->sdp));
 
     infmt = av_find_input_format("sdp");
     if (!infmt)
diff --git a/libavformat/subtitles.c b/libavformat/subtitles.c
index 6c221e4b29..3413763c7b 100644
--- a/libavformat/subtitles.c
+++ b/libavformat/subtitles.c
@@ -49,9 +49,9 @@  void ff_text_init_avio(void *s, FFTextReader *r, AVIOContext *pb)
                "UTF16 is automatically converted to UTF8, do not specify a character encoding\n");
 }
 
-void ff_text_init_buf(FFTextReader *r, void *buf, size_t size)
+void ff_text_init_buf(FFTextReader *r, const void *buf, size_t size)
 {
-    ffio_init_context(&r->buf_pb, buf, size, 0, NULL, NULL, NULL, NULL);
+    ffio_init_read_context(&r->buf_pb, buf, size);
     ff_text_init_avio(NULL, r, &r->buf_pb.pub);
 }
 
diff --git a/libavformat/subtitles.h b/libavformat/subtitles.h
index f6688b71d7..f4993fe20d 100644
--- a/libavformat/subtitles.h
+++ b/libavformat/subtitles.h
@@ -68,7 +68,7 @@  void ff_text_init_avio(void *s, FFTextReader *r, AVIOContext *pb);
  * @param buf buffer to read from (referenced as long as FFTextReader is in use)
  * @param size size of buf
  */
-void ff_text_init_buf(FFTextReader *r, void *buf, size_t size);
+void ff_text_init_buf(FFTextReader *r, const void *buf, size_t size);
 
 /**
  * Return the byte position of the next byte returned by ff_text_r8(). For
diff --git a/libavformat/vividas.c b/libavformat/vividas.c
index ed4e573df8..2f47d65c7c 100644
--- a/libavformat/vividas.c
+++ b/libavformat/vividas.c
@@ -277,7 +277,8 @@  static uint8_t *read_sb_block(AVIOContext *src, unsigned *size,
     return buf;
 }
 
-static int track_header(VividasDemuxContext *viv, AVFormatContext *s,  uint8_t *buf, int size)
+static int track_header(VividasDemuxContext *viv, AVFormatContext *s,
+                        const uint8_t *buf, int size)
 {
     int i, j, ret;
     int64_t off;
@@ -286,7 +287,7 @@  static int track_header(VividasDemuxContext *viv, AVFormatContext *s,  uint8_t *
     FFIOContext pb0;
     AVIOContext *const pb = &pb0.pub;
 
-    ffio_init_context(&pb0, buf, size, 0, NULL, NULL, NULL, NULL);
+    ffio_init_read_context(&pb0, buf, size);
 
     ffio_read_varlen(pb); // track_header_len
     avio_r8(pb); // '1'
@@ -432,7 +433,8 @@  static int track_header(VividasDemuxContext *viv, AVFormatContext *s,  uint8_t *
     return 0;
 }
 
-static int track_index(VividasDemuxContext *viv, AVFormatContext *s, uint8_t *buf, unsigned size)
+static int track_index(VividasDemuxContext *viv, AVFormatContext *s,
+                       const uint8_t *buf, unsigned size)
 {
     int64_t off;
     int64_t poff;
@@ -443,7 +445,7 @@  static int track_index(VividasDemuxContext *viv, AVFormatContext *s, uint8_t *bu
     int64_t filesize = avio_size(s->pb);
     uint64_t n_sb_blocks_tmp;
 
-    ffio_init_context(&pb0, buf, size, 0, NULL, NULL, NULL, NULL);
+    ffio_init_read_context(&pb0, buf, size);
 
     ffio_read_varlen(pb); // track_index_len
     avio_r8(pb); // 'c'