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


Anmelden zum Antworten