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>2014-01-14 18:16:20 +0400
committerHendrik Leppkes <h.leppkes@gmail.com>2014-01-14 18:39:13 +0400
commit69458cf1eb90258c6ba989713c5040ab86f73c7a (patch)
tree92b7c8969d4ff964eff5bd38f557d9fcbac9ecfd /demuxer
parent26b99598cdac7c7cd0a5e7afa1cac84ed7a7c240 (diff)
Implement an interface for high-level streaming control.
Diffstat (limited to 'demuxer')
-rw-r--r--demuxer/Demuxers/BDDemuxer.h1
-rw-r--r--demuxer/Demuxers/BaseDemuxer.h2
-rw-r--r--demuxer/Demuxers/LAVFDemuxer.cpp5
-rw-r--r--demuxer/Demuxers/LAVFDemuxer.h1
-rw-r--r--demuxer/LAVSplitter/InputPin.cpp11
-rw-r--r--demuxer/LAVSplitter/InputPin.h10
-rw-r--r--demuxer/LAVSplitter/LAVSplitter.cpp34
-rw-r--r--demuxer/LAVSplitter/LAVSplitter.vcxproj1
-rw-r--r--demuxer/LAVSplitter/LAVSplitter.vcxproj.filters3
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">