Пример #1
0
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;
}
Пример #2
0
static void LogUINT32AsUINT64(const PROPVARIANT& var)
{
	UINT32 uHigh = 0, uLow = 0;
	Unpack2UINT32AsUINT64(var.uhVal.QuadPart, &uHigh, &uLow);
	DBGMSG(L"%d x %d", uHigh, uLow);
}
Пример #3
0
void LogUINT32AsUINT64New(const PROPVARIANT& var, UINT32 &uHigh, UINT32 &uLow)
{
    Unpack2UINT32AsUINT64(var.uhVal.QuadPart, &uHigh, &uLow);

}