diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-11-07 01:42:07 +0400 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-11-07 02:11:21 +0400 |
commit | af3c29e6b8e8dd7d578b0197bffdba7474e137d1 (patch) | |
tree | 8b5b396b4da6ce7f28825bb98a77838da51dfccd /demuxer | |
parent | decc7bc5f852944682658d1fdc1456c57dc1ab31 (diff) |
Avoid a race condition between seeking and stopping.
Diffstat (limited to 'demuxer')
-rw-r--r-- | demuxer/LAVSplitter/LAVSplitter.cpp | 4 | ||||
-rw-r--r-- | demuxer/LAVSplitter/LAVSplitter.h | 1 |
2 files changed, 5 insertions, 0 deletions
diff --git a/demuxer/LAVSplitter/LAVSplitter.cpp b/demuxer/LAVSplitter/LAVSplitter.cpp index f1684528..0902da76 100644 --- a/demuxer/LAVSplitter/LAVSplitter.cpp +++ b/demuxer/LAVSplitter/LAVSplitter.cpp @@ -705,6 +705,8 @@ DWORD CLAVSplitter::ThreadProc() return 0; } + m_csPlaybackInit.Lock(); + m_rtStart = m_rtNewStart; m_rtStop = m_rtNewStop; @@ -730,6 +732,7 @@ DWORD CLAVSplitter::ThreadProc() m_bDiscontinuitySent.clear(); m_bPlaybackStarted = TRUE; + m_csPlaybackInit.Unlock(); HRESULT hr = S_OK; while(SUCCEEDED(hr) && !CheckRequest(&cmd)) { @@ -862,6 +865,7 @@ STDMETHODIMP_(CMediaType *) CLAVSplitter::GetOutputMediatype(int stream) STDMETHODIMP CLAVSplitter::Stop() { CAutoLock cAutoLock(this); + CAutoLock cPlaybackLock(&m_csPlaybackInit); // Ask network operations to exit if (m_pDemuxer) diff --git a/demuxer/LAVSplitter/LAVSplitter.h b/demuxer/LAVSplitter/LAVSplitter.h index dba1f72c..a7846c3d 100644 --- a/demuxer/LAVSplitter/LAVSplitter.h +++ b/demuxer/LAVSplitter/LAVSplitter.h @@ -232,6 +232,7 @@ protected: private: CCritSec m_csPins; + CCritSec m_csPlaybackInit; std::vector<CLAVOutputPin *> m_pPins; std::vector<CLAVOutputPin *> m_pActivePins; std::vector<CLAVOutputPin *> m_pRetiredPins; |