diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 6a7ab6526a..f62cc53f7f 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -456,29 +456,21 @@ static EbmlSyntax matroska_clusters[] = { }; /* - * Return: the amount of levels in the hierarchy that the - * current element lies higher than the previous one. - * The opposite isn't done - that's auto-done using master - * element reading. + * Return: whether we reached the end of a level in the hierarchy or not */ -static int ebml_read_element_level_up(MatroskaDemuxContext *matroska) +static int ebml_level_end(MatroskaDemuxContext *matroska) { ByteIOContext *pb = matroska->ctx->pb; offset_t pos = url_ftell(pb); - int num = 0; - while (matroska->num_levels > 0) { + if (matroska->num_levels > 0) { MatroskaLevel *level = &matroska->levels[matroska->num_levels - 1]; - - if (pos >= level->start + level->length) { + if (pos - level->start >= level->length) { matroska->num_levels--; - num++; - } else { - break; + return 1; } } - - return num; + return 0; } /* @@ -933,17 +925,10 @@ static int ebml_parse(MatroskaDemuxContext *matroska, EbmlSyntax *syntax, break; } - while (!res) { + while (!res && !ebml_level_end(matroska)) { res2 = ebml_read_element_id(matroska, &id); if (res2 < 0) break; - if (res2 > 0) - matroska->level_up = ebml_read_element_level_up(matroska); - if (matroska->level_up) { - matroska->level_up--; - break; - } - res = ebml_parse_id(matroska, syntax, id, data); if (once) break;