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
This commit is contained in:
parent
2b0bcfc917
commit
1b4d327b1c
@ -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…
x
Reference in New Issue
Block a user