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:
authorv0lt <v0lt@users.sourceforge.net>2012-04-12 17:19:37 +0400
committerv0lt <v0lt@users.sourceforge.net>2012-04-12 17:19:37 +0400
commit17cdeaaf5183d151e0fae1d986ba22c853562a8f (patch)
tree3f57f4dd51cb63d627f4a6d647052f4ee302716e /src/filters/parser
parent8912b6ca0c4cfb957e4674c12010ff731b3e8732 (diff)
MpegSplitter: removed crackling from LPCM tracks when switching and seeking (Aleksoid patch)
git-svn-id: https://mpc-hc.svn.sourceforge.net/svnroot/mpc-hc/trunk@4348 10f7b99b-c216-0410-bff0-8a66a9350fd8
Diffstat (limited to 'src/filters/parser')
-rw-r--r--src/filters/parser/BaseSplitter/BaseSplitter.cpp19
-rw-r--r--src/filters/parser/MpegSplitter/MpegSplitter.cpp41
-rw-r--r--src/filters/parser/MpegSplitter/MpegSplitter.h9
3 files changed, 48 insertions, 21 deletions
diff --git a/src/filters/parser/BaseSplitter/BaseSplitter.cpp b/src/filters/parser/BaseSplitter/BaseSplitter.cpp
index 8dc13c497..f50000490 100644
--- a/src/filters/parser/BaseSplitter/BaseSplitter.cpp
+++ b/src/filters/parser/BaseSplitter/BaseSplitter.cpp
@@ -607,14 +607,14 @@ HRESULT CBaseSplitterOutputPin::DeliverPacket(CAutoPtr<Packet> p)
}
bool fTimeValid = p->rtStart != Packet::INVALID_TIME;
- /*
- //if(p->TrackNumber == 1)
- //if(p->rtStart != Packet::INVALID_TIME)
- TRACE(_T("[%d]: d%d s%d p%d, b=%d, %I64d-%I64d \n"),
+
+#if defined(_DEBUG) && 0
+ TRACE(_T("[%d]: d%d s%d p%d, b=%d, [%20I64d - %20I64d]\n"),
p->TrackNumber,
p->bDiscontinuity, p->bSyncPoint, fTimeValid && p->rtStart < 0,
nBytes, p->rtStart, p->rtStop);
- */
+#endif
+
ASSERT(!p->bSyncPoint || fTimeValid);
BYTE* pData = NULL;
@@ -1048,14 +1048,13 @@ HRESULT CBaseSplitterFilter::DeliverPacket(CAutoPtr<Packet> p)
DWORD TrackNumber = p->TrackNumber;
BOOL bDiscontinuity = p->bDiscontinuity;
- /*
- //if(p->TrackNumber == 1)
- //if(p->rtStart != Packet::INVALID_TIME)
- TRACE(_T("[%d]: d%d s%d p%d, b=%d, %I64d-%I64d \n"),
+
+#if defined(_DEBUG) && 0
+ TRACE(_T("[%d]: d%d s%d p%d, b=%d, [%20I64d - %20I64d]\n"),
p->TrackNumber,
p->bDiscontinuity, p->bSyncPoint, p->rtStart != Packet::INVALID_TIME && p->rtStart < 0,
p->GetCount(), p->rtStart, p->rtStop);
- */
+#endif
hr = pPin->QueuePacket(p);
diff --git a/src/filters/parser/MpegSplitter/MpegSplitter.cpp b/src/filters/parser/MpegSplitter/MpegSplitter.cpp
index d8df4b21a..457481b5b 100644
--- a/src/filters/parser/MpegSplitter/MpegSplitter.cpp
+++ b/src/filters/parser/MpegSplitter/MpegSplitter.cpp
@@ -28,6 +28,7 @@
#include "MpegSplitter.h"
#include <moreuuids.h>
#include "../../../DSUtil/DSUtil.h"
+#include "../../../DSUtil/AudioParser.h"
#include "../../../apps/mplayerc/SettingsDefines.h"
@@ -1591,6 +1592,7 @@ CMpegSplitterOutputPin::CMpegSplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWS
, m_bFilterDTSMA(false)
, m_type(type)
, DD_reset(false)
+ , m_bFlushed(false)
{
}
@@ -1602,8 +1604,9 @@ HRESULT CMpegSplitterOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFEREN
{
{
CAutoLock cAutoLock(this);
- m_rtPrev = Packet::INVALID_TIME;
- m_rtOffset = 0;
+
+ m_rtPrev = Packet::INVALID_TIME;
+ m_rtOffset = 0;
}
return __super::DeliverNewSegment(tStart, tStop, dRate);
@@ -1613,9 +1616,11 @@ HRESULT CMpegSplitterOutputPin::DeliverEndFlush()
{
{
CAutoLock cAutoLock(this);
+
m_p.Free();
m_pl.RemoveAll();
- DD_reset = true;
+ DD_reset = true;
+ m_bFlushed = true;
}
return __super::DeliverEndFlush();
@@ -1642,14 +1647,12 @@ HRESULT CMpegSplitterOutputPin::DeliverPacket(CAutoPtr<Packet> p)
m_rtPrev = p->rtStart;
}
-
if (p->pmt) {
if (*((CMediaType *)p->pmt) != m_mt) {
SetMediaType ((CMediaType*)p->pmt);
}
}
-
if (m_mt.subtype == MEDIASUBTYPE_AAC) { // special code for aac, the currently available decoders only like whole frame samples
if (m_p && m_p->GetCount() == 1 && m_p->GetAt(0) == 0xff && !(!p->IsEmpty() && (p->GetAt(0) & 0xf6) == 0xf0)) {
m_p.Free();
@@ -2035,8 +2038,32 @@ HRESULT CMpegSplitterOutputPin::DeliverPacket(CAutoPtr<Packet> p)
}
// HDMV LPCM
} else if (m_mt.subtype == MEDIASUBTYPE_HDMV_LPCM_AUDIO) {
- BYTE* start = p->GetData();
- p->SetData(start + 4, p->GetCount() - 4);
+ if (!m_p) {
+ m_p.Attach(DNew Packet());
+ }
+ m_p->Append(*p);
+
+ if (m_p->GetCount() < 4) {
+ m_p.Free();
+ return S_OK; // Should be invalid packet
+ }
+
+ BYTE* start = m_p->GetData();
+ int samplerate, channels;
+ size_t header_size = ParseHdmvLPCMHeader(start, &samplerate, &channels);
+ if (!header_size || header_size > m_p->GetCount()) {
+ if(!header_size) {
+ m_p.Free();
+ }
+ return S_OK;
+ }
+
+ if(!p->pmt && m_bFlushed) {
+ p->pmt = CreateMediaType(&m_mt);
+ m_bFlushed = false;
+ }
+ p->SetData(start + 4, m_p->GetCount() - 4);
+ m_p.Free();
// Dolby_AC3
} else if ((m_type == mpeg_ts) &&
(m_mt.subtype == MEDIASUBTYPE_DOLBY_AC3) &&
diff --git a/src/filters/parser/MpegSplitter/MpegSplitter.h b/src/filters/parser/MpegSplitter/MpegSplitter.h
index 72d045a08..8fff51f6b 100644
--- a/src/filters/parser/MpegSplitter/MpegSplitter.h
+++ b/src/filters/parser/MpegSplitter/MpegSplitter.h
@@ -154,10 +154,11 @@ class CMpegSplitterOutputPin : public CBaseSplitterOutputPin, protected CCritSec
CAutoPtr<Packet> m_p;
CAutoPtrList<Packet> m_pl;
REFERENCE_TIME m_rtPrev, m_rtOffset, m_rtMaxShift;
- bool m_fHasAccessUnitDelimiters;
- bool m_bFilterDTSMA;
- int m_type;
- bool DD_reset;
+ bool m_fHasAccessUnitDelimiters;
+ bool m_bFilterDTSMA;
+ bool DD_reset;
+ bool m_bFlushed;
+ int m_type;
protected:
HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);