diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-04-13 10:34:53 +0400 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-04-13 10:34:53 +0400 |
commit | e8e062dde77ee91dc7b5a7f20557c5bf3f38c385 (patch) | |
tree | 5a9d38cb2e1cb05f5ebfad07b510dc5d684a9339 | |
parent | 826f5da04f7d489d84571ffa532a2286edb2d8b4 (diff) |
Fix media type handling when switching video streams
-rw-r--r-- | demuxer/LAVSplitter/OutputPin.cpp | 11 | ||||
-rw-r--r-- | demuxer/LAVSplitter/OutputPin.h | 3 |
2 files changed, 13 insertions, 1 deletions
diff --git a/demuxer/LAVSplitter/OutputPin.cpp b/demuxer/LAVSplitter/OutputPin.cpp index 39a4a4c9..9a411385 100644 --- a/demuxer/LAVSplitter/OutputPin.cpp +++ b/demuxer/LAVSplitter/OutputPin.cpp @@ -253,6 +253,12 @@ STDMETHODIMP CLAVOutputPin::Connect(IPin* pReceivePin, const AM_MEDIA_TYPE* pmt) return hr; } +HRESULT CLAVOutputPin::CompleteConnect(IPin *pReceivePin) +{ + m_StreamMT = m_mt; + return __super::CompleteConnect(pReceivePin); +} + HRESULT CLAVOutputPin::DeliverBeginFlush() { DbgLog((LOG_TRACE, 20, L"::DeliverBeginFlush on %s Pin", CBaseDemuxer::CStreamList::ToStringW(m_pinType))); @@ -347,11 +353,12 @@ HRESULT CLAVOutputPin::QueuePacket(Packet *pPacket) if(m_newMT && pPacket) { DbgLog((LOG_TRACE, 10, L"::QueuePacket() - Found new Media Type")); pPacket->pmt = CreateMediaType(m_newMT); + SetStreamMediaType(m_newMT); SAFE_DELETE(m_newMT); } } - m_Parser.Parse(m_mt.subtype, pPacket); + m_Parser.Parse(m_StreamMT.subtype, pPacket); return m_hrDeliver; } @@ -485,6 +492,8 @@ HRESULT CLAVOutputPin::DeliverPacket(Packet *pPacket) m_mts.clear(); m_mts.push_back(pmt); pPacket->pmt = NULL; + + SetMediaType(&pmt); } bool fTimeValid = pPacket->rtStart != Packet::INVALID_TIME; diff --git a/demuxer/LAVSplitter/OutputPin.h b/demuxer/LAVSplitter/OutputPin.h index 1e7c6ff4..2a483c8c 100644 --- a/demuxer/LAVSplitter/OutputPin.h +++ b/demuxer/LAVSplitter/OutputPin.h @@ -57,6 +57,7 @@ public: HRESULT Inactive(); STDMETHODIMP Connect(IPin * pReceivePin, const AM_MEDIA_TYPE *pmt); + HRESULT CompleteConnect(IPin *pReceivePin); // IMediaSeeking STDMETHODIMP GetCapabilities(DWORD* pCapabilities); @@ -94,6 +95,7 @@ public: void SetNewMediaTypes(std::vector<CMediaType> pmts) { CAutoLock lock(&m_csMT); m_mts = pmts; SetQueueSizes(); } void SendMediaType(CMediaType *mt) { CAutoLock lock(&m_csMT); m_newMT = mt;} + void SetStreamMediaType(CMediaType *mt) { CAutoLock lock(&m_csMT); m_StreamMT = *mt; } CMediaType& GetActiveMediaType() { return m_mt; } @@ -130,6 +132,7 @@ private: CCritSec m_csMT; std::vector<CMediaType> m_mts; CPacketQueue m_queue; + CMediaType m_StreamMT; std::string m_containerFormat; |