diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-08-05 01:45:21 +0200 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-08-25 23:01:53 +0200 |
commit | 19093100fd5c3100f15a5c41f99e1f5792997b73 (patch) | |
tree | 86001c17598be7398f1fa8b541f4dcfe65729f85 /libavformat/aviobuf.c | |
parent | e75ab15fd4579e7b4d5b12d756caeee338f0f62c (diff) |
avformat/utils: Move ffio_limit() to aviobuf
It is the more natural place for it given that it only deals with I/O;
in fact, the function already has the ffio prefix and its declaration
already is in avio_internal.h.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavformat/aviobuf.c')
-rw-r--r-- | libavformat/aviobuf.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index 164b07ae6a..9322ed38bc 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -1015,6 +1015,31 @@ int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size) return 0; } +int ffio_limit(AVIOContext *s, int size) +{ + if (s->maxsize>= 0) { + int64_t pos = avio_tell(s); + int64_t remaining = s->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 (s->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); + size = remaining + !remaining; + } + } + return size; +} + int ffio_set_buf_size(AVIOContext *s, int buf_size) { uint8_t *buffer; |