static HRESULT WINAPI IEnumMediaTypesImpl_Reset(IEnumMediaTypes * iface) { ULONG i; AM_MEDIA_TYPE amt; IEnumMediaTypesImpl *This = impl_from_IEnumMediaTypes(iface); TRACE("(%p)->()\n", iface); for (i = 0; i < This->enumMediaDetails.cMediaTypes; i++) FreeMediaType(&This->enumMediaDetails.pMediaTypes[i]); CoTaskMemFree(This->enumMediaDetails.pMediaTypes); i = 0; while (This->enumMediaFunction(This->basePin, i, &amt) == S_OK) i++; This->enumMediaDetails.cMediaTypes = i; This->enumMediaDetails.pMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * i); for (i = 0; i < This->enumMediaDetails.cMediaTypes; i++) { This->enumMediaFunction(This->basePin, i,&amt); if (FAILED(CopyMediaType(&This->enumMediaDetails.pMediaTypes[i], &amt))) { while (i--) FreeMediaType(&This->enumMediaDetails.pMediaTypes[i]); CoTaskMemFree(This->enumMediaDetails.pMediaTypes); return E_OUTOFMEMORY; } } This->currentVersion = This->mediaVersionFunction(This->basePin); This->uIndex = 0; return S_OK; }
/* IEnumMediaTypes */ static HRESULT WINAPI Single_IEnumMediaTypes_Next(IEnumMediaTypes *iface, ULONG nTypes, AM_MEDIA_TYPE **types, ULONG *fetched) { ME_Impl *This = impl_from_IEnumMediaTypes(iface); ULONG count = 0; TRACE("(%p)->(%u, %p, %p)\n", This, nTypes, types, fetched); if (!nTypes) return E_INVALIDARG; if (!types || ((nTypes != 1) && !fetched)) return E_POINTER; if (!This->past && !IsEqualGUID(&This->mtype.majortype,&GUID_NULL)) { AM_MEDIA_TYPE *mtype = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); *mtype = This->mtype; if (mtype->cbFormat) { mtype->pbFormat = CoTaskMemAlloc(mtype->cbFormat); CopyMemory(mtype->pbFormat, This->mtype.pbFormat, mtype->cbFormat); } *types = mtype; This->past = TRUE; count = 1; } if (fetched) *fetched = count; return (count == nTypes) ? S_OK : S_FALSE; }
static HRESULT WINAPI EnumMediaTypes_Reset(IEnumMediaTypes *iface) { test_filter *This = impl_from_IEnumMediaTypes(iface); check_calls_list("EnumMediaTypes_Reset", ENUMMEDIATYPES_RESET, This->filter_type); This->enum_media_types_pos = 0; return E_FAIL; }
static ULONG WINAPI Single_IEnumMediaTypes_AddRef(IEnumMediaTypes *iface) { ME_Impl *This = impl_from_IEnumMediaTypes(iface); ULONG refCount = InterlockedIncrement(&This->refCount); TRACE("(%p) new ref = %u\n", This, refCount); return refCount; }
static HRESULT WINAPI Single_IEnumMediaTypes_Reset(IEnumMediaTypes *iface) { ME_Impl *This = impl_from_IEnumMediaTypes(iface); TRACE("(%p)->()\n", This); This->past = FALSE; return S_OK; }
static ULONG WINAPI IEnumMediaTypesImpl_AddRef(IEnumMediaTypes * iface) { IEnumMediaTypesImpl *This = impl_from_IEnumMediaTypes(iface); ULONG ref = InterlockedIncrement(&This->refCount); TRACE("(%p)->(): new ref = %u\n", iface, ref); return ref; }
static HRESULT WINAPI Single_IEnumMediaTypes_Skip(IEnumMediaTypes *iface, ULONG nTypes) { ME_Impl *This = impl_from_IEnumMediaTypes(iface); TRACE("(%p)->(%u)\n", This, nTypes); if (nTypes) This->past = TRUE; return This->past ? S_FALSE : S_OK; }
static HRESULT WINAPI IEnumMediaTypesImpl_Clone(IEnumMediaTypes * iface, IEnumMediaTypes ** ppEnum) { HRESULT hr; IEnumMediaTypesImpl *This = impl_from_IEnumMediaTypes(iface); TRACE("(%p)->(%p)\n", iface, ppEnum); hr = EnumMediaTypes_Construct(This->basePin, This->enumMediaFunction, This->mediaVersionFunction, ppEnum); if (FAILED(hr)) return hr; return IEnumMediaTypes_Skip(*ppEnum, This->uIndex); }
static HRESULT WINAPI Single_IEnumMediaTypes_Clone(IEnumMediaTypes *iface, IEnumMediaTypes **me) { ME_Impl *This = impl_from_IEnumMediaTypes(iface); TRACE("(%p)->(%p)\n", This, me); if (!me) return E_POINTER; *me = mediaenum_create(&This->mtype, This->past); if (!*me) return E_OUTOFMEMORY; return S_OK; }
static ULONG WINAPI Single_IEnumMediaTypes_Release(IEnumMediaTypes *iface) { ME_Impl *This = impl_from_IEnumMediaTypes(iface); ULONG refCount = InterlockedDecrement(&This->refCount); TRACE("(%p) new ref = %u\n", This, refCount); if (refCount == 0) { if (This->mtype.pbFormat) CoTaskMemFree(This->mtype.pbFormat); CoTaskMemFree(This); return 0; } return refCount; }
static HRESULT WINAPI IEnumMediaTypesImpl_Skip(IEnumMediaTypes * iface, ULONG cMediaTypes) { IEnumMediaTypesImpl *This = impl_from_IEnumMediaTypes(iface); TRACE("(%p)->(%u)\n", iface, cMediaTypes); if (This->currentVersion != This->mediaVersionFunction(This->basePin)) return VFW_E_ENUM_OUT_OF_SYNC; if (This->uIndex + cMediaTypes < This->enumMediaDetails.cMediaTypes) { This->uIndex += cMediaTypes; return S_OK; } return S_FALSE; }
static HRESULT WINAPI Single_IEnumMediaTypes_QueryInterface(IEnumMediaTypes *iface, REFIID riid, void **ret_iface) { ME_Impl *This = impl_from_IEnumMediaTypes(iface); TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ret_iface); if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IEnumMediaTypes)) { *ret_iface = iface; IEnumMediaTypes_AddRef(iface); return S_OK; } *ret_iface = NULL; WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ret_iface); return E_NOINTERFACE; }
static ULONG WINAPI IEnumMediaTypesImpl_Release(IEnumMediaTypes * iface) { IEnumMediaTypesImpl *This = impl_from_IEnumMediaTypes(iface); ULONG ref = InterlockedDecrement(&This->refCount); TRACE("(%p)->(): new ref = %u\n", iface, ref); if (!ref) { ULONG i; for (i = 0; i < This->enumMediaDetails.cMediaTypes; i++) FreeMediaType(&This->enumMediaDetails.pMediaTypes[i]); CoTaskMemFree(This->enumMediaDetails.pMediaTypes); IPin_Release(&This->basePin->IPin_iface); CoTaskMemFree(This); } return ref; }
static HRESULT WINAPI EnumMediaTypes_Next(IEnumMediaTypes *iface, ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched) { test_filter *This = impl_from_IEnumMediaTypes(iface); check_calls_list("EnumMediaTypes_Next", ENUMMEDIATYPES_NEXT, This->filter_type); ok(cMediaTypes == 1, "cMediaTypes = %d\n", cMediaTypes); ok(ppMediaTypes != NULL, "ppMediaTypes == NULL\n"); ok(pcFetched != NULL, "pcFetched == NULL\n"); if(!This->enum_media_types_pos++) { ppMediaTypes[0] = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); memset(ppMediaTypes[0], 0, sizeof(AM_MEDIA_TYPE)); ppMediaTypes[0]->majortype = MEDIATYPE_Video; *pcFetched = 1; return S_OK; } *pcFetched = 0; return S_FALSE; }
static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes * iface, ULONG cMediaTypes, AM_MEDIA_TYPE ** ppMediaTypes, ULONG * pcFetched) { ULONG cFetched; IEnumMediaTypesImpl *This = impl_from_IEnumMediaTypes(iface); TRACE("(%p)->(%u, %p, %p)\n", iface, cMediaTypes, ppMediaTypes, pcFetched); cFetched = min(This->enumMediaDetails.cMediaTypes, This->uIndex + cMediaTypes) - This->uIndex; if (This->currentVersion != This->mediaVersionFunction(This->basePin)) return VFW_E_ENUM_OUT_OF_SYNC; TRACE("Next uIndex: %u, cFetched: %u\n", This->uIndex, cFetched); if (cFetched > 0) { ULONG i; for (i = 0; i < cFetched; i++) if (!(ppMediaTypes[i] = CreateMediaType(&This->enumMediaDetails.pMediaTypes[This->uIndex + i]))) { while (i--) DeleteMediaType(ppMediaTypes[i]); *pcFetched = 0; return E_OUTOFMEMORY; } } if ((cMediaTypes != 1) || pcFetched) *pcFetched = cFetched; This->uIndex += cFetched; if (cFetched != cMediaTypes) return S_FALSE; return S_OK; }