diff options
-rw-r--r-- | demuxer/LAVSplitter/LAVSplitter.cpp | 17 | ||||
-rw-r--r-- | demuxer/LAVSplitter/LAVSplitter.h | 2 | ||||
-rw-r--r-- | demuxer/LAVSplitter/OutputPin.cpp | 7 | ||||
-rw-r--r-- | demuxer/LAVSplitter/OutputPin.h | 4 |
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; |