Fixed {Copy/Delete/Free}MediaType functions to show proper behaviour.
Fixed EnumMediaTypes to copy pbFormat too. Added FreeMediaType.
This commit is contained in:
parent
a96f8ac203
commit
aa4df8f63a
|
@ -27,13 +27,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(quartz);
|
||||||
HRESULT CopyMediaType(AM_MEDIA_TYPE * pDest, const AM_MEDIA_TYPE *pSrc)
|
HRESULT CopyMediaType(AM_MEDIA_TYPE * pDest, const AM_MEDIA_TYPE *pSrc)
|
||||||
{
|
{
|
||||||
memcpy(pDest, pSrc, sizeof(AM_MEDIA_TYPE));
|
memcpy(pDest, pSrc, sizeof(AM_MEDIA_TYPE));
|
||||||
|
if (!pSrc->pbFormat) return S_OK;
|
||||||
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);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeleteMediaType(AM_MEDIA_TYPE * pMediaType)
|
void FreeMediaType(AM_MEDIA_TYPE * pMediaType)
|
||||||
{
|
{
|
||||||
if (pMediaType->pbFormat)
|
if (pMediaType->pbFormat)
|
||||||
{
|
{
|
||||||
|
@ -47,6 +48,13 @@ void DeleteMediaType(AM_MEDIA_TYPE * pMediaType)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DeleteMediaType(AM_MEDIA_TYPE * pMediaType)
|
||||||
|
{
|
||||||
|
FreeMediaType(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: ");
|
||||||
|
@ -90,7 +98,11 @@ 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++)
|
||||||
pEnumMediaTypes->enumMediaDetails.pMediaTypes[i] = pDetails->pMediaTypes[i];
|
if (FAILED(CopyMediaType(&pEnumMediaTypes->enumMediaDetails.pMediaTypes[i], &pDetails->pMediaTypes[i]))) {
|
||||||
|
while (--i > 0) CoTaskMemFree(pEnumMediaTypes->enumMediaDetails.pMediaTypes[i].pbFormat);
|
||||||
|
CoTaskMemFree(pEnumMediaTypes->enumMediaDetails.pMediaTypes);
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
*ppEnum = (IEnumMediaTypes *)(&pEnumMediaTypes->lpVtbl);
|
*ppEnum = (IEnumMediaTypes *)(&pEnumMediaTypes->lpVtbl);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -136,12 +148,14 @@ static ULONG WINAPI IEnumMediaTypesImpl_Release(IEnumMediaTypes * iface)
|
||||||
|
|
||||||
if (!refCount)
|
if (!refCount)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < This->enumMediaDetails.cMediaTypes; i++)
|
||||||
|
if (This->enumMediaDetails.pMediaTypes[i].pbFormat)
|
||||||
|
CoTaskMemFree(This->enumMediaDetails.pMediaTypes[i].pbFormat);
|
||||||
CoTaskMemFree(This->enumMediaDetails.pMediaTypes);
|
CoTaskMemFree(This->enumMediaDetails.pMediaTypes);
|
||||||
CoTaskMemFree(This);
|
CoTaskMemFree(This);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
else
|
return refCount;
|
||||||
return refCount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes * iface, ULONG cMediaTypes, AM_MEDIA_TYPE ** ppMediaTypes, ULONG * pcFetched)
|
static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes * iface, ULONG cMediaTypes, AM_MEDIA_TYPE ** ppMediaTypes, ULONG * pcFetched)
|
||||||
|
@ -159,7 +173,13 @@ static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes * iface, ULONG cM
|
||||||
ULONG i;
|
ULONG i;
|
||||||
*ppMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * cFetched);
|
*ppMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * cFetched);
|
||||||
for (i = 0; i < cFetched; i++)
|
for (i = 0; i < cFetched; i++)
|
||||||
(*ppMediaTypes)[i] = This->enumMediaDetails.pMediaTypes[This->uIndex + i];
|
if (FAILED(CopyMediaType(&(*ppMediaTypes)[i], &This->enumMediaDetails.pMediaTypes[This->uIndex + i]))) {
|
||||||
|
while (--i)
|
||||||
|
CoTaskMemFree((*ppMediaTypes)[i].pbFormat);
|
||||||
|
CoTaskMemFree(*ppMediaTypes);
|
||||||
|
*ppMediaTypes = NULL;
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((cMediaTypes != 1) || pcFetched)
|
if ((cMediaTypes != 1) || pcFetched)
|
||||||
|
|
|
@ -77,6 +77,7 @@ extern const char * qzdebugstr_guid(const GUID * id);
|
||||||
extern const char * qzdebugstr_State(FILTER_STATE state);
|
extern const char * qzdebugstr_State(FILTER_STATE state);
|
||||||
|
|
||||||
HRESULT CopyMediaType(AM_MEDIA_TYPE * pDest, const AM_MEDIA_TYPE *pSrc);
|
HRESULT CopyMediaType(AM_MEDIA_TYPE * pDest, const AM_MEDIA_TYPE *pSrc);
|
||||||
|
void FreeMediaType(AM_MEDIA_TYPE * pmt);
|
||||||
void DeleteMediaType(AM_MEDIA_TYPE * pmt);
|
void DeleteMediaType(AM_MEDIA_TYPE * pmt);
|
||||||
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);
|
||||||
void dump_AM_MEDIA_TYPE(const AM_MEDIA_TYPE * pmt);
|
void dump_AM_MEDIA_TYPE(const AM_MEDIA_TYPE * pmt);
|
||||||
|
|
Loading…
Reference in New Issue