diff options
Diffstat (limited to 'cv')
-rw-r--r-- | cv/video-property-page.cpp_ | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/cv/video-property-page.cpp_ b/cv/video-property-page.cpp_ new file mode 100644 index 00000000..319a2a78 --- /dev/null +++ b/cv/video-property-page.cpp_ @@ -0,0 +1,208 @@ +#if 0 +#if 0 +#include "video-property-page.hpp" +#else +#include <windows.h> +#include <dshow.h> + +struct video_property_page final +{ + video_property_page() = delete; + static bool show(int id); + +private: + static HRESULT ShowFilterPropertyPages(IBaseFilter* filter); + static IBaseFilter* get_device(int id); +}; +#endif +// above is the header, for completeness +// OleInitialize, CoCreateInstance et al. don't help with ps3 eye. + +#include <cstring> + +#include <QString> +#include <QDebug> + +#if 0 +DEFINE_GUID(CLSID_SampleGrabber,0xc1f400a0,0x3f08,0x11d3,0x9f,0x0b,0x00,0x60,0x08,0x03,0x9e,0x37); +DEFINE_GUID(IID_ISampleGrabber,0x6b652fff,0x11fe,0x4fce,0x92,0xad,0x02,0x66,0xb5,0xd7,0xc7,0x8f); + +struct ISampleGrabberCB : public IUnknown +{ + virtual HRESULT STDMETHODCALLTYPE SampleCB( + double SampleTime, + IMediaSample *pSample) = 0; + + virtual HRESULT STDMETHODCALLTYPE BufferCB( + double SampleTime, + BYTE *pBuffer, + LONG BufferLen) = 0; +}; + +struct ISampleGrabber : public IUnknown +{ + virtual HRESULT STDMETHODCALLTYPE SetOneShot( + BOOL OneShot) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetMediaType( + const AM_MEDIA_TYPE *pType) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType( + AM_MEDIA_TYPE *pType) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetBufferSamples( + BOOL BufferThem) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer( + LONG *pBufferSize, + LONG *pBuffer) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetCurrentSample( + IMediaSample **ppSample) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetCallback( + ISampleGrabberCB *pCallback, + LONG WhichMethodToCallback) = 0; +}; +#endif + +#define CHECK(expr) if (FAILED(hr = (expr))) { qDebug() << QStringLiteral(#expr) << hr; goto done; } +#define CHECK2(expr) if (!(expr)) { qDebug() << QStringLiteral(#expr); goto done; } + +#if 0 +static IPin* GetPin(IBaseFilter *pFilter, PIN_DIRECTION dir_) +{ + IPin* ret = NULL; + IEnumPins* pin_enum = NULL; + PIN_DIRECTION dir; + HRESULT hr; + + CHECK(pFilter->EnumPins(&pin_enum)); + + while (SUCCEEDED(pin_enum->Next(1, &ret, NULL))) + { + CHECK(ret->QueryDirection(&dir)); + if (dir == dir_) + goto done; + ret->Release(); + ret = NULL; + } + + ret = NULL; + +done: + if (pin_enum) + pin_enum->Release(); + + return ret; +} +#endif + +bool video_property_page::show(int id) +{ + IBaseFilter* filter = NULL; + bool ret = false; + + CHECK2(filter = get_device(id)); + + ret = SUCCEEDED(ShowFilterPropertyPages(filter)); + +done: + if (filter) + filter->Release(); + + return ret; +} + +HRESULT video_property_page::ShowFilterPropertyPages(IBaseFilter* filter) +{ + ISpecifyPropertyPages* pProp = NULL; + IUnknown* unk = NULL; + CAUUID caGUID = { 0, NULL }; + FILTER_INFO FilterInfo = { {0}, NULL }; + HRESULT hr; + + CHECK(filter->QueryInterface(IID_ISpecifyPropertyPages, (void**)&pProp)); + CHECK(pProp->GetPages(&caGUID)); + CHECK(filter->QueryFilterInfo(&FilterInfo)); + + filter->QueryInterface(IID_IUnknown, (void**)&unk); + + // cl-eye uses this + // perhaps more than IBaseFilter* -> IUnknown* needs be passed to lplpUnk + // and the OleCreatePropertyFrame equiv +#if 0 + OCPFIPARAMS params; + params.cbStructSize = sizeof(params); + params.hWndOwner = GetActiveWindow(); + params.x = 0; + params.y = 0; + params.lpszCaption = L"camera props"; + params.cObjects = 1; + params.lplpUnk = &unk; + params.cPages = 1; + //OleCreatePropertyFrameIndirect() +#endif + + OleCreatePropertyFrame( + NULL, // Parent window + 0, 0, // Reserved + FilterInfo.achName, // Caption for the dialog box + 1, // Number of objects (just the filter) + &unk, // Array of object pointers. + caGUID.cElems, // Number of property pages + caGUID.pElems, // Array of property page CLSIDs + 0, // Locale identifier + 0, NULL // Reserved + ); + +done: + if (FilterInfo.pGraph) + FilterInfo.pGraph->Release(); + + if (caGUID.pElems) + CoTaskMemFree(caGUID.pElems); + + if (pProp) + pProp->Release(); + + if (unk) + unk->Release(); + + return hr; +} + +IBaseFilter* video_property_page::get_device(int id) +{ + ICreateDevEnum* pSysDevEnum = NULL; + IEnumMoniker* pEnumCat = NULL; + IMoniker* pMoniker = NULL; + IBaseFilter* filter = NULL; + HRESULT hr; + + CHECK(CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pSysDevEnum)); + CHECK(pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0)); + + for (int i = 0; !filter && SUCCEEDED(pEnumCat->Next(1, &pMoniker, NULL)); pMoniker->Release(), i++) + { + if (i == id) + { + CHECK(pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&filter)); + break; + } + } + +done: + if (pMoniker) + pMoniker->Release(); + + if (pEnumCat) + pEnumCat->Release(); + + if (pSysDevEnum) + pSysDevEnum->Release(); + + return filter; +} + +#endif |