summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurelien Jacobs <aurel@gnuage.org>2010-06-11 16:34:01 +0000
committerAurelien Jacobs <aurel@gnuage.org>2010-06-11 16:34:01 +0000
commitc3ade62ca3d2823bbcaea135e9af4518acc7a737 (patch)
tree4f8e12aa32dd9496507d2d1ffeee4b2a44fda0d8
parent6c58adf3b74b894bb6d3c47323aa4d03fb4995ea (diff)
matroskadec: store the ID of the currently parsed ebml element
This allows to interrupt parsing after reading an ID, and then properly recover parsing. Originally committed as revision 23587 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/matroskadec.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index ca2338d0a6..9c6c633457 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -214,6 +214,7 @@ typedef struct {
int num_levels;
MatroskaLevel levels[EBML_MAX_DEPTH];
int level_up;
+ uint32_t current_id;
uint64_t time_scale;
double duration;
@@ -724,12 +725,14 @@ static int ebml_parse_id(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,
static int ebml_parse(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,
void *data)
{
+ if (!matroska->current_id) {
uint64_t id;
int res = ebml_read_num(matroska, matroska->ctx->pb, 4, &id);
if (res < 0)
return res;
- id |= 1 << 7*res;
- return ebml_parse_id(matroska, syntax, id, data);
+ matroska->current_id = id | 1 << 7*res;
+ }
+ return ebml_parse_id(matroska, syntax, matroska->current_id, data);
}
static int ebml_parse_nest(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,
@@ -774,9 +777,11 @@ static int ebml_parse_elem(MatroskaDemuxContext *matroska,
list->nb_elem++;
}
- if (syntax->type != EBML_PASS && syntax->type != EBML_STOP)
+ if (syntax->type != EBML_PASS && syntax->type != EBML_STOP) {
+ matroska->current_id = 0;
if ((res = ebml_read_num(matroska, pb, 8, &length)) < 0)
return res;
+ }
switch (syntax->type) {
case EBML_UINT: res = ebml_read_uint (pb, length, data); break;
@@ -1063,6 +1068,7 @@ static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
MatroskaSeekhead *seekhead = seekhead_list->elem;
uint32_t level_up = matroska->level_up;
int64_t before_pos = url_ftell(matroska->ctx->pb);
+ uint32_t saved_id = matroska->current_id;
MatroskaLevel level;
int i;
@@ -1096,6 +1102,7 @@ static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
level.length = (uint64_t)-1;
matroska->levels[matroska->num_levels] = level;
matroska->num_levels++;
+ matroska->current_id = 0;
ebml_parse(matroska, matroska_segment, matroska);
@@ -1110,6 +1117,7 @@ static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
/* seek back */
url_fseek(matroska->ctx->pb, before_pos, SEEK_SET);
matroska->level_up = level_up;
+ matroska->current_id = saved_id;
}
static int matroska_aac_profile(char *codec_id)