|
|
|
@@ -2990,19 +2990,14 @@ static void matroska_clear_queue(MatroskaDemuxContext *matroska) |
|
|
|
|
|
|
|
static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf, |
|
|
|
int *buf_size, int type, |
|
|
|
uint32_t **lace_buf, int *laces) |
|
|
|
uint32_t lace_size[256], int *laces) |
|
|
|
{ |
|
|
|
int res = 0, n, size = *buf_size; |
|
|
|
uint8_t *data = *buf; |
|
|
|
uint32_t *lace_size; |
|
|
|
|
|
|
|
if (!type) { |
|
|
|
*laces = 1; |
|
|
|
*lace_buf = av_malloc(sizeof(**lace_buf)); |
|
|
|
if (!*lace_buf) |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
|
|
|
*lace_buf[0] = size; |
|
|
|
lace_size[0] = size; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -3010,9 +3005,6 @@ static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf, |
|
|
|
*laces = *data + 1; |
|
|
|
data += 1; |
|
|
|
size -= 1; |
|
|
|
lace_size = av_malloc_array(*laces, sizeof(*lace_size)); |
|
|
|
if (!lace_size) |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
|
|
|
switch (type) { |
|
|
|
case 0x1: /* Xiph lacing */ |
|
|
|
@@ -3093,7 +3085,6 @@ static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf, |
|
|
|
} |
|
|
|
|
|
|
|
*buf = data; |
|
|
|
*lace_buf = lace_size; |
|
|
|
*buf_size = size; |
|
|
|
|
|
|
|
return res; |
|
|
|
@@ -3531,7 +3522,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf |
|
|
|
int res = 0; |
|
|
|
AVStream *st; |
|
|
|
int16_t block_time; |
|
|
|
uint32_t *lace_size = NULL; |
|
|
|
uint32_t lace_size[256]; |
|
|
|
int n, flags, laces = 0; |
|
|
|
uint64_t num; |
|
|
|
int trust_default_duration = 1; |
|
|
|
@@ -3590,10 +3581,9 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf |
|
|
|
} |
|
|
|
|
|
|
|
res = matroska_parse_laces(matroska, &data, &size, (flags & 0x06) >> 1, |
|
|
|
&lace_size, &laces); |
|
|
|
|
|
|
|
if (res) |
|
|
|
goto end; |
|
|
|
lace_size, &laces); |
|
|
|
if (res < 0) |
|
|
|
return res; |
|
|
|
|
|
|
|
if (track->audio.samplerate == 8000) { |
|
|
|
// If this is needed for more codecs, then add them here |
|
|
|
@@ -3627,7 +3617,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf |
|
|
|
lace_size[n], |
|
|
|
timecode, pos); |
|
|
|
if (res) |
|
|
|
goto end; |
|
|
|
return res; |
|
|
|
|
|
|
|
} else if (st->codecpar->codec_id == AV_CODEC_ID_WEBVTT) { |
|
|
|
res = matroska_parse_webvtt(matroska, track, st, |
|
|
|
@@ -3635,7 +3625,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf |
|
|
|
timecode, lace_duration, |
|
|
|
pos); |
|
|
|
if (res) |
|
|
|
goto end; |
|
|
|
return res; |
|
|
|
} else { |
|
|
|
res = matroska_parse_frame(matroska, track, st, buf, data, lace_size[n], |
|
|
|
timecode, lace_duration, pos, |
|
|
|
@@ -3643,7 +3633,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf |
|
|
|
additional, additional_id, additional_size, |
|
|
|
discard_padding); |
|
|
|
if (res) |
|
|
|
goto end; |
|
|
|
return res; |
|
|
|
} |
|
|
|
|
|
|
|
if (timecode != AV_NOPTS_VALUE) |
|
|
|
@@ -3652,9 +3642,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf |
|
|
|
size -= lace_size[n]; |
|
|
|
} |
|
|
|
|
|
|
|
end: |
|
|
|
av_free(lace_size); |
|
|
|
return res; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int matroska_parse_cluster(MatroskaDemuxContext *matroska) |
|
|
|
|