diff options
author | Marton Balint <cus@passwd.hu> | 2020-09-26 20:36:25 +0200 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2020-10-09 21:07:18 +0200 |
commit | 1490a682dc06d868c5170635cad92948c7f28cfb (patch) | |
tree | 0ea02bd33a9a28b2e5dd89f576ec83d42c8195ca | |
parent | 2933ee8ff09f3a9e2ae313da80b0a510474f53f4 (diff) |
avformat/mpjpegdec: make sure we seek back to the ensured buffer
It was possible for the old code to seek back before the most recently read
data if start of a new multipart was across read boundaries. Now we read some
small sections multiple times to avoid this, but that is OK.
Signed-off-by: Marton Balint <cus@passwd.hu>
-rw-r--r-- | libavformat/mpjpegdec.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/libavformat/mpjpegdec.c b/libavformat/mpjpegdec.c index df2880412d..5fe00fd162 100644 --- a/libavformat/mpjpegdec.c +++ b/libavformat/mpjpegdec.c @@ -328,18 +328,18 @@ static int mpjpeg_read_packet(AVFormatContext *s, AVPacket *pkt) ret = av_get_packet(s->pb, pkt, size); } else { /* no size was given -- we read until the next boundary or end-of-file */ - int remaining = 0, len; + int len; const int read_chunk = 2048; pkt->pos = avio_tell(s->pb); - while ((ret = ffio_ensure_seekback(s->pb, read_chunk - remaining)) >= 0 && /* we may need to return as much as all we've read back to the buffer */ - (ret = av_append_packet(s->pb, pkt, read_chunk - remaining)) >= 0) { + while ((ret = ffio_ensure_seekback(s->pb, read_chunk)) >= 0 && /* we may need to return as much as all we've read back to the buffer */ + (ret = av_append_packet(s->pb, pkt, read_chunk)) >= 0) { /* scan the new data */ char *start; - len = ret + remaining; + len = ret; start = pkt->data + pkt->size - len; do { if (!memcmp(start, mpjpeg->searchstr, mpjpeg->searchstr_len)) { @@ -351,7 +351,8 @@ static int mpjpeg_read_packet(AVFormatContext *s, AVPacket *pkt) len--; start++; } while (len >= mpjpeg->searchstr_len); - remaining = len; + avio_seek(s->pb, -len, SEEK_CUR); + pkt->size -= len; } /* error or EOF occurred */ |