From a131a014462d7a43d6bf6ce87328ffc732676d16 Mon Sep 17 00:00:00 2001 From: matthewjheaney Date: Tue, 25 Jan 2011 22:42:16 -0500 Subject: [PATCH] libwebm: incrementally load block entries Change-Id: I566df5979e7638b6a5411a3338bbb0cf7d9ad111 --- mkvparser.cpp | 75 +++++++++++++++++++++++++++++++++++++-------------- mkvparser.hpp | 5 ++-- 2 files changed, 58 insertions(+), 22 deletions(-) diff --git a/mkvparser.cpp b/mkvparser.cpp index 36ec51c..f4639c3 100644 --- a/mkvparser.cpp +++ b/mkvparser.cpp @@ -1308,7 +1308,7 @@ long Segment::LoadCluster( { long long total, avail; - const int status = m_pReader->Length(&total, &avail); + long status = m_pReader->Length(&total, &avail); if (status < 0) //error return status; @@ -1450,11 +1450,12 @@ long Segment::LoadCluster( ++m_clusterCount; --m_clusterPreloadCount; - pCluster->Load(); //establish invariant - m_pos = pos + size; //consume payload assert(m_pos <= stop); + status = pCluster->LoadBlockEntries(pos, len); + assert(status == 0); //TODO + return 0; //we have a new cluster } } @@ -1476,7 +1477,8 @@ long Segment::LoadCluster( assert(idx < m_clusterSize); assert(m_clusters[idx] == pCluster); - pCluster->Load(); //establish invariant + status = pCluster->LoadBlockEntries(pos, len); + assert(status == 0); //TODO return 0; //we have a new cluster } @@ -3261,7 +3263,7 @@ long Segment::ParseNext( long long total, avail; - const int status = m_pReader->Length(&total, &avail); + long status = m_pReader->Length(&total, &avail); if (status < 0) //error return status; @@ -3473,10 +3475,8 @@ long Segment::ParseNext( len = static_cast(size); -#if 1 //TODO: get rid of this if (element_stop > avail) return E_BUFFER_NOT_FULL; -#endif if (Cluster::HasBlockEntries(this, idoff)) //relative { @@ -3527,6 +3527,9 @@ long Segment::ParseNext( j = k; else { + status = pNext->LoadBlockEntries(pos, len); + assert(status == 0); + pResult = pNext; return 0; //success } @@ -3548,7 +3551,8 @@ long Segment::ParseNext( assert(idx_next < m_clusterSize); assert(m_clusters[idx_next] == pNext); - pNext->Load(); //because we need this now + status = pNext->LoadBlockEntries(pos, len); + assert(status == 0); //TODO pResult = pNext; return 0; //success @@ -4966,23 +4970,24 @@ void Cluster::Load() const } -long Cluster::Load(long long& pos, long& len) const +long Cluster::LoadBlockEntries(long long& pos, long& len) const { assert(m_pSegment); assert(m_pos); assert(m_size); - if (m_pos > 0) //loaded - { - assert(m_size > 0); - assert(m_timecode >= 0); - - return 0; - } - - assert(m_pos < 0); //not loaded yet - assert(m_size < 0); - assert(m_timecode < 0); + //if (m_pos > 0) //loaded + //{ + // assert(m_size > 0); + // assert(m_timecode >= 0); + // assert(m_entries_count >= 0); + // + // return 0; + //} + // + //assert(m_pos < 0); //not loaded yet + //assert(m_size < 0); + //assert(m_timecode < 0); IMkvReader* const pReader = m_pSegment->m_pReader; @@ -4998,6 +5003,28 @@ long Cluster::Load(long long& pos, long& len) const const long long segment_stop = m_pSegment->m_start + m_pSegment->m_size; + if (m_pos > 0) //at least partially loaded + { + assert(m_size > 0); + + if (m_entries_count >= 0) + return 0; + + pos = m_pSegment->m_start + m_pos; //absolute pos of payload + + const long long cluster_stop = pos + m_size; + + len = static_cast(m_size); + + if (cluster_stop > avail) + return E_BUFFER_NOT_FULL; + + LoadBlockEntries(); //TODO + assert(m_entries_count >= 0); + + return 0; + } + //m_pos *= -1; //relative to segment pos = m_pSegment->m_start - m_pos; //absolute @@ -5151,6 +5178,8 @@ long Cluster::Load(long long& pos, long& len) const m_size = size_; // m_size > 0 means we're partially loaded m_timecode = timecode; // m_timecode >= 0 means we're partially loaded + LoadBlockEntries(); //TODO + return 0; } @@ -5564,6 +5593,12 @@ const BlockEntry* Cluster::GetNext(const BlockEntry* pEntry) const } +long Cluster::GetEntryCount() const +{ + return m_entries_count; +} + + const BlockEntry* Cluster::GetEntry( const Track* pTrack, long long time_ns) const diff --git a/mkvparser.hpp b/mkvparser.hpp index b1ac53a..367900e 100644 --- a/mkvparser.hpp +++ b/mkvparser.hpp @@ -568,9 +568,11 @@ public: const BlockEntry* GetMaxKey(const VideoTrack*) const; static bool HasBlockEntries(const Segment*, long long); + long GetEntryCount() const; void Load() const; - long Load(long long& pos, long& size) const; + void LoadBlockEntries() const; + long LoadBlockEntries(long long& pos, long& size) const; protected: Cluster( @@ -593,7 +595,6 @@ private: mutable BlockEntry** m_entries; mutable long m_entries_count; - void LoadBlockEntries() const; void ParseBlockGroup(long long, long long, size_t) const; void ParseSimpleBlock(long long, long long, size_t) const;