Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/mpc-hc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorv0lt <v0lt@rambler.ru>2013-05-15 21:48:03 +0400
committerv0lt <v0lt@rambler.ru>2013-05-15 21:48:03 +0400
commitbdaad0821a9a2790fab707191d532c3eb88c86bb (patch)
tree6478adf211f04bfeeb33419c363eaab49f4e9f61 /src
parentb6822bee1da100bf87ac92a4b3672859c3c6cf16 (diff)
AviSplitter: more linear reading for "good" interleaved AVI files, cosmetics.
Diffstat (limited to 'src')
-rw-r--r--src/filters/parser/AviSplitter/AviSplitter.cpp35
1 files changed, 17 insertions, 18 deletions
diff --git a/src/filters/parser/AviSplitter/AviSplitter.cpp b/src/filters/parser/AviSplitter/AviSplitter.cpp
index 2fa921451..e9ce4fa4c 100644
--- a/src/filters/parser/AviSplitter/AviSplitter.cpp
+++ b/src/filters/parser/AviSplitter/AviSplitter.cpp
@@ -498,23 +498,21 @@ HRESULT CAviSplitterFilter::ReIndex(__int64 end, UINT64* pSize)
void CAviSplitterFilter::DemuxSeek(REFERENCE_TIME rt)
{
- size_t nTracks = m_pFile->m_strms.GetCount();
-
- memset((DWORD*)m_tFrame, 0, nTracks * sizeof(DWORD));
+ memset((DWORD*)m_tFrame, 0, m_pFile->m_avih.dwStreams * sizeof(DWORD));
m_pFile->Seek(0);
DbgLog((LOG_TRACE, 0, _T("Seek: %I64d"), rt / 10000));
if (rt > 0) {
- for (size_t j = 0; j < nTracks; ++j) {
- CAviFile::strm_t* s = m_pFile->m_strms[j];
+ for (DWORD track = 0; track < m_pFile->m_avih.dwStreams; track++) {
+ CAviFile::strm_t* s = m_pFile->m_strms[track];
if (s->IsRawSubtitleStream() || s->cs.IsEmpty()) {
continue;
}
//ASSERT(s->GetFrame(rt) == s->GetKeyFrame(rt)); // fast seek test
- m_tFrame[j] = s->GetKeyFrame(rt);
+ m_tFrame[track] = s->GetKeyFrame(rt);
}
}
}
@@ -523,19 +521,18 @@ bool CAviSplitterFilter::DemuxLoop()
{
HRESULT hr = S_OK;
- size_t nTracks = m_pFile->m_strms.GetCount();
-
CAtlArray<BOOL> fDiscontinuity;
- fDiscontinuity.SetCount(nTracks);
- memset(fDiscontinuity.GetData(), 0, nTracks * sizeof(BOOL));
+ fDiscontinuity.SetCount(m_pFile->m_avih.dwStreams);
+ memset(fDiscontinuity.GetData(), 0, m_pFile->m_avih.dwStreams * sizeof(BOOL));
while (SUCCEEDED(hr) && !CheckRequest(nullptr)) {
DWORD curTrack = DWORD_MAX;
REFERENCE_TIME minTime = INT64_MAX;
- for (size_t j = 0; j < nTracks; ++j) {
- CAviFile::strm_t* s = m_pFile->m_strms[j];
- DWORD f = m_tFrame[j];
+ UINT64 minpos = INT64_MAX;
+ for (DWORD track = 0; track < m_pFile->m_avih.dwStreams; track++) {
+ CAviFile::strm_t* s = m_pFile->m_strms[track];
+ DWORD f = m_tFrame[track];
if (f >= (DWORD)s->cs.GetCount()) {
continue;
@@ -543,15 +540,16 @@ bool CAviSplitterFilter::DemuxLoop()
if (s->IsRawSubtitleStream()) {
// TODO: get subtitle time from index
- minTime = 0;
- curTrack = (DWORD)j;
+ minTime = 0;
+ curTrack = track;
break; // read all subtitles at once
}
REFERENCE_TIME start = s->GetRefTime(f, s->cs[f].size);
- if (start < minTime) {
- minTime = start;
- curTrack = (DWORD)j;
+ if (start < minTime || (start == minTime && s->cs[f].filepos < minpos)) {
+ minTime = start;
+ curTrack = track;
+ minpos = s->cs[f].filepos;
}
}
@@ -562,6 +560,7 @@ bool CAviSplitterFilter::DemuxLoop()
do {
CAviFile::strm_t* s = m_pFile->m_strms[curTrack];
DWORD f = m_tFrame[curTrack];
+ //TRACE(_T("CAviFile::DemuxLoop(): track %d, time %I64d, pos %I64d\n"), curTrack, minTime, s->cs[f].filepos);
m_pFile->Seek(s->cs[f].filepos);
DWORD size = 0;