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
diff options
context:
space:
mode:
authorAleksoid <aleksoid@users.sourceforge.net>2010-07-28 10:40:43 +0400
committerAleksoid <aleksoid@users.sourceforge.net>2010-07-28 10:40:43 +0400
commitead03800edc7ae266b79c956984180f2116ff5ab (patch)
treeec904005bb7ddf70737c0d9e448383c850b81031 /src/filters/parser
parent6c18c4e86c8a674ac10653a8f5373413a9c10a13 (diff)
Fix : Can't open some MP3 files - ticket #363, #563;
git-svn-id: https://mpc-hc.svn.sourceforge.net/svnroot/mpc-hc/trunk@2163 10f7b99b-c216-0410-bff0-8a66a9350fd8
Diffstat (limited to 'src/filters/parser')
-rw-r--r--src/filters/parser/MpaSplitter/MpaSplitterFile.cpp90
1 files changed, 60 insertions, 30 deletions
diff --git a/src/filters/parser/MpaSplitter/MpaSplitterFile.cpp b/src/filters/parser/MpaSplitter/MpaSplitterFile.cpp
index 6696d7807..2b8abee75 100644
--- a/src/filters/parser/MpaSplitter/MpaSplitterFile.cpp
+++ b/src/filters/parser/MpaSplitter/MpaSplitterFile.cpp
@@ -136,8 +136,12 @@ HRESULT CMpaSplitterFile::Init()
Seek(0);
+ bool MP3_find = false;
+
while(BitRead(24, true) == 'ID3')
{
+ MP3_find = true;
+
BitRead(24);
BYTE major = (BYTE)BitRead(8);
@@ -227,21 +231,39 @@ HRESULT CMpaSplitterFile::Init()
BitRead(8), m_startpos++;
}
- __int64 searchlen = min(m_endpos - m_startpos, m_startpos > 0 ? 0x200 : 7);
+ __int64 searchlen;
+ __int64 startpos;
+ __int64 syncpos;
- __int64 startpos = m_startpos;
+ while ((m_mode == none) && (MP3_find))
+ {
+ searchlen = min(m_endpos - m_startpos, 0x200);
+ Seek(m_startpos);
- Seek(m_startpos);
+ // If we fail to see sync bytes, we reposition here and search again
+ syncpos = m_startpos + searchlen;
- if(m_mode == none && Read(m_mpahdr, searchlen, true, &m_mt))
- {
- m_mode = mpa;
+ // Check for a valid MPA header
+ if(Read(m_mpahdr, searchlen, true, &m_mt))
+ {
+ m_mode = mpa;
- startpos = GetPos() - 4;
-
- // make sure the first frame is followed by another of the same kind (validates m_mpahdr basically)
- Seek(startpos + m_mpahdr.FrameSize);
- if(!Sync(4)) m_mode = none;
+ syncpos = GetPos();
+ startpos = syncpos - 4;
+
+ // make sure the first frame is followed by another of the same kind (validates m_mpahdr basically)
+ Seek(startpos + m_mpahdr.FrameSize);
+ if(!Sync(4))
+ m_mode = none;
+ else
+ break;
+ }
+
+ // If we have enough room to search for a valid header, then skip ahead and try again
+ if (m_endpos - syncpos >= 8)
+ m_startpos = syncpos;
+ else
+ break;
}
Seek(m_startpos);
@@ -295,19 +317,23 @@ bool CMpaSplitterFile::Sync(int& FrameSize, REFERENCE_TIME& rtDuration, int limi
{
mpahdr h;
- if(Read(h, endpos - GetPos(), true)
- && m_mpahdr.version == h.version
- && m_mpahdr.layer == h.layer
- && m_mpahdr.channels == h.channels)
+ if(Read(h, endpos - GetPos(), true))
{
- Seek(GetPos() - 4);
- AdjustDuration(h.nBytesPerSec);
+ if (m_mpahdr.version == h.version
+ && m_mpahdr.layer == h.layer
+ && m_mpahdr.channels == h.channels)
+ {
+ Seek(GetPos() - 4);
+ AdjustDuration(h.nBytesPerSec);
- FrameSize = h.FrameSize;
- rtDuration = h.rtDuration;
+ FrameSize = h.FrameSize;
+ rtDuration = h.rtDuration;
- return true;
+ return true;
+ }
}
+ else
+ break;
}
}
else if(m_mode == mp4a)
@@ -316,20 +342,24 @@ bool CMpaSplitterFile::Sync(int& FrameSize, REFERENCE_TIME& rtDuration, int limi
{
aachdr h;
- if(Read(h, endpos - GetPos())
- && m_aachdr.version == h.version
- && m_aachdr.layer == h.layer
- && m_aachdr.channels == h.channels)
+ if(Read(h, endpos - GetPos()))
{
- Seek(GetPos() - (h.fcrc?7:9));
- AdjustDuration(h.nBytesPerSec);
- Seek(GetPos() + (h.fcrc?7:9));
+ if (m_aachdr.version == h.version
+ && m_aachdr.layer == h.layer
+ && m_aachdr.channels == h.channels)
+ {
+ Seek(GetPos() - (h.fcrc?7:9));
+ AdjustDuration(h.nBytesPerSec);
+ Seek(GetPos() + (h.fcrc?7:9));
- FrameSize = h.FrameSize;
- rtDuration = h.rtDuration;
+ FrameSize = h.FrameSize;
+ rtDuration = h.rtDuration;
- return true;
+ return true;
+ }
}
+ else
+ break;
}
}