diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2014-01-14 18:16:20 +0400 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2014-01-14 18:39:13 +0400 |
commit | 69458cf1eb90258c6ba989713c5040ab86f73c7a (patch) | |
tree | 92b7c8969d4ff964eff5bd38f557d9fcbac9ecfd /demuxer | |
parent | 26b99598cdac7c7cd0a5e7afa1cac84ed7a7c240 (diff) |
Implement an interface for high-level streaming control.
Diffstat (limited to 'demuxer')
-rw-r--r-- | demuxer/Demuxers/BDDemuxer.h | 1 | ||||
-rw-r--r-- | demuxer/Demuxers/BaseDemuxer.h | 2 | ||||
-rw-r--r-- | demuxer/Demuxers/LAVFDemuxer.cpp | 5 | ||||
-rw-r--r-- | demuxer/Demuxers/LAVFDemuxer.h | 1 | ||||
-rw-r--r-- | demuxer/LAVSplitter/InputPin.cpp | 11 | ||||
-rw-r--r-- | demuxer/LAVSplitter/InputPin.h | 10 | ||||
-rw-r--r-- | demuxer/LAVSplitter/LAVSplitter.cpp | 34 | ||||
-rw-r--r-- | demuxer/LAVSplitter/LAVSplitter.vcxproj | 1 | ||||
-rw-r--r-- | demuxer/LAVSplitter/LAVSplitter.vcxproj.filters | 3 |
9 files changed, 64 insertions, 4 deletions
diff --git a/demuxer/Demuxers/BDDemuxer.h b/demuxer/Demuxers/BDDemuxer.h index 00fe00cd..736d29a2 100644 --- a/demuxer/Demuxers/BDDemuxer.h +++ b/demuxer/Demuxers/BDDemuxer.h @@ -45,6 +45,7 @@ public: REFERENCE_TIME GetDuration() const; STDMETHODIMP GetNextPacket(Packet **ppPacket); STDMETHODIMP Seek(REFERENCE_TIME rTime); + STDMETHODIMP Reset() { return E_NOTIMPL; } const char *GetContainerFormat() const; virtual DWORD GetContainerFlags() { return LAVFMT_TS_DISCONT|LAVFMT_TS_DISCONT_NO_DOWNSTREAM; } diff --git a/demuxer/Demuxers/BaseDemuxer.h b/demuxer/Demuxers/BaseDemuxer.h index b733ef3f..c65e6ed2 100644 --- a/demuxer/Demuxers/BaseDemuxer.h +++ b/demuxer/Demuxers/BaseDemuxer.h @@ -79,6 +79,8 @@ public: virtual STDMETHODIMP GetNextPacket(Packet **ppPacket) = 0; // Seek to the given position virtual STDMETHODIMP Seek(REFERENCE_TIME rTime) = 0; + // Reset the demuxer, start reading at position 0 + virtual STDMETHODIMP Reset() = 0; // Get the container format virtual const char *GetContainerFormat() const = 0; // Get Container Flags diff --git a/demuxer/Demuxers/LAVFDemuxer.cpp b/demuxer/Demuxers/LAVFDemuxer.cpp index 7b27f817..8ece6d6c 100644 --- a/demuxer/Demuxers/LAVFDemuxer.cpp +++ b/demuxer/Demuxers/LAVFDemuxer.cpp @@ -1116,6 +1116,11 @@ STDMETHODIMP CLAVFDemuxer::SeekByte(int64_t pos, int flags) return S_OK; } +STDMETHODIMP CLAVFDemuxer::Reset() +{ + return SeekByte(0, AVSEEK_FLAG_ANY); +} + const char *CLAVFDemuxer::GetContainerFormat() const { return m_pszInputFormat; diff --git a/demuxer/Demuxers/LAVFDemuxer.h b/demuxer/Demuxers/LAVFDemuxer.h index 83148938..b743c41b 100644 --- a/demuxer/Demuxers/LAVFDemuxer.h +++ b/demuxer/Demuxers/LAVFDemuxer.h @@ -59,6 +59,7 @@ public: REFERENCE_TIME GetDuration() const; STDMETHODIMP GetNextPacket(Packet **ppPacket); STDMETHODIMP Seek(REFERENCE_TIME rTime); + STDMETHODIMP Reset(); const char *GetContainerFormat() const; virtual DWORD GetContainerFlags() { return m_bTSDiscont ? LAVFMT_TS_DISCONT : 0; } diff --git a/demuxer/LAVSplitter/InputPin.cpp b/demuxer/LAVSplitter/InputPin.cpp index e631e768..d4c1ac86 100644 --- a/demuxer/LAVSplitter/InputPin.cpp +++ b/demuxer/LAVSplitter/InputPin.cpp @@ -83,6 +83,7 @@ HRESULT CLAVInputPin::BreakConnect() } SafeRelease(&m_pAsyncReader); + SafeRelease(&m_pStreamControl); if (m_pAVIOContext) { av_free(m_pAVIOContext->buffer); @@ -108,6 +109,16 @@ HRESULT CLAVInputPin::CompleteConnect(IPin* pPin) m_llPos = 0; + if (FAILED(pPin->QueryInterface(&m_pStreamControl))) { + PIN_INFO pinInfo = {0}; + if (SUCCEEDED(pPin->QueryPinInfo(&pinInfo)) && pinInfo.pFilter) { + if (FAILED(pinInfo.pFilter->QueryInterface(&m_pStreamControl))) + m_pStreamControl = nullptr; + SafeRelease(&(pinInfo.pFilter)); + } else + m_pStreamControl = nullptr; + } + if(FAILED(hr = (static_cast<CLAVSplitter *>(m_pFilter))->CompleteInputConnection())) { return hr; } diff --git a/demuxer/LAVSplitter/InputPin.h b/demuxer/LAVSplitter/InputPin.h index 727f6074..7227d189 100644 --- a/demuxer/LAVSplitter/InputPin.h +++ b/demuxer/LAVSplitter/InputPin.h @@ -19,9 +19,11 @@ #pragma once +#include "IStreamSourceControl.h" + class CLAVSplitter; -class CLAVInputPin : public CBasePin, public CCritSec +class CLAVInputPin : public CBasePin, public CCritSec, public IStreamSourceControl { public: CLAVInputPin(TCHAR* pName, CLAVSplitter *pFilter, CCritSec* pLock, HRESULT* phr); @@ -42,6 +44,10 @@ public: CMediaType& CurrentMediaType() { return m_mt; } + // IStreamSourceControl + STDMETHODIMP GetStreamDuration(REFERENCE_TIME *prtDuration) { CheckPointer(m_pStreamControl, E_NOTIMPL); return m_pStreamControl->GetStreamDuration(prtDuration); } + STDMETHODIMP SeekStream(REFERENCE_TIME rtPosition) { CheckPointer(m_pStreamControl, E_NOTIMPL); return m_pStreamControl->SeekStream(rtPosition); } + protected: static int Read(void *opaque, uint8_t *buf, int buf_size); static int64_t Seek(void *opaque, int64_t offset, int whence); @@ -51,4 +57,6 @@ protected: private: IAsyncReader *m_pAsyncReader = nullptr; AVIOContext *m_pAVIOContext = nullptr; + + IStreamSourceControl *m_pStreamControl = nullptr; }; diff --git a/demuxer/LAVSplitter/LAVSplitter.cpp b/demuxer/LAVSplitter/LAVSplitter.cpp index 02abe2f2..db15ca5c 100644 --- a/demuxer/LAVSplitter/LAVSplitter.cpp +++ b/demuxer/LAVSplitter/LAVSplitter.cpp @@ -688,8 +688,16 @@ DWORD CLAVSplitter::ThreadProc() m_rtStart = m_rtNewStart; m_rtStop = m_rtNewStop; - if(m_bPlaybackStarted || m_rtStart != 0 || cmd == CMD_SEEK) - DemuxSeek(m_rtStart); + if(m_bPlaybackStarted || m_rtStart != 0 || cmd == CMD_SEEK) { + HRESULT hr = S_FALSE; + if (m_pInput) { + hr = m_pInput->SeekStream(m_rtStart); + if (SUCCEEDED(hr)) + m_pDemuxer->Reset(); + } + if (hr != S_OK) + DemuxSeek(m_rtStart); + } if(cmd != (DWORD)-1) Reply(S_OK); @@ -970,7 +978,27 @@ STDMETHODIMP CLAVSplitter::QueryPreferredFormat(GUID* pFormat) {return GetTimeFo STDMETHODIMP CLAVSplitter::GetTimeFormat(GUID* pFormat) {return pFormat ? *pFormat = TIME_FORMAT_MEDIA_TIME, S_OK : E_POINTER;} STDMETHODIMP CLAVSplitter::IsUsingTimeFormat(const GUID* pFormat) {return IsFormatSupported(pFormat);} STDMETHODIMP CLAVSplitter::SetTimeFormat(const GUID* pFormat) {return S_OK == IsFormatSupported(pFormat) ? S_OK : E_INVALIDARG;} -STDMETHODIMP CLAVSplitter::GetDuration(LONGLONG* pDuration) {CheckPointer(pDuration, E_POINTER); CheckPointer(m_pDemuxer, E_UNEXPECTED); *pDuration = m_pDemuxer->GetDuration(); if (*pDuration < 0) return E_FAIL; return S_OK;} + +STDMETHODIMP CLAVSplitter::GetDuration(LONGLONG* pDuration) { + REFERENCE_TIME rtDuration = -1; + CheckPointer(pDuration, E_POINTER); + CheckPointer(m_pDemuxer, E_UNEXPECTED); + + if (m_pInput) { + if (FAILED(m_pInput->GetStreamDuration(&rtDuration))) + rtDuration = -1; + } + + if (rtDuration < 0) + rtDuration = m_pDemuxer->GetDuration(); + + if (rtDuration < 0) + return E_FAIL; + + *pDuration = rtDuration; + return S_OK; +} + STDMETHODIMP CLAVSplitter::GetStopPosition(LONGLONG* pStop) {return GetDuration(pStop);} STDMETHODIMP CLAVSplitter::GetCurrentPosition(LONGLONG* pCurrent) {return E_NOTIMPL;} STDMETHODIMP CLAVSplitter::ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat) {return E_NOTIMPL;} diff --git a/demuxer/LAVSplitter/LAVSplitter.vcxproj b/demuxer/LAVSplitter/LAVSplitter.vcxproj index 93ead6de..98881e11 100644 --- a/demuxer/LAVSplitter/LAVSplitter.vcxproj +++ b/demuxer/LAVSplitter/LAVSplitter.vcxproj @@ -115,6 +115,7 @@ <ClInclude Include="..\..\common\includes\ILAVPinInfo.h" /> <ClInclude Include="..\..\common\includes\inttypes.h" /> <ClInclude Include="..\..\common\includes\ISpecifyPropertyPages2.h" /> + <ClInclude Include="..\..\common\includes\IStreamSourceControl.h" /> <ClInclude Include="..\..\common\includes\ITrackInfo.h" /> <ClInclude Include="..\..\common\includes\LAVSplitterSettings.h" /> <ClInclude Include="..\..\common\includes\LAVSplitterSettingsInternal.h" /> diff --git a/demuxer/LAVSplitter/LAVSplitter.vcxproj.filters b/demuxer/LAVSplitter/LAVSplitter.vcxproj.filters index 043a3b87..9ed9f886 100644 --- a/demuxer/LAVSplitter/LAVSplitter.vcxproj.filters +++ b/demuxer/LAVSplitter/LAVSplitter.vcxproj.filters @@ -113,6 +113,9 @@ <ClInclude Include="LAVSplitterTrayIcon.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="..\..\common\includes\IStreamSourceControl.h"> + <Filter>Header Files\common</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <ResourceCompile Include="LAVSplitter.rc"> |