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

github.com/mpc-hc/LAVFilters.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2015-03-26 20:20:23 +0300
committerHendrik Leppkes <h.leppkes@gmail.com>2015-03-26 20:20:55 +0300
commit93ea8fe574565530818c6073d72898c284215bcd (patch)
treec4a1a7ca6c3475d07e079ada7af0f0137d7ff2de /demuxer
parent72424d1413c8c7d0e403d704d02d5026de32ed21 (diff)
Fix discontinuity logic when demuxing doesn't start with a video frame
Instead of always syncing on the video stream, sync on the first stream being demuxed.
Diffstat (limited to 'demuxer')
-rw-r--r--demuxer/LAVSplitter/LAVSplitter.cpp17
-rw-r--r--demuxer/LAVSplitter/LAVSplitter.h2
-rw-r--r--demuxer/LAVSplitter/OutputPin.cpp7
-rw-r--r--demuxer/LAVSplitter/OutputPin.h4
4 files changed, 16 insertions, 14 deletions
diff --git a/demuxer/LAVSplitter/LAVSplitter.cpp b/demuxer/LAVSplitter/LAVSplitter.cpp
index 5f03507e..a3a6d1b8 100644
--- a/demuxer/LAVSplitter/LAVSplitter.cpp
+++ b/demuxer/LAVSplitter/LAVSplitter.cpp
@@ -595,7 +595,7 @@ STDMETHODIMP CLAVSplitter::InitDemuxer()
const CBaseDemuxer::stream *videoStream = m_pDemuxer->SelectVideoStream();
if (videoStream) {
- CLAVOutputPin* pPin = new CLAVOutputPin(videoStream->streamInfo->mtypes, CBaseDemuxer::CStreamList::ToStringW(CBaseDemuxer::video), this, this, &hr, CBaseDemuxer::video, m_pDemuxer->GetContainerFormat(), true);
+ CLAVOutputPin* pPin = new CLAVOutputPin(videoStream->streamInfo->mtypes, CBaseDemuxer::CStreamList::ToStringW(CBaseDemuxer::video), this, this, &hr, CBaseDemuxer::video, m_pDemuxer->GetContainerFormat());
if(SUCCEEDED(hr)) {
pPin->SetStreamId(videoStream->pid);
m_pPins.push_back(pPin);
@@ -608,7 +608,7 @@ STDMETHODIMP CLAVSplitter::InitDemuxer()
std::list<std::string> audioLangs = GetPreferredAudioLanguageList();
const CBaseDemuxer::stream *audioStream = m_pDemuxer->SelectAudioStream(audioLangs);
if (audioStream) {
- CLAVOutputPin* pPin = new CLAVOutputPin(audioStream->streamInfo->mtypes, CBaseDemuxer::CStreamList::ToStringW(CBaseDemuxer::audio), this, this, &hr, CBaseDemuxer::audio, m_pDemuxer->GetContainerFormat(), m_pPins.empty());
+ CLAVOutputPin* pPin = new CLAVOutputPin(audioStream->streamInfo->mtypes, CBaseDemuxer::CStreamList::ToStringW(CBaseDemuxer::audio), this, this, &hr, CBaseDemuxer::audio, m_pDemuxer->GetContainerFormat());
if(SUCCEEDED(hr)) {
pPin->SetStreamId(audioStream->pid);
m_pPins.push_back(pPin);
@@ -623,7 +623,7 @@ STDMETHODIMP CLAVSplitter::InitDemuxer()
std::list<CSubtitleSelector> subtitleSelectors = GetSubtitleSelectors();
const CBaseDemuxer::stream *subtitleStream = m_pDemuxer->SelectSubtitleStream(subtitleSelectors, audioLanguage);
if (subtitleStream && !bNoSubtitles) {
- CLAVOutputPin* pPin = new CLAVOutputPin(subtitleStream->streamInfo->mtypes, CBaseDemuxer::CStreamList::ToStringW(CBaseDemuxer::subpic), this, this, &hr, CBaseDemuxer::subpic, m_pDemuxer->GetContainerFormat(), m_pPins.empty());
+ CLAVOutputPin* pPin = new CLAVOutputPin(subtitleStream->streamInfo->mtypes, CBaseDemuxer::CStreamList::ToStringW(CBaseDemuxer::subpic), this, this, &hr, CBaseDemuxer::subpic, m_pDemuxer->GetContainerFormat());
if(SUCCEEDED(hr)) {
pPin->SetStreamId(subtitleStream->pid);
m_pPins.push_back(pPin);
@@ -721,7 +721,7 @@ DWORD CLAVSplitter::ThreadProc()
m_pActivePins.push_back(*pinIter);
}
}
- m_rtOffset = 0;
+ m_rtOffset = AV_NOPTS_VALUE;
m_bDiscontinuitySent.clear();
@@ -801,12 +801,19 @@ HRESULT CLAVSplitter::DeliverPacket(Packet *pPacket)
// This will try to compensate for timestamp discontinuities in the stream
if (m_pDemuxer->GetContainerFlags() & LAVFMT_TS_DISCONT) {
if (!pPin->IsSubtitlePin()) {
+ // Initialize on the first stream coming in
+ if (pPin->m_rtPrev == AV_NOPTS_VALUE && m_rtOffset == AV_NOPTS_VALUE) {
+ pPin->m_rtPrev = 0;
+ m_rtOffset = 0;
+ }
+
REFERENCE_TIME rt = pPacket->rtStart + m_rtOffset;
+
if(pPin->m_rtPrev != AV_NOPTS_VALUE && _abs64(rt - pPin->m_rtPrev) > MAX_PTS_SHIFT) {
m_rtOffset += pPin->m_rtPrev - rt;
if (!(m_pDemuxer->GetContainerFlags() & LAVFMT_TS_DISCONT_NO_DOWNSTREAM))
m_bDiscontinuitySent.clear();
- DbgLog((LOG_TRACE, 10, L"::DeliverPacket(): MPEG-TS/PS discontinuity detected, adjusting offset to %I64d", m_rtOffset));
+ DbgLog((LOG_TRACE, 10, L"::DeliverPacket(): MPEG-TS/PS discontinuity detected, adjusting offset to %I64d (stream: %d, prev: %I64d, now: %I64d)", m_rtOffset, pPacket->StreamId, pPin->m_rtPrev, rt));
}
}
pPacket->rtStart += m_rtOffset;
diff --git a/demuxer/LAVSplitter/LAVSplitter.h b/demuxer/LAVSplitter/LAVSplitter.h
index 4844bf46..4c921456 100644
--- a/demuxer/LAVSplitter/LAVSplitter.h
+++ b/demuxer/LAVSplitter/LAVSplitter.h
@@ -251,7 +251,7 @@ private:
REFERENCE_TIME m_rtCurrent = 0;
REFERENCE_TIME m_rtNewStart = 0;
REFERENCE_TIME m_rtNewStop = 0;
- REFERENCE_TIME m_rtOffset = 0;
+ REFERENCE_TIME m_rtOffset = AV_NOPTS_VALUE;
double m_dRate = 1.0;
BOOL m_bStopValid = FALSE;
diff --git a/demuxer/LAVSplitter/OutputPin.cpp b/demuxer/LAVSplitter/OutputPin.cpp
index 0f3dfda3..6824dcf6 100644
--- a/demuxer/LAVSplitter/OutputPin.cpp
+++ b/demuxer/LAVSplitter/OutputPin.cpp
@@ -28,16 +28,13 @@
#include "PacketAllocator.h"
-CLAVOutputPin::CLAVOutputPin(std::vector<CMediaType>& mts, LPCWSTR pName, CBaseFilter *pFilter, CCritSec *pLock, HRESULT *phr, CBaseDemuxer::StreamType pinType, const char* container, bool bFirst)
+CLAVOutputPin::CLAVOutputPin(std::vector<CMediaType>& mts, LPCWSTR pName, CBaseFilter *pFilter, CCritSec *pLock, HRESULT *phr, CBaseDemuxer::StreamType pinType, const char* container)
: CBaseOutputPin(NAME("lavf dshow output pin"), pFilter, pLock, phr, pName)
, m_containerFormat(container)
, m_pinType(pinType)
, m_Parser(this, container)
- , m_bFirstPin(bFirst)
, m_mts(mts)
{
- m_rtPrev = m_bFirstPin ? 0 : AV_NOPTS_VALUE;
-
SetQueueSizes();
}
@@ -291,7 +288,7 @@ HRESULT CLAVOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME t
{
HRESULT hr = S_OK;
DbgLog((LOG_TRACE, 20, L"::DeliverNewSegment on %s Pin (rtStart: %I64d; rtStop: %I64d)", CBaseDemuxer::CStreamList::ToStringW(m_pinType), tStart, tStop));
- m_rtPrev = m_bFirstPin ? 0 : AV_NOPTS_VALUE;
+ m_rtPrev = AV_NOPTS_VALUE;
if(m_fFlushing) return S_FALSE;
if(!ThreadExists()) return S_FALSE;
diff --git a/demuxer/LAVSplitter/OutputPin.h b/demuxer/LAVSplitter/OutputPin.h
index 0d6612f6..712238e6 100644
--- a/demuxer/LAVSplitter/OutputPin.h
+++ b/demuxer/LAVSplitter/OutputPin.h
@@ -41,7 +41,7 @@ class CLAVOutputPin
, protected CAMThread
{
public:
- CLAVOutputPin(std::vector<CMediaType>& mts, LPCWSTR pName, CBaseFilter *pFilter, CCritSec *pLock, HRESULT *phr, CBaseDemuxer::StreamType pinType = CBaseDemuxer::unknown,const char* container = "", bool bFirst = false);
+ CLAVOutputPin(std::vector<CMediaType>& mts, LPCWSTR pName, CBaseFilter *pFilter, CCritSec *pLock, HRESULT *phr, CBaseDemuxer::StreamType pinType = CBaseDemuxer::unknown,const char* container = "");
virtual ~CLAVOutputPin();
DECLARE_IUNKNOWN;
@@ -142,8 +142,6 @@ private:
std::string m_containerFormat;
- bool m_bFirstPin = false;
-
// Flush control
bool m_fFlushing = false;
bool m_fFlushed = false;