diff --git a/mkvparser.cpp b/mkvparser.cpp index b2f04ab..0b46694 100644 --- a/mkvparser.cpp +++ b/mkvparser.cpp @@ -19,7 +19,6 @@ mkvparser::IMkvReader::~IMkvReader() { } - void mkvparser::GetVersion(int& major, int& minor, int& build, int& revision) { major = 1; @@ -28,7 +27,6 @@ void mkvparser::GetVersion(int& major, int& minor, int& build, int& revision) revision = 7; } - long long mkvparser::ReadUInt(IMkvReader* pReader, long long pos, long& len) { assert(pReader); @@ -235,6 +233,7 @@ long long mkvparser::UnserializeUInt( if (hr < 0) return hr; + result <<= 8; result |= b; @@ -366,7 +365,6 @@ bool mkvparser::Match( long long& pos, unsigned long id_, long long& val) - { assert(pReader); assert(pos >= 0); @@ -2984,13 +2982,12 @@ Track::~Track() Track::Info::Info(): type(-1), number(-1), - uid(-1), + uid(ULLONG_MAX), nameAsUTF8(NULL), codecId(NULL), codecPrivate(NULL), codecPrivateSize(0), codecNameAsUTF8(NULL) - //lacing(false) { } @@ -3027,6 +3024,11 @@ long long Track::GetNumber() const return m_info.number; } +unsigned long long Track::GetUid() const +{ + return m_info.uid; +} + const char* Track::GetNameAsUTF8() const { return m_info.nameAsUTF8; @@ -3530,8 +3532,8 @@ void Tracks::ParseTrackEntry( #endif if (Match(pReader, pos, 0x57, i.number)) assert(i.number > 0); - else if (Match(pReader, pos, 0x33C5, i.uid)) - ; + //else if (Match(pReader, pos, 0x33C5, i.uid)) + // ; else if (Match(pReader, pos, 0x03, i.type)) ; else if (Match(pReader, pos, 0x136E, i.nameAsUTF8)) @@ -3552,6 +3554,9 @@ void Tracks::ParseTrackEntry( { long len; + const long long idpos = pos; + idpos; + const long long id = ReadUInt(pReader, pos, len); assert(id >= 0); //TODO: handle error case assert((pos + len) <= stop); @@ -3578,6 +3583,27 @@ void Tracks::ParseTrackEntry( audioSettings.start = start; audioSettings.size = size; } + else if (id == 0x33C5) //Track UID + { + assert(size <= 8); + + i.uid = 0; + long long pos_ = start; + const long long pos_end = start + size; + + while (pos_ != pos_end) + { + unsigned char b; + + const long status = pReader->Read(pos_, 1, &b); + assert(status == 0); + + i.uid <<= 8; + i.uid |= b; + + ++pos_; + } + } } } diff --git a/mkvparser.hpp b/mkvparser.hpp index a2ac71b..8bc417f 100644 --- a/mkvparser.hpp +++ b/mkvparser.hpp @@ -37,7 +37,7 @@ short Unserialize2SInt(IMkvReader*, long long); signed char Unserialize1SInt(IMkvReader*, 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,unsigned char*&, size_t&); +bool Match(IMkvReader*, long long&, unsigned long, unsigned char*&, size_t&); bool Match(IMkvReader*, long long&, unsigned long, double&); bool Match(IMkvReader*, long long&, unsigned long, short&); @@ -209,6 +209,7 @@ public: long long GetType() const; long long GetNumber() const; + unsigned long long GetUid() const; const char* GetNameAsUTF8() const; const char* GetCodecNameAsUTF8() const; const char* GetCodecId() const; @@ -227,7 +228,7 @@ public: { long long type; long long number; - long long uid; + unsigned long long uid; char* nameAsUTF8; char* codecId; unsigned char* codecPrivate; diff --git a/sample.cpp b/sample.cpp index 61f40ba..03daab8 100644 --- a/sample.cpp +++ b/sample.cpp @@ -148,14 +148,14 @@ int main(int argc, char* argv[]) if (pTrack == NULL) continue; - const long long trackType_ = pTrack->GetType(); - unsigned long trackType = static_cast(trackType_); - - unsigned long trackNumber = pTrack->GetNumber(); + const long long trackType = pTrack->GetType(); + const long long trackNumber = pTrack->GetNumber(); + const unsigned long long trackUid = pTrack->GetUid(); const wchar_t* const pTrackName = utf8towcs(pTrack->GetNameAsUTF8()); printf("\t\tTrack Type\t\t: %ld\n", trackType); printf("\t\tTrack Number\t\t: %ld\n", trackNumber); + printf("\t\tTrack Uid\t\t: %lld\n", trackUid); if (pTrackName == NULL) printf("\t\tTrack Name\t\t: NULL\n"); @@ -235,8 +235,9 @@ int main(int argc, char* argv[]) while ((pBlockEntry != NULL) && !pBlockEntry->EOS()) { const Block* const pBlock = pBlockEntry->GetBlock(); - const unsigned long trackNum = pBlock->GetTrackNumber(); - const Track* const pTrack = pTracks->GetTrackByNumber(trackNum); + const long long trackNum = pBlock->GetTrackNumber(); + const unsigned long tn = static_cast(trackNum); + const Track* const pTrack = pTracks->GetTrackByNumber(tn); const long long trackType = pTrack->GetType(); const int frameCount = pBlock->GetFrameCount(); const long long time_ns = pBlock->GetTime(pCluster); @@ -250,7 +251,7 @@ int main(int argc, char* argv[]) { const Block::Frame& theFrame = pBlock->GetFrame(i); const long size = theFrame.len; - const long offset = theFrame.pos; + const long long offset = theFrame.pos; printf("\t\t\t %15ld,%15lx\n", size, offset); }