avformat/aviobuf: Add ffio_init_(read|write)_context()

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>
This commit is contained in:
Andreas Rheinhardt 2023-09-02 15:41:20 +02:00
parent 5869407da2
commit 7001ff74ba
22 changed files with 59 additions and 50 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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);

View File

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

View File

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

View File

@ -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,

View File

@ -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);
}

View File

@ -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
}

View File

@ -2599,9 +2599,8 @@ static int mka_parse_audio_codec(MatroskaTrack *track, AVCodecParameters *par,
if (!strcmp(track->codec_id, "A_MS/ACM") &&
track->codec_priv.size >= 14) {
FFIOContext b;
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, par,
track->codec_priv.size, 0);
if (ret < 0)
@ -2887,9 +2886,8 @@ static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par,
if (track->codec_priv.size >= 86) {
FFIOContext b;
unsigned 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;
@ -4057,7 +4055,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;

View File

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

View File

@ -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;

View File

@ -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) {

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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 */

View File

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

View File

@ -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);
}

View File

@ -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

View File

@ -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'