diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2019-12-03 18:09:10 +0100 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2019-12-04 23:11:37 -0300 |
commit | d5274f86a838ae5f9d56f41c6ee520cce466bd83 (patch) | |
tree | ec4fed5f74a3ecf0f6733eae45fe2cb545670ac8 /libavformat/matroskadec.c | |
parent | dbe3be674459baf310d55eaaf85ac0fb2d89aaff (diff) | |
download | ffmpeg-d5274f86a838ae5f9d56f41c6ee520cce466bd83.tar.gz |
avformat/matroskadec: Reuse AVIOContext
When parsing EBML lacing, for every number read, a new AVIOContext has
been initialized (via ffio_init_context()) just for this number. This
has been changed: The context is kept now.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavformat/matroskadec.c')
-rw-r--r-- | libavformat/matroskadec.c | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 6c81d1c4c8..162697ff12 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -1024,28 +1024,17 @@ static int ebml_read_master(MatroskaDemuxContext *matroska, } /* - * Read signed/unsigned "EBML" numbers. + * Read a signed "EBML number" * Return: number of bytes processed, < 0 on error */ -static int matroska_ebmlnum_uint(MatroskaDemuxContext *matroska, - uint8_t *data, uint32_t size, uint64_t *num) -{ - AVIOContext pb; - ffio_init_context(&pb, data, size, 0, NULL, NULL, NULL, NULL); - return ebml_read_num(matroska, &pb, FFMIN(size, 8), num, 1); -} - -/* - * Same as above, but signed. - */ static int matroska_ebmlnum_sint(MatroskaDemuxContext *matroska, - uint8_t *data, uint32_t size, int64_t *num) + AVIOContext *pb, int64_t *num) { uint64_t unum; int res; /* read as unsigned number first */ - if ((res = matroska_ebmlnum_uint(matroska, data, size, &unum)) < 0) + if ((res = ebml_read_num(matroska, pb, 8, &unum, 1)) < 0) return res; /* make signed (weird way) */ @@ -2989,7 +2978,7 @@ static void matroska_clear_queue(MatroskaDemuxContext *matroska) } static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf, - int size, int type, + int size, int type, AVIOContext *pb, uint32_t lace_size[256], int *laces) { int n; @@ -3047,27 +3036,33 @@ static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf, { uint64_t num; uint64_t total; - n = matroska_ebmlnum_uint(matroska, data, size, &num); + int offset; + + avio_skip(pb, 4); + + n = ebml_read_num(matroska, pb, 8, &num, 1); if (n < 0) return n; if (num > INT_MAX) return AVERROR_INVALIDDATA; - data += n; - size -= n; + total = lace_size[0] = num; + offset = n; for (n = 1; n < *laces - 1; n++) { int64_t snum; int r; - r = matroska_ebmlnum_sint(matroska, data, size, &snum); + r = matroska_ebmlnum_sint(matroska, pb, &snum); if (r < 0) return r; if (lace_size[n - 1] + snum > (uint64_t)INT_MAX) return AVERROR_INVALIDDATA; - data += r; - size -= r; + lace_size[n] = lace_size[n - 1] + snum; total += lace_size[n]; + offset += r; } + data += offset; + size -= offset; if (size <= total) { return AVERROR_INVALIDDATA; } @@ -3510,6 +3505,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf { uint64_t timecode = AV_NOPTS_VALUE; MatroskaTrack *track; + AVIOContext pb; int res = 0; AVStream *st; int16_t block_time; @@ -3518,9 +3514,10 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf uint64_t num; int trust_default_duration = 1; - if ((n = matroska_ebmlnum_uint(matroska, data, size, &num)) < 0) { + ffio_init_context(&pb, data, size, 0, NULL, NULL, NULL, NULL); + + if ((n = ebml_read_num(matroska, &pb, 8, &num, 1)) < 0) return n; - } data += n; size -= n; @@ -3572,7 +3569,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf } res = matroska_parse_laces(matroska, &data, size, (flags & 0x06) >> 1, - lace_size, &laces); + &pb, lace_size, &laces); if (res < 0) { av_log(matroska->ctx, AV_LOG_ERROR, "Error parsing frame sizes.\n"); return res; |