static gboolean gst_dshowvideodec_get_filter_output_format (GstDshowVideoDec * vdec, GUID * subtype, VIDEOINFOHEADER ** format, guint * size) { IPin *output_pin = NULL; IEnumMediaTypes *enum_mediatypes = NULL; HRESULT hres; ULONG fetched; BOOL ret = FALSE; if (!vdec->decfilter) return FALSE; if (!gst_dshow_get_pin_from_filter (vdec->decfilter, PINDIR_OUTPUT, &output_pin)) { GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, ("failed getting ouput pin from the decoder"), (NULL)); return FALSE; } hres = IPin_EnumMediaTypes (output_pin, &enum_mediatypes); if (hres == S_OK && enum_mediatypes) { AM_MEDIA_TYPE *mediatype = NULL; IEnumMediaTypes_Reset (enum_mediatypes); while (hres = IEnumMoniker_Next (enum_mediatypes, 1, &mediatype, &fetched), hres == S_OK) { RPC_STATUS rpcstatus; if ((UuidCompare (&mediatype->subtype, subtype, &rpcstatus) == 0 && rpcstatus == RPC_S_OK) && (UuidCompare (&mediatype->formattype, &FORMAT_VideoInfo, &rpcstatus) == 0 && rpcstatus == RPC_S_OK)) { *size = mediatype->cbFormat; *format = g_malloc0 (*size); memcpy (*format, mediatype->pbFormat, *size); ret = TRUE; } gst_dshow_free_mediatype (mediatype); if (ret) break; } IEnumMediaTypes_Release (enum_mediatypes); } if (output_pin) { IPin_Release (output_pin); } return ret; }
gboolean gst_dshow_check_mediatype (AM_MEDIA_TYPE * media_type, const GUID sub_type, const GUID format_type) { RPC_STATUS rpcstatus; g_return_val_if_fail (media_type != NULL, FALSE); return UuidCompare (&media_type->subtype, (UUID *) & sub_type, &rpcstatus) == 0 && rpcstatus == RPC_S_OK && //IsEqualGUID (&media_type->subtype, &sub_type) UuidCompare (&media_type->formattype, (UUID *) & format_type, &rpcstatus) == 0 && rpcstatus == RPC_S_OK; }
static int custom_uuid_compare(uuid_t uuid1, uuid_t uuid2) { #ifdef __MINGW32__ RPC_STATUS status; return UuidCompare(&uuid1, &uuid2, &status); #elif __linux__ return uuid_compare(uuid1, uuid2); #endif }
GstCaps * gst_dshowvideosrc_getcaps_from_capture_filter (IBaseFilter * filter, GList ** pins_mediatypes) { IPin *capture_pin = NULL; IEnumPins *enumpins = NULL; HRESULT hres; GstCaps *caps; g_assert (filter); caps = gst_caps_new_empty (); /* get the capture pins supported types */ hres = filter->EnumPins (&enumpins); if (SUCCEEDED (hres)) { while (enumpins->Next (1, &capture_pin, NULL) == S_OK) { IKsPropertySet *pKs = NULL; hres = capture_pin->QueryInterface (IID_IKsPropertySet, (LPVOID *) & pKs); if (SUCCEEDED (hres) && pKs) { DWORD cbReturned; GUID pin_category; RPC_STATUS rpcstatus; hres = pKs->Get (AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, &pin_category, sizeof (GUID), &cbReturned); /* we only want capture pins */ if (UuidCompare (&pin_category, (UUID *) & PIN_CATEGORY_CAPTURE, &rpcstatus) == 0) { GstCaps *caps2; caps2 = gst_dshowvideosrc_getcaps_from_streamcaps (capture_pin, pins_mediatypes); if (caps2) { gst_caps_append (caps, caps2); } else { caps2 = gst_dshowvideosrc_getcaps_from_enum_mediatypes ( capture_pin, pins_mediatypes); if (caps2) { gst_caps_append (caps, caps2); } } } pKs->Release (); } capture_pin->Release (); } enumpins->Release (); } GST_DEBUG ("Device supports these caps: %" GST_PTR_FORMAT, caps); return caps; }
SContextHandle* RPCRT4_SrvFindCtxHdl(ContextHandleNdr *CtxNdr) { SContextHandle *Hdl, *Ret=NULL; RPC_STATUS status; EnterCriticalSection(&CtxList_cs); for(Hdl = CtxList; Hdl; Hdl = Hdl->Next) if(UuidCompare(&Hdl->Ndr.uuid, &CtxNdr->uuid, &status)==0) { Ret = Hdl; break; } LeaveCriticalSection(&CtxList_cs); return Ret; }
int uuuid_compare(struct uuuid_t* u1, struct uuuid_t* u2, int* status) { RPC_STATUS st; int ret; ret = UuidCompare(&u1->uuid, &u2->uuid, &st); if (st != RPC_S_OK) { *status = UUUID_ERR; return -1; } *status = UUUID_OK; return ret; }
RTDECL(int) RTUuidCompare(PCRTUUID pUuid1, PCRTUUID pUuid2) { /* * Special cases. */ if (pUuid1 == pUuid2) return 0; if (!pUuid1) return RTUuidIsNull(pUuid2) ? 0 : -1; if (!pUuid2) return RTUuidIsNull(pUuid1) ? 0 : 1; AssertPtrReturn(pUuid1, -1); AssertPtrReturn(pUuid2, 1); /* * Hand the rest to the Windows API. */ RPC_STATUS status; return UuidCompare((UUID *)pUuid1, (UUID *)pUuid2, &status); }
static GstCaps * gst_dshowvideodec_src_getcaps (GstPad * pad) { GstDshowVideoDec *vdec = (GstDshowVideoDec *) gst_pad_get_parent (pad); GstCaps *caps = NULL; if (!vdec->srccaps) vdec->srccaps = gst_caps_new_empty (); if (vdec->decfilter) { IPin *output_pin = NULL; IEnumMediaTypes *enum_mediatypes = NULL; HRESULT hres; ULONG fetched; if (!gst_dshow_get_pin_from_filter (vdec->decfilter, PINDIR_OUTPUT, &output_pin)) { GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("failed getting ouput pin from the decoder"), (NULL)); goto beach; } hres = IPin_EnumMediaTypes (output_pin, &enum_mediatypes); if (hres == S_OK && enum_mediatypes) { AM_MEDIA_TYPE *mediatype = NULL; IEnumMediaTypes_Reset (enum_mediatypes); while (hres = IEnumMoniker_Next (enum_mediatypes, 1, &mediatype, &fetched), hres == S_OK) { RPC_STATUS rpcstatus; VIDEOINFOHEADER *video_info; GstCaps *mediacaps = NULL; /* RGB24 */ if ((UuidCompare (&mediatype->subtype, &MEDIASUBTYPE_RGB24, &rpcstatus) == 0 && rpcstatus == RPC_S_OK) && (UuidCompare (&mediatype->formattype, &FORMAT_VideoInfo, &rpcstatus) == 0 && rpcstatus == RPC_S_OK)) { video_info = (VIDEOINFOHEADER *) mediatype->pbFormat; /* ffmpegcolorspace handles RGB24 in BIG_ENDIAN */ mediacaps = gst_caps_new_simple ("video/x-raw-rgb", "bpp", G_TYPE_INT, 24, "depth", G_TYPE_INT, 24, "width", G_TYPE_INT, video_info->bmiHeader.biWidth, "height", G_TYPE_INT, video_info->bmiHeader.biHeight, "framerate", GST_TYPE_FRACTION, (int) (10000000 / video_info->AvgTimePerFrame), 1, "endianness", G_TYPE_INT, G_BIG_ENDIAN, "red_mask", G_TYPE_INT, 255, "green_mask", G_TYPE_INT, 65280, "blue_mask", G_TYPE_INT, 16711680, NULL); if (mediacaps) { vdec->mediatypes = g_list_append (vdec->mediatypes, mediatype); gst_caps_append (vdec->srccaps, mediacaps); } else { gst_dshow_free_mediatype (mediatype); } } else { gst_dshow_free_mediatype (mediatype); } } IEnumMediaTypes_Release (enum_mediatypes); } if (output_pin) { IPin_Release (output_pin); } } if (vdec->srccaps) caps = gst_caps_ref (vdec->srccaps); beach: gst_object_unref (vdec); return caps; }
/************************************************************************* * UuidIsNil [RPCRT4.@] * * PARAMS * UUID *Uuid [I] Uuid to compare * RPC_STATUS *Status [O] returns RPC_S_OK * * RETURNS * TRUE/FALSE */ int WINAPI UuidIsNil(UUID *Uuid, RPC_STATUS *Status) { TRACE("(%s)\n", debugstr_guid(Uuid)); if (!Uuid) return TRUE; return !UuidCompare(Uuid, &uuid_nil, Status); }
/************************************************************************* * UuidEqual [RPCRT4.@] * * PARAMS * UUID *Uuid1 [I] Uuid to compare * UUID *Uuid2 [I] Uuid to compare * RPC_STATUS *Status [O] returns RPC_S_OK * * RETURNS * TRUE/FALSE */ int WINAPI UuidEqual(UUID *Uuid1, UUID *Uuid2, RPC_STATUS *Status) { TRACE("(%s,%s)\n", debugstr_guid(Uuid1), debugstr_guid(Uuid2)); return !UuidCompare(Uuid1, Uuid2, Status); }
static GstCaps * gst_dshowaudiosrc_getcaps_from_streamcaps (GstDshowAudioSrc * src, IPin * pin, IAMStreamConfig * streamcaps) { GstCaps *caps = NULL; HRESULT hres = S_OK; RPC_STATUS rpcstatus; int icount = 0; int isize = 0; AUDIO_STREAM_CONFIG_CAPS ascc; int i = 0; if (!streamcaps) return NULL; IAMStreamConfig_GetNumberOfCapabilities (streamcaps, &icount, &isize); if (isize != sizeof (ascc)) return NULL; for (; i < icount; i++) { GstCapturePinMediaType *pin_mediatype = g_new0 (GstCapturePinMediaType, 1); IPin_AddRef (pin); pin_mediatype->capture_pin = pin; hres = IAMStreamConfig_GetStreamCaps (streamcaps, i, &pin_mediatype->mediatype, (BYTE *) & ascc); if (hres == S_OK && pin_mediatype->mediatype) { GstCaps *mediacaps = NULL; if (!caps) caps = gst_caps_new_empty (); if ((UuidCompare (&pin_mediatype->mediatype->subtype, &MEDIASUBTYPE_PCM, &rpcstatus) == 0 && rpcstatus == RPC_S_OK) && (UuidCompare (&pin_mediatype->mediatype->formattype, &FORMAT_WaveFormatEx, &rpcstatus) == 0 && rpcstatus == RPC_S_OK)) { WAVEFORMATEX *wavformat = (WAVEFORMATEX *) pin_mediatype->mediatype->pbFormat; mediacaps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, wavformat->wBitsPerSample, "depth", G_TYPE_INT, wavformat->wBitsPerSample, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, "channels", G_TYPE_INT, wavformat->nChannels, "rate", G_TYPE_INT, wavformat->nSamplesPerSec, NULL); if (mediacaps) { src->pins_mediatypes = g_list_append (src->pins_mediatypes, pin_mediatype); gst_caps_append (caps, mediacaps); } else { gst_dshow_free_pin_mediatype (pin_mediatype); } } else { gst_dshow_free_pin_mediatype (pin_mediatype); } } else { gst_dshow_free_pin_mediatype (pin_mediatype); } } if (caps && gst_caps_is_empty (caps)) { gst_caps_unref (caps); caps = NULL; } return caps; }
static GstCaps * gst_dshowaudiosrc_get_caps (GstBaseSrc * basesrc) { HRESULT hres = S_OK; IBindCtx *lpbc = NULL; IMoniker *audiom = NULL; DWORD dwEaten; GstDshowAudioSrc *src = GST_DSHOWAUDIOSRC (basesrc); gunichar2 *unidevice = NULL; if (src->device) { g_free (src->device); src->device = NULL; } src->device = gst_dshow_getdevice_from_devicename (&CLSID_AudioInputDeviceCategory, &src->device_name); if (!src->device) { GST_CAT_ERROR (dshowaudiosrc_debug, "No audio device found."); return NULL; } unidevice = g_utf8_to_utf16 (src->device, strlen (src->device), NULL, NULL, NULL); if (!src->audio_cap_filter) { hres = CreateBindCtx (0, &lpbc); if (SUCCEEDED (hres)) { hres = MkParseDisplayName (lpbc, unidevice, &dwEaten, &audiom); if (SUCCEEDED (hres)) { hres = IMoniker_BindToObject (audiom, lpbc, NULL, &IID_IBaseFilter, &src->audio_cap_filter); IMoniker_Release (audiom); } IBindCtx_Release (lpbc); } } if (src->audio_cap_filter && !src->caps) { /* get the capture pins supported types */ IPin *capture_pin = NULL; IEnumPins *enumpins = NULL; HRESULT hres; hres = IBaseFilter_EnumPins (src->audio_cap_filter, &enumpins); if (SUCCEEDED (hres)) { while (IEnumPins_Next (enumpins, 1, &capture_pin, NULL) == S_OK) { IKsPropertySet *pKs = NULL; hres = IPin_QueryInterface (capture_pin, &IID_IKsPropertySet, (void **) &pKs); if (SUCCEEDED (hres) && pKs) { DWORD cbReturned; GUID pin_category; RPC_STATUS rpcstatus; hres = IKsPropertySet_Get (pKs, &ROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, &pin_category, sizeof (GUID), &cbReturned); /* we only want capture pins */ if (UuidCompare (&pin_category, &PIN_CATEGORY_CAPTURE, &rpcstatus) == 0) { IAMStreamConfig *streamcaps = NULL; if (SUCCEEDED (IPin_QueryInterface (capture_pin, &IID_IAMStreamConfig, (void **) &streamcaps))) { src->caps = gst_dshowaudiosrc_getcaps_from_streamcaps (src, capture_pin, streamcaps); IAMStreamConfig_Release (streamcaps); } } IKsPropertySet_Release (pKs); } IPin_Release (capture_pin); } IEnumPins_Release (enumpins); } } if (unidevice) { g_free (unidevice); } if (src->caps) { return gst_caps_ref (src->caps); } return NULL; }
/* * CopEnumInterfaces * * Purpose: * * Remember list of available interfaces, excluding IUnknown. * */ BOOL CopEnumInterfaces( _In_ INTERFACE_INFO_LIST *InterfaceList ) { BOOL bResult = FALSE; HKEY hKey = NULL; LRESULT lRet; RPC_STATUS RpcStatus = 0; LPWSTR lpKeyName = NULL; SIZE_T k; DWORD i, cSubKeys = 0, cMaxLength = 0, cchKey; IID iid; INTERFACE_INFO *infoBuffer; __try { lRet = RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("Interface"), 0, KEY_READ, &hKey); if (lRet != ERROR_SUCCESS) __leave; lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, &cSubKeys, &cMaxLength, NULL, NULL, NULL, NULL, NULL, NULL); if ((lRet != ERROR_SUCCESS) || (cSubKeys == 0)) __leave; infoBuffer = (INTERFACE_INFO*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cSubKeys * sizeof(INTERFACE_INFO)); if (infoBuffer == NULL) __leave; cMaxLength = (DWORD)((cMaxLength + 1) * sizeof(WCHAR)); lpKeyName = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cMaxLength); if (lpKeyName == NULL) __leave; for (k = 0, i = 0; i < cSubKeys; i++) { cchKey = (DWORD)(cMaxLength / sizeof(WCHAR)); if (RegEnumKeyEx(hKey, i, lpKeyName, &cchKey, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { if (IIDFromString(lpKeyName, &iid) == S_OK) { //skip IUnknown if (UuidCompare((UUID*)&iid, (UUID*)&IID_IUnknown, &RpcStatus) == 0) continue; cchKey = MAX_PATH * sizeof(WCHAR); infoBuffer[k].iid = iid; RegGetValue(hKey, lpKeyName, TEXT(""), RRF_RT_REG_SZ, NULL, (LPWSTR)&infoBuffer[k].szInterfaceName, &cchKey); k++; } } } InterfaceList->cEntries = (ULONG)k; InterfaceList->List = infoBuffer; bResult = TRUE; } __finally { if (hKey) RegCloseKey(hKey); if (lpKeyName) HeapFree(GetProcessHeap(), 0, lpKeyName); } return bResult; }
static GstCaps * gst_dshowvideosrc_get_caps (GstBaseSrc * basesrc, GstCaps *filter) { HRESULT hres = S_OK; IBindCtx *lpbc = NULL; IMoniker *videom; DWORD dwEaten; GstDshowVideoSrc *src = GST_DSHOWVIDEOSRC (basesrc); gunichar2 *unidevice = NULL; if (src->caps) { return gst_caps_ref (src->caps); } if (!src->device) { src->device = gst_dshow_getdevice_from_devicename (&CLSID_VideoInputDeviceCategory, &src->device_name); if (!src->device) { GST_ERROR ("No video device found."); return NULL; } } unidevice = g_utf8_to_utf16 (src->device, strlen (src->device), NULL, NULL, NULL); if (!src->video_cap_filter) { hres = CreateBindCtx (0, &lpbc); if (SUCCEEDED (hres)) { hres = MkParseDisplayName (lpbc, (LPCOLESTR) unidevice, &dwEaten, &videom); if (SUCCEEDED (hres)) { hres = videom->BindToObject (lpbc, NULL, IID_IBaseFilter, (LPVOID *) & src->video_cap_filter); videom->Release (); } lpbc->Release (); } } if (!src->caps) { src->caps = gst_caps_new_empty (); } if (src->video_cap_filter && gst_caps_is_empty (src->caps)) { /* get the capture pins supported types */ IPin *capture_pin = NULL; IEnumPins *enumpins = NULL; HRESULT hres; hres = src->video_cap_filter->EnumPins (&enumpins); if (SUCCEEDED (hres)) { while (enumpins->Next (1, &capture_pin, NULL) == S_OK) { IKsPropertySet *pKs = NULL; hres = capture_pin->QueryInterface (IID_IKsPropertySet, (LPVOID *) & pKs); if (SUCCEEDED (hres) && pKs) { DWORD cbReturned; GUID pin_category; RPC_STATUS rpcstatus; hres = pKs->Get (AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, &pin_category, sizeof (GUID), &cbReturned); /* we only want capture pins */ if (UuidCompare (&pin_category, (UUID *) & PIN_CATEGORY_CAPTURE, &rpcstatus) == 0) { { GstCaps *caps = gst_dshowvideosrc_getcaps_from_streamcaps (src, capture_pin); if (caps) { gst_caps_append (src->caps, caps); } else { caps = gst_dshowvideosrc_getcaps_from_enum_mediatypes (src, capture_pin); if (caps) gst_caps_append (src->caps, caps); } } } pKs->Release (); } capture_pin->Release (); } enumpins->Release (); } } if (unidevice) { g_free (unidevice); } if (src->caps) { if (filter) { return gst_caps_intersect_full (filter, src->caps, GST_CAPS_INTERSECT_FIRST); } else { return gst_caps_ref (src->caps); } } return NULL; }
int UuidEqual(UUID* Uuid1, UUID* Uuid2, RPC_STATUS* Status) { return ((UuidCompare(Uuid1, Uuid2, Status) == 0) ? TRUE : FALSE); }