Browse Source

Add a special function to mkv demxuer to parse length values that includes

special-case code to handle all possible encodings of "unknown length".

Originally committed as revision 25049 to svn://svn.ffmpeg.org/ffmpeg/trunk
tags/n0.8
Reimar Döffinger 14 years ago
parent
commit
1b4d327b1c
1 changed files with 15 additions and 1 deletions
  1. +15
    -1
      libavformat/matroskadec.c

+ 15
- 1
libavformat/matroskadec.c View File

@@ -575,6 +575,20 @@ static int ebml_read_num(MatroskaDemuxContext *matroska, ByteIOContext *pb,
return read; return read;
} }


/**
* Read a EBML length value.
* This needs special handling for the "unknown length" case which has multiple
* encodings.
*/
static int ebml_read_length(MatroskaDemuxContext *matroska, ByteIOContext *pb,
uint64_t *number)
{
int res = ebml_read_num(matroska, pb, 8, number);
if (res > 0 && *number + 1 == 1ULL << (7 * res))
*number = 0xffffffffffffffULL;
return res;
}

/* /*
* Read the next element as an unsigned int. * Read the next element as an unsigned int.
* 0 is success, < 0 is failure. * 0 is success, < 0 is failure.
@@ -782,7 +796,7 @@ static int ebml_parse_elem(MatroskaDemuxContext *matroska,


if (syntax->type != EBML_PASS && syntax->type != EBML_STOP) { if (syntax->type != EBML_PASS && syntax->type != EBML_STOP) {
matroska->current_id = 0; matroska->current_id = 0;
if ((res = ebml_read_num(matroska, pb, 8, &length)) < 0)
if ((res = ebml_read_length(matroska, pb, &length)) < 0)
return res; return res;
} }




Loading…
Cancel
Save