Commit 623fb34a authored by Christian Costa's avatar Christian Costa Committed by Alexandre Julliard

Fixed clock release in transform template.

AddRef pUnk in CopyMediaType. Added CreateMediaType helper function and use it. Replaced some DeleteMediaType calls to FreeMediaType to be in line with recent changes. Fixed IEnumMediaTypesImpl_Next. Clear media type when initializing pins. Added some AddRef/Release traces.
parent 2f5aee99
...@@ -211,7 +211,7 @@ static HRESULT ACMWrapper_ConnectInput(TransformFilterImpl* pTransformFilter, co ...@@ -211,7 +211,7 @@ static HRESULT ACMWrapper_ConnectInput(TransformFilterImpl* pTransformFilter, co
} }
else else
FIXME("acmStreamOpen returned %d\n", res); FIXME("acmStreamOpen returned %d\n", res);
DeleteMediaType(outpmt); FreeMediaType(outpmt);
TRACE("Unable to find a suitable ACM decompressor\n"); TRACE("Unable to find a suitable ACM decompressor\n");
} }
......
...@@ -31,6 +31,8 @@ HRESULT CopyMediaType(AM_MEDIA_TYPE * pDest, const AM_MEDIA_TYPE *pSrc) ...@@ -31,6 +31,8 @@ HRESULT CopyMediaType(AM_MEDIA_TYPE * pDest, const AM_MEDIA_TYPE *pSrc)
if (!(pDest->pbFormat = CoTaskMemAlloc(pSrc->cbFormat))) if (!(pDest->pbFormat = CoTaskMemAlloc(pSrc->cbFormat)))
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
memcpy(pDest->pbFormat, pSrc->pbFormat, pSrc->cbFormat); memcpy(pDest->pbFormat, pSrc->pbFormat, pSrc->cbFormat);
if (pDest->pUnk)
IUnknown_AddRef(pDest->pUnk);
return S_OK; return S_OK;
} }
...@@ -48,13 +50,29 @@ void FreeMediaType(AM_MEDIA_TYPE * pMediaType) ...@@ -48,13 +50,29 @@ void FreeMediaType(AM_MEDIA_TYPE * pMediaType)
} }
} }
AM_MEDIA_TYPE * CreateMediaType(AM_MEDIA_TYPE const * pSrc)
{
AM_MEDIA_TYPE * pDest;
pDest = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
if (!pDest)
return NULL;
if (FAILED(CopyMediaType(pDest, pSrc)))
{
CoTaskMemFree(pDest);
return NULL;
}
return pDest;
}
void DeleteMediaType(AM_MEDIA_TYPE * pMediaType) void DeleteMediaType(AM_MEDIA_TYPE * pMediaType)
{ {
FreeMediaType(pMediaType); FreeMediaType(pMediaType);
CoTaskMemFree(pMediaType); CoTaskMemFree(pMediaType);
} }
BOOL CompareMediaTypes(const AM_MEDIA_TYPE * pmt1, const AM_MEDIA_TYPE * pmt2, BOOL bWildcards) BOOL CompareMediaTypes(const AM_MEDIA_TYPE * pmt1, const AM_MEDIA_TYPE * pmt2, BOOL bWildcards)
{ {
TRACE("pmt1: "); TRACE("pmt1: ");
...@@ -98,7 +116,8 @@ HRESULT IEnumMediaTypesImpl_Construct(const ENUMMEDIADETAILS * pDetails, IEnumMe ...@@ -98,7 +116,8 @@ HRESULT IEnumMediaTypesImpl_Construct(const ENUMMEDIADETAILS * pDetails, IEnumMe
pEnumMediaTypes->enumMediaDetails.cMediaTypes = pDetails->cMediaTypes; pEnumMediaTypes->enumMediaDetails.cMediaTypes = pDetails->cMediaTypes;
pEnumMediaTypes->enumMediaDetails.pMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * pDetails->cMediaTypes); pEnumMediaTypes->enumMediaDetails.pMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * pDetails->cMediaTypes);
for (i = 0; i < pDetails->cMediaTypes; i++) for (i = 0; i < pDetails->cMediaTypes; i++)
if (FAILED(CopyMediaType(&pEnumMediaTypes->enumMediaDetails.pMediaTypes[i], &pDetails->pMediaTypes[i]))) { if (FAILED(CopyMediaType(&pEnumMediaTypes->enumMediaDetails.pMediaTypes[i], &pDetails->pMediaTypes[i])))
{
while (i--) while (i--)
CoTaskMemFree(pEnumMediaTypes->enumMediaDetails.pMediaTypes[i].pbFormat); CoTaskMemFree(pEnumMediaTypes->enumMediaDetails.pMediaTypes[i].pbFormat);
CoTaskMemFree(pEnumMediaTypes->enumMediaDetails.pMediaTypes); CoTaskMemFree(pEnumMediaTypes->enumMediaDetails.pMediaTypes);
...@@ -135,7 +154,7 @@ static ULONG WINAPI IEnumMediaTypesImpl_AddRef(IEnumMediaTypes * iface) ...@@ -135,7 +154,7 @@ static ULONG WINAPI IEnumMediaTypesImpl_AddRef(IEnumMediaTypes * iface)
IEnumMediaTypesImpl *This = (IEnumMediaTypesImpl *)iface; IEnumMediaTypesImpl *This = (IEnumMediaTypesImpl *)iface;
ULONG refCount = InterlockedIncrement(&This->refCount); ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("()\n"); TRACE("(%p)->() AddRef from %ld\n", iface, refCount - 1);
return refCount; return refCount;
} }
...@@ -145,7 +164,7 @@ static ULONG WINAPI IEnumMediaTypesImpl_Release(IEnumMediaTypes * iface) ...@@ -145,7 +164,7 @@ static ULONG WINAPI IEnumMediaTypesImpl_Release(IEnumMediaTypes * iface)
IEnumMediaTypesImpl *This = (IEnumMediaTypesImpl *)iface; IEnumMediaTypesImpl *This = (IEnumMediaTypesImpl *)iface;
ULONG refCount = InterlockedDecrement(&This->refCount); ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("()\n"); TRACE("(%p)->() Release from %ld\n", iface, refCount + 1);
if (!refCount) if (!refCount)
{ {
...@@ -172,13 +191,12 @@ static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes * iface, ULONG cM ...@@ -172,13 +191,12 @@ static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes * iface, ULONG cM
if (cFetched > 0) if (cFetched > 0)
{ {
ULONG i; ULONG i;
*ppMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * cFetched);
for (i = 0; i < cFetched; i++) for (i = 0; i < cFetched; i++)
if (FAILED(CopyMediaType(&(*ppMediaTypes)[i], &This->enumMediaDetails.pMediaTypes[This->uIndex + i]))) { if (!(ppMediaTypes[i] = CreateMediaType(&This->enumMediaDetails.pMediaTypes[This->uIndex + i])))
{
while (i--) while (i--)
CoTaskMemFree((*ppMediaTypes)[i].pbFormat); DeleteMediaType(ppMediaTypes[i]);
CoTaskMemFree(*ppMediaTypes); *pcFetched = 0;
*ppMediaTypes = NULL;
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
} }
} }
......
...@@ -821,7 +821,7 @@ static HRESULT FileAsyncReaderPin_ConnectSpecific(IPin * iface, IPin * pReceiveP ...@@ -821,7 +821,7 @@ static HRESULT FileAsyncReaderPin_ConnectSpecific(IPin * iface, IPin * pReceiveP
{ {
IPin_Release(This->pin.pConnectedTo); IPin_Release(This->pin.pConnectedTo);
This->pin.pConnectedTo = NULL; This->pin.pConnectedTo = NULL;
DeleteMediaType(&This->pin.mtCurrent); FreeMediaType(&This->pin.mtCurrent);
} }
TRACE(" -- %lx\n", hr); TRACE(" -- %lx\n", hr);
......
...@@ -596,13 +596,13 @@ static ULONG WINAPI Parser_OutputPin_Release(IPin * iface) ...@@ -596,13 +596,13 @@ static ULONG WINAPI Parser_OutputPin_Release(IPin * iface)
Parser_OutputPin *This = (Parser_OutputPin *)iface; Parser_OutputPin *This = (Parser_OutputPin *)iface;
ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount); ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount);
TRACE("()\n"); TRACE("(%p)->() Release from %ld\n", iface, refCount + 1);
if (!refCount) if (!refCount)
{ {
DeleteMediaType(This->pmt); FreeMediaType(This->pmt);
CoTaskMemFree(This->pmt); CoTaskMemFree(This->pmt);
DeleteMediaType(&This->pin.pin.mtCurrent); FreeMediaType(&This->pin.pin.mtCurrent);
CoTaskMemFree(This); CoTaskMemFree(This);
return 0; return 0;
} }
......
...@@ -107,7 +107,7 @@ static HRESULT OutputPin_ConnectSpecific(IPin * iface, IPin * pReceivePin, const ...@@ -107,7 +107,7 @@ static HRESULT OutputPin_ConnectSpecific(IPin * iface, IPin * pReceivePin, const
{ {
IPin_Release(This->pin.pConnectedTo); IPin_Release(This->pin.pConnectedTo);
This->pin.pConnectedTo = NULL; This->pin.pConnectedTo = NULL;
DeleteMediaType(&This->pin.mtCurrent); FreeMediaType(&This->pin.mtCurrent);
} }
TRACE(" -- %lx\n", hr); TRACE(" -- %lx\n", hr);
...@@ -154,6 +154,7 @@ HRESULT InputPin_Init(const PIN_INFO * pPinInfo, SAMPLEPROC pSampleProc, LPVOID ...@@ -154,6 +154,7 @@ HRESULT InputPin_Init(const PIN_INFO * pPinInfo, SAMPLEPROC pSampleProc, LPVOID
pPinImpl->pin.pUserData = pUserData; pPinImpl->pin.pUserData = pUserData;
pPinImpl->pin.pCritSec = pCritSec; pPinImpl->pin.pCritSec = pCritSec;
Copy_PinInfo(&pPinImpl->pin.pinInfo, pPinInfo); Copy_PinInfo(&pPinImpl->pin.pinInfo, pPinInfo);
ZeroMemory(&pPinImpl->pin.mtCurrent, sizeof(AM_MEDIA_TYPE));
/* Input pin attributes */ /* Input pin attributes */
pPinImpl->fnSampleProc = pSampleProc; pPinImpl->fnSampleProc = pSampleProc;
...@@ -177,6 +178,7 @@ HRESULT OutputPin_Init(const PIN_INFO * pPinInfo, ALLOCATOR_PROPERTIES * props, ...@@ -177,6 +178,7 @@ HRESULT OutputPin_Init(const PIN_INFO * pPinInfo, ALLOCATOR_PROPERTIES * props,
pPinImpl->pin.pUserData = pUserData; pPinImpl->pin.pUserData = pUserData;
pPinImpl->pin.pCritSec = pCritSec; pPinImpl->pin.pCritSec = pCritSec;
Copy_PinInfo(&pPinImpl->pin.pinInfo, pPinInfo); Copy_PinInfo(&pPinImpl->pin.pinInfo, pPinInfo);
ZeroMemory(&pPinImpl->pin.mtCurrent, sizeof(AM_MEDIA_TYPE));
/* Output pin attributes */ /* Output pin attributes */
pPinImpl->pMemInputPin = NULL; pPinImpl->pMemInputPin = NULL;
...@@ -410,7 +412,7 @@ ULONG WINAPI InputPin_Release(IPin * iface) ...@@ -410,7 +412,7 @@ ULONG WINAPI InputPin_Release(IPin * iface)
if (!refCount) if (!refCount)
{ {
DeleteMediaType(&This->pin.mtCurrent); FreeMediaType(&This->pin.mtCurrent);
if (This->pAllocator) if (This->pAllocator)
IMemAllocator_Release(This->pAllocator); IMemAllocator_Release(This->pAllocator);
CoTaskMemFree(This); CoTaskMemFree(This);
...@@ -665,11 +667,11 @@ ULONG WINAPI OutputPin_Release(IPin * iface) ...@@ -665,11 +667,11 @@ ULONG WINAPI OutputPin_Release(IPin * iface)
OutputPin *This = (OutputPin *)iface; OutputPin *This = (OutputPin *)iface;
ULONG refCount = InterlockedDecrement(&This->pin.refCount); ULONG refCount = InterlockedDecrement(&This->pin.refCount);
TRACE("(%p/%p)->()\n", This, iface); TRACE("(%p)->() Release from %ld\n", iface, refCount + 1);
if (!refCount) if (!refCount)
{ {
DeleteMediaType(&This->pin.mtCurrent); FreeMediaType(&This->pin.mtCurrent);
CoTaskMemFree(This); CoTaskMemFree(This);
return 0; return 0;
} }
...@@ -1015,6 +1017,7 @@ HRESULT PullPin_Init(const PIN_INFO * pPinInfo, SAMPLEPROC pSampleProc, LPVOID p ...@@ -1015,6 +1017,7 @@ HRESULT PullPin_Init(const PIN_INFO * pPinInfo, SAMPLEPROC pSampleProc, LPVOID p
pPinImpl->pin.pUserData = pUserData; pPinImpl->pin.pUserData = pUserData;
pPinImpl->pin.pCritSec = pCritSec; pPinImpl->pin.pCritSec = pCritSec;
Copy_PinInfo(&pPinImpl->pin.pinInfo, pPinInfo); Copy_PinInfo(&pPinImpl->pin.pinInfo, pPinInfo);
ZeroMemory(&pPinImpl->pin.mtCurrent, sizeof(AM_MEDIA_TYPE));
/* Input pin attributes */ /* Input pin attributes */
pPinImpl->fnSampleProc = pSampleProc; pPinImpl->fnSampleProc = pSampleProc;
......
...@@ -275,7 +275,9 @@ static ULONG WINAPI TransformFilter_Release(IBaseFilter * iface) ...@@ -275,7 +275,9 @@ static ULONG WINAPI TransformFilter_Release(IBaseFilter * iface)
ULONG i; ULONG i;
DeleteCriticalSection(&This->csFilter); DeleteCriticalSection(&This->csFilter);
IReferenceClock_Release(This->pClock);
if (This->pClock)
IReferenceClock_Release(This->pClock);
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
IPin_Release(This->ppPins[i]); IPin_Release(This->ppPins[i]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment