IKsTopologyInfo および IKsControl インターフェイスを使用して、カメラの UVC プロパティを列挙しています。私は MFT と直接の両方を使用しています。このコードを表示します。列挙中に、CLSID_IAMCameraControl、CLSID_IAMVideoProcAmp などのさまざまな GUID を取得します。
IAMVideoProcAmp は 10 個のプロパティ をサポートし、IAMCameraControl は 7個のプロパティをサポートするようになりました
すべてのカメラがすべてのプロパティ項目をサポートしているわけではありません.任意のカメラでサポートされている正確なプロパティ (列挙インデックス/値) を知りたいと思っていました.IKsTopologyInfo と IKsControl を使用してこれを照会できますか?他の方法はありますか?
プロパティを列挙するコードは次のとおりです。つまり、このコードはインターフェイス CLSID_IAMCameraControl,CLSID_IAMVideoProcAmp を提供します。
HRESULT hRet = S_OK;
CComPtr<IKsTopologyInfo> ksTopology = NULL;
BYTE* pList = NULL;
do
{
if(!m_pMediaSource)
break;
if(m_SuppPropSetGUIDS.size())
break;
hRet = m_pMediaSource->QueryInterface(IID_PPV_ARGS(&ksTopology));
if(FAILED(hRet))
break;
ksTopology->get_NumNodes(&m_dwNumNodes);
for (ULONG ulNode=0; ulNode < m_dwNumNodes; ulNode++ )
{
CComPtr<IKsControl> ksControl = 0;
GUID nodeType = GUID_NULL;
DWORD dwBytesReturned = 0;
KSPROPERTY KsProp = {0};
KsProp.Set = GUID_NULL;
KsProp.Id = 0; // Ignored
KsProp.Flags = KSPROPERTY_TYPE_SETSUPPORT;
KSP_NODE KsNode = {0};
KsNode.Property.Set = GUID_NULL;
KsNode.NodeId = ulNode;
KsNode.Property.Flags = KSPROPERTY_TYPE_SETSUPPORT;
ksTopology->get_NodeType(ulNode, &nodeType);
hRet = ksTopology->CreateNodeInstance(ulNode, IID_PPV_ARGS(&ksControl));
if(FAILED(hRet))
continue;
hRet = ksControl->KsProperty(&KsProp, sizeof(KSPROPERTY), NULL, NULL, &dwBytesReturned);
if( hRet == HRESULT_FROM_WIN32(ERROR_MORE_DATA) && dwBytesReturned )
{
pList = (BYTE*)calloc(dwBytesReturned, sizeof(BYTE) );
if ( pList == NULL )
continue;
hRet = ksControl->KsProperty(&KsProp, sizeof(KSPROPERTY), pList, dwBytesReturned, &dwBytesReturned);
if(FAILED(hRet))
break;
}
else
continue;
GUID* pGuidList = (GUID*)pList;
int iCount = dwBytesReturned/sizeof(GUID);
for(int i = 0; i < iCount; i++ )
{
if( !LookUpPS( &pGuidList[i] ) )
m_SuppPropSetGUIDS.push_back( pGuidList[i] );
}
if(pList)
free(pList);
pList = NULL;
}
}while(FALSE);
if(pList)
free(pList);
pList = NULL;
return hRet;