strmbase: Clean up the allocator negotiating for BaseOutputPin.
diff --git a/dlls/qcap/vfwcapture.c b/dlls/qcap/vfwcapture.c
index 3b66bea..8316ddc 100644
--- a/dlls/qcap/vfwcapture.c
+++ b/dlls/qcap/vfwcapture.c
@@ -669,30 +669,38 @@
return 1;
}
+static HRESULT WINAPI VfwPin_DecideBufferSize(IPin *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest)
+{
+ ALLOCATOR_PROPERTIES actual;
+
+ /* What we put here doesn't matter, the
+ driver function should override it then commit */
+ if (!ppropInputRequest->cBuffers)
+ ppropInputRequest->cBuffers = 3;
+ if (!ppropInputRequest->cbBuffer)
+ ppropInputRequest->cbBuffer = 230400;
+ if (!ppropInputRequest->cbAlign)
+ ppropInputRequest->cbAlign = 1;
+
+ return IMemAllocator_SetProperties(pAlloc, ppropInputRequest, &actual);
+}
+
static HRESULT
VfwPin_Construct( IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec,
IPin ** ppPin )
{
static const WCHAR wszOutputPinName[] = { 'O','u','t','p','u','t',0 };
- ALLOCATOR_PROPERTIES ap;
PIN_INFO piOutput;
HRESULT hr;
ppPin = NULL;
- /* What we put here doesn't matter, the
- driver function should override it then commit */
- ap.cBuffers = 3;
- ap.cbBuffer = 230400;
- ap.cbAlign = 1;
- ap.cbPrefix = 0;
-
piOutput.dir = PINDIR_OUTPUT;
piOutput.pFilter = pBaseFilter;
lstrcpyW(piOutput.achName, wszOutputPinName);
ObjectRefCount(TRUE);
- hr = BaseOutputPin_Construct(&VfwPin_Vtbl, sizeof(VfwPinImpl), &piOutput, &ap, NULL, pCritSec, ppPin);
+ hr = BaseOutputPin_Construct(&VfwPin_Vtbl, sizeof(VfwPinImpl), &piOutput, VfwPin_DecideBufferSize, NULL, pCritSec, ppPin);
if (SUCCEEDED(hr))
{
diff --git a/dlls/quartz/acmwrapper.c b/dlls/quartz/acmwrapper.c
index 3fdb320..66ae6c6 100644
--- a/dlls/quartz/acmwrapper.c
+++ b/dlls/quartz/acmwrapper.c
@@ -264,8 +264,6 @@
{
This->has = drv;
- /* Update buffer size of media samples in output */
- ((BaseOutputPin*)This->tf.ppPins[1])->allocProps.cbBuffer = This->pWfOut->nAvgBytesPerSec / 2;
TRACE("Connection accepted\n");
return S_OK;
}
@@ -294,8 +292,6 @@
{
This->has = drv;
- /* Update buffer size of media samples in output */
- ((BaseOutputPin*)This->tf.ppPins[1])->allocProps.cbBuffer = This->pWfOut->nAvgBytesPerSec / 2;
TRACE("Connection accepted\n");
return S_OK;
}
@@ -323,7 +319,25 @@
return S_OK;
}
+static HRESULT WINAPI ACMWrapper_DecideBufferSize(TransformFilter *tf, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest)
+{
+ ACMWrapperImpl *pACM = (ACMWrapperImpl*)tf;
+ ALLOCATOR_PROPERTIES actual;
+
+ if (!ppropInputRequest->cbAlign)
+ ppropInputRequest->cbAlign = 1;
+
+ if (ppropInputRequest->cbBuffer < pACM->pWfOut->nAvgBytesPerSec / 2)
+ ppropInputRequest->cbBuffer = pACM->pWfOut->nAvgBytesPerSec / 2;
+
+ if (!ppropInputRequest->cBuffers)
+ ppropInputRequest->cBuffers = 1;
+
+ return IMemAllocator_SetProperties(pAlloc, ppropInputRequest, &actual);
+}
+
static const TransformFilterFuncTable ACMWrapper_FuncsTable = {
+ ACMWrapper_DecideBufferSize,
NULL,
ACMWrapper_Receive,
NULL,
diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c
index 1b51f46..b2419ea 100644
--- a/dlls/quartz/avidec.c
+++ b/dlls/quartz/avidec.c
@@ -279,11 +279,6 @@
TRACE("(%p)\n", This);
- if (dir == PINDIR_INPUT)
- {
- /* Update buffer size of media samples in output */
- ((BaseOutputPin*)This->tf.ppPins[1])->allocProps.cbBuffer = This->pBihOut->biSizeImage;
- }
return S_OK;
}
@@ -310,7 +305,25 @@
return S_OK;
}
+static HRESULT WINAPI AVIDec_DecideBufferSize(TransformFilter *tf, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest)
+{
+ AVIDecImpl *pAVI = (AVIDecImpl*)tf;
+ ALLOCATOR_PROPERTIES actual;
+
+ if (!ppropInputRequest->cbAlign)
+ ppropInputRequest->cbAlign = 1;
+
+ if (ppropInputRequest->cbBuffer < pAVI->pBihOut->biSizeImage)
+ ppropInputRequest->cbBuffer = pAVI->pBihOut->biSizeImage;
+
+ if (!ppropInputRequest->cBuffers)
+ ppropInputRequest->cBuffers = 1;
+
+ return IMemAllocator_SetProperties(pAlloc, ppropInputRequest, &actual);
+}
+
static const TransformFilterFuncTable AVIDec_FuncsTable = {
+ AVIDec_DecideBufferSize,
AVIDec_StartStreaming,
AVIDec_Receive,
AVIDec_StopStreaming,
diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c
index d36c0d0..c1e9ae5 100644
--- a/dlls/quartz/filesource.c
+++ b/dlls/quartz/filesource.c
@@ -656,6 +656,7 @@
BaseOutputPin pin;
const struct IAsyncReaderVtbl * lpVtblAR;
+ ALLOCATOR_PROPERTIES allocProps;
HANDLE hFile;
BOOL bFlushing;
/* Why would you need more? Every sample has its own handle */
@@ -814,6 +815,24 @@
return hr;
}
+static HRESULT WINAPI FileAsyncReaderPin_DecideBufferSize(IPin *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest)
+{
+ FileAsyncReader *This = (FileAsyncReader *)iface;
+ ALLOCATOR_PROPERTIES actual;
+
+ if (ppropInputRequest->cbAlign && ppropInputRequest->cbAlign != This->allocProps.cbAlign)
+ FIXME("Requested Buffer cbAlign mismatch %i,%i\n",This->allocProps.cbAlign, ppropInputRequest->cbAlign);
+ if (ppropInputRequest->cbPrefix)
+ FIXME("Requested Buffer cbPrefix mismatch %i,%i\n",This->allocProps.cbPrefix, ppropInputRequest->cbPrefix);
+ if (ppropInputRequest->cbBuffer)
+ FIXME("Requested Buffer cbBuffer mismatch %i,%i\n",This->allocProps.cbBuffer, ppropInputRequest->cbBuffer);
+ if (ppropInputRequest->cBuffers)
+ FIXME("Requested Buffer cBuffers mismatch %i,%i\n",This->allocProps.cBuffers, ppropInputRequest->cBuffers);
+
+ return IMemAllocator_SetProperties(pAlloc, &This->allocProps, &actual);
+}
+
+
static HRESULT FileAsyncReader_Construct(HANDLE hFile, IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec, IPin ** ppPin)
{
PIN_INFO piOutput;
@@ -823,7 +842,7 @@
piOutput.dir = PINDIR_OUTPUT;
piOutput.pFilter = pBaseFilter;
strcpyW(piOutput.achName, wszOutputPinName);
- hr = BaseOutputPin_Construct(&FileAsyncReaderPin_Vtbl, sizeof(FileAsyncReader), &piOutput, NULL, FileAsyncReaderPin_AttemptConnection, pCritSec, ppPin);
+ hr = BaseOutputPin_Construct(&FileAsyncReaderPin_Vtbl, sizeof(FileAsyncReader), &piOutput, FileAsyncReaderPin_DecideBufferSize, FileAsyncReaderPin_AttemptConnection, pCritSec, ppPin);
if (SUCCEEDED(hr))
{
@@ -933,7 +952,7 @@
This->handle_list[This->samples + 1 + x] = This->handle_list[x];
}
This->handle_list[This->samples] = CreateEventW(NULL, 1, 0, NULL);
- This->pin.allocProps = *pProps;
+ This->allocProps = *pProps;
}
else
{
diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c
index efa68f6..6574dfa 100644
--- a/dlls/quartz/parser.c
+++ b/dlls/quartz/parser.c
@@ -43,6 +43,7 @@
static HRESULT WINAPI Parser_ChangeStart(IMediaSeeking *iface);
static HRESULT WINAPI Parser_ChangeStop(IMediaSeeking *iface);
static HRESULT WINAPI Parser_ChangeRate(IMediaSeeking *iface);
+static HRESULT WINAPI Parser_OutputPin_DecideBufferSize(IPin *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest);
static inline ParserImpl *impl_from_IMediaSeeking( IMediaSeeking *iface )
{
@@ -411,7 +412,7 @@
This->ppPins = CoTaskMemAlloc((This->cStreams + 2) * sizeof(IPin *));
memcpy(This->ppPins, ppOldPins, (This->cStreams + 1) * sizeof(IPin *));
- hr = BaseOutputPin_Construct(&Parser_OutputPin_Vtbl, sizeof(Parser_OutputPin), piOutput, props, NULL, &This->filter.csFilter, This->ppPins + (This->cStreams + 1));
+ hr = BaseOutputPin_Construct(&Parser_OutputPin_Vtbl, sizeof(Parser_OutputPin), piOutput, Parser_OutputPin_DecideBufferSize, NULL, &This->filter.csFilter, This->ppPins + (This->cStreams + 1));
if (SUCCEEDED(hr))
{
@@ -423,6 +424,7 @@
pin->pin.pin.pinInfo.pFilter = (LPVOID)This;
pin->pin.custom_allocator = 1;
+ pin->allocProps = *props;
This->cStreams++;
BaseFilterImpl_IncrementPinVersion((IBaseFilter*)This);
CoTaskMemFree(ppOldPins);
@@ -528,6 +530,23 @@
SourceSeekingImpl_GetPreroll
};
+static HRESULT WINAPI Parser_OutputPin_DecideBufferSize(IPin *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest)
+{
+ Parser_OutputPin *This = (Parser_OutputPin *)iface;
+ ALLOCATOR_PROPERTIES actual;
+
+ if (ppropInputRequest->cbAlign && ppropInputRequest->cbAlign != This->allocProps.cbAlign)
+ FIXME("Requested Buffer cbAlign mismatch %i,%i\n",This->allocProps.cbAlign, ppropInputRequest->cbAlign);
+ if (ppropInputRequest->cbPrefix)
+ FIXME("Requested Buffer cbPrefix mismatch %i,%i\n",This->allocProps.cbPrefix, ppropInputRequest->cbPrefix);
+ if (ppropInputRequest->cbBuffer)
+ FIXME("Requested Buffer cbBuffer mismatch %i,%i\n",This->allocProps.cbBuffer, ppropInputRequest->cbBuffer);
+ if (ppropInputRequest->cBuffers)
+ FIXME("Requested Buffer cBuffers mismatch %i,%i\n",This->allocProps.cBuffers, ppropInputRequest->cBuffers);
+
+ return IMemAllocator_SetProperties(pAlloc, &This->allocProps, &actual);
+}
+
static HRESULT WINAPI Parser_OutputPin_GetMediaType(IPin *iface, int iPosition, AM_MEDIA_TYPE *pmt)
{
Parser_OutputPin *This = (Parser_OutputPin *)iface;
diff --git a/dlls/quartz/parser.h b/dlls/quartz/parser.h
index 3103c19..06ca757 100644
--- a/dlls/quartz/parser.h
+++ b/dlls/quartz/parser.h
@@ -45,6 +45,7 @@
AM_MEDIA_TYPE * pmt;
LONGLONG dwSamplesProcessed;
+ ALLOCATOR_PROPERTIES allocProps;
} Parser_OutputPin;
extern HRESULT Parser_AddPin(ParserImpl * This, const PIN_INFO * piOutput, ALLOCATOR_PROPERTIES * props, const AM_MEDIA_TYPE * amt);
diff --git a/dlls/strmbase/pin.c b/dlls/strmbase/pin.c
index 3c3d753..089cfe4 100644
--- a/dlls/strmbase/pin.c
+++ b/dlls/strmbase/pin.c
@@ -721,6 +721,48 @@
return hr;
}
+HRESULT WINAPI BaseOutputPinImpl_InitAllocator(BaseOutputPin *This, IMemAllocator **pMemAlloc)
+{
+ return CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (LPVOID*)pMemAlloc);
+}
+
+HRESULT WINAPI BaseOutputPinImpl_DecideAllocator(BaseOutputPin *This, IMemInputPin *pPin, IMemAllocator **pAlloc)
+{
+ HRESULT hr;
+
+ if (!This->custom_allocator)
+ {
+ hr = IMemInputPin_GetAllocator(pPin, pAlloc);
+
+ if (hr == VFW_E_NO_ALLOCATOR)
+ /* Input pin provides no allocator, use standard memory allocator */
+ hr = BaseOutputPinImpl_InitAllocator(This, pAlloc);
+
+ if (SUCCEEDED(hr))
+ {
+ ALLOCATOR_PROPERTIES rProps;
+ ZeroMemory(&rProps, sizeof(ALLOCATOR_PROPERTIES));
+
+ IMemInputPin_GetAllocatorRequirements(pPin, &rProps);
+ hr = This->pDecideBufferSize((IPin*)This, *pAlloc, &rProps);
+ }
+
+ if (SUCCEEDED(hr))
+ hr = IMemInputPin_NotifyAllocator(pPin, *pAlloc, This->readonly);
+ }
+ else
+ {
+ pAlloc = NULL;
+
+ if (This->alloc)
+ hr = IMemInputPin_NotifyAllocator(pPin, This->alloc, This->readonly);
+ else
+ hr = VFW_E_NO_ALLOCATOR;
+ }
+
+ return hr;
+}
+
/*** The Construct functions ***/
/* Function called as a helper to IPin_Connect */
@@ -730,7 +772,6 @@
BaseOutputPin *This = (BaseOutputPin *)iface;
HRESULT hr;
IMemAllocator * pMemAlloc = NULL;
- ALLOCATOR_PROPERTIES actual; /* FIXME: should we put the actual props back in to This? */
TRACE("(%p, %p)\n", pReceivePin, pmt);
dump_AM_MEDIA_TYPE(pmt);
@@ -750,32 +791,12 @@
This->pMemInputPin = NULL;
hr = IPin_QueryInterface(pReceivePin, &IID_IMemInputPin, (LPVOID)&This->pMemInputPin);
- if (SUCCEEDED(hr) && !This->custom_allocator)
+ if (SUCCEEDED(hr))
{
- hr = IMemInputPin_GetAllocator(This->pMemInputPin, &pMemAlloc);
-
- if (hr == VFW_E_NO_ALLOCATOR)
- /* Input pin provides no allocator, use standard memory allocator */
- hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (LPVOID*)&pMemAlloc);
-
- if (SUCCEEDED(hr))
- hr = IMemAllocator_SetProperties(pMemAlloc, &This->allocProps, &actual);
-
- if (SUCCEEDED(hr))
- hr = IMemInputPin_NotifyAllocator(This->pMemInputPin, pMemAlloc, This->readonly);
-
+ hr = BaseOutputPinImpl_DecideAllocator(This, This->pMemInputPin, &pMemAlloc);
if (pMemAlloc)
IMemAllocator_Release(pMemAlloc);
}
- else if (SUCCEEDED(hr))
- {
- if (This->alloc)
- {
- hr = IMemInputPin_NotifyAllocator(This->pMemInputPin, This->alloc, This->readonly);
- }
- else
- hr = VFW_E_NO_ALLOCATOR;
- }
/* break connection if we couldn't get the allocator */
if (FAILED(hr))
@@ -800,7 +821,7 @@
}
static HRESULT OutputPin_Init(const IPinVtbl *OutputPin_Vtbl, const PIN_INFO *
-pPinInfo, const ALLOCATOR_PROPERTIES * props, BasePin_AttemptConnection pConnectProc, LPCRITICAL_SECTION pCritSec,
+pPinInfo, BaseOutputPin_DecideBufferSize pBufferProc, BasePin_AttemptConnection pConnectProc, LPCRITICAL_SECTION pCritSec,
BaseOutputPin * pPinImpl)
{
TRACE("\n");
@@ -819,25 +840,19 @@
pPinImpl->pAttemptConnection = pConnectProc;
else
pPinImpl->pAttemptConnection = OutputPin_AttemptConnection;
+
+ pPinImpl->pDecideBufferSize = pBufferProc;
/* If custom_allocator is set, you will need to specify an allocator
* in the alloc member of the struct before an output pin can connect
*/
pPinImpl->custom_allocator = 0;
pPinImpl->alloc = NULL;
pPinImpl->readonly = FALSE;
- if (props)
- {
- pPinImpl->allocProps = *props;
- if (pPinImpl->allocProps.cbAlign == 0)
- pPinImpl->allocProps.cbAlign = 1;
- }
- else
- ZeroMemory(&pPinImpl->allocProps, sizeof(pPinImpl->allocProps));
return S_OK;
}
-HRESULT WINAPI BaseOutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outputpin_size, const PIN_INFO * pPinInfo, ALLOCATOR_PROPERTIES *props, BasePin_AttemptConnection pConnectProc, LPCRITICAL_SECTION pCritSec, IPin ** ppPin)
+HRESULT WINAPI BaseOutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outputpin_size, const PIN_INFO * pPinInfo, BaseOutputPin_DecideBufferSize pBufferProc, BasePin_AttemptConnection pConnectProc, LPCRITICAL_SECTION pCritSec, IPin ** ppPin)
{
BaseOutputPin * pPinImpl;
@@ -856,7 +871,7 @@
if (!pPinImpl)
return E_OUTOFMEMORY;
- if (SUCCEEDED(OutputPin_Init(OutputPin_Vtbl, pPinInfo, props, pConnectProc, pCritSec, pPinImpl)))
+ if (SUCCEEDED(OutputPin_Init(OutputPin_Vtbl, pPinInfo, pBufferProc, pConnectProc, pCritSec, pPinImpl)))
{
*ppPin = (IPin *)(&pPinImpl->pin.lpVtbl);
return S_OK;
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index 54f4aac..19d2025 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -103,6 +103,13 @@
return S_FALSE;
}
+static HRESULT WINAPI TransformFilter_Output_DecideBufferSize(IPin *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest)
+{
+ BasePin *This = (BasePin *)iface;
+ TransformFilter *pTransformFilter = (TransformFilter *)This->pinInfo.pFilter;
+ return pTransformFilter->pFuncsTable->pfnDecideBufferSize(pTransformFilter, pAlloc, ppropInputRequest);
+}
+
static IPin* WINAPI TransformFilter_GetPin(IBaseFilter *iface, int pos)
{
TransformFilter *This = (TransformFilter *)iface;
@@ -148,13 +155,7 @@
if (SUCCEEDED(hr))
{
- ALLOCATOR_PROPERTIES props;
- props.cbAlign = 1;
- props.cbPrefix = 0;
- props.cbBuffer = 0; /* Will be updated at connection time */
- props.cBuffers = 1;
-
- hr = BaseOutputPin_Construct(&TransformFilter_OutputPin_Vtbl, sizeof(BaseOutputPin), &piOutput, &props, NULL, &pTransformFilter->filter.csFilter, &pTransformFilter->ppPins[1]);
+ hr = BaseOutputPin_Construct(&TransformFilter_OutputPin_Vtbl, sizeof(BaseOutputPin), &piOutput, TransformFilter_Output_DecideBufferSize, NULL, &pTransformFilter->filter.csFilter, &pTransformFilter->ppPins[1]);
if (FAILED(hr))
ERR("Cannot create output pin (%x)\n", hr);
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index be28c91..ffc7d2d 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -28,6 +28,7 @@
typedef LONG (WINAPI *BasePin_GetMediaTypeVersion)(IPin* iface);
typedef HRESULT (WINAPI *BasePin_AttemptConnection)(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt);
typedef HRESULT (WINAPI *BasePin_CheckMediaType)(IPin *iface, const AM_MEDIA_TYPE *pmt);
+typedef HRESULT (WINAPI *BaseOutputPin_DecideBufferSize)(IPin *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest);
typedef IPin* (WINAPI *BaseFilter_GetPin)(IBaseFilter* iface, int iPosition);
typedef LONG (WINAPI *BaseFilter_GetPinCount)(IBaseFilter* iface);
@@ -58,10 +59,10 @@
IMemInputPin * pMemInputPin;
BasePin_AttemptConnection pAttemptConnection;
+ BaseOutputPin_DecideBufferSize pDecideBufferSize;
BOOL custom_allocator;
IMemAllocator *alloc;
BOOL readonly;
- ALLOCATOR_PROPERTIES allocProps;
} BaseOutputPin;
typedef struct BaseInputPin
@@ -110,7 +111,10 @@
HRESULT WINAPI BaseOutputPinImpl_BreakConnect(BaseOutputPin * This);
HRESULT WINAPI BaseOutputPinImpl_Active(BaseOutputPin * This);
HRESULT WINAPI BaseOutputPinImpl_Inactive(BaseOutputPin * This);
-HRESULT WINAPI BaseOutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outputpin_size, const PIN_INFO * pPinInfo, ALLOCATOR_PROPERTIES *props, BasePin_AttemptConnection pConnectProc, LPCRITICAL_SECTION pCritSec, IPin ** ppPin);
+HRESULT WINAPI BaseOutputPinImpl_InitAllocator(BaseOutputPin *This, IMemAllocator **pMemAlloc);
+HRESULT WINAPI BaseOutputPinImpl_DecideAllocator(BaseOutputPin *This, IMemInputPin *pPin, IMemAllocator **pAlloc);
+
+HRESULT WINAPI BaseOutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outputpin_size, const PIN_INFO * pPinInfo, BaseOutputPin_DecideBufferSize pBufferProc, BasePin_AttemptConnection pConnectProc, LPCRITICAL_SECTION pCritSec, IPin ** ppPin);
/* Base Input Pin */
HRESULT WINAPI BaseInputPinImpl_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv);
@@ -171,6 +175,7 @@
const struct TransformFilterFuncTable * pFuncsTable;
} TransformFilter;
+typedef HRESULT (WINAPI *TransformFilter_DecideBufferSize) (TransformFilter *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest);
typedef HRESULT (WINAPI *TransformFilter_StartStreaming) (TransformFilter *iface);
typedef HRESULT (WINAPI *TransformFilter_StopStreaming) (TransformFilter *iface);
typedef HRESULT (WINAPI *TransformFilter_Receive) (TransformFilter* iface, IMediaSample* pIn);
@@ -185,6 +190,7 @@
REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
typedef struct TransformFilterFuncTable {
+ TransformFilter_DecideBufferSize pfnDecideBufferSize;
TransformFilter_StartStreaming pfnStartStreaming;
TransformFilter_Receive pfnReceive;
TransformFilter_StopStreaming pfnStopStreaming;