LoadCluster passes back posn and size
Change-Id: I91b3c2234f7621139a5cae2d71af7301a30c027e
This commit is contained in:
parent
6c45ab2d4c
commit
e1e757f919
100
mkvparser.cpp
100
mkvparser.cpp
@ -29,80 +29,6 @@ long long mkvparser::ReadUInt(IMkvReader* pReader, long long pos, long& len)
|
||||
assert(pReader);
|
||||
assert(pos >= 0);
|
||||
|
||||
#if 0
|
||||
unsigned char b;
|
||||
|
||||
int hr = pReader->Read(pos, 1, &b);
|
||||
|
||||
if (hr < 0)
|
||||
return hr;
|
||||
|
||||
assert(hr == 0L);
|
||||
|
||||
if (b & 0x80) //1000 0000
|
||||
{
|
||||
len = 1;
|
||||
b &= 0x7F; //0111 1111
|
||||
}
|
||||
else if (b & 0x40) //0100 0000
|
||||
{
|
||||
len = 2;
|
||||
b &= 0x3F; //0011 1111
|
||||
}
|
||||
else if (b & 0x20) //0010 0000
|
||||
{
|
||||
len = 3;
|
||||
b &= 0x1F; //0001 1111
|
||||
}
|
||||
else if (b & 0x10) //0001 0000
|
||||
{
|
||||
len = 4;
|
||||
b &= 0x0F; //0000 1111
|
||||
}
|
||||
else if (b & 0x08) //0000 1000
|
||||
{
|
||||
len = 5;
|
||||
b &= 0x07; //0000 0111
|
||||
}
|
||||
else if (b & 0x04) //0000 0100
|
||||
{
|
||||
len = 6;
|
||||
b &= 0x03; //0000 0011
|
||||
}
|
||||
else if (b & 0x02) //0000 0010
|
||||
{
|
||||
len = 7;
|
||||
b &= 0x01; //0000 0001
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(b & 0x01); //0000 0001
|
||||
len = 8;
|
||||
b = 0; //0000 0000
|
||||
}
|
||||
|
||||
//assert((available - pos) >= len);
|
||||
|
||||
long long result = b;
|
||||
++pos;
|
||||
|
||||
for (long i = 1; i < len; ++i)
|
||||
{
|
||||
hr = pReader->Read(pos, 1, &b);
|
||||
|
||||
if (hr < 0)
|
||||
return hr;
|
||||
|
||||
assert(hr == 0L);
|
||||
|
||||
result <<= 8;
|
||||
result |= b;
|
||||
|
||||
++pos;
|
||||
}
|
||||
|
||||
return result;
|
||||
#else
|
||||
int status;
|
||||
|
||||
#ifdef _DEBUG
|
||||
@ -161,7 +87,6 @@ long long mkvparser::ReadUInt(IMkvReader* pReader, long long pos, long& len)
|
||||
}
|
||||
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
|
||||
long long mkvparser::GetUIntLength(
|
||||
@ -174,8 +99,9 @@ long long mkvparser::GetUIntLength(
|
||||
|
||||
long long total, available;
|
||||
|
||||
long hr = pReader->Length(&total, &available);
|
||||
assert(hr >= 0);
|
||||
int status = pReader->Length(&total, &available);
|
||||
assert(status >= 0);
|
||||
assert(total >= 0);
|
||||
assert(available <= total);
|
||||
|
||||
if (pos >= available)
|
||||
@ -183,12 +109,12 @@ long long mkvparser::GetUIntLength(
|
||||
|
||||
unsigned char b;
|
||||
|
||||
hr = pReader->Read(pos, 1, &b);
|
||||
status = pReader->Read(pos, 1, &b);
|
||||
|
||||
if (hr < 0)
|
||||
return hr;
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
assert(hr == 0L);
|
||||
assert(status == 0);
|
||||
|
||||
if (b == 0) //we can't handle u-int values larger than 8 bytes
|
||||
return E_FILE_FORMAT_INVALID;
|
||||
@ -1233,15 +1159,17 @@ bool Segment::AddCluster(long long off, long long pos)
|
||||
}
|
||||
|
||||
|
||||
long Segment::LoadCluster()
|
||||
long Segment::LoadCluster(
|
||||
long long& pos,
|
||||
long& len)
|
||||
{
|
||||
const long long stop = m_start + m_size;
|
||||
|
||||
while (m_pos < stop)
|
||||
{
|
||||
long long pos = m_pos;
|
||||
pos = m_pos;
|
||||
|
||||
long len;
|
||||
//Read ID
|
||||
|
||||
long long result = GetUIntLength(m_pReader, pos, len);
|
||||
|
||||
@ -1263,6 +1191,7 @@ long Segment::LoadCluster()
|
||||
pos += len; //consume ID
|
||||
|
||||
//Read Size
|
||||
|
||||
result = GetUIntLength(m_pReader, pos, len);
|
||||
|
||||
if (result < 0) //error
|
||||
@ -1300,7 +1229,10 @@ long Segment::LoadCluster()
|
||||
assert(avail <= total);
|
||||
|
||||
if ((pos + size) > avail)
|
||||
{
|
||||
len = static_cast<long>(size);
|
||||
return E_BUFFER_NOT_FULL;
|
||||
}
|
||||
|
||||
if (id == 0x0C53BB6B) //Cues ID
|
||||
{
|
||||
|
@ -529,10 +529,11 @@ public:
|
||||
|
||||
long Load(); //loads headers and all clusters
|
||||
|
||||
//for incremental loading (splitter)
|
||||
//for incremental loading
|
||||
long long Unparsed() const;
|
||||
long long ParseHeaders(); //stops when first cluster is found
|
||||
long LoadCluster(); //loads one cluster
|
||||
long LoadCluster(long long& pos, long& size); //load one cluster
|
||||
long LoadCluster();
|
||||
|
||||
//This pair parses one cluster, but only changes the state of the
|
||||
//segment object when the cluster is actually added to the index.
|
||||
@ -577,7 +578,14 @@ private:
|
||||
|
||||
};
|
||||
|
||||
|
||||
} //end namespace mkvparser
|
||||
|
||||
inline long mkvparser::Segment::LoadCluster()
|
||||
{
|
||||
long long pos;
|
||||
long size;
|
||||
|
||||
return LoadCluster(pos, size);
|
||||
}
|
||||
|
||||
#endif //MKVPARSER_HPP
|
||||
|
Loading…
x
Reference in New Issue
Block a user