summaryrefslogtreecommitdiff
path: root/libavformat/matroskadec.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2019-12-03 18:09:10 +0100
committerJames Almer <jamrial@gmail.com>2019-12-04 23:11:37 -0300
commitd5274f86a838ae5f9d56f41c6ee520cce466bd83 (patch)
treeec4fed5f74a3ecf0f6733eae45fe2cb545670ac8 /libavformat/matroskadec.c
parentdbe3be674459baf310d55eaaf85ac0fb2d89aaff (diff)
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.c45
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;