?
Hallo miteinand,
GetCurrentImage
liefert eine Bitmap, das funktiniert auf einem alten Laptop mit 25Hz.
Ein anderes neues System erreicht nur 3Hz .
Wo ist das Problem ?
Pseudocode:
HRESULT CVidDS::Initialize(HWND hWnd)
{
IBaseFilter* pVmr = NULL;
// Create the VMR and add it to the filter graph.
HRESULT hr = CoCreateInstance(CLSID_VideoMixingRenderer, NULL,CLSCTX_INPROC, IID_IBaseFilter, (void**)&pVmr);
if (SUCCEEDED(hr))
{
hr = m_pGB->AddFilter(pVmr, L"Video Mixing Renderer");
if (SUCCEEDED(hr))
{
// Set the rendering mode and number of streams.
IVMRFilterConfig* pConfig;
hr = pVmr->QueryInterface(IID_IVMRFilterConfig, (void**)&pConfig);
if (SUCCEEDED(hr))
{
pConfig->SetRenderingMode(VMRMode_Windowless);
pConfig->Release();
}
hr = pVmr->QueryInterface(IID_IVMRWindowlessControl, (void**)&m_pWC);
if (SUCCEEDED(hr))
{
m_pWC->SetVideoClippingWindow(hWnd);
}
}
pVmr->Release();
}
return hr;
}
bool CVidDS::BindFilter(int deviceId, IBaseFilter **pFilter)
{
if(deviceId < 0)
return false;
CComPtr<ICreateDevEnum> pCreateDevEnum;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if (hr != NOERROR)
return false;
CComPtr<IEnumMoniker> pEm;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm, 0);
if(hr != NOERROR)
return false;
pEm->Reset();
ULONG cFetched;
IMoniker *pM;
int index = 0;
while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK, index <= deviceId)
{
IPropertyBag *pBag;
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if(SUCCEEDED(hr))
{
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"FriendlyName", &var, NULL);
if (hr == NOERROR)
{
if(index == deviceId)
pM->BindToObject(0, 0, IID_IBaseFilter, (void**)pFilter);
SysFreeString(var.bstrVal);
}
pBag->Release();
}
pM->Release();
index++;
}
return true;
}
void CVidDS::Start(void)
{
if(!m_pMC) return;
if(m_psCurrent == Stopped)
{
m_pGB->Render(m_pCamOutPin);
if(SUCCEEDED(m_pMC->Run()))
m_psCurrent = Running;
}
}
void CVidDS::Stop(void)
{
if(!m_pMC) return;
if(m_psCurrent == Running)
{
m_pGB->Abort();
if(SUCCEEDED(m_pMC->Stop()))//m_pMC->Pause();
m_psCurrent = Stopped;
}
}
void Poll(void)
{
BYTE* lpCurrImage = NULL;
HRESULT hr(m_pWC->GetCurrentImage(&lpCurrImage));
if (SUCCEEDED(hr))
{
LPBITMAPINFOHEADER pdib = (LPBITMAPINFOHEADER) lpCurrImage;
BYTE *pTemp32 = lpCurrImage + sizeof(BITMAPINFOHEADER);
CDib::Draw((BYTE *)pTemp32, pdib);
CoTaskMemFree(lpCurrImage);
m_picnr++;
}
}
AnruferFolge:
HRESULT hr=CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void **)&m_pGB);
if (FAILED(hr))
return CVersions::DbgMsg(false, "CVidDS::Create failed IID_IGraphBuilder\r\n");
Initialize(0);
if (!BindFilter(m_iDeviceID, &m_pDF))
return CVersions::DbgMsg(false, "CVidDS::Create failed BindFilter\r\n");
hr=m_pGB->AddFilter(m_pDF, L"Video Capture");
if (FAILED(hr))
return CVersions::DbgMsg(false, "CVidDS::Create failed AddFilter\r\n");
CComPtr<IEnumPins> pEnum;
m_pDF->EnumPins(&pEnum);
hr = pEnum->Reset();
hr = pEnum->Next(1, &m_pCamOutPin, NULL);
hr = m_pGB->QueryInterface(IID_IMediaControl, (void **)&m_pMC);
if (FAILED(hr))
return CVersions::DbgMsg(false, "CVidDS::Create failed MediaControl\r\n");
Start();
Poll();
Stop();
Frage:
Was läuft da falsch , in einem MS Forum hat man geschrieben man müsse
einen "eigenen" Filter herstellen ?
Danke für Hinweise
Karsten