Robert Shearman wrote:
Maarten Lankhorst wrote:
This patch fixes AM_MEDIA_TYPE->pbFormat not being handled correctly, unfortunately, this also means some stuff has to be rewritten to avoid memleaks, instead of CoTaskMemFree(AM_MEDIA_TYPE), DeleteMediaType has to be used.. This also fixes the errors i had with msn webcam, i feel like i stumbled over every bug in quartz now......
------------------------------------------------------------------------
@@ -45,6 +46,7 @@ void DeleteMediaType(AM_MEDIA_TYPE * pMe IUnknown_Release(pMediaType->pUnk); pMediaType->pUnk = NULL; } + CoTaskMemFree(pMediaType); }
BOOL CompareMediaTypes(const AM_MEDIA_TYPE * pmt1, const AM_MEDIA_TYPE * pmt2, BOOL bWildcards)
This change is wrong. DeleteMediaType is not supposed to free the memory used for the AM_MEDIA_TYPE structure itself as the function is also used in places where the AM_MEDIA_TYPE was not allocated using CoTaskMemAlloc.
Rob
This change is right, if you don't want to release the format block you need to use freemediatype... quoting msdn... *DeleteMediaType* The **DeleteMediaType* *function deletes an allocated *AM_MEDIA_TYPE* <http://msdn.microsoft.com/library/en-us/directshow/htm/am_media_typestructure.asp> structure, including the format block. *Syntax* |*void WINAPI *DeleteMediaType*( * *AM_MEDIA_TYPE* /*pmt/ *);* | *Parameters* /pmt / Pointer to an *AM_MEDIA_TYPE* structure. *Return Value* No return value. *Remarks* Use this function to release any media type structure that was allocated using either *CoTaskMemAlloc* or *CreateMediaType* <http://msdn.microsoft.com/library/en-us/directshow/htm/createmediatype.asp>. If you prefer not to link to the base class library, you can use the following code directly: |void MyDeleteMediaType(AM_MEDIA_TYPE *pmt) { if (pmt != NULL) { MyFreeMediaType(*pmt); // See FreeMediaType for the implementation. CoTaskMemFree(pmt); } } | *Requirements* * Header:* Declared in Mtype.h; include Streams.h. * Library:* Use Strmbase.lib (retail builds) or Strmbasd.lib (debug builds).