summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2021-08-04 16:52:07 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2021-08-25 23:01:54 +0200
commit45bfe8b838275235412777dd430206d9a24eb3ee (patch)
treed35a1ee7436b0259fd26d32bc80482c0a9f2927e
parent530ac6aa305aeda631c77f8a17e96c14c7ab1a1c (diff)
avformat/avio: Move internal AVIOContext fields to avio_internal.h
Currently AVIOContext's private fields are all over AVIOContext. This commit moves them into a new structure in avio_internal.h instead. Said structure contains the public AVIOContext as its first element in order to avoid having to allocate a separate AVIOContextInternal which is costly for those use cases where one just wants to access an already existing buffer via the AVIOContext-API. For these cases ffio_init_context() can't fail and always returned zero, which was typically not checked. Therefore it has been made to not return anything. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
-rw-r--r--libavformat/aacdec.c6
-rw-r--r--libavformat/asfenc.c8
-rw-r--r--libavformat/av1.c4
-rw-r--r--libavformat/av1dec.c21
-rw-r--r--libavformat/avio.h64
-rw-r--r--libavformat/avio_internal.h49
-rw-r--r--libavformat/aviobuf.c105
-rw-r--r--libavformat/dashdec.c14
-rw-r--r--libavformat/hls.c23
-rw-r--r--libavformat/id3v2.c6
-rw-r--r--libavformat/matroskadec.c13
-rw-r--r--libavformat/matroskaenc.c5
-rw-r--r--libavformat/mmst.c4
-rw-r--r--libavformat/mov.c9
-rw-r--r--libavformat/mp3dec.c2
-rw-r--r--libavformat/mpegts.c76
-rw-r--r--libavformat/mpjpegdec.c4
-rw-r--r--libavformat/oggenc.c6
-rw-r--r--libavformat/rdt.c33
-rw-r--r--libavformat/rtpdec_asf.c26
-rw-r--r--libavformat/rtpdec_qt.c35
-rw-r--r--libavformat/rtsp.c4
-rw-r--r--libavformat/sapdec.c4
-rw-r--r--libavformat/subtitles.c3
-rw-r--r--libavformat/subtitles.h3
-rw-r--r--libavformat/thp.c9
-rw-r--r--libavformat/utils.c20
-rw-r--r--libavformat/vividas.c10
28 files changed, 295 insertions, 271 deletions
diff --git a/libavformat/aacdec.c b/libavformat/aacdec.c
index 94e39f592f..1f68f17bc9 100644
--- a/libavformat/aacdec.c
+++ b/libavformat/aacdec.c
@@ -135,7 +135,7 @@ static int adts_aac_read_header(AVFormatContext *s)
static int handle_id3(AVFormatContext *s, AVPacket *pkt)
{
AVDictionary *metadata = NULL;
- AVIOContext ioctx;
+ FFIOContext pb;
ID3v2ExtraMeta *id3v2_extra_meta;
int ret;
@@ -144,8 +144,8 @@ static int handle_id3(AVFormatContext *s, AVPacket *pkt)
return ret;
}
- ffio_init_context(&ioctx, pkt->data, pkt->size, 0, NULL, NULL, NULL, NULL);
- ff_id3v2_read_dict(&ioctx, &metadata, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
+ ffio_init_context(&pb, pkt->data, pkt->size, 0, NULL, NULL, NULL, NULL);
+ 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 a8a844ce6e..b294431aec 100644
--- a/libavformat/asfenc.c
+++ b/libavformat/asfenc.c
@@ -236,7 +236,7 @@ typedef struct ASFContext {
int64_t packet_timestamp_end;
unsigned int packet_nb_payloads;
uint8_t packet_buf[PACKET_SIZE_MAX];
- AVIOContext pb;
+ FFIOContext pb;
/* only for reading */
uint64_t data_offset; ///< beginning of the first data packet
@@ -911,7 +911,7 @@ static void put_payload_header(AVFormatContext *s, ASFStream *stream,
int m_obj_offset, int payload_len, int flags)
{
ASFContext *asf = s->priv_data;
- AVIOContext *pb = &asf->pb;
+ AVIOContext *const pb = &asf->pb.pub;
int val;
val = stream->num;
@@ -983,7 +983,7 @@ static void put_frame(AVFormatContext *s, ASFStream *stream, AVStream *avst,
put_payload_header(s, stream, timestamp + PREROLL_TIME,
m_obj_size, m_obj_offset, payload_len, flags);
- avio_write(&asf->pb, buf, payload_len);
+ avio_write(&asf->pb.pub, buf, payload_len);
if (asf->multi_payloads_present)
asf->packet_size_left -= (payload_len + PAYLOAD_HEADER_SIZE_MULTIPLE_PAYLOADS);
@@ -1125,7 +1125,7 @@ static int asf_write_trailer(AVFormatContext *s)
int ret;
/* flush the current packet */
- if (asf->pb.buf_ptr > asf->pb.buffer)
+ if (asf->pb.pub.buf_ptr > asf->pb.pub.buffer)
flush_packet(s);
/* write index */
diff --git a/libavformat/av1.c b/libavformat/av1.c
index 5512c4e0f7..1fcfac2356 100644
--- a/libavformat/av1.c
+++ b/libavformat/av1.c
@@ -86,7 +86,7 @@ int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size)
int ff_av1_filter_obus_buf(const uint8_t *in, uint8_t **out,
int *size, int *offset)
{
- AVIOContext pb;
+ FFIOContext pb;
uint8_t *buf;
int len, off, ret;
@@ -108,7 +108,7 @@ int ff_av1_filter_obus_buf(const uint8_t *in, uint8_t **out,
ffio_init_context(&pb, buf, len, 1, NULL, NULL, NULL, NULL);
- ret = av1_filter_obus(&pb, in, *size, NULL);
+ ret = av1_filter_obus(&pb.pub, in, *size, NULL);
av_assert1(ret == len);
memset(buf + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
diff --git a/libavformat/av1dec.c b/libavformat/av1dec.c
index 37f21483b9..e994312253 100644
--- a/libavformat/av1dec.c
+++ b/libavformat/av1dec.c
@@ -157,32 +157,33 @@ static int read_obu(const uint8_t *buf, int size, int64_t *obu_size, int *type)
static int annexb_probe(const AVProbeData *p)
{
- AVIOContext pb;
+ FFIOContext ctx;
+ AVIOContext *const pb = &ctx.pub;
int64_t obu_size;
uint32_t temporal_unit_size, frame_unit_size, obu_unit_size;
int seq = 0;
int ret, type, cnt = 0;
- ffio_init_context(&pb, p->buf, p->buf_size, 0,
+ ffio_init_context(&ctx, p->buf, p->buf_size, 0,
NULL, NULL, NULL, NULL);
- ret = leb(&pb, &temporal_unit_size);
+ ret = leb(pb, &temporal_unit_size);
if (ret < 0)
return 0;
cnt += ret;
- ret = leb(&pb, &frame_unit_size);
+ ret = leb(pb, &frame_unit_size);
if (ret < 0 || ((int64_t)frame_unit_size + ret) > temporal_unit_size)
return 0;
cnt += ret;
- ret = leb(&pb, &obu_unit_size);
+ ret = leb(pb, &obu_unit_size);
if (ret < 0 || ((int64_t)obu_unit_size + ret) >= frame_unit_size)
return 0;
cnt += ret;
frame_unit_size -= obu_unit_size + ret;
- avio_skip(&pb, obu_unit_size);
- if (pb.eof_reached || pb.error)
+ avio_skip(pb, obu_unit_size);
+ if (pb->eof_reached || pb->error)
return 0;
// Check that the first OBU is a Temporal Delimiter.
@@ -192,13 +193,13 @@ static int annexb_probe(const AVProbeData *p)
cnt += obu_unit_size;
do {
- ret = leb(&pb, &obu_unit_size);
+ ret = leb(pb, &obu_unit_size);
if (ret < 0 || ((int64_t)obu_unit_size + ret) > frame_unit_size)
return 0;
cnt += ret;
- avio_skip(&pb, obu_unit_size);
- if (pb.eof_reached || pb.error)
+ avio_skip(pb, obu_unit_size);
+ if (pb->eof_reached || pb->error)
return 0;
ret = read_obu(p->buf + cnt, FFMIN(p->buf_size - cnt, obu_unit_size), &obu_size, &type);
diff --git a/libavformat/avio.h b/libavformat/avio.h
index 0b35409787..a7b56ab667 100644
--- a/libavformat/avio.h
+++ b/libavformat/avio.h
@@ -148,9 +148,9 @@ enum AVIODataMarkerType {
/**
* Bytestream IO Context.
- * New fields can be added to the end with minor version bumps.
- * Removal, reordering and changes to existing fields require a major
- * version bump.
+ * New public fields can be added with minor version bumps.
+ * Removal, reordering and changes to existing public fields require
+ * a major version bump.
* sizeof(AVIOContext) must not be used outside libav*.
*
* @note None of the function pointers in AVIOContext should be called
@@ -237,12 +237,14 @@ typedef struct AVIOContext {
int64_t (*seek)(void *opaque, int64_t offset, int whence);
int64_t pos; /**< position in the file of the current buffer */
int eof_reached; /**< true if was unable to read due to error or eof */
+ int error; /**< contains the error code or 0 if no error happened */
int write_flag; /**< true if open for writing */
int max_packet_size;
+ int min_packet_size; /**< Try to buffer at least this amount of data
+ before flushing it. */
unsigned long checksum;
unsigned char *checksum_ptr;
unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);
- int error; /**< contains the error code or 0 if no error happened */
/**
* Pause or resume playback for network streaming protocols - e.g. MMS.
*/
@@ -260,12 +262,6 @@ typedef struct AVIOContext {
int seekable;
/**
- * max filesize, used to limit allocations
- * This field is internal to libavformat and access from outside is not allowed.
- */
- int64_t maxsize;
-
- /**
* avio_read and avio_write should if possible be satisfied directly
* instead of going through a buffer, and avio_seek will always
* call the underlying seek function directly.
@@ -273,37 +269,6 @@ typedef struct AVIOContext {
int direct;
/**
- * Bytes read statistic
- * This field is internal to libavformat and access from outside is not allowed.
- */
- int64_t bytes_read;
-
- /**
- * seek statistic
- * This field is internal to libavformat and access from outside is not allowed.
- */
- int seek_count;
-
- /**
- * writeout statistic
- * This field is internal to libavformat and access from outside is not allowed.
- */
- int writeout_count;
-
- /**
- * Original buffer size
- * used internally after probing and ensure seekback to reset the buffer size
- * This field is internal to libavformat and access from outside is not allowed.
- */
- int orig_buffer_size;
-
- /**
- * Threshold to favor readahead over seek.
- * This is current internal only, do not use from outside.
- */
- int short_seek_threshold;
-
- /**
* ',' separated list of allowed protocols.
*/
const char *protocol_whitelist;
@@ -325,18 +290,6 @@ typedef struct AVIOContext {
*/
int ignore_boundary_point;
- /**
- * Internal, not meant to be used from outside of AVIOContext.
- */
- enum AVIODataMarkerType current_type;
- int64_t last_time;
-
- /**
- * A callback that is used instead of short_seek_threshold.
- * This is current internal only, do not use from outside.
- */
- int (*short_seek_get)(void *opaque);
-
int64_t written;
/**
@@ -344,11 +297,6 @@ typedef struct AVIOContext {
* used keeping track of already written data for a later flush.
*/
unsigned char *buf_ptr_max;
-
- /**
- * Try to buffer at least this amount of data before flushing it
- */
- int min_packet_size;
} AVIOContext;
/**
diff --git a/libavformat/avio_internal.h b/libavformat/avio_internal.h
index de95b43bdb..8b9e048f73 100644
--- a/libavformat/avio_internal.h
+++ b/libavformat/avio_internal.h
@@ -26,7 +26,54 @@
extern const AVClass ff_avio_class;
-int ffio_init_context(AVIOContext *s,
+typedef struct FFIOContext {
+ AVIOContext pub;
+ /**
+ * A callback that is used instead of short_seek_threshold.
+ */
+ int (*short_seek_get)(void *opaque);
+
+ /**
+ * Threshold to favor readahead over seek.
+ */
+ int short_seek_threshold;
+
+ enum AVIODataMarkerType current_type;
+ int64_t last_time;
+
+ /**
+ * max filesize, used to limit allocations
+ */
+ int64_t maxsize;
+
+ /**
+ * Bytes read statistic
+ */
+ int64_t bytes_read;
+
+ /**
+ * seek statistic
+ */
+ int seek_count;
+
+ /**
+ * writeout statistic
+ */
+ int writeout_count;
+
+ /**
+ * Original buffer size
+ * used after probing to ensure seekback and to reset the buffer size
+ */
+ int orig_buffer_size;
+} FFIOContext;
+
+static av_always_inline FFIOContext *ffiocontext(AVIOContext *ctx)
+{
+ return (FFIOContext*)ctx;
+}
+
+void ffio_init_context(FFIOContext *s,
unsigned char *buffer,
int buffer_size,
int write_flag,
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 1f0819b328..a33efacfc4 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -77,7 +77,7 @@ static int url_resetbuf(AVIOContext *s, int flags);
/** @warning must be called before any I/O */
static int set_buf_size(AVIOContext *s, int buf_size);
-int ffio_init_context(AVIOContext *s,
+void ffio_init_context(FFIOContext *ctx,
unsigned char *buffer,
int buffer_size,
int write_flag,
@@ -86,10 +86,12 @@ int ffio_init_context(AVIOContext *s,
int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
int64_t (*seek)(void *opaque, int64_t offset, int whence))
{
- memset(s, 0, sizeof(AVIOContext));
+ AVIOContext *const s = &ctx->pub;
+
+ memset(ctx, 0, sizeof(*ctx));
s->buffer = buffer;
- s->orig_buffer_size =
+ ctx->orig_buffer_size =
s->buffer_size = buffer_size;
s->buf_ptr = buffer;
s->buf_ptr_max = buffer;
@@ -108,7 +110,7 @@ int ffio_init_context(AVIOContext *s,
s->min_packet_size = 0;
s->max_packet_size = 0;
s->update_checksum = NULL;
- s->short_seek_threshold = SHORT_SEEK_THRESHOLD;
+ ctx->short_seek_threshold = SHORT_SEEK_THRESHOLD;
if (!read_packet && !write_flag) {
s->pos = buffer_size;
@@ -119,12 +121,10 @@ int ffio_init_context(AVIOContext *s,
s->write_data_type = NULL;
s->ignore_boundary_point = 0;
- s->current_type = AVIO_DATA_MARKER_UNKNOWN;
- s->last_time = AV_NOPTS_VALUE;
- s->short_seek_get = NULL;
+ ctx->current_type = AVIO_DATA_MARKER_UNKNOWN;
+ ctx->last_time = AV_NOPTS_VALUE;
+ ctx->short_seek_get = NULL;
s->written = 0;
-
- return 0;
}
AVIOContext *avio_alloc_context(
@@ -136,12 +136,12 @@ AVIOContext *avio_alloc_context(
int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
int64_t (*seek)(void *opaque, int64_t offset, int whence))
{
- AVIOContext *s = av_malloc(sizeof(AVIOContext));
+ FFIOContext *s = av_malloc(sizeof(*s));
if (!s)
return NULL;
ffio_init_context(s, buffer, buffer_size, write_flag, opaque,
read_packet, write_packet, seek);
- return s;
+ return &s->pub;
}
void avio_context_free(AVIOContext **ps)
@@ -151,13 +151,14 @@ void avio_context_free(AVIOContext **ps)
static void writeout(AVIOContext *s, const uint8_t *data, int len)
{
+ FFIOContext *const ctx = ffiocontext(s);
if (!s->error) {
int ret = 0;
if (s->write_data_type)
ret = s->write_data_type(s->opaque, (uint8_t *)data,
len,
- s->current_type,
- s->last_time);
+ ctx->current_type,
+ ctx->last_time);
else if (s->write_packet)
ret = s->write_packet(s->opaque, (uint8_t *)data, len);
if (ret < 0) {
@@ -167,12 +168,12 @@ static void writeout(AVIOContext *s, const uint8_t *data, int len)
s->written = s->pos + len;
}
}
- if (s->current_type == AVIO_DATA_MARKER_SYNC_POINT ||
- s->current_type == AVIO_DATA_MARKER_BOUNDARY_POINT) {
- s->current_type = AVIO_DATA_MARKER_UNKNOWN;
+ if (ctx->current_type == AVIO_DATA_MARKER_SYNC_POINT ||
+ ctx->current_type == AVIO_DATA_MARKER_BOUNDARY_POINT) {
+ ctx->current_type = AVIO_DATA_MARKER_UNKNOWN;
}
- s->last_time = AV_NOPTS_VALUE;
- s->writeout_count ++;
+ ctx->last_time = AV_NOPTS_VALUE;
+ ctx->writeout_count++;
s->pos += len;
}
@@ -244,6 +245,7 @@ void avio_flush(AVIOContext *s)
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
{
+ FFIOContext *const ctx = ffiocontext(s);
int64_t offset1;
int64_t pos;
int force = whence & AVSEEK_FORCE;
@@ -275,9 +277,9 @@ int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
if (offset < 0)
return AVERROR(EINVAL);
- short_seek = s->short_seek_threshold;
- if (s->short_seek_get) {
- int tmp = s->short_seek_get(s->opaque);
+ short_seek = ctx->short_seek_threshold;
+ if (ctx->short_seek_get) {
+ int tmp = ctx->short_seek_get(s->opaque);
short_seek = FFMAX(tmp, short_seek);
}
@@ -318,7 +320,7 @@ int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
return AVERROR(EPIPE);
if ((res = s->seek(s->opaque, offset, SEEK_SET)) < 0)
return res;
- s->seek_count ++;
+ ctx->seek_count++;
if (!s->write_flag)
s->buf_end = s->buffer;
s->buf_ptr = s->buf_ptr_max = s->buffer;
@@ -472,6 +474,7 @@ void avio_wb24(AVIOContext *s, unsigned int val)
void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type)
{
+ FFIOContext *const ctx = ffiocontext(s);
if (type == AVIO_DATA_MARKER_FLUSH_POINT) {
if (s->buf_ptr - s->buffer >= s->min_packet_size)
avio_flush(s);
@@ -485,8 +488,8 @@ void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType typ
// Avoid unnecessary flushes if we are already in non-header/trailer
// data and setting the type to unknown
if (type == AVIO_DATA_MARKER_UNKNOWN &&
- (s->current_type != AVIO_DATA_MARKER_HEADER &&
- s->current_type != AVIO_DATA_MARKER_TRAILER))
+ (ctx->current_type != AVIO_DATA_MARKER_HEADER &&
+ ctx->current_type != AVIO_DATA_MARKER_TRAILER))
return;
switch (type) {
@@ -494,7 +497,7 @@ void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType typ
case AVIO_DATA_MARKER_TRAILER:
// For header/trailer, ignore a new marker of the same type;
// consecutive header/trailer markers can be merged.
- if (type == s->current_type)
+ if (type == ctx->current_type)
return;
break;
}
@@ -502,8 +505,8 @@ void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType typ
// If we've reached here, we have a new, noteworthy marker.
// Flush the previous data and mark the start of the new data.
avio_flush(s);
- s->current_type = type;
- s->last_time = time;
+ ctx->current_type = type;
+ ctx->last_time = time;
}
static int read_packet_wrapper(AVIOContext *s, uint8_t *buf, int size)
@@ -521,6 +524,7 @@ static int read_packet_wrapper(AVIOContext *s, uint8_t *buf, int size)
static void fill_buffer(AVIOContext *s)
{
+ FFIOContext *const ctx = (FFIOContext *)s;
int max_buffer_size = s->max_packet_size ?
s->max_packet_size : IO_BUFFER_SIZE;
uint8_t *dst = s->buf_end - s->buffer + max_buffer_size <= s->buffer_size ?
@@ -543,15 +547,16 @@ static void fill_buffer(AVIOContext *s)
}
/* make buffer smaller in case it ended up large after probing */
- if (s->read_packet && s->orig_buffer_size && s->buffer_size > s->orig_buffer_size && len >= s->orig_buffer_size) {
+ if (s->read_packet && ctx->orig_buffer_size &&
+ s->buffer_size > ctx->orig_buffer_size && len >= ctx->orig_buffer_size) {
if (dst == s->buffer && s->buf_ptr != dst) {
- int ret = set_buf_size(s, s->orig_buffer_size);
+ int ret = set_buf_size(s, ctx->orig_buffer_size);
if (ret < 0)
av_log(s, AV_LOG_WARNING, "Failed to decrease buffer size\n");
s->checksum_ptr = dst = s->buffer;
}
- len = s->orig_buffer_size;
+ len = ctx->orig_buffer_size;
}
len = read_packet_wrapper(s, dst, len);
@@ -566,7 +571,7 @@ static void fill_buffer(AVIOContext *s)
s->pos += len;
s->buf_ptr = dst;
s->buf_end = dst + len;
- s->bytes_read += len;
+ ffiocontext(s)->bytes_read += len;
}
}
@@ -639,7 +644,7 @@ int avio_read(AVIOContext *s, unsigned char *buf, int size)
break;
} else {
s->pos += len;
- s->bytes_read += len;
+ ffiocontext(s)->bytes_read += len;
size -= len;
buf += len;
// reset the buffer
@@ -955,7 +960,7 @@ int ffio_fdopen(AVIOContext **s, URLContext *h)
if (h->prot->url_read_seek)
(*s)->seekable |= AVIO_SEEKABLE_TIME;
}
- (*s)->short_seek_get = (int (*)(void *))ffurl_get_short_seek;
+ ((FFIOContext*)(*s))->short_seek_get = (int (*)(void *))ffurl_get_short_seek;
(*s)->av_class = &ff_avio_class;
return 0;
fail:
@@ -1019,20 +1024,21 @@ int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
int ffio_limit(AVIOContext *s, int size)
{
- if (s->maxsize>= 0) {
+ FFIOContext *const ctx = ffiocontext(s);
+ if (ctx->maxsize >= 0) {
int64_t pos = avio_tell(s);
- int64_t remaining = s->maxsize - pos;
+ int64_t remaining = ctx->maxsize - pos;
if (remaining < size) {
int64_t newsize = avio_size(s);
- if (!s->maxsize || s->maxsize<newsize)
- s->maxsize = newsize - !newsize;
- if (pos > s->maxsize && s->maxsize >= 0)
- s->maxsize = AVERROR(EIO);
- if (s->maxsize >= 0)
- remaining = s->maxsize - pos;
+ if (!ctx->maxsize || ctx->maxsize < newsize)
+ ctx->maxsize = newsize - !newsize;
+ if (pos > ctx->maxsize && ctx->maxsize >= 0)
+ ctx->maxsize = AVERROR(EIO);
+ if (ctx->maxsize >= 0)
+ remaining = ctx->maxsize - pos;
}
- if (s->maxsize >= 0 && remaining < size && size > 1) {
+ if (ctx->maxsize >= 0 && remaining < size && size > 1) {
av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG,
"Truncating packet of size %d to %"PRId64"\n",
size, remaining + !remaining);
@@ -1051,7 +1057,7 @@ static int set_buf_size(AVIOContext *s, int buf_size)
av_free(s->buffer);
s->buffer = buffer;
- s->orig_buffer_size =
+ ffiocontext(s)->orig_buffer_size =
s->buffer_size = buf_size;
s->buf_ptr = s->buf_ptr_max = buffer;
url_resetbuf(s, s->write_flag ? AVIO_FLAG_WRITE : AVIO_FLAG_READ);
@@ -1078,7 +1084,7 @@ int ffio_realloc_buf(AVIOContext *s, int buf_size)
memcpy(buffer, s->write_flag ? s->buffer : s->buf_ptr, data_size);
av_free(s->buffer);
s->buffer = buffer;
- s->orig_buffer_size = buf_size;
+ ffiocontext(s)->orig_buffer_size = buf_size;
s->buffer_size = buf_size;
s->buf_ptr = s->write_flag ? (s->buffer + data_size) : s->buffer;
if (s->write_flag)
@@ -1180,6 +1186,7 @@ int avio_open2(AVIOContext **s, const char *filename, int flags,
int avio_close(AVIOContext *s)
{
+ FFIOContext *const ctx = ffiocontext(s);
URLContext *h;
if (!s)
@@ -1191,9 +1198,11 @@ int avio_close(AVIOContext *s)
av_freep(&s->buffer);
if (s->write_flag)
- av_log(s, AV_LOG_VERBOSE, "Statistics: %d seeks, %d writeouts\n", s->seek_count, s->writeout_count);
+ av_log(s, AV_LOG_VERBOSE, "Statistics: %d seeks, %d writeouts\n",
+ ctx->seek_count, ctx->writeout_count);
else
- av_log(s, AV_LOG_VERBOSE, "Statistics: %"PRId64" bytes read, %d seeks\n", s->bytes_read, s->seek_count);
+ av_log(s, AV_LOG_VERBOSE, "Statistics: %"PRId64" bytes read, %d seeks\n",
+ ctx->bytes_read, ctx->seek_count);
av_opt_free(s);
avio_context_free(&s);
@@ -1427,8 +1436,8 @@ void ffio_reset_dyn_buf(AVIOContext *s)
DynBuffer *d = s->opaque;
int max_packet_size = s->max_packet_size;
- ffio_init_context(s, d->io_buffer, d->io_buffer_size, 1, d, NULL,
- s->write_packet, s->seek);
+ ffio_init_context(ffiocontext(s), d->io_buffer, d->io_buffer_size,
+ 1, d, NULL, s->write_packet, s->seek);
s->max_packet_size = max_packet_size;
d->pos = d->size = 0;
}
diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c
index 6105ec46d9..983dc85d65 100644
--- a/libavformat/dashdec.c
+++ b/libavformat/dashdec.c
@@ -77,7 +77,7 @@ struct timeline {
*/
struct representation {
char *url_template;
- AVIOContext pb;
+ FFIOContext pb;
AVIOContext *input;
AVFormatContext *parent;
AVFormatContext *ctx;
@@ -353,7 +353,7 @@ static void free_representation(struct representation *pls)
free_fragment(&pls->cur_seg);
free_fragment(&pls->init_section);
av_freep(&pls->init_sec_buf);
- av_freep(&pls->pb.buffer);
+ av_freep(&pls->pb.pub.buffer);
ff_format_io_close(pls->parent, &pls->input);
if (pls->ctx) {
pls->ctx->pb = NULL;
@@ -1871,8 +1871,8 @@ static int nested_io_open(AVFormatContext *s, AVIOContext **pb, const char *url,
static void close_demux_for_component(struct representation *pls)
{
/* note: the internal buffer could have changed */
- av_freep(&pls->pb.buffer);
- memset(&pls->pb, 0x00, sizeof(AVIOContext));
+ av_freep(&pls->pb.pub.buffer);
+ memset(&pls->pb, 0x00, sizeof(pls->pb));
pls->ctx->pb = NULL;
avformat_close_input(&pls->ctx);
}
@@ -1908,7 +1908,7 @@ static int reopen_demux_for_component(AVFormatContext *s, struct representation
}
ffio_init_context(&pls->pb, avio_ctx_buffer, INITIAL_BUFFER_SIZE, 0,
pls, read_data, NULL, c->is_live ? NULL : seek_data);
- pls->pb.seekable = 0;
+ pls->pb.pub.seekable = 0;
if ((ret = ff_copy_whiteblacklists(pls->ctx, s)) < 0)
goto fail;
@@ -1917,7 +1917,7 @@ static int reopen_demux_for_component(AVFormatContext *s, struct representation
pls->ctx->probesize = s->probesize > 0 ? s->probesize : 1024 * 4;
pls->ctx->max_analyze_duration = s->max_analyze_duration > 0 ? s->max_analyze_duration : 4 * AV_TIME_BASE;
pls->ctx->interrupt_callback = s->interrupt_callback;
- ret = av_probe_input_buffer(&pls->pb, &in_fmt, "", NULL, 0, 0);
+ ret = av_probe_input_buffer(&pls->pb.pub, &in_fmt, "", NULL, 0, 0);
if (ret < 0) {
av_log(s, AV_LOG_ERROR, "Error when loading first fragment of playlist\n");
avformat_free_context(pls->ctx);
@@ -1925,7 +1925,7 @@ static int reopen_demux_for_component(AVFormatContext *s, struct representation
goto fail;
}
- pls->ctx->pb = &pls->pb;
+ pls->ctx->pb = &pls->pb.pub;
pls->ctx->io_open = nested_io_open;
// provide additional information from mpd if available
diff --git a/libavformat/hls.c b/libavformat/hls.c
index 3c1b80f60c..421a60a476 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -92,7 +92,7 @@ enum PlaylistType {
*/
struct playlist {
char url[MAX_URL_SIZE];
- AVIOContext pb;
+ FFIOContext pb;
uint8_t* read_buffer;
AVIOContext *input;
int input_read_done;
@@ -258,7 +258,7 @@ static void free_playlist_list(HLSContext *c)
ff_id3v2_free_extra_meta(&pls->id3_deferred_extra);
av_freep(&pls->init_sec_buf);
av_packet_free(&pls->pkt);
- av_freep(&pls->pb.buffer);
+ av_freep(&pls->pb.pub.buffer);
ff_format_io_close(c->ctx, &pls->input);
pls->input_read_done = 0;
ff_format_io_close(c->ctx, &pls->input_next);
@@ -1222,9 +1222,9 @@ static void intercept_id3(struct playlist *pls, uint8_t *buf,
if (pls->id3_buf) {
/* Now parse all the ID3 tags */
- AVIOContext id3ioctx;
+ FFIOContext id3ioctx;
ffio_init_context(&id3ioctx, pls->id3_buf, id3_buf_pos, 0, NULL, NULL, NULL, NULL);
- handle_id3(&id3ioctx, pls);
+ handle_id3(&id3ioctx.pub, pls);
}
if (pls->is_id3_timestamped == -1)
@@ -1995,7 +1995,7 @@ static int hls_read_header(AVFormatContext *s)
pls->ctx->max_analyze_duration = s->max_analyze_duration > 0 ? s->max_analyze_duration : 4 * AV_TIME_BASE;
pls->ctx->interrupt_callback = s->interrupt_callback;
url = av_strdup(pls->segments[0]->url);
- ret = av_probe_input_buffer(&pls->pb, &in_fmt, url, NULL, 0, 0);
+ ret = av_probe_input_buffer(&pls->pb.pub, &in_fmt, url, NULL, 0, 0);
if (ret < 0) {
/* Free the ctx - it isn't initialized properly at this point,
* so avformat_close_input shouldn't be called. If
@@ -2008,7 +2008,7 @@ static int hls_read_header(AVFormatContext *s)
return ret;
}
av_free(url);
- pls->ctx->pb = &pls->pb;
+ pls->ctx->pb = &pls->pb.pub;
pls->ctx->io_open = nested_io_open;
pls->ctx->flags |= s->flags & ~AVFMT_FLAG_CUSTOM_IO;
@@ -2087,7 +2087,7 @@ static int recheck_discard_flags(AVFormatContext *s, int first)
pls->needed = 1;
changed = 1;
pls->cur_seq_no = select_cur_seq_no(c, pls);
- pls->pb.eof_reached = 0;
+ pls->pb.pub.eof_reached = 0;
if (c->cur_timestamp != AV_NOPTS_VALUE) {
/* catch up */
pls->seek_timestamp = c->cur_timestamp;
@@ -2168,7 +2168,7 @@ static int hls_read_packet(AVFormatContext *s, AVPacket *pkt)
AVRational tb;
ret = av_read_frame(pls->ctx, pls->pkt);
if (ret < 0) {
- if (!avio_feof(&pls->pb) && ret != AVERROR_EOF)
+ if (!avio_feof(&pls->pb.pub) && ret != AVERROR_EOF)
return ret;
break;
} else {
@@ -2336,16 +2336,17 @@ static int hls_read_seek(AVFormatContext *s, int stream_index,
for (i = 0; i < c->n_playlists; i++) {
/* Reset reading */
struct playlist *pls = c->playlists[i];
+ AVIOContext *const pb = &pls->pb.pub;
ff_format_io_close(pls->parent, &pls->input);
pls->input_read_done = 0;
ff_format_io_close(pls->parent, &pls->input_next);
pls->input_next_requested = 0;
av_packet_unref(pls->pkt);
- pls->pb.eof_reached = 0;
+ pb->eof_reached = 0;
/* Clear any buffered data */
- pls->pb.buf_end = pls->pb.buf_ptr = pls->pb.buffer;
+ pb->buf_end = pb->buf_ptr = pb->buffer;
/* Reset the pos, to let the mpegts demuxer know we've seeked. */
- pls->pb.pos = 0;
+ pb->pos = 0;
/* Flush the packet queue of the subdemuxer. */
ff_read_frame_flush(pls->ctx);
diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c
index 96226193c1..ff27c062e5 100644
--- a/libavformat/id3v2.c
+++ b/libavformat/id3v2.c
@@ -827,7 +827,7 @@ static void id3v2_parse(AVIOContext *pb, AVDictionary **metadata,
int64_t next, end = avio_tell(pb);
int taghdrlen;
const char *reason = NULL;
- AVIOContext pb_local;
+ FFIOContext pb_local;
AVIOContext *pbx;
unsigned char *buffer = NULL;
int buffer_size = 0;
@@ -999,7 +999,7 @@ static void id3v2_parse(AVIOContext *pb, AVDictionary **metadata,
ffio_init_context(&pb_local, buffer, b - buffer, 0, NULL, NULL, NULL,
NULL);
tlen = b - buffer;
- pbx = &pb_local; // read from sync buffer
+ pbx = &pb_local.pub; // read from sync buffer
}
#if CONFIG_ZLIB
@@ -1035,7 +1035,7 @@ static void id3v2_parse(AVIOContext *pb, AVDictionary **metadata,
}
ffio_init_context(&pb_local, uncompressed_buffer, dlen, 0, NULL, NULL, NULL, NULL);
tlen = dlen;
- pbx = &pb_local; // read from sync buffer
+ pbx = &pb_local.pub; // read from sync buffer
}
#endif
if (tag[0] == 'T')
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index c33128f528..7d79b3d5c4 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2350,7 +2350,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
int extradata_size = 0;
int extradata_offset = 0;
uint32_t fourcc = 0;
- AVIOContext b;
+ FFIOContext b;
char* key_id_base64 = NULL;
int bit_depth = -1;
@@ -2511,7 +2511,8 @@ static int matroska_parse_tracks(AVFormatContext *s)
ffio_init_context(&b, track->codec_priv.data,
track->codec_priv.size,
0, NULL, NULL, NULL, NULL);
- ret = ff_get_wav_header(s, &b, st->codecpar, track->codec_priv.size, 0);
+ ret = ff_get_wav_header(s, &b.pub, st->codecpar,
+ track->codec_priv.size, 0);
if (ret < 0)
return ret;
codec_id = st->codecpar->codec_id;
@@ -2557,7 +2558,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
ffio_init_context(&b, track->codec_priv.data,
track->codec_priv.size,
0, NULL, NULL, NULL, NULL);
- if (ff_get_qtpalette(codec_id, &b, track->palette)) {
+ if (ff_get_qtpalette(codec_id, &b.pub, track->palette)) {
bit_depth &= 0x1F;
track->has_palette = 1;
}
@@ -3587,7 +3588,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf
{
uint64_t timecode = AV_NOPTS_VALUE;
MatroskaTrack *track;
- AVIOContext pb;
+ FFIOContext pb;
int res = 0;
AVStream *st;
int16_t block_time;
@@ -3598,7 +3599,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf
ffio_init_context(&pb, data, size, 0, NULL, NULL, NULL, NULL);
- if ((n = ebml_read_num(matroska, &pb, 8, &num, 1)) < 0)
+ if ((n = ebml_read_num(matroska, &pb.pub, 8, &num, 1)) < 0)
return n;
data += n;
size -= n;
@@ -3656,7 +3657,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf
}
res = matroska_parse_laces(matroska, &data, size, (flags & 0x06) >> 1,
- &pb, lace_size, &laces);
+ &pb.pub, lace_size, &laces);
if (res < 0) {
av_log(matroska->ctx, AV_LOG_ERROR, "Error parsing frame sizes.\n");
return res;
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index b1735f3838..6e34243f6b 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -839,11 +839,12 @@ static void mkv_write_video_color(AVIOContext *pb, const AVStream *st,
* a master element with two bytes ID and one byte length field
* plus another byte to stay clear of the end. */
uint8_t colour[(2 + 1 + 8) * 18 + (2 + 1) + 1];
- AVIOContext buf, *dyn_cp = &buf;
+ FFIOContext buf;
+ AVIOContext *const dyn_cp = &buf.pub;
int colorinfo_size;
const void *side_data;
- ffio_init_context(dyn_cp, colour, sizeof(colour), 1, NULL, NULL, NULL, NULL);
+ ffio_init_context(&buf, colour, sizeof(colour), 1, NULL, NULL, NULL, NULL);
if (par->color_trc != AVCOL_TRC_UNSPECIFIED &&
par->color_trc < AVCOL_TRC_NB) {
diff --git a/libavformat/mmst.c b/libavformat/mmst.c
index fa6e86ac26..20b04b12aa 100644
--- a/libavformat/mmst.c
+++ b/libavformat/mmst.c
@@ -154,13 +154,13 @@ static int send_command_packet(MMSTContext *mmst)
static int mms_put_utf16(MMSContext *mms, const uint8_t *src)
{
- AVIOContext bic;
+ 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);
- len = avio_put_str16le(&bic, src);
+ len = avio_put_str16le(&bic.pub, src);
if (len < 0)
return len;
mms->write_out_ptr += len;
diff --git a/libavformat/mov.c b/libavformat/mov.c
index c556390525..da4c5d60f8 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -5177,7 +5177,7 @@ static int mov_read_wide(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_cmov(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
#if CONFIG_ZLIB
- AVIOContext ctx;
+ FFIOContext ctx;
uint8_t *cmov_data;
uint8_t *moov_data; /* uncompressed data */
long cmov_len, moov_len;
@@ -5211,12 +5211,11 @@ 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;
- if (ffio_init_context(&ctx, moov_data, moov_len, 0, NULL, NULL, NULL, NULL) != 0)
- goto free_and_return;
- ctx.seekable = AVIO_SEEKABLE_NORMAL;
+ ffio_init_context(&ctx, moov_data, moov_len, 0, NULL, NULL, NULL, NULL);
+ ctx.pub.seekable = AVIO_SEEKABLE_NORMAL;
atom.type = MKTAG('m','o','o','v');
atom.size = moov_len;
- ret = mov_read_default(c, &ctx, atom);
+ ret = mov_read_default(c, &ctx.pub, atom);
free_and_return:
av_free(moov_data);
av_free(cmov_data);
diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c
index 0402700445..195d89814e 100644
--- a/libavformat/mp3dec.c
+++ b/libavformat/mp3dec.c
@@ -380,7 +380,7 @@ static int mp3_read_header(AVFormatContext *s)
// lcm of all mp3 sample rates
avpriv_set_pts_info(st, 64, 1, 14112000);
- s->pb->maxsize = -1;
+ ffiocontext(s->pb)->maxsize = -1;
off = avio_tell(s->pb);
if (!av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX))
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index a02965bacf..fe89d4fb9f 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -1427,7 +1427,7 @@ static PESContext *add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
#define MAX_LEVEL 4
typedef struct MP4DescrParseContext {
AVFormatContext *s;
- AVIOContext pb;
+ FFIOContext pb;
Mp4Descr *descr;
Mp4Descr *active_descr;
int descr_count;
@@ -1440,13 +1440,11 @@ static int init_MP4DescrParseContext(MP4DescrParseContext *d, AVFormatContext *s
const uint8_t *buf, unsigned size,
Mp4Descr *descr, int max_descr_count)
{
- int ret;
if (size > (1 << 30))
return AVERROR_INVALIDDATA;
- if ((ret = ffio_init_context(&d->pb, (unsigned char *)buf, size, 0,
- NULL, NULL, NULL, NULL)) < 0)
- return ret;
+ ffio_init_context(&d->pb, (unsigned char *)buf, size,
+ 0, NULL, NULL, NULL, NULL);
d->s = s;
d->level = 0;
@@ -1474,20 +1472,21 @@ static int parse_mp4_descr_arr(MP4DescrParseContext *d, int64_t off, int len)
int ret = parse_mp4_descr(d, off, len, 0);
if (ret < 0)
return ret;
- update_offsets(&d->pb, &off, &len);
+ update_offsets(&d->pb.pub, &off, &len);
}
return 0;
}
static int parse_MP4IODescrTag(MP4DescrParseContext *d, int64_t off, int len)
{
- avio_rb16(&d->pb); // ID
- avio_r8(&d->pb);
- avio_r8(&d->pb);
- avio_r8(&d->pb);
- avio_r8(&d->pb);
- avio_r8(&d->pb);
- update_offsets(&d->pb, &off, &len);
+ AVIOContext *const pb = &d->pb.pub;
+ avio_rb16(pb); // ID
+ avio_r8(pb);
+ avio_r8(pb);
+ avio_r8(pb);
+ avio_r8(pb);
+ avio_r8(pb);
+ update_offsets(pb, &off, &len);
return parse_mp4_descr_arr(d, off, len);
}
@@ -1496,9 +1495,9 @@ static int parse_MP4ODescrTag(MP4DescrParseContext *d, int64_t off, int len)
int id_flags;
if (len < 2)
return 0;
- id_flags = avio_rb16(&d->pb);
+ id_flags = avio_rb16(&d->pb.pub);
if (!(id_flags & 0x0020)) { // URL_Flag
- update_offsets(&d->pb, &off, &len);
+ update_offsets(&d->pb.pub, &off, &len);
return parse_mp4_descr_arr(d, off, len); // ES_Descriptor[]
} else {
return 0;
@@ -1507,19 +1506,20 @@ static int parse_MP4ODescrTag(MP4DescrParseContext *d, int64_t off, int len)
static int parse_MP4ESDescrTag(MP4DescrParseContext *d, int64_t off, int len)
{
+ AVIOContext *const pb = &d->pb.pub;
int es_id = 0;
int ret = 0;
if (d->descr_count >= d->max_descr_count)
return AVERROR_INVALIDDATA;
- ff_mp4_parse_es_descr(&d->pb, &es_id);
+ ff_mp4_parse_es_descr(pb, &es_id);
d->active_descr = d->descr + (d->descr_count++);
d->active_descr->es_id = es_id;
- update_offsets(&d->pb, &off, &len);
+ update_offsets(pb, &off, &len);
if ((ret = parse_mp4_descr(d, off, len, MP4DecConfigDescrTag)) < 0)
return ret;
- update_offsets(&d->pb, &off, &len);
+ update_offsets(pb, &off, &len);
if (len > 0)
ret = parse_mp4_descr(d, off, len, MP4SLDescrTag);
d->active_descr = NULL;
@@ -1536,42 +1536,43 @@ static int parse_MP4DecConfigDescrTag(MP4DescrParseContext *d, int64_t off,
if (!descr->dec_config_descr)
return AVERROR(ENOMEM);
descr->dec_config_descr_len = len;
- avio_read(&d->pb, descr->dec_config_descr, len);
+ avio_read(&d->pb.pub, descr->dec_config_descr, len);
return 0;
}
static int parse_MP4SLDescrTag(MP4DescrParseContext *d, int64_t off, int len)
{
Mp4Descr *descr = d->active_descr;
+ AVIOContext *const pb = &d->pb.pub;
int predefined;
if (!descr)
return AVERROR_INVALIDDATA;
#define R8_CHECK_CLIP_MAX(dst, maxv) do { \
- descr->sl.dst = avio_r8(&d->pb); \
+ descr->sl.dst = avio_r8(pb); \
if (descr->sl.dst > maxv) { \
descr->sl.dst = maxv; \
return AVERROR_INVALIDDATA; \
} \
} while (0)
- predefined = avio_r8(&d->pb);
+ predefined = avio_r8(pb);
if (!predefined) {
int lengths;
- int flags = avio_r8(&d->pb);
+ int flags = avio_r8(pb);
descr->sl.use_au_start = !!(flags & 0x80);
descr->sl.use_au_end = !!(flags & 0x40);
descr->sl.use_rand_acc_pt = !!(flags & 0x20);
descr->sl.use_padding = !!(flags & 0x08);
descr->sl.use_timestamps = !!(flags & 0x04);
descr->sl.use_idle = !!(flags & 0x02);
- descr->sl.timestamp_res = avio_rb32(&d->pb);
- avio_rb32(&d->pb);
+ descr->sl.timestamp_res = avio_rb32(pb);
+ avio_rb32(pb);
R8_CHECK_CLIP_MAX(timestamp_len, 63);
R8_CHECK_CLIP_MAX(ocr_len, 63);
R8_CHECK_CLIP_MAX(au_len, 31);
- descr->sl.inst_bitrate_len = avio_r8(&d->pb);
- lengths = avio_rb16(&d->pb);
+ descr->sl.inst_bitrate_len = avio_r8(pb);
+ lengths = avio_rb16(pb);
descr->sl.degr_prior_len = lengths >> 12;
descr->sl.au_seq_num_len = (lengths >> 7) & 0x1f;
descr->sl.packet_seq_num_len = (lengths >> 2) & 0x1f;
@@ -1586,10 +1587,11 @@ static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len,
int target_tag)
{
int tag;
- int len1 = ff_mp4_read_descr(d->s, &d->pb, &tag);
+ AVIOContext *const pb = &d->pb.pub;
+ int len1 = ff_mp4_read_descr(d->s, pb, &tag);
int ret = 0;
- update_offsets(&d->pb, &off, &len);
+ update_offsets(pb, &off, &len);
if (len < 0 || len1 > len || len1 <= 0) {
av_log(d->s, AV_LOG_ERROR,
"Tag %x length violation new length %d bytes remaining %d\n",
@@ -1631,7 +1633,7 @@ static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len,
done:
d->level--;
- avio_seek(&d->pb, off + len1, SEEK_SET);
+ avio_seek(pb, off + len1, SEEK_SET);
return ret;
}
@@ -1645,7 +1647,7 @@ static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size,
if (ret < 0)
return ret;
- ret = parse_mp4_descr(&d, avio_tell(&d.pb), size, MP4IODescrTag);
+ ret = parse_mp4_descr(&d, avio_tell(&d.pb.pub), size, MP4IODescrTag);
*descr_count = d.descr_count;
return ret;
@@ -1661,7 +1663,7 @@ static int mp4_read_od(AVFormatContext *s, const uint8_t *buf, unsigned size,
if (ret < 0)
return ret;
- ret = parse_mp4_descr_arr(&d, avio_tell(&d.pb), size);
+ ret = parse_mp4_descr_arr(&d, avio_tell(&d.pb.pub), size);
*descr_count = d.descr_count;
return ret;
@@ -1674,7 +1676,6 @@ static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section,
MpegTSSectionFilter *tssf = &filter->u.section_filter;
SectionHeader h;
const uint8_t *p, *p_end;
- AVIOContext pb;
int mp4_descr_count = 0;
Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = { { 0 } };
int i, pid;
@@ -1698,6 +1699,7 @@ static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section,
for (i = 0; i < mp4_descr_count; i++) {
PESContext *pes;
AVStream *st;
+ FFIOContext pb;
if (ts->pids[pid]->es_id != mp4_descr[i].es_id)
continue;
if (ts->pids[pid]->type != MPEGTS_PES) {
@@ -1714,7 +1716,7 @@ static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section,
ffio_init_context(&pb, mp4_descr[i].dec_config_descr,
mp4_descr[i].dec_config_descr_len, 0,
NULL, NULL, NULL, NULL);
- ff_mp4_read_dec_config_descr(s, st, &pb);
+ ff_mp4_read_dec_config_descr(s, st, &pb.pub);
if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
st->codecpar->extradata_size > 0)
st->internal->need_parsing = 0;
@@ -1819,11 +1821,11 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
for (i = 0; i < mp4_descr_count; i++)
if (mp4_descr[i].dec_config_descr_len &&
mp4_descr[i].es_id == desc_es_id) {
- AVIOContext pb;
+ FFIOContext pb;
ffio_init_context(&pb, mp4_descr[i].dec_config_descr,
mp4_descr[i].dec_config_descr_len, 0,
NULL, NULL, NULL, NULL);
- ff_mp4_read_dec_config_descr(fc, st, &pb);
+ ff_mp4_read_dec_config_descr(fc, st, &pb.pub);
if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
st->codecpar->extradata_size > 0) {
st->internal->need_parsing = 0;
@@ -1841,11 +1843,11 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
(st->internal->request_probe == 0 && st->codecpar->codec_id == AV_CODEC_ID_NONE) ||
st->internal->request_probe > 0) &&
mp4_descr->dec_config_descr_len && mp4_descr->es_id == pid) {
- AVIOContext pb;
+ FFIOContext pb;
ffio_init_context(&pb, mp4_descr->dec_config_descr,
mp4_descr->dec_config_descr_len, 0,
NULL, NULL, NULL, NULL);
- ff_mp4_read_dec_config_descr(fc, st, &pb);
+ ff_mp4_read_dec_config_descr(fc, st, &pb.pub);
if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
st->codecpar->extradata_size > 0) {
st->internal->request_probe = st->internal->need_parsing = 0;
diff --git a/libavformat/mpjpegdec.c b/libavformat/mpjpegdec.c
index 28a24184a2..559a375d8d 100644
--- a/libavformat/mpjpegdec.c
+++ b/libavformat/mpjpegdec.c
@@ -113,7 +113,7 @@ static int mpjpeg_read_close(AVFormatContext *s)
static int mpjpeg_read_probe(const AVProbeData *p)
{
- AVIOContext pb;
+ FFIOContext pb;
int ret = 0;
int size = 0;
@@ -122,7 +122,7 @@ static int mpjpeg_read_probe(const AVProbeData *p)
ffio_init_context(&pb, p->buf, p->buf_size, 0, NULL, NULL, NULL, NULL);
- ret = (parse_multipart_header(&pb, &size, "--", NULL) >= 0) ? AVPROBE_SCORE_MAX : 0;
+ ret = (parse_multipart_header(&pb.pub, &size, "--", NULL) >= 0) ? AVPROBE_SCORE_MAX : 0;
return ret;
}
diff --git a/libavformat/oggenc.c b/libavformat/oggenc.c
index aff0ca6b96..a88dab8ccc 100644
--- a/libavformat/oggenc.c
+++ b/libavformat/oggenc.c
@@ -275,7 +275,7 @@ static uint8_t *ogg_write_vorbiscomment(int64_t offset, int bitexact,
AVChapter **chapters, unsigned int nb_chapters)
{
const char *vendor = bitexact ? "ffmpeg" : LIBAVFORMAT_IDENT;
- AVIOContext pb;
+ FFIOContext pb;
int64_t size;
uint8_t *p;
@@ -289,9 +289,9 @@ static uint8_t *ogg_write_vorbiscomment(int64_t offset, int bitexact,
return NULL;
ffio_init_context(&pb, p + offset, size - offset, 1, NULL, NULL, NULL, NULL);
- ff_vorbiscomment_write(&pb, *m, vendor, chapters, nb_chapters);
+ ff_vorbiscomment_write(&pb.pub, *m, vendor, chapters, nb_chapters);
if (framing_bit)
- avio_w8(&pb, 1);
+ avio_w8(&pb.pub, 1);
*header_len = size;
return p;
diff --git a/libavformat/rdt.c b/libavformat/rdt.c
index da55503ea6..a015acb690 100644
--- a/libavformat/rdt.c
+++ b/libavformat/rdt.c
@@ -131,7 +131,8 @@ ff_rdt_calc_response_and_checksum(char response[41], char chksum[9],
static int
rdt_load_mdpr (PayloadContext *rdt, AVStream *st, int rule_nr)
{
- AVIOContext pb;
+ FFIOContext pb0;
+ AVIOContext *const pb = &pb0.pub;
unsigned int size;
uint32_t tag;
@@ -151,32 +152,32 @@ rdt_load_mdpr (PayloadContext *rdt, AVStream *st, int rule_nr)
*/
if (!rdt->mlti_data)
return -1;
- ffio_init_context(&pb, rdt->mlti_data, rdt->mlti_data_size, 0,
+ ffio_init_context(&pb0, rdt->mlti_data, rdt->mlti_data_size, 0,
NULL, NULL, NULL, NULL);
- tag = avio_rl32(&pb);
+ tag = avio_rl32(pb);
if (tag == MKTAG('M', 'L', 'T', 'I')) {
int num, chunk_nr;
/* read index of MDPR chunk numbers */
- num = avio_rb16(&pb);
+ num = avio_rb16(pb);
if (rule_nr < 0 || rule_nr >= num)
return -1;
- avio_skip(&pb, rule_nr * 2);
- chunk_nr = avio_rb16(&pb);
- avio_skip(&pb, (num - 1 - rule_nr) * 2);
+ avio_skip(pb, rule_nr * 2);
+ chunk_nr = avio_rb16(pb);
+ avio_skip(pb, (num - 1 - rule_nr) * 2);
/* read MDPR chunks */
- num = avio_rb16(&pb);
+ num = avio_rb16(pb);
if (chunk_nr >= num)
return -1;
while (chunk_nr--)
- avio_skip(&pb, avio_rb32(&pb));
- size = avio_rb32(&pb);
+ avio_skip(pb, avio_rb32(pb));
+ size = avio_rb32(pb);
} else {
size = rdt->mlti_data_size;
- avio_seek(&pb, 0, SEEK_SET);
+ avio_seek(pb, 0, SEEK_SET);
}
- if (ff_rm_read_mdpr_codecdata(rdt->rmctx, &pb, st, rdt->rmst[st->index], size, NULL) < 0)
+ if (ff_rm_read_mdpr_codecdata(rdt->rmctx, pb, st, rdt->rmst[st->index], size, NULL) < 0)
return -1;
return 0;
@@ -296,16 +297,16 @@ rdt_parse_packet (AVFormatContext *ctx, PayloadContext *rdt, AVStream *st,
const uint8_t *buf, int len, uint16_t rtp_seq, int flags)
{
int seq = 1, res;
- AVIOContext pb;
if (rdt->audio_pkt_cnt == 0) {
+ FFIOContext pb;
int pos, rmflags;
ffio_init_context(&pb, (uint8_t *)buf, len, 0, NULL, NULL, NULL, NULL);
rmflags = (flags & RTP_FLAG_KEY) ? 2 : 0;
- res = ff_rm_parse_packet (rdt->rmctx, &pb, st, rdt->rmst[st->index], len, pkt,
- &seq, rmflags, *timestamp);
- pos = avio_tell(&pb);
+ res = ff_rm_parse_packet(rdt->rmctx, &pb.pub, st, rdt->rmst[st->index],
+ len, pkt, &seq, rmflags, *timestamp);
+ pos = avio_tell(&pb.pub);
if (res < 0)
return res;
if (res > 0) {
diff --git a/libavformat/rtpdec_asf.c b/libavformat/rtpdec_asf.c
index 3802a57407..7812117228 100644
--- a/libavformat/rtpdec_asf.c
+++ b/libavformat/rtpdec_asf.c
@@ -87,20 +87,20 @@ static int packetizer_read(void *opaque, uint8_t *buf, int buf_size)
return AVERROR(EAGAIN);
}
-static void init_packetizer(AVIOContext *pb, uint8_t *buf, int len)
+static void init_packetizer(FFIOContext *pb, uint8_t *buf, int len)
{
ffio_init_context(pb, buf, len, 0, NULL, packetizer_read, NULL, NULL);
/* this "fills" the buffer with its current content */
- pb->pos = len;
- pb->buf_end = buf + len;
+ pb->pub.pos = len;
+ pb->pub.buf_end = buf + len;
}
int ff_wms_parse_sdp_a_line(AVFormatContext *s, const char *p)
{
int ret = 0;
if (av_strstart(p, "pgmpu:data:application/vnd.ms.wms-hdr.asfv1;base64,", &p)) {
- AVIOContext pb = { 0 };
+ FFIOContext pb;
RTSPState *rt = s->priv_data;
AVDictionary *opts = NULL;
int len = strlen(p) * 6 / 8;
@@ -127,7 +127,7 @@ int ff_wms_parse_sdp_a_line(AVFormatContext *s, const char *p)
av_free(buf);
return AVERROR(ENOMEM);
}
- rt->asf_ctx->pb = &pb;
+ rt->asf_ctx->pb = &pb.pub;
av_dict_set(&opts, "no_resync_search", "1", 0);
if ((ret = ff_copy_whiteblacklists(rt->asf_ctx, s)) < 0) {
@@ -138,12 +138,12 @@ int ff_wms_parse_sdp_a_line(AVFormatContext *s, const char *p)
ret = avformat_open_input(&rt->asf_ctx, "", iformat, &opts);
av_dict_free(&opts);
if (ret < 0) {
- av_free(pb.buffer);
+ av_free(pb.pub.buffer);
return ret;
}
av_dict_copy(&s->metadata, rt->asf_ctx->metadata, 0);
- rt->asf_pb_pos = avio_tell(&pb);
- av_free(pb.buffer);
+ rt->asf_pb_pos = avio_tell(&pb.pub);
+ av_free(pb.pub.buffer);
rt->asf_ctx->pb = NULL;
}
return ret;
@@ -178,7 +178,8 @@ static int asfrtp_parse_sdp_line(AVFormatContext *s, int stream_index,
}
struct PayloadContext {
- AVIOContext *pktbuf, pb;
+ FFIOContext pb;
+ AVIOContext *pktbuf;
uint8_t *buf;
};
@@ -193,7 +194,8 @@ static int asfrtp_parse_packet(AVFormatContext *s, PayloadContext *asf,
const uint8_t *buf, int len, uint16_t seq,
int flags)
{
- AVIOContext *pb = &asf->pb;
+ FFIOContext *const pb0 = &asf->pb;
+ AVIOContext *const pb = &pb0->pub;
int res, mflags, len_off;
RTSPState *rt = s->priv_data;
@@ -208,7 +210,7 @@ static int asfrtp_parse_packet(AVFormatContext *s, PayloadContext *asf,
av_freep(&asf->buf);
- ffio_init_context(pb, (uint8_t *)buf, len, 0, NULL, NULL, NULL, NULL);
+ ffio_init_context(pb0, (uint8_t *)buf, len, 0, NULL, NULL, NULL, NULL);
while (avio_tell(pb) + 4 < len) {
int start_off = avio_tell(pb);
@@ -267,7 +269,7 @@ static int asfrtp_parse_packet(AVFormatContext *s, PayloadContext *asf,
}
}
- init_packetizer(pb, asf->buf, out_len);
+ init_packetizer(pb0, asf->buf, out_len);
pb->pos += rt->asf_pb_pos;
pb->eof_reached = 0;
rt->asf_ctx->pb = pb;
diff --git a/libavformat/rtpdec_qt.c b/libavformat/rtpdec_qt.c
index 492a1b6715..6723cd1bb0 100644
--- a/libavformat/rtpdec_qt.c
+++ b/libavformat/rtpdec_qt.c
@@ -54,7 +54,8 @@ static int qt_rtp_parse_packet(AVFormatContext *s, PayloadContext *qt,
uint32_t *timestamp, const uint8_t *buf,
int len, uint16_t seq, int flags)
{
- AVIOContext pb;
+ FFIOContext pb0;
+ AVIOContext *const pb = &pb0.pub;
GetBitContext gb;
int packing_scheme, has_payload_desc, has_packet_info, alen,
has_marker_bit = flags & RTP_FLAG_MARKER,
@@ -82,7 +83,7 @@ static int qt_rtp_parse_packet(AVFormatContext *s, PayloadContext *qt,
* http://developer.apple.com/quicktime/icefloe/dispatch026.html
*/
init_get_bits(&gb, buf, len << 3);
- ffio_init_context(&pb, (uint8_t*)buf, len, 0, NULL, NULL, NULL, NULL);
+ ffio_init_context(&pb0, (uint8_t*)buf, len, 0, NULL, NULL, NULL, NULL);
if (len < 4)
return AVERROR_INVALIDDATA;
@@ -114,22 +115,22 @@ static int qt_rtp_parse_packet(AVFormatContext *s, PayloadContext *qt,
skip_bits(&gb, 12); // reserved
data_len = get_bits(&gb, 16);
- avio_seek(&pb, pos + 4, SEEK_SET);
- tag = avio_rl32(&pb);
+ avio_seek(pb, pos + 4, SEEK_SET);
+ tag = avio_rl32(pb);
if ((st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
tag != MKTAG('v','i','d','e')) ||
(st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
tag != MKTAG('s','o','u','n')))
return AVERROR_INVALIDDATA;
- avpriv_set_pts_info(st, 32, 1, avio_rb32(&pb));
+ avpriv_set_pts_info(st, 32, 1, avio_rb32(pb));
if (pos + data_len > len)
return AVERROR_INVALIDDATA;
/* TLVs */
- while (avio_tell(&pb) + 4 < pos + data_len) {
- int tlv_len = avio_rb16(&pb);
- tag = avio_rl16(&pb);
- if (avio_tell(&pb) + tlv_len > pos + data_len)
+ while (avio_tell(pb) + 4 < pos + data_len) {
+ int tlv_len = avio_rb16(pb);
+ tag = avio_rl16(pb);
+ if (avio_tell(pb) + tlv_len > pos + data_len)
return AVERROR_INVALIDDATA;
#define MKTAG16(a,b) MKTAG(a,b,0,0)
@@ -151,7 +152,7 @@ static int qt_rtp_parse_packet(AVFormatContext *s, PayloadContext *qt,
/* ff_mov_read_stsd_entries updates stream s->nb_streams-1,
* so set it temporarily to indicate which stream to update. */
s->nb_streams = st->index + 1;
- ff_mov_read_stsd_entries(mc, &pb, 1);
+ ff_mov_read_stsd_entries(mc, pb, 1);
qt->bytes_per_frame = msc->bytes_per_frame;
av_free(msc);
av_free(mc);
@@ -160,22 +161,22 @@ static int qt_rtp_parse_packet(AVFormatContext *s, PayloadContext *qt,
break;
}
default:
- avio_skip(&pb, tlv_len);
+ avio_skip(pb, tlv_len);
break;
}
}
/* 32-bit alignment */
- avio_skip(&pb, ((avio_tell(&pb) + 3) & ~3) - avio_tell(&pb));
+ avio_skip(pb, ((avio_tell(pb) + 3) & ~3) - avio_tell(pb));
} else
- avio_seek(&pb, 4, SEEK_SET);
+ avio_seek(pb, 4, SEEK_SET);
if (has_packet_info) {
avpriv_request_sample(s, "RTP-X-QT with packet-specific info");
return AVERROR_PATCHWELCOME;
}
- alen = len - avio_tell(&pb);
+ alen = len - avio_tell(pb);
if (alen <= 0)
return AVERROR_INVALIDDATA;
@@ -197,7 +198,7 @@ static int qt_rtp_parse_packet(AVFormatContext *s, PayloadContext *qt,
qt->pkt->size = 0;
qt->timestamp = *timestamp;
}
- memcpy(qt->pkt->data + qt->pkt->size, buf + avio_tell(&pb), alen);
+ memcpy(qt->pkt->data + qt->pkt->size, buf + avio_tell(pb), alen);
qt->pkt->size += alen;
if (has_marker_bit) {
int ret = av_packet_from_data(pkt, qt->pkt->data, qt->pkt->size);
@@ -220,7 +221,7 @@ static int qt_rtp_parse_packet(AVFormatContext *s, PayloadContext *qt,
qt->remaining = (alen / qt->bytes_per_frame) - 1;
if ((ret = av_new_packet(pkt, qt->bytes_per_frame)) < 0)
return ret;
- memcpy(pkt->data, buf + avio_tell(&pb), qt->bytes_per_frame);
+ memcpy(pkt->data, buf + avio_tell(pb), qt->bytes_per_frame);
pkt->flags = keyframe ? AV_PKT_FLAG_KEY : 0;
pkt->stream_index = st->index;
if (qt->remaining > 0) {
@@ -232,7 +233,7 @@ static int qt_rtp_parse_packet(AVFormatContext *s, PayloadContext *qt,
}
qt->pkt->size = qt->remaining * qt->bytes_per_frame;
memcpy(qt->pkt->data,
- buf + avio_tell(&pb) + qt->bytes_per_frame,
+ buf + avio_tell(pb) + qt->bytes_per_frame,
qt->remaining * qt->bytes_per_frame);
qt->pkt->flags = pkt->flags;
return 1;
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 9869e1b72e..3772a7f2a9 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -2496,7 +2496,7 @@ static int rtp_read_header(AVFormatContext *s)
int payload_type;
AVCodecParameters *par = NULL;
struct sockaddr_storage addr;
- AVIOContext pb;
+ FFIOContext pb;
socklen_t addrlen = sizeof(addr);
RTSPState *rt = s->priv_data;
const char *p;
@@ -2594,7 +2594,7 @@ static int rtp_read_header(AVFormatContext *s)
avcodec_parameters_free(&par);
ffio_init_context(&pb, sdp.str, sdp.len, 0, NULL, NULL, NULL, NULL);
- s->pb = &pb;
+ s->pb = &pb.pub;
/* if sdp_read_header() fails then following ff_network_close() cancels out */
/* ff_network_init() at the start of this function. Otherwise it cancels out */
diff --git a/libavformat/sapdec.c b/libavformat/sapdec.c
index a852b0782b..fd0e662433 100644
--- a/libavformat/sapdec.c
+++ b/libavformat/sapdec.c
@@ -35,7 +35,7 @@
struct SAPState {
URLContext *ann_fd;
AVFormatContext *sdp_ctx;
- AVIOContext sdp_pb;
+ FFIOContext sdp_pb;
uint16_t hash;
char *sdp;
int eof;
@@ -160,7 +160,7 @@ static int sap_read_header(AVFormatContext *s)
goto fail;
}
sap->sdp_ctx->max_delay = s->max_delay;
- sap->sdp_ctx->pb = &sap->sdp_pb;
+ sap->sdp_ctx->pb = &sap->sdp_pb.pub;
sap->sdp_ctx->interrupt_callback = s->interrupt_callback;
if ((ret = ff_copy_whiteblacklists(sap->sdp_ctx, s)) < 0)
diff --git a/libavformat/subtitles.c b/libavformat/subtitles.c
index f80a439bcc..c6701c6a60 100644
--- a/libavformat/subtitles.c
+++ b/libavformat/subtitles.c
@@ -51,9 +51,8 @@ void ff_text_init_avio(void *s, FFTextReader *r, AVIOContext *pb)
void ff_text_init_buf(FFTextReader *r, void *buf, size_t size)
{
- memset(&r->buf_pb, 0, sizeof(r->buf_pb));
ffio_init_context(&r->buf_pb, buf, size, 0, NULL, NULL, NULL, NULL);
- ff_text_init_avio(NULL, r, &r->buf_pb);
+ ff_text_init_avio(NULL, r, &r->buf_pb.pub);
}
int64_t ff_text_pos(FFTextReader *r)
diff --git a/libavformat/subtitles.h b/libavformat/subtitles.h
index 37ca7b19b1..4460efacf3 100644
--- a/libavformat/subtitles.h
+++ b/libavformat/subtitles.h
@@ -25,6 +25,7 @@
#include <stddef.h>
#include "avformat.h"
#include "libavutil/bprint.h"
+#include "avio_internal.h"
enum sub_sort {
SUB_SORT_TS_POS = 0, ///< sort by timestamps, then position
@@ -42,7 +43,7 @@ typedef struct {
AVIOContext *pb;
unsigned char buf[8];
int buf_pos, buf_len;
- AVIOContext buf_pb;
+ FFIOContext buf_pb;
} FFTextReader;
/**
diff --git a/libavformat/thp.c b/libavformat/thp.c
index 7aad24221b..7103cf4f8a 100644
--- a/libavformat/thp.c
+++ b/libavformat/thp.c
@@ -22,6 +22,7 @@
#include "libavutil/intreadwrite.h"
#include "libavutil/intfloat.h"
#include "avformat.h"
+#include "avio_internal.h"
#include "internal.h"
typedef struct ThpDemuxContext {
@@ -65,6 +66,7 @@ static int thp_read_header(AVFormatContext *s)
AVStream *st;
AVIOContext *pb = s->pb;
int64_t fsize= avio_size(pb);
+ uint32_t maxsize;
int i;
/* Read the file header. */
@@ -79,9 +81,10 @@ static int thp_read_header(AVFormatContext *s)
return AVERROR_INVALIDDATA;
thp->framecnt = avio_rb32(pb);
thp->first_framesz = avio_rb32(pb);
- pb->maxsize = avio_rb32(pb);
- if(fsize>0 && (!pb->maxsize || fsize < pb->maxsize))
- pb->maxsize= fsize;
+ maxsize = avio_rb32(pb);
+ if (fsize > 0 && (!maxsize || fsize < maxsize))
+ maxsize = fsize;
+ ffiocontext(pb)->maxsize = fsize;
thp->compoff = avio_rb32(pb);
avio_rb32(pb); /* offsetDataOffset. */
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 9706b141ad..4caa3017fb 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -230,7 +230,7 @@ static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
if (read_size > SANE_CHUNK_SIZE/10) {
read_size = ffio_limit(s, read_size);
// If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
- if (s->maxsize < 0)
+ if (ffiocontext(s)->maxsize < 0)
read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
}
@@ -1972,6 +1972,7 @@ void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
int64_t skip = 0;
//We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
const char *proto = avio_find_protocol_name(s->url);
+ FFIOContext *ctx;
av_assert0(time_tolerance >= 0);
@@ -2012,6 +2013,7 @@ void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
}
pos_delta *= 2;
+ ctx = ffiocontext(s->pb);
/* XXX This could be adjusted depending on protocol*/
if (s->pb->buffer_size < pos_delta && pos_delta < (1<<24)) {
av_log(s, AV_LOG_VERBOSE, "Reconfiguring buffers to size %"PRId64"\n", pos_delta);
@@ -2022,11 +2024,11 @@ void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance)
return;
}
- s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, pos_delta/2);
+ ctx->short_seek_threshold = FFMAX(ctx->short_seek_threshold, pos_delta/2);
}
if (skip < (1<<23)) {
- s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, skip);
+ ctx->short_seek_threshold = FFMAX(ctx->short_seek_threshold, skip);
}
}
@@ -3556,9 +3558,11 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
max_stream_analyze_duration = 7*AV_TIME_BASE;
}
- if (ic->pb)
+ if (ic->pb) {
+ FFIOContext *const ctx = ffiocontext(ic->pb);
av_log(ic, AV_LOG_DEBUG, "Before avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d nb_streams:%d\n",
- avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, ic->nb_streams);
+ avio_tell(ic->pb), ctx->bytes_read, ctx->seek_count, ic->nb_streams);
+ }
for (i = 0; i < ic->nb_streams; i++) {
const AVCodec *codec;
@@ -4069,9 +4073,11 @@ find_stream_info_err:
av_freep(&ic->streams[i]->internal->info);
av_bsf_free(&ic->streams[i]->internal->extract_extradata.bsf);
}
- if (ic->pb)
+ if (ic->pb) {
+ FFIOContext *const ctx = ffiocontext(ic->pb);
av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
- avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
+ avio_tell(ic->pb), ctx->bytes_read, ctx->seek_count, count);
+ }
return ret;
unref_then_goto_end:
diff --git a/libavformat/vividas.c b/libavformat/vividas.c
index 8d1c1dab29..d7a6e74650 100644
--- a/libavformat/vividas.c
+++ b/libavformat/vividas.c
@@ -283,9 +283,10 @@ static int track_header(VividasDemuxContext *viv, AVFormatContext *s, uint8_t *
int64_t off;
int val_1;
int num_video;
- AVIOContext pb0, *pb = &pb0;
+ FFIOContext pb0;
+ AVIOContext *const pb = &pb0.pub;
- ffio_init_context(pb, buf, size, 0, NULL, NULL, NULL, NULL);
+ ffio_init_context(&pb0, buf, size, 0, NULL, NULL, NULL, NULL);
ffio_read_varlen(pb); // track_header_len
avio_r8(pb); // '1'
@@ -436,12 +437,13 @@ static int track_index(VividasDemuxContext *viv, AVFormatContext *s, uint8_t *bu
int64_t off;
int64_t poff;
int maxnp=0;
- AVIOContext pb0, *pb = &pb0;
+ FFIOContext pb0;
+ AVIOContext *const pb = &pb0.pub;
int i;
int64_t filesize = avio_size(s->pb);
uint64_t n_sb_blocks_tmp;
- ffio_init_context(pb, buf, size, 0, NULL, NULL, NULL, NULL);
+ ffio_init_context(&pb0, buf, size, 0, NULL, NULL, NULL, NULL);
ffio_read_varlen(pb); // track_index_len
avio_r8(pb); // 'c'