Added EBML element start and size to Segment Info, Tracks, Track,
Cluster, Cues, and CuePoint. The information was needed for some tools bieng worked on. Element start is byte offset of the EMBL ID's first byte. Change-Id: I64e0a48932630e0a5269418f4979487d6d7bce60
This commit is contained in:
193
mkvparser.cpp
193
mkvparser.cpp
@@ -911,6 +911,7 @@ long long Segment::ParseHeaders()
|
|||||||
while (m_pos < stop)
|
while (m_pos < stop)
|
||||||
{
|
{
|
||||||
long long pos = m_pos;
|
long long pos = m_pos;
|
||||||
|
const long long element_start = pos;
|
||||||
|
|
||||||
long len;
|
long len;
|
||||||
long long result = GetUIntLength(m_pReader, pos, len);
|
long long result = GetUIntLength(m_pReader, pos, len);
|
||||||
@@ -954,6 +955,8 @@ long long Segment::ParseHeaders()
|
|||||||
|
|
||||||
pos += len; //consume length of size of element
|
pos += len; //consume length of size of element
|
||||||
|
|
||||||
|
const long long element_size = size + pos - element_start;
|
||||||
|
|
||||||
//Pos now points to start of payload
|
//Pos now points to start of payload
|
||||||
|
|
||||||
if ((pos + size) > stop)
|
if ((pos + size) > stop)
|
||||||
@@ -968,21 +971,33 @@ long long Segment::ParseHeaders()
|
|||||||
{
|
{
|
||||||
assert(m_pInfo == NULL);
|
assert(m_pInfo == NULL);
|
||||||
|
|
||||||
m_pInfo = new SegmentInfo(this, pos, size);
|
m_pInfo = new SegmentInfo(this,
|
||||||
|
pos,
|
||||||
|
size,
|
||||||
|
element_start,
|
||||||
|
element_size);
|
||||||
assert(m_pInfo); //TODO
|
assert(m_pInfo); //TODO
|
||||||
}
|
}
|
||||||
else if (id == 0x0654AE6B) //Tracks ID
|
else if (id == 0x0654AE6B) //Tracks ID
|
||||||
{
|
{
|
||||||
assert(m_pTracks == NULL);
|
assert(m_pTracks == NULL);
|
||||||
|
|
||||||
m_pTracks = new Tracks(this, pos, size);
|
m_pTracks = new Tracks(this,
|
||||||
|
pos,
|
||||||
|
size,
|
||||||
|
element_start,
|
||||||
|
element_size);
|
||||||
assert(m_pTracks); //TODO
|
assert(m_pTracks); //TODO
|
||||||
}
|
}
|
||||||
else if (id == 0x0C53BB6B) //Cues ID
|
else if (id == 0x0C53BB6B) //Cues ID
|
||||||
{
|
{
|
||||||
if (m_pCues == NULL)
|
if (m_pCues == NULL)
|
||||||
{
|
{
|
||||||
m_pCues = new Cues(this, pos, size);
|
m_pCues = new Cues(this,
|
||||||
|
pos,
|
||||||
|
size,
|
||||||
|
element_start,
|
||||||
|
element_size);
|
||||||
assert(m_pCues); //TODO
|
assert(m_pCues); //TODO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1229,7 +1244,11 @@ bool Segment::AddCluster(long long off, long long pos)
|
|||||||
|
|
||||||
if (off >= 0)
|
if (off >= 0)
|
||||||
{
|
{
|
||||||
Cluster* const pCluster = Cluster::Parse(this, m_clusterCount, off);
|
Cluster* const pCluster = Cluster::Parse(this,
|
||||||
|
m_clusterCount,
|
||||||
|
off,
|
||||||
|
0,
|
||||||
|
0);
|
||||||
assert(pCluster);
|
assert(pCluster);
|
||||||
|
|
||||||
AppendCluster(pCluster);
|
AppendCluster(pCluster);
|
||||||
@@ -1294,6 +1313,8 @@ long Segment::LoadCluster(
|
|||||||
|
|
||||||
pos += len; //consume length of size of element
|
pos += len; //consume length of size of element
|
||||||
|
|
||||||
|
const long long element_size = size + pos - idpos;
|
||||||
|
|
||||||
if (size == 0) //weird
|
if (size == 0) //weird
|
||||||
{
|
{
|
||||||
m_pos = pos;
|
m_pos = pos;
|
||||||
@@ -1322,7 +1343,11 @@ long Segment::LoadCluster(
|
|||||||
{
|
{
|
||||||
if (m_pCues == NULL)
|
if (m_pCues == NULL)
|
||||||
{
|
{
|
||||||
m_pCues = new Cues(this, pos, size);
|
m_pCues = new Cues(this,
|
||||||
|
pos,
|
||||||
|
size,
|
||||||
|
idpos,
|
||||||
|
element_size);
|
||||||
assert(m_pCues); //TODO
|
assert(m_pCues); //TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1371,7 +1396,11 @@ long Segment::LoadCluster(
|
|||||||
|
|
||||||
if (Cluster::HasBlockEntries(this, idoff))
|
if (Cluster::HasBlockEntries(this, idoff))
|
||||||
{
|
{
|
||||||
Cluster* const pCluster = Cluster::Parse(this, idx, idoff);
|
Cluster* const pCluster = Cluster::Parse(this,
|
||||||
|
idx,
|
||||||
|
idoff,
|
||||||
|
idpos,
|
||||||
|
element_size);
|
||||||
assert(pCluster);
|
assert(pCluster);
|
||||||
|
|
||||||
AppendCluster(pCluster);
|
AppendCluster(pCluster);
|
||||||
@@ -1560,6 +1589,7 @@ long Segment::Load()
|
|||||||
while (m_pos < stop)
|
while (m_pos < stop)
|
||||||
{
|
{
|
||||||
long long pos = m_pos;
|
long long pos = m_pos;
|
||||||
|
const long long element_start = pos;
|
||||||
|
|
||||||
long len;
|
long len;
|
||||||
|
|
||||||
@@ -1595,6 +1625,8 @@ long Segment::Load()
|
|||||||
|
|
||||||
pos += len; //consume length of size of element
|
pos += len; //consume length of size of element
|
||||||
|
|
||||||
|
const long long element_size = size + pos - element_start;
|
||||||
|
|
||||||
//Pos now points to start of payload
|
//Pos now points to start of payload
|
||||||
|
|
||||||
if ((pos + size) > stop)
|
if ((pos + size) > stop)
|
||||||
@@ -1607,7 +1639,11 @@ long Segment::Load()
|
|||||||
|
|
||||||
if (Cluster::HasBlockEntries(this, off))
|
if (Cluster::HasBlockEntries(this, off))
|
||||||
{
|
{
|
||||||
Cluster* const pCluster = Cluster::Parse(this, idx, off);
|
Cluster* const pCluster = Cluster::Parse(this,
|
||||||
|
idx,
|
||||||
|
off,
|
||||||
|
element_start,
|
||||||
|
element_size);
|
||||||
assert(pCluster);
|
assert(pCluster);
|
||||||
|
|
||||||
AppendCluster(pCluster);
|
AppendCluster(pCluster);
|
||||||
@@ -1620,21 +1656,29 @@ long Segment::Load()
|
|||||||
{
|
{
|
||||||
assert(m_pCues == NULL);
|
assert(m_pCues == NULL);
|
||||||
|
|
||||||
m_pCues = new Cues(this, pos, size);
|
m_pCues = new Cues(this, pos, size, element_start, element_size);
|
||||||
assert(m_pCues); //TODO
|
assert(m_pCues); //TODO
|
||||||
}
|
}
|
||||||
else if (id == 0x0549A966) //SegmentInfo ID
|
else if (id == 0x0549A966) //SegmentInfo ID
|
||||||
{
|
{
|
||||||
assert(m_pInfo == NULL);
|
assert(m_pInfo == NULL);
|
||||||
|
|
||||||
m_pInfo = new SegmentInfo(this, pos, size);
|
m_pInfo = new SegmentInfo(this,
|
||||||
|
pos,
|
||||||
|
size,
|
||||||
|
element_start,
|
||||||
|
element_size);
|
||||||
assert(m_pInfo);
|
assert(m_pInfo);
|
||||||
}
|
}
|
||||||
else if (id == 0x0654AE6B) //Tracks ID
|
else if (id == 0x0654AE6B) //Tracks ID
|
||||||
{
|
{
|
||||||
assert(m_pTracks == NULL);
|
assert(m_pTracks == NULL);
|
||||||
|
|
||||||
m_pTracks = new Tracks(this, pos, size);
|
m_pTracks = new Tracks(this,
|
||||||
|
pos,
|
||||||
|
size,
|
||||||
|
element_start,
|
||||||
|
element_size);
|
||||||
assert(m_pTracks); //TODO
|
assert(m_pTracks); //TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1702,6 +1746,7 @@ void Segment::ParseCues(long long off)
|
|||||||
//os << "Segment::ParseCues (begin)" << endl;
|
//os << "Segment::ParseCues (begin)" << endl;
|
||||||
|
|
||||||
long long pos = m_start + off;
|
long long pos = m_start + off;
|
||||||
|
const long long element_start = pos;
|
||||||
const long long stop = m_start + m_size;
|
const long long stop = m_start + m_size;
|
||||||
|
|
||||||
long len;
|
long len;
|
||||||
@@ -1730,9 +1775,11 @@ void Segment::ParseCues(long long off)
|
|||||||
pos += len; //consume length of size of element
|
pos += len; //consume length of size of element
|
||||||
assert((pos + size) <= stop);
|
assert((pos + size) <= stop);
|
||||||
|
|
||||||
|
const long long element_size = size + pos - element_start;
|
||||||
|
|
||||||
//Pos now points to start of payload
|
//Pos now points to start of payload
|
||||||
|
|
||||||
m_pCues = new Cues(this, pos, size);
|
m_pCues = new Cues(this, pos, size, element_start, element_size);
|
||||||
assert(m_pCues); //TODO
|
assert(m_pCues); //TODO
|
||||||
|
|
||||||
//os << "Segment::ParseCues (end)" << endl;
|
//os << "Segment::ParseCues (end)" << endl;
|
||||||
@@ -1798,14 +1845,21 @@ void Segment::ParseSeekEntry(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Cues::Cues(Segment* pSegment, long long start_, long long size_) :
|
Cues::Cues(
|
||||||
|
Segment* pSegment,
|
||||||
|
long long start_,
|
||||||
|
long long size_,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size) :
|
||||||
m_pSegment(pSegment),
|
m_pSegment(pSegment),
|
||||||
m_start(start_),
|
m_start(start_),
|
||||||
m_size(size_),
|
m_size(size_),
|
||||||
m_cue_points(NULL),
|
m_cue_points(NULL),
|
||||||
m_count(0),
|
m_count(0),
|
||||||
m_preload_count(0),
|
m_preload_count(0),
|
||||||
m_pos(start_)
|
m_pos(start_),
|
||||||
|
m_element_start(element_start),
|
||||||
|
m_element_size(element_size)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1828,7 +1882,6 @@ Cues::~Cues()
|
|||||||
delete[] m_cue_points;
|
delete[] m_cue_points;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Cues::Init() const
|
void Cues::Init() const
|
||||||
{
|
{
|
||||||
if (m_cue_points)
|
if (m_cue_points)
|
||||||
@@ -2253,7 +2306,7 @@ const BlockEntry* Segment::GetBlock(
|
|||||||
assert(i == j);
|
assert(i == j);
|
||||||
assert(Cluster::HasBlockEntries(this, tp.m_pos));
|
assert(Cluster::HasBlockEntries(this, tp.m_pos));
|
||||||
|
|
||||||
Cluster* const pCluster = Cluster::Parse(this, -1, tp.m_pos);
|
Cluster* const pCluster = Cluster::Parse(this, -1, tp.m_pos, 0, 0);
|
||||||
assert(pCluster);
|
assert(pCluster);
|
||||||
|
|
||||||
const ptrdiff_t idx = i - m_clusters;
|
const ptrdiff_t idx = i - m_clusters;
|
||||||
@@ -2269,6 +2322,8 @@ const BlockEntry* Segment::GetBlock(
|
|||||||
|
|
||||||
|
|
||||||
CuePoint::CuePoint(size_t idx, long long pos) :
|
CuePoint::CuePoint(size_t idx, long long pos) :
|
||||||
|
m_element_start(0),
|
||||||
|
m_element_size(0),
|
||||||
m_index(idx),
|
m_index(idx),
|
||||||
m_timecode(-1 * pos),
|
m_timecode(-1 * pos),
|
||||||
m_track_positions(NULL),
|
m_track_positions(NULL),
|
||||||
@@ -2296,6 +2351,7 @@ void CuePoint::Load(IMkvReader* pReader)
|
|||||||
assert(m_track_positions_count == 0);
|
assert(m_track_positions_count == 0);
|
||||||
|
|
||||||
long long pos_ = -m_timecode;
|
long long pos_ = -m_timecode;
|
||||||
|
const long long element_start = pos_;
|
||||||
|
|
||||||
long long stop;
|
long long stop;
|
||||||
|
|
||||||
@@ -2320,6 +2376,8 @@ void CuePoint::Load(IMkvReader* pReader)
|
|||||||
stop = pos_ + size;
|
stop = pos_ + size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const long long element_size = stop - element_start;
|
||||||
|
|
||||||
long long pos = pos_;
|
long long pos = pos_;
|
||||||
|
|
||||||
//First count number of track positions
|
//First count number of track positions
|
||||||
@@ -2393,6 +2451,9 @@ void CuePoint::Load(IMkvReader* pReader)
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert(size_t(p - m_track_positions) == m_track_positions_count);
|
assert(size_t(p - m_track_positions) == m_track_positions_count);
|
||||||
|
|
||||||
|
m_element_start = element_start;
|
||||||
|
m_element_size = element_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2596,6 +2657,8 @@ const Cluster* Segment::GetNext(const Cluster* pCurr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
long long off_next = 0;
|
long long off_next = 0;
|
||||||
|
long long element_start_next = 0;
|
||||||
|
long long element_size_next = 0;
|
||||||
|
|
||||||
while (pos < stop)
|
while (pos < stop)
|
||||||
{
|
{
|
||||||
@@ -2623,6 +2686,8 @@ const Cluster* Segment::GetNext(const Cluster* pCurr)
|
|||||||
pos += len; //consume length of size of element
|
pos += len; //consume length of size of element
|
||||||
assert((pos + size) <= stop); //TODO
|
assert((pos + size) <= stop); //TODO
|
||||||
|
|
||||||
|
const long long element_size = size + pos - idpos;
|
||||||
|
|
||||||
//Pos now points to start of payload
|
//Pos now points to start of payload
|
||||||
|
|
||||||
if (size == 0) //weird
|
if (size == 0) //weird
|
||||||
@@ -2635,6 +2700,8 @@ const Cluster* Segment::GetNext(const Cluster* pCurr)
|
|||||||
if (Cluster::HasBlockEntries(this, off_next_))
|
if (Cluster::HasBlockEntries(this, off_next_))
|
||||||
{
|
{
|
||||||
off_next = off_next_;
|
off_next = off_next_;
|
||||||
|
element_start_next = idpos;
|
||||||
|
element_size_next = element_size;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2680,7 +2747,11 @@ const Cluster* Segment::GetNext(const Cluster* pCurr)
|
|||||||
|
|
||||||
assert(i == j);
|
assert(i == j);
|
||||||
|
|
||||||
Cluster* const pNext = Cluster::Parse(this, -1, off_next);
|
Cluster* const pNext = Cluster::Parse(this,
|
||||||
|
-1,
|
||||||
|
off_next,
|
||||||
|
element_start_next,
|
||||||
|
element_size_next);
|
||||||
assert(pNext);
|
assert(pNext);
|
||||||
|
|
||||||
const ptrdiff_t idx_next = i - m_clusters; //insertion position
|
const ptrdiff_t idx_next = i - m_clusters; //insertion position
|
||||||
@@ -2954,13 +3025,20 @@ long long Segment::GetDuration() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SegmentInfo::SegmentInfo(Segment* pSegment, long long start, long long size_) :
|
SegmentInfo::SegmentInfo(
|
||||||
|
Segment* pSegment,
|
||||||
|
long long start,
|
||||||
|
long long size_,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size) :
|
||||||
m_pSegment(pSegment),
|
m_pSegment(pSegment),
|
||||||
m_start(start),
|
m_start(start),
|
||||||
m_size(size_),
|
m_size(size_),
|
||||||
m_pMuxingAppAsUTF8(NULL),
|
m_pMuxingAppAsUTF8(NULL),
|
||||||
m_pWritingAppAsUTF8(NULL),
|
m_pWritingAppAsUTF8(NULL),
|
||||||
m_pTitleAsUTF8(NULL)
|
m_pTitleAsUTF8(NULL),
|
||||||
|
m_element_start(element_start),
|
||||||
|
m_element_size(element_size)
|
||||||
{
|
{
|
||||||
IMkvReader* const pReader = m_pSegment->m_pReader;
|
IMkvReader* const pReader = m_pSegment->m_pReader;
|
||||||
|
|
||||||
@@ -3067,9 +3145,15 @@ const char* SegmentInfo::GetTitleAsUTF8() const
|
|||||||
return m_pTitleAsUTF8;
|
return m_pTitleAsUTF8;
|
||||||
}
|
}
|
||||||
|
|
||||||
Track::Track(Segment* pSegment, const Info& i) :
|
Track::Track(
|
||||||
|
Segment* pSegment,
|
||||||
|
const Info& i,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size) :
|
||||||
m_pSegment(pSegment),
|
m_pSegment(pSegment),
|
||||||
m_info(i)
|
m_info(i),
|
||||||
|
m_element_start(element_start),
|
||||||
|
m_element_size(element_size)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3091,7 +3175,6 @@ Track::Info::Info():
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Track::Info::Clear()
|
void Track::Info::Clear()
|
||||||
{
|
{
|
||||||
delete[] nameAsUTF8;
|
delete[] nameAsUTF8;
|
||||||
@@ -3339,8 +3422,12 @@ bool Track::EOSBlock::IsBFrame() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VideoTrack::VideoTrack(Segment* pSegment, const Info& i) :
|
VideoTrack::VideoTrack(
|
||||||
Track(pSegment, i),
|
Segment* pSegment,
|
||||||
|
const Info& i,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size) :
|
||||||
|
Track(pSegment, i, element_start, element_size),
|
||||||
m_width(-1),
|
m_width(-1),
|
||||||
m_height(-1),
|
m_height(-1),
|
||||||
m_rate(-1)
|
m_rate(-1)
|
||||||
@@ -3523,8 +3610,12 @@ double VideoTrack::GetFrameRate() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
AudioTrack::AudioTrack(Segment* pSegment, const Info& i) :
|
AudioTrack::AudioTrack(
|
||||||
Track(pSegment, i),
|
Segment* pSegment,
|
||||||
|
const Info& i,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size) :
|
||||||
|
Track(pSegment, i, element_start, element_size),
|
||||||
m_rate(0.0),
|
m_rate(0.0),
|
||||||
m_channels(0),
|
m_channels(0),
|
||||||
m_bitDepth(-1)
|
m_bitDepth(-1)
|
||||||
@@ -3695,12 +3786,19 @@ long long AudioTrack::GetBitDepth() const
|
|||||||
return m_bitDepth;
|
return m_bitDepth;
|
||||||
}
|
}
|
||||||
|
|
||||||
Tracks::Tracks(Segment* pSegment, long long start, long long size_) :
|
Tracks::Tracks(
|
||||||
|
Segment* pSegment,
|
||||||
|
long long start,
|
||||||
|
long long size_,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size) :
|
||||||
m_pSegment(pSegment),
|
m_pSegment(pSegment),
|
||||||
m_start(start),
|
m_start(start),
|
||||||
m_size(size_),
|
m_size(size_),
|
||||||
m_trackEntries(NULL),
|
m_trackEntries(NULL),
|
||||||
m_trackEntriesEnd(NULL)
|
m_trackEntriesEnd(NULL),
|
||||||
|
m_element_start(element_start),
|
||||||
|
m_element_size(element_size)
|
||||||
{
|
{
|
||||||
long long stop = m_start + m_size;
|
long long stop = m_start + m_size;
|
||||||
IMkvReader* const pReader = m_pSegment->m_pReader;
|
IMkvReader* const pReader = m_pSegment->m_pReader;
|
||||||
@@ -3746,6 +3844,8 @@ Tracks::Tracks(Segment* pSegment, long long start, long long size_) :
|
|||||||
assert(id >= 0);
|
assert(id >= 0);
|
||||||
assert((pos + len) <= stop);
|
assert((pos + len) <= stop);
|
||||||
|
|
||||||
|
const long long element_start = pos;
|
||||||
|
|
||||||
pos += len; //consume id
|
pos += len; //consume id
|
||||||
|
|
||||||
const long long size1 = ReadUInt(pReader, pos, len);
|
const long long size1 = ReadUInt(pReader, pos, len);
|
||||||
@@ -3756,10 +3856,12 @@ Tracks::Tracks(Segment* pSegment, long long start, long long size_) :
|
|||||||
|
|
||||||
//pos now desinates start of element
|
//pos now desinates start of element
|
||||||
|
|
||||||
|
const long long element_size = size1 + pos - element_start;
|
||||||
|
|
||||||
if (id == 0x2E) //TrackEntry ID
|
if (id == 0x2E) //TrackEntry ID
|
||||||
{
|
{
|
||||||
Track*& pTrack = *m_trackEntriesEnd;
|
Track*& pTrack = *m_trackEntriesEnd;
|
||||||
ParseTrackEntry(pos, size1, pTrack);
|
ParseTrackEntry(pos, size1, pTrack, element_start, element_size);
|
||||||
|
|
||||||
if (pTrack)
|
if (pTrack)
|
||||||
++m_trackEntriesEnd;
|
++m_trackEntriesEnd;
|
||||||
@@ -3783,7 +3885,9 @@ unsigned long Tracks::GetTracksCount() const
|
|||||||
void Tracks::ParseTrackEntry(
|
void Tracks::ParseTrackEntry(
|
||||||
long long start,
|
long long start,
|
||||||
long long size,
|
long long size,
|
||||||
Track*& pTrack)
|
Track*& pTrack,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size)
|
||||||
{
|
{
|
||||||
IMkvReader* const pReader = m_pSegment->m_pReader;
|
IMkvReader* const pReader = m_pSegment->m_pReader;
|
||||||
|
|
||||||
@@ -3902,7 +4006,11 @@ void Tracks::ParseTrackEntry(
|
|||||||
|
|
||||||
i.settings = videoSettings;
|
i.settings = videoSettings;
|
||||||
|
|
||||||
VideoTrack* const t = new VideoTrack(m_pSegment, i);
|
VideoTrack* const t = new VideoTrack(
|
||||||
|
m_pSegment,
|
||||||
|
i,
|
||||||
|
element_start,
|
||||||
|
element_size);
|
||||||
assert(t); //TODO
|
assert(t); //TODO
|
||||||
pTrack = t;
|
pTrack = t;
|
||||||
}
|
}
|
||||||
@@ -3913,7 +4021,11 @@ void Tracks::ParseTrackEntry(
|
|||||||
|
|
||||||
i.settings = audioSettings;
|
i.settings = audioSettings;
|
||||||
|
|
||||||
AudioTrack* const t = new AudioTrack(m_pSegment, i);
|
AudioTrack* const t = new AudioTrack(
|
||||||
|
m_pSegment,
|
||||||
|
i,
|
||||||
|
element_start,
|
||||||
|
element_size);
|
||||||
assert(t); //TODO
|
assert(t); //TODO
|
||||||
pTrack = t;
|
pTrack = t;
|
||||||
}
|
}
|
||||||
@@ -3944,7 +4056,6 @@ Tracks::~Tracks()
|
|||||||
delete[] m_trackEntries;
|
delete[] m_trackEntries;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const Track* Tracks::GetTrackByNumber(unsigned long tn_) const
|
const Track* Tracks::GetTrackByNumber(unsigned long tn_) const
|
||||||
{
|
{
|
||||||
const long long tn = tn_;
|
const long long tn = tn_;
|
||||||
@@ -4057,7 +4168,9 @@ void Cluster::Load() const
|
|||||||
Cluster* Cluster::Parse(
|
Cluster* Cluster::Parse(
|
||||||
Segment* pSegment,
|
Segment* pSegment,
|
||||||
long idx,
|
long idx,
|
||||||
long long off)
|
long long off,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size)
|
||||||
{
|
{
|
||||||
assert(pSegment);
|
assert(pSegment);
|
||||||
assert(off >= 0);
|
assert(off >= 0);
|
||||||
@@ -4066,7 +4179,11 @@ Cluster* Cluster::Parse(
|
|||||||
//if (!HasBlockEntries(pSegment, off))
|
//if (!HasBlockEntries(pSegment, off))
|
||||||
// return NULL;
|
// return NULL;
|
||||||
|
|
||||||
Cluster* const pCluster = new Cluster(pSegment, idx, -off);
|
Cluster* const pCluster = new Cluster(pSegment,
|
||||||
|
idx,
|
||||||
|
-off,
|
||||||
|
element_start,
|
||||||
|
element_size);
|
||||||
assert(pCluster);
|
assert(pCluster);
|
||||||
|
|
||||||
return pCluster;
|
return pCluster;
|
||||||
@@ -4078,6 +4195,8 @@ Cluster::Cluster() :
|
|||||||
m_index(0),
|
m_index(0),
|
||||||
m_pos(0),
|
m_pos(0),
|
||||||
m_size(0),
|
m_size(0),
|
||||||
|
m_element_start(0),
|
||||||
|
m_element_size(0),
|
||||||
m_timecode(0),
|
m_timecode(0),
|
||||||
m_entries(NULL),
|
m_entries(NULL),
|
||||||
m_entries_count(0) //means "no entries"
|
m_entries_count(0) //means "no entries"
|
||||||
@@ -4088,10 +4207,14 @@ Cluster::Cluster() :
|
|||||||
Cluster::Cluster(
|
Cluster::Cluster(
|
||||||
Segment* pSegment,
|
Segment* pSegment,
|
||||||
long idx,
|
long idx,
|
||||||
long long off) :
|
long long off,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size) :
|
||||||
m_pSegment(pSegment),
|
m_pSegment(pSegment),
|
||||||
m_index(idx),
|
m_index(idx),
|
||||||
m_pos(off),
|
m_pos(off),
|
||||||
|
m_element_start(element_start),
|
||||||
|
m_element_size(element_size),
|
||||||
m_size(-1),
|
m_size(-1),
|
||||||
m_timecode(-1),
|
m_timecode(-1),
|
||||||
m_entries(NULL),
|
m_entries(NULL),
|
||||||
|
|||||||
@@ -195,6 +195,8 @@ class Track
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
Segment* const m_pSegment;
|
Segment* const m_pSegment;
|
||||||
|
const long long m_element_start;
|
||||||
|
const long long m_element_size;
|
||||||
virtual ~Track();
|
virtual ~Track();
|
||||||
|
|
||||||
long long GetType() const;
|
long long GetType() const;
|
||||||
@@ -237,7 +239,11 @@ public:
|
|||||||
virtual long Seek(long long time_ns, const BlockEntry*&) const = 0;
|
virtual long Seek(long long time_ns, const BlockEntry*&) const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Track(Segment*, const Info&);
|
Track(
|
||||||
|
Segment*,
|
||||||
|
const Info&,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size);
|
||||||
const Info m_info;
|
const Info m_info;
|
||||||
|
|
||||||
class EOSBlock : public BlockEntry
|
class EOSBlock : public BlockEntry
|
||||||
@@ -263,7 +269,11 @@ class VideoTrack : public Track
|
|||||||
VideoTrack& operator=(const VideoTrack&);
|
VideoTrack& operator=(const VideoTrack&);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
VideoTrack(Segment*, const Info&);
|
VideoTrack(
|
||||||
|
Segment*,
|
||||||
|
const Info&,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size);
|
||||||
long long GetWidth() const;
|
long long GetWidth() const;
|
||||||
long long GetHeight() const;
|
long long GetHeight() const;
|
||||||
double GetFrameRate() const;
|
double GetFrameRate() const;
|
||||||
@@ -285,7 +295,11 @@ class AudioTrack : public Track
|
|||||||
AudioTrack& operator=(const AudioTrack&);
|
AudioTrack& operator=(const AudioTrack&);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AudioTrack(Segment*, const Info&);
|
AudioTrack(
|
||||||
|
Segment*,
|
||||||
|
const Info&,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size);
|
||||||
double GetSamplingRate() const;
|
double GetSamplingRate() const;
|
||||||
long long GetChannels() const;
|
long long GetChannels() const;
|
||||||
long long GetBitDepth() const;
|
long long GetBitDepth() const;
|
||||||
@@ -308,8 +322,15 @@ public:
|
|||||||
Segment* const m_pSegment;
|
Segment* const m_pSegment;
|
||||||
const long long m_start;
|
const long long m_start;
|
||||||
const long long m_size;
|
const long long m_size;
|
||||||
|
const long long m_element_start;
|
||||||
|
const long long m_element_size;
|
||||||
|
|
||||||
Tracks(Segment*, long long start, long long size);
|
Tracks(
|
||||||
|
Segment*,
|
||||||
|
long long start,
|
||||||
|
long long size,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size);
|
||||||
virtual ~Tracks();
|
virtual ~Tracks();
|
||||||
|
|
||||||
const Track* GetTrackByNumber(unsigned long tn) const;
|
const Track* GetTrackByNumber(unsigned long tn) const;
|
||||||
@@ -319,7 +340,12 @@ private:
|
|||||||
Track** m_trackEntries;
|
Track** m_trackEntries;
|
||||||
Track** m_trackEntriesEnd;
|
Track** m_trackEntriesEnd;
|
||||||
|
|
||||||
void ParseTrackEntry(long long, long long, Track*&);
|
void ParseTrackEntry(
|
||||||
|
long long,
|
||||||
|
long long,
|
||||||
|
Track*&,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
unsigned long GetTracksCount() const;
|
unsigned long GetTracksCount() const;
|
||||||
@@ -335,8 +361,15 @@ public:
|
|||||||
Segment* const m_pSegment;
|
Segment* const m_pSegment;
|
||||||
const long long m_start;
|
const long long m_start;
|
||||||
const long long m_size;
|
const long long m_size;
|
||||||
|
const long long m_element_start;
|
||||||
|
const long long m_element_size;
|
||||||
|
|
||||||
SegmentInfo(Segment*, long long start, long long size);
|
SegmentInfo(
|
||||||
|
Segment*,
|
||||||
|
long long start,
|
||||||
|
long long size,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size);
|
||||||
~SegmentInfo();
|
~SegmentInfo();
|
||||||
long long GetTimeCodeScale() const;
|
long long GetTimeCodeScale() const;
|
||||||
long long GetDuration() const; //scaled
|
long long GetDuration() const; //scaled
|
||||||
@@ -364,6 +397,9 @@ class CuePoint
|
|||||||
CuePoint& operator=(const CuePoint&);
|
CuePoint& operator=(const CuePoint&);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
long long m_element_start;
|
||||||
|
long long m_element_size;
|
||||||
|
|
||||||
void Load(IMkvReader*);
|
void Load(IMkvReader*);
|
||||||
|
|
||||||
long long GetTimeCode() const; //absolute but unscaled
|
long long GetTimeCode() const; //absolute but unscaled
|
||||||
@@ -396,7 +432,12 @@ class Cues
|
|||||||
{
|
{
|
||||||
friend class Segment;
|
friend class Segment;
|
||||||
|
|
||||||
Cues(Segment*, long long start, long long size);
|
Cues(
|
||||||
|
Segment*,
|
||||||
|
long long start,
|
||||||
|
long long size,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size);
|
||||||
~Cues();
|
~Cues();
|
||||||
|
|
||||||
Cues(const Cues&);
|
Cues(const Cues&);
|
||||||
@@ -406,6 +447,8 @@ public:
|
|||||||
Segment* const m_pSegment;
|
Segment* const m_pSegment;
|
||||||
const long long m_start;
|
const long long m_start;
|
||||||
const long long m_size;
|
const long long m_size;
|
||||||
|
const long long m_element_start;
|
||||||
|
const long long m_element_size;
|
||||||
|
|
||||||
bool Find( //lower bound of time_ns
|
bool Find( //lower bound of time_ns
|
||||||
long long time_ns,
|
long long time_ns,
|
||||||
@@ -451,7 +494,12 @@ public:
|
|||||||
Segment* const m_pSegment;
|
Segment* const m_pSegment;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static Cluster* Parse(Segment*, long, long long off);
|
static Cluster* Parse(
|
||||||
|
Segment*,
|
||||||
|
long,
|
||||||
|
long long off,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size);
|
||||||
|
|
||||||
Cluster(); //EndOfStream
|
Cluster(); //EndOfStream
|
||||||
~Cluster();
|
~Cluster();
|
||||||
@@ -475,13 +523,20 @@ public:
|
|||||||
static bool HasBlockEntries(const Segment*, long long);
|
static bool HasBlockEntries(const Segment*, long long);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Cluster(Segment*, long, long long off);
|
Cluster(
|
||||||
|
Segment*,
|
||||||
|
long,
|
||||||
|
long long off,
|
||||||
|
long long element_start,
|
||||||
|
long long element_size);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
//TODO: these should all be private, with public selector functions
|
//TODO: these should all be private, with public selector functions
|
||||||
long m_index;
|
long m_index;
|
||||||
mutable long long m_pos;
|
mutable long long m_pos;
|
||||||
mutable long long m_size;
|
mutable long long m_size;
|
||||||
|
const long long m_element_start;
|
||||||
|
const long long m_element_size;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable long long m_timecode;
|
mutable long long m_timecode;
|
||||||
|
|||||||
Reference in New Issue
Block a user