matroskadec: simplify check for hierarchy level
authorAurelien Jacobs <aurel@gnuage.org>
Tue, 5 Aug 2008 00:42:08 +0000 (00:42 +0000)
committerAurelien Jacobs <aurel@gnuage.org>
Tue, 5 Aug 2008 00:42:08 +0000 (00:42 +0000)
Originally committed as revision 14594 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/matroskadec.c

index 6a7ab65..f62cc53 100644 (file)
@@ -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;