From 289e158b3507ff50c77768a28eb18bfc6cd707f2 Mon Sep 17 00:00:00 2001 From: Hendrik Leppkes Date: Mon, 1 Sep 2014 15:24:13 +0200 Subject: Workaround an issue with the Microsoft File Source (URL) and EOF handling Fixes issue 463 --- demuxer/LAVSplitter/InputPin.cpp | 25 +++++++++++++++++++------ demuxer/LAVSplitter/InputPin.h | 2 ++ 2 files changed, 21 insertions(+), 6 deletions(-) (limited to 'demuxer') diff --git a/demuxer/LAVSplitter/InputPin.cpp b/demuxer/LAVSplitter/InputPin.cpp index d4c1ac86..10cd1284 100644 --- a/demuxer/LAVSplitter/InputPin.cpp +++ b/demuxer/LAVSplitter/InputPin.cpp @@ -108,15 +108,23 @@ HRESULT CLAVInputPin::CompleteConnect(IPin* pPin) } m_llPos = 0; + m_bURLSource = false; - if (FAILED(pPin->QueryInterface(&m_pStreamControl))) { - PIN_INFO pinInfo = {0}; - if (SUCCEEDED(pPin->QueryPinInfo(&pinInfo)) && pinInfo.pFilter) { + if (FAILED(pPin->QueryInterface(&m_pStreamControl))) + m_pStreamControl = nullptr; + + PIN_INFO pinInfo = {0}; + if (SUCCEEDED(pPin->QueryPinInfo(&pinInfo)) && pinInfo.pFilter) { + CLSID clsidFilter = GUID_NULL; + if (SUCCEEDED(pinInfo.pFilter->GetClassID(&clsidFilter))) { + m_bURLSource = (clsidFilter == CLSID_URLReader); + } + + if (m_pStreamControl == nullptr) if (FAILED(pinInfo.pFilter->QueryInterface(&m_pStreamControl))) m_pStreamControl = nullptr; - SafeRelease(&(pinInfo.pFilter)); - } else - m_pStreamControl = nullptr; + + SafeRelease(&(pinInfo.pFilter)); } if(FAILED(hr = (static_cast(m_pFilter))->CompleteInputConnection())) { @@ -131,8 +139,13 @@ int CLAVInputPin::Read(void *opaque, uint8_t *buf, int buf_size) CLAVInputPin *pin = static_cast(opaque); CAutoLock lock(pin); + // The URL source doesn't properly signal EOF in all cases, so make sure no stale data is in the buffer + if (pin->m_bURLSource) + memset(buf, 0, buf_size); + HRESULT hr = pin->m_pAsyncReader->SyncRead(pin->m_llPos, buf_size, buf); if (FAILED(hr)) { + DbgLog((LOG_TRACE, 10, L"Read failed at pos: %I64d, hr: 0x%X", pin->m_llPos, hr)); return -1; } if (hr == S_FALSE) { diff --git a/demuxer/LAVSplitter/InputPin.h b/demuxer/LAVSplitter/InputPin.h index 7227d189..afcbe788 100644 --- a/demuxer/LAVSplitter/InputPin.h +++ b/demuxer/LAVSplitter/InputPin.h @@ -59,4 +59,6 @@ private: AVIOContext *m_pAVIOContext = nullptr; IStreamSourceControl *m_pStreamControl = nullptr; + + BOOL m_bURLSource = false; }; -- cgit v1.2.3