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:
-rw-r--r--decoder/LAVVideo/LAVVideo.cpp5
-rw-r--r--decoder/LAVVideo/LAVVideo.h1
-rw-r--r--decoder/LAVVideo/VideoInputPin.cpp17
-rw-r--r--decoder/LAVVideo/VideoInputPin.h7
-rw-r--r--decoder/LAVVideo/decoders/ILAVDecoder.h5
-rw-r--r--decoder/LAVVideo/decoders/avcodec.cpp4
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;
}