DirectShow
-
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