diff options
-rw-r--r-- | decoder/LAVVideo/LAVVideo.cpp | 5 | ||||
-rw-r--r-- | decoder/LAVVideo/LAVVideo.h | 1 | ||||
-rw-r--r-- | decoder/LAVVideo/VideoInputPin.cpp | 17 | ||||
-rw-r--r-- | decoder/LAVVideo/VideoInputPin.h | 7 | ||||
-rw-r--r-- | decoder/LAVVideo/decoders/ILAVDecoder.h | 5 | ||||
-rw-r--r-- | decoder/LAVVideo/decoders/avcodec.cpp | 4 |
6 files changed, 37 insertions, 2 deletions
diff --git a/decoder/LAVVideo/LAVVideo.cpp b/decoder/LAVVideo/LAVVideo.cpp index 2fbd52f5..be7221b3 100644 --- a/decoder/LAVVideo/LAVVideo.cpp +++ b/decoder/LAVVideo/LAVVideo.cpp @@ -2007,6 +2007,11 @@ STDMETHODIMP CLAVVideo::Read(LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog *pE return E_INVALIDARG; } +STDMETHODIMP_(BOOL) CLAVVideo::HasDynamicInputAllocator() +{ + return dynamic_cast<CVideoInputPin*>(m_pInput)->HasDynamicAllocator(); +} + // ILAVVideoSettings STDMETHODIMP CLAVVideo::SetRuntimeConfig(BOOL bRuntimeConfig) { diff --git a/decoder/LAVVideo/LAVVideo.h b/decoder/LAVVideo/LAVVideo.h index 57b65253..d626af9b 100644 --- a/decoder/LAVVideo/LAVVideo.h +++ b/decoder/LAVVideo/LAVVideo.h @@ -181,6 +181,7 @@ public: STDMETHODIMP_(LAVFrame*) GetFlushFrame(); STDMETHODIMP ReleaseAllDXVAResources() { ReleaseLastSequenceFrame(); return S_OK; } STDMETHODIMP_(DWORD) GetGPUDeviceIndex() { return m_dwGPUDeviceIndex; } + STDMETHODIMP_(BOOL) HasDynamicInputAllocator(); // IPropertyBag STDMETHODIMP Read(LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog *pErrorLog); diff --git a/decoder/LAVVideo/VideoInputPin.cpp b/decoder/LAVVideo/VideoInputPin.cpp index 3cbfbfac..e4f2cb31 100644 --- a/decoder/LAVVideo/VideoInputPin.cpp +++ b/decoder/LAVVideo/VideoInputPin.cpp @@ -19,6 +19,7 @@ #include "stdafx.h" #include "VideoInputPin.h" +#include "ILAVDynamicAllocator.h" CVideoInputPin::CVideoInputPin(TCHAR* pObjectName, CLAVVideo* pFilter, HRESULT* phr, LPWSTR pName) : CDeCSSTransformInputPin(pObjectName, pFilter, phr, pName) @@ -26,6 +27,22 @@ CVideoInputPin::CVideoInputPin(TCHAR* pObjectName, CLAVVideo* pFilter, HRESULT* { } +STDMETHODIMP CVideoInputPin::NotifyAllocator(IMemAllocator * pAllocator, BOOL bReadOnly) +{ + HRESULT hr = __super::NotifyAllocator(pAllocator, bReadOnly); + + m_bDynamicAllocator = FALSE; + if (SUCCEEDED(hr) && pAllocator) { + ILAVDynamicAllocator *pDynamicAllocator = nullptr; + if (SUCCEEDED(pAllocator->QueryInterface(&pDynamicAllocator))) { + m_bDynamicAllocator = pDynamicAllocator->IsDynamicAllocator(); + } + SafeRelease(&pDynamicAllocator); + } + + return hr; +} + // IKsPropertySet STDMETHODIMP CVideoInputPin::Set(REFGUID PropSet, ULONG Id, LPVOID pInstanceData, ULONG InstanceLength, LPVOID pPropertyData, ULONG DataLength) diff --git a/decoder/LAVVideo/VideoInputPin.h b/decoder/LAVVideo/VideoInputPin.h index 4a4304b9..5377db49 100644 --- a/decoder/LAVVideo/VideoInputPin.h +++ b/decoder/LAVVideo/VideoInputPin.h @@ -27,16 +27,23 @@ class CVideoInputPin : public CDeCSSTransformInputPin public: CVideoInputPin(TCHAR* pObjectName, CLAVVideo* pFilter, HRESULT* phr, LPWSTR pName); + // IMemInputPin + STDMETHODIMP NotifyAllocator(IMemAllocator * pAllocator, BOOL bReadOnly); + // IKsPropertySet STDMETHODIMP Set(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength); STDMETHODIMP Get(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength, ULONG* pBytesReturned); STDMETHODIMP QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport); AM_SimpleRateChange GetDVDRateChange() { CAutoLock cAutoLock(&m_csRateLock); return m_ratechange; } + + BOOL HasDynamicAllocator() { return m_bDynamicAllocator; } private: CLAVVideo *m_pLAVVideo = nullptr; CCritSec m_csRateLock; int m_CorrectTS = 0; AM_SimpleRateChange m_ratechange = AM_SimpleRateChange{AV_NOPTS_VALUE, 10000}; + + BOOL m_bDynamicAllocator = FALSE; }; diff --git a/decoder/LAVVideo/decoders/ILAVDecoder.h b/decoder/LAVVideo/decoders/ILAVDecoder.h index c4cb5501..39400ec8 100644 --- a/decoder/LAVVideo/decoders/ILAVDecoder.h +++ b/decoder/LAVVideo/decoders/ILAVDecoder.h @@ -282,6 +282,11 @@ interface ILAVVideoCallback * Get the index of the GPU device to be used for HW decoding, DWORD_MAX if not set */ STDMETHOD_(DWORD, GetGPUDeviceIndex)() PURE; + + /** + * Check if the input is using a dynamic allocator + */ + STDMETHOD_(BOOL, HasDynamicInputAllocator)() PURE; }; /** diff --git a/decoder/LAVVideo/decoders/avcodec.cpp b/decoder/LAVVideo/decoders/avcodec.cpp index 17e34d81..c9840a01 100644 --- a/decoder/LAVVideo/decoders/avcodec.cpp +++ b/decoder/LAVVideo/decoders/avcodec.cpp @@ -648,7 +648,7 @@ STDMETHODIMP CDecAvcodec::FillAVPacketData(AVPacket *avpkt, const uint8_t *buffe avpkt->data = (uint8_t *)buffer; avpkt->size = buflen; - if (pSample && bRefCounting) + if (pSample && bRefCounting && m_pCallback->HasDynamicInputAllocator()) { avpkt->buf = av_buffer_create(avpkt->data, avpkt->size, avpacket_mediasample_free, pSample, AV_BUFFER_FLAG_READONLY); if (!avpkt->buf) { @@ -722,7 +722,7 @@ STDMETHODIMP CDecAvcodec::Decode(const BYTE *buffer, int buflen, REFERENCE_TIME AVPacket *avpkt = av_packet_alloc(); // set data pointers - if (FAILED(FillAVPacketData(avpkt, buffer, buflen, pSample, false))) + if (FAILED(FillAVPacketData(avpkt, buffer, buflen, pSample, true))) { return E_OUTOFMEMORY; } |