bool CMFCamCapture::selectMediaType(IMFMediaSource *pSource, IMFMediaType *pType) { UINT32 count = 0; UINT32 found = 0; UINT32 uHigh = 0, uLow = 0; CLSID uuid; UINT32 i; HRESULT hr = pType->GetCount(&count); if (FAILED(hr)) { return false; } if (count == 0) { return false; } for (i = 0; i < count; i++) { GUID guid = { 0 }; PROPVARIANT var; PropVariantInit(&var); hr = pType->GetItemByIndex(i, &guid, &var); if (FAILED(hr)) { goto done; } if (guid == MF_MT_FRAME_SIZE) { Unpack2UINT32AsUINT64(var.uhVal.QuadPart, &uHigh, &uLow); if (uHigh == 640 && (uLow == 480 || uLow == 360)) { found |= 1; } } else if (guid == MF_MT_MAJOR_TYPE) { if (*var.puuid == MFMediaType_Video) { found |= 2; } } else if (guid == MF_MT_SUBTYPE) { if (*var.puuid == MFVideoFormat_I420 || *var.puuid == MFVideoFormat_IYUV || *var.puuid == MFVideoFormat_RGB24 ) { uuid = *var.puuid; found |= 4; } } done: PropVariantClear(&var); if (found == 7) { m_captureHeight = uLow; m_captureWidth = uHigh; m_captureFormat = uuid; return true; } } return false; }
static void LogUINT32AsUINT64(const PROPVARIANT& var) { UINT32 uHigh = 0, uLow = 0; Unpack2UINT32AsUINT64(var.uhVal.QuadPart, &uHigh, &uLow); DBGMSG(L"%d x %d", uHigh, uLow); }
void LogUINT32AsUINT64New(const PROPVARIANT& var, UINT32 &uHigh, UINT32 &uLow) { Unpack2UINT32AsUINT64(var.uhVal.QuadPart, &uHigh, &uLow); }