|
|
|
@ -2701,40 +2701,40 @@ matroska_read_packet (AVFormatContext *s, |
|
|
|
|
/* Read stream until we have a packet queued. */ |
|
|
|
|
while (matroska_deliver_packet(matroska, pkt)) { |
|
|
|
|
|
|
|
|
|
/* Have we already reached the end? */ |
|
|
|
|
if (matroska->done) |
|
|
|
|
return AVERROR_IO; |
|
|
|
|
|
|
|
|
|
while (res == 0) { |
|
|
|
|
if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { |
|
|
|
|
/* Have we already reached the end? */ |
|
|
|
|
if (matroska->done) |
|
|
|
|
return AVERROR_IO; |
|
|
|
|
} else if (matroska->level_up) { |
|
|
|
|
matroska->level_up--; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch (id) { |
|
|
|
|
case MATROSKA_ID_CLUSTER: |
|
|
|
|
if ((res = ebml_read_master(matroska, &id)) < 0) |
|
|
|
|
break; |
|
|
|
|
if ((res = matroska_parse_cluster(matroska)) == 0) |
|
|
|
|
res = 1; /* Parsed one cluster, let's get out. */ |
|
|
|
|
while (res == 0) { |
|
|
|
|
if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { |
|
|
|
|
return AVERROR_IO; |
|
|
|
|
} else if (matroska->level_up) { |
|
|
|
|
matroska->level_up--; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
case EBML_ID_VOID: |
|
|
|
|
res = ebml_read_skip(matroska); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
switch (id) { |
|
|
|
|
case MATROSKA_ID_CLUSTER: |
|
|
|
|
if ((res = ebml_read_master(matroska, &id)) < 0) |
|
|
|
|
break; |
|
|
|
|
if ((res = matroska_parse_cluster(matroska)) == 0) |
|
|
|
|
res = 1; /* Parsed one cluster, let's get out. */ |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
if (matroska->level_up) { |
|
|
|
|
matroska->level_up--; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
case EBML_ID_VOID: |
|
|
|
|
res = ebml_read_skip(matroska); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (matroska->level_up) { |
|
|
|
|
matroska->level_up--; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (res == -1) |
|
|
|
|
matroska->done = 1; |
|
|
|
|
if (res == -1) |
|
|
|
|
matroska->done = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|