libwebm: added UnserializeInt function

Change-Id: I2298e547cd38d3aea04c0c993a67e5e291b8fea8
This commit is contained in:
matthewjheaney 2011-04-05 07:29:02 -07:00
parent ffe5a8e548
commit 3395c36a8e
2 changed files with 79 additions and 11 deletions

View File

@ -345,6 +345,8 @@ double mkvparser::Unserialize8Double(
return result; return result;
} }
#if 0
signed char mkvparser::Unserialize1SInt( signed char mkvparser::Unserialize1SInt(
IMkvReader* pReader, IMkvReader* pReader,
long long pos) long long pos)
@ -427,7 +429,49 @@ short mkvparser::Unserialize2SInt(
return result; return result;
} }
#else
long mkvparser::UnserializeInt(
IMkvReader* pReader,
long long pos,
long size,
long long& result)
{
assert(pReader);
assert(pos >= 0);
assert(size > 0);
assert(size <= 8);
{
signed char b;
const long status = pReader->Read(pos, 1, (unsigned char*)&b);
if (status < 0)
return status;
result = b;
++pos;
}
for (long i = 1; i < size; ++i)
{
unsigned char b;
const long status = pReader->Read(pos, 1, &b);
if (status < 0)
return status;
result <<= 8;
result |= b;
++pos;
}
return 0; //success
}
#endif
bool mkvparser::Match( bool mkvparser::Match(
IMkvReader* pReader, IMkvReader* pReader,
@ -648,7 +692,7 @@ bool mkvparser::Match(
long long total, available; long long total, available;
const long status = pReader->Length(&total, &available); long status = pReader->Length(&total, &available);
assert(status >= 0); assert(status >= 0);
assert((total < 0) || (available <= total)); assert((total < 0) || (available <= total));
@ -662,19 +706,24 @@ bool mkvparser::Match(
pos += len; //consume id pos += len; //consume id
const long long size = ReadUInt(pReader, pos, len); const long long size_ = ReadUInt(pReader, pos, len);
assert(size <= 2); assert(size_ >= 1);
assert(size_ <= 2);
assert((pos + len) <= available); assert((pos + len) <= available);
pos += len; //consume length of size of payload pos += len; //consume length of size of payload
assert((pos + size) <= available); assert((pos + size_) <= available);
//TODO: const long size = static_cast<long>(size_);
// Generalize this to work for any size signed int
if (size == 1) long long value;
val = Unserialize1SInt(pReader, pos);
else status = UnserializeInt(pReader, pos, size, value);
val = Unserialize2SInt(pReader, pos); assert(status == 0);
assert(value >= SHRT_MIN);
assert(value <= SHRT_MAX);
val = static_cast<short>(value);
pos += size; //consume size of payload pos += size; //consume size of payload
@ -7894,12 +7943,25 @@ Block::Block(long long start, long long size_, IMkvReader* pReader) :
pos += len; //consume track number pos += len; //consume track number
assert((stop - pos) >= 2); assert((stop - pos) >= 2);
long status;
#if 0
m_timecode = Unserialize2SInt(pReader, pos); m_timecode = Unserialize2SInt(pReader, pos);
#else
long long value;
status = UnserializeInt(pReader, pos, 2, value);
assert(status == 0);
assert(value >= SHRT_MIN);
assert(value <= SHRT_MAX);
m_timecode = static_cast<short>(value);
#endif
pos += 2; pos += 2;
assert((stop - pos) >= 1); assert((stop - pos) >= 1);
long status = pReader->Read(pos, 1, &m_flags); status = pReader->Read(pos, 1, &m_flags);
assert(status == 0); assert(status == 0);
#if 0 #if 0

View File

@ -33,8 +33,14 @@ long long SyncReadUInt(IMkvReader*, long long pos, long long stop, long&);
long long UnserializeUInt(IMkvReader*, long long pos, long long size); long long UnserializeUInt(IMkvReader*, long long pos, long long size);
float Unserialize4Float(IMkvReader*, long long); float Unserialize4Float(IMkvReader*, long long);
double Unserialize8Double(IMkvReader*, long long); double Unserialize8Double(IMkvReader*, long long);
#if 0
short Unserialize2SInt(IMkvReader*, long long); short Unserialize2SInt(IMkvReader*, long long);
signed char Unserialize1SInt(IMkvReader*, long long); signed char Unserialize1SInt(IMkvReader*, long long);
#else
long UnserializeInt(IMkvReader*, long long pos, long len, long long& result);
#endif
bool Match(IMkvReader*, long long&, unsigned long, long long&); bool Match(IMkvReader*, long long&, unsigned long, long long&);
bool Match(IMkvReader*, long long&, unsigned long, char*&); bool Match(IMkvReader*, long long&, unsigned long, char*&);
bool Match(IMkvReader*, long long&, unsigned long, unsigned char*&, size_t&); bool Match(IMkvReader*, long long&, unsigned long, unsigned char*&, size_t&);