diff --git a/libavformat/matroska.c b/libavformat/matroska.c index 47b99ee745..3d6d975690 100644 --- a/libavformat/matroska.c +++ b/libavformat/matroska.c @@ -2375,24 +2375,18 @@ rv_offset(uint8_t *data, int slice, int slices) } static int -matroska_parse_block(MatroskaDemuxContext *matroska, uint64_t cluster_time, +matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size, + int64_t pos, uint64_t cluster_time, int is_keyframe, int *ptrack, AVPacket **ppkt) { - int res; - uint32_t id; + int res = 0; int track; AVPacket *pkt; - uint8_t *data, *origdata; - int size; + uint8_t *origdata = data; int16_t block_time; uint32_t *lace_size = NULL; int n, flags, laces = 0; uint64_t num; - int64_t pos= url_ftell(&matroska->ctx->pb); - - if ((res = ebml_read_binary(matroska, &id, &data, &size)) < 0) - return res; - origdata = data; /* first byte(s): tracknum */ if ((n = matroska_ebmlnum_uint(data, size, &num)) < 0) { @@ -2567,6 +2561,9 @@ matroska_parse_blockgroup (MatroskaDemuxContext *matroska, int is_keyframe = PKT_FLAG_KEY, last_num_packets = matroska->num_packets; uint64_t duration = AV_NOPTS_VALUE; int track = -1; + uint8_t *data; + int size = 0; + int64_t pos = 0; av_log(matroska->ctx, AV_LOG_DEBUG, "parsing blockgroup...\n"); @@ -2584,8 +2581,8 @@ matroska_parse_blockgroup (MatroskaDemuxContext *matroska, * of the harder things, so this code is a bit complicated. * See http://www.matroska.org/ for documentation. */ case MATROSKA_ID_BLOCK: { - res = matroska_parse_block(matroska, cluster_time, - is_keyframe, &track, &pkt); + pos = url_ftell(&matroska->ctx->pb); + res = ebml_read_binary(matroska, &id, &data, &size); break; } @@ -2620,6 +2617,13 @@ matroska_parse_blockgroup (MatroskaDemuxContext *matroska, } } + if (res) + return res; + + if (size > 0) + res = matroska_parse_block(matroska, data, size, pos, cluster_time, + is_keyframe, &track, &pkt); + if (pkt) { if (duration != AV_NOPTS_VALUE) @@ -2637,6 +2641,9 @@ matroska_parse_cluster (MatroskaDemuxContext *matroska) int res = 0; uint32_t id; uint64_t cluster_time = 0; + uint8_t *data; + int64_t pos; + int size; av_log(matroska->ctx, AV_LOG_DEBUG, "parsing cluster at %"PRId64"\n", url_ftell(&matroska->ctx->pb)); @@ -2668,7 +2675,11 @@ matroska_parse_cluster (MatroskaDemuxContext *matroska) break; case MATROSKA_ID_SIMPLEBLOCK: - matroska_parse_block(matroska, cluster_time, -1, NULL, NULL); + pos = url_ftell(&matroska->ctx->pb); + res = ebml_read_binary(matroska, &id, &data, &size); + if (res == 0) + res = matroska_parse_block(matroska, data, size, pos, + cluster_time, -1, NULL, NULL); break; default: