IMemInputPin leer bei QueryInterface
-
Hallo!
Parallel zu dem Versuch, meine Kamera mit dem directX-SDK auszulesen, habe ich jetzt ein Beispiel im Internet gefunden, das ohne das SDK auskommt (daher der getrennte Thread, da Probleme aus meiner Sicht grundverschieden.)
Der von mir benutzte Code lautet:
#include <windows.h> #include <dshow.h> #include "atlbase.h" #include "vidiface.h" #include "vidprop.h" #pragma comment(lib,"Strmiids.lib") #define DsHook(a,b,c) if (!c##_) { INT_PTR* p=b+*(INT_PTR**)a; VirtualProtect(&c##_,4,PAGE_EXECUTE_READWRITE,&no);\ *(INT_PTR*)&c##_=*p; VirtualProtect(p, 4,PAGE_EXECUTE_READWRITE,&no); *p=(INT_PTR)c; } void __fastcall TForm1::btn_kameraClick(TObject *Sender) { HRESULT hr = CoInitialize(0); MSG msg={0}; DWORD no; IBaseFilter* pFilter=0; hr=CreateKernelFilter( CLSID_VideoInputDeviceCategory, L"Videology USB-C Camera", &pFilter ); if(pFilter==0)return; CComQIPtr<IVideology20K1XX> pKs(pFilter); hr=pKs->SetWhiteBalanceMode(wbAuto); CComPtr<IPin> pOutPin; hr= pFilter->FindPin( L"1", &pOutPin ); CComPtr<IMemInputPin> mem = 0; hr = pOutPin->QueryInterface(IID_IMemInputPin,(void**)&mem); DsHook(mem.p,6,Receive); }
später soll dann mit
IGraphBuilder* graph= 0; hr = CoCreateInstance( CLSID_FilterGraph, 0, CLSCTX_INPROC,IID_IGraphBuilder, (void **)&graph ); IMediaControl* ctrl = 0; hr = graph->QueryInterface( IID_IMediaControl, (void **)&ctrl ); hr = ctrl->Run(); while ( GetMessage( &msg, 0, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); }
Ausgelesen werden könen, wenn ich das richtig verstanden habe...
Allerdings liefert mir DsHook einen Fehler zurük, weil mem leer bleibt.
Wisst Ihr, warum pOutPin->QueryInterface(IID_IMemInputPin,(void**)&mem); ein leeres mem erzeugt?if(pFilter==0)return; reagiert genau auf den Anschluss der Kamera und die PinInfo von pOutPin mit folgendem Code
_PinInfo *pifo=new _PinInfo; pOutPin.p->QueryPinInfo(pifo);
liefert einen Filter-Pointer, die dir "1"/*PinDir_Output*/ und den achName L"Standbild\0\0\0...".
Daher nehme ich an, dass bis zu der Zeile für mem alles korrekt ausgelesen wurde.Ich benutze Embarcadero
C++Builder
XE2 Version 16.0.4429.46931 auf Win7.
Ich hoffe, ich stelle mir das nicht alles zu einfach vor und jemand von euch hat schon bisschen Erfahrung damit^^