WebCam Access mit VMR-9 und Rendern auf IDirect3DTexture9
-
Hi,
ich versuche das WebCam Bild auf eine IDirect3DTexture9 zu Rendern.
Mein Problem ist, diese Zeile:hr = m_pCaptureGraphBuilder->RenderStream (NULL, &MEDIATYPE_Video, pSrcFilter, NULL, m_pBaseFilterRenderer);
Sobald ich als letzten Parameter meine Render setzte beendet sich an der Stelle einfach das Programm... ohne Fehlermeldung, nicht mal den Rückgabe wert kann ich auslesen. Wie bekomme ich mit was das Problem ist?
Es klappt, wenn ich den letzten Parameter auf NULL setzte, dann macht er aber ein neues Fester auf (und das will ich nicht).Der CAllocator ist (mit ein paar Änderungen) der von Microsofts Beispiel.
Auch wenn ich diesen nicht setze, beendet er sich einfach.Hier mal der wichtige Code:
IMediaControl* m_pMediaControl; IGraphBuilder* m_pGraphBuilder; ICaptureGraphBuilder2* m_pCaptureGraphBuilder; IVMRFilterConfig9* m_pFilterConfig; IVMRSurfaceAllocatorNotify9* m_lpIVMRSurfAllocNotify; CAllocator* m_pAllocator; IBaseFilter* m_pBaseFilterRenderer; DWORD_PTR m_DWUserId; HRESULT CWebCamAccess::InitWebCam(int deviceId) { ShutdownWebCam(); IBaseFilter* pSrcFilter = NULL; HRESULT hr; // Create the filter graph hr = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **) &m_pGraphBuilder); if (FAILED(hr)) return hr; // Obtain interfaces for media control and Video Window hr = m_pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID *) &m_pMediaControl); if (FAILED(hr)) return hr; // Set video window style and position hr = SetupVideoWindow(); if (FAILED(hr)) return hr; // Create the capture graph builder hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void **) &m_pCaptureGraphBuilder); if (FAILED(hr)) return hr; // Attach the filter graph to the capture graph hr = m_pCaptureGraphBuilder->SetFiltergraph(m_pGraphBuilder); if (FAILED(hr)) return hr; hr = FindCaptureDevice(&pSrcFilter, deviceId); if (FAILED(hr)) return hr; // Add Capture filter to our graph. hr = m_pGraphBuilder->AddFilter(pSrcFilter, L"Video Capture"); if (FAILED(hr)) { pSrcFilter->Release(); return hr; } // Render the preview pin on the video capture filter // Use this instead of g_pGraph->RenderFile hr = m_pCaptureGraphBuilder->RenderStream (NULL, &MEDIATYPE_Video, pSrcFilter, NULL, m_pBaseFilterRenderer); if (FAILED(hr)) { return hr; } // Now that the filter has been added to the graph and we have // rendered its stream, we can release this reference to the filter. pSrcFilter->Release(); // Start previewing video data hr = m_pMediaControl->Run(); if (FAILED(hr)) return hr; // init done m_bInit = true; m_eState = WEBCAM_STATE_PREVIEW; return true; } HRESULT CWebCamAccess::SetupVideoWindow() { HRESULT hr; hr = CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**) &m_pBaseFilterRenderer); if ((m_pBaseFilterRenderer == NULL) || (hr != S_OK)) { return hr; } hr = m_pBaseFilterRenderer->QueryInterface(IID_IVMRFilterConfig9, reinterpret_cast<void**>(&m_pFilterConfig)) ; if ((m_pFilterConfig == NULL) || (hr != S_OK)) { return hr; } m_pFilterConfig->SetRenderingMode(VMR9Mode_Renderless); hr = m_pBaseFilterRenderer->QueryInterface(IID_IVMRSurfaceAllocatorNotify9, (void**)(&m_lpIVMRSurfAllocNotify)); if ((m_lpIVMRSurfAllocNotify == NULL) || (hr != S_OK)) { return hr; } m_pAllocator = new CAllocator(m_pVidoePicture); m_lpIVMRSurfAllocNotify->AdviseSurfaceAllocator(m_DWUserId, m_pAllocator); m_pAllocator->AdviseNotify(m_lpIVMRSurfAllocNotify); hr = m_pGraphBuilder->AddFilter(m_pBaseFilterRenderer, L"Video Mixing Renderer 9"); if (hr != S_OK) { return hr; } return hr; } HRESULT CWebCamAccess::FindCaptureDevice(IBaseFilter** ppSrcFilter, int deviceId) { HRESULT hr; ULONG cFetched; IMoniker* pM; if (!ppSrcFilter) return E_POINTER; // Create the system device enumerator CComPtr <ICreateDevEnum> pDevEnum =NULL; hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void **) &pDevEnum); if (FAILED(hr)) return hr; // Create an enumerator for the video capture devices CComPtr <IEnumMoniker> pClassEnum = NULL; hr = pDevEnum->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &pClassEnum, 0); if (FAILED(hr)) return hr; // If there are no enumerators for the requested type, then // CreateClassEnumerator will succeed, but pClassEnum will be NULL. if (pClassEnum == NULL) return E_FAIL; pClassEnum->Reset(); int index = 0; while(hr = pClassEnum->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**)ppSrcFilter); } SysFreeString(var.bstrVal); } pBag->Release(); } pM->Release(); index++; } return hr; }
-
äh ok...
Anderer PC (XP nicht Vista) mit der gleichen Cam funktioniert
Dort bekomme ich ein Bild! Eigentlich wollte ich mir auf dem XP PC die DirectX Debug ausgaben ausgeben lassen, da diese ja nur noch unter XP funktionieren (soweit ich weiß).Ich probier das gleich noch mal an anderen PC's mit anderen Cams aus...
Sehr sehr komisch.
-
ok, bei allen anderen PC's geht... scheint was mit dem PC zu tun zu haben...